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.
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