knife-server 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.cane +1 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +3 -0
  5. data/.travis.yml +12 -8
  6. data/CHANGELOG.md +32 -1
  7. data/Gemfile +9 -4
  8. data/Guardfile +28 -0
  9. data/README.md +28 -5
  10. data/Rakefile +31 -10
  11. data/knife-server.gemspec +18 -8
  12. data/lib/chef/knife/bootstrap/_omnibus.sh +63 -10
  13. data/lib/chef/knife/bootstrap/chef10/rhel.erb +2 -0
  14. data/lib/chef/knife/bootstrap/chef11/omnibus.erb +4 -1
  15. data/lib/chef/knife/bootstrap/chef11/rhel.erb +2 -0
  16. data/lib/chef/knife/server_backup.rb +24 -10
  17. data/lib/chef/knife/server_bootstrap_base.rb +68 -23
  18. data/lib/chef/knife/server_bootstrap_ec2.rb +33 -20
  19. data/lib/chef/knife/server_bootstrap_linode.rb +20 -13
  20. data/lib/chef/knife/server_bootstrap_openstack.rb +128 -0
  21. data/lib/chef/knife/server_bootstrap_standalone.rb +28 -16
  22. data/lib/chef/knife/server_restore.rb +23 -9
  23. data/lib/knife-server.rb +1 -0
  24. data/lib/knife/server/credentials.rb +78 -42
  25. data/lib/knife/server/ec2_security_group.rb +24 -21
  26. data/lib/knife/server/ssh.rb +54 -18
  27. data/lib/knife/server/version.rb +2 -1
  28. data/spec/chef/knife/server_backup_spec.rb +58 -44
  29. data/spec/chef/knife/server_bootstrap_ec2_spec.rb +108 -80
  30. data/spec/chef/knife/server_bootstrap_linode_spec.rb +93 -64
  31. data/spec/chef/knife/server_bootstrap_openstack_spec.rb +305 -0
  32. data/spec/chef/knife/server_bootstrap_standalone_spec.rb +113 -76
  33. data/spec/chef/knife/server_restore_spec.rb +38 -37
  34. data/spec/knife/server/credientials_spec.rb +248 -51
  35. data/spec/knife/server/ec2_security_group_spec.rb +76 -68
  36. data/spec/knife/server/ssh_spec.rb +138 -22
  37. 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 'knife/server/ec2_security_group'
20
+ require "knife/server/ec2_security_group"
20
21
 
21
22
  describe Knife::Server::Ec2SecurityGroup do
22
- let(:connection) { stub }
23
- let(:ui) { stub.as_null_object }
24
- let(:group) { stub(:name => "mygroup") }
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.stub(:security_groups) { [group] }
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").should eq(group)
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.should_receive(:msg).with("EC2 security group 'mygroup' exists")
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.stub(:security_groups) { [stub(:name => "nope")] }
54
- connection.stub(:create_security_group).
55
- with("mygroup", "the best") { stub_groups! ; true }
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
- should eq(group)
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.should_receive(:msg).with("Creating EC2 security group 'mygroup'")
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.stub(:ip_permissions) { [] }
76
- group.stub(:owner_id) { '123' }
77
- connection.stub(:authorize_security_group_ingress)
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.should_receive(:authorize_security_group_ingress).
82
- with("mygroup", {
83
- 'IpPermissions' => [
84
- { 'FromPort' => -1, 'ToPort' => -1, 'IpProtocol' => 'icmp',
85
- 'Groups' => [{ 'GroupName' => 'mygroup', 'UserId' => '123' }]
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('mygroup')
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.should_receive(:msg).
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('mygroup')
104
+ subject.configure_chef_server_group("mygroup")
98
105
  end
99
106
 
100
- %w{tcp udp}.each do |proto|
107
+ %w[tcp udp].each do |proto|
101
108
  it "adds a #{proto} rule for the security group" do
102
- connection.should_receive(:authorize_security_group_ingress).
103
- with("mygroup", {
104
- 'IpPermissions' => [
105
- { 'IpProtocol' => proto,
106
- 'FromPort' => 0, 'ToPort' => 65535,
107
- 'Groups' => [{ 'GroupName' => 'mygroup', 'UserId' => '123' }]
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('mygroup')
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.should_receive(:msg).with("Creating inbound security group " +
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('mygroup')
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.should_receive(:authorize_security_group_ingress).
126
- with("mygroup", {
127
- 'IpPermissions' => [
128
- { 'IpProtocol' => 'tcp',
129
- 'FromPort' => tcp_port, 'ToPort' => tcp_port,
130
- 'IpRanges' => [{ 'CidrIp' => '0.0.0.0/0' }]
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('mygroup')
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.should_receive(:msg).with("Creating inbound security group " +
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('mygroup')
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
- { 'ipProtocol' => proto, 'fromPort' => from, 'toPort' => to }
156
+ { "ipProtocol" => proto, "fromPort" => from, "toPort" => to }
150
157
  end
151
158
 
152
159
  before do
153
160
  stub_groups!
154
- group.stub(:ip_permissions) do
155
- [ stub_perm!('icmp', -1, -1), stub_perm!('tcp', 0, 65535),
156
- stub_perm!('udp', 0, 65535), stub_perm!('tcp', 22, 22),
157
- stub_perm!('tcp', 443, 443), stub_perm!('tcp', 444, 444)
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.stub(:owner_id) { '123' }
161
- connection.stub(:authorize_security_group_ingress)
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.should_not_receive(:authorize_security_group_ingress)
173
+ expect(connection).to_not receive(:authorize_security_group_ingress)
166
174
 
167
- subject.configure_chef_server_group('mygroup')
175
+ subject.configure_chef_server_group("mygroup")
168
176
  end
169
177
 
170
178
  it "sends messages for the rules" do
171
- ui.should_receive(:msg).with("Inbound security group rule " +
172
- "icmp(-1 -> -1) exists")
173
- ui.should_receive(:msg).with("Inbound security group rule " +
174
- "tcp(0 -> 65535) exists")
175
- ui.should_receive(:msg).with("Inbound security group rule " +
176
- "tcp(22 -> 22) exists")
177
-
178
- subject.configure_chef_server_group('mygroup')
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 'knife/server/ssh'
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) do
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
- Net::SSH.stub(:start).and_yield(ssh_connection)
106
+ repatch_io
107
+ allow(Net::SSH).to receive(:start).and_yield(ssh_connection)
35
108
  end
36
109
 
37
- it "passes ssh options to ssh sessions" do
38
- Net::SSH.should_receive(:start).with("wadup.example.com", "bob",
39
- { :keys => "/tmp/whoomp.key", :port => "2222" })
110
+ after do
111
+ depatch_io
112
+ end
40
113
 
41
- subject.exec! "wat"
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.should_receive(:start).
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.should_receive(:start).
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
- ssh_connection.should_receive(:exec!).
69
- with([%{sudo USER=root HOME="$(getent passwd root | cut -d : -f 6)"},
70
- %{bash -c 'zappa'}].join(" "))
71
-
72
- Knife::Server::SSH.new(ssh_options).exec!("zappa")
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").should eq("okthen")
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.1.0
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: 2013-07-26 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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: 2.13.0
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: 2.13.0
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.0
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.0
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
- - .gitignore
133
- - .rspec
134
- - .travis.yml
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.2
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.0.3
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