bosh_openstack_cpi 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -26,7 +26,7 @@ describe Bosh::OpenStackCloud::Cloud, "create_vm" do
26
26
 
27
27
  def openstack_params(unique_name, user_data, security_groups=[])
28
28
  {
29
- :name=>"vm-#{unique_name}",
29
+ :name => "vm-#{unique_name}",
30
30
  :image_ref => "sc-id",
31
31
  :flavor_ref => "f-test",
32
32
  :key_name => "test_key",
@@ -53,10 +53,13 @@ describe Bosh::OpenStackCloud::Cloud, "create_vm" do
53
53
  server = double("server", :id => "i-test", :name => "i-test")
54
54
  image = double("image", :id => "sc-id", :name => "sc-id")
55
55
  flavor = double("flavor", :id => "f-test", :name => "m1.tiny")
56
- address = double("address", :id => "a-test", :ip => "10.0.0.1", :instance_id => "i-test")
56
+ address = double("address", :id => "a-test", :ip => "10.0.0.1",
57
+ :instance_id => "i-test")
57
58
 
58
59
  cloud = mock_cloud do |openstack|
59
- openstack.servers.should_receive(:create).with(openstack_params(unique_name, user_data)).and_return(server)
60
+ openstack.servers.should_receive(:create).
61
+ with(openstack_params(unique_name, user_data, %w[default])).
62
+ and_return(server)
60
63
  openstack.images.should_receive(:find).and_return(image)
61
64
  openstack.flavors.should_receive(:find).and_return(flavor)
62
65
  openstack.addresses.should_receive(:each).and_yield(address)
@@ -64,10 +67,10 @@ describe Bosh::OpenStackCloud::Cloud, "create_vm" do
64
67
 
65
68
  cloud.should_receive(:generate_unique_name).and_return(unique_name)
66
69
  address.should_receive(:server=).with(nil)
67
- server.should_receive(:state).and_return(:build)
68
- cloud.should_receive(:wait_resource).with(server, :build, :active, :state)
70
+ cloud.should_receive(:wait_resource).with(server, :active, :state)
69
71
 
70
- @registry.should_receive(:update_settings).with("i-test", agent_settings(unique_name))
72
+ @registry.should_receive(:update_settings).
73
+ with("i-test", agent_settings(unique_name))
71
74
 
72
75
  vm_id = cloud.create_vm("agent-id", "sc-id",
73
76
  resource_pool_spec,
@@ -86,26 +89,29 @@ describe Bosh::OpenStackCloud::Cloud, "create_vm" do
86
89
  "name" => "vm-#{unique_name}"
87
90
  }
88
91
  }
89
- security_groups = %w[foo bar]
92
+ security_groups = %w[bar foo]
90
93
  network_spec = dynamic_network_spec
91
94
  network_spec["cloud_properties"] = { "security_groups" => security_groups }
92
95
  server = double("server", :id => "i-test", :name => "i-test")
93
96
  image = double("image", :id => "sc-id", :name => "sc-id")
94
97
  flavor = double("flavor", :id => "f-test", :name => "m1.tiny")
95
- address = double("address", :id => "a-test", :ip => "10.0.0.1", :instance_id => nil)
98
+ address = double("address", :id => "a-test", :ip => "10.0.0.1",
99
+ :instance_id => nil)
96
100
 
97
101
  cloud = mock_cloud do |openstack|
98
- openstack.servers.should_receive(:create).with(openstack_params(unique_name, user_data, security_groups)).and_return(server)
102
+ openstack.servers.should_receive(:create).
103
+ with(openstack_params(unique_name, user_data, security_groups)).
104
+ and_return(server)
99
105
  openstack.images.should_receive(:find).and_return(image)
100
106
  openstack.flavors.should_receive(:find).and_return(flavor)
101
107
  openstack.addresses.should_receive(:each).and_yield(address)
102
108
  end
103
109
 
104
110
  cloud.should_receive(:generate_unique_name).and_return(unique_name)
