ec2ssh 3.1.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82094a4ffb0cc7177a3174c0eb775bb77806541076133d515af86172ecb83bf6
4
- data.tar.gz: 575e64da09628b5469c974133d2fcde4508498ca07c1a5bc9e55921e4fb9b5ee
3
+ metadata.gz: c3ea6bd5f9d58e822861e9bcdb35c18df8da80bbc3273a8645483bac6d1d53cf
4
+ data.tar.gz: d5326d28bfbc630696d42c692dc90e3eae03a0240bece33f6893ac0584f3763d
5
5
  SHA512:
6
- metadata.gz: d14febefd3c85a7b3288fc60bf2836b303d3e5b89874c26bed96b4626c78f37fb1ebde3cd0b68f1f335e7330bb963295bef2174e6a1c3efbd44ef4f0cac26b27
7
- data.tar.gz: 1f001fef1061f9e3ce41abea0984a7f36662699ad7290d945701bfd769c056cbd902661e405698673e5d876cb055cfb5535c4d0dee3cae3510fada99ef12d403
6
+ metadata.gz: d22a8bcdc6c4317c09d2b36aee3aaf0a06b5f7412f7e318f40579fb5d6bdeaa3f24d10eaea0a294e253c31ee1e23f2719c5f66bdf20dc46da8931addf471f69c
7
+ data.tar.gz: 53d4f48c7a7a3dbbbd48d0f0382dfe0715c7af1750b978b9e14183d16adc4bbfaff8872ab65ed2c5ced36debe570682f34c94cb8824735fa800a29ac349f2cea
@@ -1,4 +1,12 @@
1
1
  # Change Log
