Merge "Move find_resource family to API binding layer"
This commit is contained in:
@@ -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):
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user