105
- server.should_receive(:state).and_return(:build)
106
- cloud.should_receive(:wait_resource).with(server, :build, :active, :state)
111
+ cloud.should_receive(:wait_resource).with(server, :active, :state)
107
112
 
108
- @registry.should_receive(:update_settings).with("i-test", agent_settings(unique_name, network_spec))
113
+ @registry.should_receive(:update_settings).
114
+ with("i-test", agent_settings(unique_name, network_spec))
109
115
 
110
116
  vm_id = cloud.create_vm("agent-id", "sc-id",
111
117
  resource_pool_spec,
@@ -118,19 +124,19 @@ describe Bosh::OpenStackCloud::Cloud, "create_vm" do
118
124
  server = double("server", :id => "i-test", :name => "i-test")
119
125
  image = double("image", :id => "sc-id", :name => "sc-id")
120
126
  flavor = double("flavor", :id => "f-test", :name => "m1.tiny")
121
- address = double("address", :id => "a-test", :ip => "10.0.0.1", :instance_id => "i-test")
127
+ address = double("address", :id => "a-test", :ip => "10.0.0.1",
128
+ :instance_id => "i-test")
122
129
 
123
130
  cloud = mock_cloud do |openstack|
124
131
  openstack.servers.should_receive(:create).and_return(server)
125
132
  openstack.images.should_receive(:find).and_return(image)
126
133
  openstack.flavors.should_receive(:find).and_return(flavor)
127
- openstack.addresses.should_receive(:each).and_yield(address)
134
+ openstack.addresses.should_receive(:find).and_return(address)
128
135
  end
129
136
 
130
137
  address.should_receive(:server=).with(nil)
131
138
  address.should_receive(:server=).with(server)
132
- server.should_receive(:state).and_return(:build)
133
- cloud.should_receive(:wait_resource).with(server, :build, :active, :state)
139
+ cloud.should_receive(:wait_resource).with(server, :active, :state)
134
140
 
135
141
  @registry.should_receive(:update_settings)
136
142
 
@@ -139,4 +145,62 @@ describe Bosh::OpenStackCloud::Cloud, "create_vm" do
139
145
  combined_network_spec)
140
146
  end
141
147
 
148
+ def volume(zone)
149
+ vol = double("volume")
150
+ vol.stub(:availability_zone).and_return(zone)
151
+ vol
152
+ end
153
+
154
+ describe "#select_availability_zone" do
155
+ it "should return nil when all values are nil" do
156
+ cloud = mock_cloud
157
+ cloud.select_availability_zone(nil, nil).should == nil
158
+ end
159
+
160
+ it "should select the resource pool availability_zone when disks are nil" do
161
+ cloud = mock_cloud
162
+ cloud.select_availability_zone(nil, "foobar-1a").should == "foobar-1a"
163
+ end
164
+
165
+ it "should select the zone from a list of disks" do
166
+ cloud = mock_cloud do |openstack|
167
+ openstack.volumes.stub(:get).and_return(volume("foo"), volume("foo"))
168
+ end
169
+ cloud.select_availability_zone(%w[cid1 cid2], nil).should == "foo"
170
+ end
171
+
172
+ it "should select the zone from a list of disks and a default" do
173
+ cloud = mock_cloud do |openstack|
174
+ openstack.volumes.stub(:get).and_return(volume("foo"), volume("foo"))
175
+ end
176
+ cloud.select_availability_zone(%w[cid1 cid2], "foo").should == "foo"
177
+ end
178
+ end
179
+
180
+ describe "#ensure_same_availability_zone" do
181
+ it "should raise an error when the zones differ" do
182
+ cloud = mock_cloud
183
+ expect {
184
+ cloud.ensure_same_availability_zone([volume("foo"), volume("bar")],
185
+ nil)
186
+ }.to raise_error Bosh::Clouds::CloudError
187
+ end
188
+
189
+ it "should raise an error when the zones differ" do
190
+ cloud = mock_cloud
191
+ expect {
192
+ cloud.ensure_same_availability_zone([volume("foo"), volume("bar")],
193
+ "foo")
194
+ }.to raise_error Bosh::Clouds::CloudError
195
+ end
196
+
197
+ it "should raise an error when the zones differ" do
198
+ cloud = mock_cloud
199
+ expect {
200
+ cloud.ensure_same_availability_zone([volume("foo"), volume("foo")],
201
+ "bar")
202
+ }.to raise_error Bosh::Clouds::CloudError
203
+ end
204
+ end
205
+
142
206
  end
