knife-server 1.0.1 → 1.1.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 +7 -0
- data/.travis.yml +0 -1
- data/CHANGELOG.md +28 -15
- data/README.md +95 -9
- data/knife-server.gemspec +4 -1
- data/lib/chef/knife/server_backup.rb +15 -2
- data/lib/chef/knife/server_bootstrap_linode.rb +117 -0
- data/lib/knife/server/version.rb +1 -1
- data/spec/chef/knife/server_bootstrap_linode_spec.rb +273 -0
- metadata +33 -38
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6ac23ba3967334f48e3bad6406358d0653812228
|
4
|
+
data.tar.gz: b1a1d3dd1f2616444e7a9fbe1bd3dde52a696091
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9a19382e580ef0d6336bb74f5bef965641785c6f81c327a84d459195e82a67783181805cb6d4e2f9dc34077b13eb2ce2e504d5718e35380a7173cd770a2b171a
|
7
|
+
data.tar.gz: bb62f7d5d3c90f81e071aa975abfa9fc9be7625c6b9e1af375978a5cd689bc57e03400559a37e00785b074e35ea06c38f476e57e442679c3e8c11b3244e68a93
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## 1.1.0 / 2013-07-26
|
2
|
+
|
3
|
+
### New features
|
4
|
+
|
5
|
+
* Pull request [#42][]: Add support for Linode (via the knife-linode gem). ([@fnichol][])
|
6
|
+
|
7
|
+
### Improvements
|
8
|
+
|
9
|
+
* Pull request [#41][]: Add new option pretty_print for knife server backup. ([@sawanoboly][])
|
10
|
+
|
1
11
|
## 1.0.1 / 2013-04-11
|
2
12
|
|
3
13
|
### Bug fixes
|
@@ -5,7 +15,7 @@
|
|
5
15
|
* Pull request [#29][]: Fix README typo in ssh password argument. ([@ranjib][])
|
6
16
|
* Pull request [#34][]: Fix AMQP_PASSWORD propagation. ([@erikh][])
|
7
17
|
|
8
|
-
###
|
18
|
+
### Improvements
|
9
19
|
|
10
20
|
* Pull request [#35][]: Add VPC support. ([@jssjr][])
|
11
21
|
* Pull request [#34][]: Provide better information when the package can't be
|
@@ -141,25 +151,28 @@ The initial release.
|
|
141
151
|
|
142
152
|
|
143
153
|
<!--- The following link definition list is generated by PimpMyChangelog --->
|
144
|
-
[#2]: https://github.com/fnichol/knife/issues/2
|
145
|
-
[#3]: https://github.com/fnichol/knife/issues/3
|
146
|
-
[#5]: https://github.com/fnichol/knife/issues/5
|
147
|
-
[#7]: https://github.com/fnichol/knife/issues/7
|
148
|
-
[#8]: https://github.com/fnichol/knife/issues/8
|
149
|
-
[#9]: https://github.com/fnichol/knife/issues/9
|
150
|
-
[#10]: https://github.com/fnichol/knife/issues/10
|
151
|
-
[#11]: https://github.com/fnichol/knife/issues/11
|
152
|
-
[#13]: https://github.com/fnichol/knife/issues/13
|
153
|
-
[#15]: https://github.com/fnichol/knife/issues/15
|
154
|
-
[#29]: https://github.com/fnichol/knife/issues/29
|
155
|
-
[#34]: https://github.com/fnichol/knife/issues/34
|
156
|
-
[#35]: https://github.com/fnichol/knife/issues/35
|
154
|
+
[#2]: https://github.com/fnichol/knife-server/issues/2
|
155
|
+
[#3]: https://github.com/fnichol/knife-server/issues/3
|
156
|
+
[#5]: https://github.com/fnichol/knife-server/issues/5
|
157
|
+
[#7]: https://github.com/fnichol/knife-server/issues/7
|
158
|
+
[#8]: https://github.com/fnichol/knife-server/issues/8
|
159
|
+
[#9]: https://github.com/fnichol/knife-server/issues/9
|
160
|
+
[#10]: https://github.com/fnichol/knife-server/issues/10
|
161
|
+
[#11]: https://github.com/fnichol/knife-server/issues/11
|
162
|
+
[#13]: https://github.com/fnichol/knife-server/issues/13
|
163
|
+
[#15]: https://github.com/fnichol/knife-server/issues/15
|
164
|
+
[#29]: https://github.com/fnichol/knife-server/issues/29
|
165
|
+
[#34]: https://github.com/fnichol/knife-server/issues/34
|
166
|
+
[#35]: https://github.com/fnichol/knife-server/issues/35
|
167
|
+
[#41]: https://github.com/fnichol/knife-server/issues/41
|
168
|
+
[#42]: https://github.com/fnichol/knife-server/issues/42
|
157
169
|
[@danryan]: https://github.com/danryan
|
158
170
|
[@erikh]: https://github.com/erikh
|
159
171
|
[@fnichol]: https://github.com/fnichol
|
160
172
|
[@iafonov]: https://github.com/iafonov
|
161
173
|
[@jssjr]: https://github.com/jssjr
|
162
174
|
[@ranjib]: https://github.com/ranjib
|
175
|
+
[@sawanoboly]: https://github.com/sawanoboly
|
163
176
|
[@stormsilver]: https://github.com/stormsilver
|
164
177
|
[@wpeterson]: https://github.com/wpeterson
|
165
|
-
[@xdissent]: https://github.com/xdissent
|
178
|
+
[@xdissent]: https://github.com/xdissent
|
data/README.md
CHANGED
@@ -4,8 +4,9 @@
|
|
4
4
|
[](https://codeclimate.com/github/fnichol/knife-server)
|
5
5
|
|
6
6
|
An Opscode Chef knife plugin to manage Chef Servers. Bootstrap a new Chef
|
7
|
-
Server on Amazon's EC2 or a standalone server. Backup and restore
|
8
|
-
Server or Hosted Chef's node, role, data bag, and environment JSON
|
7
|
+
Server on Amazon's EC2, Linode or a standalone server. Backup and restore
|
8
|
+
your Chef Server or Hosted Chef's node, role, data bag, and environment JSON
|
9
|
+
data.
|
9
10
|
|
10
11
|
## <a name="usage"></a> Usage
|
11
12
|
|
@@ -36,15 +37,30 @@ $ knife server bootstrap ec2 \
|
|
36
37
|
--ssh-user ubuntu
|
37
38
|
```
|
38
39
|
|
40
|
+
To spin up your Chef Server on Linode:
|
41
|
+
|
42
|
+
```bash
|
43
|
+
knife server bootstrap linode \
|
44
|
+
--node-name linny.example.com \
|
45
|
+
--linode-node-name linny \
|
46
|
+
--linode-api-key $LINODE_API_KEY \
|
47
|
+
--linode-datacenter 3 \
|
48
|
+
--linode-flavor 1 \
|
49
|
+
--linode-image 99 \
|
50
|
+
--ssh-password 'testing1234'
|
51
|
+
```
|
52
|
+
|
39
53
|
Or maybe you want to try out a Chef Server using [Vagrant][vagrant_site]?
|
40
54
|
|
41
55
|
```bash
|
42
56
|
$ cat <<VAGRANTFILE > Vagrantfile
|
43
|
-
Vagrant
|
57
|
+
Vagrant.configure("2") do |config|
|
44
58
|
config.vm.box = "precise64"
|
45
59
|
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
|
46
|
-
config.vm.network :
|
47
|
-
config.vm.
|
60
|
+
config.vm.network :private_network, ip: "192.168.33.10"
|
61
|
+
config.vm.provider :virtualbox do |vb|
|
62
|
+
vb.customize ["modifyvm", :id, "--memory", 2048]
|
63
|
+
end
|
48
64
|
end
|
49
65
|
VAGRANTFILE
|
50
66
|
$ vagrant up
|
@@ -92,11 +108,12 @@ Add this line to your application's Gemfile:
|
|
92
108
|
gem 'knife-server'
|
93
109
|
```
|
94
110
|
|
95
|
-
**Note** If you want to use the `bootstrap ec2`
|
96
|
-
explicitly add this to your Gemfile with:
|
111
|
+
**Note** If you want to use the `bootstrap ec2` or `bootstrap linode`
|
112
|
+
subcommands you will need to explicitly add this to your Gemfile with:
|
97
113
|
|
98
114
|
```ruby
|
99
115
|
gem 'knife-ec2'
|
116
|
+
gem 'knife-linode'
|
100
117
|
```
|
101
118
|
|
102
119
|
Finally execute:
|
@@ -111,8 +128,8 @@ Or install it yourself as:
|
|
111
128
|
$ gem install knife-server
|
112
129
|
```
|
113
130
|
|
114
|
-
(Don't forget a `gem install knife-ec2`
|
115
|
-
|
131
|
+
(Don't forget a `gem install knife-ec2` or `gem install knife-linode` if using
|
132
|
+
the `bootstrap ec2` or `bootstrap linode` subcommands).
|
116
133
|
|
117
134
|
Next, you **must** set up a [knife.rb configuration](#installation-knife) so
|
118
135
|
that the shipped Knife subcommands know where to place and modify key files,
|
@@ -156,11 +173,15 @@ add some of the common configuration to your `~/.chef/knife.rb` or your
|
|
156
173
|
projects `.chef/knife.rb` file like so:
|
157
174
|
|
158
175
|
```ruby
|
176
|
+
# for aws/ec2
|
159
177
|
knife[:aws_access_key_id] = "MY_KEY"
|
160
178
|
knife[:aws_secret_access_key] = "MY_SECRET"
|
161
179
|
knife[:region] = "us-west-2"
|
162
180
|
knife[:availability_zone] = "us-west-2a"
|
163
181
|
knife[:flavor] = "t1.micro"
|
182
|
+
|
183
|
+
# for linode
|
184
|
+
knife[:linode_api_key] = "MY_KEY"
|
164
185
|
```
|
165
186
|
|
166
187
|
Better yet, why not try a more generic [knife.rb][chef_bootstrap_knife_rb] file
|
@@ -373,6 +394,69 @@ The resulting set will include:
|
|
373
394
|
* `"Node=#{config[:chef_node_name]}"`
|
374
395
|
* `"Role=chef_server"`
|
375
396
|
|
397
|
+
### <a name="knife-server-bootstrap-linode"></a> knife server bootstrap linode
|
398
|
+
|
399
|
+
**Note:** You must install the [knife-linode gem][knife-linode] to use this
|
400
|
+
subcommand. This was done to keep the dependencies of this library lighter and
|
401
|
+
to make future cloud adapter support easier to add.
|
402
|
+
|
403
|
+
Provisions a Linode instance and sets up an Open Source Chef Server as
|
404
|
+
described [above](#knife-server-bootstrap).
|
405
|
+
|
406
|
+
#### Configuration
|
407
|
+
|
408
|
+
This subcommand imports all relavent options from the knife-linode gem. For
|
409
|
+
detailed documentation relating to these options, please visit the [docs
|
410
|
+
page][docs_knife_linode].
|
411
|
+
|
412
|
+
##### --linode-api-key KEY (-A)
|
413
|
+
|
414
|
+
Your Linode API Key.
|
415
|
+
|
416
|
+
This option is **required**.
|
417
|
+
|
418
|
+
##### --linode-datacenter DATACENTER (-D)
|
419
|
+
|
420
|
+
The datacenter for the server.
|
421
|
+
|
422
|
+
The default value is `3` (Use `knife linode datacenter list` for a list of
|
423
|
+
choices)
|
424
|
+
|
425
|
+
##### --linode-flavor FLAVOR (-f)
|
426
|
+
|
427
|
+
The flavor of server.
|
428
|
+
|
429
|
+
The default value is `1`. (Use `knife linode flavor list` for a list of
|
430
|
+
choices)
|
431
|
+
|
432
|
+
##### --linode-image IMAGE (-i)
|
433
|
+
|
434
|
+
The image for the server.
|
435
|
+
|
436
|
+
The default value is `93`. (Use `knife linode image list` for a list of
|
437
|
+
choices)
|
438
|
+
|
439
|
+
##### --linode-kernel KERNEL (-k)
|
440
|
+
|
441
|
+
The kernel for the server.
|
442
|
+
|
443
|
+
The default value is `138`. (Use `knife linode kernel list` for a list of
|
444
|
+
choices)
|
445
|
+
|
446
|
+
##### --linode-node-name NAME (-L)
|
447
|
+
|
448
|
+
The Linode node name for your new node.
|
449
|
+
|
450
|
+
This option is **required**.
|
451
|
+
|
452
|
+
##### --ssh-password PASSWORD (-P)
|
453
|
+
|
454
|
+
The ssh password. If a password is not provided, then a random password will be
|
455
|
+
generated and echoed in logging output. It is recommended that you specify a
|
456
|
+
password so that you know how to connect later.
|
457
|
+
|
458
|
+
The default value is a random password.
|
459
|
+
|
376
460
|
### <a name="knife-server-bootstrap-standalone"></a> knife server bootstrap standalone
|
377
461
|
|
378
462
|
Provisions a standalone server that is reachable on the network and sets up
|
@@ -533,8 +617,10 @@ Apache License, Version 2.0 (see [LICENSE][license])
|
|
533
617
|
[chef_bootstrap_repo]: https://github.com/fnichol/chef-bootstrap-repo/
|
534
618
|
[docs_knife]: http://docs.opscode.com/config_rb_knife.html
|
535
619
|
[docs_knife_ec2]: http://docs.opscode.com/plugin_knife_ec2.html
|
620
|
+
[docs_knife_linode]: http://docs.opscode.com/plugin_knife_linode.html
|
536
621
|
[jtimberman]: https://github.com/jtimberman
|
537
622
|
[install_chef]: http://www.opscode.com/chef/install/
|
538
623
|
[knife-ec2]: https://github.com/opscode/knife-ec2
|
624
|
+
[knife-linode]: https://github.com/opscode/knife-linode
|
539
625
|
[stevendanna]: https://github.com/stevendanna
|
540
626
|
[vagrant_site]: http://vagrantup.com/
|
data/knife-server.gemspec
CHANGED
@@ -15,13 +15,16 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Knife::Server::VERSION
|
17
17
|
|
18
|
+
gem.required_ruby_version = ">= 1.9.2"
|
19
|
+
|
18
20
|
gem.add_dependency "fog", "~> 1.3"
|
19
21
|
gem.add_dependency "net-ssh"
|
20
22
|
gem.add_dependency "chef", ">= 0.10.10"
|
21
23
|
|
22
24
|
gem.add_development_dependency "knife-ec2", ">= 0.5.12"
|
25
|
+
gem.add_development_dependency "knife-linode"
|
23
26
|
|
24
|
-
gem.add_development_dependency "rspec", "~> 2.
|
27
|
+
gem.add_development_dependency "rspec", "~> 2.13.0"
|
25
28
|
gem.add_development_dependency "fakefs", "~> 0.4.0"
|
26
29
|
gem.add_development_dependency "timecop", "~> 0.3"
|
27
30
|
end
|
@@ -35,6 +35,11 @@ class Chef
|
|
35
35
|
:long => "--backup-dir DIR",
|
36
36
|
:description => "The directory to host backup files"
|
37
37
|
|
38
|
+
option :pretty_print,
|
39
|
+
:short => "-P",
|
40
|
+
:long => "--pretty_print",
|
41
|
+
:description => "Generate Pretty JSON for file."
|
42
|
+
|
38
43
|
def run
|
39
44
|
validate!
|
40
45
|
components = name_args.empty? ? COMPONENTS.keys : name_args
|
@@ -91,7 +96,11 @@ class Chef
|
|
91
96
|
obj = c[:klass].load(name)
|
92
97
|
ui.msg "Backing up #{c[:singular]}[#{name}]"
|
93
98
|
::File.open(::File.join(dir_path, "#{name}.json"), "wb") do |f|
|
94
|
-
|
99
|
+
if config[:pretty_print]
|
100
|
+
f.write(JSON.pretty_generate(obj))
|
101
|
+
else
|
102
|
+
f.write(obj.to_json)
|
103
|
+
end
|
95
104
|
end
|
96
105
|
end
|
97
106
|
|
@@ -103,7 +112,11 @@ class Chef
|
|
103
112
|
obj = Chef::DataBagItem.load(name, item_name)
|
104
113
|
ui.msg "Backing up #{c[:singular]}[#{name}][#{item_name}]"
|
105
114
|
::File.open(::File.join(item_path, "#{item_name}.json"), "wb") do |f|
|
106
|
-
|
115
|
+
if config[:pretty_print]
|
116
|
+
f.write(JSON.pretty_generate(obj))
|
117
|
+
else
|
118
|
+
f.write(obj.to_json)
|
119
|
+
end
|
107
120
|
end
|
108
121
|
end
|
109
122
|
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
3
|
+
# Copyright:: Copyright (c) 2013 Fletcher Nichol
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'chef/knife/server_bootstrap_base'
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
class Knife
|
23
|
+
class ServerBootstrapLinode < Knife
|
24
|
+
|
25
|
+
banner "knife server bootstrap linode (options)"
|
26
|
+
|
27
|
+
include Knife::ServerBootstrapBase
|
28
|
+
|
29
|
+
deps do
|
30
|
+
require 'knife/server/ssh'
|
31
|
+
require 'knife/server/credentials'
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'chef/knife/linode_server_create'
|
35
|
+
require 'fog'
|
36
|
+
Chef::Knife::LinodeServerCreate.load_deps
|
37
|
+
|
38
|
+
current_options = self.options
|
39
|
+
self.options = Chef::Knife::LinodeServerCreate.options.dup
|
40
|
+
self.options.merge!(current_options)
|
41
|
+
rescue LoadError => ex
|
42
|
+
ui.error [
|
43
|
+
"Knife plugin knife-linode could not be loaded.",
|
44
|
+
"Please add the knife-linode gem to your Gemfile or",
|
45
|
+
"install the gem manually with `gem install knife-linode'.",
|
46
|
+
"(#{ex.message})"
|
47
|
+
].join(" ")
|
48
|
+
exit 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def run
|
53
|
+
validate!
|
54
|
+
linode_bootstrap.run
|
55
|
+
fetch_validation_key
|
56
|
+
create_root_client
|
57
|
+
install_client_key
|
58
|
+
end
|
59
|
+
|
60
|
+
def linode_bootstrap
|
61
|
+
ENV['WEBUI_PASSWORD'] = config_val(:webui_password)
|
62
|
+
ENV['AMQP_PASSWORD'] = config_val(:amqp_password)
|
63
|
+
ENV['NO_TEST'] = "1" if config[:no_test]
|
64
|
+
bootstrap = Chef::Knife::LinodeServerCreate.new
|
65
|
+
Chef::Knife::LinodeServerCreate.options.keys.each do |attr|
|
66
|
+
bootstrap.config[attr] = config_val(attr)
|
67
|
+
end
|
68
|
+
bootstrap.config[:distro] = bootstrap_distro
|
69
|
+
bootstrap
|
70
|
+
end
|
71
|
+
|
72
|
+
def linode_connection
|
73
|
+
@linode_connection ||= Fog::Compute.new(
|
74
|
+
:provider => 'Linode',
|
75
|
+
:linode_api_key => config_val(:linode_api_key)
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
def server_ip_address
|
80
|
+
server = linode_connection.servers.find do |s|
|
81
|
+
s.status == 1 && s.name == config_val(:linode_node_name)
|
82
|
+
end
|
83
|
+
|
84
|
+
server && server.public_ip_address
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def validate!
|
90
|
+
if config[:chef_node_name].nil?
|
91
|
+
ui.error "You did not provide a valid --node-name value."
|
92
|
+
exit 1
|
93
|
+
end
|
94
|
+
if config_val(:platform) == "auto"
|
95
|
+
ui.error "Auto platform mode cannot be used with knife-linode plugin"
|
96
|
+
exit 1
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def ssh_connection
|
101
|
+
opts = {
|
102
|
+
:host => server_ip_address,
|
103
|
+
:user => config_val(:ssh_user),
|
104
|
+
:port => "22",
|
105
|
+
:keys => [config_val(:identity_file)].compact,
|
106
|
+
:password => config_val(:ssh_password)
|
107
|
+
}
|
108
|
+
if config_val(:host_key_verify) == false
|
109
|
+
opts[:user_known_hosts_file] = "/dev/null"
|
110
|
+
opts[:paranoid] = false
|
111
|
+
end
|
112
|
+
|
113
|
+
::Knife::Server::SSH.new(opts)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/lib/knife/server/version.rb
CHANGED
@@ -0,0 +1,273 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
3
|
+
# Copyright:: Copyright (c) 2013 Fletcher Nichol
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'chef/knife/server_bootstrap_linode'
|
20
|
+
require 'chef/knife/ssh'
|
21
|
+
require 'fakefs/spec_helpers'
|
22
|
+
require 'net/ssh'
|
23
|
+
Chef::Knife::ServerBootstrapLinode.load_deps
|
24
|
+
|
25
|
+
describe Chef::Knife::ServerBootstrapLinode do
|
26
|
+
include FakeFS::SpecHelpers
|
27
|
+
|
28
|
+
before do
|
29
|
+
Chef::Log.logger = Logger.new(StringIO.new)
|
30
|
+
@knife = Chef::Knife::ServerBootstrapLinode.new
|
31
|
+
@stdout = StringIO.new
|
32
|
+
@knife.ui.stub!(:stdout).and_return(@stdout)
|
33
|
+
@stderr = StringIO.new
|
34
|
+
@knife.ui.stub!(:stderr).and_return(@stderr)
|
35
|
+
@knife.config[:chef_node_name] = "yakky"
|
36
|
+
@knife.config[:platform] = "omnibus"
|
37
|
+
@knife.config[:ssh_user] = "root"
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:connection) { mock(Fog::Compute::AWS) }
|
41
|
+
|
42
|
+
describe "#linode_bootstrap" do
|
43
|
+
|
44
|
+
before do
|
45
|
+
@knife.config[:chef_node_name] = "shave.yak"
|
46
|
+
@knife.config[:ssh_user] = "jdoe"
|
47
|
+
@knife.config[:identity_file] = "~/.ssh/mykey_dsa"
|
48
|
+
@knife.config[:linode_api_key] = "linode123"
|
49
|
+
@knife.config[:distro] = "distro-praha"
|
50
|
+
@knife.config[:webui_password] = "daweb"
|
51
|
+
@knife.config[:amqp_password] = "queueitup"
|
52
|
+
|
53
|
+
ENV['_SPEC_WEBUI_PASSWORD'] = ENV['WEBUI_PASSWORD']
|
54
|
+
ENV['_SPEC_AMQP_PASSWORD'] = ENV['AMQP_PASSWORD']
|
55
|
+
end
|
56
|
+
|
57
|
+
after do
|
58
|
+
ENV['WEBUI_PASSWORD'] = ENV.delete('_SPEC_WEBUI_PASSWORD')
|
59
|
+
ENV['AMQP_PASSWORD'] = ENV.delete('_SPEC_AMQP_PASSWORD')
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:bootstrap) { @knife.linode_bootstrap }
|
63
|
+
|
64
|
+
it "returns a LinodeServerCreate instance" do
|
65
|
+
bootstrap.should be_a(Chef::Knife::LinodeServerCreate)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "configs the bootstrap's chef_node_name" do
|
69
|
+
bootstrap.config[:chef_node_name].should eq("shave.yak")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "configs the bootstrap's ssh_user" do
|
73
|
+
bootstrap.config[:ssh_user].should eq("jdoe")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "configs the bootstrap's identity_file" do
|
77
|
+
bootstrap.config[:identity_file].should eq("~/.ssh/mykey_dsa")
|
78
|
+
end
|
79
|
+
|
80
|
+
it "configs the bootstrap's linode_api_key" do
|
81
|
+
bootstrap.config[:linode_api_key].should eq("linode123")
|
82
|
+
end
|
83
|
+
|
84
|
+
it "configs the bootstrap's distro" do
|
85
|
+
bootstrap.config[:distro].should eq("distro-praha")
|
86
|
+
end
|
87
|
+
|
88
|
+
it "configs the bootstrap's distro to chef11/omnibus by default" do
|
89
|
+
@knife.config.delete(:distro)
|
90
|
+
|
91
|
+
bootstrap.config[:distro].should eq("chef11/omnibus")
|
92
|
+
end
|
93
|
+
|
94
|
+
it "configs the bootstrap's distro value driven off platform value" do
|
95
|
+
@knife.config.delete(:distro)
|
96
|
+
@knife.config[:platform] = "freebsd"
|
97
|
+
|
98
|
+
bootstrap.config[:distro].should eq("chef11/freebsd")
|
99
|
+
end
|
100
|
+
|
101
|
+
it "configs the bootstrap's distro based on bootstrap_version and platform" do
|
102
|
+
@knife.config.delete(:distro)
|
103
|
+
@knife.config[:platform] = "freebsd"
|
104
|
+
@knife.config[:bootstrap_version] = "10"
|
105
|
+
|
106
|
+
bootstrap.config[:distro].should eq("chef10/freebsd")
|
107
|
+
end
|
108
|
+
|
109
|
+
it "configs the bootstrap's ENV with the webui password" do
|
110
|
+
bootstrap
|
111
|
+
ENV['WEBUI_PASSWORD'].should eq("daweb")
|
112
|
+
end
|
113
|
+
|
114
|
+
it "configs the bootstrap's ENV with the amqp password" do
|
115
|
+
bootstrap
|
116
|
+
ENV['AMQP_PASSWORD'].should eq("queueitup")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "#linode_connection" do
|
121
|
+
|
122
|
+
before do
|
123
|
+
@before_config = Hash.new
|
124
|
+
@before_config[:knife] = Hash.new
|
125
|
+
@before_config[:knife][:linode_api_key] =
|
126
|
+
Chef::Config[:knife][:linode_api_key]
|
127
|
+
|
128
|
+
Chef::Config[:knife][:linode_api_key] = "key"
|
129
|
+
end
|
130
|
+
|
131
|
+
after do
|
132
|
+
Chef::Config[:knife][:linode_api_key] =
|
133
|
+
@before_config[:knife][:linode_api_key]
|
134
|
+
end
|
135
|
+
|
136
|
+
it "constructs a connection" do
|
137
|
+
Fog::Compute.should_receive(:new).with({
|
138
|
+
:provider => 'Linode',
|
139
|
+
:linode_api_key => 'key'
|
140
|
+
})
|
141
|
+
|
142
|
+
@knife.linode_connection
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "#server_ip_address" do
|
147
|
+
|
148
|
+
before do
|
149
|
+
@knife.config[:linode_node_name] = 'yak'
|
150
|
+
@knife.stub(:linode_connection) { connection }
|
151
|
+
end
|
152
|
+
|
153
|
+
context "when server is found" do
|
154
|
+
|
155
|
+
before do
|
156
|
+
connection.stub(:servers) { [server] }
|
157
|
+
end
|
158
|
+
|
159
|
+
let(:server) do
|
160
|
+
stub(:name => 'yak', :status => 1, :public_ip_address => '10.11.12.13')
|
161
|
+
end
|
162
|
+
|
163
|
+
it "returns the provisioned ip address" do
|
164
|
+
@knife.server_ip_address.should eq('10.11.12.13')
|
165
|
+
end
|
166
|
+
|
167
|
+
it "ignores terminated instances" do
|
168
|
+
server.stub(:status) { 0 }
|
169
|
+
|
170
|
+
@knife.server_ip_address.should be_nil
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
context "when server is not found" do
|
175
|
+
before do
|
176
|
+
connection.stub(:servers) { [] }
|
177
|
+
end
|
178
|
+
|
179
|
+
it "returns nil" do
|
180
|
+
@knife.server_ip_address.should be_nil
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe "#run" do
|
186
|
+
|
187
|
+
before do
|
188
|
+
@before_config = Hash.new
|
189
|
+
[:node_name, :client_key].each do |attr|
|
190
|
+
@before_config[attr] = Chef::Config[attr]
|
191
|
+
end
|
192
|
+
Chef::Config[:node_name] = "smithers"
|
193
|
+
Chef::Config[:client_key] = "/var/tmp/myclientkey.pem"
|
194
|
+
|
195
|
+
@knife.config[:validation_key] = "/var/tmp/validation.pem"
|
196
|
+
@knife.config[:identity_file] = "~/.ssh/mykey_dsa"
|
197
|
+
@knife.config[:ssh_password] = "booboo"
|
198
|
+
@knife.stub(:linode_connection) { connection }
|
199
|
+
@knife.stub(:server_ip_address) { "11.11.11.13" }
|
200
|
+
Chef::Knife::LinodeServerCreate.stub(:new) { bootstrap }
|
201
|
+
Knife::Server::SSH.stub(:new) { ssh }
|
202
|
+
Knife::Server::Credentials.stub(:new) { credentials }
|
203
|
+
credentials.stub(:install_validation_key)
|
204
|
+
credentials.stub(:create_root_client)
|
205
|
+
end
|
206
|
+
|
207
|
+
after do
|
208
|
+
[:node_name, :client_key].each do |attr|
|
209
|
+
Chef::Config[attr] = @before_config[attr]
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
let(:bootstrap) { stub(:run => true, :config => Hash.new) }
|
214
|
+
let(:ssh) { stub }
|
215
|
+
let(:credentials) { stub.as_null_object }
|
216
|
+
|
217
|
+
it "exits if node_name option is missing" do
|
218
|
+
@knife.config.delete(:chef_node_name)
|
219
|
+
|
220
|
+
lambda { @knife.run }.should raise_error(SystemExit)
|
221
|
+
end
|
222
|
+
|
223
|
+
it "exits if platform is set to auto" do
|
224
|
+
@knife.config[:platform] = "auto"
|
225
|
+
|
226
|
+
lambda { @knife.run }.should raise_error(SystemExit)
|
227
|
+
end
|
228
|
+
|
229
|
+
it "bootstraps a linode server" do
|
230
|
+
bootstrap.should_receive(:run)
|
231
|
+
|
232
|
+
@knife.run
|
233
|
+
end
|
234
|
+
|
235
|
+
it "installs a new validation.pem key from the chef 10 server" do
|
236
|
+
@knife.config[:bootstrap_version] = "10"
|
237
|
+
Knife::Server::SSH.should_receive(:new).with({
|
238
|
+
:host => "11.11.11.13", :user => "root",
|
239
|
+
:port => "22", :keys => ["~/.ssh/mykey_dsa"], :password => "booboo"
|
240
|
+
})
|
241
|
+
Knife::Server::Credentials.should_receive(:new).
|
242
|
+
with(ssh, "/etc/chef/validation.pem", {})
|
243
|
+
credentials.should_receive(:install_validation_key)
|
244
|
+
|
245
|
+
@knife.run
|
246
|
+
end
|
247
|
+
|
248
|
+
it "installs a new validation.pem key from the omnibus server" do
|
249
|
+
Knife::Server::SSH.should_receive(:new).with({
|
250
|
+
:host => "11.11.11.13", :user => "root",
|
251
|
+
:port => "22", :keys => ["~/.ssh/mykey_dsa"], :password => "booboo"
|
252
|
+
})
|
253
|
+
Knife::Server::Credentials.should_receive(:new).
|
254
|
+
with(ssh, "/etc/chef/validation.pem", {:omnibus => true})
|
255
|
+
credentials.should_receive(:install_validation_key)
|
256
|
+
|
257
|
+
@knife.run
|
258
|
+
end
|
259
|
+
|
260
|
+
it "create a root client key" do
|
261
|
+
credentials.should_receive(:create_root_client)
|
262
|
+
|
263
|
+
@knife.run
|
264
|
+
end
|
265
|
+
|
266
|
+
it "installs a client key" do
|
267
|
+
credentials.should_receive(:install_client_key).
|
268
|
+
with("smithers", "/var/tmp/myclientkey.pem")
|
269
|
+
|
270
|
+
@knife.run
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Fletcher Nichol
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-07-26 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: fog
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,71 +27,76 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: net-ssh
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: chef
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: 0.10.10
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: 0.10.10
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: knife-ec2
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: 0.5.12
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: 0.5.12
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: knife-linode
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
84
|
name: rspec
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
87
|
- - ~>
|
84
88
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
89
|
+
version: 2.13.0
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
94
|
- - ~>
|
92
95
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
96
|
+
version: 2.13.0
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
98
|
name: fakefs
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
101
|
- - ~>
|
100
102
|
- !ruby/object:Gem::Version
|
@@ -102,7 +104,6 @@ dependencies:
|
|
102
104
|
type: :development
|
103
105
|
prerelease: false
|
104
106
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
107
|
requirements:
|
107
108
|
- - ~>
|
108
109
|
- !ruby/object:Gem::Version
|
@@ -110,7 +111,6 @@ dependencies:
|
|
110
111
|
- !ruby/object:Gem::Dependency
|
111
112
|
name: timecop
|
112
113
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
114
|
requirements:
|
115
115
|
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
@@ -118,7 +118,6 @@ dependencies:
|
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
121
|
requirements:
|
123
122
|
- - ~>
|
124
123
|
- !ruby/object:Gem::Version
|
@@ -151,6 +150,7 @@ files:
|
|
151
150
|
- lib/chef/knife/server_backup.rb
|
152
151
|
- lib/chef/knife/server_bootstrap_base.rb
|
153
152
|
- lib/chef/knife/server_bootstrap_ec2.rb
|
153
|
+
- lib/chef/knife/server_bootstrap_linode.rb
|
154
154
|
- lib/chef/knife/server_bootstrap_standalone.rb
|
155
155
|
- lib/chef/knife/server_restore.rb
|
156
156
|
- lib/knife-server.rb
|
@@ -160,6 +160,7 @@ files:
|
|
160
160
|
- lib/knife/server/version.rb
|
161
161
|
- spec/chef/knife/server_backup_spec.rb
|
162
162
|
- spec/chef/knife/server_bootstrap_ec2_spec.rb
|
163
|
+
- spec/chef/knife/server_bootstrap_linode_spec.rb
|
163
164
|
- spec/chef/knife/server_bootstrap_standalone_spec.rb
|
164
165
|
- spec/chef/knife/server_restore_spec.rb
|
165
166
|
- spec/knife/server/credientials_spec.rb
|
@@ -167,37 +168,31 @@ files:
|
|
167
168
|
- spec/knife/server/ssh_spec.rb
|
168
169
|
homepage: http://fnichol.github.com/knife-server
|
169
170
|
licenses: []
|
171
|
+
metadata: {}
|
170
172
|
post_install_message:
|
171
173
|
rdoc_options: []
|
172
174
|
require_paths:
|
173
175
|
- lib
|
174
176
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
-
none: false
|
176
177
|
requirements:
|
177
|
-
- -
|
178
|
+
- - '>='
|
178
179
|
- !ruby/object:Gem::Version
|
179
|
-
version:
|
180
|
-
segments:
|
181
|
-
- 0
|
182
|
-
hash: -2573931868041806838
|
180
|
+
version: 1.9.2
|
183
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
|
-
none: false
|
185
182
|
requirements:
|
186
|
-
- -
|
183
|
+
- - '>='
|
187
184
|
- !ruby/object:Gem::Version
|
188
185
|
version: '0'
|
189
|
-
segments:
|
190
|
-
- 0
|
191
|
-
hash: -2573931868041806838
|
192
186
|
requirements: []
|
193
187
|
rubyforge_project:
|
194
|
-
rubygems_version:
|
188
|
+
rubygems_version: 2.0.3
|
195
189
|
signing_key:
|
196
|
-
specification_version:
|
190
|
+
specification_version: 4
|
197
191
|
summary: Chef Knife plugin to bootstrap Chef Servers
|
198
192
|
test_files:
|
199
193
|
- spec/chef/knife/server_backup_spec.rb
|
200
194
|
- spec/chef/knife/server_bootstrap_ec2_spec.rb
|
195
|
+
- spec/chef/knife/server_bootstrap_linode_spec.rb
|
201
196
|
- spec/chef/knife/server_bootstrap_standalone_spec.rb
|
202
197
|
- spec/chef/knife/server_restore_spec.rb
|
203
198
|
- spec/knife/server/credientials_spec.rb
|