knife-server 1.1.0 → 1.2.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 +4 -4
- data/.cane +1 -0
- data/.rspec +1 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +12 -8
- data/CHANGELOG.md +32 -1
- data/Gemfile +9 -4
- data/Guardfile +28 -0
- data/README.md +28 -5
- data/Rakefile +31 -10
- data/knife-server.gemspec +18 -8
- data/lib/chef/knife/bootstrap/_omnibus.sh +63 -10
- data/lib/chef/knife/bootstrap/chef10/rhel.erb +2 -0
- data/lib/chef/knife/bootstrap/chef11/omnibus.erb +4 -1
- data/lib/chef/knife/bootstrap/chef11/rhel.erb +2 -0
- data/lib/chef/knife/server_backup.rb +24 -10
- data/lib/chef/knife/server_bootstrap_base.rb +68 -23
- data/lib/chef/knife/server_bootstrap_ec2.rb +33 -20
- data/lib/chef/knife/server_bootstrap_linode.rb +20 -13
- data/lib/chef/knife/server_bootstrap_openstack.rb +128 -0
- data/lib/chef/knife/server_bootstrap_standalone.rb +28 -16
- data/lib/chef/knife/server_restore.rb +23 -9
- data/lib/knife-server.rb +1 -0
- data/lib/knife/server/credentials.rb +78 -42
- data/lib/knife/server/ec2_security_group.rb +24 -21
- data/lib/knife/server/ssh.rb +54 -18
- data/lib/knife/server/version.rb +2 -1
- data/spec/chef/knife/server_backup_spec.rb +58 -44
- data/spec/chef/knife/server_bootstrap_ec2_spec.rb +108 -80
- data/spec/chef/knife/server_bootstrap_linode_spec.rb +93 -64
- data/spec/chef/knife/server_bootstrap_openstack_spec.rb +305 -0
- data/spec/chef/knife/server_bootstrap_standalone_spec.rb +113 -76
- data/spec/chef/knife/server_restore_spec.rb +38 -37
- data/spec/knife/server/credientials_spec.rb +248 -51
- data/spec/knife/server/ec2_security_group_spec.rb +76 -68
- data/spec/knife/server/ssh_spec.rb +138 -22
- metadata +107 -31
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
1
2
|
#
|
2
3
|
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
3
4
|
# Copyright:: Copyright (c) 2012 Fletcher Nichol
|
@@ -16,19 +17,19 @@
|
|
16
17
|
# limitations under the License.
|
17
18
|
#
|
18
19
|
|
19
|
-
require
|
20
|
+
require "knife/server/ec2_security_group"
|
20
21
|
|
21
22
|
describe Knife::Server::Ec2SecurityGroup do
|
22
|
-
let(:connection) {
|
23
|
-
let(:ui) {
|
24
|
-
let(:group) {
|
23
|
+
let(:connection) { double }
|
24
|
+
let(:ui) { double.as_null_object }
|
25
|
+
let(:group) { double(:name => "mygroup") }
|
25
26
|
|
26
27
|
subject do
|
27
28
|
Knife::Server::Ec2SecurityGroup.new(connection, ui)
|
28
29
|
end
|
29
30
|
|
30
31
|
def stub_groups!
|
31
|
-
connection.
|
32
|
+
allow(connection).to receive(:security_groups) { [group] }
|
32
33
|
end
|
33
34
|
|
34
35
|
describe "#find_or_create" do
|
@@ -38,11 +39,11 @@ describe Knife::Server::Ec2SecurityGroup do
|
|
38
39
|
end
|
39
40
|
|
40
41
|
it "returns the group" do
|
41
|
-
subject.find_or_create("mygroup").
|
42
|
+
expect(subject.find_or_create("mygroup")).to eq(group)
|
42
43
|
end
|
43
44
|
|
44
45
|
it "sends a message to the ui" do
|
45
|
-
ui.
|
46
|
+
expect(ui).to receive(:msg).with("EC2 security group 'mygroup' exists")
|
46
47
|
|
47
48
|
subject.find_or_create("mygroup")
|
48
49
|
end
|
@@ -50,18 +51,24 @@ describe Knife::Server::Ec2SecurityGroup do
|
|
50
51
|
|
51
52
|
context "when the group does not exist" do
|
52
53
|
before do
|
53
|
-
connection.
|
54
|
-
|
55
|
-
|
54
|
+
allow(connection).to receive(:security_groups) do
|
55
|
+
[double(:name => "nope")]
|
56
|
+
end
|
57
|
+
allow(connection).to receive(:create_security_group).
|
58
|
+
with("mygroup", "the best") do
|
59
|
+
stub_groups!
|
60
|
+
true
|
61
|
+
end
|
56
62
|
end
|
57
63
|
|
58
64
|
it "returns a new group" do
|
59
|
-
subject.find_or_create("mygroup", :description => "the best").
|
60
|
-
|
65
|
+
expect(subject.find_or_create("mygroup", :description => "the best")).
|
66
|
+
to eq(group)
|
61
67
|
end
|
62
68
|
|
63
69
|
it "sends a message to the ui" do
|
64
|
-
ui.
|
70
|
+
expect(ui).to receive(:msg).
|
71
|
+
with("Creating EC2 security group 'mygroup'")
|
65
72
|
|
66
73
|
subject.find_or_create("mygroup", :description => "the best")
|
67
74
|
end
|
@@ -72,110 +79,111 @@ describe Knife::Server::Ec2SecurityGroup do
|
|
72
79
|
context "with no permissions set" do
|
73
80
|
before do
|
74
81
|
stub_groups!
|
75
|
-
group.
|
76
|
-
group.
|
77
|
-
connection.
|
82
|
+
allow(group).to receive(:ip_permissions) { [] }
|
83
|
+
allow(group).to receive(:owner_id) { "123" }
|
84
|
+
allow(connection).to receive(:authorize_security_group_ingress)
|
78
85
|
end
|
79
86
|
|
80
87
|
it "adds an icmp wildcard rule for the security group" do
|
81
|
-
connection.
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
88
|
+
expect(connection).to receive(:authorize_security_group_ingress).with(
|
89
|
+
"mygroup",
|
90
|
+
"IpPermissions" => [
|
91
|
+
{ "FromPort" => -1, "ToPort" => -1, "IpProtocol" => "icmp",
|
92
|
+
"Groups" => [{ "GroupName" => "mygroup", "UserId" => "123" }]
|
93
|
+
}
|
94
|
+
]
|
95
|
+
)
|
89
96
|
|
90
|
-
subject.configure_chef_server_group(
|
97
|
+
subject.configure_chef_server_group("mygroup")
|
91
98
|
end
|
92
99
|
|
93
100
|
it "send a message for the icmp wildcard rule" do
|
94
|
-
ui.
|
101
|
+
expect(ui).to receive(:msg).
|
95
102
|
with("Creating inbound security group rule for icmp(-1 -> -1)")
|
96
103
|
|
97
|
-
subject.configure_chef_server_group(
|
104
|
+
subject.configure_chef_server_group("mygroup")
|
98
105
|
end
|
99
106
|
|
100
|
-
%w
|
107
|
+
%w[tcp udp].each do |proto|
|
101
108
|
it "adds a #{proto} rule for the security group" do
|
102
|
-
connection.
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
109
|
+
expect(connection).to receive(:authorize_security_group_ingress).with(
|
110
|
+
"mygroup",
|
111
|
+
"IpPermissions" => [
|
112
|
+
{ "IpProtocol" => proto,
|
113
|
+
"FromPort" => 0, "ToPort" => 65535,
|
114
|
+
"Groups" => [{ "GroupName" => "mygroup", "UserId" => "123" }]
|
115
|
+
}
|
116
|
+
]
|
117
|
+
)
|
111
118
|
|
112
|
-
subject.configure_chef_server_group(
|
119
|
+
subject.configure_chef_server_group("mygroup")
|
113
120
|
end
|
114
121
|
|
115
122
|
it "send a message for the #{proto} security group rule" do
|
116
|
-
ui.
|
117
|
-
"rule for #{proto}(0 -> 65535)")
|
123
|
+
expect(ui).to receive(:msg).with(
|
124
|
+
"Creating inbound security group rule for #{proto}(0 -> 65535)")
|
118
125
|
|
119
|
-
subject.configure_chef_server_group(
|
126
|
+
subject.configure_chef_server_group("mygroup")
|
120
127
|
end
|
121
128
|
end
|
122
129
|
|
123
130
|
[22, 443, 444].each do |tcp_port|
|
124
131
|
it "adds a tcp rule to port #{tcp_port} from anywhere" do
|
125
|
-
connection.
|
126
|
-
with("mygroup",
|
127
|
-
|
128
|
-
{
|
129
|
-
|
130
|
-
|
132
|
+
expect(connection).to receive(:authorize_security_group_ingress).
|
133
|
+
with("mygroup",
|
134
|
+
"IpPermissions" => [
|
135
|
+
{ "IpProtocol" => "tcp",
|
136
|
+
"FromPort" => tcp_port, "ToPort" => tcp_port,
|
137
|
+
"IpRanges" => [{ "CidrIp" => "0.0.0.0/0" }]
|
131
138
|
}
|
132
139
|
]
|
133
|
-
|
140
|
+
)
|
134
141
|
|
135
|
-
subject.configure_chef_server_group(
|
142
|
+
subject.configure_chef_server_group("mygroup")
|
136
143
|
end
|
137
144
|
|
138
145
|
it "send a message for the tcp/#{tcp_port} rule" do
|
139
|
-
ui.
|
146
|
+
expect(ui).to receive(:msg).with("Creating inbound security group " \
|
140
147
|
"rule for tcp(#{tcp_port} -> #{tcp_port})")
|
141
148
|
|
142
|
-
subject.configure_chef_server_group(
|
149
|
+
subject.configure_chef_server_group("mygroup")
|
143
150
|
end
|
144
151
|
end
|
145
152
|
end
|
146
153
|
|
147
154
|
describe "with all permissions set" do
|
148
155
|
def stub_perm!(proto, from, to)
|
149
|
-
{
|
156
|
+
{ "ipProtocol" => proto, "fromPort" => from, "toPort" => to }
|
150
157
|
end
|
151
158
|
|
152
159
|
before do
|
153
160
|
stub_groups!
|
154
|
-
group.
|
155
|
-
[
|
156
|
-
stub_perm!(
|
157
|
-
stub_perm!(
|
161
|
+
allow(group).to receive(:ip_permissions) do
|
162
|
+
[
|
163
|
+
stub_perm!("icmp", -1, -1), stub_perm!("tcp", 0, 65535),
|
164
|
+
stub_perm!("udp", 0, 65535), stub_perm!("tcp", 22, 22),
|
165
|
+
stub_perm!("tcp", 443, 443), stub_perm!("tcp", 444, 444)
|
158
166
|
]
|
159
167
|
end
|
160
|
-
group.
|
161
|
-
connection.
|
168
|
+
allow(group).to receive(:owner_id) { "123" }
|
169
|
+
allow(connection).to receive(:authorize_security_group_ingress)
|
162
170
|
end
|
163
171
|
|
164
172
|
it "does not add permissions" do
|
165
|
-
connection.
|
173
|
+
expect(connection).to_not receive(:authorize_security_group_ingress)
|
166
174
|
|
167
|
-
subject.configure_chef_server_group(
|
175
|
+
subject.configure_chef_server_group("mygroup")
|
168
176
|
end
|
169
177
|
|
170
178
|
it "sends messages for the rules" do
|
171
|
-
ui.
|
172
|
-
"icmp(-1 -> -1) exists")
|
173
|
-
ui.
|
174
|
-
"tcp(0 -> 65535) exists")
|
175
|
-
ui.
|
176
|
-
"tcp(22 -> 22) exists")
|
177
|
-
|
178
|
-
subject.configure_chef_server_group(
|
179
|
+
expect(ui).to receive(:msg).
|
180
|
+
with("Inbound security group rule icmp(-1 -> -1) exists")
|
181
|
+
expect(ui).to receive(:msg).
|
182
|
+
with("Inbound security group rule tcp(0 -> 65535) exists")
|
183
|
+
expect(ui).to receive(:msg).
|
184
|
+
with("Inbound security group rule tcp(22 -> 22) exists")
|
185
|
+
|
186
|
+
subject.configure_chef_server_group("mygroup")
|
179
187
|
end
|
180
188
|
end
|
181
189
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
1
2
|
#
|
2
3
|
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
3
4
|
# Copyright:: Copyright (c) 2012 Fletcher Nichol
|
@@ -16,66 +17,181 @@
|
|
16
17
|
# limitations under the License.
|
17
18
|
#
|
18
19
|
|
19
|
-
require
|
20
|
+
require "net/ssh/test"
|
21
|
+
|
22
|
+
require "knife/server/ssh"
|
23
|
+
|
24
|
+
# Terrible hack to deal with Net::SSH:Test::Extensions which monkey patches
|
25
|
+
# `IO.select` with a version for testing Net::SSH code. Unfortunetly this
|
26
|
+
# impacts other code, so we'll "un-patch" this after each spec and "re-patch"
|
27
|
+
# it before the next one.
|
28
|
+
|
29
|
+
def depatch_io
|
30
|
+
IO.class_exec do
|
31
|
+
class << self
|
32
|
+
alias_method :select, :select_for_real
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def repatch_io
|
38
|
+
IO.class_exec do
|
39
|
+
class << self
|
40
|
+
alias_method :select, :select_for_test
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Major hack-and-a-half to add basic `Channel#request_pty` support to
|
46
|
+
# Net::SSH's testing framework. The `Net::SSH::Test::LocalPacket` does not
|
47
|
+
# recognize the `"pty-req"` request type, so bombs out whenever this channel
|
48
|
+
# request is sent.
|
49
|
+
#
|
50
|
+
# This "make-work" fix adds a method (`#sends_request_pty`) which works just
|
51
|
+
# like `#sends_exec` expcept that it enqueues a patched subclass of
|
52
|
+
# `LocalPacket` which can deal with the `"pty-req"` type.
|
53
|
+
#
|
54
|
+
# An upstream patch to Net::SSH will be required to retire this yak shave ;)
|
55
|
+
|
56
|
+
module Net
|
57
|
+
module SSH
|
58
|
+
module Test
|
59
|
+
# Dat monkey patch
|
60
|
+
class Channel
|
61
|
+
def sends_request_pty
|
62
|
+
pty_data = ["xterm", 80, 24, 640, 480, "\0"]
|
63
|
+
|
64
|
+
script.events << Class.new(Net::SSH::Test::LocalPacket) do
|
65
|
+
def types
|
66
|
+
if @type == 98 && @data[1] == "pty-req"
|
67
|
+
@types ||= [
|
68
|
+
:long, :string, :bool, :string,
|
69
|
+
:long, :long, :long, :long, :string
|
70
|
+
]
|
71
|
+
else
|
72
|
+
super
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end.new(:channel_request, remote_id, "pty-req", false, *pty_data)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Quick-and-dirty port of MiniTest's assert method, needed for Net::SSH:Test's
|
83
|
+
# #assert_scripted method
|
84
|
+
def assert(test, msg = nil)
|
85
|
+
unless test
|
86
|
+
msg ||= "Failed assertion, no message given."
|
87
|
+
msg = msg.call if Proc == msg
|
88
|
+
raise msg
|
89
|
+
end
|
90
|
+
true
|
91
|
+
end
|
20
92
|
|
21
93
|
describe Knife::Server::SSH do
|
94
|
+
include Net::SSH::Test
|
95
|
+
|
22
96
|
let(:ssh_options) do
|
23
97
|
{ :host => "wadup.example.com", :user => "bob",
|
24
98
|
:keys => "/tmp/whoomp.key", :port => "2222" }
|
25
99
|
end
|
26
100
|
|
27
|
-
let(:ssh_connection)
|
28
|
-
stub("SSH connection").as_null_object
|
29
|
-
end
|
101
|
+
let(:ssh_connection) { connection }
|
30
102
|
|
31
103
|
subject { Knife::Server::SSH.new(ssh_options) }
|
32
104
|
|
33
105
|
before do
|
34
|
-
|
106
|
+
repatch_io
|
107
|
+
allow(Net::SSH).to receive(:start).and_yield(ssh_connection)
|
35
108
|
end
|
36
109
|
|
37
|
-
|
38
|
-
|
39
|
-
|
110
|
+
after do
|
111
|
+
depatch_io
|
112
|
+
end
|
40
113
|
|
41
|
-
|
114
|
+
it "passes ssh options to ssh sessions" do
|
115
|
+
write_story do |channel|
|
116
|
+
channel.sends_exec(
|
117
|
+
%{sudo USER=root HOME="$(getent passwd root | cut -d : -f 6)" } \
|
118
|
+
"bash -c 'wat'"
|
119
|
+
)
|
120
|
+
channel.gets_exit_status(0)
|
121
|
+
end
|
122
|
+
expect(Net::SSH).to receive(:start).with("wadup.example.com", "bob",
|
123
|
+
:keys => "/tmp/whoomp.key", :port => "2222")
|
124
|
+
|
125
|
+
assert_scripted { subject.exec! "wat" }
|
42
126
|
end
|
43
127
|
|
44
128
|
it "sets default user to root" do
|
129
|
+
write_story do |channel|
|
130
|
+
channel.sends_exec("wat")
|
131
|
+
channel.gets_exit_status(0)
|
132
|
+
end
|
45
133
|
ssh_options.delete(:user)
|
46
|
-
Net::SSH.
|
134
|
+
expect(Net::SSH).to receive(:start).
|
47
135
|
with(anything, "root", anything)
|
48
136
|
|
49
|
-
Knife::Server::SSH.new(ssh_options).exec!("wat")
|
137
|
+
assert_scripted { Knife::Server::SSH.new(ssh_options).exec!("wat") }
|
50
138
|
end
|
51
139
|
|
52
140
|
it "sets default port to 22" do
|
141
|
+
write_story do |channel|
|
142
|
+
channel.sends_exec(
|
143
|
+
%{sudo USER=root HOME="$(getent passwd root | cut -d : -f 6)" } \
|
144
|
+
"bash -c 'wat'"
|
145
|
+
)
|
146
|
+
channel.gets_exit_status(0)
|
147
|
+
end
|
53
148
|
ssh_options.delete(:port)
|
54
|
-
Net::SSH.
|
149
|
+
expect(Net::SSH).to receive(:start).
|
55
150
|
with(anything, anything, hash_including(:port => "22"))
|
56
151
|
|
57
|
-
Knife::Server::SSH.new(ssh_options).exec!("wat")
|
152
|
+
assert_scripted { Knife::Server::SSH.new(ssh_options).exec!("wat") }
|
58
153
|
end
|
59
154
|
|
60
155
|
it "does not add sudo to the command if user is root" do
|
156
|
+
write_story do |channel|
|
157
|
+
channel.sends_exec("zappa")
|
158
|
+
channel.gets_exit_status(0)
|
159
|
+
end
|
61
160
|
ssh_options[:user] = "root"
|
62
|
-
ssh_connection.should_receive(:exec!).with("zappa")
|
63
161
|
|
64
|
-
Knife::Server::SSH.new(ssh_options).exec!("zappa")
|
162
|
+
assert_scripted { Knife::Server::SSH.new(ssh_options).exec!("zappa") }
|
65
163
|
end
|
66
164
|
|
67
165
|
it "adds sudo to the command if user is not root" do
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
166
|
+
write_story do |channel|
|
167
|
+
channel.sends_exec(
|
168
|
+
%{sudo USER=root HOME="$(getent passwd root | cut -d : -f 6)" } \
|
169
|
+
"bash -c 'zappa'"
|
170
|
+
)
|
171
|
+
channel.gets_exit_status(0)
|
172
|
+
end
|
173
|
+
|
174
|
+
assert_scripted { Knife::Server::SSH.new(ssh_options).exec!("zappa") }
|
73
175
|
end
|
74
176
|
|
75
177
|
it "returns the output of ssh command" do
|
178
|
+
write_story do |channel|
|
179
|
+
channel.sends_exec("youdoitnow")
|
180
|
+
channel.gets_data("okthen")
|
181
|
+
channel.gets_exit_status(0)
|
182
|
+
end
|
76
183
|
ssh_options[:user] = "root"
|
77
|
-
ssh_connection.stub(:exec!).with("youdoitnow") { "okthen" }
|
78
184
|
|
79
|
-
subject.exec!("youdoitnow").
|
185
|
+
assert_scripted { expect(subject.exec!("youdoitnow")).to eq("okthen") }
|
186
|
+
end
|
187
|
+
|
188
|
+
def write_story
|
189
|
+
story do |script|
|
190
|
+
channel = script.opens_channel
|
191
|
+
channel.sends_request_pty
|
192
|
+
yield channel if block_given?
|
193
|
+
channel.gets_close
|
194
|
+
channel.sends_close
|
195
|
+
end
|
80
196
|
end
|
81
197
|
end
|
metadata
CHANGED
@@ -1,127 +1,197 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fletcher Nichol
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fog
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: net-ssh
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: chef
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.10.10
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.10.10
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: knife-ec2
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: 0.5.12
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: 0.5.12
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: knife-linode
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: knife-openstack
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: rspec
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- - ~>
|
115
|
+
- - "~>"
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
117
|
+
version: '3.0'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- - ~>
|
122
|
+
- - "~>"
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
124
|
+
version: '3.0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: fakefs
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
100
128
|
requirements:
|
101
|
-
- - ~>
|
129
|
+
- - "~>"
|
102
130
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.4
|
131
|
+
version: '0.4'
|
104
132
|
type: :development
|
105
133
|
prerelease: false
|
106
134
|
version_requirements: !ruby/object:Gem::Requirement
|
107
135
|
requirements:
|
108
|
-
- - ~>
|
136
|
+
- - "~>"
|
109
137
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.4
|
138
|
+
version: '0.4'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
140
|
name: timecop
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
|
-
- - ~>
|
143
|
+
- - "~>"
|
116
144
|
- !ruby/object:Gem::Version
|
117
145
|
version: '0.3'
|
118
146
|
type: :development
|
119
147
|
prerelease: false
|
120
148
|
version_requirements: !ruby/object:Gem::Requirement
|
121
149
|
requirements:
|
122
|
-
- - ~>
|
150
|
+
- - "~>"
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0.3'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: countloc
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.4'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.4'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: finstyle
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - '='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 1.2.0
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - '='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 1.2.0
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: cane
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - '='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 2.6.2
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - '='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 2.6.2
|
125
195
|
description: Chef Knife plugin to bootstrap Chef Servers
|
126
196
|
email:
|
127
197
|
- fnichol@nichol.ca
|
@@ -129,11 +199,14 @@ executables: []
|
|
129
199
|
extensions: []
|
130
200
|
extra_rdoc_files: []
|
131
201
|
files:
|
132
|
-
- .
|
133
|
-
- .
|
134
|
-
- .
|
202
|
+
- ".cane"
|
203
|
+
- ".gitignore"
|
204
|
+
- ".rspec"
|
205
|
+
- ".rubocop.yml"
|
206
|
+
- ".travis.yml"
|
135
207
|
- CHANGELOG.md
|
136
208
|
- Gemfile
|
209
|
+
- Guardfile
|
137
210
|
- LICENSE
|
138
211
|
- README.md
|
139
212
|
- Rakefile
|
@@ -151,6 +224,7 @@ files:
|
|
151
224
|
- lib/chef/knife/server_bootstrap_base.rb
|
152
225
|
- lib/chef/knife/server_bootstrap_ec2.rb
|
153
226
|
- lib/chef/knife/server_bootstrap_linode.rb
|
227
|
+
- lib/chef/knife/server_bootstrap_openstack.rb
|
154
228
|
- lib/chef/knife/server_bootstrap_standalone.rb
|
155
229
|
- lib/chef/knife/server_restore.rb
|
156
230
|
- lib/knife-server.rb
|
@@ -161,6 +235,7 @@ files:
|
|
161
235
|
- spec/chef/knife/server_backup_spec.rb
|
162
236
|
- spec/chef/knife/server_bootstrap_ec2_spec.rb
|
163
237
|
- spec/chef/knife/server_bootstrap_linode_spec.rb
|
238
|
+
- spec/chef/knife/server_bootstrap_openstack_spec.rb
|
164
239
|
- spec/chef/knife/server_bootstrap_standalone_spec.rb
|
165
240
|
- spec/chef/knife/server_restore_spec.rb
|
166
241
|
- spec/knife/server/credientials_spec.rb
|
@@ -175,17 +250,17 @@ require_paths:
|
|
175
250
|
- lib
|
176
251
|
required_ruby_version: !ruby/object:Gem::Requirement
|
177
252
|
requirements:
|
178
|
-
- -
|
253
|
+
- - ">="
|
179
254
|
- !ruby/object:Gem::Version
|
180
|
-
version: 1.9.
|
255
|
+
version: 1.9.3
|
181
256
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
257
|
requirements:
|
183
|
-
- -
|
258
|
+
- - ">="
|
184
259
|
- !ruby/object:Gem::Version
|
185
260
|
version: '0'
|
186
261
|
requirements: []
|
187
262
|
rubyforge_project:
|
188
|
-
rubygems_version: 2.
|
263
|
+
rubygems_version: 2.2.2
|
189
264
|
signing_key:
|
190
265
|
specification_version: 4
|
191
266
|
summary: Chef Knife plugin to bootstrap Chef Servers
|
@@ -193,6 +268,7 @@ test_files:
|
|
193
268
|
- spec/chef/knife/server_backup_spec.rb
|
194
269
|
- spec/chef/knife/server_bootstrap_ec2_spec.rb
|
195
270
|
- spec/chef/knife/server_bootstrap_linode_spec.rb
|
271
|
+
- spec/chef/knife/server_bootstrap_openstack_spec.rb
|
196
272
|
- spec/chef/knife/server_bootstrap_standalone_spec.rb
|
197
273
|
- spec/chef/knife/server_restore_spec.rb
|
198
274
|
- spec/knife/server/credientials_spec.rb
|