From b6042e7fde1245bdb97fc3a00643ff208b56941f Mon Sep 17 00:00:00 2001 From: cyli Date: Fri, 17 Oct 2014 16:48:57 -0700 Subject: [PATCH] Add support for no imageRef parameter, for supporting boot-from-volume --- mimic/canned_responses/nova.py | 31 ++++++++------- mimic/test/test_nova.py | 70 +++++++++++++++++++++++++++++++++- 2 files changed, 87 insertions(+), 14 deletions(-) diff --git a/mimic/canned_responses/nova.py b/mimic/canned_responses/nova.py index 8416b8b958..ad4e9349c3 100644 --- a/mimic/canned_responses/nova.py +++ b/mimic/canned_responses/nova.py @@ -21,7 +21,7 @@ def server_template(tenant_id, server_info, server_id, status, current_time, def url(suffix): return str(URLPath.fromString(compute_uri_prefix).child(suffix)) - server_template = { + template = { "OS-DCF:diskConfig": "AUTO", "OS-EXT-STS:power_state": 1, "OS-EXT-STS:task_state": None, @@ -62,17 +62,6 @@ def url(suffix): }, "hostId": "33ccb6c82f3625748b6f2338f54d8e9df07cc583251e001355569056", "id": server_id, - "image": { - "id": server_info['imageRef'], - "links": [ - { - "href": url("{0}/images/{1}".format( - tenant_id, server_info['imageRef'] - )), - "rel": "bookmark" - } - ] - }, "links": [ { "href": url("v2/{0}/servers/{1}".format( @@ -93,7 +82,23 @@ def url(suffix): "updated": current_time, "user_id": "170454" } - return server_template + + if server_info.get("imageRef"): + template['image'] = { + "id": server_info['imageRef'], + "links": [ + { + "href": url("{0}/images/{1}".format( + tenant_id, server_info['imageRef'] + )), + "rel": "bookmark" + } + ] + } + else: + template['image'] = '' + + return template def create_server(tenant_id, server_info, server_id, compute_uri_prefix, diff --git a/mimic/test/test_nova.py b/mimic/test/test_nova.py index 842e6c17fb..cd028df5e3 100644 --- a/mimic/test/test_nova.py +++ b/mimic/test/test_nova.py @@ -20,7 +20,9 @@ class ResponseGenerationTests(SynchronousTestCase): def test_server_template(self): """ :obj:`server_template` generates a JSON object representing an - individual Nova server. + individual Nova server. This includes a dictionary for the ``image`` + parameter that contains the ID and some links, if ``imageRef`` is + provided in the server info """ input_server_info = { @@ -119,6 +121,72 @@ def test_server_template(self): self.assertEquals(json.dumps(expectation, indent=2), json.dumps(actual, indent=2)) + def _test_server_template_without_image(self, input_server_info): + """ + Helper function to test generation of a server template with an empty + image. + """ + counter = itertools.count(1) + + compute_service_uri_prefix = ( + "http://mimic.example.com/services/region/compute/" + ) + + actual = server_template("some_tenant", input_server_info, + "some_server_id", "some_status", + "the_current_time", + lambda: next(counter), + compute_service_uri_prefix) + + self.assertEquals("", actual['image']) + + def test_server_template_with_blank_imageRef(self): + """ + :obj:`server_template` generates a JSON object representing an + individual Nova server, but the ``image`` parameter is empty if + ``imageRef`` in the server info is blank. + """ + self._test_server_template_without_image({ + "flavorRef": "some_flavor", + "imageRef": "", + "name": "some_server_name", + "metadata": { + "some_key": "some_value", + "some_other_key": "some_other_value", + } + }) + + def test_server_template_with_null_imageRef(self): + """ + :obj:`server_template` generates a JSON object representing an + individual Nova server, but the ``image`` parameter is empty if + ``imageRef`` in the server info is null. + """ + self._test_server_template_without_image({ + "flavorRef": "some_flavor", + "imageRef": None, + "name": "some_server_name", + "metadata": { + "some_key": "some_value", + "some_other_key": "some_other_value", + } + }) + + def test_server_template_with_no_imageRef(self): + """ + :obj:`server_template` generates a JSON object representing an + individual Nova server, but the ``image`` parameter is empty if + no ``imageRef`` is provided in the server info. + """ + self._test_server_template_without_image({ + "flavorRef": "some_flavor", + "name": "some_server_name", + "metadata": { + "some_key": "some_value", + "some_other_key": "some_other_value", + } + }) + class NovaAPITests(SynchronousTestCase):