@@ -8,12 +8,13 @@ describe Bosh::OpenStackCloud::Cloud do
8
8
  volume = double("volume", :id => "v-foobar")
9
9
 
10
10
  cloud = mock_cloud do |openstack|
11
- openstack.volumes.should_receive(:get).with("v-foobar").and_return(volume)
11
+ openstack.volumes.should_receive(:get).
12
+ with("v-foobar").and_return(volume)
12
13
  end
13
14
 
14
15
  volume.should_receive(:status).and_return(:available)
15
16
  volume.should_receive(:destroy).and_return(true)
16
- cloud.should_receive(:wait_resource).with(volume, :available, :deleted)
17
+ cloud.should_receive(:wait_resource).with(volume, :deleted, :status, true)
17
18
 
18
19
  cloud.delete_disk("v-foobar")
19
20
  end
@@ -29,7 +30,8 @@ describe Bosh::OpenStackCloud::Cloud do
29
30
 
30
31
  expect {
31
32
  cloud.delete_disk("v-foobar")
32
- }.to raise_error(Bosh::Clouds::CloudError, "Cannot delete volume `v-foobar', state is busy")
33
+ }.to raise_error(Bosh::Clouds::CloudError,
34
+ "Cannot delete volume `v-foobar', state is busy")
33
35
  end
34
36
 
35
37
  end
@@ -4,7 +4,7 @@ require File.expand_path("../../spec_helper", __FILE__)
4
4
 
5
5
  describe Bosh::OpenStackCloud::Cloud do
6
6
 
7
- it "deregisters OpenStack image with no kernel nor ramdisk associated" do
7
+ it "deletes stemcell (only image)" do
8
8
  image = double("image", :id => "i-foo", :name => "i-foo",
9
9
  :properties => {})
10
10
 
@@ -17,11 +17,14 @@ describe Bosh::OpenStackCloud::Cloud do
17
17
  cloud.delete_stemcell("i-foo")
18
18
  end
19
19
 
20
- it "deregisters OpenStack image, kernel and ramdisk" do
20
+ it "deletes stemcell (image, kernel and ramdisk)" do
21
21
  image = double("image", :id => "i-foo", :name => "i-foo",
22
- :properties => {"kernel_id" => "k-id", "ramdisk_id" => "r-id"})
23
- kernel = double("image", :id => "k-id", :properties => {"stemcell" => "i-foo"})
24
- ramdisk = double("image", :id => "r-id", :properties => {"stemcell" => "i-foo"})
22
+ :properties => {"kernel_id" => "k-id",
23
+ "ramdisk_id" => "r-id"})
24
+ kernel = double("image", :id => "k-id",
25
+ :properties => {"stemcell" => "i-foo"})
26
+ ramdisk = double("image", :id => "r-id",
27
+ :properties => {"stemcell" => "i-foo"})
25
28
 
26
29
  cloud = mock_glance do |glance|
27
30
  glance.images.stub(:find_by_id).with("i-foo").and_return(image)
@@ -36,9 +39,10 @@ describe Bosh::OpenStackCloud::Cloud do
36
39
  cloud.delete_stemcell("i-foo")
37
40
  end
38
41
 
