bosh_openstack_cpi 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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