knife-ec2 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 238f0a88ecd9813d5239ad922e42cb1428acd542
4
- data.tar.gz: c6c9b3452ba8d207c85b82aa7bd2e879e2af6eeb
3
+ metadata.gz: 889db53ef2c074e00e6f39d699546e1c559aa8aa
4
+ data.tar.gz: 9295959d153ee997e857113dde66c746435502a3
5
5
  SHA512:
6
- metadata.gz: 7558bd27ec67e545fee9fb18c5f1be43aeea4cbeac604d8992daa9dec7359c34a42ca90981575dc1370f4066f4104ee1e43b8e89f846b958de18fff827a77bbc
7
- data.tar.gz: d10d4bdb2174a1880814da08469bd279b9da1546778a48f60dde3589c9bf39dd8bb7085f4baad4574f929072a27ad1f0e87dc5e85f9e4d92192b8deeb51efd68
6
+ metadata.gz: f7921659633817867c17ddfcde5f256128761e8b5c9c1a675786099a4244d5d134aed0df8b8c2f6bb915df8fe1de24ef1ced5fdfab98981ad27635a8b4b1935a
7
+ data.tar.gz: 713004b60d245461dc9bede11abac218cc29b77fc898207abc2388d0d5bf45b1fb4fd59575328e00a38d3f56d22252f6f3cc812389a54289f12a905ea27bbcb3
@@ -4,7 +4,20 @@ Note: this log contains only changes from knife-ec2 release 0.8.0 and later
4
4
  -- it does not contain the changes from prior releases. To view change history
