Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lamanotrama/3046312 to your computer and use it in GitHub Desktop.
Save lamanotrama/3046312 to your computer and use it in GitHub Desktop.
N::A::EC2 に色々生やすサンプル
package Net::Amazon::EC2::PaperboyAttributes;
use strict;
use warnings;
use Net::Amazon::EC2 0.18;
use JSON qw/decode_json/;
Net::Amazon::EC2::RunningInstances->meta->make_mutable();
Net::Amazon::EC2->meta->make_mutable();
Net::Amazon::EC2::RunningInstances->meta->add_attribute(
'roles' => (
is => 'ro',
isa => 'ArrayRef[Str]',
lazy => 1,
builder => 'Net::Amazon::EC2::PaperboyAttributes::_build_roles',
)
);
# is_active にすればよかったと思ってる…
Net::Amazon::EC2::RunningInstances->meta->add_attribute(
'inactive' => (
is => 'ro',
isa => 'Bool',
lazy => 1,
builder => 'Net::Amazon::EC2::PaperboyAttributes::_build_inactive',
)
);
Net::Amazon::EC2->meta->add_method(
'describe_roles' => \&_describe_roles
);
Net::Amazon::EC2::RunningInstances->meta->make_immutable();
Net::Amazon::EC2->meta->make_immutable();
sub _build_roles {
my $self = shift;
return [] unless $self->tag_set;
my ($roles) =
grep { $_->{key} eq 'role' }
@{ $self->tag_set };
return [] unless $roles;
return decode_json( $roles->{value} );
}
sub _build_inactive {
my $self = shift;
return 0 unless $self->tag_set;
my ($inactive) =
grep { $_->{key} eq 'inactive' }
@{ $self->tag_set };
return 0 unless defined $inactive;
return $inactive->{value} ? 1 : 0;
};
sub _describe_roles {
my ($self, %args) = @_;
my @instances =
grep { $_->roles }
grep { $_->name }
map { $_->instances_set }
@{ $self->describe_instances };
if ( exists $args{active_only}
and $args{active_only} eq '1'
) {
@instances = grep { ! $_->inactive } @instances;
}
my $roles = {};
for my $ins ( @instances ) {
map {
push @{ $roles->{$_} ||= [] }, $ins->name
} @{ $ins->roles };
}
return $roles;
};
1;
__END__
=encoding utf8
=head1 NAME
Net::Amazon::EC2::PaperboyAttributes
=head1 SYNOPSIS
use Net::Amazon::EC2 0.18;
use Net::Amazon::EC2::PaperboyAttributes;
my $roles = $ec2->describe_roles;
unless ( $instance->inactive ) {
my $roles = $instance->roles;
print "name: ", $instance->name, "\n";
print join " ", "roles:", @{ $instance->roles }, "\n";
}
=head1 DESCRIPTION
ペパボの使い方に合わせて、N::A::EC2に幾つかattrsとメソッドを足すもの。
=over
=item N::A::EC2::RunningInstances::roles
インスタンスのrole tagにJSONのarrayで記述された内容をArrayRefで返します。
=item N::A::EC2::RunningInstances::inactive
インスタンスにinactiveタグがあって、それがtrue(1)の場合はtrueを返します。
それ以外は全部falseです。
=item N::A::EC2::describe_roles(%prams)
roleをkeyとして、instanceのnameをvalueに持ったHashRefを返します。
## 例
{
'mx' => [
'mx001',
'mx002'
],
'base' => [
'manage001',
'mx001',
'mx002',
],
manage => [
'manage001',
],
}
パラメータに active_only => 1 を付けると、inactiveなインスタンスは除外します。
=back
=head1 AUTHOR
@lamanotrama
=cut
package Net::Amazon::EC2::PaperboyAttributes;
use strict;
use warnings;
use Net::Amazon::EC2 0.18;
use JSON qw/decode_json/;
Net::Amazon::EC2::RunningInstances->meta->make_mutable();
Net::Amazon::EC2->meta->make_mutable();
Net::Amazon::EC2::RunningInstances->meta->add_attribute(
'roles' => (
is => 'ro',
isa => 'ArrayRef[Str]',
lazy => 1,
builder => 'Net::Amazon::EC2::PaperboyAttributes::_build_roles',
)
);
# is_active にすればよかったと思ってる…
Net::Amazon::EC2::RunningInstances->meta->add_attribute(
'inactive' => (
is => 'ro',
isa => 'Bool',
lazy => 1,
builder => 'Net::Amazon::EC2::PaperboyAttributes::_build_inactive',
)
);
Net::Amazon::EC2->meta->add_method(
'describe_roles' => \&_describe_roles
);
Net::Amazon::EC2::RunningInstances->meta->make_immutable();
Net::Amazon::EC2->meta->make_immutable();
sub _build_roles {
my $self = shift;
return [] unless $self->tag_set;
my ($roles) =
grep { $_->{key} eq 'role' }
@{ $self->tag_set };
return [] unless $roles;
return decode_json( $roles->{value} );
}
sub _build_inactive {
my $self = shift;
return 0 unless $self->tag_set;
my ($inactive) =
grep { $_->{key} eq 'inactive' }
@{ $self->tag_set };
return 0 unless defined $inactive;
return $inactive->{value} ? 1 : 0;
};
sub _describe_roles {
my ($self, %args) = @_;
my @instances =
grep { $_->roles }
grep { $_->name }
map { $_->instances_set }
@{ $self->describe_instances };
if ( exists $args{active_only}
and $args{active_only} eq '1'
) {
@instances = grep { ! $_->inactive } @instances;
}
my $roles = {};
for my $ins ( @instances ) {
map {
push @{ $roles->{$_} ||= [] }, $ins->name
} @{ $ins->roles };
}
return $roles;
};
1;
__END__
=encoding utf8
=head1 NAME
Net::Amazon::EC2::PaperboyAttributes
=head1 SYNOPSIS
use Net::Amazon::EC2 0.18;
use Net::Amazon::EC2::PaperboyAttributes;
my $roles = $ec2->describe_roles;
unless ( $instance->inactive ) {
my $roles = $instance->roles;
print "name: ", $instance->name, "\n";
print join " ", "roles:", @{ $instance->roles }, "\n";
}
=head1 DESCRIPTION
ペパボの使い方に合わせて、N::A::EC2に幾つかattrsとメソッドを足すもの。
=over
=item N::A::EC2::RunningInstances::roles
インスタンスのrole tagにJSONのarrayで記述された内容をArrayRefで返します。
=item N::A::EC2::RunningInstances::inactive
インスタンスにinactiveタグがあって、それがtrue(1)の場合はtrueを返します。
それ以外は全部falseです。
=item N::A::EC2::describe_roles(%prams)
roleをkeyとして、instanceのnameをvalueに持ったHashRefを返します。
## 例
{
'mx' => [
'mx001',
'mx002'
],
'base' => [
'manage001',
'mx001',
'mx002',
],
manage => [
'manage001',
],
}
パラメータに active_only => 1 を付けると、inactiveなインスタンスは除外します。
=back
=head1 AUTHOR
@lamanotrama
=cut
@lamanotrama
Copy link
Author

sqaleの運用ルールに依存した実装なので、サンプルとして見てください。

@lamanotrama
Copy link
Author

syntax効いてなかったので、ファイル名変えただけのやつ足しました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment