Add package for OpenStack Glance client

Change-Id: Idaa341fc03dd8217cfa81182b5259bf75dffbf58
This commit is contained in:
Federico Ressi 2019-06-19 08:10:44 +02:00
parent 6446c8e03b
commit c82bc00ce6
8 changed files with 275 additions and 1 deletions

View File

@ -24,7 +24,8 @@ import tobiko
LOG = log.getLogger(__name__)
CONFIG_MODULES = ['tobiko.openstack.keystone.config',
CONFIG_MODULES = ['tobiko.openstack.glance.config',
'tobiko.openstack.keystone.config',
'tobiko.openstack.neutron.config',
'tobiko.openstack.nova.config',
'tobiko.shell.ssh.config',

View File

@ -0,0 +1,25 @@
# Copyright 2019 Red Hat
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
from tobiko.openstack.glance import _client
from tobiko.openstack.glance import _image
glance_client = _client.glance_client
get_glance_client = _client.get_glance_client
GlanceClientFixture = _client.GlanceClientFixture
find_image = _client.find_image
list_images = _client.list_images
GlanceImageFixture = _image.GlanceImageFixture

View File

@ -0,0 +1,70 @@
# Copyright 2019 Red Hat
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
from glanceclient.v2 import client as glanceclient
import tobiko
from tobiko.openstack import _client
from tobiko.openstack import _find
class GlanceClientFixture(_client.OpenstackClientFixture):
def init_client(self, session):
return glanceclient.Client(session=session)
class GlanceClientManager(_client.OpenstackClientManager):
def create_client(self, session):
return GlanceClientFixture(session=session)
CLIENTS = GlanceClientManager()
def glance_client(obj):
if not obj:
return get_glance_client()
if isinstance(obj, glanceclient.Client):
return obj
fixture = tobiko.setup_fixture(obj)
if isinstance(fixture, GlanceClientFixture):
return fixture.client
message = "Object {!r} is not a NovaClientFixture".format(obj)
raise TypeError(message)
def get_glance_client(session=None, shared=True, init_client=None,
manager=None):
manager = manager or CLIENTS
client = manager.get_client(session=session, shared=shared,
init_client=init_client)
tobiko.setup_fixture(client)
return client.client
def find_image(obj=None, properties=None, client=None, **params):
"""Look for the unique network matching some property values"""
return _find.find_resource(
obj=obj, resource_type='image', properties=properties,
resources=list_images(client=client, **params), **params)
def list_images(client=None, **params):
return list(glance_client(client).images.list(**params))

View File

@ -0,0 +1,59 @@
# Copyright 2019 Red Hat
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
import tobiko
from tobiko.openstack.glance import _client
from tobiko.openstack import _find
class GlanceImageFixture(tobiko.SharedFixture):
client = None
image = None
image_details = None
def __init__(self, client=None, image=None):
super(GlanceImageFixture, self).__init__()
if client:
self.client = client
if image:
self.image = image
elif not self.image:
self.image = self.fixture_name
def setup_fixture(self):
self.setup_client()
self.setup_image()
def setup_client(self):
self.client = _client.glance_client(self.client)
def setup_image(self):
try:
self.image_details = _client.find_image(self.image,
client=self.client)
except _find.ResourceNotFound:
self.image_details = self.create_image()
def create_image(self):
raise NotImplementedError
@property
def image_id(self):
return self.image_details['id']
@property
def image_name(self):
return self.image_details['name']

View File

@ -0,0 +1,22 @@
# Copyright 2019 Red Hat
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
from oslo_config import cfg
def register_tobiko_options(conf):
conf.register_opts(
group=cfg.OptGroup('glance'),
opts=[])

View File

@ -0,0 +1,19 @@
# Copyright 2019 Red Hat
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
from tobiko.openstack.images import _cirros
CirrosImageFixture = _cirros.CirrosImageFixture

View File

@ -0,0 +1,41 @@
# Copyright 2019 Red Hat
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
from tobiko import config
from tobiko.openstack import glance
CONF = config.CONF
class CirrosImageFixture(glance.GlanceImageFixture):
@property
def image(self):
"""glance image used to create a Nova server instance"""
return CONF.tobiko.nova.image
@property
def username(self):
"""username used to login to a Nova server instance"""
return CONF.tobiko.nova.username
@property
def password(self):
"""password used to login to a Nova server instance"""
return CONF.tobiko.nova.password
def create_image(self):
raise NotImplementedError

View File

@ -0,0 +1,37 @@
# Copyright (c) 2019 Red Hat, Inc.
#
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
import testtools
import tobiko
from tobiko.openstack import glance
from tobiko.openstack import images
class GlanceApiTestCase(testtools.TestCase):
"""Tests network creation"""
#: Stack of resources with a network with a gateway router
fixture = tobiko.required_setup_fixture(images.CirrosImageFixture)
def test_find_image_with_id(self):
image = glance.find_image(self.fixture.image_id)
self.assertEqual(self.fixture.image_id, image['id'])
def test_find_image_with_name(self):
image = glance.find_image(self.fixture.image_name)
self.assertEqual(self.fixture.image_name, image['name'])