+ # Confirm alarm doesn't exist
+ alarm_id = self.get_alarm_id(endpoint, auth_token, alarm_name)
+ if alarm_id is None:
+ # Try to create the alarm
+ try:
+ metric_name = values['metric_name']
+ resource_id = values['resource_uuid']
+ payload = self.check_payload(values, metric_name, resource_id,
+ alarm_name)
+ new_alarm = self._common._perform_request(
+ url, auth_token, req_type="post", payload=payload)
+
+ return json.loads(new_alarm.text)['alarm_id']
+ except Exception as exc:
+ log.warn("Alarm creation could not be performed: %s", exc)
+ return alarm_id
+ else:
+ log.warn("This alarm already exists. Try an update instead.")
+ return None
+
+ def delete_alarm(self, endpoint, auth_token, alarm_id):
+ """Delete alarm function."""
+ url = "{}/v2/alarms/%s".format(endpoint) % (alarm_id)
+
+ result = False
+ try:
+ self._common._perform_request(url, auth_token, req_type="delete")
+ return True
+ except Exception as exc:
+ log.warn("Failed to delete alarm: %s because %s.", alarm_id, exc)
+ return result
+
+ def list_alarms(self, endpoint, auth_token,
+ alarm_name=None, resource_id=None, severity=None):
+ """Generate the requested list of alarms."""
+ result = None
+ if (alarm_name and resource_id and severity) is None:
+ # List all alarms
+ url = "{}/v2/alarms/".format(endpoint)
+
+ try:
+ result = self._common._perform_request(
+ url, auth_token, req_type="get")
+ return json.loads(result.text)
+ except Exception as exc:
+ log.warn("Unable to generate alarm list: %s", exc)
+
+ return result
+ else:
+ # TODO(mcgoughh): support more specific lists
+ log.debug("Requested list is unavailable")
+
+ return result
+
+ def update_alarm_state(self, endpoint, auth_token, alarm_id):
+ """Set the state of an alarm to ok when ack message is received."""
+ result = False
+
+ url = "{}/v2/alarms/%s/state".format(endpoint) % alarm_id
+ payload = json.dumps("ok")
+
+ try:
+ result = self._common._perform_request(
+ url, auth_token, req_type="put", payload=payload)
+ return True
+ except Exception as exc:
+ log.warn("Unable to update alarm state: %s", exc)
+ return result
+
+ def update_alarm(self, endpoint, auth_token, values):
+ """Get alarm name for an alarm configuration update."""
+ # Get already existing alarm details
+ url = "{}/v2/alarms/%s".format(endpoint) % values['alarm_uuid']
+
+ try:
+ result = self._common._perform_request(
+ url, auth_token, req_type="get")
+ alarm_name = json.loads(result.text)['name']
+ rule = json.loads(result.text)['gnocchi_resources_threshold_rule']
+ alarm_state = json.loads(result.text)['state']
+ resource_id = rule['resource_id']
+ metric_name = rule['metric']
+ except Exception as exc:
+ log.warn("Failed to retreive existing alarm info: %s.\
+ Can only update OSM created alarms.", exc)
+ return None
+
+ # Genate and check payload configuration for alarm update
+ payload = self.check_payload(values, metric_name, resource_id,
+ alarm_name, alarm_state=alarm_state)
+
+ if payload is not None:
+ try:
+ update_alarm = self._common._perform_request(
+ url, auth_token, req_type="put", payload=payload)
+
+ return json.loads(update_alarm.text)['alarm_id']
+ except Exception as exc:
+ log.warn("Alarm update could not be performed: %s", exc)
+ return None
+ return None
+
+ def check_payload(self, values, metric_name, resource_id,
+ alarm_name, alarm_state=None):
+ """Check that the payload is configuration for update/create alarm."""
+ try:
+ # Check state and severity
+ severity = values['severity']
+ if severity == "INDETERMINATE":
+ alarm_state = "insufficient data"
+
+ if alarm_state is None:
+ alarm_state = "ok"