def cinderclient(context): # FIXME: the cinderclient ServiceCatalog object is mis-named. # It actually contains the entire access blob. compat_catalog = { 'access': { 'serviceCatalog': context.service_catalog or {} } } sc = service_catalog.ServiceCatalog(compat_catalog) if FLAGS.cinder_endpoint_template: url = FLAGS.cinder_endpoint_template % context.to_dict() else: info = FLAGS.cinder_catalog_info service_type, service_name, endpoint_type = info.split(':') url = sc.url_for(service_type=service_type, service_name=service_name, endpoint_type=endpoint_type) LOG.debug(_('Cinderclient connection created using URL: %s') % url) c = cinder_client.Client(context.user_id, context.auth_token, project_id=context.project_id, auth_url=url) # noauth extracts user_id:project_id from auth_token c.client.auth_token = context.auth_token or '%s:%s' % (context.user_id, context.project_id) c.client.management_url = url return c
def test_compatibility_service_type(self): sc = service_catalog.ServiceCatalog(SERVICE_COMPATIBILITY_CATALOG) self.assertEqual(sc.url_for('tenantId', '1', service_type='volume'), "https://volume1.host/v2/1234") self.assertEqual(sc.url_for('tenantId', '2', service_type='volume'), "https://volume1.host/v2/3456")
def get_cinder_client_version(context): """Parse cinder client version by endpoint url. :param context: Nova auth context. :return: str value(1 or 2). """ global CINDER_URL # FIXME: the cinderclient ServiceCatalog object is mis-named. # It actually contains the entire access blob. # Only needed parts of the service catalog are passed in, see # nova/context.py. compat_catalog = { 'access': { 'serviceCatalog': context.service_catalog or [] } } sc = service_catalog.ServiceCatalog(compat_catalog) if CONF.cinder.endpoint_template: url = CONF.cinder.endpoint_template % context.to_dict() else: info = CONF.cinder.catalog_info service_type, service_name, endpoint_type = info.split(':') # extract the region if set in configuration if CONF.os_region_name: attr = 'region' filter_value = CONF.os_region_name else: attr = None filter_value = None url = sc.url_for(attr=attr, filter_value=filter_value, service_type=service_type, service_name=service_name, endpoint_type=endpoint_type) LOG.debug('Cinderclient connection created using URL: %s', url) valid_versions = ['v1', 'v2'] magic_tuple = urlparse.urlsplit(url) scheme, netloc, path, query, frag = magic_tuple components = path.split("/") for version in valid_versions: if version in components[1]: version = version[1:] if not CINDER_URL and version == '1': msg = _LW('Cinder V1 API is deprecated as of the Juno ' 'release, and Nova is still configured to use it. ' 'Enable the V2 API in Cinder and set ' 'cinder_catalog_info in nova.conf to use it.') LOG.warn(msg) CINDER_URL = url return version msg = _("Invalid client version, must be one of: %s") % valid_versions raise cinder_exception.UnsupportedVersion(msg)
def test_building_a_service_catalog(self): sc = service_catalog.ServiceCatalog(SERVICE_CATALOG) self.assertRaises(exceptions.AmbiguousEndpoints, sc.url_for, service_type='compute') self.assertEquals(sc.url_for('tenantId', '1', service_type='compute'), "https://compute1.host/v1/1234") self.assertEquals(sc.url_for('tenantId', '2', service_type='compute'), "https://compute1.host/v1/3456") self.assertRaises(exceptions.EndpointNotFound, sc.url_for, "region", "South", service_type='compute')
def test_alternate_service_type(self): sc = service_catalog.ServiceCatalog(SERVICE_CATALOG) self.assertRaises(exceptions.AmbiguousEndpoints, sc.url_for, service_type='volume') self.assertEquals(sc.url_for('tenantId', '1', service_type='volume'), "https://volume1.host/v1/1234") self.assertEquals(sc.url_for('tenantId', '2', service_type='volume'), "https://volume1.host/v1/3456") self.assertRaises(exceptions.EndpointNotFound, sc.url_for, "region", "North", service_type='volume')
def get_cinderclient(conf, context): if conf.glance_store.cinder_endpoint_template: url = conf.glance_store.cinder_endpoint_template % context.to_dict() else: info = conf.glance_store.cinder_catalog_info service_type, service_name, endpoint_type = info.split(':') # extract the region if set in configuration if conf.glance_store.os_region_name: attr = 'region' filter_value = conf.glance_store.os_region_name else: attr = None filter_value = None # FIXME: the cinderclient ServiceCatalog object is mis-named. # It actually contains the entire access blob. # Only needed parts of the service catalog are passed in, see # nova/context.py. compat_catalog = { 'access': { 'serviceCatalog': context.service_catalog or [] } } sc = service_catalog.ServiceCatalog(compat_catalog) url = sc.url_for(attr=attr, filter_value=filter_value, service_type=service_type, service_name=service_name, endpoint_type=endpoint_type) LOG.debug(_('Cinderclient connection created using URL: %s') % url) glance_store = conf.glance_store c = cinderclient.Client(context.user, context.auth_tok, project_id=context.tenant, auth_url=url, insecure=glance_store.cinder_api_insecure, retries=glance_store.cinder_http_retries, cacert=glance_store.cinder_ca_certificates_file) # noauth extracts user_id:project_id from auth_token c.client.auth_token = context.auth_tok or '%s:%s' % (context.user, context.tenant) c.client.management_url = url return c
def cinderclient(context): if context.is_admin and context.project_id is None: c = cinder_client.Client(CONF.cinder_admin_username, CONF.cinder_admin_password, CONF.cinder_admin_tenant_name, CONF.cinder_admin_auth_url, insecure=CONF.cinder_api_insecure, retries=CONF.cinder_http_retries, cacert=CONF.cinder_ca_certificates_file) c.authenticate() return c compat_catalog = { 'access': { 'serviceCatalog': context.service_catalog or [] } } sc = service_catalog.ServiceCatalog(compat_catalog) info = CONF.cinder_catalog_info service_type, service_name, endpoint_type = info.split(':') # extract the region if set in configuration if CONF.os_region_name: attr = 'region' filter_value = CONF.os_region_name else: attr = None filter_value = None url = sc.url_for(attr=attr, filter_value=filter_value, service_type=service_type, service_name=service_name, endpoint_type=endpoint_type) LOG.debug('Cinderclient connection created using URL: %s', url) c = cinder_client.Client(context.user_id, context.auth_token, project_id=context.project_id, auth_url=url, insecure=CONF.cinder_api_insecure, retries=CONF.cinder_http_retries, cacert=CONF.cinder_ca_certificates_file) # noauth extracts user_id:project_id from auth_token c.client.auth_token = context.auth_token or '%s:%s' % (context.user_id, context.project_id) c.client.management_url = url return c
def cinderclient(context): # FIXME: the cinderclient ServiceCatalog object is mis-named. # It actually contains the entire access blob. compat_catalog = {'access': {'serviceCatalog': context.service_catalog}} sc = service_catalog.ServiceCatalog(compat_catalog) url = sc.url_for(service_type='volume', service_name='cinder') LOG.debug(_('Cinderclient connection created using URL: %s') % url) c = cinder_client.Client(context.user_id, context.auth_token, project_id=context.project_id, auth_url=url) c.client.auth_token = context.auth_token c.client.management_url = url return c
def cinderclient(context): # FIXME: the cinderclient ServiceCatalog object is mis-named. # It actually contains the entire access blob. # Only needed parts of the service catalog are passed in, see # nova/context.py. compat_catalog = { # TODO(gbasava): Check this... 'access': {'serviceCatalog': context.service_catalog or []} 'access': [] } sc = service_catalog.ServiceCatalog(compat_catalog) if CONF.cinder_endpoint_template: url = CONF.cinder_endpoint_template % context.to_dict() else: info = CONF.cinder_catalog_info service_type, service_name, endpoint_type = info.split(':') # extract the region if set in configuration if CONF.os_region_name: attr = 'region' filter_value = CONF.os_region_name else: attr = None filter_value = None url = sc.url_for(attr=attr, filter_value=filter_value, service_type=service_type, service_name=service_name, endpoint_type=endpoint_type) LOG.debug(_('Cinderclient connection created using URL: %s') % url) c = cinder_client.Client(context.user_id, context.auth_token, project_id=context.project_id, auth_url=url, insecure=CONF.cinder_api_insecure, retries=CONF.cinder_http_retries) # noauth extracts user_id:project_id from auth_token c.client.auth_token = context.auth_token or '%s:%s' % (context.user_id, context.project_id) c.client.management_url = url return c
def _extract_service_catalog(self, url, resp, body, extract_token=True): """See what the auth service told us and process the response. We may get redirected to another site, fail or actually get back a service catalog with a token and our endpoints. """ if resp.status_code == 200: # content must always present try: self.auth_url = url self.service_catalog = \ service_catalog.ServiceCatalog(body) if extract_token: self.auth_token = self.service_catalog.get_token() management_url = self.service_catalog.url_for( attr='region', filter_value=self.region_name, endpoint_type=self.endpoint_type, service_type=self.service_type, service_name=self.service_name, volume_service_name=self.volume_service_name) self.management_url = management_url.rstrip('/') return None except exceptions.AmbiguousEndpoints: print("Found more than one valid endpoint. Use a more " "restrictive filter") raise except KeyError: raise exceptions.AuthorizationFailure() except exceptions.EndpointNotFound: print("Could not find any suitable endpoint. Correct region?") raise elif resp.status_code == 305: return resp['location'] else: raise exceptions.from_response(resp, body)