knife-rackspace 0.10.0 → 0.10.1.pre.alpha.pre.217

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5ede86e1bc5bacb0c7290a6dfd95e7cccbb21f97
4
- data.tar.gz: bdfcdfbfbca892b07090a26a3cc9f126813bd601
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ N2Q4MjBjOGFiZWNmMjVkMjM2MzJiMzE2OTFmZWEzYWM3NzMzZDQzZQ==
5
+ data.tar.gz: !binary |-
6
+ NzIwOWExNGQzMGZiZTFlMjg3YmFiYTM3NWY0YmU0N2JhYWYxYmU4Yw==
5
7
  SHA512:
6
- metadata.gz: bef3b8c302354dbaeea7d5df24b9edf743684a733d4658cac11539332b69f3377ca69eb0c8fd5fbc85ea959994a553946a80422329c085eb3bfe4eefeba294a4
7
- data.tar.gz: 11909f2b2796829132da6ab7fcd9a4eff906761f758bcd735b479a6faf6031fd7671fc14061ca3a2f8346dfb78d25395a8a8636160427a7b971a30f7444048b0
8
+ metadata.gz: !binary |-
9
+ YWZhMjE4ZGYyOTZjZDczMjllMWVlNjhmNzc1YWNlN2ZmN2ExYmNkYmU0YTM2
10
+ NGE5ZTM0OTA2ZmQ2ZWU2ZmFhZTYwOWU4NzFkNDczNjRjNjNiNjJjNmFiNWVi
11
+ MTE0MDU5YjBhZDM0YmNiNzBlNzllYWQ3MTYxNTU4MDM5NDY5NzQ=
12
+ data.tar.gz: !binary |-
13
+ MDI1MDVhODkzOGZmOWRjNGM0MjU4NDlmZDhkYjI0MjVjMjdhNGEzYmE1ZmE0
14
+ MDE0NTRiMWVjNGQ5MDMxMzcxYWFkZDRjODUzMGRmZGQ4ZDcxNDY2Y2IzOGVl
15
+ ODk3YWViODZhYmE5ZjAyNWM3MjVmNjliNzUwMGIwMmQ1ZWMzNWY=
data/.travis.yml CHANGED
@@ -1,27 +1,46 @@
1
- ---
2
1
  language: ruby
3
2
  rvm:
4
- - 2.0.0
5
- - 1.9.3
3
+ - 2.2
4
+ - 2.1
5
+ - 2.0.0
6
6
  env:
7
7
  global:
8
- - secure: ! 'eEsikE/p2yz7/cFvCN/NOoljxBqjzsTWnKC7iZ+fEGGsyhKVJgWn4AasBusZ
9
-
10
- mhtQcOqwakRulzVc+EZN4pqWHgaMC7SnSwhqRU5u1E+BPI4iWNsu+7rjiXhE
11
-
12
- cJK1vE8YodgsgRDQ6evZVQLkwJpRk0qq2tM2LDqpzvy2MeQJIGc='
13
- - secure: ! 'V3ohIIF3I8lD05zTUs2nu+CcIzBYcvt1c1euRJ+SPcAH493b4cPquw1NZNFy
14
-
15
- WDIW+1qDQi1DXr8C3Yq8bL4+pY66SukHtxyLhx0V26lGUvI8naq3IqageBQK
16
-
17
- pkb2zZwVYO0a5mLEKOI/7omExBVHDxxX9Bw45vCHLKId3Wt21HE='
18
- - secure: ! 'OyKQU1muVBijz2/EkLUgBWbwPKG2UqRhIfpB1ZFkfdQ/06+Vaf82ZEQk3DvY
19
-
20
- 2lYFrzvSN1yWrKTMU3XES/dPlVlH87LDOrRhNhgW/NeHhC5BzdwrtvBm08RN
21
-
22
- 64ACuFG8fch9zIbx2VTkyLV8xsFXPPSaKMbEXrnikLwqnl5M8PQ='
23
- - secure: ! 'DoDVG0HwFg2a7Fj72tlxb8KJto+cBEh7J9YQZ35hK2cmeTsBAcZ4oSOUeAFg
24
-
25
- s2MvBhX0man0zjYPStbL1vcpuS1Ecea3kGzefG0lYhHAzvK7wqqRqhKNFsnd
26
-
27
- FPEVgZrcj3/Lc7mlkbigZouDM7BJLQbMGOv/KOS6f3nYzIhkOfE='
8
+ - excon_debug: true
9
+ - secure: |-
10
+ eEsikE/p2yz7/cFvCN/NOoljxBqjzsTWnKC7iZ+fEGGsyhKVJgWn4AasBusZ
11
+ mhtQcOqwakRulzVc+EZN4pqWHgaMC7SnSwhqRU5u1E+BPI4iWNsu+7rjiXhE
12
+ cJK1vE8YodgsgRDQ6evZVQLkwJpRk0qq2tM2LDqpzvy2MeQJIGc=
13
+ - secure: |-
14
+ V3ohIIF3I8lD05zTUs2nu+CcIzBYcvt1c1euRJ+SPcAH493b4cPquw1NZNFy
15
+ WDIW+1qDQi1DXr8C3Yq8bL4+pY66SukHtxyLhx0V26lGUvI8naq3IqageBQK
16
+ pkb2zZwVYO0a5mLEKOI/7omExBVHDxxX9Bw45vCHLKId3Wt21HE=
17
+ - secure: |-
18
+ OyKQU1muVBijz2/EkLUgBWbwPKG2UqRhIfpB1ZFkfdQ/06+Vaf82ZEQk3DvY
19
+ 2lYFrzvSN1yWrKTMU3XES/dPlVlH87LDOrRhNhgW/NeHhC5BzdwrtvBm08RN
20
+ 64ACuFG8fch9zIbx2VTkyLV8xsFXPPSaKMbEXrnikLwqnl5M8PQ=
21
+ - secure: |-
22
+ DoDVG0HwFg2a7Fj72tlxb8KJto+cBEh7J9YQZ35hK2cmeTsBAcZ4oSOUeAFg
23
+ s2MvBhX0man0zjYPStbL1vcpuS1Ecea3kGzefG0lYhHAzvK7wqqRqhKNFsnd
24
+ FPEVgZrcj3/Lc7mlkbigZouDM7BJLQbMGOv/KOS6f3nYzIhkOfE=
25
+ - secure: |-
26
+ SB4aoB5BCqqSFMpxJvN031tikc7VzXGX6PaOIngu5h3M9k3Qmkuvel8oQISb
27
+ fhcbsmuA0EKlaCvjQsgXFoUvUE6UnPCc7h2816fEAEz7FrRF1Q1mnbZ2V/kG
28
+ PtPYcPl4ZH4VxwAD+6kTtbl1aCTP8nKXTFXlKlrPAawpS7ef0B8=
29
+ - secure: |-
30
+ J01xNjFaqlwzin59fpvgKkp49p5VI128cFvM3pxvlErPLnjWE9kJ4NKzzznv
31
+ tVc12zVat/twxepvjSzg88b0q4Ks6P0Ovy0LeQCFUkva/jiBQuGukByR3joU
32
+ xuAFiCssBoaZEEKlN69n/zhihFxG/0z8Tn4h9pgAkSAyAq8UZJ0=
33
+ - secure: |-
34
+ W7NIurlDI/LtO27N5Yv9i2i/TLvwSL6L5bF0yJMtPNsL21xbcqBkcFY+0PEU
35
+ 2jIzA6Ib861UACb9Xh45tXmY/zuUHQ/otuIdAwocawulxBjrTuNUDo58ZVEv
36
+ GzvTdFIaOWczTTvBcaNy9msenXiRBQTWriMFR0uPKIH/mYGF3Ew=
37
+ - secure: |-
38
+ RQDTTLjob/9p+9XpcpYo4VaQSVvVbbHtUcpVyTXcnHwMq3WJzXXBoj/9iFxA
39
+ Uupx9IhP0gZhX6kzcm5BG+oKTYAxTQkf2tRCRkVMBFCJKreER1SuSDVvljdV
40
+ KLMfTbC5qwXox78PtD23BjO5k8hCJCSHfs0XuQ5y7k1mMFjM4ok=
41
+ deploy:
42
+ provider: rubygems
43
+ api_key:
44
+ secure: YeHeF7cuLuN3lHJQNQ4jpgfhaHGuB861cF6dzoyGPzAi/PO3wmTZfDNG27iI3zCe3CPviDSPiK4v14SQA1Xq3UtvSmeE+zcX/PxYsjNp7EQPn8J6fq2DfjmhYU5ECXnojbTkoh2HIM29YXBjxS8VlSTFDHYx0oV6uMZFgrzSLrI=
45
+ on:
46
+ tags: true
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## v0.10.1
2
+ * Support new chef-vault bootrap flags (--bootstrap-vault-file, -bootstrap-vault-json, and --bootstrap-vault-item)
3
+
1
4
  ## v0.10.0
