diff --git a/heat/engine/resources/openstack/ceilometer/alarm.py b/heat/engine/resources/openstack/ceilometer/alarm.py index b9bd4a4db6..c900ffd4d1 100644 --- a/heat/engine/resources/openstack/ceilometer/alarm.py +++ b/heat/engine/resources/openstack/ceilometer/alarm.py @@ -318,12 +318,13 @@ class CeilometerAlarm(resource.Resource): # make sure the matching_metadata appears in the query like this: # {field: metadata.$prefix.x, ...} for m_k, m_v in six.iteritems(mmd): - if m_k.startswith('metadata.%s' % prefix): - key = m_k - elif m_k.startswith(prefix): - key = 'metadata.%s' % m_k - else: - key = 'metadata.%s%s' % (prefix, m_k) + key = 'metadata.%s' % prefix + if m_k.startswith('metadata.'): + m_k = m_k[len('metadata.'):] + if m_k.startswith('metering.') or m_k.startswith('user_metadata.'): + # check prefix + m_k = m_k.split('.', 1)[-1] + key = '%s%s' % (key, m_k) # NOTE(prazumovsky): type of query value must be a string, but # matching_metadata value type can not be a string, so we # must convert value to a string type. diff --git a/heat/tests/openstack/ceilometer/test_ceilometer_alarm.py b/heat/tests/openstack/ceilometer/test_ceilometer_alarm.py index 98dd7c91f5..e272c9612f 100644 --- a/heat/tests/openstack/ceilometer/test_ceilometer_alarm.py +++ b/heat/tests/openstack/ceilometer/test_ceilometer_alarm.py @@ -351,6 +351,23 @@ class CeilometerAlarmTest(common.HeatTestCase): 'value': u'foo', 'op': 'eq'}] self.assertEqual(expected_query, query) + def test_alarm_metadata_correct_query_key(self): + t = template_format.parse(alarm_template) + properties = t['Resources']['MEMAlarmHigh']['Properties'] + # Test that meter_name is not in NOVA_METERS + properties[alarm.CeilometerAlarm.METER_NAME] = 'memory_util' + properties['matching_metadata'] = {'metadata.user_metadata.groupname': + 'foo'} + self.stack = self.create_stack(template=json.dumps(t)) + + rsrc = self.stack['MEMAlarmHigh'] + rsrc.properties.data = rsrc.cfn_to_ceilometer(self.stack, properties) + self.assertIsNone(rsrc.properties.data.get('matching_metadata')) + query = rsrc.properties.data['threshold_rule']['query'] + expected_query = [{'field': u'metadata.metering.groupname', + 'value': u'foo', 'op': 'eq'}] + self.assertEqual(expected_query, query) + def test_mem_alarm_high_correct_matching_metadata(self): t = template_format.parse(alarm_template) properties = t['Resources']['MEMAlarmHigh']['Properties']