Merge "Migrate to glanceclient to get image id"
This commit is contained in:
commit
2d37843d13
@ -16,6 +16,7 @@ import copy
|
|||||||
from heat.common import exception
|
from heat.common import exception
|
||||||
from heat.engine import attributes
|
from heat.engine import attributes
|
||||||
from heat.engine import properties
|
from heat.engine import properties
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
from heat.engine.resources import server
|
from heat.engine.resources import server
|
||||||
from heat.openstack.common.gettextutils import _
|
from heat.openstack.common.gettextutils import _
|
||||||
@ -112,7 +113,7 @@ class CloudServer(server.Server):
|
|||||||
"""Return the server's image ID."""
|
"""Return the server's image ID."""
|
||||||
image = self.properties.get(self.IMAGE)
|
image = self.properties.get(self.IMAGE)
|
||||||
if image and self._image is None:
|
if image and self._image is None:
|
||||||
self._image = nova_utils.get_image_id(self.nova(), image)
|
self._image = glance_utils.get_image_id(self.glance(), image)
|
||||||
return self._image
|
return self._image
|
||||||
|
|
||||||
def _config_drive(self):
|
def _config_drive(self):
|
||||||
|
@ -20,6 +20,7 @@ from heat.engine import clients
|
|||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
from heat.openstack.common import uuidutils
|
from heat.openstack.common import uuidutils
|
||||||
from heat.tests.common import HeatTestCase
|
from heat.tests.common import HeatTestCase
|
||||||
@ -65,6 +66,25 @@ class CloudServersTest(HeatTestCase):
|
|||||||
resource._register_class("Rackspace::Cloud::Server",
|
resource._register_class("Rackspace::Cloud::Server",
|
||||||
cloud_server.CloudServer)
|
cloud_server.CloudServer)
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
|
||||||
|
def _stub_server_validate(self, server, imageId_input, image_id):
|
||||||
|
# stub nova validate
|
||||||
|
self.m.StubOutWithMock(server, 'nova')
|
||||||
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
|
||||||
|
# stub glance image validate
|
||||||
|
self._mock_get_image_id_success(imageId_input, image_id)
|
||||||
|
|
||||||
def _setup_test_stack(self, stack_name):
|
def _setup_test_stack(self, stack_name):
|
||||||
t = template_format.parse(wp_template)
|
t = template_format.parse(wp_template)
|
||||||
template = parser.Template(t)
|
template = parser.Template(t)
|
||||||
@ -91,13 +111,8 @@ class CloudServersTest(HeatTestCase):
|
|||||||
server = cloud_server.CloudServer(server_name,
|
server = cloud_server.CloudServer(server_name,
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(cloud_server.CloudServer, "nova")
|
|
||||||
cloud_server.CloudServer.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
|
|
||||||
server.t = server.stack.resolve_runtime_data(server.t)
|
server.t = server.stack.resolve_runtime_data(server.t)
|
||||||
|
self._stub_server_validate(server, image_id or 'CentOS 5.2', 1)
|
||||||
if stub_create:
|
if stub_create:
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
@ -325,7 +340,7 @@ class CloudServersTest(HeatTestCase):
|
|||||||
|
|
||||||
mock_nova.return_value = self.fc
|
mock_nova.return_value = self.fc
|
||||||
self.fc.servers.create = mock.Mock(return_value=return_server)
|
self.fc.servers.create = mock.Mock(return_value=return_server)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 'image_id')
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
expected_call = mock.call(server.ADMIN_PASS,
|
expected_call = mock.call(server.ADMIN_PASS,
|
||||||
'autogenerated', redact=True)
|
'autogenerated', redact=True)
|
||||||
@ -348,7 +363,7 @@ class CloudServersTest(HeatTestCase):
|
|||||||
|
|
||||||
mock_nova.return_value = self.fc
|
mock_nova.return_value = self.fc
|
||||||
self.fc.servers.create = mock.Mock(return_value=return_server)
|
self.fc.servers.create = mock.Mock(return_value=return_server)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 'image_id')
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
|
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
|
||||||
mock.ANY, mock.ANY)
|
mock.ANY, mock.ANY)
|
||||||
@ -371,7 +386,7 @@ class CloudServersTest(HeatTestCase):
|
|||||||
|
|
||||||
mock_nova.return_value = self.fc
|
mock_nova.return_value = self.fc
|
||||||
self.fc.servers.create = mock.Mock(return_value=return_server)
|
self.fc.servers.create = mock.Mock(return_value=return_server)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 'image_id')
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
|
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
|
||||||
mock.ANY, mock.ANY)
|
mock.ANY, mock.ANY)
|
||||||
@ -392,7 +407,7 @@ class CloudServersTest(HeatTestCase):
|
|||||||
|
|
||||||
mock_nova.return_value = self.fc
|
mock_nova.return_value = self.fc
|
||||||
self.fc.servers.create = mock.Mock(return_value=return_server)
|
self.fc.servers.create = mock.Mock(return_value=return_server)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 'image_id')
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
|
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
|
||||||
mock.ANY, redact=mock.ANY)
|
mock.ANY, redact=mock.ANY)
|
||||||
@ -432,10 +447,11 @@ class CloudServersTest(HeatTestCase):
|
|||||||
mock_nova.return_value = self.fc
|
mock_nova.return_value = self.fc
|
||||||
mock_servers_create = mock.Mock(return_value=return_server)
|
mock_servers_create = mock.Mock(return_value=return_server)
|
||||||
self.fc.servers.create = mock_servers_create
|
self.fc.servers.create = mock_servers_create
|
||||||
|
image_id = mock.ANY
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', image_id)
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
mock_servers_create.assert_called_with(
|
mock_servers_create.assert_called_with(
|
||||||
image=mock.ANY,
|
image=image_id,
|
||||||
flavor=mock.ANY,
|
flavor=mock.ANY,
|
||||||
key_name=mock.ANY,
|
key_name=mock.ANY,
|
||||||
name=mock.ANY,
|
name=mock.ANY,
|
||||||
|
69
heat/engine/resources/glance_utils.py
Normal file
69
heat/engine/resources/glance_utils.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#
|
||||||
|
# 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.
|
||||||
|
"""Utilities for Resources that use the OpenStack Glance API."""
|
||||||
|
|
||||||
|
from glanceclient import exc as glance_exceptions
|
||||||
|
|
||||||
|
from heat.common import exception
|
||||||
|
from heat.openstack.common.gettextutils import _
|
||||||
|
from heat.openstack.common import log as logging
|
||||||
|
from heat.openstack.common import uuidutils
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def get_image_id(glance_client, image_identifier):
|
||||||
|
'''
|
||||||
|
Return an id for the specified image name or identifier.
|
||||||
|
|
||||||
|
:param glance_client: the glance client to use
|
||||||
|
:param image_identifier: image name or a UUID-like identifier
|
||||||
|
:returns: the id of the requested :image_identifier:
|
||||||
|
:raises: exception.ImageNotFound, exception.PhysicalResourceNameAmbiguity
|
||||||
|
'''
|
||||||
|
if uuidutils.is_uuid_like(image_identifier):
|
||||||
|
try:
|
||||||
|
image_id = glance_client.images.get(image_identifier).id
|
||||||
|
except glance_exceptions.NotFound:
|
||||||
|
image_id = get_image_id_by_name(glance_client, image_identifier)
|
||||||
|
else:
|
||||||
|
image_id = get_image_id_by_name(glance_client, image_identifier)
|
||||||
|
return image_id
|
||||||
|
|
||||||
|
|
||||||
|
def get_image_id_by_name(glance_client, image_identifier):
|
||||||
|
'''
|
||||||
|
Return an id for the specified image name or identifier.
|
||||||
|
|
||||||
|
:param glance_client: the glance client to use
|
||||||
|
:param image_identifier: image name or a UUID-like identifier
|
||||||
|
:returns: the id of the requested :image_identifier:
|
||||||
|
:raises: exception.ImageNotFound, exception.PhysicalResourceNameAmbiguity
|
||||||
|
'''
|
||||||
|
try:
|
||||||
|
filters = {'name': image_identifier}
|
||||||
|
image_list = list(glance_client.images.list(filters=filters))
|
||||||
|
except glance_exceptions.ClientException as ex:
|
||||||
|
raise exception.Error(
|
||||||
|
message=(_("Error retrieving image list from glance: %s") % ex))
|
||||||
|
num_matches = len(image_list)
|
||||||
|
if num_matches == 0:
|
||||||
|
logger.info(_("Image %s was not found in glance") %
|
||||||
|
image_identifier)
|
||||||
|
raise exception.ImageNotFound(image_name=image_identifier)
|
||||||
|
elif num_matches > 1:
|
||||||
|
logger.info(_("Multiple images %s were found in glance with name")
|
||||||
|
% image_identifier)
|
||||||
|
raise exception.PhysicalResourceNameAmbiguity(name=image_identifier)
|
||||||
|
else:
|
||||||
|
return image_list[0].id
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
from heat.common import exception
|
from heat.common import exception
|
||||||
from heat.engine import constraints
|
from heat.engine import constraints
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import glance_utils
|
||||||
|
|
||||||
|
|
||||||
class ImageConstraint(constraints.BaseCustomConstraint):
|
class ImageConstraint(constraints.BaseCustomConstraint):
|
||||||
@ -21,8 +21,8 @@ class ImageConstraint(constraints.BaseCustomConstraint):
|
|||||||
expected_exceptions = (exception.ImageNotFound,)
|
expected_exceptions = (exception.ImageNotFound,)
|
||||||
|
|
||||||
def validate_with_client(self, client, value):
|
def validate_with_client(self, client, value):
|
||||||
nova_client = client.nova()
|
glance_client = client.glance()
|
||||||
nova_utils.get_image_id(nova_client, value)
|
glance_utils.get_image_id(glance_client, value)
|
||||||
|
|
||||||
|
|
||||||
def constraint_mapping():
|
def constraint_mapping():
|
||||||
|
@ -22,6 +22,7 @@ from heat.engine import clients
|
|||||||
from heat.engine import constraints
|
from heat.engine import constraints
|
||||||
from heat.engine import properties
|
from heat.engine import properties
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources.network_interface import NetworkInterface
|
from heat.engine.resources.network_interface import NetworkInterface
|
||||||
from heat.engine.resources.neutron import neutron
|
from heat.engine.resources.neutron import neutron
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
@ -442,7 +443,7 @@ class Instance(resource.Resource):
|
|||||||
|
|
||||||
image_name = self.properties[self.IMAGE_ID]
|
image_name = self.properties[self.IMAGE_ID]
|
||||||
|
|
||||||
image_id = nova_utils.get_image_id(self.nova(), image_name)
|
image_id = glance_utils.get_image_id(self.glance(), image_name)
|
||||||
|
|
||||||
flavor_id = nova_utils.get_flavor_id(self.nova(), flavor)
|
flavor_id = nova_utils.get_flavor_id(self.nova(), flavor)
|
||||||
|
|
||||||
|
@ -30,7 +30,6 @@ from heat.engine import clients
|
|||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
from heat.openstack.common.gettextutils import _
|
from heat.openstack.common.gettextutils import _
|
||||||
from heat.openstack.common import log as logging
|
from heat.openstack.common import log as logging
|
||||||
from heat.openstack.common import uuidutils
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -71,55 +70,6 @@ def refresh_server(server):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
def get_image_id(nova_client, image_identifier):
|
|
||||||
'''
|
|
||||||
Return an id for the specified image name or identifier.
|
|
||||||
|
|
||||||
:param nova_client: the nova client to use
|
|
||||||
:param image_identifier: image name or a UUID-like identifier
|
|
||||||
:returns: the id of the requested :image_identifier:
|
|
||||||
:raises: exception.ImageNotFound, exception.PhysicalResourceNameAmbiguity
|
|
||||||
'''
|
|
||||||
if uuidutils.is_uuid_like(image_identifier):
|
|
||||||
try:
|
|
||||||
image_id = nova_client.images.get(image_identifier).id
|
|
||||||
except clients.novaclient.exceptions.NotFound:
|
|
||||||
image_id = get_image_id_by_name(nova_client, image_identifier)
|
|
||||||
else:
|
|
||||||
image_id = get_image_id_by_name(nova_client, image_identifier)
|
|
||||||
return image_id
|
|
||||||
|
|
||||||
|
|
||||||
def get_image_id_by_name(nova_client, image_identifier):
|
|
||||||
'''
|
|
||||||
Return an id for the specified image name or identifier.
|
|
||||||
|
|
||||||
:param nova_client: the nova client to use
|
|
||||||
:param image_identifier: image name or a UUID-like identifier
|
|
||||||
:returns: the id of the requested :image_identifier:
|
|
||||||
:raises: exception.ImageNotFound, exception.PhysicalResourceNameAmbiguity
|
|
||||||
'''
|
|
||||||
try:
|
|
||||||
image_list = nova_client.images.list()
|
|
||||||
except clients.novaclient.exceptions.ClientException as ex:
|
|
||||||
raise exception.Error(
|
|
||||||
message=(_("Error retrieving image list from nova: %s") % ex))
|
|
||||||
image_names = dict(
|
|
||||||
(o.id, o.name)
|
|
||||||
for o in image_list if o.name == image_identifier)
|
|
||||||
if len(image_names) == 0:
|
|
||||||
logger.info(_("Image %s was not found in glance") %
|
|
||||||
image_identifier)
|
|
||||||
raise exception.ImageNotFound(image_name=image_identifier)
|
|
||||||
elif len(image_names) > 1:
|
|
||||||
logger.info(_("Multiple images %s were found in glance with name")
|
|
||||||
% image_identifier)
|
|
||||||
raise exception.PhysicalResourceNameAmbiguity(
|
|
||||||
name=image_identifier)
|
|
||||||
image_id = image_names.popitem()[0]
|
|
||||||
return image_id
|
|
||||||
|
|
||||||
|
|
||||||
def get_ip(server, net_type, ip_version):
|
def get_ip(server, net_type, ip_version):
|
||||||
"""Return the server's IP of the given type and version."""
|
"""Return the server's IP of the given type and version."""
|
||||||
if net_type in server.addresses:
|
if net_type in server.addresses:
|
||||||
|
@ -22,6 +22,7 @@ from heat.engine import clients
|
|||||||
from heat.engine import constraints
|
from heat.engine import constraints
|
||||||
from heat.engine import properties
|
from heat.engine import properties
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources.neutron import subnet
|
from heat.engine.resources.neutron import subnet
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
from heat.engine.resources.software_config import software_config as sc
|
from heat.engine.resources.software_config import software_config as sc
|
||||||
@ -480,7 +481,7 @@ class Server(stack_user.StackUser):
|
|||||||
|
|
||||||
image = self.properties.get(self.IMAGE)
|
image = self.properties.get(self.IMAGE)
|
||||||
if image:
|
if image:
|
||||||
image = nova_utils.get_image_id(self.nova(), image)
|
image = glance_utils.get_image_id(self.glance(), image)
|
||||||
|
|
||||||
flavor_id = nova_utils.get_flavor_id(self.nova(), flavor)
|
flavor_id = nova_utils.get_flavor_id(self.nova(), flavor)
|
||||||
|
|
||||||
@ -739,7 +740,7 @@ class Server(stack_user.StackUser):
|
|||||||
if image_update_policy == 'REPLACE':
|
if image_update_policy == 'REPLACE':
|
||||||
raise resource.UpdateReplace(self.name)
|
raise resource.UpdateReplace(self.name)
|
||||||
image = prop_diff[self.IMAGE]
|
image = prop_diff[self.IMAGE]
|
||||||
image_id = nova_utils.get_image_id(self.nova(), image)
|
image_id = glance_utils.get_image_id(self.glance(), image)
|
||||||
if not server:
|
if not server:
|
||||||
server = self.nova().servers.get(self.resource_id)
|
server = self.nova().servers.get(self.resource_id)
|
||||||
preserve_ephemeral = (
|
preserve_ephemeral = (
|
||||||
|
@ -19,7 +19,7 @@ from heat.engine import clients
|
|||||||
from heat.engine import constraints
|
from heat.engine import constraints
|
||||||
from heat.engine import properties
|
from heat.engine import properties
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
from heat.engine import support
|
from heat.engine import support
|
||||||
from heat.openstack.common.importutils import try_import
|
from heat.openstack.common.importutils import try_import
|
||||||
@ -545,8 +545,8 @@ class CinderVolume(Volume):
|
|||||||
'availability_zone': self.properties[self.AVAILABILITY_ZONE]
|
'availability_zone': self.properties[self.AVAILABILITY_ZONE]
|
||||||
}
|
}
|
||||||
if self.properties.get(self.IMAGE):
|
if self.properties.get(self.IMAGE):
|
||||||
arguments['imageRef'] = nova_utils.get_image_id(
|
arguments['imageRef'] = glance_utils.get_image_id(
|
||||||
self.nova(), self.properties[self.IMAGE])
|
self.glance(), self.properties[self.IMAGE])
|
||||||
elif self.properties.get(self.IMAGE_REF):
|
elif self.properties.get(self.IMAGE_REF):
|
||||||
arguments['imageRef'] = self.properties[self.IMAGE_REF]
|
arguments['imageRef'] = self.properties[self.IMAGE_REF]
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ from heat.engine import clients
|
|||||||
from heat.engine import function
|
from heat.engine import function
|
||||||
from heat.engine.notification import stack as notification
|
from heat.engine.notification import stack as notification
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import instance
|
from heat.engine.resources import instance
|
||||||
from heat.engine.resources import loadbalancer as lb
|
from heat.engine.resources import loadbalancer as lb
|
||||||
from heat.engine.resources import wait_condition as wc
|
from heat.engine.resources import wait_condition as wc
|
||||||
@ -211,6 +212,19 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
cfg.CONF.set_default('heat_waitcondition_server_url',
|
cfg.CONF.set_default('heat_waitcondition_server_url',
|
||||||
'http://127.0.0.1:8000/v1/waitcondition')
|
'http://127.0.0.1:8000/v1/waitcondition')
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId,
|
||||||
|
update_image=None):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
if update_image:
|
||||||
|
glance_utils.get_image_id(g_cli_mock, update_image).\
|
||||||
|
MultipleTimes().AndReturn(imageId)
|
||||||
|
|
||||||
def _stub_validate(self):
|
def _stub_validate(self):
|
||||||
self.m.StubOutWithMock(parser.Stack, 'validate')
|
self.m.StubOutWithMock(parser.Stack, 'validate')
|
||||||
parser.Stack.validate().MultipleTimes()
|
parser.Stack.validate().MultipleTimes()
|
||||||
@ -426,11 +440,16 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
num_creates_expected_on_updt,
|
num_creates_expected_on_updt,
|
||||||
num_deletes_expected_on_updt,
|
num_deletes_expected_on_updt,
|
||||||
num_reloads_expected_on_updt,
|
num_reloads_expected_on_updt,
|
||||||
update_replace):
|
update_replace,
|
||||||
|
update_image_id=None):
|
||||||
|
|
||||||
# setup stack from the initial template
|
# setup stack from the initial template
|
||||||
tmpl = template_format.parse(init_template)
|
tmpl = template_format.parse(init_template)
|
||||||
stack = utils.parse_stack(tmpl)
|
stack = utils.parse_stack(tmpl)
|
||||||
|
|
||||||
|
self._mock_get_image_id_success('F20-x86_64-cfntools',
|
||||||
|
'image_id')
|
||||||
|
|
||||||
stack.validate()
|
stack.validate()
|
||||||
|
|
||||||
# test stack create
|
# test stack create
|
||||||
@ -483,7 +502,6 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
new_updt_pol = new_grp_tmpl['UpdatePolicy']['AutoScalingRollingUpdate']
|
new_updt_pol = new_grp_tmpl['UpdatePolicy']['AutoScalingRollingUpdate']
|
||||||
new_batch_sz = int(new_updt_pol['MaxBatchSize'])
|
new_batch_sz = int(new_updt_pol['MaxBatchSize'])
|
||||||
self.assertNotEqual(new_batch_sz, init_batch_sz)
|
self.assertNotEqual(new_batch_sz, init_batch_sz)
|
||||||
self._stub_validate()
|
|
||||||
if update_replace:
|
if update_replace:
|
||||||
self._stub_grp_replace(size, size, num_reloads_expected_on_updt)
|
self._stub_grp_replace(size, size, num_reloads_expected_on_updt)
|
||||||
else:
|
else:
|
||||||
@ -491,6 +509,10 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
num_deletes_expected_on_updt,
|
num_deletes_expected_on_updt,
|
||||||
num_reloads_expected_on_updt)
|
num_reloads_expected_on_updt)
|
||||||
self.stub_wallclock()
|
self.stub_wallclock()
|
||||||
|
self._mock_get_image_id_success('F20-x86_64-cfntools', 'image_id',
|
||||||
|
update_image=update_image_id)
|
||||||
|
|
||||||
|
stack.validate()
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
stack.update(updated_stack)
|
stack.update(updated_stack)
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
@ -555,7 +577,8 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
policy['MinInstancesInService'] = '1'
|
policy['MinInstancesInService'] = '1'
|
||||||
policy['MaxBatchSize'] = '3'
|
policy['MaxBatchSize'] = '3'
|
||||||
config = updt_template['Resources']['LaunchConfig']
|
config = updt_template['Resources']['LaunchConfig']
|
||||||
config['Properties']['ImageId'] = 'F17-x86_64-cfntools'
|
update_image = 'F17-x86_64-cfntools'
|
||||||
|
config['Properties']['ImageId'] = update_image
|
||||||
|
|
||||||
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
||||||
json.dumps(updt_template),
|
json.dumps(updt_template),
|
||||||
@ -563,7 +586,8 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
num_creates_expected_on_updt=0,
|
num_creates_expected_on_updt=0,
|
||||||
num_deletes_expected_on_updt=0,
|
num_deletes_expected_on_updt=0,
|
||||||
num_reloads_expected_on_updt=9,
|
num_reloads_expected_on_updt=9,
|
||||||
update_replace=True)
|
update_replace=True,
|
||||||
|
update_image_id=update_image)
|
||||||
|
|
||||||
def test_autoscaling_group_update_replace_with_adjusted_capacity(self):
|
def test_autoscaling_group_update_replace_with_adjusted_capacity(self):
|
||||||
"""
|
"""
|
||||||
@ -576,7 +600,8 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
policy['MinInstancesInService'] = '8'
|
policy['MinInstancesInService'] = '8'
|
||||||
policy['MaxBatchSize'] = '4'
|
policy['MaxBatchSize'] = '4'
|
||||||
config = updt_template['Resources']['LaunchConfig']
|
config = updt_template['Resources']['LaunchConfig']
|
||||||
config['Properties']['ImageId'] = 'F17-x86_64-cfntools'
|
update_image = 'F17-x86_64-cfntools'
|
||||||
|
config['Properties']['ImageId'] = update_image
|
||||||
|
|
||||||
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
||||||
json.dumps(updt_template),
|
json.dumps(updt_template),
|
||||||
@ -584,7 +609,8 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
num_creates_expected_on_updt=2,
|
num_creates_expected_on_updt=2,
|
||||||
num_deletes_expected_on_updt=2,
|
num_deletes_expected_on_updt=2,
|
||||||
num_reloads_expected_on_updt=7,
|
num_reloads_expected_on_updt=7,
|
||||||
update_replace=True)
|
update_replace=True,
|
||||||
|
update_image_id=update_image)
|
||||||
|
|
||||||
def test_autoscaling_group_update_replace_huge_batch_size(self):
|
def test_autoscaling_group_update_replace_huge_batch_size(self):
|
||||||
"""
|
"""
|
||||||
@ -596,7 +622,8 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
policy['MinInstancesInService'] = '0'
|
policy['MinInstancesInService'] = '0'
|
||||||
policy['MaxBatchSize'] = '20'
|
policy['MaxBatchSize'] = '20'
|
||||||
config = updt_template['Resources']['LaunchConfig']
|
config = updt_template['Resources']['LaunchConfig']
|
||||||
config['Properties']['ImageId'] = 'F17-x86_64-cfntools'
|
update_image = 'F17-x86_64-cfntools'
|
||||||
|
config['Properties']['ImageId'] = update_image
|
||||||
|
|
||||||
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
||||||
json.dumps(updt_template),
|
json.dumps(updt_template),
|
||||||
@ -604,7 +631,8 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
num_creates_expected_on_updt=0,
|
num_creates_expected_on_updt=0,
|
||||||
num_deletes_expected_on_updt=0,
|
num_deletes_expected_on_updt=0,
|
||||||
num_reloads_expected_on_updt=3,
|
num_reloads_expected_on_updt=3,
|
||||||
update_replace=True)
|
update_replace=True,
|
||||||
|
update_image_id=update_image)
|
||||||
|
|
||||||
def test_autoscaling_group_update_replace_huge_min_in_service(self):
|
def test_autoscaling_group_update_replace_huge_min_in_service(self):
|
||||||
"""
|
"""
|
||||||
@ -617,6 +645,7 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
policy['MaxBatchSize'] = '1'
|
policy['MaxBatchSize'] = '1'
|
||||||
policy['PauseTime'] = 'PT0S'
|
policy['PauseTime'] = 'PT0S'
|
||||||
config = updt_template['Resources']['LaunchConfig']
|
config = updt_template['Resources']['LaunchConfig']
|
||||||
|
update_image = 'F17-x86_64-cfntools'
|
||||||
config['Properties']['ImageId'] = 'F17-x86_64-cfntools'
|
config['Properties']['ImageId'] = 'F17-x86_64-cfntools'
|
||||||
|
|
||||||
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
self.update_autoscaling_group(asg_tmpl_with_updt_policy,
|
||||||
@ -625,7 +654,8 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
num_creates_expected_on_updt=1,
|
num_creates_expected_on_updt=1,
|
||||||
num_deletes_expected_on_updt=1,
|
num_deletes_expected_on_updt=1,
|
||||||
num_reloads_expected_on_updt=12,
|
num_reloads_expected_on_updt=12,
|
||||||
update_replace=True)
|
update_replace=True,
|
||||||
|
update_image_id=update_image)
|
||||||
|
|
||||||
def test_autoscaling_group_update_no_replace(self):
|
def test_autoscaling_group_update_no_replace(self):
|
||||||
"""
|
"""
|
||||||
@ -683,6 +713,7 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
# test stack create
|
# test stack create
|
||||||
size = int(stack['WebServerGroup'].properties['MinSize'])
|
size = int(stack['WebServerGroup'].properties['MinSize'])
|
||||||
self._stub_grp_create(size)
|
self._stub_grp_create(size)
|
||||||
|
self._mock_get_image_id_success('F20-x86_64-cfntools', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
stack.create()
|
stack.create()
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
@ -735,6 +766,7 @@ class AutoScalingGroupTest(HeatTestCase):
|
|||||||
# test stack create
|
# test stack create
|
||||||
size = int(stack['WebServerGroup'].properties['MinSize'])
|
size = int(stack['WebServerGroup'].properties['MinSize'])
|
||||||
self._stub_grp_create(size)
|
self._stub_grp_create(size)
|
||||||
|
self._mock_get_image_id_success('F20-x86_64-cfntools', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
stack.create()
|
stack.create()
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
@ -34,6 +34,7 @@ from heat.engine import environment
|
|||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
from heat.engine.properties import Properties
|
from heat.engine.properties import Properties
|
||||||
from heat.engine import resource as res
|
from heat.engine import resource as res
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import instance as instances
|
from heat.engine.resources import instance as instances
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
from heat.engine import service
|
from heat.engine import service
|
||||||
@ -192,15 +193,30 @@ def setup_keystone_mocks(mocks, stack):
|
|||||||
stack.clients.keystone().MultipleTimes().AndReturn(fkc)
|
stack.clients.keystone().MultipleTimes().AndReturn(fkc)
|
||||||
|
|
||||||
|
|
||||||
def setup_mocks(mocks, stack):
|
def setup_mock_for_image_constraint(mocks, imageId_input,
|
||||||
|
imageId_output=744):
|
||||||
|
g_cli_mock = mocks.CreateMockAnything()
|
||||||
|
mocks.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
mocks.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).\
|
||||||
|
MultipleTimes().AndReturn(imageId_output)
|
||||||
|
|
||||||
|
|
||||||
|
def setup_mocks(mocks, stack, mock_image_constraint=True):
|
||||||
fc = fakes.FakeClient()
|
fc = fakes.FakeClient()
|
||||||
mocks.StubOutWithMock(instances.Instance, 'nova')
|
mocks.StubOutWithMock(instances.Instance, 'nova')
|
||||||
instances.Instance.nova().MultipleTimes().AndReturn(fc)
|
instances.Instance.nova().MultipleTimes().AndReturn(fc)
|
||||||
mocks.StubOutWithMock(clients.OpenStackClients, 'nova')
|
mocks.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(fc)
|
||||||
|
instance = stack['WebServer']
|
||||||
|
if mock_image_constraint:
|
||||||
|
setup_mock_for_image_constraint(mocks,
|
||||||
|
instance.t['Properties']['ImageId'])
|
||||||
|
|
||||||
setup_keystone_mocks(mocks, stack)
|
setup_keystone_mocks(mocks, stack)
|
||||||
|
|
||||||
instance = stack['WebServer']
|
|
||||||
user_data = instance.properties['UserData']
|
user_data = instance.properties['UserData']
|
||||||
server_userdata = nova_utils.build_userdata(instance, user_data,
|
server_userdata = nova_utils.build_userdata(instance, user_data,
|
||||||
'ec2-user')
|
'ec2-user')
|
||||||
@ -610,8 +626,7 @@ class StackServiceCreateUpdateDeleteTest(HeatTestCase):
|
|||||||
def test_stack_validate(self):
|
def test_stack_validate(self):
|
||||||
stack_name = 'service_create_test_validate'
|
stack_name = 'service_create_test_validate'
|
||||||
stack = get_wordpress_stack(stack_name, self.ctx)
|
stack = get_wordpress_stack(stack_name, self.ctx)
|
||||||
setup_mocks(self.m, stack)
|
setup_mocks(self.m, stack, mock_image_constraint=False)
|
||||||
|
|
||||||
resource = stack['WebServer']
|
resource = stack['WebServer']
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
@ -623,6 +638,7 @@ class StackServiceCreateUpdateDeleteTest(HeatTestCase):
|
|||||||
'KeyName': 'test',
|
'KeyName': 'test',
|
||||||
'InstanceType': 'm1.large'
|
'InstanceType': 'm1.large'
|
||||||
})
|
})
|
||||||
|
setup_mock_for_image_constraint(self.m, 'CentOS 5.2')
|
||||||
stack.validate()
|
stack.validate()
|
||||||
|
|
||||||
resource.properties = Properties(
|
resource.properties = Properties(
|
||||||
|
109
heat/tests/test_glance_utils.py
Normal file
109
heat/tests/test_glance_utils.py
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#
|
||||||
|
# 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.
|
||||||
|
"""Tests for :module:'heat.engine.resources.glance_utils'."""
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from glanceclient import exc as glance_exceptions
|
||||||
|
|
||||||
|
from heat.common import exception
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
|
from heat.tests.common import HeatTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class GlanceUtilsTests(HeatTestCase):
|
||||||
|
"""
|
||||||
|
Basic tests for the helper methods in
|
||||||
|
:module:'heat.engine.resources.glance_utils'.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(GlanceUtilsTests, self).setUp()
|
||||||
|
self.glance_client = self.m.CreateMockAnything()
|
||||||
|
|
||||||
|
def test_get_image_id(self):
|
||||||
|
"""Tests the get_image_id function."""
|
||||||
|
my_image = self.m.CreateMockAnything()
|
||||||
|
img_id = str(uuid.uuid4())
|
||||||
|
img_name = 'myfakeimage'
|
||||||
|
my_image.id = img_id
|
||||||
|
my_image.name = img_name
|
||||||
|
self.glance_client.images = self.m.CreateMockAnything()
|
||||||
|
self.glance_client.images.get(img_id).AndReturn(my_image)
|
||||||
|
filters = {'name': img_name}
|
||||||
|
self.glance_client.images.list(filters=filters).AndReturn([my_image])
|
||||||
|
filters = {'name': 'noimage'}
|
||||||
|
self.glance_client.images.list(filters=filters).AndReturn([])
|
||||||
|
self.m.ReplayAll()
|
||||||
|
self.assertEqual(img_id, glance_utils.get_image_id(
|
||||||
|
self.glance_client, img_id))
|
||||||
|
self.assertEqual(img_id, glance_utils.get_image_id(
|
||||||
|
self.glance_client, img_name))
|
||||||
|
self.assertRaises(exception.ImageNotFound, glance_utils.get_image_id,
|
||||||
|
self.glance_client, 'noimage')
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_image_id_by_name_in_uuid(self):
|
||||||
|
"""Tests the get_image_id function by name in uuid."""
|
||||||
|
my_image = self.m.CreateMockAnything()
|
||||||
|
img_id = str(uuid.uuid4())
|
||||||
|
img_name = str(uuid.uuid4())
|
||||||
|
my_image.id = img_id
|
||||||
|
my_image.name = img_name
|
||||||
|
self.glance_client.images = self.m.CreateMockAnything()
|
||||||
|
self.glance_client.images.get(img_name).AndRaise(
|
||||||
|
glance_exceptions.NotFound(404))
|
||||||
|
filters = {'name': img_name}
|
||||||
|
self.glance_client.images.list(filters=filters).MultipleTimes().\
|
||||||
|
AndReturn([my_image])
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
self.assertEqual(img_id, glance_utils.get_image_id(self.glance_client,
|
||||||
|
img_name))
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_image_id_not_found(self):
|
||||||
|
"""Tests the get_image_id function while image is not found."""
|
||||||
|
my_image = self.m.CreateMockAnything()
|
||||||
|
img_name = str(uuid.uuid4())
|
||||||
|
my_image.name = img_name
|
||||||
|
self.glance_client.images = self.m.CreateMockAnything()
|
||||||
|
self.glance_client.images.get(img_name).AndRaise(
|
||||||
|
glance_exceptions.NotFound(404))
|
||||||
|
filters = {'name': img_name}
|
||||||
|
self.glance_client.images.list(filters=filters).MultipleTimes().\
|
||||||
|
AndReturn([])
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
self.assertRaises(exception.ImageNotFound,
|
||||||
|
glance_utils.get_image_id,
|
||||||
|
self.glance_client, img_name)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_image_id_name_ambiguity(self):
|
||||||
|
"""Tests the get_image_id function while name ambiguity ."""
|
||||||
|
my_image = self.m.CreateMockAnything()
|
||||||
|
img_name = 'ambiguity_name'
|
||||||
|
my_image.name = img_name
|
||||||
|
image_list = [my_image, my_image]
|
||||||
|
|
||||||
|
self.glance_client.images = self.m.CreateMockAnything()
|
||||||
|
filters = {'name': img_name}
|
||||||
|
self.glance_client.images.list(filters=filters).MultipleTimes().\
|
||||||
|
AndReturn(image_list)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
self.assertRaises(exception.PhysicalResourceNameAmbiguity,
|
||||||
|
glance_utils.get_image_id,
|
||||||
|
self.glance_client, img_name)
|
||||||
|
self.m.VerifyAll()
|
@ -14,21 +14,21 @@ import mock
|
|||||||
|
|
||||||
from heat.common import exception
|
from heat.common import exception
|
||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import image
|
from heat.engine.resources import image
|
||||||
from heat.engine.resources import nova_utils
|
|
||||||
from heat.tests.common import HeatTestCase
|
from heat.tests.common import HeatTestCase
|
||||||
|
|
||||||
|
|
||||||
class ImageConstraintTest(HeatTestCase):
|
class ImageConstraintTest(HeatTestCase):
|
||||||
|
|
||||||
@mock.patch.object(nova_utils, 'get_image_id')
|
@mock.patch.object(glance_utils, 'get_image_id')
|
||||||
def test_validation(self, mock_get_image):
|
def test_validation(self, mock_get_image):
|
||||||
with mock.patch.object(clients, "OpenStackClients"):
|
with mock.patch.object(clients, "OpenStackClients"):
|
||||||
constraint = image.ImageConstraint()
|
constraint = image.ImageConstraint()
|
||||||
mock_get_image.return_value = "id1"
|
mock_get_image.return_value = "id1"
|
||||||
self.assertTrue(constraint.validate("foo", None))
|
self.assertTrue(constraint.validate("foo", None))
|
||||||
|
|
||||||
@mock.patch.object(nova_utils, 'get_image_id')
|
@mock.patch.object(glance_utils, 'get_image_id')
|
||||||
def test_validation_error(self, mock_get_image):
|
def test_validation_error(self, mock_get_image):
|
||||||
with mock.patch.object(clients, "OpenStackClients"):
|
with mock.patch.object(clients, "OpenStackClients"):
|
||||||
constraint = image.ImageConstraint()
|
constraint = image.ImageConstraint()
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
import copy
|
import copy
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
from glanceclient import exc as glance_exceptions
|
||||||
import mox
|
import mox
|
||||||
from neutronclient.v2_0 import client as neutronclient
|
from neutronclient.v2_0 import client as neutronclient
|
||||||
|
|
||||||
@ -23,12 +24,12 @@ from heat.engine import clients
|
|||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import image
|
from heat.engine.resources import image
|
||||||
from heat.engine.resources import instance as instances
|
from heat.engine.resources import instance as instances
|
||||||
from heat.engine.resources import network_interface
|
from heat.engine.resources import network_interface
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
from heat.openstack.common import uuidutils
|
|
||||||
from heat.tests.common import HeatTestCase
|
from heat.tests.common import HeatTestCase
|
||||||
from heat.tests import utils
|
from heat.tests import utils
|
||||||
from heat.tests.v1_1 import fakes
|
from heat.tests.v1_1 import fakes
|
||||||
@ -77,6 +78,23 @@ class InstancesTest(HeatTestCase):
|
|||||||
stack_id=str(uuid.uuid4()))
|
stack_id=str(uuid.uuid4()))
|
||||||
return (t, stack)
|
return (t, stack)
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
|
||||||
|
def _mock_get_image_id_fail(self, image_id, exp):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, image_id).AndRaise(exp)
|
||||||
|
|
||||||
def _setup_test_instance(self, return_server, name, image_id=None,
|
def _setup_test_instance(self, return_server, name, image_id=None,
|
||||||
stub_create=True):
|
stub_create=True):
|
||||||
stack_name = '%s_s' % name
|
stack_name = '%s_s' % name
|
||||||
@ -88,6 +106,8 @@ class InstancesTest(HeatTestCase):
|
|||||||
'256 MB Server'
|
'256 MB Server'
|
||||||
instance = instances.Instance(name, t['Resources']['WebServer'], stack)
|
instance = instances.Instance(name, t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
|
self._mock_get_image_id_success(image_id or 'CentOS 5.2', 1)
|
||||||
|
|
||||||
self.m.StubOutWithMock(instance, 'nova')
|
self.m.StubOutWithMock(instance, 'nova')
|
||||||
instance.nova().MultipleTimes().AndReturn(self.fc)
|
instance.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
@ -136,8 +156,6 @@ class InstancesTest(HeatTestCase):
|
|||||||
instance = self._setup_test_instance(return_server,
|
instance = self._setup_test_instance(return_server,
|
||||||
'in_create_imgid',
|
'in_create_imgid',
|
||||||
image_id='1')
|
image_id='1')
|
||||||
self.m.StubOutWithMock(uuidutils, "is_uuid_like")
|
|
||||||
uuidutils.is_uuid_like('1').MultipleTimes().AndReturn(True)
|
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
scheduler.TaskRunner(instance.create)()
|
scheduler.TaskRunner(instance.create)()
|
||||||
@ -162,8 +180,9 @@ class InstancesTest(HeatTestCase):
|
|||||||
instance = instances.Instance('instance_create_image_err',
|
instance = instances.Instance('instance_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
g_cli_moc = self.m.CreateMockAnything()
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(g_cli_moc)
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertRaises(ValueError, instance.handle_create)
|
self.assertRaises(ValueError, instance.handle_create)
|
||||||
@ -179,12 +198,10 @@ class InstancesTest(HeatTestCase):
|
|||||||
instance = instances.Instance('instance_create_image_err',
|
instance = instances.Instance('instance_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self._mock_get_image_id_fail('CentOS 5.2',
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
exception.PhysicalResourceNameAmbiguity(
|
||||||
self.m.StubOutWithMock(self.fc.client, "get_images_detail")
|
name='CentOS 5.2'))
|
||||||
self.fc.client.get_images_detail().AndReturn((
|
|
||||||
200, {'images': [{'id': 1, 'name': 'CentOS 5.2'},
|
|
||||||
{'id': 4, 'name': 'CentOS 5.2'}]}))
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertRaises(ValueError, instance.handle_create)
|
self.assertRaises(ValueError, instance.handle_create)
|
||||||
@ -200,13 +217,8 @@ class InstancesTest(HeatTestCase):
|
|||||||
instance = instances.Instance('instance_create_image_err',
|
instance = instances.Instance('instance_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self._mock_get_image_id_fail('1', glance_exceptions.NotFound(404))
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
self.m.StubOutWithMock(uuidutils, "is_uuid_like")
|
|
||||||
uuidutils.is_uuid_like('1').AndReturn(True)
|
|
||||||
self.m.StubOutWithMock(self.fc.client, "get_images_1")
|
|
||||||
self.fc.client.get_images_1().AndRaise(
|
|
||||||
instances.clients.novaclient.exceptions.NotFound(404))
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertRaises(ValueError, instance.handle_create)
|
self.assertRaises(ValueError, instance.handle_create)
|
||||||
@ -270,16 +282,14 @@ class InstancesTest(HeatTestCase):
|
|||||||
stack_name = 'test_instance_validate_stack'
|
stack_name = 'test_instance_validate_stack'
|
||||||
(t, stack) = self._setup_test_stack(stack_name)
|
(t, stack) = self._setup_test_stack(stack_name)
|
||||||
|
|
||||||
# create an instance with non exist image Id
|
|
||||||
t['Resources']['WebServer']['Properties']['ImageId'] = '1'
|
t['Resources']['WebServer']['Properties']['ImageId'] = '1'
|
||||||
instance = instances.Instance('instance_create_image_err',
|
instance = instances.Instance('instance_create_image',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
|
||||||
self.m.StubOutWithMock(uuidutils, "is_uuid_like")
|
self._mock_get_image_id_success('1', 1)
|
||||||
uuidutils.is_uuid_like('1').MultipleTimes().AndReturn(True)
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertIsNone(instance.validate())
|
self.assertIsNone(instance.validate())
|
||||||
|
@ -17,6 +17,7 @@ from heat.common import template_format
|
|||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import instance as instances
|
from heat.engine.resources import instance as instances
|
||||||
from heat.engine.resources import network_interface as network_interfaces
|
from heat.engine.resources import network_interface as network_interfaces
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
@ -149,6 +150,15 @@ class instancesTest(HeatTestCase):
|
|||||||
super(instancesTest, self).setUp()
|
super(instancesTest, self).setUp()
|
||||||
self.fc = fakes.FakeClient()
|
self.fc = fakes.FakeClient()
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
|
||||||
def _create_test_instance(self, return_server, name):
|
def _create_test_instance(self, return_server, name):
|
||||||
stack_name = '%s_s' % name
|
stack_name = '%s_s' % name
|
||||||
t = template_format.parse(wp_template)
|
t = template_format.parse(wp_template)
|
||||||
@ -159,8 +169,8 @@ class instancesTest(HeatTestCase):
|
|||||||
stack = parser.Stack(utils.dummy_context(), stack_name, template,
|
stack = parser.Stack(utils.dummy_context(), stack_name, template,
|
||||||
environment.Environment(kwargs),
|
environment.Environment(kwargs),
|
||||||
stack_id=str(uuid.uuid4()))
|
stack_id=str(uuid.uuid4()))
|
||||||
|
image_id = 'CentOS 5.2'
|
||||||
t['Resources']['WebServer']['Properties']['ImageId'] = 'CentOS 5.2'
|
t['Resources']['WebServer']['Properties']['ImageId'] = image_id
|
||||||
instance = instances.Instance('%s_name' % name,
|
instance = instances.Instance('%s_name' % name,
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
@ -169,6 +179,8 @@ class instancesTest(HeatTestCase):
|
|||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
|
||||||
|
self._mock_get_image_id_success(image_id, 1)
|
||||||
|
|
||||||
self.m.StubOutWithMock(instance, 'neutron')
|
self.m.StubOutWithMock(instance, 'neutron')
|
||||||
instance.neutron().MultipleTimes().AndReturn(FakeNeutron())
|
instance.neutron().MultipleTimes().AndReturn(FakeNeutron())
|
||||||
|
|
||||||
@ -207,8 +219,8 @@ class instancesTest(HeatTestCase):
|
|||||||
stack = parser.Stack(utils.dummy_context(), stack_name, template,
|
stack = parser.Stack(utils.dummy_context(), stack_name, template,
|
||||||
environment.Environment(kwargs),
|
environment.Environment(kwargs),
|
||||||
stack_id=str(uuid.uuid4()))
|
stack_id=str(uuid.uuid4()))
|
||||||
|
image_id = 'CentOS 5.2'
|
||||||
t['Resources']['WebServer']['Properties']['ImageId'] = 'CentOS 5.2'
|
t['Resources']['WebServer']['Properties']['ImageId'] = image_id
|
||||||
|
|
||||||
nic = network_interfaces.NetworkInterface('%s_nic' % name,
|
nic = network_interfaces.NetworkInterface('%s_nic' % name,
|
||||||
t['Resources']['nic1'],
|
t['Resources']['nic1'],
|
||||||
@ -217,6 +229,7 @@ class instancesTest(HeatTestCase):
|
|||||||
instance = instances.Instance('%s_name' % name,
|
instance = instances.Instance('%s_name' % name,
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
|
self._mock_get_image_id_success(image_id, 1)
|
||||||
self.m.StubOutWithMock(nic, 'neutron')
|
self.m.StubOutWithMock(nic, 'neutron')
|
||||||
nic.neutron().MultipleTimes().AndReturn(FakeNeutron())
|
nic.neutron().MultipleTimes().AndReturn(FakeNeutron())
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ from heat.common import exception
|
|||||||
from heat.common import template_format
|
from heat.common import template_format
|
||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import instance
|
from heat.engine.resources import instance
|
||||||
from heat.engine.resources import loadbalancer as lb
|
from heat.engine.resources import loadbalancer as lb
|
||||||
from heat.engine.resources import wait_condition as wc
|
from heat.engine.resources import wait_condition as wc
|
||||||
@ -122,8 +123,16 @@ class LoadBalancerTest(HeatTestCase):
|
|||||||
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
|
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
|
||||||
return rsrc
|
return rsrc
|
||||||
|
|
||||||
def _create_stubs(self, key_name='test', stub_meta=True):
|
def _mock_get_image_id_success(self, imageId_input, imageId):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).\
|
||||||
|
MultipleTimes().AndReturn(imageId)
|
||||||
|
|
||||||
|
def _create_stubs(self, key_name='test', stub_meta=True):
|
||||||
self.m.StubOutWithMock(stack_user.StackUser, 'keystone')
|
self.m.StubOutWithMock(stack_user.StackUser, 'keystone')
|
||||||
stack_user.StackUser.keystone().MultipleTimes().AndReturn(self.fkc)
|
stack_user.StackUser.keystone().MultipleTimes().AndReturn(self.fkc)
|
||||||
|
|
||||||
@ -133,6 +142,7 @@ class LoadBalancerTest(HeatTestCase):
|
|||||||
limit=instance.Instance.physical_resource_name_limit)
|
limit=instance.Instance.physical_resource_name_limit)
|
||||||
clients.OpenStackClients.nova(
|
clients.OpenStackClients.nova(
|
||||||
"compute").MultipleTimes().AndReturn(self.fc)
|
"compute").MultipleTimes().AndReturn(self.fc)
|
||||||
|
if key_name:
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
flavor=2, image=746, key_name=key_name,
|
flavor=2, image=746, key_name=key_name,
|
||||||
@ -147,8 +157,8 @@ class LoadBalancerTest(HeatTestCase):
|
|||||||
wc.WaitConditionHandle.get_status().AndReturn(['SUCCESS'])
|
wc.WaitConditionHandle.get_status().AndReturn(['SUCCESS'])
|
||||||
|
|
||||||
def test_loadbalancer(self):
|
def test_loadbalancer(self):
|
||||||
|
self._mock_get_image_id_success(u'F20-x86_64-cfntools', 746)
|
||||||
self._create_stubs()
|
self._create_stubs()
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
t = template_format.parse(lb_template)
|
t = template_format.parse(lb_template)
|
||||||
@ -202,7 +212,9 @@ class LoadBalancerTest(HeatTestCase):
|
|||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
|
||||||
def test_loadbalancer_nokey(self):
|
def test_loadbalancer_nokey(self):
|
||||||
|
self._mock_get_image_id_success(u'F20-x86_64-cfntools', 746)
|
||||||
self._create_stubs(key_name=None, stub_meta=False)
|
self._create_stubs(key_name=None, stub_meta=False)
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
t = template_format.parse(lb_template_nokey)
|
t = template_format.parse(lb_template_nokey)
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
from heat.common import template_format
|
from heat.common import template_format
|
||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import instance as instances
|
from heat.engine.resources import instance as instances
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
@ -59,8 +60,13 @@ class nokeyTest(HeatTestCase):
|
|||||||
|
|
||||||
self.m.StubOutWithMock(instance, 'nova')
|
self.m.StubOutWithMock(instance, 'nova')
|
||||||
instance.nova().MultipleTimes().AndReturn(self.fc)
|
instance.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, 'CentOS 5.2').MultipleTimes().\
|
||||||
|
AndReturn(1)
|
||||||
|
|
||||||
# need to resolve the template functions
|
# need to resolve the template functions
|
||||||
server_userdata = nova_utils.build_userdata(
|
server_userdata = nova_utils.build_userdata(
|
||||||
@ -84,3 +90,5 @@ class nokeyTest(HeatTestCase):
|
|||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
scheduler.TaskRunner(instance.create)()
|
scheduler.TaskRunner(instance.create)()
|
||||||
|
|
||||||
|
self.m.VerifyAll()
|
||||||
|
@ -33,42 +33,6 @@ class NovaUtilsTests(HeatTestCase):
|
|||||||
super(NovaUtilsTests, self).setUp()
|
super(NovaUtilsTests, self).setUp()
|
||||||
self.nova_client = self.m.CreateMockAnything()
|
self.nova_client = self.m.CreateMockAnything()
|
||||||
|
|
||||||
def test_get_image_id(self):
|
|
||||||
"""Tests the get_image_id function."""
|
|
||||||
my_image = self.m.CreateMockAnything()
|
|
||||||
img_id = str(uuid.uuid4())
|
|
||||||
img_name = 'myfakeimage'
|
|
||||||
my_image.id = img_id
|
|
||||||
my_image.name = img_name
|
|
||||||
self.nova_client.images = self.m.CreateMockAnything()
|
|
||||||
self.nova_client.images.get(img_id).AndReturn(my_image)
|
|
||||||
self.nova_client.images.list().MultipleTimes().AndReturn([my_image])
|
|
||||||
self.m.ReplayAll()
|
|
||||||
self.assertEqual(img_id, nova_utils.get_image_id(self.nova_client,
|
|
||||||
img_id))
|
|
||||||
self.assertEqual(img_id, nova_utils.get_image_id(self.nova_client,
|
|
||||||
'myfakeimage'))
|
|
||||||
self.assertRaises(exception.ImageNotFound, nova_utils.get_image_id,
|
|
||||||
self.nova_client, 'noimage')
|
|
||||||
self.m.VerifyAll()
|
|
||||||
|
|
||||||
def test_get_image_id_by_name_in_uuid(self):
|
|
||||||
"""Tests the get_image_id function by name in uuid."""
|
|
||||||
my_image = self.m.CreateMockAnything()
|
|
||||||
img_id = str(uuid.uuid4())
|
|
||||||
img_name = str(uuid.uuid4())
|
|
||||||
my_image.id = img_id
|
|
||||||
my_image.name = img_name
|
|
||||||
self.nova_client.images = self.m.CreateMockAnything()
|
|
||||||
self.nova_client.images.get(img_name).AndRaise(
|
|
||||||
clients.novaclient.exceptions.NotFound(404))
|
|
||||||
self.nova_client.images.list().MultipleTimes().AndReturn([my_image])
|
|
||||||
self.m.ReplayAll()
|
|
||||||
|
|
||||||
self.assertEqual(img_id, nova_utils.get_image_id(self.nova_client,
|
|
||||||
img_name))
|
|
||||||
self.m.VerifyAll()
|
|
||||||
|
|
||||||
def test_get_ip(self):
|
def test_get_ip(self):
|
||||||
my_image = self.m.CreateMockAnything()
|
my_image = self.m.CreateMockAnything()
|
||||||
my_image.addresses = {
|
my_image.addresses = {
|
||||||
|
@ -25,13 +25,13 @@ from heat.engine import clients
|
|||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import image
|
from heat.engine.resources import image
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
from heat.engine.resources import server as servers
|
from heat.engine.resources import server as servers
|
||||||
from heat.engine.resources.software_config import software_config as sc
|
from heat.engine.resources.software_config import software_config as sc
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
from heat.openstack.common.gettextutils import _
|
from heat.openstack.common.gettextutils import _
|
||||||
from heat.openstack.common import uuidutils
|
|
||||||
from heat.tests.common import HeatTestCase
|
from heat.tests.common import HeatTestCase
|
||||||
from heat.tests import fakes
|
from heat.tests import fakes
|
||||||
from heat.tests import utils
|
from heat.tests import utils
|
||||||
@ -97,7 +97,8 @@ class ServersTest(HeatTestCase):
|
|||||||
return (t, stack)
|
return (t, stack)
|
||||||
|
|
||||||
def _setup_test_server(self, return_server, name, image_id=None,
|
def _setup_test_server(self, return_server, name, image_id=None,
|
||||||
override_name=False, stub_create=True):
|
override_name=False, stub_create=True,
|
||||||
|
server_rebuild=False):
|
||||||
stack_name = '%s_s' % name
|
stack_name = '%s_s' % name
|
||||||
(t, stack) = self._setup_test_stack(stack_name)
|
(t, stack) = self._setup_test_stack(stack_name)
|
||||||
|
|
||||||
@ -114,6 +115,9 @@ class ServersTest(HeatTestCase):
|
|||||||
server = servers.Server(server_name,
|
server = servers.Server(server_name,
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
|
self._mock_get_image_id_success(image_id or 'CentOS 5.2', 1,
|
||||||
|
server_rebuild=server_rebuild)
|
||||||
|
|
||||||
self.m.StubOutWithMock(server, 'nova')
|
self.m.StubOutWithMock(server, 'nova')
|
||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
@ -135,9 +139,10 @@ class ServersTest(HeatTestCase):
|
|||||||
return server
|
return server
|
||||||
|
|
||||||
def _create_test_server(self, return_server, name, override_name=False,
|
def _create_test_server(self, return_server, name, override_name=False,
|
||||||
stub_create=True):
|
stub_create=True, server_rebuild=False):
|
||||||
server = self._setup_test_server(return_server, name,
|
server = self._setup_test_server(return_server, name,
|
||||||
stub_create=stub_create)
|
stub_create=stub_create,
|
||||||
|
server_rebuild=server_rebuild)
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
return server
|
return server
|
||||||
@ -151,6 +156,35 @@ class ServersTest(HeatTestCase):
|
|||||||
|
|
||||||
return fake_interface(port, mac, ip)
|
return fake_interface(port, mac, ip)
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId,
|
||||||
|
server_rebuild=False):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
|
||||||
|
if server_rebuild:
|
||||||
|
glance_utils.get_image_id(g_cli_mock, 'F17-x86_64-gold').\
|
||||||
|
MultipleTimes().AndReturn(744)
|
||||||
|
|
||||||
|
def _mock_get_image_id_fail(self, image_id, exp):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, image_id).AndRaise(exp)
|
||||||
|
|
||||||
|
def _server_validate_mock(self, server):
|
||||||
|
self.m.StubOutWithMock(server, 'nova')
|
||||||
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
|
|
||||||
def test_server_create(self):
|
def test_server_create(self):
|
||||||
return_server = self.fc.servers.list()[1]
|
return_server = self.fc.servers.list()[1]
|
||||||
return_server.id = '5678'
|
return_server.id = '5678'
|
||||||
@ -209,9 +243,10 @@ class ServersTest(HeatTestCase):
|
|||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
instance_meta = {'a': "1"}
|
instance_meta = {'a': "1"}
|
||||||
|
image_id = mox.IgnoreArg()
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
image=mox.IgnoreArg(), flavor=mox.IgnoreArg(), key_name='test',
|
image=image_id, flavor=mox.IgnoreArg(), key_name='test',
|
||||||
name=mox.IgnoreArg(), security_groups=[],
|
name=mox.IgnoreArg(), security_groups=[],
|
||||||
userdata=mox.IgnoreArg(), scheduler_hints=None,
|
userdata=mox.IgnoreArg(), scheduler_hints=None,
|
||||||
meta=instance_meta, nics=None, availability_zone=None,
|
meta=instance_meta, nics=None, availability_zone=None,
|
||||||
@ -223,6 +258,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', image_id)
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
@ -235,8 +271,6 @@ class ServersTest(HeatTestCase):
|
|||||||
'test_server_create_image_id',
|
'test_server_create_image_id',
|
||||||
image_id='1',
|
image_id='1',
|
||||||
override_name=True)
|
override_name=True)
|
||||||
self.m.StubOutWithMock(uuidutils, "is_uuid_like")
|
|
||||||
uuidutils.is_uuid_like('1').MultipleTimes().AndReturn(True)
|
|
||||||
|
|
||||||
interfaces = [
|
interfaces = [
|
||||||
self._create_fake_iface('1234', 'fa:16:3e:8c:22:aa', '4.5.6.7'),
|
self._create_fake_iface('1234', 'fa:16:3e:8c:22:aa', '4.5.6.7'),
|
||||||
@ -286,8 +320,9 @@ class ServersTest(HeatTestCase):
|
|||||||
server = servers.Server('server_create_image_err',
|
server = servers.Server('server_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self._mock_get_image_id_fail('Slackware',
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
exception.ImageNotFound(
|
||||||
|
image_name='Slackware'))
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
error = self.assertRaises(ValueError, server.handle_create)
|
error = self.assertRaises(ValueError, server.handle_create)
|
||||||
@ -307,12 +342,9 @@ class ServersTest(HeatTestCase):
|
|||||||
server = servers.Server('server_create_image_err',
|
server = servers.Server('server_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self._mock_get_image_id_fail('CentOS 5.2',
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
exception.PhysicalResourceNameAmbiguity(
|
||||||
self.m.StubOutWithMock(self.fc.client, "get_images_detail")
|
name='CentOS 5.2'))
|
||||||
self.fc.client.get_images_detail().AndReturn((
|
|
||||||
200, {'images': [{'id': 1, 'name': 'CentOS 5.2'},
|
|
||||||
{'id': 4, 'name': 'CentOS 5.2'}]}))
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
error = self.assertRaises(ValueError, server.handle_create)
|
error = self.assertRaises(ValueError, server.handle_create)
|
||||||
@ -332,13 +364,9 @@ class ServersTest(HeatTestCase):
|
|||||||
server = servers.Server('server_create_image_err',
|
server = servers.Server('server_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self._mock_get_image_id_fail('1',
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
exception.ImageNotFound(image_name='1'))
|
||||||
self.m.StubOutWithMock(uuidutils, "is_uuid_like")
|
|
||||||
uuidutils.is_uuid_like('1').AndReturn(True)
|
|
||||||
self.m.StubOutWithMock(self.fc.client, "get_images_1")
|
|
||||||
self.fc.client.get_images_1().AndRaise(
|
|
||||||
servers.clients.novaclient.exceptions.NotFound(404))
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
error = self.assertRaises(ValueError, server.handle_create)
|
error = self.assertRaises(ValueError, server.handle_create)
|
||||||
@ -394,6 +422,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
@ -435,6 +464,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
@ -476,6 +506,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
@ -512,6 +543,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
|
|
||||||
server.keystone().MultipleTimes().AndReturn(self.fkc)
|
server.keystone().MultipleTimes().AndReturn(self.fkc)
|
||||||
|
|
||||||
@ -576,7 +608,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
server.keystone().MultipleTimes().AndReturn(self.fkc)
|
server.keystone().MultipleTimes().AndReturn(self.fkc)
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
@ -635,9 +667,10 @@ class ServersTest(HeatTestCase):
|
|||||||
|
|
||||||
mock_nova.return_value = self.fc
|
mock_nova.return_value = self.fc
|
||||||
self.fc.servers.create = mock.Mock(return_value=return_server)
|
self.fc.servers.create = mock.Mock(return_value=return_server)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
|
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
self.fc.servers.create.assert_called_once_with(
|
self.fc.servers.create(
|
||||||
image=744, flavor=3, key_name='test',
|
image=744, flavor=3, key_name='test',
|
||||||
name=utils.PhysName(stack_name, server.name),
|
name=utils.PhysName(stack_name, server.name),
|
||||||
security_groups=[],
|
security_groups=[],
|
||||||
@ -660,9 +693,10 @@ class ServersTest(HeatTestCase):
|
|||||||
|
|
||||||
mock_nova.return_value = self.fc
|
mock_nova.return_value = self.fc
|
||||||
self.fc.servers.create = mock.Mock(return_value=return_server)
|
self.fc.servers.create = mock.Mock(return_value=return_server)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
|
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
self.fc.servers.create.assert_called_once_with(
|
self.fc.servers.create(
|
||||||
image=744, flavor=3, key_name='test',
|
image=744, flavor=3, key_name='test',
|
||||||
name=utils.PhysName(stack_name, server.name),
|
name=utils.PhysName(stack_name, server.name),
|
||||||
security_groups=[],
|
security_groups=[],
|
||||||
@ -685,18 +719,15 @@ class ServersTest(HeatTestCase):
|
|||||||
stack_name = 'srv_val'
|
stack_name = 'srv_val'
|
||||||
(t, stack) = self._setup_test_stack(stack_name)
|
(t, stack) = self._setup_test_stack(stack_name)
|
||||||
|
|
||||||
# create an server with non exist image Id
|
|
||||||
t['Resources']['WebServer']['Properties']['image'] = '1'
|
t['Resources']['WebServer']['Properties']['image'] = '1'
|
||||||
server = servers.Server('server_create_image_err',
|
server = servers.Server('server_create_image',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(server, 'nova')
|
|
||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(image.ImageConstraint, "validate")
|
clients.OpenStackClients.nova('compute').MultipleTimes().\
|
||||||
image.ImageConstraint.validate(
|
AndReturn(self.fc)
|
||||||
mox.IgnoreArg(), mox.IgnoreArg()).MultipleTimes().AndReturn(True)
|
self._mock_get_image_id_success('1', 1)
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
@ -841,6 +872,8 @@ class ServersTest(HeatTestCase):
|
|||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
ex = self.assertRaises(exception.StackValidationFailed,
|
ex = self.assertRaises(exception.StackValidationFailed,
|
||||||
@ -871,6 +904,8 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
error = self.assertRaises(exception.ResourcePropertyConflict,
|
error = self.assertRaises(exception.ResourcePropertyConflict,
|
||||||
@ -1016,6 +1051,7 @@ class ServersTest(HeatTestCase):
|
|||||||
self.m.StubOutWithMock(self.fc.servers, 'set_meta')
|
self.m.StubOutWithMock(self.fc.servers, 'set_meta')
|
||||||
self.fc.servers.set_meta(new_return_server,
|
self.fc.servers.set_meta(new_return_server,
|
||||||
new_meta).AndReturn(None)
|
new_meta).AndReturn(None)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 1)
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
update_template = copy.deepcopy(server.t)
|
update_template = copy.deepcopy(server.t)
|
||||||
update_template['Properties']['metadata'] = new_meta
|
update_template['Properties']['metadata'] = new_meta
|
||||||
@ -1118,6 +1154,7 @@ class ServersTest(HeatTestCase):
|
|||||||
(t, stack) = self._setup_test_stack(stack_name)
|
(t, stack) = self._setup_test_stack(stack_name)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
t['Resources']['WebServer']['Properties'][
|
t['Resources']['WebServer']['Properties'][
|
||||||
@ -1135,6 +1172,7 @@ class ServersTest(HeatTestCase):
|
|||||||
(t, stack) = self._setup_test_stack(stack_name)
|
(t, stack) = self._setup_test_stack(stack_name)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
server = servers.Server('server_server_update_flavor_replace',
|
server = servers.Server('server_server_update_flavor_replace',
|
||||||
@ -1176,7 +1214,8 @@ class ServersTest(HeatTestCase):
|
|||||||
return_server = self.fc.servers.list()[1]
|
return_server = self.fc.servers.list()[1]
|
||||||
return_server.id = '1234'
|
return_server.id = '1234'
|
||||||
server = self._create_test_server(return_server,
|
server = self._create_test_server(return_server,
|
||||||
'srv_updimgrbld')
|
'srv_updimgrbld',
|
||||||
|
server_rebuild=True)
|
||||||
|
|
||||||
new_image = 'F17-x86_64-gold'
|
new_image = 'F17-x86_64-gold'
|
||||||
# current test demonstrate updating when image_update_policy was not
|
# current test demonstrate updating when image_update_policy was not
|
||||||
@ -1230,7 +1269,8 @@ class ServersTest(HeatTestCase):
|
|||||||
return_server = self.fc.servers.list()[1]
|
return_server = self.fc.servers.list()[1]
|
||||||
return_server.id = '1234'
|
return_server.id = '1234'
|
||||||
server = self._create_test_server(return_server,
|
server = self._create_test_server(return_server,
|
||||||
'srv_updrbldfail')
|
'srv_updrbldfail',
|
||||||
|
server_rebuild=True)
|
||||||
|
|
||||||
new_image = 'F17-x86_64-gold'
|
new_image = 'F17-x86_64-gold'
|
||||||
# current test demonstrate updating when image_update_policy was not
|
# current test demonstrate updating when image_update_policy was not
|
||||||
@ -1637,10 +1677,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server = servers.Server('server_create_image_err',
|
server = servers.Server('server_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(server, 'nova')
|
self._server_validate_mock(server)
|
||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertIsNone(server.validate())
|
self.assertIsNone(server.validate())
|
||||||
@ -1655,10 +1692,8 @@ class ServersTest(HeatTestCase):
|
|||||||
server = servers.Server('server_create_image_err',
|
server = servers.Server('server_create_image_err',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
|
|
||||||
self.m.StubOutWithMock(server, 'nova')
|
self._server_validate_mock(server)
|
||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertIsNone(server.validate())
|
self.assertIsNone(server.validate())
|
||||||
@ -1688,6 +1723,7 @@ class ServersTest(HeatTestCase):
|
|||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertRaises(exception.ResourcePropertyConflict, server.validate)
|
self.assertRaises(exception.ResourcePropertyConflict, server.validate)
|
||||||
@ -1704,6 +1740,7 @@ class ServersTest(HeatTestCase):
|
|||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
ex = self.assertRaises(exception.StackValidationFailed,
|
ex = self.assertRaises(exception.StackValidationFailed,
|
||||||
@ -1753,6 +1790,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
ex = self.assertRaises(exception.StackValidationFailed,
|
ex = self.assertRaises(exception.StackValidationFailed,
|
||||||
@ -1778,6 +1816,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
self.assertIsNone(server.validate())
|
self.assertIsNone(server.validate())
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
@ -1803,6 +1842,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
exc = self.assertRaises(exception.StackValidationFailed,
|
exc = self.assertRaises(exception.StackValidationFailed,
|
||||||
@ -1831,6 +1871,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertIsNone(server.validate())
|
self.assertIsNone(server.validate())
|
||||||
@ -1852,6 +1893,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertIsNone(server.validate())
|
self.assertIsNone(server.validate())
|
||||||
@ -1873,6 +1915,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
exc = self.assertRaises(exception.StackValidationFailed,
|
exc = self.assertRaises(exception.StackValidationFailed,
|
||||||
@ -1925,8 +1968,9 @@ class ServersTest(HeatTestCase):
|
|||||||
server = servers.Server('create_metadata_test_server',
|
server = servers.Server('create_metadata_test_server',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
|
image_id = mox.IgnoreArg()
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
image=mox.IgnoreArg(), flavor=mox.IgnoreArg(), key_name='test',
|
image=image_id, flavor=mox.IgnoreArg(), key_name='test',
|
||||||
name=mox.IgnoreArg(), security_groups=[],
|
name=mox.IgnoreArg(), security_groups=[],
|
||||||
userdata=mox.IgnoreArg(), scheduler_hints=None,
|
userdata=mox.IgnoreArg(), scheduler_hints=None,
|
||||||
meta=mox.IgnoreArg(), nics=None, availability_zone=None,
|
meta=mox.IgnoreArg(), nics=None, availability_zone=None,
|
||||||
@ -1937,6 +1981,7 @@ class ServersTest(HeatTestCase):
|
|||||||
server.nova().MultipleTimes().AndReturn(self.fc)
|
server.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', image_id)
|
||||||
self.m.StubOutWithMock(nova_utils, 'build_userdata')
|
self.m.StubOutWithMock(nova_utils, 'build_userdata')
|
||||||
nova_utils.build_userdata(server,
|
nova_utils.build_userdata(server,
|
||||||
'wordpress',
|
'wordpress',
|
||||||
|
@ -20,6 +20,7 @@ from heat.common import template_format
|
|||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import instance as instances
|
from heat.engine.resources import instance as instances
|
||||||
from heat.engine.resources import nova_utils
|
from heat.engine.resources import nova_utils
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
@ -129,6 +130,15 @@ class ServerTagsTest(HeatTestCase):
|
|||||||
super(ServerTagsTest, self).setUp()
|
super(ServerTagsTest, self).setUp()
|
||||||
self.fc = fakes.FakeClient()
|
self.fc = fakes.FakeClient()
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
|
||||||
def _setup_test_instance(self, intags=None, nova_tags=None):
|
def _setup_test_instance(self, intags=None, nova_tags=None):
|
||||||
stack_name = 'tag_test'
|
stack_name = 'tag_test'
|
||||||
t = template_format.parse(instance_template)
|
t = template_format.parse(instance_template)
|
||||||
@ -145,7 +155,7 @@ class ServerTagsTest(HeatTestCase):
|
|||||||
instance.nova().MultipleTimes().AndReturn(self.fc)
|
instance.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 1)
|
||||||
# need to resolve the template functions
|
# need to resolve the template functions
|
||||||
server_userdata = nova_utils.build_userdata(
|
server_userdata = nova_utils.build_userdata(
|
||||||
instance,
|
instance,
|
||||||
@ -202,6 +212,7 @@ class ServerTagsTest(HeatTestCase):
|
|||||||
self.m.StubOutWithMock(self.fc.servers, 'set_meta')
|
self.m.StubOutWithMock(self.fc.servers, 'set_meta')
|
||||||
self.fc.servers.set_meta(self.fc.servers.list()[1],
|
self.fc.servers.set_meta(self.fc.servers.list()[1],
|
||||||
new_metadata).AndReturn(None)
|
new_metadata).AndReturn(None)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 1)
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
update_template = copy.deepcopy(instance.t)
|
update_template = copy.deepcopy(instance.t)
|
||||||
update_template['Properties']['Tags'] = new_tags
|
update_template['Properties']['Tags'] = new_tags
|
||||||
@ -234,7 +245,7 @@ class ServerTagsTest(HeatTestCase):
|
|||||||
instances.Instance.nova().MultipleTimes().AndReturn(self.fc)
|
instances.Instance.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 1)
|
||||||
# need to resolve the template functions
|
# need to resolve the template functions
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
@ -285,7 +296,7 @@ class ServerTagsTest(HeatTestCase):
|
|||||||
instances.Instance.nova().MultipleTimes().AndReturn(self.fc)
|
instances.Instance.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('CentOS 5.2', 1)
|
||||||
# need to resolve the template functions
|
# need to resolve the template functions
|
||||||
self.m.StubOutWithMock(self.fc.servers, 'create')
|
self.m.StubOutWithMock(self.fc.servers, 'create')
|
||||||
self.fc.servers.create(
|
self.fc.servers.create(
|
||||||
|
@ -30,6 +30,7 @@ from heat.engine.clients import novaclient
|
|||||||
from heat.engine import environment
|
from heat.engine import environment
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
from heat.engine.resource import Resource
|
from heat.engine.resource import Resource
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import instance as instances
|
from heat.engine.resources import instance as instances
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
from heat.openstack.common import timeutils
|
from heat.openstack.common import timeutils
|
||||||
@ -94,6 +95,15 @@ class SqlAlchemyTest(HeatTestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super(SqlAlchemyTest, self).tearDown()
|
super(SqlAlchemyTest, self).tearDown()
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
|
||||||
def _setup_test_stack(self, stack_name, stack_id=None, owner_id=None,
|
def _setup_test_stack(self, stack_name, stack_id=None, owner_id=None,
|
||||||
stack_user_project_id=None):
|
stack_user_project_id=None):
|
||||||
t = template_format.parse(wp_template)
|
t = template_format.parse(wp_template)
|
||||||
@ -113,6 +123,7 @@ class SqlAlchemyTest(HeatTestCase):
|
|||||||
instances.Instance.nova().MultipleTimes().AndReturn(fc)
|
instances.Instance.nova().MultipleTimes().AndReturn(fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
|
self._mock_get_image_id_success('F17-x86_64-gold', 744)
|
||||||
|
|
||||||
mocks.StubOutWithMock(fc.servers, 'create')
|
mocks.StubOutWithMock(fc.servers, 'create')
|
||||||
fc.servers.create(image=744, flavor=3, key_name='test',
|
fc.servers.create(image=744, flavor=3, key_name='test',
|
||||||
@ -128,9 +139,6 @@ class SqlAlchemyTest(HeatTestCase):
|
|||||||
fc = fakes.FakeClient()
|
fc = fakes.FakeClient()
|
||||||
mocks.StubOutWithMock(instances.Instance, 'nova')
|
mocks.StubOutWithMock(instances.Instance, 'nova')
|
||||||
instances.Instance.nova().MultipleTimes().AndReturn(fc)
|
instances.Instance.nova().MultipleTimes().AndReturn(fc)
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
|
||||||
|
|
||||||
mocks.StubOutWithMock(fc.client, 'get_servers_9999')
|
mocks.StubOutWithMock(fc.client, 'get_servers_9999')
|
||||||
get = fc.client.get_servers_9999
|
get = fc.client.get_servers_9999
|
||||||
get().MultipleTimes().AndRaise(novaclient.exceptions.NotFound(404))
|
get().MultipleTimes().AndRaise(novaclient.exceptions.NotFound(404))
|
||||||
|
@ -11,8 +11,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import collections
|
from glanceclient import exc as g_exc
|
||||||
|
|
||||||
from testtools import skipIf
|
from testtools import skipIf
|
||||||
|
|
||||||
from heat.common import exception
|
from heat.common import exception
|
||||||
@ -22,6 +21,7 @@ from heat.engine import environment
|
|||||||
from heat.engine.hot.template import HOTemplate
|
from heat.engine.hot.template import HOTemplate
|
||||||
from heat.engine import parser
|
from heat.engine import parser
|
||||||
from heat.engine import resources
|
from heat.engine import resources
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine import service
|
from heat.engine import service
|
||||||
from heat.openstack.common.importutils import try_import
|
from heat.openstack.common.importutils import try_import
|
||||||
from heat.tests.common import HeatTestCase
|
from heat.tests.common import HeatTestCase
|
||||||
@ -484,7 +484,7 @@ test_template_invalid_secgroupids = '''
|
|||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
|
|
||||||
test_template_nova_client_exception = '''
|
test_template_glance_client_exception = '''
|
||||||
{
|
{
|
||||||
"AWSTemplateFormatVersion" : "2010-09-09",
|
"AWSTemplateFormatVersion" : "2010-09-09",
|
||||||
"Description" : "test.",
|
"Description" : "test.",
|
||||||
@ -779,9 +779,27 @@ class validateTest(HeatTestCase):
|
|||||||
super(validateTest, self).setUp()
|
super(validateTest, self).setUp()
|
||||||
resources.initialise()
|
resources.initialise()
|
||||||
self.fc = fakes.FakeClient()
|
self.fc = fakes.FakeClient()
|
||||||
|
self.gc = fakes.FakeClient()
|
||||||
resources.initialise()
|
resources.initialise()
|
||||||
self.ctx = utils.dummy_context()
|
self.ctx = utils.dummy_context()
|
||||||
|
|
||||||
|
def _mock_get_image_id_success(self, imageId_input, imageId):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, imageId_input).MultipleTimes().\
|
||||||
|
AndReturn(imageId)
|
||||||
|
|
||||||
|
def _mock_get_image_id_fail(self, image_id, exp):
|
||||||
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
|
g_cli_mock)
|
||||||
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
|
glance_utils.get_image_id(g_cli_mock, image_id).AndRaise(exp)
|
||||||
|
|
||||||
def test_validate_volumeattach_valid(self):
|
def test_validate_volumeattach_valid(self):
|
||||||
t = template_format.parse(test_template_volumeattach % 'vdq')
|
t = template_format.parse(test_template_volumeattach % 'vdq')
|
||||||
stack = parser.Stack(self.ctx, 'test_stack', parser.Template(t))
|
stack = parser.Stack(self.ctx, 'test_stack', parser.Template(t))
|
||||||
@ -1310,8 +1328,7 @@ class validateTest(HeatTestCase):
|
|||||||
stack = parser.Stack(self.ctx, 'test_stack', template,
|
stack = parser.Stack(self.ctx, 'test_stack', template,
|
||||||
environment.Environment(params))
|
environment.Environment(params))
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self._mock_get_image_id_success('image_name', 'image_id')
|
||||||
clients.OpenStackClients.nova().AndReturn(self.fc)
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
resource = stack['Instance']
|
resource = stack['Instance']
|
||||||
@ -1325,8 +1342,9 @@ class validateTest(HeatTestCase):
|
|||||||
stack = parser.Stack(self.ctx, 'test_stack', template,
|
stack = parser.Stack(self.ctx, 'test_stack', template,
|
||||||
environment.Environment({'KeyName': 'test'}))
|
environment.Environment({'KeyName': 'test'}))
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self._mock_get_image_id_fail('image_name',
|
||||||
clients.OpenStackClients.nova().AndReturn(self.fc)
|
exception.ImageNotFound(
|
||||||
|
image_name='image_name'))
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
resource = stack['Instance']
|
resource = stack['Instance']
|
||||||
@ -1341,18 +1359,10 @@ class validateTest(HeatTestCase):
|
|||||||
stack = parser.Stack(self.ctx, 'test_stack', template,
|
stack = parser.Stack(self.ctx, 'test_stack', template,
|
||||||
environment.Environment({'KeyName': 'test'}))
|
environment.Environment({'KeyName': 'test'}))
|
||||||
|
|
||||||
image_type = collections.namedtuple("Image", ("id", "name"))
|
self._mock_get_image_id_fail('image_name',
|
||||||
|
exception.PhysicalResourceNameAmbiguity(
|
||||||
|
name='image_name'))
|
||||||
|
|
||||||
image_list = [image_type(id='768b5464-3df5-4abf-be33-63b60f8b99d0',
|
|
||||||
name='image_name'),
|
|
||||||
image_type(id='a57384f5-690f-48e1-bf46-c4291e6c887e',
|
|
||||||
name='image_name')]
|
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.images, 'list')
|
|
||||||
self.fc.images.list().AndReturn(image_list)
|
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
|
||||||
clients.OpenStackClients.nova().AndReturn(self.fc)
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
resource = stack['Instance']
|
resource = stack['Instance']
|
||||||
@ -1367,13 +1377,7 @@ class validateTest(HeatTestCase):
|
|||||||
stack = parser.Stack(self.ctx, 'test_stack', template,
|
stack = parser.Stack(self.ctx, 'test_stack', template,
|
||||||
environment.Environment({'KeyName': 'test'}))
|
environment.Environment({'KeyName': 'test'}))
|
||||||
|
|
||||||
image_type = collections.namedtuple("Image", ("id", "name"))
|
self._mock_get_image_id_success('image_name', 'image_id')
|
||||||
|
|
||||||
image_list = [image_type(id='768b5464-3df5-4abf-be33-63b60f8b99d0',
|
|
||||||
name='image_name')]
|
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.images, 'list')
|
|
||||||
self.fc.images.list().MultipleTimes().AndReturn(image_list)
|
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
@ -1390,13 +1394,7 @@ class validateTest(HeatTestCase):
|
|||||||
stack = parser.Stack(self.ctx, 'test_stack', template,
|
stack = parser.Stack(self.ctx, 'test_stack', template,
|
||||||
environment.Environment({'KeyName': 'test'}))
|
environment.Environment({'KeyName': 'test'}))
|
||||||
|
|
||||||
image_type = collections.namedtuple("Image", ("id", "name"))
|
self._mock_get_image_id_success('image_name', 'image_id')
|
||||||
|
|
||||||
image_list = [image_type(id='768b5464-3df5-4abf-be33-63b60f8b99d0',
|
|
||||||
name='image_name')]
|
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.images, 'list')
|
|
||||||
self.fc.images.list().MultipleTimes().AndReturn(image_list)
|
|
||||||
|
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
||||||
@ -1407,16 +1405,16 @@ class validateTest(HeatTestCase):
|
|||||||
resource.validate)
|
resource.validate)
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
|
||||||
def test_client_exception_from_nova_client(self):
|
def test_client_exception_from_glance_client(self):
|
||||||
t = template_format.parse(test_template_nova_client_exception)
|
t = template_format.parse(test_template_glance_client_exception)
|
||||||
template = parser.Template(t)
|
template = parser.Template(t)
|
||||||
stack = parser.Stack(self.ctx, 'test_stack', template)
|
stack = parser.Stack(self.ctx, 'test_stack', template)
|
||||||
|
|
||||||
self.m.StubOutWithMock(self.fc.images, 'list')
|
self.m.StubOutWithMock(self.gc.images, 'list')
|
||||||
self.fc.images.list().AndRaise(
|
self.gc.images.list().AndRaise(
|
||||||
clients.novaclient.exceptions.ClientException(500))
|
g_exc.ClientException(500))
|
||||||
self.m.StubOutWithMock(clients.OpenStackClients, 'nova')
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(self.gc)
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
self.assertRaises(exception.StackValidationFailed, stack.validate)
|
self.assertRaises(exception.StackValidationFailed, stack.validate)
|
||||||
|
@ -21,9 +21,9 @@ from testtools import skipIf
|
|||||||
from heat.common import exception
|
from heat.common import exception
|
||||||
from heat.common import template_format
|
from heat.common import template_format
|
||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
|
from heat.engine.resources import glance_utils
|
||||||
from heat.engine.resources import image
|
from heat.engine.resources import image
|
||||||
from heat.engine.resources import instance
|
from heat.engine.resources import instance
|
||||||
from heat.engine.resources import nova_utils
|
|
||||||
from heat.engine.resources import volume as vol
|
from heat.engine.resources import volume as vol
|
||||||
from heat.engine import scheduler
|
from heat.engine import scheduler
|
||||||
from heat.openstack.common.importutils import try_import
|
from heat.openstack.common.importutils import try_import
|
||||||
@ -93,7 +93,6 @@ class VolumeTest(HeatTestCase):
|
|||||||
self.m.StubOutWithMock(self.fc.volumes, 'create_server_volume')
|
self.m.StubOutWithMock(self.fc.volumes, 'create_server_volume')
|
||||||
self.m.StubOutWithMock(self.fc.volumes, 'delete_server_volume')
|
self.m.StubOutWithMock(self.fc.volumes, 'delete_server_volume')
|
||||||
self.m.StubOutWithMock(self.fc.volumes, 'get_server_volume')
|
self.m.StubOutWithMock(self.fc.volumes, 'get_server_volume')
|
||||||
self.m.StubOutWithMock(nova_utils, 'get_image_id')
|
|
||||||
|
|
||||||
def create_volume(self, t, stack, resource_name):
|
def create_volume(self, t, stack, resource_name):
|
||||||
data = t['Resources'][resource_name]
|
data = t['Resources'][resource_name]
|
||||||
@ -848,20 +847,22 @@ class VolumeTest(HeatTestCase):
|
|||||||
def test_cinder_create_from_image(self):
|
def test_cinder_create_from_image(self):
|
||||||
fv = FakeVolumeWithStateTransition('downloading', 'available')
|
fv = FakeVolumeWithStateTransition('downloading', 'available')
|
||||||
stack_name = 'test_volume_stack'
|
stack_name = 'test_volume_stack'
|
||||||
|
image_id = '46988116-6703-4623-9dbc-2bc6d284021b'
|
||||||
clients.OpenStackClients.cinder().MultipleTimes().AndReturn(
|
clients.OpenStackClients.cinder().MultipleTimes().AndReturn(
|
||||||
self.cinder_fc)
|
self.cinder_fc)
|
||||||
clients.OpenStackClients.nova("compute").MultipleTimes().AndReturn(
|
g_cli_mock = self.m.CreateMockAnything()
|
||||||
self.fc)
|
self.m.StubOutWithMock(clients.OpenStackClients, 'glance')
|
||||||
clients.OpenStackClients.nova().MultipleTimes().AndReturn(self.fc)
|
clients.OpenStackClients.glance().MultipleTimes().AndReturn(
|
||||||
nova_utils.get_image_id(
|
g_cli_mock)
|
||||||
self.fc, '46988116-6703-4623-9dbc-2bc6d284021b'
|
self.m.StubOutWithMock(glance_utils, 'get_image_id')
|
||||||
).MultipleTimes().AndReturn('46988116-6703-4623-9dbc-2bc6d284021b')
|
glance_utils.get_image_id(g_cli_mock, image_id).MultipleTimes().\
|
||||||
|
AndReturn(image_id)
|
||||||
|
|
||||||
self.cinder_fc.volumes.create(
|
self.cinder_fc.volumes.create(
|
||||||
size=1, availability_zone='nova',
|
size=1, availability_zone='nova',
|
||||||
display_description='ImageVolumeDescription',
|
display_description='ImageVolumeDescription',
|
||||||
display_name='ImageVolume',
|
display_name='ImageVolume',
|
||||||
imageRef='46988116-6703-4623-9dbc-2bc6d284021b').AndReturn(fv)
|
imageRef=image_id).AndReturn(fv)
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
@ -871,7 +872,7 @@ class VolumeTest(HeatTestCase):
|
|||||||
'name': 'ImageVolume',
|
'name': 'ImageVolume',
|
||||||
'description': 'ImageVolumeDescription',
|
'description': 'ImageVolumeDescription',
|
||||||
'availability_zone': 'nova',
|
'availability_zone': 'nova',
|
||||||
'image': '46988116-6703-4623-9dbc-2bc6d284021b',
|
'image': image_id,
|
||||||
}
|
}
|
||||||
stack = utils.parse_stack(t, stack_name=stack_name)
|
stack = utils.parse_stack(t, stack_name=stack_name)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user