2
+ ## 4.0.0
3
+ * Use aws-sdk v2 and stop using v1 (#44)
4
+ * Support AssumeRole with `~/.aws/credentials` (#44)
5
+ * `aws_keys` requires region (#44)
6
+ Thanks to @yujideveloper
7
+ * Support `filters` for listing ec2 instances (#43)
8
+ Thanks to @satotakumi
9
+
2
10
  ## 3.1.1
3
11
  * Fix a bug in `--verbose` option (#41)
4
12
  Thanks to @adamlazz
data/README.md CHANGED
@@ -41,17 +41,22 @@ $ ec2ssh init
41
41
  ```
42
42
  $ vi ~/.ec2ssh
43
43
  ---
44
- profiles 'default', 'myprofile'
45
- regions 'us-east-1'
44
+ profiles 'default', 'myprofile', ...
45
+ regions 'us-east-1', 'ap-northeast-1', ...
46
46
 
47
47
  # Ignore unnamed instances
48
- reject {|instance| !instance.tags['Name'] }
48
+ reject {|instance| !instance.tag('Name') }
49
49
 
50
- # You can use methods of AWS::EC2::Instance.
51
- # See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
50
+ # You can specify filters on DescribeInstances (default: lists 'running' instances only)
51
+ filters([
52
+ { name: 'instance-state-name', values: ['running', 'stopped'] }
53
+ ])
54
+
55
+ # You can use methods of AWS::EC2::Instance and tag(key) method.
56
+ # See https://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Instance.html
52
57
  host_line <<END
53
- Host <%= tags['Name'] %>.<%= availability_zone %>
54
- HostName <%= dns_name || private_ip_address %>
58
+ Host <%= tag('Name') %>.<%= placement.availability_zone %>
59
+ HostName <%= public_dns_name || private_ip_address %>
55
60
  END
56
61
  ```
57
62
 
@@ -115,26 +120,23 @@ Host db-server-1.ap-southeast-1
115
120
 
116
121
  `ec2ssh remove` command removes the mark lines.
117
122
 
118
- # How to upgrade from 1.x to 2.x
119
- If you have used ec2ssh-1.x, it seems that you may not have '~/.ec2ssh'.
120
- So you need execute `ec2ssh init` once to create `~/.ec2ssh`, and edit it as you like.
121
-
122
- ```
123
- $ ec2ssh init
124
- $ vi ~/.ec2ssh
125
- ```
126
-
127
- # How to upgrade from 2.x to 3.x
128
- Dotfile (`.ec2ssh`) format has been changed from YAML to Ruby DSL.
123
+ # How to upgrade from 3.x
124
+ Dotfile (`.ec2ssh`) format has been changed from 3.x.
129
125
 
130
- Don't panic and run `ec2ssh migrate` if you have ec2ssh-2.x styled dotfile.
126
+ * A instance tag access I/F has been changed from `tags['Name']` to `tag('Name')`
127
+ * `Aws::EC2::Instance` methods have been changed to AWS SDK v2
128
+ * The `aws_keys` structure have benn changed
129
+ * `aws_keys[profile_name][region] # => Aws::Credentials`
130
+ * For example:
131
131
 
132
132
  ```
133
- $ ec2ssh migrate
133
+ aws_keys(
134
+ my_prof1: {
135
+ 'ap-northeast-1' => Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
136
+ }
137
+ )
134
138
  ```
135
139
 
136
- This command converts your existing `.ec2ssh` file into 3.x style.
137
-
138
140
  # Notice
139
141
  `ec2ssh` command updates your `.ssh/config` file default. You should make a backup of it.
140
142
 
@@ -142,4 +144,4 @@ This command converts your existing `.ec2ssh` file into 3.x style.
142
144
  Use `zsh/_ec2ssh`.
143
145
 
144
146
  # License
145
- Copyright (c) 2014 Issei Naruta. ec2ssh is released under the MIT license.
147
+ Copyright (c) 2019 Issei Naruta. ec2ssh is released under the MIT license.
@@ -6,7 +6,7 @@ _ec2ssh() {
6
6
  cur=$2
7
7
  prev=$3
8
8
 
9
- subcmds="help init migrate remove update version"
9
+ subcmds="help init remove update version"
10
10
  common_opts="--dotfile --verbose"
11
11
 
12
12
  # contextual completion
@@ -50,4 +50,4 @@ _ec2ssh() {
50
50
 
51
51
  }
52
52
 
53
- complete -F _ec2ssh ec2ssh
53
+ complete -F _ec2ssh ec2ssh
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.rubyforge_project = "ec2ssh"
17
17
  s.add_dependency "thor", "~> 0.14"
18
18
  s.add_dependency "highline", "~> 1.6"
19
- s.add_dependency 'aws-sdk', '~> 1.8'
19
+ s.add_dependency "aws-sdk", "~> 2"
20
20
 
21
21
  s.files = `git ls-files`.split("\n")
22
22
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -1,9 +1,9 @@
1
1
  path "#{ENV['HOME']}/.ssh/config"
2
2
  profiles 'default', 'myprofile'
3
3
  regions 'ap-northeast-1', 'us-east-1'
4
- reject {|instance| instance.tags['Name'] =~ /.../ }
4
+ reject {|instance| instance.tag('Name') =~ /.../ }
5
5
 
6
6
  host_line <<END
7
- Host <%= tags['Name'] %>
7
+ Host <%= tag('Name') %>
8
8
  HostName <%= private_ip_address %>
9
9
  END
@@ -26,19 +26,29 @@ module Ec2ssh
26
26
  end
27
27
 
28
28
  def ec2s
29
- @ec2s ||= Ec2Instances.new aws_keys, @container.regions
29
+ @ec2s ||= Ec2Instances.new aws_keys, filters
30
30
  end
31
31
 
32
32
  def aws_keys
33
33
  @aws_keys ||= if @container.profiles
34
34
  keys = {}
35
35
  @container.profiles.each do |profile_name|
36
- keys[profile_name] = Ec2Instances.expand_profile_name_to_credential profile_name
36
+ keys[profile_name] = {}
37
+ @container.regions.each do |region|
38
+ keys[profile_name][region] = Ec2Instances.expand_profile_name_to_credential profile_name, region
39
+ end
37
40
  end
38
41
  keys
39
42
  else
40
43
  @container.aws_keys
41
44
  end
42
45
  end
46
+
47
+ def filters
48
+ @filters = @container.filters || [{
49
+ name: 'instance-state-name',
50
+ values: ['running']
51
+ }]
52
+ end
43
53
  end
44
54
  end
@@ -2,7 +2,6 @@ require 'thor'
2
2
  require 'highline'
3
3
  require 'ec2ssh/ssh_config'
4
4
  require 'ec2ssh/exceptions'
5
- require 'ec2ssh/migrator'
6
5
 
7
6
  module Ec2ssh
8
7
  class CLI < Thor
@@ -12,7 +11,6 @@ module Ec2ssh
12
11
 
13
12
  desc 'init', 'Add ec2ssh mark to ssh_config'
14
13
  def init
15
- check_dotfile_version
16
14
  command = make_command :init
17
15
  command.run
18
16
  rescue MarkAlreadyExists
@@ -22,7 +20,6 @@ module Ec2ssh
22
20
  desc 'update', 'Update ec2 hosts list in ssh_config'
23
21
  def update
24
22
  check_dotfile_existence
25
- check_dotfile_version
26
23
  set_aws_logging
27
24
  command = make_command :update
28
25
  command.run
@@ -37,7 +34,6 @@ module Ec2ssh
37
34
  desc 'remove', 'Remove ec2ssh mark from ssh_config'
38
35
  def remove
39
36
  check_dotfile_existence
40
- check_dotfile_version
41
37
  command = make_command :remove
42
38
  command.run
43
39
  green "Removed mark from #{command.ssh_config_path}"
@@ -45,12 +41,6 @@ module Ec2ssh
45
41
  red "Marker not found in #{command.ssh_config_path}"
46
42
  end
47
43
 
48
- desc 'migrate', 'Migrate dotfile from old versions'
49
- def migrate
50
- command = make_command :migrate
51
- command.run
52
- end
53
-
54
44
  desc 'shellcomp [-]', 'Initialize shell completion for bash/zsh'
55
45
  def shellcomp(_ = false)
56
46
  if args.include?("-")
@@ -90,16 +80,6 @@ EOS
90
80
  end
91
81
 
92
82
  no_tasks do
93
- def check_dotfile_version
94
- return unless File.exist?(options.dotfile)
95
- migrator = Migrator.new options.dotfile
96
- if migrator.check_version < '3'
97
- red "#{options.dotfile} is old style."
98
- red "Try '#{$0} migrate' to migrate to version 3"
99
- abort
100
- end
101
- end
102
-
103
83
  def check_dotfile_existence
104
84
  unless File.exist?(options.dotfile)
105
85
  red "#{options.dotfile} doesn't exist."
@@ -120,7 +100,7 @@ EOS
120
100
  require 'aws-sdk'
121
101
  logger = ::Logger.new($stdout)
122
102
  logger.level = ::Logger::DEBUG
123
- ::AWS.config logger: logger
103
+ ::Aws.config.update logger: logger
124
104
  end
125
105
  end
126
106
 
@@ -33,13 +33,7 @@ module Ec2ssh
33
33
  def write_dotfile_example
34
34
  example = <<-DOTFILE
35
35
  path '#{ENV['HOME']}/.ssh/config'
36
- aws_keys(
37
- default: {
38
- access_key_id: ENV['AWS_ACCESS_KEY_ID'],
39
- secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
40
- },
41
- # my_key1: { access_key_id: '...', secret_access_key: '...' }, ...
42
- )
36
+ profiles 'default', 'myprofile'
43
37
  regions ENV['AWS_REGION'] || ENV['AMAZON_REGION'] || ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
44
38
  # Enable regions as you like
45
39
  # regions *%w(ap-northeast-1 ap-southeast-1 ap-southeast-2 eu-west-1 sa-east-1 us-east-1 us-west-1 us-west-2)
@@ -47,8 +41,8 @@ regions ENV['AWS_REGION'] || ENV['AMAZON_REGION'] || ENV['AWS_DEFAULT_REGION'] |
47
41
  # You can use methods of AWS::EC2::Instance.
48
42
  # See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
49
43
  host_line <<END
50
- Host <%= tags['Name'] %>.<%= availability_zone %>
51
- HostName <%= dns_name || private_ip_address %>
44
+ Host <%= tag('Name') %>.<%= placement.availability_zone %>
45
+ HostName <%= public_dns_name || private_ip_address %>
52
46
  END
53
47
  DOTFILE
54
48
 
@@ -3,7 +3,6 @@ require 'ec2ssh/command'
3
3
  require 'ec2ssh/ssh_config'
4
4
  require 'ec2ssh/builder'
5
5
  require 'ec2ssh/dsl'
6
- require 'ec2ssh/migrator'
7
6
 
8
7
  module Ec2ssh
9
8
  module Command
@@ -30,10 +29,6 @@ module Ec2ssh
30
29
  def dsl
31
30
  @dsl ||= Ec2ssh::Dsl::Parser.parse File.read(dotfile_path)
32
31
  end
33
-
34
- def migrator
35
- @migrator ||= Migrator.new dotfile_path
36
- end
37
32
  end
38
33
  end
39
34
  end
@@ -1,14 +1,24 @@
1
1
  require 'ec2ssh/exceptions'
2
+ require 'aws-sdk'
2
3
 
3
4
  module Ec2ssh
4
5
  class Dsl
5
6
  attr_reader :_result
6
7
 
8
+ CREDENTIAL_CLASSES = [Aws::Credentials, Aws::SharedCredentials, Aws::InstanceProfileCredentials, Aws::AssumeRoleCredentials].freeze
9
+ private_constant :CREDENTIAL_CLASSES
10
+
7
11
  def initialize
8
12
  @_result = Container.new
9
13
  end
10
14
 
11
15
  def aws_keys(keys)
16
+ unless keys.all? {|_, v| v.is_a?(Hash) && v.each_value.all? {|c| CREDENTIAL_CLASSES.any?(&c.method(:is_a?)) } }
17
+ raise DotfileValidationError, <<-MSG
18
+ Since v4.0, `aws_keys` in the dotfile must be specified regions as a hash key.
19
+ See: https://github.com/mirakui/ec2ssh#how-to-upgrade-from-3x
20
+ MSG
21
+ end
12
22
  @_result.aws_keys = keys
13
23
  end
14
24
 
@@ -28,6 +38,10 @@ module Ec2ssh
28
38
  @_result.reject = block
29
39
  end
30
40
 
41
+ def filters(filters)
42
+ @_result.filters = filters
43
+ end
44
+
31
45
  def path(str)
32
46
  @_result.path = str
33
47
  end
@@ -38,6 +52,7 @@ module Ec2ssh
38
52
  regions
39
53
  host_line
40
54
  reject
55
+ filters
41
56
  path
42
57
  ])
43
58
  end
@@ -1,22 +1,73 @@
1
- require 'aws-sdk-v1'
1
+ require 'aws-sdk'
2
2
 
3
3
  module Ec2ssh
4
4
  class Ec2Instances
5
5
  attr_reader :ec2s, :aws_keys
6
6
 
7
- def initialize(aws_keys, regions)
7
+ class InstanceWrapper
8
+ class TagsWrapper
9
+ def initialize(tags)
10
+ @tags = tags
11
+ end
12
+
13
+ # simulate
14
+ def [](key)
15
+ if key.is_a? ::String
16
+ raise DotfileValidationError, <<-MSG
17
+ `tags[String]` syntax in the dotfile has been deleted since v4.0. Use `tag(String)` instead.
18
+ See: https://github.com/mirakui/ec2ssh#how-to-upgrade-from-3x
19
+ MSG
20
+ end
21
+ super
22
+ end
23
+
24
+ private
25
+
26
+ def method_missing(name, *args, &block)
27
+ @tags.public_send(name, *args, &block)
28
+ end
29
+
30
+ def respond_to_missing?(symbol, include_private)
31
+ @tags.respond_to?(symbol, include_private)
32
+ end
33
+ end
34
+
35
+ def initialize(ec2_instance)
36
+ @ec2_instance = ec2_instance
37
+ @_tags ||= @ec2_instance.tags.each_with_object({}) {|t, h| h[t.key] = t.value }
38
+ end
39
+
40
+ def tag(key)
41
+ @_tags[key]
42
+ end
43
+
44
+ def tags
45
+ TagsWrapper.new(super)
46
+ end
47
+
48
+ private
49
+
50
+ def method_missing(name, *args, &block)
51
+ @ec2_instance.public_send(name, *args, &block)
52
+ end
53
+
54
+ def respond_to_missing?(symbol, include_private)
55
+ @ec2_instance.respond_to?(symbol, include_private)
56
+ end
57
+ end
58
+
59
+ def initialize(aws_keys, filters)
8
60
  @aws_keys = aws_keys
9
- @regions = regions
61
+ @filters = filters
10
62
  end
11
63
 
12
64
  def make_ec2s
13
- AWS.start_memoizing
14
65
  _ec2s = {}
15
- aws_keys.each do |name, key|
66
+ aws_keys.each_pair do |name, keys|
16
67
  _ec2s[name] = {}
17
- @regions.each do |region|
18
- options = key.merge ec2_region: region
19
- _ec2s[name][region] = AWS::EC2.new options
68
+ keys.each_pair do |region, key|
69
+ client = Aws::EC2::Client.new region: region, credentials: key
70
+ _ec2s[name][region] = Aws::EC2::Resource.new client: client
20
71
  end
21
72
  end
22
73
  _ec2s
@@ -27,17 +78,18 @@ module Ec2ssh
27
78
  end
28
79
 
29
80
  def instances(key_name)
30
- @regions.map {|region|
31
- ec2s[key_name][region].instances.
32
- filter('instance-state-name', 'running').
33
- to_a.
34
- sort_by {|ins| ins.tags['Name'].to_s }
81
+ aws_keys[key_name].each_key.map {|region|
82
+ ec2s[key_name][region].instances(
83
+ filters: @filters
84
+ ).
85
+ map {|ins| InstanceWrapper.new(ins) }.
86
+ sort_by {|ins| ins.tag('Name').to_s }
35
87
  }.flatten
36
88
  end
37
89
 
38
- def self.expand_profile_name_to_credential(profile_name)
39
- provider = AWS::Core::CredentialProviders::SharedCredentialFileProvider.new(profile_name: profile_name)
40
- provider.credentials
90
+ def self.expand_profile_name_to_credential(profile_name, region)
91
+ client = Aws::STS::Client.new(profile: profile_name, region: region)
92
+ client.config.credentials
41
93
  end
42
94
  end
43
95
  end
@@ -1,3 +1,3 @@
1
1
  module Ec2ssh
2
- VERSION = '3.1.1'
2
+ VERSION = '4.0.0'
3
3
  end
@@ -8,8 +8,8 @@ describe 'aws-sdk compatibility' do
8
8
  let!(:ec2_instances) do
9
9
  VCR.use_cassette('ec2-instances') do
10
10
  Ec2ssh::Ec2Instances.new(
11
- {'foo' => {access_key_id: '', secret_access_key: ''}},
12
- ['us-west-1']
11
+ {'foo' => {'us-west-1' => Aws::Credentials.new('access_key_id', 'secret_access_key')}},
12
+ [{ name: 'instance-state-name', values: ['running'] }]
13
13
  ).instances('foo')
14
14
  end
15
15
  end
@@ -18,54 +18,52 @@ describe 'aws-sdk compatibility' do
18
18
 
19
19
  it { expect(ec2_instances.count).to be == 1 }
20
20
 
21
- it { expect(ins.tags['Name']).to match /.+/ }
22
- it { expect(ins.tags['Role']).to match /.+/ }
21
+ it { expect(ins.tag('Name')).to match /.+/ }
22
+ it { expect(ins.tag('Role')).to match /.+/ }
23
+ it { expect(ins.tags).to match_array([have_attributes(key: 'Name', value: /.+/), have_attributes(key: 'Role', value: /.+/)]) }
23
24
  it { expect(ins.ami_launch_index).to be == 0 }
24
- it { expect(ins.architecture).to be == :x86_64 }
25
- it { expect(ins.attachments.to_h).to match( root_device => an_instance_of(AWS::EC2::Attachment) ) }
26
- it { expect(ins.availability_zone).to match /\A#{region}[a-c]\z/ }
27
- it { expect(ins.block_device_mappings.to_h).to match( root_device => an_instance_of(AWS::EC2::Attachment) ) }
25
+ it { expect(ins.architecture).to be == 'x86_64' }
28
26
  it do
29
- expect(ins.block_devices.to_a).to match [{
27
+ expect(ins.block_device_mappings).to match [
28
+ have_attributes(
30
29
  device_name: root_device,
31
- ebs: {
30
+ ebs: have_attributes(
32
31
  volume_id: /\Avol-\w+\z/,
33
32
  status: 'attached',
34
33
  attach_time: an_instance_of(Time),
35
34
  delete_on_termination: true
36
- }
37
- }]
35
+ )
36
+ )]
38
37
  end
38
+ # it { expect(ins.capacity_reservation_id).to be_nil}
39
+ # it { expect(ins.capacity_reservation_specification).to be_nil }
40
+ it { expect(ins.classic_address).to be_a(Aws::EC2::ClassicAddress) }
41
+ it { expect(ins.client).to be_a(Aws::EC2::Client) }
39
42
  it { expect(ins.client_token).to match /\A\w{18}\z/ }
40
- it { expect(ins.dedicated_tenancy?).to be_falsy }
41
- it { expect(ins.dns_name).to match /\Aec2-[\d\.\-]+\.#{region}\.compute\.amazonaws\.com\z/ }
43
+ # it { expect(ins.cpu_options).to be_nil }
42
44
  it { expect(ins.ebs_optimized).to be_falsy }
43
- it do
44
- expect(ins.group_set.to_a).to all match(
45
- group_id: /\Asg-\w+\z/,
46
- group_name: /\A.+\z/,
47
- )
48
- end
49
- it { expect(ins.groups.to_a).to all match(AWS::EC2::SecurityGroup) }
50
- it { expect(ins.hypervisor).to be == :xen }
51
- it { expect(ins.iam_instance_profile_arn).to match /\Aarn:aws:iam::\d+:instance-profile\/[\w\-]+\z/ }
52
- it { expect(ins.iam_instance_profile_id).to match /\A\w{21}\z/ }
45
+ # it { expect(ins.elastic_gpu_associations).to be_nil }
46
+ # it { expect(ins.elastic_inference_accelerator_associations).to be_nil }
47
+ # it { expect(ins.ena_support).to be_falsy }
48
+ # it { expect(ins.hibernation_options).to be_nil}
49
+ it { expect(ins.hypervisor).to be == 'xen' }
50
+ it { expect(ins.iam_instance_profile).to have_attributes(arn: /\Aarn:aws:iam::\d+:instance-profile\/[\w\-]+\z/, id: /\A\w{21}\z/) }
53
51
  it { expect(ins.id).to match /\Ai-\w+\z/ }
54
- it { expect(ins.image).to be_a(AWS::EC2::Image) }
52
+ it { expect(ins.identifiers).to match(id: /\Ai-\w+\z/) }
53
+ it { expect(ins.image).to be_a(Aws::EC2::Image) }
55
54
  it { expect(ins.image_id).to match /\Aami-\w+\z/ }
56
55
  it { expect(ins.instance_id).to match /\Ai-\w+\z/ }
57
56
  it { expect(ins.instance_lifecycle).to be_nil }
58
57
  it { expect(ins.instance_type).to match /\A[trmci][1248]\.\w+\z/ }
59
- it { expect(ins.ip_address).to match /\A[\d\.]+\z/ }
60
58
  it { expect(ins.kernel_id).to be_nil }
61
59
  it { expect(ins.key_name).to match /\A.+\.pem\z/ }
62
- it { expect(ins.key_pair).to be_a(AWS::EC2::KeyPair) }
60
+ # it { expect(ins.key_pair).to be_a(Aws::EC2::KeyPairInfo) }
63
61
  it { expect(ins.launch_time).to be_a(Time) }
64
- it { expect(ins.monitoring).to be == :disabled }
65
- it { expect(ins.monitoring_enabled?).to be_falsy }
66
- it { expect(ins.network_interfaces.to_a).to all match(an_instance_of(AWS::EC2::NetworkInterface)) }
67
- # it { expect(ins.owner_id).to match /\A\d{12}\z/ }
68
- it { expect(ins.placement.to_h).to match( availability_zone: /\A#{region}[a-c]\z/, group_name: nil, tenancy: 'default' ) }
62
+ # it { expect(ins.licenses).to all have_attributes(license_configuration_arn: '') }
63
+ it { expect(ins.monitoring).to have_attributes(state: 'disabled') }
64
+ it { expect(ins.network_interfaces).to all match(an_instance_of(Aws::EC2::NetworkInterface)) }
65
+ it { expect(ins.placement).to have_attributes(availability_zone: /\A#{region}[a-c]\z/, group_name: '', tenancy: 'default') }
66
+ it { expect(ins.placement_group).to be_a(Aws::EC2::PlacementGroup) }
69
67
  it { expect(ins.platform).to be_nil }
70
68
  it { expect(ins.private_dns_name).to match /\Aip-[\w\-]+\.#{region}\.compute\.internal\z/ }
71
69
  it { expect(ins.private_ip_address).to match /\A[\d\.]+\z/ }
@@ -73,19 +71,23 @@ describe 'aws-sdk compatibility' do
73
71
  it { expect(ins.public_dns_name).to match /\Aec2-[\w\-]+\.#{region}\.compute\.amazonaws\.com\z/ }
74
72
  it { expect(ins.public_ip_address).to match /\A[\d\.]+\z/ }
75
73
  it { expect(ins.ramdisk_id).to be_nil }
76
- it { expect(ins.requester_id).to be_nil }
77
- # it { expect(ins.reservation_id).to match /\Ar-\w+\z/ }
78
74
  it { expect(ins.root_device_name).to eq root_device }
79
- it { expect(ins.root_device_type).to be == :ebs }
80
- it { expect(ins.security_groups.to_a).to all match(an_instance_of(AWS::EC2::SecurityGroup)) }
81
- it { expect(ins.spot_instance?).to be_falsy }
82
- it { expect(ins.state_transition_reason).to be_nil }
83
- it { expect(ins.status).to be == :running }
84
- it { expect(ins.status_code).to be == 16 }
85
- it { expect(ins.subnet).to be_a(AWS::EC2::Subnet) }
75
+ it { expect(ins.root_device_type).to be == 'ebs' }
76
+ it do
77
+ expect(ins.security_groups).to all have_attributes(
78
+ group_id: /\Asg-\w+\z/,
79
+ group_name: /\A.+\z/
80
+ )
81
+ end
82
+ it { expect(ins.source_dest_check).to be true }
83
+ it { expect(ins.spot_instance_request_id).to be_nil }
84
+ it { expect(ins.sriov_net_support).to be_nil }
85
+ it { expect(ins.state).to have_attributes(code: 16, name: 'running') }
86
+ it { expect(ins.state_reason).to be_nil }
87
+ it { expect(ins.state_transition_reason).to be == '' }
88
+ it { expect(ins.subnet).to be_a(Aws::EC2::Subnet) }
86
89
  it { expect(ins.subnet_id).to match /\Asubnet-\w+\z/ }
87
- it { expect(ins.virtualization_type).to be == :hvm }
88
- it { expect(ins.vpc).to be_a(AWS::EC2::VPC) }
89
- it { expect(ins.vpc?).to be_truthy }
90
+ it { expect(ins.virtualization_type).to be == 'hvm' }
91
+ it { expect(ins.vpc).to be_a(Aws::EC2::Vpc) }
90
92
  it { expect(ins.vpc_id).to match /\Avpc-\w+\z/ }
91
93
  end
@@ -7,10 +7,10 @@ describe Ec2ssh::Builder do
7
7
  let(:container) do
8
8
  Ec2ssh::Dsl::Container.new.tap do |c|
9
9
  c.aws_keys = {
10
- key1: { access_key_id: 'KEY1', secret_access_key: 'SEC1' },
11
- key2: { access_key_id: 'KEY2', secret_access_key: 'SEC2' }
10
+ 'key1' => { 'us-west-1' => Aws::Credentials.new('KEY1', 'SEC1') },
11
+ 'key2' => { 'us-west-1' => Aws::Credentials.new('KEY2', 'SEC2') }
12
12
  }
13
- c.host_line = "Host <%= tags['Name'] %>"
13
+ c.host_line = "Host <%= tag('Name') %>"
14
14
  end
15
15
  end
16
16
 
@@ -28,12 +28,14 @@ describe Ec2ssh::Builder do
28
28
 
29
29
  let(:instances) do
30
30
  {
31
- key1: [
32
- double('instance', tags: {'Name' => 'srv1'}),
33
- double('instance', tags: {'Name' => 'srv2'})],
34
- key2: [
35
- double('instance', tags: {'Name' => 'srv3'}),
36
- double('instance', tags: {'Name' => 'srv4'})]
31
+ 'key1' => [
32
+ double('instance').tap {|m| allow(m).to receive(:tag).with('Name').and_return('srv1') },
33
+ double('instance').tap {|m| allow(m).to receive(:tag).with('Name').and_return('srv2') }
34
+ ],
35
+ 'key2' => [
36
+ double('instance').tap {|m| allow(m).to receive(:tag).with('Name').and_return('srv3') },
37
+ double('instance').tap {|m| allow(m).to receive(:tag).with('Name').and_return('srv4') }
38
+ ]
37
39
  }
38
40
  end
39
41
 
@@ -50,7 +52,7 @@ Host srv4
50
52
 
51
53
  context 'with #reject' do
52
54
  before do
53
- container.reject = lambda {|ins| ins.tags['Name'] == 'srv1' }
55
+ container.reject = lambda {|ins| ins.tag('Name') == 'srv1' }
54
56
  end
55
57
 
56
58
  it do
@@ -67,10 +69,10 @@ Host srv4
67
69
  context 'checking erb trim_mode' do
68
70
  before do
69
71
  container.host_line = <<-END
70
- % if tags['Name']
71
- <%- if tags['Name'] == 'srv3' -%>
72
- Host <%= tags['Name'] %>
73
- HostName <%= tags['Name'] %>
72
+ % if tag('Name')
73
+ <%- if tag('Name') == 'srv3' -%>
74
+ Host <%= tag('Name') %>
75
+ HostName <%= tag('Name') %>
74
76
  <%- end -%>
75
77
  % end
76
78
  END
@@ -19,11 +19,10 @@ describe Ec2ssh::Command::Remove do
19
19
 
20
20
  let(:dotfile_str) { <<-END }
21
21
  path '/dotfile'
22
- aws_keys(
23
- default: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' }
24
- )
22
+ profiles 'default'
23
+ regions 'us-west-1'
25
24
  host_line <<EOS
26
- Host <%= tags['Name'] %>
25
+ Host <%= tag('Name') %>
27
26
  HostName <%= private_ip_address %>
28
27
  EOS
29
28
  END
@@ -9,6 +9,7 @@ describe Ec2ssh::Command::Update do
9
9
  let(:command) do
10
10
  described_class.new(cli).tap do |cmd|
11
11
  allow(cmd).to receive(:options).and_return(options)
12
+ allow(cmd.builder).to receive(:aws_keys) { aws_keys }
12
13
  allow(cmd.builder.ec2s).to receive(:instances) { instances }
13
14
  end
14
15
  end
@@ -18,10 +19,13 @@ describe Ec2ssh::Command::Update do
18
19
  let(:cli) do
19
20
  double(:cli, options: options, red: nil, yellow: nil, green: nil)
20
21
  end
22
+ let(:aws_keys) do
23
+ {'default' => {'us-west-1' => Aws::Credentials.new('access_key_id', 'secret_access_key')}}
24
+ end
21
25
  let(:instances) do
22
26
  [
23
- double('instance', tags: {'Name' => 'srv1'}, private_ip_address: '10.0.0.1'),
24
- double('instance', tags: {'Name' => 'srv2'}, private_ip_address: '10.0.0.2')
27
+ double('instance', private_ip_address: '10.0.0.1').tap {|m| allow(m).to receive(:tag).with('Name').and_return('srv1') },
28
+ double('instance', private_ip_address: '10.0.0.2').tap {|m| allow(m).to receive(:tag).with('Name').and_return('srv2') }
25
29
  ]
26
30
  end
27
31
 
@@ -34,11 +38,10 @@ describe Ec2ssh::Command::Update do
34
38
  let(:ssh_config_str) { '' }
35
39
  let(:dotfile_str) { <<-END }
36
40
  path '/dotfile'
37
- aws_keys(
38
- default: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' }
39
- )
41
+ profiles 'default'
42
+ regions 'us-west-1'
40
43
  host_line <<EOS
41
- Host <%= tags['Name'] %>
44
+ Host <%= tag('Name') %>
42
45
  HostName <%= private_ip_address %>
43
46
  EOS
44
47
  END
@@ -60,11 +63,10 @@ EOS
60
63
 
61
64
  let(:dotfile_str) { <<-END }
62
65
  path '/dotfile'
63
- aws_keys(
64
- default: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' }
65
- )
66
+ profiles 'default'
67
+ regions 'us-west-1'
66
68
  host_line <<EOS
67
- Host <%= tags['Name'] %>
69
+ Host <%= tag('Name') %>
68
70
  HostName <%= private_ip_address %>
69
71
  EOS
70
72
  END
@@ -27,10 +27,9 @@ END
27
27
  let(:dsl_str) do
28
28
  <<-END
29
29
  aws_keys(
30
- key1: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' },
31
- key2: { access_key_id: 'ACCESS_KEY2', secret_access_key: 'SECRET2' }
30
+ 'key1' => { 'ap-northeast-1' => Aws::Credentials.new('ACCESS_KEY1', 'SECRET1') },
31
+ 'key2' => { 'us-east-1' => Aws::Credentials.new('ACCESS_KEY2', 'SECRET2') }
32
32
  )
33
- regions 'ap-northeast-1', 'us-east-1'
34
33
  host_line 'host lines'
35
34
  reject {|instance| instance }
36
35
  path 'path'
@@ -40,13 +39,12 @@ END
40
39
  subject(:result) { Ec2ssh::Dsl::Parser.parse dsl_str }
41
40
 
42
41
  its(:profiles) { should be_nil }
43
- its(:aws_keys) do
44
- should == {
45
- key1: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' },
46
- key2: { access_key_id: 'ACCESS_KEY2', secret_access_key: 'SECRET2' }
47
- }
42
+ it do
43
+ expect(result.aws_keys).to match(
44
+ 'key1' => { 'ap-northeast-1' => be_a(Aws::Credentials).and(have_attributes(access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1')) } ,
45
+ 'key2' => { 'us-east-1' => be_a(Aws::Credentials).and(have_attributes(access_key_id: 'ACCESS_KEY2', secret_access_key: 'SECRET2')) }
46
+ )
48
47
  end
49
- its(:regions) { should == ['ap-northeast-1', 'us-east-1'] }
50
48
  its(:host_line) { should == 'host lines' }
51
49
  it { expect(result.reject.call(123)).to eq(123) }
52
50
  its(:path) { should == 'path' }
@@ -56,8 +54,8 @@ END
56
54
  let(:dsl_str) do
57
55
  <<-END
58
56
  aws_keys(
59
- key1: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' },
60
- key2: { access_key_id: 'ACCESS_KEY2', secret_access_key: 'SECRET2' }
57
+ 'key1' => { 'ap-northeast-1' => Aws::Credentials.new('ACCESS_KEY1', 'SECRET1') },
58
+ 'key2' => { 'us-east-1' => Aws::Credentials.new('ACCESS_KEY2', 'SECRET2') }
61
59
  )
62
60
  profiles 'default', 'myprofile'
63
61
  regions 'ap-northeast-1', 'us-east-1'
@@ -71,4 +69,39 @@ END
71
69
  expect { Ec2ssh::Dsl::Parser.parse dsl_str }.to raise_error Ec2ssh::DotfileValidationError
72
70
  end
73
71
  end
72
+
73
+ context 'with old structure aws_keys' do
74
+ let(:dsl_str) do
75
+ <<-END
76
+ aws_keys(
77
+ key1: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' },
78
+ key2: { access_key_id: 'ACCESS_KEY2', secret_access_key: 'SECRET2' }
79
+ )
80
+ regions 'ap-northeast-1', 'us-east-1'
81
+ host_line 'host lines'
82
+ reject {|instance| instance }
83
+ path 'path'
84
+ END
85
+ end
86
+
87
+ it { expect { Ec2ssh::Dsl::Parser.parse dsl_str }.to raise_error Ec2ssh::DotfileValidationError }
88
+ end
89
+
90
+ context 'with filters' do
91
+ let(:dsl_str) do
92
+ <<-END
93
+ regions 'ap-northeast-1', 'us-east-1'
94
+ filters [{
95
+ name: 'instance-state-name',
96
+ values: ['running', 'stopped']
97
+ }]
98
+ END
99
+ end
100
+
101
+ subject(:result) { Ec2ssh::Dsl::Parser.parse dsl_str }
102
+
103
+ it do
104
+ expect(result.filters).to eq([{name:'instance-state-name', values:['running', 'stopped']}])
105
+ end
106
+ end
74
107
  end
@@ -12,9 +12,11 @@ describe Ec2ssh::Ec2Instances do
12
12
  }
13
13
 
14
14
  let(:mock) do
15
- described_class.new(profiles='', regions=[region]).tap do |e|
15
+ described_class.new(
16
+ {key_name => {region => ''}},
17
+ [{ name: 'instance-state-name', values: ['running'] }]
18
+ ).tap do |e|
16
19
  allow(e).to receive(:ec2s) { ec2s }
17
- allow(e).to receive(:regions) { [region] }
18
20
  end
19
21
  end
20
22
 
@@ -37,9 +39,9 @@ describe Ec2ssh::Ec2Instances do
37
39
  context 'with non-empty names' do
38
40
  let(:mock_instances) {
39
41
  [
40
- double('instance', n: 1, tags: {'Name' => 'srvB' }),
41
- double('instance', n: 2, tags: {'Name' => 'srvA' }),
42
- double('instance', n: 3, tags: {'Name' => 'srvC' })
42
+ double('instance', n: 1, tags: [double('tag', key: 'Name', value: 'srvB')]),
43
+ double('instance', n: 2, tags: [double('tag', key: 'Name', value: 'srvA')]),
44
+ double('instance', n: 3, tags: [double('tag', key: 'Name', value: 'srvC')])
43
45
  ]
44
46
  }
45
47
 
@@ -52,9 +54,9 @@ describe Ec2ssh::Ec2Instances do
52
54
  context 'with names including empty one' do
53
55
  let(:mock_instances) {
54
56
  [
55
- double('instance', n: 1, tags: {'Name' => 'srvA'}),
56
- double('instance', n: 2, tags: {}),
57
- double('instance', n: 3, tags: {'Name' => 'srvC' })
57
+ double('instance', n: 1, tags: [double('tag', key: 'Name', value: 'srvA')]),
58
+ double('instance', n: 2, tags: []),
59
+ double('instance', n: 3, tags: [double('tag', key: 'Name', value: 'srvC')])
58
60
  ]
59
61
  }
60
62
 
@@ -63,6 +65,22 @@ describe Ec2ssh::Ec2Instances do
63
65
  expect(result.map {|ins| ins.n}).to match_array([2, 1, 3])
64
66
  end
65
67
  end
68
+ end
69
+
70
+ describe Ec2ssh::Ec2Instances::InstanceWrapper do
71
+ let(:mock_instance) {
72
+ double('instance', n: 1, tags: [double('tag', key: 'Name', value: 'srvA')])
73
+ }
74
+ let(:instance) { described_class.new(mock_instance) }
66
75
 
76
+ describe '#tag' do
77
+ it { expect(instance.tag('Name')).to eq 'srvA' }
78
+ end
79
+
80
+ describe '#tags' do
81
+ it { expect(instance.tags).to match_array(have_attributes(key: 'Name', value: 'srvA')) }
82
+ it { expect(instance.tags[0]).to have_attributes(key: 'Name', value: 'srvA') }
83
+ it { expect { instance.tags['Name'] }.to raise_error Ec2ssh::DotfileValidationError }
84
+ end
67
85
  end
68
86
  end
@@ -7,12 +7,6 @@ _ec2ssh-init() {
7
7
  return $ret
8
8
  }
9
9
 
10
- _ec2ssh-migrate() {
11
- local ret
12
- _call_function ret __ec2ssh_noarg_cmd
13
- return $ret
14
- }
15
-
16
10
  _ec2ssh-remove() {
17
11
  local ret
18
12
  _call_function ret __ec2ssh_noarg_cmd
@@ -80,7 +74,6 @@ _ec2ssh_commands() {
80
74
  _values 'command' \
81
75
  'help[Describe available commands or one specific command]' \
82
76
  'init[Add ec2ssh mark to ssh_config]' \
83
- 'migrate[Migrate dotfile from old versions]' \
84
77
  'remove[Remove ec2ssh mark from ssh_config]' \
85
78
  'update[Update ec2 hosts list in ssh_config]' \
86
79
  'version[Show version]'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ec2ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Issei Naruta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-22 00:00:00.000000000 Z
11
+ date: 2019-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.8'
47
+ version: '2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.8'
54
+ version: '2'
55
55
  description: ec2ssh is a ssh_config manager for AWS EC2
56
56
  email:
57
57
  - mimitako@gmail.com
@@ -79,24 +79,20 @@ files:
79
79
  - lib/ec2ssh/cli.rb
80
80
  - lib/ec2ssh/command.rb
81
81
  - lib/ec2ssh/command/init.rb
82
- - lib/ec2ssh/command/migrate.rb
83
82
  - lib/ec2ssh/command/remove.rb
84
83
  - lib/ec2ssh/command/update.rb
85
84
  - lib/ec2ssh/dsl.rb
86
85
  - lib/ec2ssh/ec2_instances.rb
87
86
  - lib/ec2ssh/exceptions.rb
88
- - lib/ec2ssh/migrator.rb
89
87
  - lib/ec2ssh/ssh_config.rb
90
88
  - lib/ec2ssh/version.rb
91
89
  - spec/aws_sdk_compatibility_spec.rb
92
90
  - spec/lib/ec2ssh/builder_spec.rb
93
91
  - spec/lib/ec2ssh/command/init_spec.rb
94
- - spec/lib/ec2ssh/command/migrate_spec.rb
95
92
  - spec/lib/ec2ssh/command/remove_spec.rb
96
93
  - spec/lib/ec2ssh/command/update_spec.rb
97
94
  - spec/lib/ec2ssh/dsl_spec.rb
98
95
  - spec/lib/ec2ssh/ec2_instances_spec.rb
99
- - spec/lib/ec2ssh/migrator_spec.rb
100
96
  - spec/lib/ec2ssh/ssh_config_spec.rb
101
97
  - spec/spec_helper.rb
102
98
  - zsh/_ec2ssh
@@ -118,8 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
114
  - !ruby/object:Gem::Version
119
115
  version: '0'
120
116
  requirements: []
121
- rubyforge_project: ec2ssh
122
- rubygems_version: 2.7.3
117
+ rubygems_version: 3.0.3
123
118
  signing_key:
124
119
  specification_version: 4
125
120
  summary: A ssh_config manager for AWS EC2
@@ -127,11 +122,9 @@ test_files:
127
122
  - spec/aws_sdk_compatibility_spec.rb
128
123
  - spec/lib/ec2ssh/builder_spec.rb
129
124
  - spec/lib/ec2ssh/command/init_spec.rb
130
- - spec/lib/ec2ssh/command/migrate_spec.rb
131
125
  - spec/lib/ec2ssh/command/remove_spec.rb
132
126
  - spec/lib/ec2ssh/command/update_spec.rb
133
127
  - spec/lib/ec2ssh/dsl_spec.rb
134
128
  - spec/lib/ec2ssh/ec2_instances_spec.rb
135
- - spec/lib/ec2ssh/migrator_spec.rb
136
129
  - spec/lib/ec2ssh/ssh_config_spec.rb
137
130
  - spec/spec_helper.rb
@@ -1,34 +0,0 @@
1
- require 'ec2ssh/exceptions'
2
- require 'ec2ssh/command'
3
- require 'ec2ssh/migrator'
4
-
5
- module Ec2ssh
6
- module Command
7
- class Migrate < Base
8
- def initialize(cli)
9
- super
10
- end
11
-
12
- def run
13
- migrator = Migrator.new dotfile_path
14
- version = migrator.check_version
15
- case version
16
- when '2'
17
- cli.red "Current dotfile version is #{version} (#{dotfile_path})"
18
- new_dotfile_str = migrator.migrate_from_2
19
- cli.red "Ec2ssh is migrating your dotfile to version 3 style as follows:"
20
- cli.yellow new_dotfile_str
21
- if cli.yes? "Are you sure to migrate #{dotfile_path} to version 3 style? (y/n)"
22
- backup_path = migrator.backup!
23
- puts "Creating backup as #{backup_path}"
24
- migrator.replace! new_dotfile_str
25
- cli.green 'Migrated successfully.'
26
- end
27
- when '3'
28
- cli.green "Current dotfile version is #{version} (#{dotfile_path})"
29
- cli.green 'Your dotfile is up-to-date.'
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,77 +0,0 @@
1
- require 'yaml'
2
- require 'stringio'
3
- require 'ec2ssh/dsl'
4
-
5
- module Ec2ssh
6
- class Migrator
7
- def initialize(dotfile_path)
8
- @dotfile_path = dotfile_path
9
- end
10
-
11
- def dotfile_str
12
- @dotfile_str ||= File.read(@dotfile_path)
13
- end
14
-
15
- def check_version
16
- begin
17
- hash = YAML.load dotfile_str
18
- return '2' if hash.is_a?(Hash) && hash.keys.include?('aws_keys')
19
- rescue Psych::SyntaxError
20
- end
21
-
22
- begin
23
- Dsl::Parser.parse dotfile_str
24
- return '3'
25
- rescue DotfileSyntaxError
26
- end
27
-
28
- raise InvalidDotfile
29
- end
30
-
31
- def migrate_from_2
32
- hash = YAML.load dotfile_str
33
- out = StringIO.new
34
-
35
- out.puts "path '#{hash['path']}'" if hash['path']
36
-
37
- out.puts 'aws_keys('
38
- out.puts hash['aws_keys'].map {|name, key|
39
- " #{name}: { access_key_id: '#{key['access_key_id']}', secret_access_key: '#{key['secret_access_key']}' }"
40
- }.join(",\n")
41
- out.puts ')'
42
-
43
- if hash['regions']
44
- regions = hash['regions'].map{|r| "'#{r}'" }.join(', ')
45
- out.puts "regions #{regions}"
46
- end
47
-
48
- out.puts <<-END
49
-
50
- # Ignore unnamed instances
51
- reject {|instance| !instance.tags['Name'] }
52
-
53
- # You can use methods of AWS::EC2::Instance.
54
- # See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
55
- host_line <<EOS
56
- Host <%= tags['Name'] %>.<%= availability_zone %>
57
- HostName <%= dns_name || private_ip_address %>
58
- EOS
59
- END
60
-
61
- out.puts
62
- out.puts dotfile_str.gsub(/^/m, '# ')
63
-
64
- out.string
65
- end
66
-
67
- def replace!(new_dotfile_str)
68
- File.open(@dotfile_path, 'w') {|f| f.write new_dotfile_str }
69
- end
70
-
71
- def backup!
72
- backup_path = "#{@dotfile_path}.#{Time.now.strftime("%Y%m%d%H%M%S")}"
73
- File.open(backup_path, 'w') {|f| f.write dotfile_str }
74
- backup_path
75
- end
76
- end
77
- end
@@ -1,113 +0,0 @@
1
- require 'spec_helper'
2
- require 'ec2ssh/command/migrate'
3
-
4
- describe Ec2ssh::Command::Migrate do
5
- include FakeFS::SpecHelpers
6
-
7
- describe '#run' do
8
- let(:cli) do
9
- double(:cli,
10
- options: options, yes?: nil,
11
- red: nil, yellow: nil, green: nil)
12
- end
13
- let(:command) do
14
- described_class.new cli
15
- end
16
- let(:options) do
17
- double(:options, dotfile: '/dotfile')
18
- end
19
-
20
- before do
21
- File.open('/dotfile', 'w') {|f| f.write dotfile_str }
22
- end
23
-
24
- around do |example|
25
- silence_stdout { example.run }
26
- end
27
-
28
- context 'version 2' do
29
- let(:dotfile_str) { <<-END }
30
- ---
31
- path: /path/to/ssh/config
32
- aws_keys:
33
- key1:
34
- access_key_id: ACCESS_KEY1
35
- secret_access_key: SECRET1
36
- END
37
-
38
- context 'yes' do
39
- before do
40
- expect(cli).to receive(:yes?).and_return(true)
41
- Timecop.freeze(Time.utc(2014, 1, 1)) do
42
- command.run
43
- end
44
- end
45
-
46
- it do
47
- expect(File.read('/dotfile')).to eq <<-END
48
- path '/path/to/ssh/config'
49
- aws_keys(
50
- key1: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' }
51
- )
52
-
53
- # Ignore unnamed instances
54
- reject {|instance| !instance.tags['Name'] }
55
-
56
- # You can use methods of AWS::EC2::Instance.
57
- # See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
58
- host_line <<EOS
59
- Host <%= tags['Name'] %>.<%= availability_zone %>
60
- HostName <%= dns_name || private_ip_address %>
61
- EOS
62
-
63
- # ---
64
- # path: /path/to/ssh/config
65
- # aws_keys:
66
- # key1:
67
- # access_key_id: ACCESS_KEY1
68
- # secret_access_key: SECRET1
69
- END
70
- end
71
-
72
- it do
73
- expect(File.read('/dotfile.20140101000000')).to eq(dotfile_str)
74
- end
75
- end
76
-
77
- context 'no' do
78
- before do
79
- expect(cli).to receive(:yes?).and_return(false)
80
- command.run
81
- end
82
-
83
- it do
84
- expect(File.read('/dotfile')).to eq(dotfile_str)
85
- end
86
- end
87
- end
88
-
89
- context 'version 3' do
90
- let(:dotfile_str) { <<-END }
91
- path '/path/to/ssh/config'
92
- aws_keys(
93
- key1: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' }
94
- )
95
-
96
- # You can use methods of AWS::EC2::Instance.
97
- # See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
98
- host_line <<EOS
99
- Host <%= tags['Name'] %>.<%= availability_zone %>
100
- HostName <%= dns_name || private_ip_address %>
101
- EOS
102
- END
103
-
104
- before do
105
- command.run
106
- end
107
-
108
- it do
109
- expect(File.read('/dotfile')).to eq(dotfile_str)
110
- end
111
- end
112
- end
113
- end
@@ -1,64 +0,0 @@
1
- require 'spec_helper'
2
- require 'ec2ssh/migrator'
3
-
4
- describe Ec2ssh::Migrator do
5
- include FakeFS::SpecHelpers
6
-
7
- subject(:migrator) { described_class.new '/dotfile' }
8
-
9
- before do
10
- File.open('/dotfile', 'w') {|f| f.write dotfile_str }
11
- end
12
-
13
- context 'from version 2' do
14
- let(:dotfile_str) { <<-END }
15
- ---
16
- path: /path/to/ssh/config
17
- aws_keys:
18
- key1:
19
- access_key_id: ACCESS_KEY1
20
- secret_access_key: SECRET1
21
- key2:
22
- access_key_id: ACCESS_KEY2
23
- secret_access_key: SECRET2
24
- regions:
25
- - ap-northeast-1
26
- - us-east-1
27
- END
28
-
29
- let(:new_dotfile_str) { <<-END }
30
- path '/path/to/ssh/config'
31
- aws_keys(
32
- key1: { access_key_id: 'ACCESS_KEY1', secret_access_key: 'SECRET1' },
33
- key2: { access_key_id: 'ACCESS_KEY2', secret_access_key: 'SECRET2' }
34
- )
35
- regions 'ap-northeast-1', 'us-east-1'
36
-
37
- # Ignore unnamed instances
38
- reject {|instance| !instance.tags['Name'] }
39
-
40
- # You can use methods of AWS::EC2::Instance.
41
- # See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
42
- host_line <<EOS
43
- Host <%= tags['Name'] %>.<%= availability_zone %>
44
- HostName <%= dns_name || private_ip_address %>
45
- EOS
46
-
47
- # ---
48
- # path: /path/to/ssh/config
49
- # aws_keys:
50
- # key1:
51
- # access_key_id: ACCESS_KEY1
52
- # secret_access_key: SECRET1
53
- # key2:
54
- # access_key_id: ACCESS_KEY2
55
- # secret_access_key: SECRET2
56
- # regions:
57
- # - ap-northeast-1
58
- # - us-east-1
59
- END
60
-
61
- it { expect(migrator.check_version).to eq('2') }
62
- it { expect(migrator.migrate_from_2).to eq(new_dotfile_str) }
63
- end
64
- end