Allow to get a disabled alarm
This change allow to get a disabled alarm. To do this, it: * add the ability to query the alarm-list API with the 'enabled' fields. * change the default visibility of alarm-list API from enabled only to all. Fixes bug #1231328 Change-Id: I80cd691696f7630d2ac9e9b2a69b5b0ae5ee7968
This commit is contained in:
		@@ -209,7 +209,7 @@ class Query(_Base):
 | 
				
			|||||||
    def as_dict(self):
 | 
					    def as_dict(self):
 | 
				
			||||||
        return self.as_dict_from_keys(['field', 'op', 'type', 'value'])
 | 
					        return self.as_dict_from_keys(['field', 'op', 'type', 'value'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _get_value_as_type(self):
 | 
					    def _get_value_as_type(self, forced_type=None):
 | 
				
			||||||
        """Convert metadata value to the specified data type.
 | 
					        """Convert metadata value to the specified data type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        This method is called during metadata query to help convert the
 | 
					        This method is called during metadata query to help convert the
 | 
				
			||||||
@@ -225,9 +225,10 @@ class Query(_Base):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        :returns: metadata value converted with the specified data type.
 | 
					        :returns: metadata value converted with the specified data type.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					        type = forced_type or self.type
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            converted_value = self.value
 | 
					            converted_value = self.value
 | 
				
			||||||
            if not self.type:
 | 
					            if not type:
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
                    converted_value = ast.literal_eval(self.value)
 | 
					                    converted_value = ast.literal_eval(self.value)
 | 
				
			||||||
                except (ValueError, SyntaxError):
 | 
					                except (ValueError, SyntaxError):
 | 
				
			||||||
@@ -235,13 +236,13 @@ class Query(_Base):
 | 
				
			|||||||
                            ' automatically') % (self.value)
 | 
					                            ' automatically') % (self.value)
 | 
				
			||||||
                    LOG.debug(msg)
 | 
					                    LOG.debug(msg)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                if self.type == 'integer':
 | 
					                if type == 'integer':
 | 
				
			||||||
                    converted_value = int(self.value)
 | 
					                    converted_value = int(self.value)
 | 
				
			||||||
                elif self.type == 'float':
 | 
					                elif type == 'float':
 | 
				
			||||||
                    converted_value = float(self.value)
 | 
					                    converted_value = float(self.value)
 | 
				
			||||||
                elif self.type == 'boolean':
 | 
					                elif type == 'boolean':
 | 
				
			||||||
                    converted_value = strutils.bool_from_string(self.value)
 | 
					                    converted_value = strutils.bool_from_string(self.value)
 | 
				
			||||||
                elif self.type == 'string':
 | 
					                elif type == 'string':
 | 
				
			||||||
                    converted_value = self.value
 | 
					                    converted_value = self.value
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    # For now, this method only support integer, float,
 | 
					                    # For now, this method only support integer, float,
 | 
				
			||||||
