bosh_openstack_cpi 0.0.2

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.
@@ -0,0 +1,35 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::Cloud do
6
+
7
+ it "deletes an OpenStack volume" do
8
+ volume = double("volume", :id => "v-foobar")
9
+
10
+ cloud = mock_cloud do |openstack|
11
+ openstack.volumes.should_receive(:get).with("v-foobar").and_return(volume)
12
+ end
13
+
14
+ volume.should_receive(:status).and_return(:available)
15
+ volume.should_receive(:destroy).and_return(true)
16
+ cloud.should_receive(:wait_resource).with(volume, :available, :deleted)
17
+
18
+ cloud.delete_disk("v-foobar")
19
+ end
20
+
21
+ it "doesn't delete an OpenStack volume unless it's state is `available'" do
22
+ volume = double("volume", :id => "v-foobar")
23
+
24
+ cloud = mock_cloud do |openstack|
25
+ openstack.volumes.should_receive(:get).with("v-foobar").and_return(volume)
26
+ end
27
+
28
+ volume.should_receive(:status).and_return(:busy)
29
+
30
+ expect {
31
+ cloud.delete_disk("v-foobar")
32
+ }.to raise_error(Bosh::Clouds::CloudError, "Cannot delete volume `v-foobar', state is busy")
33
+ end
34
+
35
+ end
@@ -0,0 +1,19 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::Cloud do
6
+
7
+ it "deregisters OpenStack image" do
8
+ image = double("image", :id => "i-foo")
9
+
10
+ cloud = mock_cloud do |openstack|
11
+ openstack.images.stub(:get).with("i-foo").and_return(image)
12
+ end
13
+
14
+ image.should_receive(:destroy)
15
+
16
+ cloud.delete_stemcell("i-foo")
17
+ end
18
+
19
+ end
@@ -0,0 +1,26 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::Cloud do
6
+
7
+ before(:each) do
8
+ @registry = mock_registry
9
+ end
10
+
11
+ it "deletes an OpenStack server" do
12
+ server = double("server", :id => "i-foobar", :name => "i-foobar")
13
+
14
+ cloud = mock_cloud do |openstack|
15
+ openstack.servers.should_receive(:get).with("i-foobar").and_return(server)
16
+ end
17
+
18
+ server.should_receive(:state).and_return(:active)
19
+ server.should_receive(:destroy).and_return(true)
20
+ cloud.should_receive(:wait_resource).with(server, :active, :terminated, :state)
21
+
22
+ @registry.should_receive(:delete_settings).with("i-foobar")
23
+
24
+ cloud.delete_vm("i-foobar")
25
+ end
26
+ end
@@ -0,0 +1,67 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::Cloud do
6
+
7
+ before(:each) do
8
+ @registry = mock_registry
9
+ end
10
+
11
+ it "detaches an OpenStack volume from a server" do
12
+ server = double("server", :id => "i-test", :name => "i-test")
13
+ volume = double("volume", :id => "v-foobar")
14
+ volume_attachments = double("body", :body => {"volumeAttachments" => [{"volumeId" => "v-foobar"}, {"volumeId" => "v-barfoo"}]})
15
+
16
+ cloud = mock_cloud do |openstack|
17
+ openstack.servers.should_receive(:get).with("i-test").and_return(server)
18
+ openstack.volumes.should_receive(:get).with("v-foobar").and_return(volume)
19
+ openstack.should_receive(:get_server_volumes).and_return(volume_attachments)
20
+ end
21
+
22
+ volume.should_receive(:status).and_return(:"in-use")
23
+ volume.should_receive(:detach).with(server.id, "v-foobar").and_return(true)
24
+ cloud.should_receive(:wait_resource).with(volume, :"in-use", :available)
25
+
26
+ old_settings = {
27
+ "foo" => "bar",
28
+ "disks" => {
29
+ "persistent" => {
30
+ "v-foobar" => "/dev/vdc",
31
+ "v-barfoo" => "/dev/vdd"
32
+ }
33
+ }
34
+ }
35
+
36
+ new_settings = {
37
+ "foo" => "bar",
38
+ "disks" => {
39
+ "persistent" => {
40
+ "v-barfoo" => "/dev/vdd"
41
+ }
42
+ }
43
+ }
44
+
45
+ @registry.should_receive(:read_settings).with("i-test").and_return(old_settings)
46
+ @registry.should_receive(:update_settings).with("i-test", new_settings)
47
+
48
+ cloud.detach_disk("i-test", "v-foobar")
49
+ end
50
+
51
+ it "raises an error when volume is not attached to a server" do
52
+ server = double("server", :id => "i-test", :name => "i-test")
53
+ volume = double("volume", :id => "v-barfoo")
54
+ volume_attachments = double("body", :body => {"volumeAttachments" => [{"volumeId" => "v-foobar"}]})
55
+
56
+ cloud = mock_cloud do |openstack|
57
+ openstack.servers.should_receive(:get).with("i-test").and_return(server)
58
+ openstack.volumes.should_receive(:get).with("v-barfoo").and_return(volume)
59
+ openstack.should_receive(:get_server_volumes).and_return(volume_attachments)
60
+ end
61
+
62
+ expect {
63
+ cloud.detach_disk("i-test", "v-barfoo")
64
+ }.to raise_error(Bosh::Clouds::CloudError, /is not attached to server/)
65
+ end
66
+
67
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::Helpers do
6
+ it "should time out" do
7
+ cloud = mock_cloud
8
+
9
+ resource = double("resource")
10
+ resource.stub(:id).and_return("foobar")
11
+ resource.stub(:reload).and_return(cloud)
12
+ resource.stub(:status).and_return(:start)
13
+ cloud.stub(:sleep)
14
+
15
+ lambda {
16
+ cloud.wait_resource(resource, :start, :stop, :status, 0.1)
17
+ }.should raise_error Bosh::Clouds::CloudError, /Timed out/
18
+ end
19
+
20
+ it "should not time out" do
21
+ cloud = mock_cloud
22
+
23
+ resource = double("resource")
24
+ resource.stub(:id).and_return("foobar")
25
+ resource.stub(:reload).and_return(cloud)
26
+ resource.stub(:status).and_return(:start, :stop)
27
+ cloud.stub(:sleep)
28
+
29
+ lambda {
30
+ cloud.wait_resource(resource, :start, :stop, :status, 0.1)
31
+ }.should_not raise_error Bosh::Clouds::CloudError
32
+ end
33
+
34
+ end
@@ -0,0 +1,57 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::NetworkConfigurator do
6
+
7
+ def set_security_groups(spec, security_groups)
8
+ spec["cloud_properties"] = {
9
+ "security_groups" => security_groups
10
+ }
11
+ end
12
+
13
+ it "should raise an error if the spec isn't a hash" do
14
+ lambda {
15
+ Bosh::OpenStackCloud::NetworkConfigurator.new("foo")
16
+ }.should raise_error ArgumentError
17
+ end
18
+
19
+ describe "security groups" do
20
+ it "should only be extracted from dynamic network" do
21
+ spec = {}
22
+ spec["network_a"] = dynamic_network_spec
23
+ set_security_groups(spec["network_a"], %w[foo])
24
+ spec["network_b"] = vip_network_spec
25
+ set_security_groups(spec["network_b"], %w[bar])
26
+
27
+ nc = Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
28
+ nc.security_groups(nil).should == %w[foo]
29
+ end
30
+
31
+ it "should return the default groups if none are extracted" do
32
+ spec = {}
33
+ spec["network_a"] = dynamic_network_spec
34
+
35
+ nc = Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
36
+ nc.security_groups(%w[foo]).should == %w[foo]
37
+ end
38
+
39
+ it "should return an empty list if no default group is set" do
40
+ spec = {}
41
+ spec["network_a"] = dynamic_network_spec
42
+
43
+ nc = Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
44
+ nc.security_groups(nil).should == []
45
+ end
46
+
47
+ it "should raise an error when it isn't an array" do
48
+ spec = {}
49
+ spec["network_a"] = dynamic_network_spec
50
+ set_security_groups(spec["network_a"], "foo")
51
+
52
+ lambda {
53
+ Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
54
+ }.should raise_error ArgumentError, "security groups must be an Array"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::Cloud do
6
+
7
+ before :each do
8
+ @server = double("server", :id => "i-foobar")
9
+
10
+ @cloud = mock_cloud(mock_cloud_options) do |openstack|
11
+ openstack.servers.stub(:get).with("i-foobar").and_return(@server)
12
+ end
13
+ end
14
+
15
+ it "reboots an OpenStack server (CPI call picks soft reboot)" do
16
+ @cloud.should_receive(:soft_reboot).with(@server)
17
+ @cloud.reboot_vm("i-foobar")
18
+ end
19
+
20
+ it "soft reboots an OpenStack server" do
21
+ @server.should_receive(:reboot)
22
+ @server.should_receive(:state).and_return(:reboot)
23
+ @cloud.should_receive(:wait_resource).with(@server, :reboot, :active, :state)
24
+ @cloud.send(:soft_reboot, @server)
25
+ end
26
+
27
+ it "hard reboots an OpenStack server" do
28
+ @server.should_receive(:reboot)
29
+ @server.should_receive(:state).and_return(:reboot)
30
+ @cloud.should_receive(:wait_resource).with(@server, :reboot, :active, :state)
31
+ @cloud.send(:hard_reboot, @server)
32
+ end
33
+
34
+ end
@@ -0,0 +1,16 @@
1
+ # Copyright (c) 2012 Piston Cloud Computing, Inc.
2
+
3
+ require File.expand_path("../../spec_helper", __FILE__)
4
+
5
+ describe Bosh::OpenStackCloud::Cloud do
6
+
7
+ it "doesn't implement `validate_deployment'" do
8
+ Fog::Compute.stub(:new)
9
+ Fog::Image.stub(:new)
10
+ cloud = make_cloud
11
+ expect {
12
+ cloud.validate_deployment({}, {})
13
+ }.to raise_error(Bosh::Clouds::NotImplemented, "`validate_deployment' is not implemented by Bosh::OpenStackCloud::Cloud")
14
+ end
15
+
16
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bosh_openstack_cpi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Piston Cloud Computing
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: fog
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.4.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.4.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: bosh_common
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.4.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.4.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: bosh_cpi
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.4.3
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.4.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: httpclient
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 2.2.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 2.2.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: uuidtools
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 2.1.2
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 2.1.2
94
+ - !ruby/object:Gem::Dependency
95
+ name: yajl-ruby
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: 0.8.2
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 0.8.2
110
+ description: BOSH OpenStack CPI
111
+ email: info@pistoncloud.com
112
+ executables:
113
+ - bosh_openstack_console
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - bin/bosh_openstack_console
118
+ - lib/bosh_openstack_cpi.rb
119
+ - lib/cloud/openstack.rb
120
+ - lib/cloud/openstack/cloud.rb
121
+ - lib/cloud/openstack/dynamic_network.rb
122
+ - lib/cloud/openstack/helpers.rb
123
+ - lib/cloud/openstack/network.rb
124
+ - lib/cloud/openstack/network_configurator.rb
125
+ - lib/cloud/openstack/registry_client.rb
126
+ - lib/cloud/openstack/version.rb
127
+ - lib/cloud/openstack/vip_network.rb
128
+ - README.md
129
+ - Rakefile
130
+ - spec/spec_helper.rb
131
+ - spec/unit/attach_disk_spec.rb
132
+ - spec/unit/cloud_spec.rb
133
+ - spec/unit/configure_networks_spec.rb
134
+ - spec/unit/create_disk_spec.rb
135
+ - spec/unit/create_stemcell_spec.rb
136
+ - spec/unit/create_vm_spec.rb
137
+ - spec/unit/delete_disk_spec.rb
138
+ - spec/unit/delete_stemcell_spec.rb
139
+ - spec/unit/delete_vm_spec.rb
140
+ - spec/unit/detach_disk_spec.rb
141
+ - spec/unit/helpers_spec.rb
142
+ - spec/unit/network_configurator_spec.rb
143
+ - spec/unit/reboot_vm_spec.rb
144
+ - spec/unit/validate_deployment_spec.rb
145
+ homepage: http://www.pistoncloud.com
146
+ licenses: []
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ segments:
158
+ - 0
159
+ hash: -5012446851796113
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ segments:
167
+ - 0
168
+ hash: -5012446851796113
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 1.8.24
172
+ signing_key:
173
+ specification_version: 3
174
+ summary: BOSH OpenStack CPI
175
+ test_files:
176
+ - spec/spec_helper.rb
177
+ - spec/unit/attach_disk_spec.rb
178
+ - spec/unit/cloud_spec.rb
179
+ - spec/unit/configure_networks_spec.rb
180
+ - spec/unit/create_disk_spec.rb
181
+ - spec/unit/create_stemcell_spec.rb
182
+ - spec/unit/create_vm_spec.rb
183
+ - spec/unit/delete_disk_spec.rb
184
+ - spec/unit/delete_stemcell_spec.rb
185
+ - spec/unit/delete_vm_spec.rb
186
+ - spec/unit/detach_disk_spec.rb
187
+ - spec/unit/helpers_spec.rb
188
+ - spec/unit/network_configurator_spec.rb
189
+ - spec/unit/reboot_vm_spec.rb
190
+ - spec/unit/validate_deployment_spec.rb