Move find_resource family to API binding layer
find_resource variants are also used by OSC plugin. It looks reasonable to move them to the API binding layer. This commit does not touch the related unit tests to ensure backward compatibility. Related-Bug: #1521291 Change-Id: Iec3e9b379255111f5390325778a1d07bf73b29d6
This commit is contained in:
parent
ec20f7f85c
commit
84c42160e9
@ -20,7 +20,6 @@ import abc
|
|||||||
import argparse
|
import argparse
|
||||||
import functools
|
import functools
|
||||||
import logging
|
import logging
|
||||||
import re
|
|
||||||
|
|
||||||
from cliff import command
|
from cliff import command
|
||||||
from cliff import lister
|
from cliff import lister
|
||||||
@ -32,104 +31,26 @@ from neutronclient._i18n import _
|
|||||||
from neutronclient.common import exceptions
|
from neutronclient.common import exceptions
|
||||||
from neutronclient.common import utils
|
from neutronclient.common import utils
|
||||||
|
|
||||||
HEX_ELEM = '[0-9A-Fa-f]'
|
|
||||||
UUID_PATTERN = '-'.join([HEX_ELEM + '{8}', HEX_ELEM + '{4}',
|
|
||||||
HEX_ELEM + '{4}', HEX_ELEM + '{4}',
|
|
||||||
HEX_ELEM + '{12}'])
|
|
||||||
HYPHEN_OPTS = ['tags_any', 'not_tags', 'not_tags_any']
|
HYPHEN_OPTS = ['tags_any', 'not_tags', 'not_tags_any']
|
||||||
|
|
||||||
|
|
||||||
def _get_resource_plural(resource, client):
|
|
||||||
plurals = getattr(client, 'EXTED_PLURALS', [])
|
|
||||||
for k in plurals:
|
|
||||||
if plurals[k] == resource:
|
|
||||||
return k
|
|
||||||
return resource + 's'
|
|
||||||
|
|
||||||
|
|
||||||
def find_resource_by_id(client, resource, resource_id, cmd_resource=None,
|
def find_resource_by_id(client, resource, resource_id, cmd_resource=None,
|
||||||
parent_id=None, fields=None):
|
parent_id=None, fields=None):
|
||||||
if not cmd_resource:
|
return client.find_resource_by_id(resource, resource_id, cmd_resource,
|
||||||
cmd_resource = resource
|
parent_id, fields)
|
||||||
cmd_resource_plural = _get_resource_plural(cmd_resource, client)
|
|
||||||
resource_plural = _get_resource_plural(resource, client)
|
|
||||||
obj_lister = getattr(client, "list_%s" % cmd_resource_plural)
|
|
||||||
# perform search by id only if we are passing a valid UUID
|
|
||||||
match = re.match(UUID_PATTERN, resource_id)
|
|
||||||
collection = resource_plural
|
|
||||||
if match:
|
|
||||||
params = {'id': resource_id}
|
|
||||||
if fields:
|
|
||||||
params['fields'] = fields
|
|
||||||
if parent_id:
|
|
||||||
data = obj_lister(parent_id, **params)
|
|
||||||
else:
|
|
||||||
data = obj_lister(**params)
|
|
||||||
if data and data[collection]:
|
|
||||||
return data[collection][0]
|
|
||||||
not_found_message = (_("Unable to find %(resource)s with id "
|
|
||||||
"'%(id)s'") %
|
|
||||||
{'resource': resource, 'id': resource_id})
|
|
||||||
# 404 is raised by exceptions.NotFound to simulate serverside behavior
|
|
||||||
raise exceptions.NotFound(message=not_found_message)
|
|
||||||
|
|
||||||
|
|
||||||
def find_resourceid_by_id(client, resource, resource_id, cmd_resource=None,
|
def find_resourceid_by_id(client, resource, resource_id, cmd_resource=None,
|
||||||
parent_id=None):
|
parent_id=None):
|
||||||
info = find_resource_by_id(client, resource, resource_id, cmd_resource,
|
return find_resource_by_id(client, resource, resource_id, cmd_resource,
|
||||||
parent_id, fields='id')
|
parent_id, fields='id')['id']
|
||||||
return info['id']
|
|
||||||
|
|
||||||
|
|
||||||
def _find_resource_by_name(client, resource, name, project_id=None,
|
|
||||||
cmd_resource=None, parent_id=None, fields=None):
|
|
||||||
if not cmd_resource:
|
|
||||||
cmd_resource = resource
|
|
||||||
cmd_resource_plural = _get_resource_plural(cmd_resource, client)
|
|
||||||
resource_plural = _get_resource_plural(resource, client)
|
|
||||||
obj_lister = getattr(client, "list_%s" % cmd_resource_plural)
|
|
||||||
params = {'name': name}
|
|
||||||
if fields:
|
|
||||||
params['fields'] = fields
|
|
||||||
if project_id:
|
|
||||||
params['tenant_id'] = project_id
|
|
||||||
if parent_id:
|
|
||||||
data = obj_lister(parent_id, **params)
|
|
||||||
else:
|
|
||||||
data = obj_lister(**params)
|
|
||||||
collection = resource_plural
|
|
||||||
info = data[collection]
|
|
||||||
if len(info) > 1:
|
|
||||||
raise exceptions.NeutronClientNoUniqueMatch(resource=resource,
|
|
||||||
name=name)
|
|
||||||
elif len(info) == 0:
|
|
||||||
not_found_message = (_("Unable to find %(resource)s with name "
|
|
||||||
"'%(name)s'") %
|
|
||||||
{'resource': resource, 'name': name})
|
|
||||||
# 404 is raised by exceptions.NotFound to simulate serverside behavior
|
|
||||||
raise exceptions.NotFound(message=not_found_message)
|
|
||||||
else:
|
|
||||||
return info[0]
|
|
||||||
|
|
||||||
|
|
||||||
def find_resource_by_name_or_id(client, resource, name_or_id,
|
def find_resource_by_name_or_id(client, resource, name_or_id,
|
||||||
project_id=None, cmd_resource=None,
|
project_id=None, cmd_resource=None,
|
||||||
parent_id=None, fields=None):
|
parent_id=None, fields=None):
|
||||||
try:
|
return client.find_resource(resource, name_or_id, project_id,
|
||||||
return find_resource_by_id(client, resource, name_or_id,
|
cmd_resource, parent_id, fields)
|
||||||
cmd_resource, parent_id, fields)
|
|
||||||
except exceptions.NotFound:
|
|
||||||
try:
|
|
||||||
return _find_resource_by_name(client, resource, name_or_id,
|
|
||||||
project_id, cmd_resource, parent_id,
|
|
||||||
fields)
|
|
||||||
except exceptions.NotFound:
|
|
||||||
not_found_message = (_("Unable to find %(resource)s with name "
|
|
||||||
"or id '%(name_or_id)s'") %
|
|
||||||
{'resource': resource,
|
|
||||||
'name_or_id': name_or_id})
|
|
||||||
raise exceptions.NotFound(
|
|
||||||
message=not_found_message)
|
|
||||||
|
|
||||||
|
|
||||||
def find_resourceid_by_name_or_id(client, resource, name_or_id,
|
def find_resourceid_by_name_or_id(client, resource, name_or_id,
|
||||||
@ -695,8 +616,7 @@ class ListCommand(NeutronCommand, lister.Lister):
|
|||||||
return search_opts
|
return search_opts
|
||||||
|
|
||||||
def call_server(self, neutron_client, search_opts, parsed_args):
|
def call_server(self, neutron_client, search_opts, parsed_args):
|
||||||
resource_plural = _get_resource_plural(self.cmd_resource,
|
resource_plural = neutron_client.get_resource_plural(self.cmd_resource)
|
||||||
neutron_client)
|
|
||||||
obj_lister = getattr(neutron_client, "list_%s" % resource_plural)
|
obj_lister = getattr(neutron_client, "list_%s" % resource_plural)
|
||||||
if self.parent_id:
|
if self.parent_id:
|
||||||
data = obj_lister(self.parent_id, **search_opts)
|
data = obj_lister(self.parent_id, **search_opts)
|
||||||
@ -729,7 +649,7 @@ class ListCommand(NeutronCommand, lister.Lister):
|
|||||||
if dirs:
|
if dirs:
|
||||||
search_opts.update({'sort_dir': dirs})
|
search_opts.update({'sort_dir': dirs})
|
||||||
data = self.call_server(neutron_client, search_opts, parsed_args)
|
data = self.call_server(neutron_client, search_opts, parsed_args)
|
||||||
collection = _get_resource_plural(self.resource, neutron_client)
|
collection = neutron_client.get_resource_plural(self.resource)
|
||||||
return data.get(collection, [])
|
return data.get(collection, [])
|
||||||
|
|
||||||
def extend_list(self, data, parsed_args):
|
def extend_list(self, data, parsed_args):
|
||||||
|
@ -20,8 +20,7 @@ TAG_RESOURCES = ['network']
|
|||||||
|
|
||||||
|
|
||||||
def _convert_resource_args(client, parsed_args):
|
def _convert_resource_args(client, parsed_args):
|
||||||
resource_type = neutronv20._get_resource_plural(
|
resource_type = client.get_resource_plural(parsed_args.resource_type)
|
||||||
parsed_args.resource_type, client)
|
|
||||||
resource_id = neutronv20.find_resourceid_by_name_or_id(
|
resource_id = neutronv20.find_resourceid_by_name_or_id(
|
||||||
client, parsed_args.resource_type, parsed_args.resource)
|
client, parsed_args.resource_type, parsed_args.resource)
|
||||||
return resource_type, resource_id
|
return resource_type, resource_id
|
||||||
|
@ -250,8 +250,7 @@ class CLITestV20Base(base.BaseTestCase):
|
|||||||
ress[resource].update({'name': name})
|
ress[resource].update({'name': name})
|
||||||
resstr = self.client.serialize(ress)
|
resstr = self.client.serialize(ress)
|
||||||
# url method body
|
# url method body
|
||||||
resource_plural = neutronV2_0._get_resource_plural(cmd_resource,
|
resource_plural = self.client.get_resource_plural(cmd_resource)
|
||||||
self.client)
|
|
||||||
path = getattr(self.client, resource_plural + "_path")
|
path = getattr(self.client, resource_plural + "_path")
|
||||||
if parent_id:
|
if parent_id:
|
||||||
path = path % parent_id
|
path = path % parent_id
|
||||||
|
@ -15,7 +15,6 @@ import sys
|
|||||||
from mox3 import mox
|
from mox3 import mox
|
||||||
|
|
||||||
from neutronclient.common import exceptions
|
from neutronclient.common import exceptions
|
||||||
from neutronclient.neutron import v2_0 as neutronV2_0
|
|
||||||
from neutronclient.neutron.v2_0 import network
|
from neutronclient.neutron.v2_0 import network
|
||||||
from neutronclient.neutron.v2_0 import tag
|
from neutronclient.neutron.v2_0 import tag
|
||||||
from neutronclient import shell
|
from neutronclient import shell
|
||||||
@ -68,14 +67,12 @@ class CLITestV20Tag(test_cli20.CLITestV20Base):
|
|||||||
|
|
||||||
def _make_tag_path(self, resource, resource_id, tag):
|
def _make_tag_path(self, resource, resource_id, tag):
|
||||||
path = getattr(self.client, "tag_path")
|
path = getattr(self.client, "tag_path")
|
||||||
resource_plural = neutronV2_0._get_resource_plural(resource,
|
resource_plural = self.client.get_resource_plural(resource)
|
||||||
self.client)
|
|
||||||
return path % (resource_plural, resource_id, tag)
|
return path % (resource_plural, resource_id, tag)
|
||||||
|
|
||||||
def _make_tags_path(self, resource, resource_id):
|
def _make_tags_path(self, resource, resource_id):
|
||||||
path = getattr(self.client, "tags_path")
|
path = getattr(self.client, "tags_path")
|
||||||
resource_plural = neutronV2_0._get_resource_plural(resource,
|
resource_plural = self.client.get_resource_plural(resource)
|
||||||
self.client)
|
|
||||||
return path % (resource_plural, resource_id)
|
return path % (resource_plural, resource_id)
|
||||||
|
|
||||||
def test_add_tag(self):
|
def test_add_tag(self):
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
import inspect
|
import inspect
|
||||||
import itertools
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import debtcollector.renames
|
import debtcollector.renames
|
||||||
@ -35,6 +36,11 @@ from neutronclient.common import utils
|
|||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
HEX_ELEM = '[0-9A-Fa-f]'
|
||||||
|
UUID_PATTERN = '-'.join([HEX_ELEM + '{8}', HEX_ELEM + '{4}',
|
||||||
|
HEX_ELEM + '{4}', HEX_ELEM + '{4}',
|
||||||
|
HEX_ELEM + '{12}'])
|
||||||
|
|
||||||
|
|
||||||
def exception_handler_v20(status_code, error_content):
|
def exception_handler_v20(status_code, error_content):
|
||||||
"""Exception handler for API v2.0 client.
|
"""Exception handler for API v2.0 client.
|
||||||
@ -396,6 +402,88 @@ class ClientBase(object):
|
|||||||
else:
|
else:
|
||||||
return _TupleWithMeta((), resp)
|
return _TupleWithMeta((), resp)
|
||||||
|
|
||||||
|
def get_resource_plural(self, resource):
|
||||||
|
for k in self.EXTED_PLURALS:
|
||||||
|
if self.EXTED_PLURALS[k] == resource:
|
||||||
|
return k
|
||||||
|
return resource + 's'
|
||||||
|
|
||||||
|
def _find_resource_by_id(self, resource, resource_id, cmd_resource=None,
|
||||||
|
parent_id=None, fields=None):
|
||||||
|
if not cmd_resource:
|
||||||
|
cmd_resource = resource
|
||||||
|
cmd_resource_plural = self.get_resource_plural(cmd_resource)
|
||||||
|
resource_plural = self.get_resource_plural(resource)
|
||||||
|
# TODO(amotoki): Use show_%s instead of list_%s
|
||||||
|
obj_lister = getattr(self, "list_%s" % cmd_resource_plural)
|
||||||
|
# perform search by id only if we are passing a valid UUID
|
||||||
|
match = re.match(UUID_PATTERN, resource_id)
|
||||||
|
collection = resource_plural
|
||||||
|
if match:
|
||||||
|
params = {'id': resource_id}
|
||||||
|
if fields:
|
||||||
|
params['fields'] = fields
|
||||||
|
if parent_id:
|
||||||
|
data = obj_lister(parent_id, **params)
|
||||||
|
else:
|
||||||
|
data = obj_lister(**params)
|
||||||
|
if data and data[collection]:
|
||||||
|
return data[collection][0]
|
||||||
|
not_found_message = (_("Unable to find %(resource)s with id "
|
||||||
|
"'%(id)s'") %
|
||||||
|
{'resource': resource, 'id': resource_id})
|
||||||
|
# 404 is raised by exceptions.NotFound to simulate serverside behavior
|
||||||
|
raise exceptions.NotFound(message=not_found_message)
|
||||||
|
|
||||||
|
def _find_resource_by_name(self, resource, name, project_id=None,
|
||||||
|
cmd_resource=None, parent_id=None, fields=None):
|
||||||
|
if not cmd_resource:
|
||||||
|
cmd_resource = resource
|
||||||
|
cmd_resource_plural = self.get_resource_plural(cmd_resource)
|
||||||
|
resource_plural = self.get_resource_plural(resource)
|
||||||
|
obj_lister = getattr(self, "list_%s" % cmd_resource_plural)
|
||||||
|
params = {'name': name}
|
||||||
|
if fields:
|
||||||
|
params['fields'] = fields
|
||||||
|
if project_id:
|
||||||
|
params['tenant_id'] = project_id
|
||||||
|
if parent_id:
|
||||||
|
data = obj_lister(parent_id, **params)
|
||||||
|
else:
|
||||||
|
data = obj_lister(**params)
|
||||||
|
collection = resource_plural
|
||||||
|
info = data[collection]
|
||||||
|
if len(info) > 1:
|
||||||
|
raise exceptions.NeutronClientNoUniqueMatch(resource=resource,
|
||||||
|
name=name)
|
||||||
|
elif len(info) == 0:
|
||||||
|
not_found_message = (_("Unable to find %(resource)s with name "
|
||||||
|
"'%(name)s'") %
|
||||||
|
{'resource': resource, 'name': name})
|
||||||
|
# 404 is raised by exceptions.NotFound
|
||||||
|
# to simulate serverside behavior
|
||||||
|
raise exceptions.NotFound(message=not_found_message)
|
||||||
|
else:
|
||||||
|
return info[0]
|
||||||
|
|
||||||
|
def find_resource(self, resource, name_or_id, project_id=None,
|
||||||
|
cmd_resource=None, parent_id=None, fields=None):
|
||||||
|
try:
|
||||||
|
return self._find_resource_by_id(resource, name_or_id,
|
||||||
|
cmd_resource, parent_id, fields)
|
||||||
|
except exceptions.NotFound:
|
||||||
|
try:
|
||||||
|
return self._find_resource_by_name(
|
||||||
|
resource, name_or_id, project_id,
|
||||||
|
cmd_resource, parent_id, fields)
|
||||||
|
except exceptions.NotFound:
|
||||||
|
not_found_message = (_("Unable to find %(resource)s with name "
|
||||||
|
"or id '%(name_or_id)s'") %
|
||||||
|
{'resource': resource,
|
||||||
|
'name_or_id': name_or_id})
|
||||||
|
raise exceptions.NotFound(
|
||||||
|
message=not_found_message)
|
||||||
|
|
||||||
|
|
||||||
class Client(ClientBase):
|
class Client(ClientBase):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user