@@ -251,17 +252,17 @@ class Query(_Base):
 | 
				
			|||||||
        except ValueError:
 | 
					        except ValueError:
 | 
				
			||||||
            msg = _('Failed to convert the metadata value %(value)s'
 | 
					            msg = _('Failed to convert the metadata value %(value)s'
 | 
				
			||||||
                    ' to the expected data type %(type)s.') % \
 | 
					                    ' to the expected data type %(type)s.') % \
 | 
				
			||||||
                {'value': self.value, 'type': self.type}
 | 
					                {'value': self.value, 'type': type}
 | 
				
			||||||
            raise wsme.exc.ClientSideError(unicode(msg))
 | 
					            raise wsme.exc.ClientSideError(unicode(msg))
 | 
				
			||||||
        except TypeError:
 | 
					        except TypeError:
 | 
				
			||||||
            msg = _('The data type %s is not supported. The supported'
 | 
					            msg = _('The data type %s is not supported. The supported'
 | 
				
			||||||
                    ' data type list is: integer, float, boolean and'
 | 
					                    ' data type list is: integer, float, boolean and'
 | 
				
			||||||
                    ' string.') % (self.type)
 | 
					                    ' string.') % (type)
 | 
				
			||||||
            raise wsme.exc.ClientSideError(unicode(msg))
 | 
					            raise wsme.exc.ClientSideError(unicode(msg))
 | 
				
			||||||
        except Exception:
 | 
					        except Exception:
 | 
				
			||||||
            msg = _('Unexpected exception converting %(value)s to'
 | 
					            msg = _('Unexpected exception converting %(value)s to'
 | 
				
			||||||
                    ' the expected data type %(type)s.') % \
 | 
					                    ' the expected data type %(type)s.') % \
 | 
				
			||||||
                {'value': self.value, 'type': self.type}
 | 
					                {'value': self.value, 'type': type}
 | 
				
			||||||
            raise wsme.exc.ClientSideError(unicode(msg))
 | 
					            raise wsme.exc.ClientSideError(unicode(msg))
 | 
				
			||||||
        return converted_value
 | 
					        return converted_value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -323,6 +324,8 @@ def _query_to_kwargs(query, db_func, internal_keys=[], headers=None):
 | 
				
			|||||||
            if i.op == 'eq':
 | 
					            if i.op == 'eq':
 | 
				
			||||||
                if i.field == 'search_offset':
 | 
					                if i.field == 'search_offset':
 | 
				
			||||||
                    stamp['search_offset'] = i.value
 | 
					                    stamp['search_offset'] = i.value
 | 
				
			||||||
 | 
					                elif i.field == 'enabled':
 | 
				
			||||||
 | 
					                    kwargs[i.field] = i._get_value_as_type('boolean')
 | 
				
			||||||
                elif i.field.startswith('metadata.'):
 | 
					                elif i.field.startswith('metadata.'):
 | 
				
			||||||
                    metaquery[i.field] = i._get_value_as_type()
 | 
					                    metaquery[i.field] = i._get_value_as_type()
 | 
				
			||||||
                elif i.field.startswith('resource_metadata.'):
 | 
					                elif i.field.startswith('resource_metadata.'):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -209,7 +209,7 @@ class Connection(object):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @abc.abstractmethod
 | 
					    @abc.abstractmethod
 | 
				
			||||||
    def get_alarms(self, name=None, user=None,
 | 
					    def get_alarms(self, name=None, user=None,
 | 
				
			||||||
                   project=None, enabled=True, alarm_id=None, pagination=None):
 | 
					                   project=None, enabled=None, alarm_id=None, pagination=None):
 | 
				
			||||||
        """Yields a lists of alarms that match filters
 | 
					        """Yields a lists of alarms that match filters
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -666,7 +666,7 @@ class Connection(base.Connection):
 | 
				
			|||||||
        alarm['rule']['query'] = query
 | 
					        alarm['rule']['query'] = query
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_alarms(self, name=None, user=None,
 | 
					    def get_alarms(self, name=None, user=None,
 | 
				
			||||||
                   project=None, enabled=True, alarm_id=None, pagination=None):
 | 
					                   project=None, enabled=None, alarm_id=None, pagination=None):
 | 
				
			||||||
        """Yields a lists of alarms that match filters
 | 
					        """Yields a lists of alarms that match filters
 | 
				
			||||||
        :param user: Optional ID for user that owns the resource.
 | 
					        :param user: Optional ID for user that owns the resource.
 | 
				
			||||||
        :param project: Optional ID for project that owns the resource.
 | 
					        :param project: Optional ID for project that owns the resource.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -591,7 +591,7 @@ class Connection(base.Connection):
 | 
				
			|||||||
        return results
 | 
					        return results
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_alarms(self, name=None, user=None,
 | 
					    def get_alarms(self, name=None, user=None,
 | 
				
			||||||
                   project=None, enabled=True, alarm_id=None, pagination=None):
 | 
					                   project=None, enabled=None, alarm_id=None, pagination=None):
 | 
				
			||||||
        """Yields a lists of alarms that match filters
 | 
					        """Yields a lists of alarms that match filters
 | 
				
			||||||
            raise NotImplementedError('metaquery not implemented')
 | 
					            raise NotImplementedError('metaquery not implemented')
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -158,7 +158,7 @@ class Connection(base.Connection):
 | 
				
			|||||||
        return []
 | 
					        return []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_alarms(self, name=None, user=None,
 | 
					    def get_alarms(self, name=None, user=None,
 | 
				
			||||||
                   project=None, enabled=True, alarm_id=None, pagination=None):
 | 
					                   project=None, enabled=None, alarm_id=None, pagination=None):
 | 
				
			||||||
        """Yields a lists of alarms that match filters
 | 
					        """Yields a lists of alarms that match filters
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        return []
 | 
					        return []
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -850,7 +850,7 @@ class Connection(base.Connection):
 | 
				
			|||||||
        alarm['rule']['query'] = query
 | 
					        alarm['rule']['query'] = query
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_alarms(self, name=None, user=None,
 | 
					    def get_alarms(self, name=None, user=None,
 | 
				
			||||||
                   project=None, enabled=True, alarm_id=None, pagination=None):
 | 
					                   project=None, enabled=None, alarm_id=None, pagination=None):
 | 
				
			||||||
        """Yields a lists of alarms that match filters
 | 
					        """Yields a lists of alarms that match filters
 | 
				
			||||||
        :param name: The Alarm name.
 | 
					        :param name: The Alarm name.
 | 
				
			||||||
        :param user: Optional ID for user that owns the resource.
 | 
					        :param user: Optional ID for user that owns the resource.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -597,7 +597,7 @@ class Connection(base.Connection):
 | 
				
			|||||||
                                repeat_actions=row.repeat_actions)
 | 
					                                repeat_actions=row.repeat_actions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_alarms(self, name=None, user=None,
 | 
					    def get_alarms(self, name=None, user=None,
 | 
				
			||||||
                   project=None, enabled=True, alarm_id=None, pagination=None):
 | 
					                   project=None, enabled=None, alarm_id=None, pagination=None):
 | 
				
			||||||
        """Yields a lists of alarms that match filters
 | 
					        """Yields a lists of alarms that match filters
 | 
				
			||||||
        :param user: Optional ID for user that owns the resource.
 | 
					        :param user: Optional ID for user that owns the resource.
 | 
				
			||||||
        :param project: Optional ID for project that owns the resource.
 | 
					        :param project: Optional ID for project that owns the resource.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -183,6 +183,33 @@ class TestAlarms(FunctionalTest,
 | 
				
			|||||||
        self.assertEqual(one['alarm_id'], alarms[0]['alarm_id'])
 | 
					        self.assertEqual(one['alarm_id'], alarms[0]['alarm_id'])
 | 
				
			||||||
        self.assertEqual(one['repeat_actions'], alarms[0]['repeat_actions'])
 | 
					        self.assertEqual(one['repeat_actions'], alarms[0]['repeat_actions'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_get_alarm_disabled(self):
 | 
				
			||||||
 | 
					        alarm = Alarm(name='disabled',
 | 
				
			||||||
 | 
					                      type='combination',
 | 
				
			||||||
 | 
					                      enabled=False,
 | 
				
			||||||
 | 
					                      alarm_id='d',
 | 
				
			||||||
 | 
					                      description='d',
 | 
				
			||||||
 | 
					                      state='insufficient data',
 | 
				
			||||||
 | 
					                      state_timestamp=None,
 | 
				
			||||||
 | 
					                      timestamp=None,
 | 
				
			||||||
 | 
					                      ok_actions=[],
 | 
				
			||||||
 | 
					                      insufficient_data_actions=[],
 | 
				
			||||||
 | 
					                      alarm_actions=[],
 | 
				
			||||||
 | 
					                      repeat_actions=False,
 | 
				
			||||||
 | 
					                      user_id=self.auth_headers['X-User-Id'],
 | 
				
			||||||
 | 
					                      project_id=self.auth_headers['X-Project-Id'],
 | 
				
			||||||
 | 
					                      rule=dict(alarm_ids=['a', 'b'], operator='or'))
 | 
				
			||||||
 | 
					        self.conn.update_alarm(alarm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        alarms = self.get_json('/alarms',
 | 
				
			||||||
 | 
					                               q=[{'field': 'enabled',
 | 
				
			||||||
 | 
					                                   'value': 'False'}])
 | 
				
			||||||
 | 
					        self.assertEqual(len(alarms), 1)
 | 
				
			||||||
 | 
					        self.assertEqual(alarms[0]['name'], 'disabled')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        one = self.get_json('/alarms/%s' % alarms[0]['alarm_id'])
 | 
				
			||||||
 | 
					        self.assertEqual(one['name'], 'disabled')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_alarm_combination(self):
 | 
					    def test_get_alarm_combination(self):
 | 
				
			||||||
        alarms = self.get_json('/alarms',
 | 
					        alarms = self.get_json('/alarms',
 | 
				
			||||||
                               q=[{'field': 'name',
 | 
					                               q=[{'field': 'name',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1903,7 +1903,7 @@ class AlarmTestBase(DBTestBase):
 | 
				
			|||||||
                                                 'type': 'string'}]),
 | 
					                                                 'type': 'string'}]),
 | 
				
			||||||
                               ),
 | 
					                               ),
 | 
				
			||||||
                  models.Alarm(alarm_id='y3ll0w',
 | 
					                  models.Alarm(alarm_id='y3ll0w',
 | 
				
			||||||
                               enabled=True,
 | 
					                               enabled=False,
 | 
				
			||||||
                               type='threshold',
 | 
					                               type='threshold',
 | 
				
			||||||
                               name='yellow-alert',
 | 
					                               name='yellow-alert',
 | 
				
			||||||
                               description='yellow',
 | 
					                               description='yellow',
 | 
				
			||||||
@@ -1944,6 +1944,21 @@ class AlarmTest(AlarmTestBase,
 | 
				
			|||||||
        alarms = list(self.conn.get_alarms())
 | 
					        alarms = list(self.conn.get_alarms())
 | 
				
			||||||
        self.assertEqual([], alarms)
 | 
					        self.assertEqual([], alarms)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_list(self):
 | 
				
			||||||
 | 
					        self.add_some_alarms()
 | 
				
			||||||
 | 
					        alarms = list(self.conn.get_alarms())
 | 
				
			||||||
 | 
					        self.assertEqual(len(alarms), 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_list_enabled(self):
 | 
				
			||||||
 | 
					        self.add_some_alarms()
 | 
				
			||||||
 | 
					        alarms = list(self.conn.get_alarms(enabled=True))
 | 
				
			||||||
 | 
					        self.assertEqual(len(alarms), 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_list_disabled(self):
 | 
				
			||||||
 | 
					        self.add_some_alarms()
 | 
				
			||||||
 | 
					        alarms = list(self.conn.get_alarms(enabled=False))
 | 
				
			||||||
 | 
					        self.assertEqual(len(alarms), 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_add(self):
 | 
					    def test_add(self):
 | 
				
			||||||
        self.add_some_alarms()
 | 
					        self.add_some_alarms()
 | 
				
			||||||
        alarms = list(self.conn.get_alarms())
 | 
					        alarms = list(self.conn.get_alarms())
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user