39
- it "deregisters OpenStack image with kernel and ramdisk not uploaded by the CPI" do
42
+ it "deletes stemcell (kernel and ramdisk not uploaded by the CPI)" do
40
43
  image = double("image", :id => "i-foo", :name => "i-foo",
41
- :properties => {"kernel_id" => "k-id", "ramdisk_id" => "r-id"})
44
+ :properties => {"kernel_id" => "k-id",
45
+ "ramdisk_id" => "r-id"})
42
46
  kernel = double("image", :id => "k-id", :properties => {})
43
47
  ramdisk = double("image", :id => "r-id", :properties => {})
44
48
 
@@ -53,11 +57,14 @@ describe Bosh::OpenStackCloud::Cloud do
53
57
  cloud.delete_stemcell("i-foo")
54
58
  end
55
59
 
56
- it "deregisters OpenStack image with kernel and ramdisk that belongs to other stemcell" do
60
+ it "deletes stemcell (kernel and ramdisk that do not belong to stemcell)" do
57
61
  image = double("image", :id => "i-foo", :name => "i-foo",
58
- :properties => {"kernel_id" => "k-id", "ramdisk_id" => "r-id"})
59
- kernel = double("image", :id => "k-id", :properties => {"stemcell" => "i-bar"})
60
- ramdisk = double("image", :id => "r-id", :properties => {"stemcell" => "i-bar"})
62
+ :properties => {"kernel_id" => "k-id",
63
+ "ramdisk_id" => "r-id"})
64
+ kernel = double("image", :id => "k-id",
65
+ :properties => {"stemcell" => "i-bar"})
66
+ ramdisk = double("image", :id => "r-id",
67
+ :properties => {"stemcell" => "i-bar"})
61
68
 
62
69
  cloud = mock_glance do |glance|
63
70
  glance.images.stub(:find_by_id).with("i-foo").and_return(image)
@@ -15,9 +15,8 @@ describe Bosh::OpenStackCloud::Cloud do
15
15
  openstack.servers.should_receive(:get).with("i-foobar").and_return(server)
16
16
  end
17
17
 
18
- server.should_receive(:state).and_return(:active)
19
18
  server.should_receive(:destroy).and_return(true)
20
- cloud.should_receive(:wait_resource).with(server, :active, :terminated, :state)
19
+ cloud.should_receive(:wait_resource).with(server, :terminated, :state, true)
21
20
 
22
21
  @registry.should_receive(:delete_settings).with("i-foobar")
23
22
 
@@ -11,17 +11,21 @@ describe Bosh::OpenStackCloud::Cloud do
11
11
  it "detaches an OpenStack volume from a server" do
12
12
  server = double("server", :id => "i-test", :name => "i-test")
13
13
  volume = double("volume", :id => "v-foobar")
14
- volume_attachments = double("body", :body => {"volumeAttachments" => [{"volumeId" => "v-foobar"}, {"volumeId" => "v-barfoo"}]})
14
+ volume_attachments = double("body", :body => {"volumeAttachments" =>
15
+ [{"volumeId" => "v-foobar"},
16
+ {"volumeId" => "v-barfoo"}]})
15
17
 
16
18
  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)
19
+ openstack.servers.should_receive(:get).
20
+ with("i-test").and_return(server)
21
+ openstack.volumes.should_receive(:get).
22
+ with("v-foobar").and_return(volume)
23
+ openstack.should_receive(:get_server_volumes).
24
+ and_return(volume_attachments)
20
25
  end
21
26
 
22
- volume.should_receive(:status).and_return(:"in-use")
23
27
  volume.should_receive(:detach).with(server.id, "v-foobar").and_return(true)
24
- cloud.should_receive(:wait_resource).with(volume, :"in-use", :available)
28
+ cloud.should_receive(:wait_resource).with(volume, :available)
25
29
 
26
30
  old_settings = {
27
31
  "foo" => "bar",
@@ -42,8 +46,10 @@ describe Bosh::OpenStackCloud::Cloud do
42
46
  }
43
47
  }
44
48
 
