]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Implement NoEcho for parameters
authorZane Bitter <zbitter@redhat.com>
Wed, 31 Oct 2012 19:18:43 +0000 (20:18 +0100)
committerZane Bitter <zbitter@redhat.com>
Wed, 31 Oct 2012 19:18:43 +0000 (20:18 +0100)
Change-Id: I60ce651367479205e0d456e2ac0ec3f949766383
Signed-off-by: Zane Bitter <zbitter@redhat.com>
heat/engine/api.py
heat/engine/manager.py
heat/engine/parameters.py
heat/tests/test_parameters.py

index ac9250d1fb4af2690877bc8ec6b16c4ab1ff9678..15e8c8a893da13a7f7335fa9a490474d039f9ba4 100644 (file)
@@ -94,7 +94,7 @@ def format_stack(stack):
         STACK_CREATION_TIME: timeutils.isotime(stack.created_time),
         STACK_UPDATED_TIME: timeutils.isotime(stack.updated_time),
         STACK_NOTIFICATION_TOPICS: [],  # TODO Not implemented yet
-        STACK_PARAMETERS: dict(stack.parameters),
+        STACK_PARAMETERS: stack.parameters.map(str),
         STACK_DESCRIPTION: stack.t[template.DESCRIPTION],
         STACK_TMPL_DESCRIPTION: stack.t[template.DESCRIPTION],
         STACK_STATUS: stack.state,
index 3189a4d01ef8f84169c88218f0cffcf9553146d3..335c09e52a760f8b77e36cbc29c8f3052cbf876a 100644 (file)
@@ -240,7 +240,7 @@ class EngineManager(manager.Manager):
                         'Every Resources object must contain a Type member.'}
 
         def describe_param(p):
-            description = {'NoEcho': 'false',
+            description = {'NoEcho': p.no_echo() and 'true' or 'false',
                            'ParameterKey': p.name,
                            'Description': p.description()}
             if p.has_default():
index dbe3869f013e5eb8ffa635e9c1be0d0c07259dcf..da26625ac1ea488c1313e1b7f122e2c7a9e49db3 100644 (file)
@@ -91,6 +91,13 @@ class Parameter(object):
 
         raise KeyError('Missing parameter %s' % self.name)
 
+    def no_echo(self):
+        '''
+        Return whether the parameter should be sanitised in any output to
+        the user.
+        '''
+        return self.schema.get(NO_ECHO, 'false').lower() == 'true'
+
     def description(self):
         '''Return the description of the parameter.'''
         return self.schema.get(DESCRIPTION, '')
@@ -105,7 +112,11 @@ class Parameter(object):
 
     def __str__(self):
         '''Return a string representation of the parameter'''
-        return self.value()
+        value = self.value()
+        if self.no_echo():
+            return '******'
+        else:
+            return value
 
 
 class NumberParam(Parameter):
index 9f92ba228e38d51f146a0362e7d6e1116e9e0ba3..0f4a34891fc234eed65b7f6a71134e9cbd25773c 100644 (file)
@@ -76,6 +76,30 @@ class ParameterTest(unittest.TestCase):
         else:
             self.fail('ValueError not raised')
 
+    def test_no_echo_true(self):
+        p = parameters.Parameter('anechoic',
+                                 {'Type': 'String',
+                                 'NoEcho': 'true'},
+                                 'wibble')
+        self.assertTrue(p.no_echo())
+        self.assertNotEqual(str(p), 'wibble')
+
+    def test_no_echo_true_caps(self):
+        p = parameters.Parameter('anechoic',
+                                 {'Type': 'String',
+                                 'NoEcho': 'TrUe'},
+                                 'wibble')
+        self.assertTrue(p.no_echo())
+        self.assertNotEqual(str(p), 'wibble')
+
+    def test_no_echo_false(self):
+        p = parameters.Parameter('echoic',
+                                 {'Type': 'String',
+                                 'NoEcho': 'false'},
+                                 'wibble')
+        self.assertFalse(p.no_echo())
+        self.assertEqual(str(p), 'wibble')
+
     def test_description(self):
         description = 'Description of the parameter'
         p = parameters.Parameter('p', {'Type': 'String',