@@ -77,4 +77,48 @@ def get_next_run_number(monitor_url, api_session, logger=None):
7777
7878 except Exception as e :
7979 logger .error (f"Failed to get next run number from API: { e } " )
80- raise RuntimeError (f"Critical failure getting run number: { e } " ) from e
80+ raise RuntimeError (f"Critical failure getting run number: { e } " ) from e
81+
82+
83+ def ensure_namespace (monitor_url , api_session , name , owner = None , logger = None ):
84+ """
85+ Ensure a namespace exists in the database, creating it if not.
86+
87+ Args:
88+ monitor_url (str): Base URL of the swf-monitor service
89+ api_session (requests.Session): Configured session with auth headers
90+ name (str): Namespace name
91+ owner (str, optional): Owner username, defaults to current user
92+ logger (logging.Logger, optional): Logger for output
93+
94+ Returns:
95+ dict: Namespace info with keys: name, owner, description, created (bool)
96+
97+ Raises:
98+ RuntimeError: If API call fails or returns error
99+ """
100+ import os
101+
102+ if logger is None :
103+ logger = logging .getLogger (__name__ )
104+
105+ if owner is None :
106+ owner = os .getenv ('USER' , 'unknown' )
107+
108+ try :
109+ url = f"{ monitor_url } /api/namespaces/ensure/"
110+ payload = {'name' : name , 'owner' : owner }
111+ response = api_session .post (url , json = payload , timeout = 10 )
112+ response .raise_for_status ()
113+
114+ data = response .json ()
115+ if data .get ('status' ) == 'success' :
116+ if data .get ('created' ):
117+ logger .info (f"Created namespace '{ name } ' with owner '{ owner } '" )
118+ return data
119+ else :
120+ raise RuntimeError (f"API returned error: { data .get ('error' , 'Unknown error' )} " )
121+
122+ except Exception as e :
123+ logger .warning (f"Failed to ensure namespace '{ name } ': { e } " )
124+ raise
0 commit comments