45
- @registry.should_receive(:read_settings).with("i-test").and_return(old_settings)
46
- @registry.should_receive(:update_settings).with("i-test", new_settings)
49
+ @registry.should_receive(:read_settings).
50
+ with("i-test").and_return(old_settings)
51
+ @registry.should_receive(:update_settings).
52
+ with("i-test", new_settings)
47
53
 
48
54
  cloud.detach_disk("i-test", "v-foobar")
49
55
  end
@@ -51,12 +57,17 @@ describe Bosh::OpenStackCloud::Cloud do
51
57
  it "raises an error when volume is not attached to a server" do
52
58
  server = double("server", :id => "i-test", :name => "i-test")
53
59
  volume = double("volume", :id => "v-barfoo")
54
- volume_attachments = double("body", :body => {"volumeAttachments" => [{"volumeId" => "v-foobar"}]})
60
+ volume_attachments = double("body",
61
+ :body => {"volumeAttachments" =>
62
+ [{"volumeId" => "v-foobar"}]})
55
63
 
56
64
  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)
65
+ openstack.servers.should_receive(:get).
66
+ with("i-test").and_return(server)
67
+ openstack.volumes.should_receive(:get).
68
+ with("v-barfoo").and_return(volume)
69
+ openstack.should_receive(:get_server_volumes).
70
+ and_return(volume_attachments)
60
71
  end
61
72
 
