Files
distcloud/distributedcloud/dccertmon/tests/common/test_subcloud_audit_queue.py
Enzo Candotti 0b9f3866a6 Cleanup dccertmon service
This commit applies the following improvements after the dccertmon
migration:

- Import KubeOperator from dccommon instead of sysinv.common
- Replace six library with requests
- Move constants from dccertmon/common/{constants,utils}.py to
  dccommon/consts.py and remove duplicates
- Update token retrieval to use keystoneauth1
- Deprecate get_dc_role since dccertmon only runs in SystemController
- Use f-strings in logs
- Update unit tests accordingly

Test Plan:
  - PASS: Successfully run linters.
  - PASS: Deploy a subcloud, manage it and verify that the dc-cert
    status is updated to in-sync.
  - PASS: Delete the secret for the adminep-ca-certificate of a managed
    subcloud and verify that it is updated both on the system controller
    and the subcloud.
  - PASS: Deploy a subcloud and wait for dccertmon to audit. Turn off
    the subcloud and wait an hour after turning it on. Verify it is
    audited correctly and the dc-cert status is updated to in-sync.

Story: 2011311
Task: 52255

Change-Id: I63b99a93069ccd0673d9acc983d6438a8831fa4c
Signed-off-by: Enzo Candotti <Enzo.Candotti@windriver.com>
2025-06-04 11:18:03 -03:00

128 lines
4.7 KiB
Python

# Copyright (c) 2025 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
import time
from dccertmon.common.subcloud_audit_queue import (
SubcloudAuditData,
SubcloudAuditException,
SubcloudAuditPriorityQueue,
)
from dccertmon.tests.base import DCCertMonTestCase
class SubcloudAuditQueueTestCase(DCCertMonTestCase):
def setUp(self):
super().setUp()
self.sc_audit_queue = SubcloudAuditPriorityQueue()
def tearDown(self):
self.sc_audit_queue = None
super().tearDown()
def test_audit_item(self):
item1 = SubcloudAuditData("item1")
self.assertEqual(item1.name, "item1")
self.assertEqual(item1.audit_count, 0)
self.assertEqual(item1, SubcloudAuditData("item1", 0))
self.assertEqual(item1, SubcloudAuditData("item1", 1))
def test_subcloud_audit_queue_single(self):
sc_name = "subcloud1"
subcloud = SubcloudAuditData(sc_name)
self.sc_audit_queue.enqueue(subcloud)
self.assertTrue(self.sc_audit_queue.contains(sc_name))
self.assertEqual(self.sc_audit_queue.qsize(), 1)
# peek using the underlying queue
_, sc_audit_item1 = self.sc_audit_queue.queue[0]
self.assertEqual(sc_audit_item1.name, sc_name)
self.assertEqual(sc_audit_item1.audit_count, 1)
def test_subcloud_audit_queue_multiple(self):
subclouds = [SubcloudAuditData(f"subcloud{i}") for i in range(20)]
delay = 0
for i in range(20):
self.sc_audit_queue.enqueue(subclouds[i], delay)
delay += 10
self.assertEqual(self.sc_audit_queue.qsize(), 20)
_, first = self.sc_audit_queue.get()
self.assertEqual(first.name, subclouds[0].name)
self.assertFalse(self.sc_audit_queue.contains(subclouds[0].name))
self.assertEqual(self.sc_audit_queue.qsize(), 19)
# re-enqueue with no delay; it should come out first again
self.sc_audit_queue.enqueue(first, 0)
_, first = self.sc_audit_queue.get()
self.assertEqual(first.name, subclouds[0].name)
timestamp, second = self.sc_audit_queue.get()
self.assertEqual(second.name, subclouds[1].name)
# The time now should be well under the timestamp for this item
self.assertLess(int(time.time()), timestamp)
def test_subcloud_audit_queue_custom_timestamp(self):
subclouds = [SubcloudAuditData(f"subcloud{i}") for i in range(20)]
timestamp = 0
for i in range(20):
self.sc_audit_queue.enqueue(subclouds[i], timestamp=timestamp)
timestamp += 10
self.assertEqual(self.sc_audit_queue.qsize(), 20)
_, first = self.sc_audit_queue.get()
self.assertEqual(first.name, subclouds[0].name)
self.assertFalse(self.sc_audit_queue.contains(subclouds[0].name))
self.assertEqual(self.sc_audit_queue.qsize(), 19)
# re-enqueue with no delay; it should come out first again
self.sc_audit_queue.enqueue(first, timestamp=0)
_, first = self.sc_audit_queue.get()
self.assertEqual(first.name, subclouds[0].name)
self.assertEqual(first, subclouds[0])
self.sc_audit_queue.enqueue(subclouds[0], timestamp=10000)
prev_timestamp = 0
for i in range(19):
next_timestamp, next_item = self.sc_audit_queue.get()
self.assertLess(prev_timestamp, next_timestamp)
self.assertNotEqual(next_item.name, subclouds[0].name)
prev_timestamp = next_timestamp
next_timestamp, next_item = self.sc_audit_queue.get()
self.assertEqual(next_timestamp, 10000)
self.assertEqual(next_item.name, subclouds[0].name)
def test_subcloud_audit_requeue(self):
subclouds = [SubcloudAuditData(f"subcloud{i}") for i in range(20)]
timestamp = 0
for i in range(20):
self.sc_audit_queue.enqueue(subclouds[i], timestamp=timestamp)
timestamp += 10
self.assertEqual(self.sc_audit_queue.qsize(), 20)
self.assertTrue(self.sc_audit_queue.contains(subclouds[0].name))
got_exception = False
try:
self.sc_audit_queue.enqueue(subclouds[0], timestamp=timestamp)
except SubcloudAuditException:
got_exception = True
self.assertTrue(got_exception)
got_exception = False
try:
self.sc_audit_queue.enqueue(
subclouds[0], timestamp=timestamp, allow_requeue=True
)
except SubcloudAuditException:
got_exception = True
self.assertFalse(got_exception)
count = 0
for name in self.sc_audit_queue.enqueued_subcloud_names:
if name == subclouds[0].name:
count += 1
self.assertEqual(count, 2)