Fixed alarmAcknowledgedTime not being updated

This patch modifies that when calling the update alarm API,
if ackState is updated to ACKNOWLEDGED, the value of
alarmAcknowledgedTime will be additionally updated.
If ackState is updated to UNACKNOWLEDGED, the value of
alarmAcknowledgedTime is deleted.

Closes-Bug: #2043062
Change-Id: I2b8a66f9d38c2104f8caf4aebc59573c2c05eef0
This commit is contained in:
YiFeng
2023-11-15 15:53:48 +09:00
parent 92f5cb49cb
commit 8cb0b2ec2a
6 changed files with 49 additions and 18 deletions

View File

@ -109,7 +109,7 @@ Result:
| Field | Value |
+----------------------------+------------------------------------------------------------------------------------------------------+
| Ack State | ACKNOWLEDGED |
| Alarm Acknowledged Time | |
| Alarm Acknowledged Time | 2022-08-30T12:23:52Z |
| Alarm Changed Time | 2022-08-29T05:49:02Z |
| Alarm Cleared Time | 2022-06-22T23:47:36Z |
| Alarm Raised Time | 2022-08-29T05:48:56Z |

View File

@ -564,7 +564,7 @@ Here is an example of getting the specified alarm:
| Field | Value |
+----------------------------+------------------------------------------------------------------------------------------------------+
| Ack State | ACKNOWLEDGED |
| Alarm Acknowledged Time | |
| Alarm Acknowledged Time | 2022-08-30T12:23:52Z |
| Alarm Changed Time | 2022-08-31T07:47:05Z |
| Alarm Cleared Time | 2022-06-22T23:47:36Z |
| Alarm Raised Time | 2022-08-31T07:46:59Z |

View File

@ -13,6 +13,8 @@
# License for the specific language governing permissions and limitations
# under the License.
import datetime
from oslo_log import log as logging
from oslo_utils import uuidutils
@ -97,6 +99,11 @@ class VnfFmControllerV1(sol_wsgi.SolAPIController):
raise sol_ex.AckStateInvalid()
alarm.ackState = ack_state
if ack_state == "ACKNOWLEDGED":
alarm.alarmAcknowledgedTime = datetime.datetime.now(
datetime.timezone.utc)
else:
alarm.alarmAcknowledgedTime = None
with context.session.begin(subtransactions=True):
alarm.update(context)

View File

@ -582,12 +582,18 @@ def alert_event_resolved(inst_id, pod_name):
}
def update_alarm():
def update_alarm_acknowledged():
return {
"ackState": "ACKNOWLEDGED"
}
def update_alarm_unacknowledged():
return {
"ackState": "UNACKNOWLEDGED"
}
def terminate_vnf_min():
# Omit except for required attributes
# NOTE: Only the following cardinality attributes are set.

View File

@ -67,13 +67,15 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
- 6. Alert-Event (firing)
- 7. FM-List-Alarm
- 8. FM-Show-Alarm
- 9. FM-Update-Alarm
- 9. FM-Update-Alarm (acknowledged)
- 10. FM-Show-Alarm
- 11. Alert-Event (resolved)
- 11. FM-Update-Alarm (unacknowledged)
- 12. FM-Show-Alarm
- 13. FM-Delete-Subscription: Delete subscription
- 14. Terminate a VNF instance
- 15. Delete a VNF instance
- 13. Alert-Event (resolved)
- 14. FM-Show-Alarm
- 15. FM-Delete-Subscription: Delete subscription
- 16. Terminate a VNF instance
- 17. Delete a VNF instance
"""
# 1. LCM-Create: Create a new VNF instance resource
@ -172,11 +174,11 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.check_resp_headers_in_get(resp)
self.check_resp_body(body, alarm_expected_attrs)
# 9. FM-Update-Alarm
# 9. FM-Update-Alarm (acknowledged)
expected_attrs = [
'ackState'
]
update_req = paramgen.update_alarm()
update_req = paramgen.update_alarm_acknowledged()
resp, body = self.update_fm_alarm(alarm_id, update_req)
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_delete(resp)
@ -188,6 +190,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
'managedObjectId',
'alarmRaisedTime',
'ackState',
'alarmAcknowledgedTime',
'perceivedSeverity',
'eventTime',
'eventType',
@ -200,25 +203,35 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.check_resp_headers_in_get(resp)
self.check_resp_body(body, expected_attrs)
# 11. Alert-Event (resolved)
# 11. FM-Update-Alarm (unacknowledged)
update_req = paramgen.update_alarm_unacknowledged()
resp, _ = self.update_fm_alarm(alarm_id, update_req)
self.assertEqual(200, resp.status_code)
# 12. FM-Show-Alarm
resp, body = self.show_fm_alarm(alarm_id)
self.assertEqual(200, resp.status_code)
self.assertIsNone(body.get('alarmAcknowledgedTime'))
# 13. Alert-Event (resolved)
alert = paramgen.alert_event_resolved(inst_id, pod_name)
resp, body = self.create_fm_alarm(alert)
self.assertEqual(204, resp.status_code)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmClearedNotification')
# 12. FM-Show-Alarm
# 14. FM-Show-Alarm
resp, body = self.show_fm_alarm(alarm_id)
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_get(resp)
self.check_resp_body(body, alarm_expected_attrs)
# 13. FM-Delete-Subscription: Delete subscription
# 15. FM-Delete-Subscription: Delete subscription
resp, body = self.delete_fm_subscription(sub_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
# 14. LCM-Terminate: Terminate VNF
# 16. LCM-Terminate: Terminate VNF
terminate_req = paramgen.terminate_vnf_min()
resp, body = self.terminate_vnf_instance(inst_id, terminate_req)
self.assertEqual(202, resp.status_code)
@ -232,7 +245,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(fields.VnfInstanceState.NOT_INSTANTIATED,
body['instantiationState'])
# 15. LCM-Delete: Delete a VNF instance
# 17. LCM-Delete: Delete a VNF instance
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
@ -261,7 +274,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
- 6. Alert-Event (firing)
- 7. FM-List-Alarm
- 8. FM-Show-Alarm
- 9. FM-Update-Alarm
- 9. FM-Update-Alarm (acknowledged)
- 10. FM-Show-Alarm
- 11. Alert-Event (resolved)
- 12. FM-Show-Alarm
@ -367,11 +380,11 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.check_resp_headers_in_get(resp)
self.check_resp_body(body, alarm_expected_attrs)
# 9. FM-Update-Alarm
# 9. FM-Update-Alarm (acknowledged)
expected_attrs = [
'ackState'
]
update_req = paramgen.update_alarm()
update_req = paramgen.update_alarm_acknowledged()
resp, body = self.update_fm_alarm(alarm_id, update_req)
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@ -106,6 +106,11 @@ class TestVnffmV1(base.BaseTestCase):
self.assertEqual('1.3.0', result.headers['version'])
self.assertEqual(body, result.body)
body = {"ackState": "UNACKNOWLEDGED"}
result = self.controller.update(
request=self.request, id=SAMPLE_ALARM_ID, body=body)
self.assertEqual(body, result.body)
@mock.patch.object(alarm_utils, 'get_alarm')
def test_update_invalid_body(self, mock_alarm):
mock_alarm.return_value = objects.AlarmV1.from_dict(