62
73
  expect {
@@ -3,6 +3,10 @@
3
3
  require File.expand_path("../../spec_helper", __FILE__)
4
4
 
5
5
  describe Bosh::OpenStackCloud::Helpers do
6
+ before(:each) do
7
+ Bosh::Clouds::Config.stub(:task_checkpoint)
8
+ end
9
+
6
10
  it "should time out" do
7
11
  cloud = mock_cloud
8
12
 
@@ -12,9 +16,9 @@ describe Bosh::OpenStackCloud::Helpers do
12
16
  resource.stub(:status).and_return(:start)
13
17
  cloud.stub(:sleep)
14
18
 
15
- lambda {
16
- cloud.wait_resource(resource, :start, :stop, :status, 0.1)
17
- }.should raise_error Bosh::Clouds::CloudError, /Timed out/
19
+ expect {
20
+ cloud.wait_resource(resource, :stop, :status, false, 0.1)
21
+ }.to raise_error Bosh::Clouds::CloudError, /Timed out/
18
22
  end
19
23
 
20
24
  it "should not time out" do
@@ -26,9 +30,45 @@ describe Bosh::OpenStackCloud::Helpers do
26
30
  resource.stub(:status).and_return(:start, :stop)
27
31
  cloud.stub(:sleep)
28
32
 
29
- lambda {
30
- cloud.wait_resource(resource, :start, :stop, :status, 0.1)
31
- }.should_not raise_error Bosh::Clouds::CloudError
33
+ cloud.wait_resource(resource, :stop, :status, false, 0.1)
34
+ end
35
+
36
+ it "should raise Bosh::Clouds::CloudError if state is error" do
37
+ cloud = mock_cloud
38
+
39
+ resource = double("resource")
40
+ resource.stub(:id).and_return("foobar")
41
+ resource.stub(:reload).and_return(cloud)
42
+ resource.stub(:status).and_return(:error)
43
+ cloud.stub(:sleep)
44
+
45
+ expect {
46
+ cloud.wait_resource(resource, :stop, :status, false, 0.1)
47
+ }.to raise_error Bosh::Clouds::CloudError, /state is error/
48
+ end
49
+
50
+ it "should raise Bosh::Clouds::CloudError if resource not found" do
51
+ cloud = mock_cloud
52
+
53
+ resource = double("resource")
54
+ resource.stub(:id).and_return("foobar")
55
+ resource.stub(:reload).and_return(nil)
56
+ cloud.stub(:sleep)
57
+
58
+ expect {
59
+ cloud.wait_resource(resource, :deleted, :status, false, 0.1)
60
+ }.to raise_error Bosh::Clouds::CloudError, /Resource not found/
32
61
  end
33
62
 
63
+ it "should not raise and exception if resource not found" do
64
+ cloud = mock_cloud
65
+
66
+ resource = double("resource")
67
+ resource.stub(:id).and_return("foobar")
68
+ resource.stub(:reload).and_return(nil)
69
+ resource.stub(:status).and_return(:deleted)
70
+ cloud.stub(:sleep)
71
+
72
+ cloud.wait_resource(resource, :deleted, :status, true, 0.1)
73
+ end
34
74
  end
@@ -11,13 +11,13 @@ describe Bosh::OpenStackCloud::NetworkConfigurator do
11
11
  end
12
12
 
13
13
  it "should raise an error if the spec isn't a hash" do
14
- lambda {
14
+ expect {
15
15
  Bosh::OpenStackCloud::NetworkConfigurator.new("foo")
16
- }.should raise_error ArgumentError
16
+ }.to raise_error ArgumentError
17
17
  end
18
18
 
19
19
  describe "security groups" do
20
- it "should only be extracted from dynamic network" do
20
+ it "should be extracted from both dynamic and vip network" do
21
21
  spec = {}
22
22
  spec["network_a"] = dynamic_network_spec
23
23
  set_security_groups(spec["network_a"], %w[foo])
@@ -25,12 +25,12 @@ describe Bosh::OpenStackCloud::NetworkConfigurator do
25
25
  set_security_groups(spec["network_b"], %w[bar])
26
26
 
27
27
  nc = Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
28
- nc.security_groups(nil).should == %w[foo]
28
+ nc.security_groups(nil).should == %w[bar foo]
29
29
  end
30
30
 
31
31
  it "should return the default groups if none are extracted" do
32
32
  spec = {}
33
- spec["network_a"] = dynamic_network_spec
33
+ spec["network_a"] = {"type" => "dynamic"}
34
34
 
35
35
  nc = Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
36
36
  nc.security_groups(%w[foo]).should == %w[foo]
@@ -38,7 +38,7 @@ describe Bosh::OpenStackCloud::NetworkConfigurator do
38
38
 
39
39
  it "should return an empty list if no default group is set" do
40
40
  spec = {}
41
- spec["network_a"] = dynamic_network_spec
41
+ spec["network_a"] = {"type" => "dynamic"}
42
42
 
43
43
  nc = Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
44
44
  nc.security_groups(nil).should == []
@@ -49,9 +49,9 @@ describe Bosh::OpenStackCloud::NetworkConfigurator do
49
49
  spec["network_a"] = dynamic_network_spec
50
50
  set_security_groups(spec["network_a"], "foo")
51
51
 
52
- lambda {
52
+ expect {
53
53
  Bosh::OpenStackCloud::NetworkConfigurator.new(spec)
54
- }.should raise_error ArgumentError, "security groups must be an Array"
54
+ }.to raise_error ArgumentError, "security groups must be an Array"
55
55
  end
56
56
  end
57
57
  end
@@ -19,15 +19,13 @@ describe Bosh::OpenStackCloud::Cloud do
19
19
 
20
20
  it "soft reboots an OpenStack server" do
21
21
  @server.should_receive(:reboot)
22
- @server.should_receive(:state).and_return(:reboot)
23
- @cloud.should_receive(:wait_resource).with(@server, :reboot, :active, :state)
22
+ @cloud.should_receive(:wait_resource).with(@server, :active, :state)
24
23
  @cloud.send(:soft_reboot, @server)
25
24
  end
26
25
 
27
26
  it "hard reboots an OpenStack server" do
28
27
  @server.should_receive(:reboot)
29
- @server.should_receive(:state).and_return(:reboot)
30
- @cloud.should_receive(:wait_resource).with(@server, :reboot, :active, :state)
28
+ @cloud.should_receive(:wait_resource).with(@server, :active, :state)
31
29
  @cloud.send(:hard_reboot, @server)
32
30
  end
33
31