summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRabi Mishra <ramishra@redhat.com>2014-07-01 20:12:24 +0530
committerRabi Mishra <ramishra@redhat.com>2014-07-14 14:48:35 +0530
commit47232fa9b011831e54e8b161d1a2da4b1ea7cd2b (patch)
tree626588d2825a03d809a3f18b60dade1091a31d95
parent520a82428c3117340735887c9b8b1099a4b70dbb (diff)
downloadpython-heatclient-47232fa9b011831e54e8b161d1a2da4b1ea7cd2b.tar.gz
Deprecate misleading cli command 'resource-template'
Current 'resource-template' command is misleading as it's providing template snippet for the 'resource-type' and not the 'resource'. This has been deprecated and a new command 'resource-type-template' added. ex. $heat resource-type-template -F json OS::Nova::KeyPair Change-Id: I373e2fa3c7891d2488704975ffdfb6d9afa5059a Closes-Bug: #1336306
-rw-r--r--heatclient/tests/test_resource_types.py56
-rw-r--r--heatclient/tests/test_shell.py79
-rw-r--r--heatclient/v1/resource_types.py6
-rw-r--r--heatclient/v1/resources.py3
-rw-r--r--heatclient/v1/shell.py38
5 files changed, 151 insertions, 31 deletions
diff --git a/heatclient/tests/test_resource_types.py b/heatclient/tests/test_resource_types.py
index 4030fd8..b5e3cb0 100644
--- a/heatclient/tests/test_resource_types.py
+++ b/heatclient/tests/test_resource_types.py
@@ -11,7 +11,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-import mock
import testtools
from heatclient.v1.resource_types import ResourceTypeManager
@@ -19,27 +18,48 @@ from heatclient.v1.resource_types import ResourceTypeManager
class ResourceTypeManagerTest(testtools.TestCase):
- def test_list_types(self):
- manager = ResourceTypeManager(None)
- manager._list = mock.MagicMock()
- manager.list()
- manager._list.assert_called_once_with('/resource_types',
- 'resource_types')
-
- def test_get(self):
- resource_type = u'OS::Nova::KeyPair'
+ def _base_test(self, expect, key):
class FakeAPI(object):
"""Fake API and ensure request url is correct."""
- def __init__(self, *args, **kwargs):
- self.requests = []
+
+ def get(self, *args, **kwargs):
+ assert ('GET', args[0]) == expect
def json_request(self, *args, **kwargs):
- self.requests.append(args)
- return {}, {'attributes': [], 'properties': []}
+ assert args == expect
+ ret = key and {key: []} or {}
+ return {}, {key: ret}
- test_api = FakeAPI()
- manager = ResourceTypeManager(test_api)
- manager.get(resource_type)
+ manager = ResourceTypeManager(FakeAPI())
+ return manager
+
+ def test_list_types(self):
+ key = 'resource_types'
+ expect = ('GET', '/resource_types')
+
+ class FakeResponse(object):
+ def json(self):
+ return {key: {}}
+
+ class FakeClient(object):
+ def get(self, *args, **kwargs):
+ assert ('GET', args[0]) == expect
+ return FakeResponse()
+
+ manager = ResourceTypeManager(FakeClient())
+ manager.list()
+
+ def test_get(self):
+ key = 'resource_types'
+ resource_type = 'OS::Nova::KeyPair'
expect = ('GET', '/resource_types/OS%3A%3ANova%3A%3AKeyPair')
- self.assertIn(expect, test_api.requests)
+ manager = self._base_test(expect, key)
+ manager.get(resource_type)
+
+ def test_generate_template(self):
+ key = 'resource_types'
+ resource_type = 'OS::Nova::KeyPair'
+ expect = ('GET', '/resource_types/OS%3A%3ANova%3A%3AKeyPair/template')
+ manager = self._base_test(expect, key)
+ manager.generate_template(resource_type)
diff --git a/heatclient/tests/test_shell.py b/heatclient/tests/test_shell.py
index 3595d9b..498b57b 100644
--- a/heatclient/tests/test_shell.py
+++ b/heatclient/tests/test_shell.py
@@ -1572,6 +1572,85 @@ class ShellTestResources(ShellBase):
self.assertEqual("", text)
+class ShellTestResourceTypes(ShellBase):
+ def setUp(self):
+ super(ShellTestResourceTypes, self).setUp()
+ self._set_fake_env()
+
+ # Patch os.environ to avoid required auth info.
+ def _set_fake_env(self):
+ fake_env = {
+ 'OS_USERNAME': 'username',
+ 'OS_PASSWORD': 'password',
+ 'OS_TENANT_NAME': 'tenant_name',
+ 'OS_AUTH_URL': 'http://no.where',
+ }
+ self.set_fake_env(fake_env)
+
+ def _script_keystone_client(self):
+ fakes.script_keystone_client()
+
+ def test_resource_type_template_yaml(self):
+ self._script_keystone_client()
+ resp_dict = {"heat_template_version": "2013-05-23",
+ "parameters": {},
+ "resources": {},
+ "outputs": {}}
+ resp = fakes.FakeHTTPResponse(
+ 200,
+ 'OK',
+ {'content-type': 'application/json'},
+ jsonutils.dumps(resp_dict))
+
+ http.HTTPClient.json_request(
+ 'GET', '/resource_types/OS%3A%3ANova%3A%3AKeyPair/template'
+ ).AndReturn((resp, resp_dict))
+
+ self.m.ReplayAll()
+
+ show_text = self.shell(
+ 'resource-type-template -F yaml OS::Nova::KeyPair')
+ required = [
+ "heat_template_version: '2013-05-23'",
+ "outputs: {}",
+ "parameters: {}",
+ "resources: {}"
+ ]
+ for r in required:
+ self.assertRegexpMatches(show_text, r)
+
+ def test_resource_type_template_json(self):
+ self._script_keystone_client()
+ resp_dict = {"AWSTemplateFormatVersion": "2013-05-23",
+ "Parameters": {},
+ "Resources": {},
+ "Outputs": {}}
+ resp = fakes.FakeHTTPResponse(
+ 200,
+ 'OK',
+ {'content-type': 'application/json'},
+ jsonutils.dumps(resp_dict))
+
+ http.HTTPClient.json_request(
+ 'GET', '/resource_types/OS%3A%3ANova%3A%3AKeyPair/template'
+ ).AndReturn((resp, resp_dict))
+
+ self.m.ReplayAll()
+
+ show_text = self.shell(
+ 'resource-type-template -F json OS::Nova::KeyPair')
+ required = [
+ '{',
+ ' "AWSTemplateFormatVersion": "2013-05-23"',
+ ' "Outputs": {}',
+ ' "Resources": {}',
+ ' "Parameters": {}',
+ '}'
+ ]
+ for r in required:
+ self.assertRegexpMatches(show_text, r)
+
+
class ShellTestBuildInfo(ShellBase):
def setUp(self):
super(ShellTestBuildInfo, self).setUp()
diff --git a/heatclient/v1/resource_types.py b/heatclient/v1/resource_types.py
index ec2b599..9ffb80b 100644
--- a/heatclient/v1/resource_types.py
+++ b/heatclient/v1/resource_types.py
@@ -46,3 +46,9 @@ class ResourceTypeManager(base.BaseManager):
parse.quote(strutils.safe_encode(resource_type), ''))
resp, body = self.client.json_request('GET', url_str)
return body
+
+ def generate_template(self, resource_type):
+ url_str = '/resource_types/%s/template' % (
+ parse.quote(strutils.safe_encode(resource_type), ''))
+ resp, body = self.client.json_request('GET', url_str)
+ return body
diff --git a/heatclient/v1/resources.py b/heatclient/v1/resources.py
index a51fb0f..2f769db 100644
--- a/heatclient/v1/resources.py
+++ b/heatclient/v1/resources.py
@@ -86,6 +86,9 @@ class ResourceManager(stacks.StackChildManager):
return body
def generate_template(self, resource_name):
+ """DEPRECATED! Use `generate_template` of `ResourceTypeManager`
+ instead.
+ """
url_str = '/resource_types/%s/template' % (
parse.quote(strutils.safe_encode(resource_name), ''))
resp, body = self.client.json_request('GET', url_str)
diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py
index c440ef3..29311f0 100644
--- a/heatclient/v1/shell.py
+++ b/heatclient/v1/shell.py
@@ -492,6 +492,26 @@ def do_resource_type_show(hc, args={}):
print(jsonutils.dumps(resource_type, indent=2))
+@utils.arg('resource_type', metavar='<RESOURCE_TYPE>',
+ help='Resource type to generate a template for.')
+@utils.arg('-F', '--format', metavar='<FORMAT>',
+ help="The template output format, one of: %s."
+ % ', '.join(utils.supported_formats.keys()))
+def do_resource_type_template(hc, args):
+ '''Generate a template based on a resource type.'''
+ fields = {'resource_type': args.resource_type}
+ try:
+ template = hc.resource_types.generate_template(**fields)
+ except exc.HTTPNotFound:
+ raise exc.CommandError(
+ 'Resource Type %s not found.' % args.resource_type)
+ else:
+ if args.format:
+ print(utils.format_output(template, format=args.format))
+ else:
+ print(utils.format_output(template))
+
+
@utils.arg('id', metavar='<NAME or ID>',
help='Name or ID of stack to get the template for.')
def do_gettemplate(hc, args):
@@ -610,23 +630,15 @@ def do_resource_show(hc, args):
utils.print_dict(resource.to_dict(), formatters=formatters)
-@utils.arg('resource', metavar='<RESOURCE>',
- help='Name of the resource to generate a template for.')
+@utils.arg('resource_type', metavar='<RESOURCE_TYPE>',
+ help='Resource type to generate a template for.')
@utils.arg('-F', '--format', metavar='<FORMAT>',
help="The template output format, one of: %s."
% ', '.join(utils.supported_formats.keys()))
def do_resource_template(hc, args):
- '''Generate a template based on a resource.'''
- fields = {'resource_name': args.resource}
- try:
- template = hc.resources.generate_template(**fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Resource %s not found.' % args.resource)
- else:
- if args.format:
- print(utils.format_output(template, format=args.format))
- else:
- print(utils.format_output(template))
+ '''DEPRECATED! Use resource-type-template instead.'''
+ logger.warning('DEPRECATED! Use resource-type-template instead.')
+ do_resource_type_template(hc, args)
@utils.arg('id', metavar='<NAME or ID>',