110
114
self.m.StubOutWithMock(self.fc.volumes, 'create_server_volume')
111
115
self.m.StubOutWithMock(self.fc.volumes, 'delete_server_volume')
112
116
self.m.StubOutWithMock(self.fc.volumes, 'get_server_volume')
114
def create_volume(self, t, stack, resource_name):
115
data = t['Resources'][resource_name]
116
data['Properties']['AvailabilityZone'] = 'nova'
117
rsrc = vol.Volume(resource_name,
118
stack.t.resource_definitions(stack)[resource_name],
120
self.assertIsNone(rsrc.validate())
121
scheduler.TaskRunner(rsrc.create)()
122
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
125
def create_cinder_volume(self, t, stack, resource_name):
126
rsrc = vol.CinderVolume(resource_name,
127
stack.t.resource_definitions(
128
stack)[resource_name],
130
self.assertIsNone(rsrc.validate())
131
scheduler.TaskRunner(rsrc.create)()
132
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
135
def create_attachment(self, t, stack, resource_name):
136
resource_defns = stack.t.resource_definitions(stack)
137
rsrc = vol.VolumeAttachment(resource_name,
138
resource_defns[resource_name],
140
self.assertIsNone(rsrc.validate())
141
scheduler.TaskRunner(rsrc.create)()
142
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
145
def _mock_create_volume(self, fv, stack_name, size=1):
146
cinder.CinderClientPlugin._create().MultipleTimes().AndReturn(
148
vol_name = utils.PhysName(stack_name, 'DataVolume')
149
self.cinder_fc.volumes.create(
150
size=size, availability_zone='nova',
151
display_description=vol_name,
152
display_name=vol_name,
153
metadata={u'Usage': u'Wiki Data Volume'}).AndReturn(fv)
155
def _stubout_delete_volume(self, fv):
117
self.use_cinder = False
119
def _mock_delete_volume(self, fv):
156
120
self.m.StubOutWithMock(fv, 'delete')
157
121
fv.delete().AndReturn(True)
158
122
self.m.StubOutWithMock(fv, 'get')
159
123
fv.get().AndReturn(None)
161
cinder_exp.NotFound('Not found'))
124
fv.get().AndRaise(cinder_exp.NotFound('Not found'))
162
125
self.m.ReplayAll()
164
127
def _mock_create_server_volume_script(self, fva,
172
135
device=device, server_id=server, volume_id=volume).AndReturn(fva)
173
136
self.cinder_fc.volumes.get(volume).AndReturn(fva)
138
def create_volume(self, t, stack, resource_name):
140
Volume = vol.CinderVolume
142
data = t['Resources'][resource_name]
143
data['Properties']['AvailabilityZone'] = 'nova'
145
rsrc = Volume(resource_name,
146
stack.t.resource_definitions(stack)[resource_name],
148
self.assertIsNone(rsrc.validate())
149
scheduler.TaskRunner(rsrc.create)()
150
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
153
def create_attachment(self, t, stack, resource_name):
155
Attachment = vol.CinderVolumeAttachment
157
Attachment = vol.VolumeAttachment
158
resource_defns = stack.t.resource_definitions(stack)
159
rsrc = Attachment(resource_name,
160
resource_defns[resource_name],
162
self.assertIsNone(rsrc.validate())
163
scheduler.TaskRunner(rsrc.create)()
164
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
168
class VolumeTest(BaseVolumeTest):
171
super(VolumeTest, self).setUp()
172
self.t = template_format.parse(volume_template)
173
self.use_cinder = False
175
def _mock_create_volume(self, fv, stack_name):
176
cinder.CinderClientPlugin._create().MultipleTimes().AndReturn(
178
vol_name = utils.PhysName(stack_name, 'DataVolume')
179
self.cinder_fc.volumes.create(
180
size=1, availability_zone='nova',
181
display_description=vol_name,
182
display_name=vol_name,
183
metadata={u'Usage': u'Wiki Data Volume'}).AndReturn(fv)
175
185
def test_volume(self):
176
186
fv = FakeVolume('creating', 'available')
177
187
stack_name = 'test_volume_stack'
256
259
def test_volume_create_error(self):
257
260
fv = FakeVolume('creating', 'error')
258
261
stack_name = 'test_volume_create_error_stack'
262
cfg.CONF.set_override('action_retry_limit', 0)
260
264
self._mock_create_volume(fv, stack_name)
262
266
self.m.ReplayAll()
264
t = template_format.parse(volume_template)
265
t['Resources']['DataVolume']['Properties']['AvailabilityZone'] = 'nova'
266
stack = utils.parse_stack(t, stack_name=stack_name)
268
resource_defns = stack.t.resource_definitions(stack)
269
rsrc = vol.Volume('DataVolume',
270
resource_defns['DataVolume'],
272
create = scheduler.TaskRunner(rsrc.create)
273
self.assertRaises(exception.ResourceFailure, create)
268
stack = utils.parse_stack(self.t, stack_name=stack_name)
269
ex = self.assertRaises(exception.ResourceFailure,
270
self.create_volume, self.t, stack, 'DataVolume')
271
self.assertIn('Went to status error due to "Unknown"',
275
274
self.m.VerifyAll()
277
276
def test_volume_bad_tags(self):
278
t = template_format.parse(volume_template)
279
t['Resources']['DataVolume']['Properties']['Tags'] = [{'Foo': 'bar'}]
280
stack = utils.parse_stack(t, stack_name='test_volume_bad_tags_stack')
277
stack_name = 'test_volume_bad_tags_stack'
278
self.t['Resources']['DataVolume']['Properties'][
279
'Tags'] = [{'Foo': 'bar'}]
280
stack = utils.parse_stack(self.t, stack_name=stack_name)
282
resource_defns = stack.t.resource_definitions(stack)
283
rsrc = vol.Volume('DataVolume',
284
resource_defns['DataVolume'],
286
self.assertRaises(exception.StackValidationFailed, rsrc.validate)
282
ex = self.assertRaises(exception.StackValidationFailed,
283
self.create_volume, self.t, stack, 'DataVolume')
284
self.assertIn('Tags Property error', six.text_type(ex))
288
286
self.m.VerifyAll()
503
489
self.m.VerifyAll()
505
def test_volume_attachment_update_device(self):
506
fv = FakeVolume('creating', 'available')
507
fva = FakeVolume('attaching', 'in-use')
508
fva2 = FakeVolume('attaching', 'in-use')
509
stack_name = 'test_volume_attach_stack'
511
self._mock_create_volume(fv, stack_name)
513
self._mock_create_server_volume_script(fva)
516
fva = FakeVolume('in-use', 'available')
517
self.fc.volumes.get_server_volume(u'WikiDatabase',
518
'vol-123').AndReturn(fva)
519
self.cinder_fc.volumes.get(fva.id).AndReturn(fva)
520
self.fc.volumes.delete_server_volume(
521
'WikiDatabase', 'vol-123').MultipleTimes().AndReturn(None)
522
self.fc.volumes.get_server_volume(u'WikiDatabase',
523
'vol-123').AndReturn(fva)
524
self.fc.volumes.get_server_volume(
525
u'WikiDatabase', 'vol-123').AndRaise(fakes.fake_exception())
528
self._mock_create_server_volume_script(fva2, device=u'/dev/vdd',
533
t = template_format.parse(volume_template)
534
t['Resources']['DataVolume']['Properties']['AvailabilityZone'] = 'nova'
535
stack = utils.parse_stack(t, stack_name=stack_name)
537
scheduler.TaskRunner(stack['DataVolume'].create)()
538
self.assertEqual('available', fv.status)
540
rsrc = self.create_attachment(t, stack, 'MountPoint')
541
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
543
after_t = copy.deepcopy(t)
544
after = after_t['Resources']['MountPoint']
545
after['Properties']['VolumeId'] = 'vol-123'
546
after['Properties']['InstanceId'] = 'WikiDatabase'
547
after['Properties']['Device'] = '/dev/vdd'
548
after_defs = template.Template(after_t).resource_definitions(stack)
550
scheduler.TaskRunner(rsrc.update, after_defs['MountPoint'])()
552
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
555
def test_volume_attachment_update_volume(self):
556
fv = FakeVolume('creating', 'available')
557
fva = FakeVolume('attaching', 'in-use')
558
fv2 = FakeVolume('creating', 'available')
560
fv2a = FakeVolume('attaching', 'in-use')
562
stack_name = 'test_volume_attach_stack'
564
self._mock_create_volume(fv, stack_name)
566
vol2_name = utils.PhysName(stack_name, 'DataVolume2')
567
self.cinder_fc.volumes.create(
568
size=2, availability_zone='nova',
569
display_description=vol2_name,
570
display_name=vol2_name,
571
metadata={u'Usage': u'Wiki Data Volume2'}).AndReturn(fv2)
573
self._mock_create_server_volume_script(fva)
576
fva = FakeVolume('in-use', 'available')
577
self.fc.volumes.get_server_volume(u'WikiDatabase',
578
'vol-123').AndReturn(fva)
579
self.cinder_fc.volumes.get(fva.id).AndReturn(fva)
580
self.fc.volumes.delete_server_volume(
581
'WikiDatabase', 'vol-123').MultipleTimes().AndReturn(None)
582
self.fc.volumes.get_server_volume(u'WikiDatabase',
583
'vol-123').AndReturn(fva)
584
self.fc.volumes.get_server_volume(
585
u'WikiDatabase', 'vol-123').AndRaise(fakes.fake_exception())
588
self._mock_create_server_volume_script(fv2a, volume='vol-456',
590
#self.fc.volumes.create_server_volume(
591
#device=u'/dev/vdc', server_id=u'WikiDatabase',
592
#volume_id='vol-456').AndReturn(fv2a)
593
#self.cinder_fc.volumes.get('vol-456').AndReturn(fv2a)
597
t = template_format.parse(volume_template)
599
t['Resources']['DataVolume']['Properties']['AvailabilityZone'] = zone
600
t['Resources']['DataVolume2']['Properties']['AvailabilityZone'] = zone
601
stack = utils.parse_stack(t, stack_name=stack_name)
603
scheduler.TaskRunner(stack['DataVolume'].create)()
604
self.assertEqual('available', fv.status)
605
scheduler.TaskRunner(stack['DataVolume2'].create)()
606
self.assertEqual('available', fv2.status)
608
rsrc = self.create_attachment(t, stack, 'MountPoint')
609
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
611
after_t = copy.deepcopy(t)
612
after = after_t['Resources']['MountPoint']
613
after['Properties']['VolumeId'] = 'vol-456'
614
after['Properties']['InstanceId'] = 'WikiDatabase'
615
after_defs = template.Template(after_t).resource_definitions(stack)
617
scheduler.TaskRunner(rsrc.update, after_defs['MountPoint'])()
619
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
620
self.assertEqual(fv2a.id, rsrc.resource_id)
623
def test_volume_attachment_update_server(self):
624
fv = FakeVolume('creating', 'available')
625
fva = FakeVolume('attaching', 'in-use')
626
fva2 = FakeVolume('attaching', 'in-use')
627
stack_name = 'test_volume_attach_stack'
629
self._mock_create_volume(fv, stack_name)
631
self._mock_create_server_volume_script(fva)
634
fva = FakeVolume('in-use', 'available')
635
self.fc.volumes.get_server_volume(u'WikiDatabase',
636
'vol-123').AndReturn(fva)
637
self.cinder_fc.volumes.get(fva.id).AndReturn(fva)
638
self.fc.volumes.delete_server_volume(
639
'WikiDatabase', 'vol-123').MultipleTimes().AndReturn(None)
640
self.fc.volumes.get_server_volume(u'WikiDatabase',
641
'vol-123').AndReturn(fva)
642
self.fc.volumes.get_server_volume(
643
u'WikiDatabase', 'vol-123').AndRaise(fakes.fake_exception())
646
self._mock_create_server_volume_script(fva2, server=u'WikiDatabase2',
651
t = template_format.parse(volume_template)
652
t['Resources']['DataVolume']['Properties']['AvailabilityZone'] = 'nova'
653
stack = utils.parse_stack(t, stack_name=stack_name)
655
scheduler.TaskRunner(stack['DataVolume'].create)()
656
self.assertEqual('available', fv.status)
658
rsrc = self.create_attachment(t, stack, 'MountPoint')
659
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
661
after_t = copy.deepcopy(t)
662
after = after_t['Resources']['MountPoint']
663
after['Properties']['VolumeId'] = 'vol-123'
664
after['Properties']['InstanceId'] = 'WikiDatabase2'
665
#after['Properties']['Device'] = '/dev/vdd'
666
after_defs = template.Template(after_t).resource_definitions(stack)
668
scheduler.TaskRunner(rsrc.update, after_defs['MountPoint'])()
670
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
491
def test_volume_update_not_supported(self):
492
stack_name = 'test_volume_stack'
493
fv = FakeVolume('creating', 'available')
495
self._mock_create_volume(fv, stack_name)
498
t = template_format.parse(volume_template)
499
stack = utils.parse_stack(t, stack_name=stack_name)
501
rsrc = self.create_volume(t, stack, 'DataVolume')
503
props = copy.deepcopy(rsrc.properties.data)
506
props['AvailabilityZone'] = 'other'
507
after = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), props)
509
updater = scheduler.TaskRunner(rsrc.update, after)
510
ex = self.assertRaises(exception.ResourceFailure, updater)
511
self.assertIn("NotSupported: Update to properties "
512
"AvailabilityZone, Size, Tags of DataVolume "
513
"(AWS::EC2::Volume) is not supported",
515
self.assertEqual((rsrc.UPDATE, rsrc.FAILED), rsrc.state)
673
517
def test_snapshot(self):
674
518
stack_name = 'test_volume_stack'
794
642
self.m.ReplayAll()
796
t = template_format.parse(volume_template)
797
t['Resources']['DataVolume']['Properties']['SnapshotId'] = 'backup-123'
798
t['Resources']['DataVolume']['Properties']['AvailabilityZone'] = 'nova'
799
stack = utils.parse_stack(t, stack_name=stack_name)
644
self.t['Resources']['DataVolume']['Properties'][
645
'SnapshotId'] = 'backup-123'
646
stack = utils.parse_stack(self.t, stack_name=stack_name)
801
resource_defns = stack.t.resource_definitions(stack)
802
rsrc = vol.Volume('DataVolume',
803
resource_defns['DataVolume'],
805
create = scheduler.TaskRunner(rsrc.create)
806
self.assertRaises(exception.ResourceFailure, create)
648
ex = self.assertRaises(exception.ResourceFailure,
649
self.create_volume, self.t, stack, 'DataVolume')
650
self.assertIn('Went to status error due to "Unknown"',
808
653
self.m.VerifyAll()
655
def test_volume_size_constraint(self):
656
self.t['Resources']['DataVolume']['Properties']['Size'] = '0'
657
stack = utils.parse_stack(self.t)
658
error = self.assertRaises(exception.StackValidationFailed,
660
self.t, stack, 'DataVolume')
662
"Property error : DataVolume: Size 0 is out of "
663
"range (min: 1, max: None)", six.text_type(error))
666
class CinderVolumeTest(BaseVolumeTest):
669
super(CinderVolumeTest, self).setUp()
670
self.t = template_format.parse(cinder_volume_template)
671
self.use_cinder = True
673
def _mock_create_volume(self, fv, stack_name, size=1):
674
cinder.CinderClientPlugin._create().MultipleTimes().AndReturn(
676
self.cinder_fc.volumes.create(
677
size=size, availability_zone='nova',
678
display_description='test_description',
679
display_name='test_name',
680
metadata={'key': 'value'}).AndReturn(fv)
682
def test_cinder_volume_size_constraint(self):
683
self.t['resources']['volume']['properties']['size'] = 0
684
stack = utils.parse_stack(self.t)
685
error = self.assertRaises(exception.StackValidationFailed,
687
self.t, stack, 'volume')
689
"Property error : volume: size 0 is out of "
690
"range (min: 1, max: None)", six.text_type(error))
810
692
def test_cinder_create(self):
811
693
fv = FakeVolume('creating', 'available')
812
694
stack_name = 'test_volume_stack'
814
cinder.CinderClientPlugin._create().MultipleTimes().AndReturn(
696
cinder.CinderClientPlugin._create().AndReturn(
816
698
self.cinder_fc.volumes.create(
817
699
size=1, availability_zone='nova',
818
display_description='CustomDescription',
819
display_name='CustomName',
700
display_description='test_description',
701
display_name='test_name',
820
702
imageRef='46988116-6703-4623-9dbc-2bc6d284021b',
821
703
snapshot_id='snap-123',
822
704
metadata={'key': 'value'},
826
708
self.m.ReplayAll()
828
t = template_format.parse(volume_template)
829
t['Resources']['DataVolume']['Properties'] = {
831
'availability_zone': 'nova',
832
'name': 'CustomName',
833
'description': 'CustomDescription',
710
self.t['resources']['volume']['properties'].update({
834
711
'volume_type': 'lvm',
835
'metadata': {'key': 'value'},
836
712
# Note that specifying all these arguments doesn't work in
837
713
# practice, as they are conflicting, but we just want to check they
838
714
# are sent to the backend.
839
715
'imageRef': '46988116-6703-4623-9dbc-2bc6d284021b',
840
716
'snapshot_id': 'snap-123',
841
717
'source_volid': 'vol-012',
843
stack = utils.parse_stack(t, stack_name=stack_name)
845
resource_defns = stack.t.resource_definitions(stack)
846
rsrc = vol.CinderVolume('DataVolume',
847
resource_defns['DataVolume'],
849
self.assertIsNone(rsrc.validate())
850
scheduler.TaskRunner(rsrc.create)()
851
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
719
stack = utils.parse_stack(self.t, stack_name=stack_name)
720
self.create_volume(self.t, stack, 'volume')
852
721
self.assertEqual('available', fv.status)
854
723
self.m.VerifyAll()
856
def test_volume_size_constraint_os(self):
857
t = template_format.parse(volume_template)
858
t['Resources']['DataVolume']['Properties'] = {'size': '0'}
859
stack = utils.parse_stack(t)
860
resource_defns = stack.t.resource_definitions(stack)
861
rsrc = vol.CinderVolume(
862
'DataVolume', resource_defns['DataVolume'], stack)
863
error = self.assertRaises(exception.StackValidationFailed,
866
"Property error : DataVolume: size 0 is out of "
867
"range (min: 1, max: None)", str(error))
869
def test_volume_size_constraint_aws(self):
870
t = template_format.parse(volume_template)
871
t['Resources']['DataVolume']['Properties']['Size'] = '0'
872
stack = utils.parse_stack(t)
873
resource_defns = stack.t.resource_definitions(stack)
875
'DataVolume', resource_defns['DataVolume'], stack)
876
error = self.assertRaises(exception.StackValidationFailed,
879
"Property error : DataVolume: Size 0 is out of "
880
"range (min: 1, max: None)", str(error))
882
725
def test_cinder_create_from_image(self):
883
726
fv = FakeVolumeWithStateTransition('downloading', 'available')
884
727
stack_name = 'test_volume_stack'
885
728
image_id = '46988116-6703-4623-9dbc-2bc6d284021b'
886
cinder.CinderClientPlugin._create().MultipleTimes().AndReturn(
729
cinder.CinderClientPlugin._create().AndReturn(
888
g_cli_mock = self.m.CreateMockAnything()
889
self.m.StubOutWithMock(glance.GlanceClientPlugin, '_create')
890
glance.GlanceClientPlugin._create().MultipleTimes().AndReturn(
892
self.m.StubOutWithMock(glance_utils, 'get_image_id')
893
glance_utils.get_image_id(g_cli_mock, image_id).MultipleTimes().\
731
self.m.StubOutWithMock(glance.GlanceClientPlugin, 'get_image_id')
732
glance.GlanceClientPlugin.get_image_id(
733
image_id).MultipleTimes().AndReturn(image_id)
896
735
self.cinder_fc.volumes.create(
897
736
size=1, availability_zone='nova',
1320
1104
scheduler.TaskRunner(rsrc.update, after)()
1322
1106
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
1108
def test_cinder_snapshot(self):
1109
fv = FakeVolume('creating', 'available')
1110
fb = FakeBackup('creating', 'available')
1111
stack_name = 'test_volume_stack'
1113
cinder.CinderClientPlugin._create().MultipleTimes().AndReturn(
1115
self.cinder_fc.volumes.create(
1116
size=1, availability_zone='nova', display_name='CustomName',
1117
display_description='CustomDescription').AndReturn(fv)
1119
self.m.StubOutWithMock(self.cinder_fc.backups, 'create')
1120
self.cinder_fc.backups.create('vol-123').AndReturn(fb)
1124
t = template_format.parse(volume_template)
1125
t['Resources']['DataVolume']['Properties'] = {
1127
'availability_zone': 'nova',
1128
'description': 'CustomDescription',
1129
'name': 'CustomName'
1131
stack = utils.parse_stack(t, stack_name=stack_name)
1133
resource_defns = stack.t.resource_definitions(stack)
1134
rsrc = vol.CinderVolume('DataVolume',
1135
resource_defns['DataVolume'],
1137
scheduler.TaskRunner(rsrc.create)()
1139
scheduler.TaskRunner(rsrc.snapshot)()
1141
self.assertEqual((rsrc.SNAPSHOT, rsrc.COMPLETE), rsrc.state)
1143
self.assertEqual({'backup_id': 'backup-123'},
1144
db_api.resource_data_get_all(rsrc))
1148
def test_cinder_snapshot_error(self):
1149
fv = FakeVolume('creating', 'available')
1150
fb = FakeBackup('creating', 'error')
1151
stack_name = 'test_volume_stack'
1153
cinder.CinderClientPlugin._create().MultipleTimes().AndReturn(
1155
self.cinder_fc.volumes.create(
1156
size=1, availability_zone='nova', display_name='CustomName',
1157
display_description='CustomDescription').AndReturn(fv)
1159
self.m.StubOutWithMock(self.cinder_fc.backups, 'create')
1160
self.cinder_fc.backups.create('vol-123').AndReturn(fb)
1164
t = template_format.parse(volume_template)
1165
t['Resources']['DataVolume']['Properties'] = {
1167
'availability_zone': 'nova',
1168
'description': 'CustomDescription',
1169
'name': 'CustomName'
1171
stack = utils.parse_stack(t, stack_name=stack_name)
1173
resource_defns = stack.t.resource_definitions(stack)
1174
rsrc = vol.CinderVolume('DataVolume',
1175
resource_defns['DataVolume'],
1177
scheduler.TaskRunner(rsrc.create)()
1179
self.assertRaises(exception.ResourceFailure,
1180
scheduler.TaskRunner(rsrc.snapshot))
1182
self.assertEqual((rsrc.SNAPSHOT, rsrc.FAILED), rsrc.state)
1183
self.assertEqual("Error: error", rsrc.status_reason)
1185
self.assertEqual({}, db_api.resource_data_get_all(rsrc))
1189
def test_cinder_volume_attachment_update_device(self):
1190
fv = FakeVolume('creating', 'available')
1191
fva = FakeVolume('attaching', 'in-use')
1192
fva2 = FakeVolume('attaching', 'in-use')
1193
stack_name = 'test_volume_attach_stack'
1195
self._mock_create_volume(fv, stack_name)
1197
self._mock_create_server_volume_script(fva)
1200
fva = FakeVolume('in-use', 'available')
1201
self.fc.volumes.get_server_volume(u'WikiDatabase',
1202
'vol-123').AndReturn(fva)
1203
self.cinder_fc.volumes.get(fva.id).AndReturn(fva)
1204
self.fc.volumes.delete_server_volume(
1205
'WikiDatabase', 'vol-123').MultipleTimes().AndReturn(None)
1206
self.fc.volumes.get_server_volume(u'WikiDatabase',
1207
'vol-123').AndReturn(fva)
1208
self.fc.volumes.get_server_volume(
1209
u'WikiDatabase', 'vol-123').AndRaise(fakes.fake_exception())
1212
self._mock_create_server_volume_script(fva2, device=u'/dev/vdd',
1217
stack = utils.parse_stack(self.t, stack_name=stack_name)
1219
self.create_volume(self.t, stack, 'volume')
1220
self.assertEqual('available', fv.status)
1222
rsrc = self.create_attachment(self.t, stack, 'attachment')
1224
props = copy.deepcopy(rsrc.properties.data)
1225
props['mountpoint'] = '/dev/vdd'
1226
props['volume_id'] = 'vol-123'
1227
after = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), props)
1228
scheduler.TaskRunner(rsrc.update, after)()
1230
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
1233
def test_cinder_volume_attachment_update_volume(self):
1234
fv = FakeVolume('creating', 'available')
1235
fva = FakeVolume('attaching', 'in-use')
1236
fv2 = FakeVolume('creating', 'available')
1238
fv2a = FakeVolume('attaching', 'in-use')
1240
stack_name = 'test_volume_attach_stack'
1242
self._mock_create_volume(fv, stack_name)
1244
vol2_name = utils.PhysName(stack_name, 'volume2')
1245
self.cinder_fc.volumes.create(
1246
size=2, availability_zone='nova',
1247
display_description=None,
1248
display_name=vol2_name).AndReturn(fv2)
1250
self._mock_create_server_volume_script(fva)
1253
fva = FakeVolume('in-use', 'available')
1254
self.fc.volumes.get_server_volume(u'WikiDatabase',
1255
'vol-123').AndReturn(fva)
1256
self.cinder_fc.volumes.get(fva.id).AndReturn(fva)
1257
self.fc.volumes.delete_server_volume(
1258
'WikiDatabase', 'vol-123').MultipleTimes().AndReturn(None)
1259
self.fc.volumes.get_server_volume(u'WikiDatabase',
1260
'vol-123').AndReturn(fva)
1261
self.fc.volumes.get_server_volume(
1262
u'WikiDatabase', 'vol-123').AndRaise(fakes.fake_exception())
1265
self._mock_create_server_volume_script(fv2a, volume='vol-456',
1270
stack = utils.parse_stack(self.t, stack_name=stack_name)
1272
self.create_volume(self.t, stack, 'volume')
1273
self.assertEqual('available', fv.status)
1274
self.create_volume(self.t, stack, 'volume2')
1275
self.assertEqual('available', fv2.status)
1277
rsrc = self.create_attachment(self.t, stack, 'attachment')
1278
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
1280
props = copy.deepcopy(rsrc.properties.data)
1281
props['volume_id'] = 'vol-456'
1282
after = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), props)
1283
scheduler.TaskRunner(rsrc.update, after)()
1285
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
1286
self.assertEqual(fv2a.id, rsrc.resource_id)
1289
def test_cinder_volume_attachment_update_server(self):
1290
fv = FakeVolume('creating', 'available')
1291
fva = FakeVolume('attaching', 'in-use')
1292
fva2 = FakeVolume('attaching', 'in-use')
1293
stack_name = 'test_volume_attach_stack'
1295
self._mock_create_volume(fv, stack_name)
1297
self._mock_create_server_volume_script(fva)
1300
fva = FakeVolume('in-use', 'available')
1301
self.fc.volumes.get_server_volume(u'WikiDatabase',
1302
'vol-123').AndReturn(fva)
1303
self.cinder_fc.volumes.get(fva.id).AndReturn(fva)
1304
self.fc.volumes.delete_server_volume(
1305
'WikiDatabase', 'vol-123').MultipleTimes().AndReturn(None)
1306
self.fc.volumes.get_server_volume(u'WikiDatabase',
1307
'vol-123').AndReturn(fva)
1308
self.fc.volumes.get_server_volume(
1309
u'WikiDatabase', 'vol-123').AndRaise(fakes.fake_exception())
1312
self._mock_create_server_volume_script(fva2, server=u'AnotherServer',
1317
stack = utils.parse_stack(self.t, stack_name=stack_name)
1319
self.create_volume(self.t, stack, 'volume')
1320
self.assertEqual('available', fv.status)
1322
rsrc = self.create_attachment(self.t, stack, 'attachment')
1323
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
1325
props = copy.deepcopy(rsrc.properties.data)
1326
props['instance_uuid'] = 'AnotherServer'
1327
props['volume_id'] = 'vol-123'
1328
after = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), props)
1329
scheduler.TaskRunner(rsrc.update, after)()
1331
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
1323
1332
self.m.VerifyAll()