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>
128 lines
4.7 KiB
Python
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)
|