Fix find_resources functions.
Change-Id: Ib7cdfc94eddd7d6360da521fa97ac450057b1e36
This commit is contained in:
parent
2d6d086084
commit
484829efb4
|
@ -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}")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue