Make the name of a Zaqar queue optional

There's no reason to force the user to specify the name of a Zaqar queue.
In fact, doing so makes it difficult for users to create multiple instance
of the same template without having all of the messages go into a single
queue (and without deleting the shared queue when one of the stacks is
deleted).

We now autogenerate a sensible randomised name if none is provided.

Change-Id: I5195d8c0dd413a8f1bd28c2a8ef7a3191c74f882
Partial-Bug: #1637304
This commit is contained in:
Zane Bitter 2016-11-22 11:42:23 -05:00
parent 015c3c228a
commit 01487ebbbb
2 changed files with 35 additions and 4 deletions

View File

@ -49,8 +49,7 @@ class ZaqarQueue(resource.Resource):
properties_schema = {
NAME: properties.Schema(
properties.Schema.STRING,
_("Name of the queue instance to create."),
required=True),
_("Name of the queue instance to create.")),
METADATA: properties.Schema(
properties.Schema.MAP,
description=_("Arbitrary key/value metadata to store "
@ -81,7 +80,10 @@ class ZaqarQueue(resource.Resource):
}
def physical_resource_name(self):
return self.properties[self.NAME]
name = self.properties[self.NAME]
if name is not None:
return name
return super(ZaqarQueue, self).physical_resource_name()
def handle_create(self):
"""Create a zaqar message queue."""
@ -126,8 +128,11 @@ class ZaqarQueue(resource.Resource):
return {self.METADATA: metadata}
def parse_live_resource_data(self, resource_properties, resource_data):
name = self.resource_id
if name == super(ZaqarQueue, self).physical_resource_name():
name = None
return {
self.NAME: self.resource_id,
self.NAME: name,
self.METADATA: resource_data[self.METADATA]
}

View File

@ -107,6 +107,32 @@ class ZaqarMessageQueueTest(common.HeatTestCase):
self.m.VerifyAll()
def test_create_default_name(self):
t = template_format.parse(wp_template)
del t['Resources']['MyQueue2']['Properties']['name']
self.parse_stack(t)
queue = self.stack['MyQueue2']
self.m.StubOutWithMock(queue, 'client')
queue.client().MultipleTimes().AndReturn(self.fc)
name_match = utils.PhysName(self.stack.name, 'MyQueue2')
self.m.StubOutWithMock(self.fc, 'queue')
self.fc.queue(name_match, auto_create=False).WithSideEffects(FakeQueue)
self.m.ReplayAll()
scheduler.TaskRunner(queue.create)()
queue_name = queue.physical_resource_name()
self.assertEqual(name_match, queue_name)
self.fc.api_url = 'http://127.0.0.1:8888/v1'
self.assertEqual('http://127.0.0.1:8888/v1/queues/' + queue_name,
queue.FnGetAtt('href'))
self.m.VerifyAll()
def test_delete(self):
t = template_format.parse(wp_template)
self.parse_stack(t)