2
5
  * KNIFE-498 knife rackspace uses direct TCP connection on port 22 to verify SSHD
3
6
  * Update Windows bootstrapping instructions in the README
data/Gemfile CHANGED
@@ -1,8 +1,3 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- group :development, :test do
4
- gem "knife-dsl", :git => 'git://github.com/maxlinc/knife-dsl.git', :branch => 'io_capture_fix'
5
- end
6
-
7
- # Specify your gem's dependencies in knife-rackspace.gemspec
8
3
  gemspec
data/README.rdoc CHANGED
@@ -1,5 +1,7 @@
1
1
  = Knife Rackspace
2
2
 
3
+ {<img src="https://travis-ci.org/chef/knife-rackspace.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/chef/knife-rackspace]
4
+
3
5
  = DESCRIPTION:
4
6
 
5
7
  This is the official Opscode Knife plugin for Rackspace Cloud Servers. This plugin gives knife the ability to create, bootstrap, and manage servers on all the regions for Rackspace Cloud Servers.
@@ -136,12 +138,78 @@ Creates a new cloud network. Both the label and the CIDR are required parameters
136
138
 
137
139
  Deletes one or more specified networks by id. The network must be detached from all hosts before it is deleted.
138
140
 
141
+
142
+ == Knife & Rackspace Rackconnect
143
+
144
+ Rackspace Rackconnect allows the creation of a hybrid setup where you can have Cloud servers which are connected to bare metal hardware like Firewalls and Load balancers. You can read more about this product at http://www.rackspace.com/cloud/hybrid/rackconnect/
145
+
146
+ Under the hood, this changes the behaviour of how the cloud servers are configured and how IP addresses are assigned to them. So when using knife-rackspace with a 'Rack connected' cloud account you need use some additional parameters. See the sections below for more information regarding the two versions of Rack Connect.
147
+
148
+ Note: If you account is leveraging private cloud networks for Rackconnnect then you are using Rackconnect v3. You can also find your version of Rackconnect by checking with your support team
149
+
150
+
151
+ === Knife and Rackconnect version 2
152
+
153
+ knife rackspace server create \
154
+ --server-name <name of the server> \
155
+ --image <Rackspace image id> \
156
+ --flavor <Rackspace flavor id> \
157
+ -r 'role[base]' \
158
+ --rackconnect-wait
159
+
160
+ Note: If the server is also part of Rackspace Managed Operations service level you will need to add the <tt>--rackspace-servicelevel-wait</tt> option.
161
+
162
+ knife rackspace server create \
163
+ --server-name <name of the server> \
164
+ --image <Rackspace image id> \
165
+ --flavor <Rackspace flavor id> \
166
+ -r 'role[base]' \
167
+ --rackconnect-wait \
168
+ --rackspace-servicelevel-wait
169
+
170
+ <tt>--rackconnect-wait</tt> does the following :-
171
+
172
+ * Rackconnect version 2 changes the networking on the cloud server and forces all trafic to route via the dedicated firewall or load balancer. It also then assigns the cloud server a new public IP address. The status of this automation provided by updates to the cloud server metadata. This option makes Knife wait for the Rackconnect automation to complete by checking the metadata.
173
+
174
+ * Once the status is updated, it triggers the bootstrap process.
175
+
176
+
177
+ <tt>--rackspace-servicelevel-wait</tt> does the following :-
178
+
179
+ * For Cloud servers in the Managed operations service level, Rackspace installs additional agents and software which enables them to provide support. This automation. like the Rackconnect one, updates the cloud server metadata of its status. Likewise, using this option, makes knife wait till the automation is complete before triggering the bootstrap process.
180
+
181
+
182
+
183
+ === Knife and Rackconnect version 3
184
+
185
+ In case of version 3, there is a different command line option.
186
+
187
+ knife rackspace server create \
188
+ --server-name <name of the server> \
189
+ --image <Rackspace image id> \
190
+ --flavor <Rackspace flavor id> \
191
+ -r 'role[base]' \
192
+ --rackconnect-v3-network-id <cloud network id>
193
+
194
+
195
+ <tt>--rackconnect-v3-network-id</tt> does the following :-
196
+ * Create the server with the corresponding cloud network. The network id the id of an existing cloud network.
197
+ * Knife will then issue addtional API calls to the Rackconnect API to assign a new public IP to the cloud server. The new IP is also stored in the Cloud Server Metadata under accessv4IP.
198
+ * Knife then waits for the IP to be provisioned before triggering the bootstrap process.
199
+
200
+ Functionally, this operates the same way as version 2. However, behind the scenes, Rackconnect v3 is signifcantly different in implementation. You can learn about the differences here :
201
+ http://www.rackspace.com/knowledge_center/article/comparing-rackconnect-v30-and-rackconnect-v20
202
+
203
+
139
204
  = LICENSE:
140
205
 
141
- Author:: Adam Jacob (<adam@opscode.com>)
142
- Author:: Seth Chisamore (<schisamo@opscode.com>)
143
- Author:: Matt Ray (<matt@opscode.com>)
206
+ Author:: Adam Jacob (<adam@chef.io>)
207
+ Author:: Seth Chisamore (<schisamo@chef.io>)
208
+ Author:: Matt Ray (<matt@chef.io>)
209
+ Author:: JJ Asghar (<jj@chef.io>)
210
+ Author:: Rackspace Developers
144
211
  Copyright:: Copyright (c) 2009-2012 Opscode, Inc.
212
+ Copyright:: Copyright (c) 2013-2015 Chef Software, Inc.
145
213
  License:: Apache License, Version 2.0
146
214
 
147
215
  Licensed under the Apache License, Version 2.0 (the "License");
@@ -5,10 +5,11 @@ require "knife-rackspace/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "knife-rackspace"
7
7
  s.version = Knife::Rackspace::VERSION
8
+ s.version = "#{s.version}-alpha-#{ENV['TRAVIS_BUILD_NUMBER']}" if ENV['TRAVIS']
8
9
  s.has_rdoc = true
9
- s.authors = ["Adam Jacob","Seth Chisamore", "Matt Ray"]
10
- s.email = ["adam@opscode.com","schisamo@opscode.com", "matt@opscode.com"]
11
- s.homepage = "http://wiki.opscode.com/display/chef"
10
+ s.authors = ["Adam Jacob","Seth Chisamore", "Matt Ray","Rackspace Developers","JJ Asghar"]
11
+ s.email = ["adam@chef.io","schisamo@chef.io", "matt@chef.io","jj@chef.io"]
12
+ s.homepage = "https://docs.chef.io/plugin_knife_rackspace.html"
12
13
  s.summary = "Rackspace Support for Chef's Knife Command"
13
14
  s.description = s.summary
14
15
  s.extra_rdoc_files = ["README.rdoc", "LICENSE" ]
@@ -21,8 +22,7 @@ Gem::Specification.new do |s|
21
22
  s.add_dependency "chef", ">= 0.10.10"
22
23
  s.require_paths = ["lib"]
23
24
 
24
- # In Gemfile because I'm using a fork on Github. Hopefully pull request will be merged and a new gem will be released soon.
25
- # s.add_development_dependency "knife-dsl"
25
+ s.add_development_dependency "knife-dsl"
26
26
  s.add_development_dependency "rspec"
27
27
  s.add_development_dependency "vcr"
28
28
  s.add_development_dependency "ansi"
@@ -192,7 +192,7 @@ class Chef
192
192
  end
193
193
 
194
194
  def v1_public_ip(server)
195
- server.public_ip_address == nil ? "" : server.public_ip_address
195
+ server.public_ip_address == nil ? "" : server.public_ip_address
196
196
  end
197
197
 
198
198
  def v1_private_ip(server)
@@ -7,7 +7,7 @@ class Chef
7
7
  include Knife::RackspaceBase
8
8
 
9
9
  banner "knife rackspace network create (options)"
10
-
10
+
11
11
  option :label,
12
12
  :short => "-L LABEL",
13
13
  :long => "--label LABEL",
@@ -19,7 +19,7 @@ class Chef
19
19
  :long => "--cidr CIDR",
20
20
  :description => "CIDR for the network",
21
21
  :required => true
22
-
22
+
23
23
  def run
24
24
  if version_one?
25
25
  ui.error "Networks are not supported in v1"
@@ -7,7 +7,7 @@ class Chef
7
7
  include Knife::RackspaceBase
8
8
 
9
9
  banner "knife rackspace network delete NETWORK_ID [NETWORK_ID] (options)"
10
-
10
+
11
11
  def run
12
12
  if version_one?
13
13
  ui.error "Networks are not supported in v1"
@@ -22,7 +22,7 @@ class Chef
22
22
  msg_pair("Network ID", network.id)
23
23
  msg_pair("Label", network.label)
24
24
  msg_pair("CIDR", network.cidr)
25
-
25
+
26
26
  puts "\n"
27
27
  confirm("Do you really want to delete this network")
28
28
 
@@ -107,7 +107,7 @@ class Chef
107
107
  :description => "The version of Chef to install",
108
108
  :proc => Proc.new { |v| Chef::Config[:knife][:bootstrap_version] = v }
109
109
 
110
- option :distro,
110
+ option :distro,
111
111
  :short => "-d DISTRO",
112
112
  :long => "--distro DISTRO",
113
113
  :description => "Bootstrap a distro using a template; default is 'chef-full'",
@@ -146,6 +146,12 @@ class Chef
146
146
  :boolean => true,
147
147
  :default => false
148
148
 
149
+ option :rackconnect_v3_network_id,
150
+ :long => '--rackconnect-v3-network-id ID',
151
+ :description => 'Rackconnect V3 ONLY: Link a new server to an existing network',
152
+ :proc => lambda { |o| Chef::Config[:knife][:rackconnect_v3_network_id] = o },
153
+ :default => nil
154
+
149
155
  option :rackspace_servicelevel_wait,
150
156
  :long => "--rackspace-servicelevel-wait",
151
157
  :description => "Wait until the Rackspace service level automation setup is complete before bootstrapping chef",
@@ -156,9 +162,9 @@ class Chef
156
162
  :long => "--hint HINT_NAME[=HINT_FILE]",
157
163
  :description => "Specify Ohai Hint to be set on the bootstrap target. Use multiple --hint options to specify multiple hints.",
158
164
  :proc => Proc.new { |h|
159
- Chef::Config[:knife][:hints] ||= {}
160
- name, path = h.split("=")
161
- Chef::Config[:knife][:hints][name] = path ? JSON.parse(::File.read(path)) : Hash.new
165
+ Chef::Config[:knife][:hints] ||= {}
166
+ name, path = h.split("=")
167
+ Chef::Config[:knife][:hints][name] = path ? JSON.parse(::File.read(path)) : Hash.new
162
168
  }
163
169
 
164
170
  option :host_key_verify,
@@ -178,6 +184,16 @@ class Chef
178
184
  :description => "The ssh wait timeout, before attempting ssh",
179
185
  :default => "0"
180
186
 
187
+ option :retry_ssh_every,
188
+ :long => "--retry-ssh-every TIMEOUT",
189
+ :description => "Retry SSH after n seconds (retry each period)",
190
+ :default => "5"
191
+
192
+ option :retry_ssh_limit,
193
+ :long => "--retry-ssh-limit COUNT",
194
+ :description => "Retry SSH at most this number of times",
195
+ :default => "5"
196
+
181
197
  option :default_networks,
182
198
  :long => "--[no-]default-networks",
183
199
  :description => "Include public and service networks, enabled by default",
@@ -236,6 +252,25 @@ class Chef
236
252
  :description => "A file containing the secret key to use to encrypt data bag item values",
237
253
  :proc => Proc.new { |sf| Chef::Config[:knife][:secret_file] = sf }
238
254
 
255
+ option :bootstrap_vault_file,
256
+ :long => '--bootstrap-vault-file VAULT_FILE',
257
+ :description => 'A JSON file with a list of vault(s) and item(s) to be updated'
258
+
259
+ option :bootstrap_vault_json,
260
+ :long => '--bootstrap-vault-json VAULT_JSON',
261
+ :description => 'A JSON string with the vault(s) and item(s) to be updated'
262
+
263
+ option :bootstrap_vault_item,
264
+ :long => '--bootstrap-vault-item VAULT_ITEM',
265
+ :description => 'A single vault and item to update as "vault:item"',
266
+ :proc => Proc.new { |i|
267
+ (vault, item) = i.split(/:/)
268
+ Chef::Config[:knife][:bootstrap_vault_item] ||= {}
269
+ Chef::Config[:knife][:bootstrap_vault_item][vault] ||= []
270
+ Chef::Config[:knife][:bootstrap_vault_item][vault].push(item)
271
+ Chef::Config[:knife][:bootstrap_vault_item]
272
+ }
273
+
239
274
  def load_winrm_deps
240
275
  require 'winrm'
241
276
  require 'em-winrm'
@@ -244,37 +279,31 @@ class Chef
244
279
  require 'chef/knife/winrm'
245
280
  end
246
281
 
247
- def tcp_test_ssh(hostname)
248
- sleep config[:ssh_wait_timeout].to_i
282
+ def tcp_test_ssh(server, bootstrap_ip)
283
+ return true unless config[:tcp_test_ssh] != nil
249
284
 
250
- # if this feature is disabled, just return true to skip it
251
- return true if not config[:tcp_test_ssh]
285
+ limit = Chef::Config[:knife][:retry_ssh_limit].to_i
286
+ count = 0
252
287
 
253
- ssh_port = Chef::Config[:knife][:ssh_port] || config[:ssh_port]
254
- tcp_socket = TCPSocket.new(hostname, ssh_port)
255
- readable = IO.select([tcp_socket], nil, nil, 5)
256
- if readable
257
- Chef::Log.debug("sshd accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
258
- yield
259
- true
260
- else
261
- false
288
+ begin
289
+ Net::SSH.start(bootstrap_ip, 'root', :password => server.password ) do |ssh|
290
+ Chef::Log.debug("sshd accepting connections on #{bootstrap_ip}")
291
+ break
292
+ end
293
+ rescue
294
+ count += 1
295
+
296
+ if count <= limit
297
+ print '.'
298
+ sleep config[:retry_ssh_every].to_i
299
+ tcp_test_ssh(server, bootstrap_ip)
300
+ else
301
+ ui.error "Unable to SSH into #{bootstrap_ip}"
302
+ exit 1
303
+ end
262
304
  end
263
- rescue Errno::ETIMEDOUT
264
- false
265
- rescue Errno::EPERM
266
- false
267
- rescue Errno::ECONNREFUSED
268
- sleep 2
269
- false
270
- rescue Errno::EHOSTUNREACH
271
- sleep 2
272
- false
273
- ensure
274
- tcp_socket && tcp_socket.close
275
305
  end
276
306
 
277
-
278
307
  def parse_file_argument(arg)
279
308
  dest, src = arg.split('=')
280
309
  unless dest && src
@@ -306,9 +335,9 @@ class Chef
306
335
  :path => dest,
307
336
  :contents => encode_file(src)
308
337
  }
338
+ end
339
+ files
309
340
  end
310
- files
311
- end
312
341
 
313
342
 
314
343
 
@@ -333,7 +362,6 @@ class Chef
333
362
  false
334
363
  end
335
364
 
336
-
337
365
  def run
338
366
  $stdout.sync = true
339
367
 
@@ -349,22 +377,22 @@ class Chef
349
377
  load_winrm_deps
350
378
  end
351
379
 
352
- node_name = get_node_name(config[:chef_node_name] || config[:server_name])
353
- networks = get_networks(Chef::Config[:knife][:rackspace_networks])
354
-
355
- rackconnect_wait = Chef::Config[:knife][:rackconnect_wait] || config[:rackconnect_wait]
380
+ rackconnect_wait = Chef::Config[:knife][:rackconnect_wait] || config[:rackconnect_wait]
381
+ rackconnect3 = Chef::Config[:knife][:rackconnect_v3_network_id] || config[:rackconnect_v3_network_id]
356
382
  rackspace_servicelevel_wait = Chef::Config[:knife][:rackspace_servicelevel_wait] || config[:rackspace_servicelevel_wait]
383
+ node_name = get_node_name(config[:chef_node_name] || config[:server_name])
384
+ networks = get_networks(Chef::Config[:knife][:rackspace_networks], rackconnect3)
357
385
 
358
386
  server = connection.servers.new(
359
- :name => node_name,
360
- :image_id => Chef::Config[:knife][:image],
361
- :flavor_id => locate_config_value(:flavor),
362
- :metadata => Chef::Config[:knife][:rackspace_metadata],
363
- :disk_config => Chef::Config[:knife][:rackspace_disk_config],
364
- :user_data => user_data,
387
+ :name => node_name,
388
+ :image_id => Chef::Config[:knife][:image],
389
+ :flavor_id => locate_config_value(:flavor),
390
+ :metadata => Chef::Config[:knife][:rackspace_metadata],
391
+ :disk_config => Chef::Config[:knife][:rackspace_disk_config],
392
+ :user_data => user_data,
365
393
  :config_drive => locate_config_value(:rackspace_config_drive) || false,
366
- :personality => files,
367
- :key_name => Chef::Config[:knife][:rackspace_ssh_keypair]
394
+ :personality => files,
395
+ :key_name => Chef::Config[:knife][:rackspace_ssh_keypair]
368
396
  )
369
397
 
370
398
  if version_one?
@@ -382,14 +410,16 @@ class Chef
382
410
  msg_pair("ConfigDrive", server.config_drive)
383
411
  msg_pair("UserData", Chef::Config[:knife][:rackspace_user_data])
384
412
  msg_pair("RackConnect Wait", rackconnect_wait ? 'yes' : 'no')
413
+ msg_pair("RackConnect V3", rackconnect3 ? 'yes' : 'no')
385
414
  msg_pair("ServiceLevel Wait", rackspace_servicelevel_wait ? 'yes' : 'no')
386
415
  msg_pair("SSH Key", Chef::Config[:knife][:rackspace_ssh_keypair])
387
416
 
388
417
  # wait for it to be ready to do stuff
389
418
  begin
390
- server.wait_for(Integer(locate_config_value(:server_create_timeout))) {
391
- print ".";
419
+ server.wait_for(Integer(locate_config_value(:server_create_timeout))) {
420
+ print ".";
392
421
  Chef::Log.debug("#{progress}%")
422
+
393
423
  if rackconnect_wait and rackspace_servicelevel_wait
394
424
  Chef::Log.debug("rackconnect_automation_status: #{metadata.all['rackconnect_automation_status']}")
395
425
  Chef::Log.debug("rax_service_level_automation: #{metadata.all['rax_service_level_automation']}")
@@ -411,15 +441,26 @@ class Chef
411
441
  msg_pair('rax_service_level_automation', server.metadata.all['rax_service_level_automation'])
412
442
  Chef::Application.fatal! 'Server didn\'t finish on time'
413
443
  end
444
+
414
445
  msg_pair("Metadata", server.metadata)
415
- if(networks && Chef::Config[:knife][:rackspace_networks])
416
- msg_pair("Networks", Chef::Config[:knife][:rackspace_networks].sort.join(', '))
417
- end
418
446
 
419
447
  print "\n#{ui.color("Waiting server", :magenta)}"
420
448
 
421
449
  puts("\n")
422
450
 
451
+ if Chef::Config[:knife][:rackconnect_v3_network_id]
452
+ print "\n#{ui.color("Setting up RackconnectV3 network and IPs", :magenta)}"
453
+ setup_rackconnect_network!(server)
454
+ while server.ipv4_address == ""
455
+ server.reload
456
+ sleep 5
457
+ end
458
+ end
459
+
460
+ if networks && Chef::Config[:knife][:rackspace_networks]
461
+ msg_pair("Networks", Chef::Config[:knife][:rackspace_networks].sort.join(', '))
462
+ end
463
+
423
464
  msg_pair("Public DNS Name", public_dns_name(server))
424
465
  msg_pair("Public IP Address", ip_address(server, 'public'))
425
466
  msg_pair("Private IP Address", ip_address(server, 'private'))
@@ -427,31 +468,30 @@ class Chef
427
468
  msg_pair("Metadata", server.metadata.all)
428
469
 
429
470
  bootstrap_ip_address = ip_address(server, config[:bootstrap_network])
471
+
430
472
  Chef::Log.debug("Bootstrap IP Address #{bootstrap_ip_address}")
431
473
  if bootstrap_ip_address.nil?
432
474
  ui.error("No IP address available for bootstrapping.")
433
475
  exit 1
434
476
  end
435
477
 
436
- if locate_config_value(:bootstrap_protocol) == 'winrm'
437
- print "\n#{ui.color("Waiting for winrm", :magenta)}"
438
- print(".") until tcp_test_winrm(bootstrap_ip_address, locate_config_value(:winrm_port))
439
- bootstrap_for_windows_node(server, bootstrap_ip_address).run
440
- else
441
- print "\n#{ui.color("Waiting for sshd", :magenta)}"
442
- print(".") until tcp_test_ssh(bootstrap_ip_address) {
443
- sleep @initial_sleep_delay ||= 10
444
- puts("done")
445
- }
446
- bootstrap_for_node(server, bootstrap_ip_address).run
447
- end
478
+ if locate_config_value(:bootstrap_protocol) == 'winrm'
479
+ print "\n#{ui.color("Waiting for winrm", :magenta)}"
480
+ print(".") until tcp_test_winrm(bootstrap_ip_address, locate_config_value(:winrm_port))
481
+ bootstrap_for_windows_node(server, bootstrap_ip_address).run
482
+ else
483
+ print "\n#{ui.color("Waiting for sshd", :magenta)}"
484
+ tcp_test_ssh(server, bootstrap_ip_address)
485
+ bootstrap_for_node(server, bootstrap_ip_address).run
486
+ end
448
487
 
449
488
  puts "\n"
450
489
  msg_pair("Instance ID", server.id)
451
490
  msg_pair("Host ID", server.host_id)
452
491
  msg_pair("Name", server.name)
453
492
  msg_pair("Flavor", server.flavor.name)
454
- msg_pair("Image", server.image.name)
493
+ msg_pair("Image", server.image.name) if server.image
494
+ msg_pair("Boot Image ID", server.boot_image_id) if server.boot_image_id
455
495
  msg_pair("Metadata", server.metadata)
456
496
  msg_pair("Public DNS Name", public_dns_name(server))
457
497
  msg_pair("Public IP Address", ip_address(server, 'public'))
@@ -460,11 +500,31 @@ class Chef
460
500
  msg_pair("Environment", config[:environment] || '_default')
461
501
  msg_pair("Run List", config[:run_list].join(', '))
462
502
  end
463
-
503
+
504
+ def setup_rackconnect_network!(server)
505
+ auth_token = connection.authenticate
506
+ tenant_id = connection.endpoint_uri.path.split("/").last
507
+ region = connection.region
508
+ uri = URI("https://#{region}.rackconnect.api.rackspacecloud.com/v3/#{tenant_id}/public_ips")
509
+
510
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
511
+ begin
512
+ req = Net::HTTP::Post.new(uri.request_uri)
513
+ req['X-Auth-Token'] = auth_token
514
+ req['Content-Type'] = 'application/json'
515
+ req.body = JSON.dump("cloud_server" => { "id" => server.id })
516
+ http.use_ssl = true
517
+ http.request req
518
+ rescue StandardError => e
519
+ puts "HTTP Request failed (#{e.message})"
520
+ end
521
+ end
522
+ end
523
+
464
524
  def user_data
465
525
  file = Chef::Config[:knife][:rackspace_user_data]
466
526
  return unless file
467
-
527
+
468
528
  begin
469
529
  filename = File.expand_path(file)
470
530
  content = File.read(filename)
@@ -480,9 +540,12 @@ class Chef
480
540
  bootstrap.name_args = [bootstrap_ip_address]
481
541
  bootstrap.config[:ssh_user] = config[:ssh_user] || "root"
482
542
  bootstrap.config[:ssh_password] = server.password
483
- bootstrap.config[:ssh_port] = Chef::Config[:knife][:ssh_port] || config[:ssh_port]
543
+ bootstrap.config[:ssh_port] = config[:ssh_port] || Chef::Config[:knife][:ssh_port]
484
544
  bootstrap.config[:identity_file] = config[:identity_file]
485
545
  bootstrap.config[:host_key_verify] = config[:host_key_verify]
546
+ bootstrap.config[:bootstrap_vault_file] = config[:bootstrap_vault_file] if config[:bootstrap_vault_file]
547
+ bootstrap.config[:bootstrap_vault_json] = config[:bootstrap_vault_json] if config[:bootstrap_vault_json]
548
+ bootstrap.config[:bootstrap_vault_item] = config[:bootstrap_vault_item] if config[:bootstrap_vault_item]
486
549
  # bootstrap will run as root...sudo (by default) also messes up Ohai on CentOS boxes
487
550
  bootstrap.config[:use_sudo] = true unless config[:ssh_user] == 'root'
488
551
  bootstrap.config[:distro] = locate_config_value(:distro) || 'chef-full'
@@ -531,17 +594,21 @@ class Chef
531
594
  chef_node_name = "rs-"+rand.to_s.split('.')[1] unless version_one?
532
595
  end
533
596
 
534
- def get_networks(names)
597
+ def get_networks(names, rackconnect3=false)
535
598
  names = Array(names)
599
+
536
600
  if(Chef::Config[:knife][:rackspace_version] == 'v2')
537
- if(config[:default_networks])
601
+ if rackconnect3
602
+ nets = [Chef::Config[:knife][:rackconnect_v3_network_id]]
603
+ elsif config[:default_networks]
538
604
  nets = [
539
605
  '00000000-0000-0000-0000-000000000000',
540
606
  '11111111-1111-1111-1111-111111111111'
541
607
  ]
542
608
  else
543
- nets = []
609
+ nets = []
544
610
  end
611
+
545
612
  available_networks = connection.networks.all
546
613
 
547
614
  names.each do |name|
@@ -66,7 +66,7 @@ class Chef
66
66
  msg_pair("Host ID", server.host_id)
67
67
  msg_pair("Name", server.name)
68
68
  msg_pair("Flavor", server.flavor.name)
69
- msg_pair("Image", server.image.name)
69
+ msg_pair("Image", server.image.name) if server.image
70
70
  msg_pair("Public IP Address", ip_address(server, 'public'))
71
71
  msg_pair("Private IP Address", ip_address(server, 'private'))
72
72
 
@@ -1,6 +1,6 @@
1
1
  module Knife
2
2
  module Rackspace
3
- VERSION = '0.10.0'
3
+ VERSION = '0.10.1'
4
4
  MAJOR, MINOR, TINY = VERSION.split('.')
5
5
  end
6
6
  end
@@ -1,100 +1,100 @@
1
- require 'integration_spec_helper'
2
- require 'fog'
3
- require 'knife/dsl'
4
- require 'chef/knife/rackspace_server_create'
5
- # include Chef::Knife::DSL
6
-
7
- [:v1, :v2].each do |api|
8
- describe api do
9
- before(:each) do
10
- Chef::Config[:knife][:rackspace_version] = api.to_s #v2 by default
11
- Chef::Config[:knife][:rackspace_region] = :iad
12
-
13
- Chef::Knife::Bootstrap.any_instance.stub(:run)
14
- Chef::Knife::RackspaceServerCreate.any_instance.stub(:tcp_test_ssh).with(anything).and_return(true)
15
- end
16
-
17
- it 'should list server flavors', :vcr do
18
- stdout, stderr, status = knife_capture('rackspace flavor list')
19
- status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
20
-
21
- expected_output = {
22
- :v1 => """
23
- ID Name Architecture RAM Disk
24
- 1 256 server 64-bit 256 10 GB
25
- 2 512 server 64-bit 512 20 GB
26
- 3 1GB server 64-bit 1024 40 GB
27
- 4 2GB server 64-bit 2048 80 GB
28
- 5 4GB server 64-bit 4096 160 GB
29
- 6 8GB server 64-bit 8192 320 GB
30
- 7 15.5GB server 64-bit 15872 620 GB
31
- 8 30GB server 64-bit 30720 1200 GB
32
- """,
33
- :v2 => """
34
- ID Name VCPUs RAM Disk
35
- 2 512MB Standard Instance 1 512 20 GB
36
- 3 1GB Standard Instance 1 1024 40 GB
37
- 4 2GB Standard Instance 2 2048 80 GB
38
- 5 4GB Standard Instance 2 4096 160 GB
39
- 6 8GB Standard Instance 4 8192 320 GB
40
- 7 15GB Standard Instance 6 15360 620 GB
41
- 8 30GB Standard Instance 8 30720 1200 GB
42
- performance1-1 1 GB Performance 1 1024 20 GB
43
- performance1-2 2 GB Performance 2 2048 40 GB
44
- performance1-4 4 GB Performance 4 4096 40 GB
45
- performance1-8 8 GB Performance 8 8192 40 GB
46
- performance2-120 120 GB Performance 32 122880 40 GB
47
- performance2-15 15 GB Performance 4 15360 40 GB
48
- performance2-30 30 GB Performance 8 30720 40 GB
49
- performance2-60 60 GB Performance 16 61440 40 GB
50
- performance2-90 90 GB Performance 24 92160 40 GB
51
- """}
52
- stdout = ANSI.unansi stdout
53
- stdout.should match_output(expected_output[api])
54
- end
55
-
56
- it 'should list images', :vcr do
57
- sample_image = {
58
- :v1 => 'Ubuntu 12.04 LTS',
59
- :v2 => 'Ubuntu 12.04 LTS (Precise Pangolin)'
60
- }
61
-
62
- stdout, stderr, status = knife_capture('rackspace image list')
63
- status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
64
- stdout = clean_output(stdout)
65
- stdout.should match /^ID\s*Name\s*$/
66
- stdout.should include sample_image[api]
67
- end
68
-
69
- it 'should manage servers', :vcr do
70
- pending "The test works, but I'm in the process of cleaning up sensitive data in the cassettes"
71
-
72
- image = {
73
- :v1 => '112',
74
- :v2 => 'e4dbdba7-b2a4-4ee5-8e8f-4595b6d694ce'
75
- }
76
- flavor = 2
77
- server_list.should_not include 'test-node'
78
-
79
- args = %W{rackspace server create -I #{image[api]} -f #{flavor} -N test-node -S test-server}
80
- stdout, stderr, status = knife_capture(args)
81
- status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
82
- instance_data = capture_instance_data(stdout, {
83
- :name => 'Name',
84
- :instance_id => 'Instance ID',
85
- :public_ip => 'Public IP Address',
86
- :private_ip => 'Private IP Address'
87
- })
88
-
89
- # Wanted to assert active state, but got build during test
90
- server_list.should match /#{instance_data[:instance_id]}\s*#{instance_data[:name]}\s*#{instance_data[:public_ip]}\s*#{instance_data[:private_ip]}\s*#{flavor}\s*#{image}/
91
-
92
- args = %W{rackspace server delete #{instance_data[:instance_id]} -y}
93
- stdout, stderr, status = knife_capture(args)
94
- status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
95
-
96
- # Need to deal with deleting vs deleted states before we can check this
97
- # server_list.should_not match /#{instance_data[:instance_id]}\s*#{instance_data[:name]}\s*#{instance_data[:public_ip]}\s*#{instance_data[:private_ip]}\s*#{flavor}\s*#{image}/
98
- end
99
- end
100
- end
1
+ # require 'integration_spec_helper'
2
+ # require 'fog'
3
+ # require 'knife/dsl'
4
+ # require 'chef/knife/rackspace_server_create'
5
+ # # include Chef::Knife::DSL
6
+ #
7
+ # [:v1, :v2].each do |api|
8
+ # describe api do
9
+ # before(:each) do
10
+ # Chef::Config[:knife][:rackspace_version] = api.to_s #v2 by default
11
+ # Chef::Config[:knife][:rackspace_region] = :iad
12
+ #
13
+ # Chef::Knife::Bootstrap.any_instance.stub(:run)
14
+ # Chef::Knife::RackspaceServerCreate.any_instance.stub(:tcp_test_ssh).with(anything).and_return(true)
15
+ # end
16
+ #
17
+ # it 'should list server flavors', :vcr do
18
+ # stdout, stderr, status = knife_capture('rackspace flavor list')
19
+ # status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
20
+ #
21
+ # expected_output = {
22
+ # :v1 => """
23
+ # ID Name Architecture RAM Disk
24
+ # 1 256 server 64-bit 256 10 GB
25
+ # 2 512 server 64-bit 512 20 GB
26
+ # 3 1GB server 64-bit 1024 40 GB
27
+ # 4 2GB server 64-bit 2048 80 GB
28
+ # 5 4GB server 64-bit 4096 160 GB
29
+ # 6 8GB server 64-bit 8192 320 GB
30
+ # 7 15.5GB server 64-bit 15872 620 GB
31
+ # 8 30GB server 64-bit 30720 1200 GB
32
+ # """,
33
+ # :v2 => """
34
+ # ID Name VCPUs RAM Disk
35
+ # 2 512MB Standard Instance 1 512 20 GB
36
+ # 3 1GB Standard Instance 1 1024 40 GB
37
+ # 4 2GB Standard Instance 2 2048 80 GB
38
+ # 5 4GB Standard Instance 2 4096 160 GB
39
+ # 6 8GB Standard Instance 4 8192 320 GB
40
+ # 7 15GB Standard Instance 6 15360 620 GB
41
+ # 8 30GB Standard Instance 8 30720 1200 GB
42
+ # performance1-1 1 GB Performance 1 1024 20 GB
43
+ # performance1-2 2 GB Performance 2 2048 40 GB
44
+ # performance1-4 4 GB Performance 4 4096 40 GB
45
+ # performance1-8 8 GB Performance 8 8192 40 GB
46
+ # performance2-120 120 GB Performance 32 122880 40 GB
47
+ # performance2-15 15 GB Performance 4 15360 40 GB
48
+ # performance2-30 30 GB Performance 8 30720 40 GB
49
+ # performance2-60 60 GB Performance 16 61440 40 GB
50
+ # performance2-90 90 GB Performance 24 92160 40 GB
51
+ # """}
52
+ # stdout = ANSI.unansi stdout
53
+ # stdout.should match_output(expected_output[api])
54
+ # end
55
+ #
56
+ # it 'should list images', :vcr do
57
+ # sample_image = {
58
+ # :v1 => 'Ubuntu 12.04 LTS',
59
+ # :v2 => 'Ubuntu 12.04 LTS (Precise Pangolin)'
60
+ # }
61
+ #
62
+ # stdout, stderr, status = knife_capture('rackspace image list')
63
+ # status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
64
+ # stdout = clean_output(stdout)
65
+ # stdout.should match /^ID\s*Name\s*$/
66
+ # stdout.should include sample_image[api]
67
+ # end
68
+ #
69
+ # it 'should manage servers', :vcr do
70
+ # pending "The test works, but I'm in the process of cleaning up sensitive data in the cassettes"
71
+ #
72
+ # image = {
73
+ # :v1 => '112',
74
+ # :v2 => 'e4dbdba7-b2a4-4ee5-8e8f-4595b6d694ce'
75
+ # }
76
+ # flavor = 2
77
+ # server_list.should_not include 'test-node'
78
+ #
79
+ # args = %W{rackspace server create -I #{image[api]} -f #{flavor} -N test-node -S test-server}
80
+ # stdout, stderr, status = knife_capture(args)
81
+ # status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
82
+ # instance_data = capture_instance_data(stdout, {
83
+ # :name => 'Name',
84
+ # :instance_id => 'Instance ID',
85
+ # :public_ip => 'Public IP Address',
86
+ # :private_ip => 'Private IP Address'
87
+ # })
88
+ #
89
+ # # Wanted to assert active state, but got build during test
90
+ # server_list.should match /#{instance_data[:instance_id]}\s*#{instance_data[:name]}\s*#{instance_data[:public_ip]}\s*#{instance_data[:private_ip]}\s*#{flavor}\s*#{image}/
91
+ #
92
+ # args = %W{rackspace server delete #{instance_data[:instance_id]} -y}
93
+ # stdout, stderr, status = knife_capture(args)
94
+ # status.should be(0), "Non-zero exit code.\n#{stdout}\n#{stderr}"
95
+ #
96
+ # # Need to deal with deleting vs deleted states before we can check this
97
+ # # server_list.should_not match /#{instance_data[:instance_id]}\s*#{instance_data[:name]}\s*#{instance_data[:public_ip]}\s*#{instance_data[:private_ip]}\s*#{flavor}\s*#{image}/
98
+ # end
99
+ # end
100
+ # end
metadata CHANGED
@@ -1,129 +1,146 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-rackspace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.10.1.pre.alpha.pre.217
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Jacob
8
8
  - Seth Chisamore
9
9
  - Matt Ray
10
+ - Rackspace Developers
11
+ - JJ Asghar
10
12
  autorequire:
11
13
  bindir: bin
12
14
  cert_chain: []
13
- date: 2014-06-20 00:00:00.000000000 Z
15
+ date: 2015-07-15 00:00:00.000000000 Z
14
16
  dependencies:
15
17
  - !ruby/object:Gem::Dependency
16
18
  name: knife-windows
17
19
  requirement: !ruby/object:Gem::Requirement
18
20
  requirements:
19
- - - ">="
21
+ - - ! '>='
20
22
  - !ruby/object:Gem::Version
21
23
  version: '0'
22
24
  type: :runtime
23
25
  prerelease: false
24
26
  version_requirements: !ruby/object:Gem::Requirement
25
27
  requirements:
26
- - - ">="
28
+ - - ! '>='
27
29
  - !ruby/object:Gem::Version
28
30
  version: '0'
29
31
  - !ruby/object:Gem::Dependency
30
32
  name: fog
31
33
  requirement: !ruby/object:Gem::Requirement
32
34
  requirements:
33
- - - ">="
35
+ - - ! '>='
34
36
  - !ruby/object:Gem::Version
35
37
  version: '1.22'
36
38
  type: :runtime
37
39
  prerelease: false
38
40
  version_requirements: !ruby/object:Gem::Requirement
39
41
  requirements:
40
- - - ">="
42
+ - - ! '>='
41
43
  - !ruby/object:Gem::Version
42
44
  version: '1.22'
43
45
  - !ruby/object:Gem::Dependency
44
46
  name: chef
45
47
  requirement: !ruby/object:Gem::Requirement
46
48
  requirements:
47
- - - ">="
49
+ - - ! '>='
48
50
  - !ruby/object:Gem::Version
49
51
  version: 0.10.10
50
52
  type: :runtime
51
53
  prerelease: false
52
54
  version_requirements: !ruby/object:Gem::Requirement
53
55
  requirements:
54
- - - ">="
56
+ - - ! '>='
55
57
  - !ruby/object:Gem::Version
56
58
  version: 0.10.10
59
+ - !ruby/object:Gem::Dependency
60
+ name: knife-dsl
61
+ requirement: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
57
73
  - !ruby/object:Gem::Dependency
58
74
  name: rspec
59
75
  requirement: !ruby/object:Gem::Requirement
60
76
  requirements:
61
- - - ">="
77
+ - - ! '>='
62
78
  - !ruby/object:Gem::Version
63
79
  version: '0'
64
80
  type: :development
65
81
  prerelease: false
66
82
  version_requirements: !ruby/object:Gem::Requirement
67
83
  requirements:
68
- - - ">="
84
+ - - ! '>='
69
85
  - !ruby/object:Gem::Version
70
86
  version: '0'
71
87
  - !ruby/object:Gem::Dependency
72
88
  name: vcr
73
89
  requirement: !ruby/object:Gem::Requirement
74
90
  requirements:
75
- - - ">="
91
+ - - ! '>='
76
92
  - !ruby/object:Gem::Version
77
93
  version: '0'
78
94
  type: :development
79
95
  prerelease: false
80
96
  version_requirements: !ruby/object:Gem::Requirement
81
97
  requirements:
82
- - - ">="
98
+ - - ! '>='
83
99
  - !ruby/object:Gem::Version
84
100
  version: '0'
85
101
  - !ruby/object:Gem::Dependency
86
102
  name: ansi
87
103
  requirement: !ruby/object:Gem::Requirement
88
104
  requirements:
89
- - - ">="
105
+ - - ! '>='
90
106
  - !ruby/object:Gem::Version
91
107
  version: '0'
92
108
  type: :development
93
109
  prerelease: false
94
110
  version_requirements: !ruby/object:Gem::Requirement
95
111
  requirements:
96
- - - ">="
112
+ - - ! '>='
97
113
  - !ruby/object:Gem::Version
98
114
  version: '0'
99
115
  - !ruby/object:Gem::Dependency
100
116
  name: rake
101
117
  requirement: !ruby/object:Gem::Requirement
102
118
  requirements:
103
- - - ">="
119
+ - - ! '>='
104
120
  - !ruby/object:Gem::Version
105
121
  version: '0'
106
122
  type: :development
107
123
  prerelease: false
108
124
  version_requirements: !ruby/object:Gem::Requirement
109
125
  requirements:
110
- - - ">="
126
+ - - ! '>='
111
127
  - !ruby/object:Gem::Version
112
128
  version: '0'
113
129
  description: Rackspace Support for Chef's Knife Command
114
130
  email:
115
- - adam@opscode.com
116
- - schisamo@opscode.com
117
- - matt@opscode.com
131
+ - adam@chef.io
132
+ - schisamo@chef.io
133
+ - matt@chef.io
134
+ - jj@chef.io
118
135
  executables: []
119
136
  extensions: []
120
137
  extra_rdoc_files:
121
138
  - README.rdoc
122
139
  - LICENSE
123
140
  files:
124
- - ".chef/knife.rb"
125
- - ".gitignore"
126
- - ".travis.yml"
141
+ - .chef/knife.rb
142
+ - .gitignore
143
+ - .travis.yml
127
144
  - CHANGELOG.md
128
145
  - Gemfile
129
146
  - LICENSE
@@ -148,7 +165,7 @@ files:
148
165
  - spec/integration_spec_helper.rb
149
166
  - spec/spec_helper.rb
150
167
  - spec/unit/rackspace_base_spec.rb
151
- homepage: http://wiki.opscode.com/display/chef
168
+ homepage: https://docs.chef.io/plugin_knife_rackspace.html
152
169
  licenses: []
153
170
  metadata: {}
154
171
  post_install_message:
@@ -157,26 +174,18 @@ require_paths:
157
174
  - lib
158
175
  required_ruby_version: !ruby/object:Gem::Requirement
159
176
  requirements:
160
- - - ">="
177
+ - - ! '>='
161
178
  - !ruby/object:Gem::Version
162
179
  version: '0'
163
180
  required_rubygems_version: !ruby/object:Gem::Requirement
164
181
  requirements:
165
- - - ">="
182
+ - - ! '>'
166
183
  - !ruby/object:Gem::Version
167
- version: '0'
184
+ version: 1.3.1
168
185
  requirements: []
169
186
  rubyforge_project:
170
- rubygems_version: 2.2.2
187
+ rubygems_version: 2.4.5
171
188
  signing_key:
172
189
  specification_version: 4
173
190
  summary: Rackspace Support for Chef's Knife Command
174
- test_files:
175
- - spec/cassettes/v1/should_list_images.yml
176
- - spec/cassettes/v1/should_list_server_flavors.yml
177
- - spec/cassettes/v2/should_list_images.yml
178
- - spec/cassettes/v2/should_list_server_flavors.yml
179
- - spec/integration/integration_spec.rb
180
- - spec/integration_spec_helper.rb
181
- - spec/spec_helper.rb
182
- - spec/unit/rackspace_base_spec.rb
191
+ test_files: []