Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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))
Esempio n. 6
0
    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,
        }
Esempio n. 7
0
 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())
Esempio n. 8
0
    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)