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 +13 -5
- data/.travis.yml +42 -23
- data/CHANGELOG.md +3 -0
- data/Gemfile +0 -5
- data/README.rdoc +71 -3
- data/knife-rackspace.gemspec +5 -5
- data/lib/chef/knife/rackspace_base.rb +1 -1
- data/lib/chef/knife/rackspace_network_create.rb +2 -2
- data/lib/chef/knife/rackspace_network_delete.rb +2 -2
- data/lib/chef/knife/rackspace_server_create.rb +136 -69
- data/lib/chef/knife/rackspace_server_delete.rb +1 -1
- data/lib/knife-rackspace/version.rb +1 -1
- data/spec/integration/integration_spec.rb +100 -100
- metadata +45 -36
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
N2Q4MjBjOGFiZWNmMjVkMjM2MzJiMzE2OTFmZWEzYWM3NzMzZDQzZQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NzIwOWExNGQzMGZiZTFlMjg3YmFiYTM3NWY0YmU0N2JhYWYxYmU4Yw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
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.
|
5
|
-
- 1
|
3
|
+
- 2.2
|
4
|
+
- 2.1
|
5
|
+
- 2.0.0
|
6
6
|
env:
|
7
7
|
global:
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
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@
|
142
|
-
Author:: Seth Chisamore (<schisamo@
|
143
|
-
Author:: Matt Ray (<matt@
|
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");
|
data/knife-rackspace.gemspec
CHANGED
@@ -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@
|
11
|
-
s.homepage = "
|
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
|
-
|
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"
|
@@ -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
|
-
|
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
|
-
|
160
|
-
|
161
|
-
|
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(
|
248
|
-
|
282
|
+
def tcp_test_ssh(server, bootstrap_ip)
|
283
|
+
return true unless config[:tcp_test_ssh] != nil
|
249
284
|
|
250
|
-
|
251
|
-
|
285
|
+
limit = Chef::Config[:knife][:retry_ssh_limit].to_i
|
286
|
+
count = 0
|
252
287
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
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
|
-
|
353
|
-
|
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
|
360
|
-
:image_id
|
361
|
-
:flavor_id
|
362
|
-
:metadata
|
363
|
-
:disk_config
|
364
|
-
: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
|
367
|
-
:key_name
|
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
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
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]
|
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
|
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,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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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.
|
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:
|
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@
|
116
|
-
- schisamo@
|
117
|
-
- matt@
|
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
|
-
-
|
125
|
-
-
|
126
|
-
-
|
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:
|
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:
|
184
|
+
version: 1.3.1
|
168
185
|
requirements: []
|
169
186
|
rubyforge_project:
|
170
|
-
rubygems_version: 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: []
|