knife-digital_ocean 0.0.5 → 0.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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OTZkMjlmY2NhNmQ3YmQ1ZjM1ZTI0MjM0MmQyMmQwZDRlOGVlM2I0OA==
5
+ data.tar.gz: !binary |-
6
+ NTFmN2M3ZTQ0NDZiMzQxM2Y0NmIzZGJlZDgwYWU0NWMzY2E5NDFhYQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NzQ1Y2Y5Mjk5YWJjZTNiOTNlZTQzNTljMjEwMzI0MTZjMTZjNzk1ZmMxYmUy
10
+ OGYyMzFjMmU0YTRlYjJhMTQwZTFhMGJlMzU1NmJjNzYwOTNlMzc4Mjc0MDM2
11
+ NGIzOTRkNGMzM2MzYmRlMzcxYjc2MWE4ZTcwMzRiYjNlOWI4Y2U=
12
+ data.tar.gz: !binary |-
13
+ NTczNTdhM2E4YTk1ZWM5MTAxZmU0MDI5ZWFiNjM3MjE1ZDA0OTczYjdjZWYy
14
+ YTgxZDgzNzhjZTJkMjEwZTM0YzVkN2UwNTdmNGI0MGE3Y2RkNzM1NDE2YzYy
15
+ Y2E2ZDZkZWFkYzJhOWRmNjI5YTRlMmJkYTM4N2E5ZTkyYzY0OWI=
data/.travis.yml CHANGED
@@ -3,7 +3,6 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
- - jruby-19mode
6
+ - 2.0.0
7
7
  - ruby-head
8
- - jruby-head
9
8
  script: bundle exec rake test
