From 800f38aac4b72f1106996d6dc2345d8013c05d1e Mon Sep 17 00:00:00 2001 From: Sirushti Murugesan Date: Wed, 5 Aug 2015 01:18:35 +0530 Subject: [PATCH] py34: test_hot and test_validate * use hashlib.algorithms_available in PY3 and hashlib.algorithms in PY2 * use e.args[0] instead of six.text_type(e) which will otherwise result in the unicode literal being flattened. * add stubs to prevent actual API calls in tests. * constraint the test template to help in more accurate testing which otherwise results in iterating through other unnecessary items. partial blueprint heat-python34-support Change-Id: I7480555330161cf6f197c83f3245685511284307 --- heat/common/exception.py | 2 +- heat/engine/hot/functions.py | 11 ++++++--- heat/engine/hot/template.py | 4 ++-- heat/tests/test_engine_service.py | 8 ++----- heat/tests/test_hot.py | 25 +++++++++---------- heat/tests/test_validate.py | 40 +++++++++++++++---------------- py3-testlist | 2 ++ 7 files changed, 48 insertions(+), 44 deletions(-) diff --git a/heat/common/exception.py b/heat/common/exception.py index 637942486e..0e4fedadcc 100644 --- a/heat/common/exception.py +++ b/heat/common/exception.py @@ -122,7 +122,7 @@ class HeatException(Exception): raise_(exc_info[0], exc_info[1], exc_info[2]) def __str__(self): - return six.text_type(self.message) + return self.message def __deepcopy__(self, memo): return self.__class__(**self.kwargs) diff --git a/heat/engine/hot/functions.py b/heat/engine/hot/functions.py index 764c667f89..25fc361555 100644 --- a/heat/engine/hot/functions.py +++ b/heat/engine/hot/functions.py @@ -408,13 +408,18 @@ class Digest(function.Function): msg = _('Function "%s" usage: ["", ""]') raise ValueError(msg % self.fn_name) - if args[0].lower() not in hashlib.algorithms: + if six.PY3: + algorithms = hashlib.algorithms_available + else: + algorithms = hashlib.algorithms + + if args[0].lower() not in algorithms: msg = _('Algorithm must be one of %s') - raise ValueError(msg % six.text_type(hashlib.algorithms)) + raise ValueError(msg % six.text_type(algorithms)) def digest(self, algorithm, value): _hash = hashlib.new(algorithm) - _hash.update(value) + _hash.update(six.b(value)) return _hash.hexdigest() diff --git a/heat/engine/hot/template.py b/heat/engine/hot/template.py index 4666e82b32..968c91144c 100644 --- a/heat/engine/hot/template.py +++ b/heat/engine/hot/template.py @@ -136,7 +136,7 @@ class HOTemplate20130523(template.Template): obj_name = section[:-1] err_msg = _('"%%s" is not a valid keyword inside a %s ' 'definition') % obj_name - for name, attrs in six.iteritems(data): + for name, attrs in sorted(data.items()): cfn_object = {} if not attrs: @@ -159,7 +159,7 @@ class HOTemplate20130523(template.Template): raise exception.StackValidationFailed(message=message) except KeyError as e: # an invalid keyword was found - raise exception.StackValidationFailed(message=six.text_type(e)) + raise exception.StackValidationFailed(message=e.args[0]) return cfn_objects diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py index 06a8a14099..913a09a99c 100644 --- a/heat/tests/test_engine_service.py +++ b/heat/tests/test_engine_service.py @@ -2852,12 +2852,8 @@ class StackServiceTest(common.HeatTestCase): self.eng._validate_new_stack, self.ctx, 'test_existing_stack', parsed_template) - msg = (u'u\'"Type" is not a valid keyword ' - 'inside a resource definition\'') - - if six.PY3: - msg = ('\'"Type" is not a valid keyword inside a ' - 'resource definition\'') + msg = (u'"Type" is not a valid keyword ' + 'inside a resource definition') self.assertEqual(msg, six.text_type(ex)) diff --git a/heat/tests/test_hot.py b/heat/tests/test_hot.py index 21e1315706..ed97c7feb0 100644 --- a/heat/tests/test_hot.py +++ b/heat/tests/test_hot.py @@ -203,8 +203,8 @@ class HOTemplateTest(common.HeatTestCase): tmpl = template.Template(hot_tpl) err = self.assertRaises(exception.StackValidationFailed, tmpl.__getitem__, tmpl.RESOURCES) - self.assertEqual('u\'"Type" is not a valid keyword ' - 'inside a resource definition\'', + self.assertEqual('"Type" is not a valid keyword ' + 'inside a resource definition', six.text_type(err)) def test_translate_resources_bad_properties(self): @@ -228,8 +228,8 @@ class HOTemplateTest(common.HeatTestCase): tmpl = template.Template(hot_tpl) err = self.assertRaises(exception.StackValidationFailed, tmpl.__getitem__, tmpl.RESOURCES) - self.assertEqual('u\'"Properties" is not a valid keyword ' - 'inside a resource definition\'', + self.assertEqual('"Properties" is not a valid keyword ' + 'inside a resource definition', six.text_type(err)) def test_translate_resources_resources_without_name(self): @@ -272,8 +272,9 @@ class HOTemplateTest(common.HeatTestCase): tmpl = template.Template(hot_tpl) err = self.assertRaises(exception.StackValidationFailed, tmpl.__getitem__, tmpl.RESOURCES) - self.assertEqual('u\'"Metadata" is not a valid keyword ' - 'inside a resource definition\'', + + self.assertEqual('"Metadata" is not a valid keyword ' + 'inside a resource definition', six.text_type(err)) def test_translate_resources_bad_depends_on(self): @@ -297,8 +298,8 @@ class HOTemplateTest(common.HeatTestCase): tmpl = template.Template(hot_tpl) err = self.assertRaises(exception.StackValidationFailed, tmpl.__getitem__, tmpl.RESOURCES) - self.assertEqual('u\'"DependsOn" is not a valid keyword ' - 'inside a resource definition\'', + self.assertEqual('"DependsOn" is not a valid keyword ' + 'inside a resource definition', six.text_type(err)) def test_translate_resources_bad_deletion_policy(self): @@ -322,8 +323,8 @@ class HOTemplateTest(common.HeatTestCase): tmpl = template.Template(hot_tpl) err = self.assertRaises(exception.StackValidationFailed, tmpl.__getitem__, tmpl.RESOURCES) - self.assertEqual('u\'"DeletionPolicy" is not a valid keyword ' - 'inside a resource definition\'', + self.assertEqual('"DeletionPolicy" is not a valid keyword ' + 'inside a resource definition', six.text_type(err)) def test_translate_resources_bad_update_policy(self): @@ -347,8 +348,8 @@ class HOTemplateTest(common.HeatTestCase): tmpl = template.Template(hot_tpl) err = self.assertRaises(exception.StackValidationFailed, tmpl.__getitem__, tmpl.RESOURCES) - self.assertEqual('u\'"UpdatePolicy" is not a valid keyword ' - 'inside a resource definition\'', + self.assertEqual('"UpdatePolicy" is not a valid keyword ' + 'inside a resource definition', six.text_type(err)) def test_translate_outputs_good(self): diff --git a/heat/tests/test_validate.py b/heat/tests/test_validate.py index c6ec1d07f4..694d7f6228 100644 --- a/heat/tests/test_validate.py +++ b/heat/tests/test_validate.py @@ -218,13 +218,7 @@ test_template_invalid_resources = ''' } }, "Resources" : { - "Type" : "AWS::EC2::Instance", - "Metadata" : { - }, - "Properties" : { - "ImageId" : { "Ref" : "centos-6.4-20130701-0" }, - "InstanceType" : { "Ref" : "InstanceType" } - } + "Type" : "AWS::EC2::Instance" } } ''' @@ -1226,8 +1220,8 @@ class ValidateTest(common.HeatTestCase): engine = service.EngineService('a', 't') res = dict(engine.validate_template(None, hot_tpl, {})) - self.assertEqual({'Error': 'u\'"Type" is not a valid keyword ' - 'inside a resource definition\''}, res) + self.assertEqual({'Error': '"Type" is not a valid keyword ' + 'inside a resource definition'}, res) def test_validate_template_with_invalid_resource_properties(self): hot_tpl = template_format.parse(''' @@ -1247,8 +1241,8 @@ class ValidateTest(common.HeatTestCase): engine = service.EngineService('a', 't') res = dict(engine.validate_template(None, hot_tpl, {})) - self.assertEqual({'Error': 'u\'"Properties" is not a valid keyword ' - 'inside a resource definition\''}, res) + self.assertEqual({'Error': '"Properties" is not a valid keyword ' + 'inside a resource definition'}, res) def test_validate_template_with_invalid_resource_matadata(self): hot_tpl = template_format.parse(''' @@ -1268,8 +1262,8 @@ class ValidateTest(common.HeatTestCase): engine = service.EngineService('a', 't') res = dict(engine.validate_template(None, hot_tpl, {})) - self.assertEqual({'Error': 'u\'"Metadata" is not a valid keyword ' - 'inside a resource definition\''}, res) + self.assertEqual({'Error': '"Metadata" is not a valid keyword ' + 'inside a resource definition'}, res) def test_validate_template_with_invalid_resource_depends_on(self): hot_tpl = template_format.parse(''' @@ -1289,8 +1283,8 @@ class ValidateTest(common.HeatTestCase): engine = service.EngineService('a', 't') res = dict(engine.validate_template(None, hot_tpl, {})) - self.assertEqual({'Error': 'u\'"DependsOn" is not a valid keyword ' - 'inside a resource definition\''}, res) + self.assertEqual({'Error': '"DependsOn" is not a valid keyword ' + 'inside a resource definition'}, res) def test_validate_template_with_invalid_resource_deletion_policy(self): hot_tpl = template_format.parse(''' @@ -1310,8 +1304,8 @@ class ValidateTest(common.HeatTestCase): engine = service.EngineService('a', 't') res = dict(engine.validate_template(None, hot_tpl, {})) - self.assertEqual({'Error': 'u\'"DeletionPolicy" is not a valid ' - 'keyword inside a resource definition\''}, + self.assertEqual({'Error': '"DeletionPolicy" is not a valid ' + 'keyword inside a resource definition'}, res) def test_validate_template_with_invalid_resource_update_policy(self): @@ -1332,8 +1326,8 @@ class ValidateTest(common.HeatTestCase): engine = service.EngineService('a', 't') res = dict(engine.validate_template(None, hot_tpl, {})) - self.assertEqual({'Error': 'u\'"UpdatePolicy" is not a valid ' - 'keyword inside a resource definition\''}, + self.assertEqual({'Error': '"UpdatePolicy" is not a valid ' + 'keyword inside a resource definition'}, res) def test_unregistered_key(self): @@ -1342,7 +1336,8 @@ class ValidateTest(common.HeatTestCase): template = tmpl.Template(t, env=environment.Environment(params)) stack = parser.Stack(self.ctx, 'test_stack', template) - self._mock_get_image_id_success('image_name', 'image_id') + self.stub_FlavorConstraint_validate() + self.stub_ImageConstraint_validate() self.m.ReplayAll() resource = stack['Instance'] @@ -1361,6 +1356,8 @@ class ValidateTest(common.HeatTestCase): exception.EntityNotFound( entity='Image', name='image_name')) + self.stub_KeypairConstraint_validate() + self.stub_FlavorConstraint_validate() self.m.ReplayAll() resource = stack['Instance'] @@ -1380,6 +1377,8 @@ class ValidateTest(common.HeatTestCase): exception.PhysicalResourceNameAmbiguity( name='image_name')) + self.stub_KeypairConstraint_validate() + self.stub_FlavorConstraint_validate() self.m.ReplayAll() resource = stack['Instance'] @@ -1433,6 +1432,7 @@ class ValidateTest(common.HeatTestCase): glance_exceptions.ClientException(500)) self.m.StubOutWithMock(glance.GlanceClientPlugin, '_create') glance.GlanceClientPlugin._create().AndReturn(self.gc) + self.stub_FlavorConstraint_validate() self.m.ReplayAll() self.assertRaises(exception.StackValidationFailed, stack.validate) diff --git a/py3-testlist b/py3-testlist index 0ef129ab7e..fdd53d1816 100644 --- a/py3-testlist +++ b/py3-testlist @@ -107,6 +107,7 @@ heat.tests.test_exception heat.tests.test_function heat.tests.test_glance_image heat.tests.test_grouputils +heat.tests.test_hot heat.tests.test_identifier heat.tests.test_instance_group heat.tests.test_instance_group_update_policy @@ -156,6 +157,7 @@ heat.tests.test_template_format heat.tests.test_timeutils heat.tests.test_trove_cluster heat.tests.test_urlfetch +heat.tests.test_validate heat.tests.test_version heat.tests.test_vpc heat.tests.test_watch