Skip to content

Commit 16af9a2

Browse files
committed
Waiting for the agents to reach goal state
1 parent f763e34 commit 16af9a2

File tree

4 files changed

+52
-19
lines changed

4 files changed

+52
-19
lines changed

docker/mongodb-kubernetes-tests/kubetester/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ def create_or_update_configmap(
131131
data: Dict[str, str],
132132
api_client: Optional[kubernetes.client.ApiClient] = None,
133133
) -> str:
134-
print("Logging inside create_or_update configmap")
135134
try:
136135
create_configmap(namespace, name, data, api_client)
137136
except kubernetes.client.ApiException as e:

docker/mongodb-kubernetes-tests/kubetester/kubetester.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -978,16 +978,6 @@ def get_automation_status(group_id=None, group_name=None):
978978

979979
return response.json()
980980

981-
@staticmethod
982-
def get_automation_status(group_id=None, group_name=None):
983-
if group_id is None:
984-
group_id = KubernetesTester.get_om_group_id(group_name=group_name)
985-
986-
url = build_automation_status_endpoint(KubernetesTester.get_om_base_url(), group_id)
987-
response = KubernetesTester.om_request("get", url)
988-
989-
return response.json()
990-
991981
@staticmethod
992982
def get_monitoring_config(group_id=None):
993983
if group_id is None:

docker/mongodb-kubernetes-tests/kubetester/omtester.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,23 @@
1515
import requests
1616
import semver
1717
from kubetester.automation_config_tester import AutomationConfigTester
18-
from kubetester.kubetester import build_agent_auth, build_auth, run_periodically
18+
from kubetester.kubetester import (
19+
KubernetesTester,
20+
build_agent_auth,
21+
build_auth,
22+
run_periodically,
23+
)
1924
from kubetester.mongotester import BackgroundHealthChecker
2025
from kubetester.om_queryable_backups import OMQueryableBackup
2126
from opentelemetry import trace
2227
from requests.adapters import HTTPAdapter, Retry
28+
from tests import test_logger
2329
from tests.common.ops_manager.cloud_manager import is_cloud_qa
2430

2531
skip_if_cloud_manager = pytest.mark.skipif(is_cloud_qa(), reason="Do not run in Cloud Manager")
2632

33+
logger = test_logger.get_test_logger(__name__)
34+
2735

2836
class BackupStatus(str, Enum):
2937
"""Enum for backup statuses in Ops Manager. Note that 'str' is inherited to fix json serialization issues"""
@@ -414,7 +422,7 @@ def om_request():
414422
span.set_attribute(key=f"mck.om.request.retries", value=retries - retry_count)
415423
return resp
416424
except Exception as e:
417-
print(f"Encountered exception: {e} on retry number {retries-retry_count}")
425+
print(f"Encountered exception: {e} on retry number {retries - retry_count}")
418426
span.set_attribute(key=f"mck.om.request.exception", value=str(e))
419427
last_exception = e
420428
time.sleep(1)
@@ -678,6 +686,42 @@ def api_update_version_manifest(self, major_version: str = "8.0"):
678686
body = requests.get(url=f"https://opsmanager.mongodb.com/static/version_manifest/{major_version}.json").json()
679687
self.om_request("put", "/versionManifest", json_object=body)
680688

689+
def api_get_automation_status(self) -> dict[str, str]:
690+
return self.om_request("get", f"/groups/{self.context.project_id}/automationStatus").json()
691+
692+
def wait_agents_ready(self, timeout: Optional[int] = 600):
693+
"""Waits until all the agents reached the goal automation config version."""
694+
log_prefix = f"[{self.context.group_name}/{self.context.project_id}] "
695+
696+
def agents_are_ready():
697+
auto_status = self.api_get_automation_status()
698+
goal_version = auto_status.get("goalVersion")
699+
700+
logger.info(f"{log_prefix}Checking if all agent processes have reached goal version: {goal_version}")
701+
processes_not_ready = []
702+
for process in auto_status.get("processes", []):
703+
process_name = process.get("name", "unknown")
704+
process_version = process.get("lastGoalVersionAchieved")
705+
if process_version != goal_version:
706+
logger.info(
707+
f"{log_prefix}Process {process_name} at version {process_version}, expected {goal_version}"
708+
)
709+
processes_not_ready.append(process_name)
710+
711+
all_processes_ready = len(processes_not_ready) == 0
712+
if all_processes_ready:
713+
logger.info(f"{log_prefix}All agent processes have reached the goal version")
714+
else:
715+
logger.info(f"{log_prefix}{len(processes_not_ready)} processes have not yet reached the goal version")
716+
717+
return all_processes_ready
718+
719+
KubernetesTester.wait_until(
720+
agents_are_ready,
721+
timeout=timeout,
722+
sleep_time=3,
723+
)
724+
681725

682726
class OMBackgroundTester(BackgroundHealthChecker):
683727
"""

docker/mongodb-kubernetes-tests/tests/search/search_enterprise_tls.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import pymongo
22
import yaml
3-
from kubernetes import client
4-
from kubetester import create_or_update_secret, run_periodically, try_load, wait_until
3+
from kubetester import create_or_update_secret, run_periodically, try_load
54
from kubetester.certs import create_mongodb_tls_certs, create_tls_certs
65
from kubetester.kubetester import KubernetesTester
76
from kubetester.kubetester import fixture as yaml_fixture
@@ -212,11 +211,12 @@ def check_mongod_parameters():
212211
run_periodically(check_mongod_parameters, timeout=200)
213212

214213

215-
# After picking up MongoDBSearch CR, MongoDB reconciler will add mongod parameters.
216-
# But it will not immediately mark the MongoDB CR as Pending
217-
# spinning
214+
# After picking up MongoDBSearch CR, MongoDB reconciler will add mongod parameters to each process.
215+
# Due to how MongoDB reconciler works (blocking on waiting for agents and not changing the status to pending)
216+
# the phase won't be updated to Pending and we need to wait by checking agents' status directly in OM.
218217
@mark.e2e_search_enterprise_tls
219-
def test_wait_for_database_resource_ready(mdb: MongoDB):
218+
def test_wait_for_agents_ready(mdb: MongoDB):
219+
mdb.get_om_tester().wait_agents_ready()
220220
mdb.assert_reaches_phase(Phase.Running, timeout=300)
221221

222222

0 commit comments

Comments
 (0)