data/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ ## 0.1.1 / unreleased
2
+
3
+ ## 0.1.0 / 2013-03-01
4
+
5
+ * [Full Changelog](https://github.com/rmoriz/knife-digital_ocean/compare/v0.0.5...master)
6
+ * support for integrated ```knife-solo``` bootstrapping using the ```--solo``` option (by tmatilai)
7
+ * added basic rspec tests for various bootstrapping options
8
+ * remove JRuby from CI as chef itself does currently not work with JRuby
9
+ except when c-extensions are enabled (off by default)
10
+
11
+
12
+ ## 0.0.5 / 2013-02-23
13
+
14
+ * [Full Changelog](https://github.com/rmoriz/knife-digital_ocean/compare/v0.0.4...v0.0.5)
15
+
16
+
17
+ ## 0.0.4 / 2013-02-18
18
+
19
+ * [Full Changelog](https://github.com/rmoriz/knife-digital_ocean/compare/v0.0.3...v0.0.4)
20
+
21
+
22
+ ## 0.0.2 / 2013-02-04
23
+
24
+ * [Full Changelog](https://github.com/rmoriz/knife-digital_ocean/compare/v0.0.1...v0.0.2)
25
+
26
+
27
+ ## 0.0.1 / 2013-02-03
28
+
29
+ * [Full Changelog](https://github.com/rmoriz/knife-digital_ocean/compare/d9bd11c01c8d963a1214e7ab234eeb7f09e6a7eb...v0.0.1)
30
+ * First release
data/Guardfile ADDED
@@ -0,0 +1,24 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+
9
+ # Rails example
10
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
+ watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
13
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
14
+ watch('config/routes.rb') { "spec/routing" }
15
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
16
+
17
+ # Capybara features specs
18
+ watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
19
+
20
+ # Turnip features and steps
21
+ watch(%r{^spec/acceptance/(.+)\.feature$})
22
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
23
+ end
24
+
data/README.md CHANGED
@@ -1,16 +1,18 @@
1
1
  # Knife::DigitalOcean
2
2
  ## A knife plugin to deal with the [DigitalOcean.com](https://www.digitalocean.com) Cloud services.
3
3
 
4
+ [![Build Status](https://travis-ci.org/rmoriz/knife-digital_ocean.png)](https://travis-ci.org/rmoriz/knife-digital_ocean)
5
+ <a href="https://gemnasium.com/rmoriz/knife-digital_ocean"><img src="https://gemnasium.com/rmoriz/knife-digital_ocean.png"/></a>
6
+ <a href="https://codeclimate.com/github/rmoriz/knife-digital_ocean"><img src="https://codeclimate.com/github/rmoriz/knife-digital_ocean.png"/></a>
7
+
4
8
  This is a plugin for [Chef's](http://www.opscode.com/chef/) [knife](http://wiki.opscode.com/display/chef/Knife) tool. It allows you to bootstrap virtual machines with [DigitalOcean.com](https://www.digitalocean.com/) including the initial bootstrapping of chef on that system.
5
- You can also skip the chef bootstrapping if you prefer using [knife-solo](http://matschaffer.github.com/knife-solo/) or another solution.
9
+ You can also use [knife-solo](http://matschaffer.github.com/knife-solo/) for chef bootstrapping or skip it altogether for another solution.
6
10
 
7
11
  This knife plugin uses the [digital_ocean](https://github.com/rmoriz/digital_ocean) rubygem.
8
12
 
9
13
 
10
14
  ## Installation
11
15
 
12
- (chef needs to be installed upfront, of course)
13
-
14
16
  ```shell
15
17
  ➜ gem install knife-digital_ocean
16
18
  ```
@@ -21,7 +23,7 @@ This knife plugin uses the [digital_ocean](https://github.com/rmoriz/digital_oce
21
23
  This plugin provides the following sub-commands:
22
24
 
23
25
  * knife digital_ocean droplet create (options)
24
- **Creates a virtual machine with or without bootstrapping chef-client**
26
+ **Creates a virtual machine with or without bootstrapping chef**
25
27
 
26
28
  * knife digital_ocean droplet destroy (options)
27
29
  **Destroys the virtual machine and its data**
@@ -55,7 +57,13 @@ knife[:digital_ocean_api_key] = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'
55
57
 
56
58
  ### Create a Droplet
57
59
 
58
- #### With bootstrapping in an chef-server environment:
60
+ There are three different ways of creating a server/droplet instance:
61
+
62
+ If you just want to launch an instance
63
+ form the command line without any bootstrapping, go for option **C**.
64
+ If you use ```knife-solo``` try **B** and if you are a ```chef-server```-fan
65
+ use method **A**:
66
+ #### A. With bootstrapping in an chef-server environment:
59
67
 
60
68
  __Example__
61
69
 
@@ -93,9 +101,26 @@ __Short Syntax__
93
101
  -r "<RUNLIST>"
94
102
  ```
95
103
 
96
- #### With knife-solo, your custom external bootstrapping script or without chef at all
104
+ #### B. With knife-solo bootstrapping
97
105
 
98
- This will just create a droplet and return its IP-address. Nothing else. You can now run your custom solution to provision the droplet e.g. ```knife solo bootstrap <IP> ``` if you use knife-solo.
106
+ You need to have [knife-solo](http://matschaffer.github.com/knife-solo/) gem installed.
107
+
108
+ This will create a droplet and run `knife solo bootstrap <IP>` equivalent for it.
109
+
110
+ __Example__
111
+
112
+ ```bash
113
+ ➜ knife digital_ocean droplet create --server-name awesome-vm1.chef.io \
114
+ --image 25306 \
115
+ --location 2 \
116
+ --size 66 \
117
+ --ssh-keys 1234,4567 \
118
+ --solo
119
+ ```
120
+
121
+ #### C. With your custom external bootstrapping script or without chef at all
122
+
123
+ This will just create a droplet and return its IP-address. Nothing else. You can now run your custom solution to provision the droplet.
99
124
 
100
125
  __Example__
101
126
 
@@ -123,7 +148,7 @@ ID Name Size Region IPv4 Image
123
148
  OK
124
149
  ```
125
150
 
126
- ### List regions (servers)
151
+ ### List regions
127
152
 
128
153
  ```shell
129
154
  ➜ knife digital_ocean region list
@@ -132,7 +157,7 @@ ID Name
132
157
  2 Amsterdam 1
133
158
  ```
134
159
 
135
- ### List sizes (server types)
160
+ ### List sizes (instance types)
136
161
 
137
162
  ```shell
138
163
  ➜ knife digital_ocean size list
@@ -229,6 +254,11 @@ Commercial support is available. Please contact [https://roland.io/](https://rol
229
254
  4. Push to the branch (`git push origin my-new-feature`)
230
255
  5. Create new Pull Request
231
256
 
257
+ ### Contributors
258
+
259
+ * [Teemu Matilainen](https://github.com/tmatilai)
260
+
261
+ For more information and a complete list see [the contributor page on GitHub](https://github.com/rmoriz/knife-digital_ocean/contributors).
232
262
 
233
263
  ## License
234
264
 
@@ -16,14 +16,13 @@ Gem::Specification.new do |gem|
16
16
  gem.add_dependency 'chef', '>= 10.18'
17
17
  gem.add_dependency 'digital_ocean'
18
18
  gem.add_dependency 'highline'
19
- gem.add_dependency 'net-ssh-multi', '~> 1.1'
20
19
 
21
-
22
- gem.add_development_dependency 'rspec', '~> 2.0'
20
+ gem.add_development_dependency 'rspec', '~> 2.13'
23
21
  gem.add_development_dependency 'guard'
24
22
  gem.add_development_dependency 'guard-rspec'
25
23
  gem.add_development_dependency 'rb-fsevent'
26
24
  gem.add_development_dependency 'rake'
25
+ gem.add_development_dependency 'knife-solo'
27
26
 
28
27
  gem.files = `git ls-files`.split($/)
29
28
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -16,19 +16,28 @@ class Chef
16
16
  class Knife
17
17
  module DigitalOceanBase
18
18
 
19
+ def self.load_deps
20
+ require 'digital_ocean'
21
+ require 'highline'
22
+ end
23
+
19
24
  def self.included(includer)
20
25
  includer.class_eval do
21
26
  category 'digital_ocean'
22
27
 
23
- deps do
24
- require 'digital_ocean'
25
- require 'highline'
26
- require 'net/ssh/multi'
27
- require 'readline'
28
- require 'chef/json_compat'
29
- require 'chef/knife/bootstrap'
30
- Chef::Knife::Bootstrap.load_deps
31
- end
28
+ # Lazy load our dependencies. Later calls to `Knife#deps` override
29
+ # previous ones, so if the including class calls it, it needs to also
30
+ # call our #load_deps, i.e:
31
+ #
32
+ # Include Chef::Knife::DigitalOceanBase
33
+ #
34
+ # deps do
35
+ # require 'foo'
36
+ # require 'bar'
37
+ # Chef::Knife::DigitalOceanBase.load_deps
38
+ # end
39
+ #
40
+ deps { Chef::Knife::DigitalOceanBase.load_deps }
32
41
 
33
42
  option :digital_ocean_client_id,
34
43
  :short => '-K CLIENT_ID',
@@ -10,13 +10,23 @@
10
10
  # See the License for the specific language governing permissions and
11
11
  # limitations under the License.
12
12
  #
13
- require File.expand_path('../digital_ocean_base', __FILE__)
13
+ require 'chef/knife/digital_ocean_base'
14
14
 
15
15
  class Chef
16
16
  class Knife
17
17
  class DigitalOceanDropletCreate < Knife
18
18
  include Knife::DigitalOceanBase
19
19
 
20
+ deps do
21
+ require 'socket'
22
+ require 'chef/knife/bootstrap'
23
+ Chef::Knife::Bootstrap.load_deps
24
+ Chef::Knife::DigitalOceanBase.load_deps
25
+ # Knife loads subcommands automatically, so we can just check if the
26
+ # class exists.
27
+ Chef::Knife::SoloBootstrap.load_deps if defined? Chef::Knife::SoloBootstrap
28
+ end
29
+
20
30
  banner 'knife digital_ocean droplet create (options)'
21
31
 
22
32
  option :server_name,
@@ -58,8 +68,12 @@ class Chef
58
68
  option :bootstrap,
59
69
  :short => '-B',
60
70
  :long => '--bootstrap',
61
- :boolean => false,
62
- :description => 'Do a chef-client bootstrap on the create droplet (for use with chef-server)'
71
+ :description => 'Do a chef-client bootstrap on the created droplet (for use with chef-server)'
72
+
73
+ option :solo,
74
+ :long => '--[no-]solo',
75
+ :description => 'Do a chef-solo bootstrap on the droplet using knife-solo',
76
+ :proc => Proc.new { |s| Chef::Config[:knife][:solo] = s }
63
77
 
64
78
  option :ssh_user,
65
79
  :short => '-x USERNAME',
@@ -90,7 +104,6 @@ class Chef
90
104
  option :host_key_verify,
91
105
  :long => "--[no-]host-key-verify",
92
106
  :description => "Verify host key, enabled by default",
93
- :boolean => true,
94
107
  :default => true
95
108
 
96
109
  option :prerelease,
@@ -132,6 +145,15 @@ class Chef
132
145
  exit 1
133
146
  end
134
147
 
148
+ if solo_bootstrap? && !defined?(Chef::Knife::SoloBootstrap)
149
+ ui.error [
150
+ 'Knife plugin knife-solo was not found.',
151
+ 'Please add the knife-solo gem to your Gemfile or',
152
+ 'install it manually with `gem install knife-solo`.'
153
+ ].join(" ")
154
+ exit 1
155
+ end
156
+
135
157
  response = client.droplets.create(:name => locate_config_value(:server_name),
136
158
  :size_id => locate_config_value(:size),
137
159
  :image_id => locate_config_value(:image),
@@ -158,7 +180,7 @@ class Chef
158
180
  puts 'done'
159
181
  }
160
182
 
161
- if locate_config_value(:bootstrap)
183
+ if locate_config_value(:bootstrap) || solo_bootstrap?
162
184
  bootstrap_for_node(ip_address).run
163
185
  else
164
186
  puts ip_address
@@ -203,22 +225,24 @@ class Chef
203
225
  end
204
226
 
205
227
  def bootstrap_for_node(ip_address)
206
- bootstrap = Chef::Knife::Bootstrap.new
228
+ bootstrap = bootstrap_class.new
207
229
  bootstrap.name_args = [ ip_address ]
208
- bootstrap.config[:run_list] = config[:run_list]
209
- bootstrap.config[:ssh_user] = config[:ssh_user]
210
- bootstrap.config[:identity_file] = config[:identity_file]
230
+ bootstrap.config = config.dup
211
231
  bootstrap.config[:chef_node_name] = locate_config_value(:server_name)
212
- bootstrap.config[:prerelease] = config[:prerelease]
213
232
  bootstrap.config[:bootstrap_version] = locate_config_value(:bootstrap_version)
214
233
  bootstrap.config[:distro] = locate_config_value(:distro)
215
234
  bootstrap.config[:use_sudo] = true unless config[:ssh_user] == 'root'
216
235
  bootstrap.config[:template_file] = locate_config_value(:template_file)
217
- bootstrap.config[:environment] = config[:environment]
218
- bootstrap.config[:host_key_verify] = config[:host_key_verify]
219
236
  bootstrap
220
237
  end
221
238
 
239
+ def bootstrap_class
240
+ solo_bootstrap? ? Chef::Knife::SoloBootstrap : Chef::Knife::Bootstrap
241
+ end
242
+
243
+ def solo_bootstrap?
244
+ config[:solo] || (config[:solo].nil? && Chef::Config[:knife][:solo])
245
+ end
222
246
  end
223
247
  end
224
248
  end
@@ -10,7 +10,7 @@
10
10
  # See the License for the specific language governing permissions and
11
11
  # limitations under the License.
12
12
  #
13
- require File.expand_path('../digital_ocean_base', __FILE__)
13
+ require 'chef/knife/digital_ocean_base'
14
14
 
15
15
  class Chef
16
16
  class Knife
@@ -10,7 +10,7 @@
10
10
  # See the License for the specific language governing permissions and
11
11
  # limitations under the License.
12
12
  #
13
- require File.expand_path('../digital_ocean_base', __FILE__)
13
+ require 'chef/knife/digital_ocean_base'
14
14
 
15
15
  class Chef
16
16
  class Knife
@@ -10,7 +10,7 @@
10
10
  # See the License for the specific language governing permissions and
11
11
  # limitations under the License.
12
12
  #
13
- require File.expand_path('../digital_ocean_base', __FILE__)
13
+ require 'chef/knife/digital_ocean_base'
14
14
 
15
15
  class Chef
16
16
  class Knife
@@ -10,7 +10,7 @@
10
10
  # See the License for the specific language governing permissions and
11
11
  # limitations under the License.
12
12
  #
13
- require File.expand_path('../digital_ocean_base', __FILE__)
13
+ require 'chef/knife/digital_ocean_base'
14
14
 
15
15
  class Chef
16
16
  class Knife
@@ -10,7 +10,7 @@
10
10
  # See the License for the specific language governing permissions and
11
11
  # limitations under the License.
12
12
  #
13
- require File.expand_path('../digital_ocean_base', __FILE__)
13
+ require 'chef/knife/digital_ocean_base'
14
14
 
15
15
  class Chef
16
16
  class Knife
@@ -10,7 +10,7 @@
10
10
  # See the License for the specific language governing permissions and
11
11
  # limitations under the License.
12
12
  #
13
- require File.expand_path('../digital_ocean_base', __FILE__)
13
+ require 'chef/knife/digital_ocean_base'
14
14
 
15
15
  class Chef
16
16
  class Knife
@@ -1,5 +1,5 @@
1
1
  module Knife
2
2
  module DigitalOcean
3
- VERSION = '0.0.5'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+
3
+ def mock_api_response(data = {})
4
+ Hashie::Rash.new(data)
5
+ end
6
+
7
+ describe Chef::Knife::DigitalOceanDropletCreate do
8
+
9
+ subject {
10
+ s = Chef::Knife::DigitalOceanDropletCreate.new
11
+ s.stub(:client).and_return mock(DigitalOcean::API)
12
+ s
13
+ }
14
+
15
+ let(:config) {
16
+ {
17
+ :digital_ocean_client_id => 'CLIENT_ID',
18
+ :digital_ocean_api_key => 'API_KEY',
19
+ :server_name => 'sever-name.example.com',
20
+ :image => 11111,
21
+ :location => 22222,
22
+ :size => 33333,
23
+ :ssh_key_ids => [ 44444, 44445 ]
24
+ }
25
+ }
26
+
27
+ let(:custom_config) {
28
+ {}
29
+ }
30
+
31
+ let(:api_response) {
32
+ {
33
+ :status => 'OK',
34
+ :droplet => { :id => '123' }
35
+ }
36
+ }
37
+
38
+ before do
39
+ Chef::Knife::DigitalOceanDropletCreate.load_deps
40
+
41
+ # reset
42
+ Chef::Config[:knife] = {}
43
+
44
+ # config
45
+ config.merge(custom_config).each do |k, v|
46
+ Chef::Config[:knife][k] = v
47
+ end
48
+ end
49
+
50
+ context 'bootstrapping for chef-server' do
51
+ let(:custom_config) {
52
+ {
53
+ :bootstrap => true
54
+ }
55
+ }
56
+
57
+ describe 'should use the default bootstrap class' do
58
+ let(:subject) {
59
+ s = super()
60
+ s.client.stub_chain(:droplets, :create).and_return mock_api_response(api_response)
61
+ s.stub!(:ip_address_available).and_return '123.123.123.123'
62
+ s.stub!(:tcp_test_ssh).and_return true
63
+ s
64
+ }
65
+
66
+ it 'should use the right bootstrap class' do
67
+ subject.bootstrap_class.should eql(Chef::Knife::Bootstrap)
68
+ end
69
+
70
+ it 'should call #run on the bootstrap class' do
71
+ Chef::Knife::Bootstrap.any_instance.stub(:run)
72
+ lambda { subject.run }.should_not raise_error(SystemExit)
73
+ end
74
+ end
75
+ end
76
+
77
+ context 'bootstrapping for knife-solo' do
78
+
79
+ let(:custom_config) {
80
+ {
81
+ :solo => true
82
+ }
83
+ }
84
+
85
+ describe 'when knife-solo is installed' do
86
+ before do
87
+ # simulate installed knife-solo gem
88
+ require 'chef/knife/solo_bootstrap'
89
+ end
90
+
91
+ let(:subject) {
92
+ s = super()
93
+ s.client.stub_chain(:droplets, :create).and_return mock_api_response(api_response)
94
+ s.stub!(:ip_address_available).and_return '123.123.123.123'
95
+ s.stub!(:tcp_test_ssh).and_return true
96
+ s
97
+ }
98
+
99
+ it 'should use the right bootstrap class' do
100
+ subject.bootstrap_class.should eql(Chef::Knife::SoloBootstrap)
101
+ end
102
+
103
+ it 'should call #run on the bootstrap class' do
104
+ Chef::Knife::SoloBootstrap.any_instance.should_receive(:run)
105
+ Chef::Knife::Bootstrap.any_instance.should_not_receive(:run)
106
+ lambda { subject.run }.should_not raise_error(SystemExit)
107
+ end
108
+ end
109
+
110
+ describe 'when knife-solo is not installed' do
111
+ before do
112
+ # simulate knife-solo gem is not installed
113
+ Chef::Knife.send(:remove_const, :SoloBootstrap) if defined?(Chef::Knife::SoloBootstrap)
114
+ end
115
+
116
+ it 'should not create a droplet' do
117
+ subject.client.should_not_receive(:droplets)
118
+ lambda { subject.run }.should raise_error(SystemExit)
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ context 'no bootstrapping' do
125
+ let(:custom_config) {
126
+ {}
127
+ }
128
+
129
+ describe 'should not do any bootstrapping' do
130
+ let(:subject) {
131
+ s = super()
132
+ s.client.stub_chain(:droplets, :create).and_return mock_api_response(api_response)
133
+ s.stub!(:ip_address_available).and_return '123.123.123.123'
134
+ s.stub!(:tcp_test_ssh).and_return true
135
+ s
136
+ }
137
+
138
+ it 'should call #bootstrap_for_node' do
139
+ subject.should_not_receive(:bootstrap_for_node)
140
+ expect { subject.run }.to raise_error
141
+ end
142
+
143
+ it 'should have a 0 exit code' do
144
+ expect { subject.run }.to raise_error { |e|
145
+ e.status.should eql(0)
146
+ e.should be_a(SystemExit)
147
+ }
148
+ end
149
+ end
150
+ end
151
+ end
152
+
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chef::Knife::DigitalOceanDropletDestroy do
4
+ pending
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chef::Knife::DigitalOceanDropletList do
4
+ pending
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chef::Knife::DigitalOceanImageList do
4
+ pending
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chef::Knife::DigitalOceanRegionList do
4
+ pending
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chef::Knife::DigitalOceanSizeList do
4
+ pending
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chef::Knife::DigitalOceanSshkeyList do
4
+ pending
5
+ end
6
+
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Knife::DigitalOcean do
4
+ it 'should have a VERSION defined' do
5
+ described_class::VERSION.should_not be_empty
6
+ end
7
+ end
8
+
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,16 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
  require 'rspec/autorun'
3
- require 'knife-digital_ocean'
4
3
 
4
+ require 'digital_ocean'
5
+ require 'rash'
5
6
 
7
+ require 'chef/knife'
8
+ require 'chef/knife/digital_ocean_droplet_create'
9
+ require 'chef/knife/digital_ocean_droplet_destroy'
10
+ require 'chef/knife/digital_ocean_droplet_list'
11
+ require 'chef/knife/digital_ocean_image_list'
12
+ require 'chef/knife/digital_ocean_region_list'
13
+ require 'chef/knife/digital_ocean_size_list'
14
+ require 'chef/knife/digital_ocean_sshkey_list'
6
15
 
7
16
  Dir['./spec/support/**/*.rb'].sort.each {|f| require f}
8
-
9
-
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-digital_ocean
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Roland Moriz
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-23 00:00:00.000000000 Z
11
+ date: 2013-03-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: chef
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,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: digital_ocean
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
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
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: highline
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,47 +48,41 @@ dependencies:
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'
62
55
  - !ruby/object:Gem::Dependency
63
- name: net-ssh-multi
56
+ name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
69
- version: '1.1'
70
- type: :runtime
61
+ version: '2.13'
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
- version: '1.1'
68
+ version: '2.13'
78
69
  - !ruby/object:Gem::Dependency
79
- name: rspec
70
+ name: guard
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ~>
73
+ - - ! '>='
84
74
  - !ruby/object:Gem::Version
85
- version: '2.0'
75
+ version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ~>
80
+ - - ! '>='
92
81
  - !ruby/object:Gem::Version
93
- version: '2.0'
82
+ version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
- name: guard
84
+ name: guard-rspec
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,15 +90,13 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
- name: guard-rspec
98
+ name: rb-fsevent
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ! '>='
116
102
  - !ruby/object:Gem::Version
@@ -118,15 +104,13 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ! '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
- name: rb-fsevent
112
+ name: rake
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - ! '>='
132
116
  - !ruby/object:Gem::Version
@@ -134,15 +118,13 @@ dependencies:
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - ! '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
- name: rake
126
+ name: knife-solo
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
129
  - - ! '>='
148
130
  - !ruby/object:Gem::Version
@@ -150,7 +132,6 @@ dependencies:
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
136
  - - ! '>='
156
137
  - !ruby/object:Gem::Version
@@ -164,7 +145,9 @@ extra_rdoc_files: []
164
145
  files:
165
146
  - .gitignore
166
147
  - .travis.yml
148
+ - CHANGELOG.md
167
149
  - Gemfile
150
+ - Guardfile
168
151
  - LICENSE.txt
169
152
  - README.md
170
153
  - Rakefile
@@ -179,37 +162,46 @@ files:
179
162
  - lib/chef/knife/digital_ocean_sshkey_list.rb
180
163
  - lib/knife-digital_ocean.rb
181
164
  - lib/knife-digital_ocean/version.rb
165
+ - spec/lib/chef/knife/digital_ocean_droplet_create_spec.rb
166
+ - spec/lib/chef/knife/digital_ocean_droplet_destroy_spec.rb
167
+ - spec/lib/chef/knife/digital_ocean_droplet_list_spec.rb
168
+ - spec/lib/chef/knife/digital_ocean_image_list_spec.rb
169
+ - spec/lib/chef/knife/digital_ocean_region_list_spec.rb
170
+ - spec/lib/chef/knife/digital_ocean_size_list_spec.rb
171
+ - spec/lib/chef/knife/digital_ocean_sshkey_list_spec.rb
172
+ - spec/lib/knife-digital_ocean/version_spec.rb
182
173
  - spec/spec_helper.rb
183
174
  homepage: http://github.com/rmoriz/knife-digital_ocean
184
175
  licenses:
185
176
  - Apache 2.0
177
+ metadata: {}
186
178
  post_install_message:
187
179
  rdoc_options: []
188
180
  require_paths:
189
181
  - lib
190
182
  required_ruby_version: !ruby/object:Gem::Requirement
191
- none: false
192
183
  requirements:
193
184
  - - ! '>='
194
185
  - !ruby/object:Gem::Version
195
186
  version: '0'
196
- segments:
197
- - 0
198
- hash: -3898868140226600481
199
187
  required_rubygems_version: !ruby/object:Gem::Requirement
200
- none: false
201
188
  requirements:
202
189
  - - ! '>='
203
190
  - !ruby/object:Gem::Version
204
191
  version: '0'
205
- segments:
206
- - 0
207
- hash: -3898868140226600481
208
192
  requirements: []
209
193
  rubyforge_project:
210
- rubygems_version: 1.8.23
194
+ rubygems_version: 2.0.0
211
195
  signing_key:
212
- specification_version: 3
196
+ specification_version: 4
213
197
  summary: A plugin for chef's knife to manage instances of DigitalOcean servers
214
198
  test_files:
199
+ - spec/lib/chef/knife/digital_ocean_droplet_create_spec.rb
200
+ - spec/lib/chef/knife/digital_ocean_droplet_destroy_spec.rb
201
+ - spec/lib/chef/knife/digital_ocean_droplet_list_spec.rb
202
+ - spec/lib/chef/knife/digital_ocean_image_list_spec.rb
203
+ - spec/lib/chef/knife/digital_ocean_region_list_spec.rb
204
+ - spec/lib/chef/knife/digital_ocean_size_list_spec.rb
205
+ - spec/lib/chef/knife/digital_ocean_sshkey_list_spec.rb
206
+ - spec/lib/knife-digital_ocean/version_spec.rb
215
207
  - spec/spec_helper.rb