Fix find_resources functions.

Change-Id: Ib7cdfc94eddd7d6360da521fa97ac450057b1e36
This commit is contained in:
Federico Ressi 2019-07-09 12:00:58 +02:00
parent 2d6d086084
commit 484829efb4
5 changed files with 95 additions and 78 deletions

View File

@ -13,46 +13,53 @@
# under the License.
from __future__ import absolute_import
import tobiko
def find_resource(obj, resources, resource_type, properties=None, **params):
if obj:
resources = list(find_resources(obj, resources, properties=properties))
count = len(resources)
if count == 0:
raise ResourceNotFound(obj=obj,
resource_type=resource_type,
properties=properties,
params=params)
if count > 1:
resource_ids = [r['id'] for r in resources]
raise MultipleResourcesFound(obj=obj,
resource_type=resource_type,
properties=properties,
count=len(resources),
resource_ids=resource_ids,
params=params)
return resources[0]
class ResourceNotFound(tobiko.TobikoException):
message = ("No such resource found for obj={obj!r} and "
"properties={properties!r}")
class MultipleResourcesFound(tobiko.TobikoException):
message = ("{count} resources found for obj={obj!r} and "
"properties={properties!r}: {resource_ids}")
def find_resource(obj, resources, properties=None, check_found=True,
check_unique=True):
properties = properties and list(properties) or ['id', 'name']
resources_it = find_resources(obj=obj,
resources=resources,
properties=properties)
try:
resource = next(resources_it)
except StopIteration:
# Resource not found
if check_found:
raise ResourceNotFound(obj=obj, properties=properties)
else:
return None
else:
# Resource found
if check_unique:
duplicates = [r['id'] for r in resources_it]
if duplicates:
resources_ids = [resource['id']] + duplicates
count = 1 + len(duplicates)
raise MultipleResourcesFound(obj=obj,
properties=properties,
count=count,
resource_ids=resources_ids)
return resource
def find_resources(obj, resources, properties=None):
properties = properties or ('id', 'name')
properties = properties and list(properties) or ['id', 'name']
for resource in resources:
for property_name in properties:
value = resource[property_name]
if obj == value:
yield resource
break
class ResourceNotFound(tobiko.TobikoException):
message = ("No such {resource_type} found for obj={obj!r}, "
"properties={properties!r} and params={params!r}")
class MultipleResourcesFound(tobiko.TobikoException):
message = ("{count} {resource_type}s found for obj={obj!r}, "
"properties={properties!r} and params={params!r}: "
"{resource_ids}")

View File

@ -20,7 +20,6 @@ from tobiko.openstack.glance import _image
glance_client = _client.glance_client
get_glance_client = _client.get_glance_client
GlanceClientFixture = _client.GlanceClientFixture
GlanceImageNotFound = _client.GlanceImageNotFound
create_image = _client.create_image
get_image = _client.get_image
find_image = _client.find_image

View File

@ -64,24 +64,30 @@ def delete_image(image_id, client=None, **params):
try:
glance_client(client).images.delete(image_id, **params)
except exc.HTTPNotFound:
pass
return False
else:
return True
def get_image(image_id, client=None):
def get_image(image_id, check_found=True, client=None):
try:
return glance_client(client).images.get(image_id=image_id)
except exc.HTTPNotFound as ex:
raise GlanceImageNotFound(cause=ex)
except exc.HTTPNotFound:
if check_found:
raise
else:
return None
def find_image(obj=None, properties=None, client=None, **params):
"""Look for the unique network matching some property values"""
images = list_images(client=client, limit=1, **params)
for image in _find.find_resources(obj, images, properties=properties):
return image
raise GlanceImageNotFound(obj=obj, properties=properties, params=params)
def find_image(obj=None, properties=None, client=None, check_found=True,
check_unique=False, **params):
"""Look for an image matching some property values"""
resources = list_images(client=client, **params)
return _find.find_resource(obj=obj,
resources=resources,
properties=properties,
check_found=check_found,
check_unique=check_unique)
def list_images(client=None, **params):
@ -92,8 +98,3 @@ def upload_image(image_id, image_data, client=None, **params):
"""Look for the unique network matching some property values"""
return glance_client(client).images.upload(
image_id=image_id, image_data=image_data, **params)
class GlanceImageNotFound(_find.ResourceNotFound):
message = ("No such image found for obj={obj!r}, "
"properties={properties!r} and params={params!r}")

View File

@ -22,6 +22,7 @@ from oslo_log import log
import requests
import tobiko
from tobiko.openstack import _find
from tobiko.openstack.glance import _client
LOG = log.getLogger(__name__)
@ -118,24 +119,21 @@ class GlanceImageFixture(tobiko.SharedFixture):
def image(self):
return self._image or self.get_image()
def get_image(self, **kwargs):
self._image = image = _client.find_image(
self.image_name, client=self.client, **kwargs)
def get_image(self):
self._image = image = _client.find_image(self.image_name,
client=self.client)
LOG.debug('Got image %r: %r', self.image_name, image)
return image
def delete_image(self, image_id=None):
try:
if not image_id:
image_id = self.image_id
self._image = None
_client.delete_image(image_id=image_id, client=self.client)
except _client.GlanceImageNotFound:
if not image_id:
image_id = self.image_id
self._image = None
if _client.delete_image(image_id=image_id, client=self.client):
LOG.debug("Deleted image %r: %r", self.image_name, image_id)
else:
LOG.debug('Image %r not deleted because not found',
image_id or self.image_name)
return None
else:
LOG.debug("Deleted image %r: %r", self.image_name, image_id)
@property
def image_id(self):
@ -165,7 +163,7 @@ class UploadGranceImageFixture(GlanceImageFixture):
def setup_image(self):
try:
return self.wait_for_image_active()
except _client.GlanceImageNotFound:
except _find.ResourceNotFound:
pass
except InvalidGlanceImageStatus as ex:
self.delete_image(image_id=ex.image_id)

View File

@ -62,25 +62,37 @@ def get_neutron_client(session=None, shared=True, init_client=None,
return client.client
def find_network(obj=None, properties=None, client=None, **params):
"""Look for the unique network matching some property values"""
return _find.find_resource(
obj=obj, resource_type='network', properties=properties,
resources=list_networks(client=client, **params), **params)
def find_network(obj, properties=None, client=None, check_found=True,
check_unique=True, **params):
"""Look for a network matching some property values"""
resources = list_networks(client=client, **params)
return _find.find_resource(obj=obj,
resources=resources,
properties=properties,
check_found=check_found,
check_unique=check_unique)
def find_port(obj=None, properties=None, client=None, **params):
"""Look for the unique network matching some property values"""
return _find.find_resource(
obj=obj, resource_type='port', properties=properties,
resources=list_ports(client=client, **params), **params)
def find_port(obj, properties=None, client=None, check_found=True,
check_unique=True, **params):
"""Look for a port matching some property values"""
resources = list_ports(client=client, **params)
return _find.find_resource(obj=obj,
resources=resources,
properties=properties,
check_found=check_found,
check_unique=check_unique)
def find_subnet(obj=None, properties=None, client=None, **params):
"""Look for the unique subnet matching some property values"""
return _find.find_resource(
obj=obj, resource_type='subnet', properties=properties,
resources=list_subnets(client=client, **params), **params)
def find_subnet(obj, properties=None, client=None, check_found=True,
check_unique=False, **params):
"""Look for a subnet matching some property values"""
resources = list_subnets(client=client, **params)
return _find.find_resource(obj=obj,
resources=resources,
properties=properties,
check_found=check_found,
check_unique=check_unique)
def list_networks(show=False, client=None, **params):