File indexing completed on 2026-04-10 08:39:00
0001 from pandacommon.pandalogger.LogWrapper import LogWrapper
0002 from pandacommon.pandalogger.PandaLogger import PandaLogger
0003
0004 from pandaserver.api.v1.common import (
0005 MESSAGE_DATABASE,
0006 generate_response,
0007 request_validation,
0008 )
0009 from pandaserver.brokerage.SiteMapper import SiteMapper
0010 from pandaserver.srvcore.panda_request import PandaRequest
0011 from pandaserver.taskbuffer.TaskBuffer import TaskBuffer
0012
0013 _logger = PandaLogger().getLogger("api_metaconfig")
0014
0015
0016 global_task_buffer = None
0017
0018
0019 def init_task_buffer(task_buffer: TaskBuffer) -> None:
0020 """
0021 Initialize the task buffer. This method needs to be called before any other method in this module.
0022 """
0023
0024 global global_task_buffer
0025 global_task_buffer = task_buffer
0026
0027
0028 @request_validation(_logger, secure=True, request_method="GET")
0029 def get_banned_users(req: PandaRequest) -> dict:
0030 """
0031 Get banned users
0032
0033 Gets the list of banned users from the system (users with `status=disabled` in ATLAS_PANDAMETA.users). Requires a secure connection.
0034
0035 API details:
0036 HTTP Method: GET
0037 Path: /v1/metaconfig/get_banned_users
0038
0039 Args:
0040 req(PandaRequest): internally generated request object
0041
0042 Returns:
0043 dict: The system response `{"success": success, "message": message, "data": data}`.
0044 When successful, the data field contains the banned users in the format `{"user1": False, "user2": False}`
0045 """
0046 tmp_logger = LogWrapper(_logger, f"get_banned_users")
0047
0048 tmp_logger.debug("Start")
0049 success, users = global_task_buffer.get_ban_users()
0050 tmp_logger.debug("Done")
0051 return generate_response(success, data=users)
0052
0053
0054 @request_validation(_logger, secure=False, request_method="GET")
0055 def get_site_specs(req: PandaRequest, type: str = "analysis") -> dict:
0056 """
0057 Get site specs
0058
0059 Gets a dictionary of site specs. By default `analysis` sites are returned. Requires a secure connection.
0060
0061 API details:
0062 HTTP Method: GET
0063 Path: /v1/metaconfig/get_site_specs
0064
0065 Args:
0066 req(PandaRequest): internally generated request object
0067 type(str, optional): type of site as defined in CRIC (currently `unified`, `production`, `analysis`, `all`). Defaults to `analysis`.
0068
0069 Returns:
0070 dict: The system response `{"success": success, "message": message, "data": data}`.
0071 When successful, the data field contains a dictionary with the site data of the requested type.
0072 """
0073
0074 tmp_logger = LogWrapper(_logger, f"get_site_specs")
0075 tmp_logger.debug("Start")
0076
0077 site_specs = {}
0078 site_mapper = SiteMapper(global_task_buffer)
0079
0080 excluded_attrs = {"ddm_endpoints_input", "ddm_endpoints_output", "ddm_input", "ddm_output", "setokens_input", "num_slots_map"}
0081
0082 for site_id, site_spec in site_mapper.siteSpecList.items():
0083 if type == "all" or site_spec.type == type:
0084
0085 site_specs[site_id] = {attr: value for attr, value in vars(site_spec).items() if attr not in excluded_attrs}
0086
0087 tmp_logger.debug("Done")
0088 return generate_response(True, data=site_specs)
0089
0090
0091 @request_validation(_logger, secure=True, production=True, request_method="GET")
0092 def get_resource_types(req: PandaRequest):
0093 """
0094 Get resource types
0095
0096 Gets the resource types (`SCORE`, `MCORE`, etc.) together with their definitions. Requires a secure connection and production role.
0097
0098 API details:
0099 HTTP Method: GET
0100 Path: /v1/metaconfig/get_resource_types
0101
0102 Args:
0103 req(PandaRequest): Internally generated request object containing the environment variables.
0104
0105 Returns:
0106 dict: The system response `{"success": success, "message": message, "data": data}`.
0107 When successful, the data field contains a list of resource types.
0108 """
0109
0110 tmp_logger = LogWrapper(_logger, f"get_resource_types")
0111 tmp_logger.debug("Start")
0112
0113 resource_types = global_task_buffer.getResourceTypes()
0114
0115
0116 if not resource_types:
0117 tmp_logger.debug("Done with error")
0118 return generate_response(False, MESSAGE_DATABASE)
0119
0120
0121 tmp_logger.debug("Done")
0122 return generate_response(True, data=resource_types)