def perform_get_vol_details(self, tenant_id, instance_id, volume_id): self.client, self.env = get_client_env() self.vg_clientMock = self.client['Virtual_Guest'] self.vdi_clientMock = self.client['Virtual_Disk_Image'] self.req = api.Request(self.env, sl_client=self.client) self.resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_get(self.req, self.resp, tenant_id, instance_id, volume_id)
def perform_detach_action(self, tenant_id, instance_id, volume_id): self.client, self.env = get_client_env() self.vg_clientMock = self.client['Virtual_Guest'] self.vdi_clientMock = self.client['Virtual_Disk_Image'] self.req = falcon.Request(self.env) self.resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_delete(self.req, self.resp, tenant_id, instance_id, volume_id)
def test_on_get_no_block_devices(self): client, env = get_client_env() vg_clientMock = client['Virtual_Guest'] gbdMock = vg_clientMock.getBlockDevices gbdMock.side_effect = SoftLayer.SoftLayerAPIError( 404, 'No Block Devices', None) req = api.Request(env, sl_client=client) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_get(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) self.assertEqual( resp.body, {'volumeFault': { 'message': 'No Block Devices', 'code': '500' }})
def test_on_delete(self): client, env = get_client_env() vg_clientMock = client['Virtual_Guest'] vdi_clientMock = client['Virtual_Disk_Image'] vdi_clientMock.getObject.return_value = { 'blockDevices': [{ 'guestId': INSTANCE_ID }] } req = api.Request(env, sl_client=client) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_delete(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) vg_clientMock.detachDiskImage.assert_called_with(VOLUME_ID, id=INSTANCE_ID) self.assertEqual(resp.status, 202)
def test_on_delete_fail_detach_getObject_exception(self): client, env = get_client_env() vdi_clientMock = client['Virtual_Disk_Image'] vdi_clientMock.getObject.side_effect = (SoftLayer.SoftLayerAPIError( 404, 'No Object', None)) req = api.Request(env, sl_client=client) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_delete(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) vdi_clientMock.getObject.assert_called_with(id=VOLUME_ID, mask='blockDevices') self.assertEqual( resp.body, {'volumeFault': { 'message': 'No Object', 'code': '500' }})
def test_on_get(self): client, env = get_client_env() vg_clientMock = client['Virtual_Guest'] vg_clientMock.getBlockDevices.return_value = [{ 'diskImage': { 'type': { 'keyName': 'not SWAP' }, 'id': VOLUME_ID } }] req = api.Request(env, sl_client=client) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_get(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) self.assertEqual(list(resp.body.keys()), ['volumeAttachment']) self.assertIn('device', resp.body['volumeAttachment']) self.assertIn('id', resp.body['volumeAttachment']) self.assertIn('serverId', resp.body['volumeAttachment']) self.assertIn('volumeId', resp.body['volumeAttachment'])
def test_on_get_fail_invalid_volume_id(self): client, env = get_client_env() vg_clientMock = client['Virtual_Guest'] vg_clientMock.getBlockDevices.return_value = [{ 'diskImage': { 'type': { 'keyName': 'not SWAP' }, 'id': '0123456' } }] req = api.Request(env, sl_client=client) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_get(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) self.assertEqual( resp.body, {'volumeFault': { 'message': 'Invalid volume id.', 'code': '400' }})
def test_on_delete_fail_disk_already_attached(self): client, env = get_client_env() vdi_clientMock = client['Virtual_Disk_Image'] vdi_clientMock.getObject.return_value = { 'blockDevices': [{ 'guestId': '0123456' }] } req = api.Request(env, sl_client=client) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_delete(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) self.assertEqual( resp.body, { 'volumeFault': { 'message': 'The requested disk image ' 'is attached to another guest and ' 'cannot be detached.', 'code': '400' } })
def test_on_delete_fail_detach_exception(self): client, env = get_client_env() vg_clientMock = client['Virtual_Guest'] deiMock = vg_clientMock.detachDiskImage deiMock.side_effect = (SoftLayer.SoftLayerAPIError( 404, 'Detach Error', None)) vdi_clientMock = client['Virtual_Disk_Image'] vdi_clientMock.getObject.return_value = { 'blockDevices': [{ 'guestId': INSTANCE_ID }] } req = api.Request(env, sl_client=client) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_delete(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) vg_clientMock.detachDiskImage.assert_called_with(VOLUME_ID, id=INSTANCE_ID) self.assertEqual( resp.body, {'volumeFault': { 'message': 'Detach Error', 'code': '500' }})
def test_on_get_fail_invalid_volume_id(self): client, env = get_client_env() vg_clientMock = client['Virtual_Guest'] vg_clientMock.getBlockDevices.return_value = [{ 'diskImage': { 'type': { 'keyName': 'not SWAP' }, 'id': '0123456' } }] vdi_clientMock = client['Virtual_Disk_Image'] req = falcon.Request(env) resp = falcon.Response() instance = volumes.OSVolumeAttachmentV2() instance.on_get(req, resp, TENANT_ID, INSTANCE_ID, VOLUME_ID) self.assertEquals( self.resp.body, { 'notFound': { 'message': 'Invalid instance ID ' 'specified.', 'code': '404' } })
def setup_routes(app, disp): # V3 Routes # None currently supported # V2 Routes disp.set_handler('index', index.IndexV2(app)) disp.set_handler('v2_index', index.IndexV2(app)) flavors_from_config = flavor_list_loader.Flavors.get_flavors(app) flavor = flavors.FlavorV2(app, flavors_from_config) flavor_list = flavors.FlavorsV2(app, flavors_from_config) flavors_detail = flavors.FlavorsDetailV2(app, flavors_from_config) disp.set_handler('v2_availability_zone', availability_zones.AvailabilityZonesV2()) disp.set_handler('v2_availability_zone_detail', availability_zones.AvailabilityZonesV2()) disp.set_handler('v2_extensions', extensions.ExtensionsV2()) disp.set_handler('v2_extension', extensions.ExtensionV2()) disp.set_handler('v2_os_extra_specs_flavor', extra_specs.ExtraSpecsFlavorV2(app, flavors_from_config)) disp.set_handler('v2_os_extra_specs_flavor_key', extra_specs.ExtraSpecsFlavorKeyV2(app, flavors_from_config)) disp.set_handler('v2_flavor', flavor) disp.set_handler('v2_flavors', flavor_list) disp.set_handler('v2_flavors_detail', flavors_detail) disp.set_handler('v2_os_floating_ip_dns', dns.DNSDomainsV2()) disp.set_handler('v2_os_floating_ip_dns_domain_entry', dns.DNSDomainEntryV2()) disp.set_handler('v2_limits', limits.LimitsV2()) disp.set_handler('v2_os_floating_ips', floating_ips.OSFloatingIpsV2()) disp.set_handler('v2_os_tenant_networks', networks.OSNetworksV2()) disp.set_handler('v2_os_tenant_network', networks.OSNetworkV2()) disp.set_handler('v2_os_networks', networks.OSNetworksV2()) disp.set_handler('v2_os_network', networks.OSNetworkV2()) disp.set_handler('v2_os_keypair', keypairs.KeypairV2()) disp.set_handler('v2_os_keypairs', keypairs.KeypairsV2()) disp.set_handler('v2_os_quota_sets', quota_sets.OSQuotaSetsV2()) disp.set_handler('v2_os_tenant_quota_sets', quota_sets.OSQuotaSetsV2()) disp.set_handler('v2_os_server_security_groups', security_groups.OSSecurityGroupsV2()) disp.set_handler('v2_os_security_groups', security_groups.OSSecurityGroupsV2()) disp.set_handler('v2_os_volume_attachments', volumes.OSVolumeAttachmentsV2()) disp.set_handler('v2_os_volume_attachments_detail', volumes.OSVolumeAttachmentV2()) disp.set_handler('v2_server', servers.ServerV2(app)) disp.set_handler('v2_servers', servers.ServersV2(app, flavors_from_config)) disp.set_handler('v2_servers_detail', servers.ServersDetailV2(app)) disp.set_handler('v2_server_action', servers.ServerActionV2(app, flavors_from_config)) disp.set_handler('v2_os_instance_actions', instance_actions.InstanceActionsV2()) disp.set_handler('v2_os_instance_action', instance_actions.InstanceActionV2()) disp.set_handler('v2_server_ips', server_ips.ServerIpsV2()) disp.set_handler('v2_server_ips_network', server_ips.ServerIpsNetworkV2()) disp.set_handler('v2_tenant_flavor', flavor) disp.set_handler('v2_tenant_flavors', flavor_list) disp.set_handler('v2_tenant_flavors_detail', flavors_detail) disp.set_handler('v2_tenant_usage', usage.UsageV2()) disp.set_handler('v2_image', images.ImageV1(app)) disp.set_handler('v2_images', images.ImagesV2(app)) disp.set_handler('v2_images_detail', images.ImagesV2(app)) sl_common.add_hooks(app)
def setup_routes(app, disp): # V2 Routes disp.set_handler('index', index.IndexV2(app)) # need separate handler cause the second version takes a tenant ID # and using the same handler does not work where there is a difference # in parameters; so the tenant ID optional disp.set_handler('v2_detail', versionv2.VersionV2(app)) disp.set_handler('v2_detail_tenant', versionv2.VersionV2(app)) flavors_from_config = flavor_list_loader.Flavors.get_flavors(app) flavor = flavors.FlavorV2(app, flavors_from_config) flavor_list = flavors.FlavorsV2(app, flavors_from_config) flavors_detail = flavors.FlavorsDetailV2(app, flavors_from_config) disp.set_handler('v2_availability_zone', availability_zones.AvailabilityZonesV2()) disp.set_handler('v2_availability_zone_detail', availability_zones.AvailabilityZonesV2()) disp.set_handler('v2_extensions', extensions.ExtensionsV2()) disp.set_handler('v2_extension', extensions.ExtensionV2()) disp.set_handler('v2_os_extra_specs_flavor', extra_specs.ExtraSpecsFlavorV2(app, flavors_from_config)) disp.set_handler('v2_os_extra_specs_flavor_key', extra_specs.ExtraSpecsFlavorKeyV2(app, flavors_from_config)) disp.set_handler('v2_flavor', flavor) disp.set_handler('v2_flavors', flavor_list) disp.set_handler('v2_flavors_detail', flavors_detail) disp.set_handler('v2_limits', limits.LimitsV2()) disp.set_handler('v2_os_floating_ips', floating_ips.OSFloatingIpsV2()) disp.set_handler('v2_os_tenant_networks', networks.OSNetworksV2()) disp.set_handler('v2_os_tenant_network', networks.OSNetworkV2()) disp.set_handler('v2_os_networks', networks.OSNetworksV2()) disp.set_handler('v2_os_network', networks.OSNetworkV2()) disp.set_handler('v2_os_keypair', keypairs.KeypairV2()) disp.set_handler('v2_os_keypairs', keypairs.KeypairsV2()) disp.set_handler('v2_os_quota_sets', quota_sets.OSQuotaSetsV2()) disp.set_handler('v2_os_tenant_quota_sets', quota_sets.OSQuotaSetsV2()) disp.set_handler('v2_os_server_security_groups', security_groups.OSSecurityGroupsV2()) disp.set_handler('v2_os_security_groups', security_groups.OSSecurityGroupsV2()) disp.set_handler('v2_os_volume_attachments', volumes.OSVolumeAttachmentsV2()) disp.set_handler('v2_os_volume_attachments_detail', volumes.OSVolumeAttachmentV2()) disp.set_handler('v2_server', servers.ServerV2(app)) disp.set_handler('v2_servers', servers.ServersV2(app, flavors_from_config)) disp.set_handler('v2_servers_detail', servers.ServersDetailV2(app)) disp.set_handler('v2_server_action', servers.ServerActionV2(app, flavors_from_config)) disp.set_handler('v2_os_instance_actions', instance_actions.InstanceActionsV2()) disp.set_handler('v2_os_instance_action', instance_actions.InstanceActionV2()) disp.set_handler('v2_server_ips', server_ips.ServerIpsV2()) disp.set_handler('v2_server_ips_network', server_ips.ServerIpsNetworkV2()) disp.set_handler('v2_tenant_flavor', flavor) disp.set_handler('v2_tenant_flavors', flavor_list) disp.set_handler('v2_tenant_flavors_detail', flavors_detail) disp.set_handler('v2_tenant_usage', usage.UsageV2()) disp.set_handler('compute_image_show', compute_images.ComputeImageShow(app)) disp.set_handler('v2_images', glance_images.ImagesV2(app)) disp.set_handler('v2_images_detail', glance_images.ImagesV2( app, detail=True)) sl_common.add_hooks(app)