5
5
  prior to release 0.8.0, please visit the [source repository](https://github.com/chef/knife-ec2/commits).
6
6
 
7
+
8
+ ## Latest Release 0.15.0 (2017-02-15)
9
+ * [knife-ec2:#484](https://github.com/chef/knife-ec2/pull/484) sleep for collecting windows password
10
+ * [knife-ec2:#481](https://github.com/chef/knife-ec2/pull/481) Updated readme for EC2 AMI list
11
+ * [knife-ec2:#482](https://github.com/chef/knife-ec2/pull/482) Allow search for EC2 AMIs
12
+ * [knife-ec2:#471](https://github.com/chef/knife-ec2/pull/471) Added support to include ec2 server id in the node name using `-N "www-server-%s" or --chef-node-name "-www-server-%s"`
13
+ * [knife-ec2:#478](https://github.com/chef/knife-ec2/pull/478) Allow for hosts without public ip addresses
14
+ * [knife-ec2:#476](https://github.com/chef/knife-ec2/pull/476) Tag node in chef
15
+ * [knife-ec2:#458](https://github.com/chef/knife-ec2/pull/458) Fix where yes option wasn’t being passed to bootstrap
16
+ * [knife-ec2:#468](https://github.com/chef/knife-ec2/pull/468) In VPC mode use private IP when public IP and DNS not available
17
+ * [knife-ec2:#464](https://github.com/chef/knife-ec2/pull/464) default value and desription is changed for --ebs-volume-type
18
+
7
19
  ## Latest Release 0.14.0 (2016-12-02)
20
+ * `knife-ec2` requires `chef-client 12.14` or newer.
8
21
  * [knife-ec2:#442](https://github.com/chef/knife-ec2/pull/442) Added support to show flavor list in json format.
9
22
  * [knife-ec2:#439](https://github.com/chef/knife-ec2/pull/439) Allow to accept multiple security group ids using --security-group-id option multiple times and added deprecated message for comma seprated --security-group-ids option.
10
23
 
data/README.md CHANGED
@@ -203,6 +203,10 @@ knife ec2 server create -I ami-173d747e -x ubuntu --server-connect-attribute pub
203
203
 
204
204
  View additional information on configuring Windows images for bootstrap in the documentation for [knife-windows](https://docs.chef.io/plugin_knife_windows.html).
205
205
 
206
+ #### Adding server_id to the node name
207
+
208
+ Users can also include the ec2 server id in the node name by placing `%s` in the string passed to the `--chef-node-name` option. The %s is replaced by the ec2 server id dynamically.
209
+ e.g. `-N "www-server-%s" or --chef-node-name "www-server-%s"`
206
210
 
207
211
  #### Bootstrap Windows (2012 R2 and above platform) instance without user-data through winrm ssl transport
208
212
 
@@ -230,13 +234,39 @@ The `knife ec2 server create` command also supports the following options for bo
230
234
  :kerberos_realm The Kerberos realm used for authentication
231
235
  :kerberos_service The Kerberos service used for authentication
232
236
  ```
237
+ ### `knife ec2 ami list`
238
+ This command provides the feature to list all EC2 AMIs. It also provides the feature to filter the AMIs based on owner and platform.
233
239
 
234
- ### `knife ec2 server delete`
235
- Deletes an existing server in the currently configured AWS account. **By default, this does not delete the associated node and client objects from the Chef server. To do so, add the `--purge` flag**
240
+ ```
241
+ knife ec2 ami list
242
+ ```
243
+
244
+ #### Options for AMIs list
245
+ - **Owner:**
246
+ By default owner is aws-marketplace but you can specify following owner with the help of -o or --owner:
247
+
248
+ **command:** knife ec2 ami list -o (options)
249
+
250
+ ```
251
+ :self Displays the list of AMIs created by the user.
252
+ :aws-marketplace Displays all AMIs form trusted vendors like Ubuntu, Microsoft, SAP, Zend as well as many open source offering.
253
+ :micosoft Displays only Microsoft vendor AMIs.
254
+ ```
255
+ - **Platform:**
256
+ By default all platform AMIs are displayed, but you can filter your response by specifying the platform using -p or --platform:
257
+
258
+ **command:** knife ec2 ami list -p (options)
259
+
260
+ ```
261
+ :Allowed platform windows, ubuntu, debian, centos, fedora, rhel, nginx, turnkey, jumpbox, coreos, cisco, amazon, nessus
262
+ ```
236
263
 
237
264
  ### `knife ec2 server list`
238
265
  Outputs a list of all servers in the currently configured AWS account. **Note, this shows all instances associated with the account, some of which may not be currently managed by the Chef server.**
239
266
 
267
+ ### `knife ec2 server delete`
268
+ Deletes an existing server in the currently configured AWS account. **By default, this does not delete the associated node and client objects from the Chef server. To do so, add the `--purge` flag**
269
+
240
270
  ## License and Authors
241
271
  - Author:: Adam Jacob ([adam@chef.io](mailto:adam@chef.io))
242
272
 
@@ -7,14 +7,26 @@ Example Note:
7
7
  Details about the thing that changed that needs to get included in the Release Notes in markdown.
8
8
  -->
9
9
 
10
- # knife-ec2 0.14.0 release notes:
10
+ # knife-ec2 0.15.0 release notes:
11
+ In this release we have added a command to list EC2 AMIs. Also added a feature to append server_id to the chef-node-name. There are a couple of bug fixes as well.
11
12
 
12
- This release of `knife-ec2` contains minor bug fixes.
13
+ ## Features added in knife-ec2 0.15.0
13
14
 
14
- ## Features added in knife-ec2 0.14.0
15
+ * Added command to list EC2 AMIs using `knife ec2 ami list` PR: [482](https://github.com/chef/knife-ec2/pull/482)
15
16
 
16
- * Added support to `flavor list` in json format using `--format json` option.
17
+ * Added support to insert ec2 server id into node name using -N "<Node Name>%s" PR: [471](https://github.com/chef/knife-ec2/pull/471)
17
18
 
18
- * `--security-group-id` option to specify security groups for the server. This opiton can be used multiple times when specifying multiple security groups. e.g. `-g sg-e985168d -g sg-e7f06383 -g sg-ec1b7e88`.
19
+ * Changed source of vm name to allow for hosts without public ip addresses PR: [478](https://github.com/chef/knife-ec2/pull/478)
19
20
 
20
- ***Note:*** The `--security-group-ids` option will be removed in a future release. Use the new `--security-group-id` option.
21
+ * Automatically pass tags to Chef as well as EC2 PR: [476](https://github.com/chef/knife-ec2/pull/476)
22
+
23
+
24
+ ## Fixed issue in knife-ec2 0.15.0
25
+
26
+ * Wait for Windows Admin password to be available PR: [484](https://github.com/chef/knife-ec2/pull/484), issue: [479](https://github.com/chef/knife-ec2/issues/479), issue: [453](https://github.com/chef/knife-ec2/issues/453)
27
+
28
+ * Fix where `--yes` option was not being passed to bootstrap PR: [458](https://github.com/chef/knife-ec2/pull/458)
29
+
30
+ * In VPC mode use private IP when public IP and DNS are not available PR: [468](https://github.com/chef/knife-ec2/pull/468), issue: [344](https://github.com/chef/knife-ec2/issues/344)
31
+
32
+ * Default value and description improved for `--ebs-volume-type` improved for clarity PR: [464](https://github.com/chef/knife-ec2/pull/464), issue: [450](https://github.com/chef/knife-ec2/issues/450), issue [451](https://github.com/chef/knife-ec2/issues/451)
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
18
  s.required_ruby_version = ">= 2.2.2"
19
19
 
20
- s.add_dependency 'fog-aws', '~> 0.7'
20
+ s.add_dependency 'fog-aws', '~> 1.0'
21
21
  s.add_dependency 'mime-types'
22
22
  s.add_dependency 'knife-windows', '~> 1.0'
23
23
 
@@ -0,0 +1,101 @@
1
+ #
2
+ # Author:: Piyush Awasthi (<piyush.awasthi@msystechnologies.com>)
3
+ # Copyright:: Copyright (c) 2017 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+
19
+ require "chef/knife/ec2_base"
20
+
21
+ class Chef
22
+ class Knife
23
+ class Ec2AmiList < Knife
24
+
25
+ # == Overview
26
+ #
27
+ # This file provides the facility to display AMI list.
28
+ #
29
+ # == Owner
30
+ # By default owner is aws-marketplace but you can specify following owner with the help of -o or --owner
31
+ # * self => Displays the list of AMIs created by the user
32
+ # * aws-marketplace => Displays all AMIs form trusted vendors like Ubuntu, Microsoft, SAP, Zend as well as many open source offering
33
+ # * micosoft => Displays only Microsoft vendor AMIs
34
+ #
35
+ # == Platform
36
+ # By default all platform AMI's will display but you can filter your response
37
+ # by specify the platform using -p or --platform
38
+ # * Valid Platform => ubuntu, debian, centos, fedora, rhel, nginx, turnkey, jumpbox, coreos, cisco
39
+ #
40
+ # {Amazon API Reference}[http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeImages.html]
41
+
42
+ include Knife::Ec2Base
43
+
44
+ banner "knife ec2 ami list (options)"
45
+
46
+ option :platform,
47
+ :short => "-p PLATFORM",
48
+ :long => "--platform PLATFORM",
49
+ :description => "Platform of the server. Allowed values are ubuntu, debian, centos, fedora, rhel, nginx, turnkey, jumpbox, coreos, cisco, amazon, nessus"
50
+
51
+ option :owner,
52
+ :short => "-o OWNER",
53
+ :long => "--owner OWNER",
54
+ :description => "The server owner (self, aws-marketplace, microsoft). Default is aws-marketplace"
55
+
56
+ def run
57
+ $stdout.sync = true
58
+
59
+ validate!
60
+ custom_warnings!
61
+
62
+ server_list = [
63
+ ui.color("AMI ID", :bold),
64
+ ui.color("Platform", :bold),
65
+ ui.color("Architecture", :bold),
66
+ ui.color("Size", :bold),
67
+ ui.color("Name", :bold)
68
+ ].flatten.compact
69
+
70
+ output_column_count = server_list.length
71
+ begin
72
+ owner = locate_config_value(:owner) || "aws-marketplace"
73
+ servers = connection.describe_images({"Owner"=>"#{owner}"}) # aws-marketplace, microsoft
74
+ rescue Exception => api_error
75
+ raise api_error
76
+ end
77
+ servers.body["imagesSet"].each do |server|
78
+ server_name = server["name"]
79
+ server["platform"] = find_server_platform(server_name) unless server["platform"]
80
+
81
+ if locate_config_value(:platform)
82
+ if server["platform"] == locate_config_value(:platform)
83
+ server_list << server["imageId"]
84
+ server_list << server["platform"]
85
+ server_list << server["architecture"]
86
+ server_list << server["blockDeviceMapping"].first["volumeSize"].to_s
87
+ server_list << server_name.split(/\W+/).first
88
+ end
89
+ else
90
+ server_list << server["imageId"]
91
+ server_list << server["platform"]
92
+ server_list << server["architecture"]
93
+ server_list << server["blockDeviceMapping"].first["volumeSize"].to_s
94
+ server_list << server_name.split(/\W+/).first
95
+ end
96
+ end
97
+ puts ui.list(server_list, :uneven_columns_across, output_column_count)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -106,7 +106,7 @@ class Chef
106
106
 
107
107
  def msg_pair(label, value, color=:cyan)
108
108
  if value && !value.to_s.empty?
109
- puts "#{ui.color(label, color)}: #{value}"
109
+ ui.info("#{ui.color(label, color)}: #{value}")
110
110
  end
111
111
  end
112
112
 
@@ -177,6 +177,18 @@ class Chef
177
177
  exit 1
178
178
  end
179
179
  end
180
+
181
+ if locate_config_value(:platform)
182
+ unless valid_platforms.include? (locate_config_value(:platform))
183
+ raise ArgumentError, "Invalid platform: #{locate_config_value(:platform)}. Allowed platforms are: #{valid_platforms.join(", ")}."
184
+ end
185
+ end
186
+
187
+ if locate_config_value(:owner)
188
+ unless ["self", "aws-marketplace", "microsoft"].include? (locate_config_value(:owner))
189
+ raise ArgumentError, "Invalid owner: #{locate_config_value(:owner)}. Allowed owners are self, aws-marketplace or microsoft."
190
+ end
191
+ end
180
192
  end
181
193
 
182
194
  end
@@ -207,5 +219,25 @@ class Chef
207
219
  end
208
220
  map
209
221
  end
222
+
223
+ # All valid platforms
224
+ def valid_platforms
225
+ ["ubuntu", "debian", "centos", "fedora", "rhel", "nginx", "turnkey", "jumpbox", "coreos", "cisco", "amazon", "nessus"]
226
+ end
227
+
228
+ # Get the platform from server name
229
+ def find_server_platform(server_name)
230
+ available_platforms = valid_platforms
231
+ get_platform = available_platforms.select { |name| server_name.downcase.include?(name) }
232
+ return get_platform.first
233
+ end
234
+
235
+
236
+ # Custom Warning
237
+ def custom_warnings!
238
+ if !config[:region] && Chef::Config[:knife][:region].nil?
239
+ ui.warn "No region was specified in knife.rb or as an argument. The default region, us-east-1, will be used:"
240
+ end
241
+ end
210
242
  end
211
243
  end
@@ -254,7 +254,7 @@ class Chef
254
254
 
255
255
  option :fqdn,
256
256
  :long => "--fqdn FQDN",
257
- :description => "Pre-defined FQDN",
257
+ :description => "Pre-defined FQDN. This is used for Kerberos Authentication purpose only",
258
258
  :proc => Proc.new { |key| Chef::Config[:knife][:fqdn] = key },
259
259
  :default => nil
260
260
 
@@ -294,9 +294,9 @@ class Chef
294
294
 
295
295
  option :ebs_volume_type,
296
296
  :long => "--ebs-volume-type TYPE",
297
- :description => "Standard or Provisioned (io1) IOPS or General Purpose (gp2)",
297
+ :description => "Possible values are standard (magnetic) | io1 | gp2 | sc1 | st1. Default is gp2",
298
298
  :proc => Proc.new { |key| Chef::Config[:knife][:ebs_volume_type] = key },
299
- :default => "standard"
299
+ :default => "gp2"
300
300
 
301
301
  option :ebs_provisioned_iops,
302
302
  :long => "--provisioned-iops IOPS",
@@ -500,7 +500,11 @@ class Chef
500
500
 
501
501
  # Always set the Name tag
502
502
  unless hashed_tags.keys.include? "Name"
503
- hashed_tags["Name"] = locate_config_value(:chef_node_name) || @server.id
503
+ if locate_config_value(:chef_node_name)
504
+ hashed_tags["Name"] = evaluate_node_name(locate_config_value(:chef_node_name))
505
+ else
506
+ hashed_tags["Name"] = server.id
507
+ end
504
508
  end
505
509
 
506
510
  printed_tags = hashed_tags.map{ |tag, val| "#{tag}: #{val}" }.join(", ")
@@ -735,6 +739,7 @@ class Chef
735
739
  bootstrap.config[:bootstrap_vault_json] = locate_config_value(:bootstrap_vault_json)
736
740
  bootstrap.config[:bootstrap_vault_item] = locate_config_value(:bootstrap_vault_item)
737
741
  bootstrap.config[:use_sudo_password] = locate_config_value(:use_sudo_password)
742
+ bootstrap.config[:yes] = locate_config_value(:yes)
738
743
  # Modify global configuration state to ensure hint gets set by
739
744
  # knife-bootstrap
740
745
  Chef::Config[:knife][:hints] ||= {}
@@ -780,7 +785,12 @@ class Chef
780
785
  bootstrap.config[:msi_url] = locate_config_value(:msi_url)
781
786
  bootstrap.config[:install_as_service] = locate_config_value(:install_as_service)
782
787
  bootstrap.config[:session_timeout] = locate_config_value(:session_timeout)
783
- bootstrap.config[:chef_node_name] = config[:chef_node_name] || server.id
788
+ bootstrap.config[:tags] = config[:tags]
789
+ if locate_config_value(:chef_node_name)
790
+ bootstrap.config[:chef_node_name] = evaluate_node_name(locate_config_value(:chef_node_name))
791
+ else
792
+ bootstrap.config[:chef_node_name] = server.id
793
+ end
784
794
  bootstrap_common_params(bootstrap)
785
795
  end
786
796
 
@@ -792,7 +802,12 @@ class Chef
792
802
  bootstrap.config[:ssh_port] = config[:ssh_port]
793
803
  bootstrap.config[:ssh_gateway] = config[:ssh_gateway]
794
804
  bootstrap.config[:identity_file] = config[:identity_file]
795
- bootstrap.config[:chef_node_name] = locate_config_value(:chef_node_name) || server.id
805
+ bootstrap.config[:tags] = config[:tags]
806
+ if locate_config_value(:chef_node_name)
807
+ bootstrap.config[:chef_node_name] = evaluate_node_name(locate_config_value(:chef_node_name))
808
+ else
809
+ bootstrap.config[:chef_node_name] = server.id
810
+ end
796
811
  bootstrap.config[:use_sudo] = true unless config[:ssh_user] == 'root'
797
812
  # may be needed for vpc_mode
798
813
  bootstrap.config[:host_key_verify] = config[:host_key_verify]
@@ -972,6 +987,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
972
987
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
973
988
  }
974
989
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
990
+ If (-Not $vm_name) {
991
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
992
+ }
975
993
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
976
994
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
977
995
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1216,18 +1234,22 @@ EOH
1216
1234
  }
1217
1235
  end
1218
1236
 
1237
+ def subnet_public_ip_on_launch?
1238
+ connection.subnets.get(server.subnet_id).map_public_ip_on_launch
1239
+ end
1240
+
1219
1241
  def ssh_connect_host
1220
1242
  unless @ssh_connect_host
1221
1243
  if config[:server_connect_attribute]
1222
1244
  connect_attribute = config[:server_connect_attribute]
1245
+ server.send(config[:server_connect_attribute])
1246
+ elsif vpc_mode? && !(subnet_public_ip_on_launch? || config[:associate_public_ip] || config[:associate_eip])
1247
+ connect_attribute = "private_ip_address"
1248
+ server.private_ip_address
1223
1249
  else
1224
- if vpc_mode? && !(config[:associate_public_ip] || config[:associate_eip])
1225
- connect_attribute = "private_ip_address"
1226
- else
1227
- connect_attribute = server.dns_name ? "dns_name" : "public_ip_address"
1228
- end
1250
+ connect_attribute = server.dns_name ? "dns_name" : "public_ip_address"
1251
+ server.send(connect_attribute)
1229
1252
  end
1230
-
1231
1253
  @ssh_connect_host = server.send(connect_attribute)
1232
1254
  end
1233
1255
 
@@ -1381,6 +1403,7 @@ EOH
1381
1403
  end
1382
1404
 
1383
1405
  def check_windows_password_available(server_id)
1406
+ sleep 10
1384
1407
  response = connection.get_password_data(server_id)
1385
1408
  if not response.body["passwordData"]
1386
1409
  return false
@@ -1393,7 +1416,6 @@ EOH
1393
1416
  if locate_config_value(:identity_file)
1394
1417
  print "\n#{ui.color("Waiting for Windows Admin password to be available", :magenta)}"
1395
1418
  print(".") until check_windows_password_available(@server.id) {
1396
- sleep 1000 #typically is available after 30 mins
1397
1419
  puts("done")
1398
1420
  }
1399
1421
  response = connection.get_password_data(@server.id)
@@ -1415,6 +1437,13 @@ EOH
1415
1437
  require 'chef/knife/bootstrap_windows_ssh'
1416
1438
  require 'chef/knife/core/windows_bootstrap_context'
1417
1439
  end
1440
+
1441
+ #Returns the name of node after evaluation of server id if %s is present.
1442
+ #Eg: "Test-%s" will return "Test-i-12345" in case the instance id is i-12345
1443
+ def evaluate_node_name(node_name)
1444
+ return node_name%server.id
1445
+ end
1446
+
1418
1447
  end
1419
1448
  end
1420
1449
  end
@@ -1,6 +1,6 @@
1
1
  module Knife
2
2
  module Ec2
3
- VERSION = "0.14.0"
3
+ VERSION = "0.15.0"
4
4
  MAJOR, MINOR, TINY = VERSION.split('.')
5
5
  end
6
6
  end
@@ -1,18 +1,19 @@
1
- $:.unshift File.expand_path('../../lib', __FILE__)
2
- require 'chef'
3
- require 'chef/knife/winrm_base'
4
- require 'chef/knife/ec2_server_create'
5
- require 'chef/knife/ec2_server_delete'
6
- require 'chef/knife/ec2_server_list'
7
-
8
- # Clear config between each example
9
- # to avoid dependencies between examples
10
- RSpec.configure do |c|
11
- c.raise_errors_for_deprecations!
12
- c.filter_run_excluding :exclude => true
13
- c.before(:each) do
14
- Chef::Config.reset
15
- Chef::Config[:knife] ={}
16
- end
17
- end
18
-
1
+ $:.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'chef'
3
+ require 'chef/knife/winrm_base'
4
+ require 'chef/knife/ec2_server_create'
5
+ require 'chef/knife/ec2_server_delete'
6
+ require 'chef/knife/ec2_server_list'
7
+ require 'chef/knife/ec2_ami_list'
8
+
9
+ # Clear config between each example
10
+ # to avoid dependencies between examples
11
+ RSpec.configure do |c|
12
+ c.raise_errors_for_deprecations!
13
+ c.filter_run_excluding :exclude => true
14
+ c.before(:each) do
15
+ Chef::Config.reset
16
+ Chef::Config[:knife] ={}
17
+ end
18
+ end
19
+
@@ -0,0 +1,273 @@
1
+ # License:: Apache License, Version 2.0
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ require File.expand_path('../../spec_helper', __FILE__)
17
+ require 'fog/aws'
18
+
19
+ describe Chef::Knife::Ec2AmiList do
20
+
21
+ describe '#run' do
22
+ let(:knife_ec2_ami_list) { Chef::Knife::Ec2AmiList.new }
23
+ let(:ec2_connection) { double(Fog::Compute::AWS) }
24
+ before (:each) do
25
+ allow(knife_ec2_ami_list).to receive(:connection).and_return(ec2_connection)
26
+ @describe_images_format = double("describe_image_output", :body => {
27
+ 'imagesSet' => [{
28
+ 'architecture' => "x86_64",
29
+ 'blockDeviceMapping' => [{"deviceName"=>"/dev/sda1",
30
+ "snapshotId"=>"snap-f7e645f4",
31
+ "volumeSize"=>30,
32
+ "deleteOnTermination"=>"true",
33
+ "volumeType"=>"standard",
34
+ "encrypted"=>"false"}],
35
+ 'description' => "DC for Quan",
36
+ 'hypervisor' => "xen",
37
+ 'imageId' => "ami-4ace6d23",
38
+ 'imageLocation' => "microsoft/Windows_Server-2008-R2-SP1-English-64Bit-WebMatrix_Hosting-2012.06.12",
39
+ 'imageOwnerAlias' => "microsoft",
40
+ 'name' => "Windows_Server-2008-R2-SP1-English-64Bit-Windows_Media_Services_4.1-2012.06.12",
41
+ 'imageOwnerId' => "461346954234",
42
+ 'imageState' => "available",
43
+ 'imageType' => "machine",
44
+ 'isPublic' => true,
45
+ 'platform' => "windows",
46
+ 'productCodes' => [],
47
+ 'rootDeviceName' => "/dev/sda1",
48
+ 'rootDeviceType' => "ebs",
49
+ 'stateReason' => {},
50
+ 'tagSet' => {},
51
+ 'virtualizationType' => "hvm"
52
+ }, {
53
+ 'architecture' => "i386",
54
+ 'blockDeviceMapping' => [{"deviceName"=>"/dev/sda1",
55
+ "snapshotId"=>"snap-f7e645f4",
56
+ "volumeSize"=>10,
57
+ "deleteOnTermination"=>"true",
58
+ "volumeType"=>"standard",
59
+ "encrypted"=>"false"}],
60
+ 'description' => "DC for Quan",
61
+ 'hypervisor' => "xen",
62
+ 'imageId' => "ami-4ace6d21",
63
+ 'imageOwnerAlias' => "aws-marketplace",
64
+ 'name' => "ubuntu i386",
65
+ 'imageOwnerId' => "461346954235",
66
+ 'imageState' => "available",
67
+ 'imageType' => "machine",
68
+ 'isPublic' => true,
69
+ 'productCodes' => [],
70
+ 'rootDeviceName' => "/dev/sda1",
71
+ 'rootDeviceType' => "ebs",
72
+ 'stateReason' => {},
73
+ 'tagSet' => {},
74
+ 'virtualizationType' => "hvm"
75
+ }, {
76
+ 'architecture' => "x86_64",
77
+ 'blockDeviceMapping' => [{"deviceName"=>"/dev/sda1",
78
+ "snapshotId"=>"snap-f7e645f4",
79
+ "volumeSize"=>8,
80
+ "deleteOnTermination"=>"true",
81
+ "volumeType"=>"standard",
82
+ "encrypted"=>"false"}],
83
+ 'description' => "DC for Quan",
84
+ 'hypervisor' => "xen",
85
+ 'imageId' => "ami-4ace6d29",
86
+ 'imageOwnerAlias' => "aws-marketplace",
87
+ 'name' => "fedora i64",
88
+ 'imageOwnerId' => "461346954234",
89
+ 'imageState' => "available",
90
+ 'imageType' => "machine",
91
+ 'isPublic' => true,
92
+ 'productCodes' => [],
93
+ 'rootDeviceName' => "/dev/sda1",
94
+ 'rootDeviceType' => "ebs",
95
+ 'stateReason' => {},
96
+ 'tagSet' => {},
97
+ 'virtualizationType' => "hvm"
98
+ }],
99
+ 'requestId' => "ba38c315-f1b4-4822-b336-6309bed6d50c"
100
+ }
101
+ )
102
+ end
103
+
104
+ it 'invokes validate!' do
105
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
106
+ allow(knife_ec2_ami_list.ui).to receive(:warn)
107
+ expect(knife_ec2_ami_list).to receive(:validate!)
108
+ knife_ec2_ami_list.run
109
+ end
110
+
111
+ context 'when region is not specified' do
112
+ it 'shows warning that default region will be will be used' do
113
+ knife_ec2_ami_list.config.delete(:region)
114
+ Chef::Config[:knife].delete(:region)
115
+ ec2_servers = double()
116
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
117
+ allow(knife_ec2_ami_list).to receive(:validate!)
118
+ expect(knife_ec2_ami_list.ui).to receive(:warn).with("No region was specified in knife.rb or as an argument. The default region, us-east-1, will be used:")
119
+ knife_ec2_ami_list.run
120
+ end
121
+ end
122
+
123
+ context 'when --owner is passed' do
124
+ before do
125
+ allow(knife_ec2_ami_list.ui).to receive(:warn)
126
+ allow(knife_ec2_ami_list).to receive(:custom_warnings!)
127
+ knife_ec2_ami_list.config[:use_iam_profile] = true
128
+ end
129
+
130
+ context 'When value for owner is nil' do
131
+ it 'shows the available AMIs List' do
132
+ knife_ec2_ami_list.config[:owner] = nil
133
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
134
+ expect(knife_ec2_ami_list).to receive(:validate!)
135
+ images = ec2_connection.describe_images.body['imagesSet']
136
+ output_column = ["AMI ID", "Platform", "Architecture", "Size", "Name"]
137
+ output_column_count = output_column.length
138
+ images.each do |image|
139
+ output_column << image["imageId"].to_s
140
+ output_column << (image["platform"] ? image["platform"] : image["name"].split(/\W+/).first)
141
+ output_column << image["architecture"].to_s
142
+ output_column << image["blockDeviceMapping"].first["volumeSize"].to_s
143
+ output_column << image["name"].split(/\W+/).first
144
+ end
145
+ expect(knife_ec2_ami_list.ui).to receive(:list).with(output_column,:uneven_columns_across, output_column_count)
146
+ knife_ec2_ami_list.run
147
+ end
148
+ end
149
+
150
+ context 'When value for owner is self' do
151
+ it 'does not raise any error' do
152
+ knife_ec2_ami_list.config[:owner] = 'self'
153
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
154
+ expect{ knife_ec2_ami_list.validate! }.not_to raise_error
155
+ end
156
+ end
157
+
158
+ context 'When value for owner is microsoft' do
159
+ it 'does not raise any error' do
160
+ knife_ec2_ami_list.config[:owner] = 'microsoft'
161
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
162
+ expect{ knife_ec2_ami_list.validate! }.not_to raise_error
163
+ end
164
+ end
165
+
166
+ context 'When value for owner is aws-marketplace' do
167
+ it 'does not raise any error' do
168
+ knife_ec2_ami_list.config[:owner] = 'aws-marketplace'
169
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
170
+ expect{ knife_ec2_ami_list.validate! }.not_to raise_error
171
+ end
172
+ end
173
+
174
+ context 'When owner is invalid' do
175
+ it 'raises error' do
176
+ knife_ec2_ami_list.config[:owner] = 'xyz'
177
+ knife_ec2_ami_list.config[:use_iam_profile] = true
178
+ expect{ knife_ec2_ami_list.validate! }.to raise_error "Invalid owner: #{knife_ec2_ami_list.config[:owner]}. Allowed owners are self, aws-marketplace or microsoft."
179
+ end
180
+ end
181
+ end
182
+
183
+ context 'when --platform is passed' do
184
+ before do
185
+ allow(knife_ec2_ami_list.ui).to receive(:warn)
186
+ allow(knife_ec2_ami_list).to receive(:custom_warnings!)
187
+ end
188
+
189
+ context 'When platform is nil' do
190
+ it 'shows all the AMIs List' do
191
+ knife_ec2_ami_list.config[:platform] = nil
192
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
193
+ images = ec2_connection.describe_images.body['imagesSet']
194
+ expect(knife_ec2_ami_list).to receive(:validate!)
195
+ output_column = ["AMI ID", "Platform", "Architecture", "Size", "Name"]
196
+ output_column_count = output_column.length
197
+ images.each do |image|
198
+ output_column << image["imageId"].to_s
199
+ output_column << (image["platform"] ? image["platform"] : image["name"].split(/\W+/).first)
200
+ output_column << image["architecture"].to_s
201
+ output_column << image["blockDeviceMapping"].first["volumeSize"].to_s
202
+ output_column << image["name"].split(/\W+/).first
203
+ end
204
+ expect(knife_ec2_ami_list.ui).to receive(:list).with(output_column,:uneven_columns_across, output_column_count)
205
+ knife_ec2_ami_list.run
206
+ end
207
+ end
208
+
209
+ context 'When platform is windows' do
210
+ it 'shows only windows AMIs List' do
211
+ knife_ec2_ami_list.config[:platform] = 'windows'
212
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
213
+ window_image = ec2_connection.describe_images.body['imagesSet'].first
214
+ expect(knife_ec2_ami_list).to receive(:validate!)
215
+ output_column = ["AMI ID", "Platform", "Architecture", "Size", "Name"]
216
+ output_column_count = output_column.length
217
+ output_column << window_image["imageId"]
218
+ output_column << window_image["platform"]
219
+ output_column << window_image["architecture"]
220
+ output_column << window_image["blockDeviceMapping"].first["volumeSize"].to_s
221
+ output_column << window_image["name"].split(/\W+/).first
222
+ expect(knife_ec2_ami_list.ui).to receive(:list).with(output_column,:uneven_columns_across, output_column_count)
223
+ knife_ec2_ami_list.run
224
+ end
225
+ end
226
+
227
+ context 'When platform is ubuntu' do
228
+ it 'shows only ubuntu AMIs List' do
229
+ knife_ec2_ami_list.config[:platform] = 'ubuntu'
230
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
231
+ ubuntu_image = ec2_connection.describe_images.body['imagesSet'][1]
232
+ expect(knife_ec2_ami_list).to receive(:validate!)
233
+ output_column = ["AMI ID", "Platform", "Architecture", "Size", "Name"]
234
+ output_column_count = output_column.length
235
+ output_column << ubuntu_image["imageId"]
236
+ output_column << ubuntu_image["name"].split(/\W+/).first
237
+ output_column << ubuntu_image["architecture"]
238
+ output_column << ubuntu_image["blockDeviceMapping"].first["volumeSize"].to_s
239
+ output_column << ubuntu_image["name"].split(/\W+/).first
240
+ expect(knife_ec2_ami_list.ui).to receive(:list).with(output_column,:uneven_columns_across, output_column_count)
241
+ knife_ec2_ami_list.run
242
+ end
243
+ end
244
+
245
+ context 'When platform is fedora' do
246
+ it 'shows only fedora AMIs List' do
247
+ knife_ec2_ami_list.config[:platform] = 'fedora'
248
+ allow(ec2_connection).to receive(:describe_images).and_return(@describe_images_format)
249
+ expect(knife_ec2_ami_list).to receive(:validate!)
250
+ fedora_image = ec2_connection.describe_images.body['imagesSet'].last
251
+ output_column = ["AMI ID", "Platform", "Architecture", "Size", "Name"]
252
+ output_column_count = output_column.length
253
+ output_column << fedora_image["imageId"]
254
+ output_column << fedora_image["name"].split(/\W+/).first
255
+ output_column << fedora_image["architecture"]
256
+ output_column << fedora_image["blockDeviceMapping"].first["volumeSize"].to_s
257
+ output_column << fedora_image["name"].split(/\W+/).first
258
+ expect(knife_ec2_ami_list.ui).to receive(:list).with(output_column,:uneven_columns_across, output_column_count)
259
+ knife_ec2_ami_list.run
260
+ end
261
+ end
262
+
263
+ context 'When platform is invalid' do
264
+ it 'raises error' do
265
+ knife_ec2_ami_list.config[:platform] = 'xyz'
266
+ knife_ec2_ami_list.config[:use_iam_profile] = true
267
+ knife_ec2_ami_list.config[:owner] = true
268
+ expect{ knife_ec2_ami_list.validate! }.to raise_error "Invalid platform: #{knife_ec2_ami_list.config[:platform]}. Allowed platforms are: ubuntu, debian, centos, fedora, rhel, nginx, turnkey, jumpbox, coreos, cisco, amazon, nessus."
269
+ end
270
+ end
271
+ end
272
+ end
273
+ end
@@ -48,6 +48,8 @@ describe Chef::Knife::Ec2ServerCreate do
48
48
  :private_ip_address => '10.251.75.20',
49
49
  :root_device_type => 'not_ebs' } }
50
50
 
51
+ let (:server) { double(:id => "i-123" ) }
52
+
51
53
  let(:spot_request_attribs) { { :id => 'test_spot_request_id',
52
54
  :price => 0.001,
53
55
  :request_type => 'persistent',
@@ -630,6 +632,7 @@ describe Chef::Knife::Ec2ServerCreate do
630
632
 
631
633
  describe "when configuring the bootstrap process" do
632
634
  before do
635
+ allow(knife_ec2_create).to receive(:evaluate_node_name).and_return('blarf')
633
636
  knife_ec2_create.config[:ssh_user] = "ubuntu"
634
637
  knife_ec2_create.config[:identity_file] = "~/.ssh/aws-key.pem"
635
638
  knife_ec2_create.config[:ssh_port] = 22
@@ -740,6 +743,7 @@ describe Chef::Knife::Ec2ServerCreate do
740
743
  describe "when configuring the winrm bootstrap process for windows" do
741
744
  before do
742
745
  allow(knife_ec2_create).to receive(:fetch_server_fqdn).and_return("SERVERNAME")
746
+ allow(knife_ec2_create).to receive(:evaluate_node_name).and_return(server)
743
747
  knife_ec2_create.config[:winrm_user] = "Administrator"
744
748
  knife_ec2_create.config[:winrm_password] = "password"
745
749
  knife_ec2_create.config[:winrm_port] = 12345
@@ -1379,15 +1383,39 @@ describe Chef::Knife::Ec2ServerCreate do
1379
1383
 
1380
1384
  end
1381
1385
 
1386
+ describe "#subnet_public_ip_on_launch?" do
1387
+ before do
1388
+ allow(new_ec2_server).to receive_messages(:subnet_id => 'subnet-1a2b3c4d')
1389
+ allow(knife_ec2_create).to receive_messages(:server => new_ec2_server)
1390
+ allow(Fog::Compute::AWS).to receive(:new).and_return(ec2_connection)
1391
+ end
1392
+
1393
+ context "when auto_assign_public_ip is enabled" do
1394
+ it "returns true" do
1395
+ allow(ec2_connection).to receive_message_chain(:subnets, :get).and_return double( :map_public_ip_on_launch => true )
1396
+ expect(knife_ec2_create.subnet_public_ip_on_launch?).to eq(true)
1397
+ end
1398
+ end
1399
+
1400
+ context "when auto_assign_public_ip is disabled" do
1401
+ it "returns false" do
1402
+ allow(ec2_connection).to receive_message_chain(:subnets, :get).and_return double( :map_public_ip_on_launch => false )
1403
+ expect(knife_ec2_create.subnet_public_ip_on_launch?).to eq(false)
1404
+ end
1405
+ end
1406
+ end
1407
+
1382
1408
  describe "ssh_connect_host" do
1383
1409
  before(:each) do
1384
1410
  allow(new_ec2_server).to receive_messages(
1385
1411
  :dns_name => 'public.example.org',
1386
1412
  :private_ip_address => '192.168.1.100',
1387
1413
  :custom => 'custom',
1388
- :public_ip_address => '111.111.111.111'
1414
+ :public_ip_address => '111.111.111.111',
1415
+ :subnet_id => 'subnet-1a2b3c4d'
1389
1416
  )
1390
1417
  allow(knife_ec2_create).to receive_messages(:server => new_ec2_server)
1418
+ allow(Fog::Compute::AWS).to receive(:new).and_return(ec2_connection)
1391
1419
  end
1392
1420
 
1393
1421
  describe "by default" do
@@ -1408,9 +1436,18 @@ describe Chef::Knife::Ec2ServerCreate do
1408
1436
  allow(knife_ec2_create).to receive_messages(:vpc_mode? => true)
1409
1437
  end
1410
1438
 
1439
+ context "subnet_public_ip_on_launch? is true" do
1440
+ it "uses the dns_name or public_ip_address" do
1441
+ allow(ec2_connection).to receive_message_chain(:subnets, :get).and_return double( :map_public_ip_on_launch => true )
1442
+ expect(knife_ec2_create.subnet_public_ip_on_launch?).to eq(true)
1443
+ expect(knife_ec2_create.ssh_connect_host).to eq('public.example.org')
1444
+ end
1445
+ end
1446
+
1411
1447
  context "--associate-public-ip is specified" do
1412
1448
  it "uses the dns_name or public_ip_address" do
1413
1449
  knife_ec2_create.config[:associate_public_ip] = true
1450
+ allow(ec2_connection).to receive_message_chain(:subnets, :get).and_return double( :map_public_ip_on_launch => false )
1414
1451
  expect(knife_ec2_create.ssh_connect_host).to eq('public.example.org')
1415
1452
  end
1416
1453
  end
@@ -1418,12 +1455,14 @@ describe Chef::Knife::Ec2ServerCreate do
1418
1455
  context "--associate-eip is specified" do
1419
1456
  it "uses the dns_name or public_ip_address" do
1420
1457
  knife_ec2_create.config[:associate_eip] = '111.111.111.111'
1458
+ allow(ec2_connection).to receive_message_chain(:subnets, :get).and_return double( :map_public_ip_on_launch => false )
1421
1459
  expect(knife_ec2_create.ssh_connect_host).to eq('public.example.org')
1422
1460
  end
1423
1461
  end
1424
1462
 
1425
1463
  context "with no other ip flags" do
1426
1464
  it 'uses private_ip_address' do
1465
+ allow(ec2_connection).to receive_message_chain(:subnets, :get).and_return double( :map_public_ip_on_launch => false )
1427
1466
  expect(knife_ec2_create.ssh_connect_host).to eq('192.168.1.100')
1428
1467
  end
1429
1468
  end
@@ -1546,6 +1585,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1546
1585
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1547
1586
  }
1548
1587
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1588
+ If (-Not $vm_name) {
1589
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1590
+ }
1549
1591
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1550
1592
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1551
1593
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1575,6 +1617,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1575
1617
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1576
1618
  }
1577
1619
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1620
+ If (-Not $vm_name) {
1621
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1622
+ }
1578
1623
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1579
1624
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1580
1625
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1632,6 +1677,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1632
1677
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1633
1678
  }
1634
1679
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1680
+ If (-Not $vm_name) {
1681
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1682
+ }
1635
1683
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1636
1684
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1637
1685
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1696,6 +1744,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1696
1744
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1697
1745
  }
1698
1746
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1747
+ If (-Not $vm_name) {
1748
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1749
+ }
1699
1750
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1700
1751
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1701
1752
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1743,6 +1794,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1743
1794
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1744
1795
  }
1745
1796
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1797
+ If (-Not $vm_name) {
1798
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1799
+ }
1746
1800
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1747
1801
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1748
1802
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1783,6 +1837,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1783
1837
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1784
1838
  }
1785
1839
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1840
+ If (-Not $vm_name) {
1841
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1842
+ }
1786
1843
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1787
1844
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1788
1845
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1805,6 +1862,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1805
1862
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1806
1863
  }
1807
1864
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1865
+ If (-Not $vm_name) {
1866
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1867
+ }
1808
1868
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1809
1869
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1810
1870
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1889,6 +1949,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1889
1949
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1890
1950
  }
1891
1951
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1952
+ If (-Not $vm_name) {
1953
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1954
+ }
1892
1955
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1893
1956
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1894
1957
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -1930,6 +1993,9 @@ If (winrm e winrm/config/listener | Select-String -Pattern " Transport = HTTP\\b
1930
1993
  winrm delete winrm/config/listener?Address=*+Transport=HTTP
1931
1994
  }
1932
1995
  $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/public-ipv4
1996
+ If (-Not $vm_name) {
1997
+ $vm_name = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/local-ipv4
1998
+ }
1933
1999
  New-SelfSignedCertificate -certstorelocation cert:\\localmachine\\my -dnsname $vm_name
1934
2000
  $thumbprint = (Get-ChildItem -Path cert:\\localmachine\\my | Where-Object {$_.Subject -match "$vm_name"}).Thumbprint;
1935
2001
  $create_listener_cmd = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname=`"$vm_name`";CertificateThumbprint=`"$thumbprint`"}'"
@@ -2245,4 +2311,23 @@ netstat > c:\\netstat_data.txt
2245
2311
  end
2246
2312
  end
2247
2313
  end
2314
+
2315
+ describe 'evaluate_node_name' do
2316
+ before do
2317
+ knife_ec2_create.instance_variable_set(:@server, server)
2318
+ end
2319
+
2320
+ context 'when ec2 server attributes are not passed in node name' do
2321
+ it 'returns the node name unchanged' do
2322
+ expect(knife_ec2_create.evaluate_node_name("Test")).to eq("Test")
2323
+ end
2324
+ end
2325
+
2326
+ context 'when %s is passed in the node name' do
2327
+ it 'returns evaluated node name' do
2328
+ expect(knife_ec2_create.evaluate_node_name("Test-%s")).to eq("Test-i-123")
2329
+ end
2330
+ end
2331
+ end
2332
+
2248
2333
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-ec2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Jacob
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-12-02 00:00:00.000000000 Z
12
+ date: 2017-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog-aws
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '0.7'
20
+ version: '1.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '0.7'
27
+ version: '1.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: mime-types
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -135,6 +135,7 @@ files:
135
135
  - RELEASE_NOTES.md
136
136
  - Rakefile
137
137
  - knife-ec2.gemspec
138
+ - lib/chef/knife/ec2_ami_list.rb
138
139
  - lib/chef/knife/ec2_base.rb
139
140
  - lib/chef/knife/ec2_flavor_list.rb
140
141
  - lib/chef/knife/ec2_server_create.rb
@@ -143,6 +144,7 @@ files:
143
144
  - lib/chef/knife/s3_source.rb
144
145
  - lib/knife-ec2/version.rb
145
146
  - spec/spec_helper.rb
147
+ - spec/unit/ec2_ami_list_spec.rb
146
148
  - spec/unit/ec2_flavor_list_spec.rb
147
149
  - spec/unit/ec2_server_create_spec.rb
148
150
  - spec/unit/ec2_server_delete_spec.rb
@@ -169,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
171
  version: '0'
170
172
  requirements: []
171
173
  rubyforge_project:
172
- rubygems_version: 2.6.7
174
+ rubygems_version: 2.6.10
173
175
  signing_key:
174
176
  specification_version: 4
175
177
  summary: EC2 Support for Chef's Knife Command