def test_attach_volume_type_specs(self, mrapi): """Test volume type spces propagation when attaching a volume to an instance """ vlmt = mfactory.VolumeTypeFactory(disk_template='ext_archipelago') # Generate 4 specs. 2 prefixed with GNT_EXTP_VOLTYPESPEC_PREFIX # and 2 with an other prefix that should be omitted volume_type_specs = [ mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='%sbar' % GNT_EXTP_VOLTYPESPEC_PREFIX), mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='%sfoo' % GNT_EXTP_VOLTYPESPEC_PREFIX), mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='other-prefx-baz'), mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='another-prefix-biz'), ] gnt_prefixed_specs = filter( lambda s: s.key.startswith(GNT_EXTP_VOLTYPESPEC_PREFIX), volume_type_specs) volume = mfactory.VolumeFactory(volume_type=vlmt, size=1) vm = volume.machine osettings = { "GANETI_DISK_PROVIDER_KWARGS": { "archipelago": { "foo": "mpaz", "lala": "lolo" } } } with override_settings(settings, **osettings): mrapi().ModifyInstance.return_value = 1 jobid = backend.attach_volume(vm, volume) self.assertEqual(jobid, 1) name, args, kwargs = mrapi().ModifyInstance.mock_calls[-1] disk_kwargs = { "provider": "archipelago", "name": vm.volumes.all()[0].backend_volume_uuid, "reuse_data": 'False', "foo": "mpaz", "lala": "lolo", "size": 1024 } disk_kwargs.update({ spec.key[len(GNT_EXTP_VOLTYPESPEC_PREFIX):]: spec.value for spec in gnt_prefixed_specs }) # Should be "disks": [('add', '-1', {disk_kwargs}), ] disk = kwargs["disks"][0] self.assertEqual(disk[0], 'add') self.assertEqual(disk[1], '-1') self.assertEqual(disk[2], disk_kwargs)
def setUp(self): # Volume types self.archip_vt = mf.VolumeTypeFactory(name="archipelago", disk_template="ext_archipelago") self.file_vt = mf.VolumeTypeFactory(name="file", disk_template="file") # Common arguments self.userid = "test_user" self.size = 1 self.kwargs = { "user_id": self.userid, } # VMs self.archip_vm = mf.VirtualMachineFactory( userid=self.userid, flavor__volume_type=self.archip_vt) self.file_vm = mf.VirtualMachineFactory( userid=self.userid, flavor__volume_type=self.file_vt)
def test_attach_detach_volume(self, mrapi): vol = mfactory.VolumeFactory(status="AVAILABLE") vm = vol.machine volume_type = vm.flavor.volume_type # Test that we cannot detach the root volume response = self.mydelete( "servers/%d/os-volume_attachments/%d" % (vm.id, vol.id), vm.userid) self.assertBadRequest(response) # Test that we cannot attach a used volume vol1 = mfactory.VolumeFactory(status="IN_USE", volume_type=volume_type, userid=vm.userid) request = json.dumps({"volumeAttachment": {"volumeId": vol1.id}}) response = self.mypost("servers/%d/os-volume_attachments" % vm.id, vm.userid, request, "json") self.assertBadRequest(response) vol1.status = "AVAILABLE" # We cannot attach a volume of different disk template volume_type_2 = mfactory.VolumeTypeFactory(disk_template="lalalal") vol1.volume_type = volume_type_2 vol1.save() response = self.mypost("servers/%d/os-volume_attachments/" % vm.id, vm.userid, request, "json") self.assertBadRequest(response) vol1.volume_type = volume_type vol1.save() mrapi().ModifyInstance.return_value = 43 response = self.mypost("servers/%d/os-volume_attachments" % vm.id, vm.userid, request, "json") self.assertEqual(response.status_code, 202, response.content) attachment = json.loads(response.content)["volumeAttachment"] self.assertEqual(attachment, { "volumeId": vol1.id, "serverId": vm.id, "id": vol1.id, "device": "" }) # And we delete it...will fail because of status response = self.mydelete( "servers/%d/os-volume_attachments/%d" % (vm.id, vol1.id), vm.userid) self.assertBadRequest(response) vm.task = None vm.save() vm.volumes.all().update(status="IN_USE") response = self.mydelete( "servers/%d/os-volume_attachments/%d" % (vm.id, vol1.id), vm.userid) self.assertEqual(response.status_code, 202, response.content)
def setUp(self): self.volumes_path = get_service_path( cyclades_services, 'volume', version='v2.0') + '/volumes' self.snapshots_path = get_service_path( cyclades_services, 'volume', version='v2.0') + '/snapshots' # Volume types self.archip_vt = mf.VolumeTypeFactory(name="archipelago", disk_template="ext_archipelago") self.file_vt = mf.VolumeTypeFactory(name="file", disk_template="file") # Common arguments self.userid = "test_user" self.size = 1 self.kwargs = { "user_id": self.userid, } # VMs self.archip_vm = mf.VirtualMachineFactory( userid=self.userid, flavor__volume_type=self.archip_vt) self.file_vm = mf.VirtualMachineFactory( userid=self.userid, flavor__volume_type=self.file_vt)
def test_get_volume_type(self): """Test if `get_volume_type` works properly.""" # Fail to get volume type with non-existent id vt_id = 1134 not_found_msg = "Volume type %s not found" % vt_id with self.assertRaisesMessage(faults.ItemNotFound, not_found_msg): util.get_volume_type(vt_id) # Fail to get volume type with invalid id vt_id = "could this BE any less int?" invalid_msg = "Invalid volume type id: %s" % vt_id with self.assertRaisesMessage(faults.BadRequest, invalid_msg): util.get_volume_type(vt_id) # Success case vt = mf.VolumeTypeFactory() self.assertEqual(vt, util.get_volume_type(vt.id))
def setUp(self): # Volume types self.archip_vt = mf.VolumeTypeFactory(name="archipelago", disk_template="ext_archipelago") self.userid = "test_user" self.archip_vm = mf.VirtualMachineFactory( userid=self.userid, flavor__volume_type=self.archip_vt) self.volume_name = "Unfortunate volume" self.size = 1 self.kwargs = { "user_id": self.userid, "size": self.size, "volume_type_id": self.archip_vt.id, "server": None, "name": self.volume_name, }
def setUp(self): # The volume_type kwarg must be added during the setUp of the test # case, else there won't be any database to create this VolumeType to. self.kwargs.update(volume_type=mf.VolumeTypeFactory())
def test_create(self, mrapi): flavor = mfactory.FlavorFactory() kwargs = { "credentials": self.credentials, "name": "test_vm", "password": "******", "flavor": flavor, "image_id": "safs", "networks": [], "metadata": { "foo": "bar" }, "personality": [], } # no backend! mfactory.BackendFactory(offline=True) self.assertRaises(faults.ServiceUnavailable, servers.create, **kwargs) self.assertEqual(models.VirtualMachine.objects.count(), 0) mfactory.IPv4SubnetFactory(network__public=True) mfactory.IPv6SubnetFactory(network__public=True) backend = mfactory.BackendFactory() # error in nics req = deepcopy(kwargs) req["networks"] = [{"uuid": 42}] self.assertRaises(faults.ItemNotFound, servers.create, **req) self.assertEqual(models.VirtualMachine.objects.count(), 0) # error in enqueue. check the vm is deleted and resources released mrapi().CreateInstance.side_effect = Exception("ganeti is down") with mocked_quotaholder(): servers.create(**kwargs) vm = models.VirtualMachine.objects.get() self.assertFalse(vm.deleted) self.assertEqual(vm.operstate, "ERROR") for nic in vm.nics.all(): self.assertEqual(nic.state, "ERROR") # test ext settings: req = deepcopy(kwargs) vlmt = mfactory.VolumeTypeFactory(disk_template='ext_archipelago') # Generate 4 specs. 2 prefixed with GNT_EXTP_VOLTYPESPEC_PREFIX # and 2 with an other prefix that should be omitted volume_type_specs = [ mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='%sbar' % GNT_EXTP_VOLTYPESPEC_PREFIX), mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='%sfoo' % GNT_EXTP_VOLTYPESPEC_PREFIX), mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='other-prefx-baz'), mfactory.VolumeTypeSpecsFactory(volume_type=vlmt, key='another-prefix-biz'), ] gnt_prefixed_specs = filter( lambda s: s.key.startswith(GNT_EXTP_VOLTYPESPEC_PREFIX), volume_type_specs) ext_flavor = mfactory.FlavorFactory(volume_type=vlmt, disk=1) req["flavor"] = ext_flavor mrapi().CreateInstance.return_value = 42 backend.disk_templates = ["ext"] backend.save() osettings = { "GANETI_DISK_PROVIDER_KWARGS": { "archipelago": { "foo": "mpaz", "lala": "lolo" } } } with mocked_quotaholder(): with override_settings(settings, **osettings): with patch( 'synnefo.logic.backend_allocator.update_backends_disk_templates' # noqa E265 ) as update_disk_templates_mock: # Check that between the `get_available_backends` call # and the `update_backend_disk_templates` call # the backend doesn't change. update_disk_templates_mock.return_value = [backend] vm = servers.create(**req) update_disk_templates_mock.assert_called_once_with([backend]) name, args, kwargs = mrapi().CreateInstance.mock_calls[-1] disk_kwargs = { "provider": "archipelago", "origin": "test_mapfile", "origin_size": 1000, "name": vm.volumes.all()[0].backend_volume_uuid, "foo": "mpaz", "lala": "lolo", "size": 1024 } disk_kwargs.update({ spec.key[len(GNT_EXTP_VOLTYPESPEC_PREFIX):]: spec.value for spec in gnt_prefixed_specs }) self.assertEqual(kwargs["disks"][0], disk_kwargs)