diff --git a/maap/Secrets.py b/maap/Secrets.py new file mode 100644 index 0000000..548ca30 --- /dev/null +++ b/maap/Secrets.py @@ -0,0 +1,129 @@ +import requests +import logging +import json +from maap.utils import endpoints +from maap.utils import requests_utils + + +class Secrets: + """ + Functions used for Member secrets API interfacing + """ + def __init__(self, config, api_header): + self._api_header = api_header + # self._members_endpoint = members_endpoint + self._members_endpoint = "https://api.dit.maap-project.org/api/members/self" + self._logger = logging.getLogger(__name__) + + + def get_secrets(self): + """ + Returns a list of secrets for a given user. + + Returns: + list: Secret names for a given user. + """ + try: + response = requests.get( + url = f"{self._members_endpoint}/{endpoints.MEMBERS_SECRETS}", + headers=self._api_header + ) + + return json.loads(response.text) + + except Exception as ex: + raise(f"Error retrieving secrets: {ex}") + + + def get_secret(self, secret_name=None): + """ + Returns secret value for provided secret name. + + Args: + secret_name (str, required): Secret name. + secret_value (str, optional): Secret value. + + Returns: + dict: Secret name and value. + + Raises: + ValueError: If secret name is not provided. + """ + try: + if secret_name is None: + raise ValueError("Failed to get secret value. Please provide secret name.") + + response = requests.get( + url = f"{self._members_endpoint}/{endpoints.MEMBERS_SECRETS}/{secret_name}", + headers=self._api_header + ) + + return json.loads(response.text) + + except Exception as ex: + raise(f"Error retrieving secret: {ex}") + + + def add_secret(self, secret_name=None, secret_value=None): + """ + Adds a secret. Secret name must be provided. Secret value may be null. + + Args: + secret_name (str, required): Secret name. + secret_value (str, optional): Secret value. + + Returns: + dict: Containing name and value of secret that was just added. + + Raises: + ValueError: If secret name is not provided. + """ + try: + if secret_name is None: + raise ValueError("Failed to add secret. Please provide secret name.") + + response = requests.post( + url = f"{self._members_endpoint}/{endpoints.MEMBERS_SECRETS}", + headers=self._api_header, + data=json.dumps({"secret_name": secret_name, "secret_value": secret_value}) + ) + + return json.loads(response.text) + + except Exception as ex: + raise(f"Error adding secret: {ex}") + + + + def delete_secret(self, secret_name=None): + """ + Deletes a secret. + + Args: + secret_name (str, required): Secret name. + + Returns: + dict: Containing response code and message indicating whether or not deletion was successful. + + Raises: + ValueError: If secret name is not provided. + """ + try: + if secret_name is None: + raise ValueError("Failed to delete secret. Please provide secret name.") + + response = requests.delete( + url = f"{self._members_endpoint}/{endpoints.MEMBERS_SECRETS}/{secret_name}", + headers=self._api_header + ) + + return json.loads(response.text) + + except Exception as ex: + raise(f"Error deleting secret: {ex}") + + + + + + diff --git a/maap/config_reader.py b/maap/config_reader.py index e8a2fbd..5171573 100644 --- a/maap/config_reader.py +++ b/maap/config_reader.py @@ -81,6 +81,7 @@ def __init__(self, maap_host): self.algorithm_build = self._get_api_endpoint("algorithm_build") self.mas_algo = self._get_api_endpoint("mas_algo") self.dps_job = self._get_api_endpoint("dps_job") + self.member_secrets = self._get_api_endpoint("member_secrets") self.member_dps_token = self._get_api_endpoint("member_dps_token") self.requester_pays = self._get_api_endpoint("requester_pays") self.edc_credentials = self._get_api_endpoint("edc_credentials") diff --git a/maap/maap.py b/maap/maap.py index 8b91695..40c87ca 100644 --- a/maap/maap.py +++ b/maap/maap.py @@ -17,6 +17,7 @@ from maap.utils import algorithm_utils from maap.Profile import Profile from maap.AWS import AWS +from maap.Secrets import Secrets from maap.dps.DpsHelper import DpsHelper from maap.utils import endpoints @@ -40,10 +41,11 @@ def __init__(self, maap_host=os.getenv('MAAP_API_HOST', 'api.maap-project.org')) self.config.workspace_bucket_credentials, self._get_api_header() ) + self.secrets = Secrets(self.config, self._get_api_header(content_type="application/json")) def _get_api_header(self, content_type=None): - api_header = {'Accept': content_type if content_type else self.config.content_type, 'token': self.config.maap_token} + api_header = {'Accept': content_type if content_type else self.config.content_type, 'token': self.config.maap_token, 'Content-Type': content_type if content_type else self.config.content_type} if os.environ.get("MAAP_PGT"): api_header['proxy-ticket'] = os.environ.get("MAAP_PGT") diff --git a/maap/utils/endpoints.py b/maap/utils/endpoints.py index 33bc816..8937f8e 100644 --- a/maap/utils/endpoints.py +++ b/maap/utils/endpoints.py @@ -3,3 +3,5 @@ DPS_JOB_DISMISS = "cancel" DPS_JOB_LIST = "list" CMR_ALGORITHM_DATA = "data" + +MEMBERS_SECRETS = "secrets"