lib/ec2ssh/ec2_instances.rb in ec2ssh-3.1.1 vs lib/ec2ssh/ec2_instances.rb in ec2ssh-4.0.0
- old
+ new
@@ -1,43 +1,95 @@
-require 'aws-sdk-v1'
+require 'aws-sdk'
module Ec2ssh
class Ec2Instances
attr_reader :ec2s, :aws_keys
- def initialize(aws_keys, regions)
+ class InstanceWrapper
+ class TagsWrapper
+ def initialize(tags)
+ @tags = tags
+ end
+
+ # simulate
+ def [](key)
+ if key.is_a? ::String
+ raise DotfileValidationError, <<-MSG
+`tags[String]` syntax in the dotfile has been deleted since v4.0. Use `tag(String)` instead.
+See: https://github.com/mirakui/ec2ssh#how-to-upgrade-from-3x
+ MSG
+ end
+ super
+ end
+
+ private
+
+ def method_missing(name, *args, &block)
+ @tags.public_send(name, *args, &block)
+ end
+
+ def respond_to_missing?(symbol, include_private)
+ @tags.respond_to?(symbol, include_private)
+ end
+ end
+
+ def initialize(ec2_instance)
+ @ec2_instance = ec2_instance
+ @_tags ||= @ec2_instance.tags.each_with_object({}) {|t, h| h[t.key] = t.value }
+ end
+
+ def tag(key)
+ @_tags[key]
+ end
+
+ def tags
+ TagsWrapper.new(super)
+ end
+
+ private
+
+ def method_missing(name, *args, &block)
+ @ec2_instance.public_send(name, *args, &block)
+ end
+
+ def respond_to_missing?(symbol, include_private)
+ @ec2_instance.respond_to?(symbol, include_private)
+ end
+ end
+
+ def initialize(aws_keys, filters)
@aws_keys = aws_keys
- @regions = regions
+ @filters = filters
end
def make_ec2s
- AWS.start_memoizing
_ec2s = {}
- aws_keys.each do |name, key|
+ aws_keys.each_pair do |name, keys|
_ec2s[name] = {}
- @regions.each do |region|
- options = key.merge ec2_region: region
- _ec2s[name][region] = AWS::EC2.new options
+ keys.each_pair do |region, key|
+ client = Aws::EC2::Client.new region: region, credentials: key
+ _ec2s[name][region] = Aws::EC2::Resource.new client: client
end
end
_ec2s
end
def ec2s
@ec2s ||= make_ec2s
end
def instances(key_name)
- @regions.map {|region|
- ec2s[key_name][region].instances.
- filter('instance-state-name', 'running').
- to_a.
- sort_by {|ins| ins.tags['Name'].to_s }
+ aws_keys[key_name].each_key.map {|region|
+ ec2s[key_name][region].instances(
+ filters: @filters
+ ).
+ map {|ins| InstanceWrapper.new(ins) }.
+ sort_by {|ins| ins.tag('Name').to_s }
}.flatten
end
- def self.expand_profile_name_to_credential(profile_name)
- provider = AWS::Core::CredentialProviders::SharedCredentialFileProvider.new(profile_name: profile_name)
- provider.credentials
+ def self.expand_profile_name_to_credential(profile_name, region)
+ client = Aws::STS::Client.new(profile: profile_name, region: region)
+ client.config.credentials
end
end
end