Esempio n. 1
0
    def __init__(self, tokens=None):
        """Create a CfdeClient.

        Keyword Arguments:
            service_instance (str): The instance of the Globus Automate Flow
                    and/or the DERIVA ingest Action Provider to use. Unless directed otherwise,
                    this should be left to the default. **Default**: ``prod``.
            tokens (dict): A dict keyed by scope, of active Globus Tokens. token keys MUST be a
                    subset of self.scopes. Each token value must contain an additional dict, and
                    have an active "access_token". setting tokens=None will require .login() to
                    be called instead.
                    **Default**: ``None``.
        """
        self.__service_instance = os.getenv("CFDE_SUBMIT_SERVICE_INSTANCE", "prod")
        self.__remote_config = {}  # managed by property
        self.__tokens = {}
        self.__flow_client = None
        self.local_config = fair_research_login.ConfigParserTokenStorage(
            filename=self.config_filename
        )
        cli_message = ('Starting login with Globus Auth, '
                       'press ^C twice to cancel or once to manually authenticate')
        code_handlers = [
            fair_research_login.LocalServerCodeHandler(cli_message=cli_message),
            fair_research_login.InputCodeHandler(),
        ]
        self.__native_client = fair_research_login.NativeClient(client_id=self.client_id,
                                                                app_name=self.app_name,
                                                                token_storage=self.local_config,
                                                                code_handlers=code_handlers,)
        self.last_flow_run = {}
        # Fetch dynamic config info
        self.tokens = tokens or {}
        # Set to true when self.check() passes
        self.ready = False
Esempio n. 2
0
 def __init__(self, *args, **kwargs):
     self.SCOPES = [self.CONCIERGE_SCOPE]
     env = os.getenv('CONCIERGE_ENV', 'production')
     kwargs['base_url'] = kwargs.get('base_url', self.ENVIRONMENTS[env])
     kwargs.update(dict(client_id=self.CLIENT_ID, app_name=self.APP_NAME))
     super().__init__('Concierge Client App', *args, **kwargs)
     self.native_client = fair_research_login.NativeClient(
         app_name=self.app_name,
         client_id=self.CLIENT_ID,
         default_scopes=self.SCOPES,
     )
Esempio n. 3
0
 def get_native_client(self):
     """
     :returns an instance of fair_research_login.NativeClient
     """
     if getattr(self, 'client_id', None) is None:
         raise gladier.exc.AuthException(
             'Gladier client must be instantiated with a '
             '"client_id" to use "login()!')
     secrets_cfg = fair_research_login.ConfigParserTokenStorage(
         filename=self.secret_config_filename)
     return fair_research_login.NativeClient(client_id=self.client_id,
                                             app_name=self.app_name,
                                             token_storage=secrets_cfg)
Esempio n. 4
0
def deploy_client_config():
    cli = fair_research_login.NativeClient(client_id=native_app_id)
    scope = "https://auth.globus.org/scopes/d1e360d2-3b83-4039-bd82-f38f5bf2c394/https"
    cli.login(requested_scopes=scope)
    headers = {
        "Authorization":
        f"Bearer {cli.load_tokens_by_scope()[scope]['access_token']}"
    }
    url = (
        "https://g-5cf005.aa98d.08cc.data.globus.org/submission_dynamic_config/"
        "cfde_client_config.json")
    put_res = requests.put(url, json=load_client_config(), headers=headers)
    put_res.raise_for_status()
    click.secho(f"Client Config Deployed: '{url}'", fg="green")
Esempio n. 5
0
def get_remote_config():
    cli = fair_research_login.NativeClient(client_id=native_app_id)
    scope = "https://auth.globus.org/scopes/d1e360d2-3b83-4039-bd82-f38f5bf2c394/https"
    cli.login(requested_scopes=scope)
    headers = {
        "Authorization":
        f"Bearer {cli.load_tokens_by_scope()[scope]['access_token']}",
        "X-Requested-With": "XMLHttpRequest"
    }
    url = (
        "https://g-5cf005.aa98d.08cc.data.globus.org/submission_dynamic_config/"
        "cfde_client_config.json")
    resp = requests.get(url, headers=headers)
    resp.raise_for_status()
    return resp.json()
Esempio n. 6
0
    def get_native_client(self):
        """
        fair_research_login.NativeClient is used when ``authorizers`` are not provided to __init__.
        This enables local login to the Globus Automate Client, FuncX, and any other Globus
        Resource Server.

        :return: an instance of fair_research_login.NativeClient
        """
        if getattr(self, 'client_id', None) is None:
            raise gladier.exc.AuthException(
                'Gladier client must be instantiated with a '
                '"client_id" to use "login()!')
        secrets_cfg = fair_research_login.ConfigParserTokenStorage(
            filename=self.secret_config_filename)
        return fair_research_login.NativeClient(client_id=self.client_id,
                                                app_name=self.app_name,
                                                token_storage=secrets_cfg)
Esempio n. 7
0
    def __init__(self,
                 authorizer=None,
                 app_name=None,
                 native_client=None,
                 config=None,
                 base_url='https://identifiers.fair-research.org/'):
        self.app_name = app_name or self.NAME
        self.config = config or self.CONFIG
        self.base_url = base_url
        self._authorizer = authorizer

        if native_client is None:
            storage = fair_research_login.ConfigParserTokenStorage(
                filename=self.config, section='tokens')
            self.native_client = fair_research_login.NativeClient(
                app_name=self.app_name,
                client_id=self.CLIENT_ID,
                default_scopes=self.SCOPES,
                token_storage=storage)
Esempio n. 8
0
    def __init__(self, tokens=None):
        """Create a CfdeClient.

        Keyword Arguments:
            tokens (dict): A dict keyed by scope, of active Globus Tokens. token keys MUST be a
                    subset of self.scopes. Each token value must contain an additional dict, and
                    have an active "access_token". setting tokens=None will require .login() to
                    be called instead.
                    **Default**: ``None``.
        """
        try:
            with open(self.config_filename) as f:
                config_data = f.readlines()
            if any(x for x in config_data if x.startswith('flows_automated_tests')):
                os.unlink(self.config_filename)
        except FileNotFoundError:
            pass

        self.__service_instance = os.getenv("CFDE_SUBMIT_SERVICE_INSTANCE", "prod")
        self.__remote_config = {}  # managed by property
        self.__tokens = {}
        self.__flow_client = None
        self.__transfer_client = None
        self.transfer_scope = CONFIG["TRANSFER_SCOPE"]
        self.local_config = fair_research_login.ConfigParserTokenStorage(
            filename=self.config_filename
        )
        cli_message = ('Starting login with Globus Auth, '
                       'press ^C twice to cancel or once to manually authenticate')
        code_handlers = [
            fair_research_login.LocalServerCodeHandler(cli_message=cli_message),
            fair_research_login.InputCodeHandler(),
        ]
        self.__native_client = fair_research_login.NativeClient(client_id=self.client_id,
                                                                app_name=self.app_name,
                                                                token_storage=self.local_config,
                                                                code_handlers=code_handlers, )
        self.last_flow_run = {}
        # Fetch dynamic config info
        self.tokens = tokens or {}
        # Set to true when self.check() passes
        self.ready = False
Esempio n. 9
0
from flow import full_submission_flow_def

native_app_id = "417301b1-5101-456a-8a27-423e71a2ae26"  # Premade native app ID
deriva_aps = {
    "dev": "https://ap-dev.nih-cfde.org/",
    "staging": "https://ap-staging.nih-cfde.org/",
    "prod": "https://ap.nih-cfde.org/"
}

client_config_filename = os.path.join(os.path.dirname(__file__),
                                      "cfde_client_config.json")
old_flows_filename = os.path.join(os.path.dirname(__file__), "old_flows.txt")
DERIVA_SCOPE = 'https://auth.globus.org/scopes/app.nih-cfde.org/deriva_all'
TRANSFER_SCOPE = 'urn:globus:auth:scope:transfer.api.globus.org:all'
CFDE_NATIVE_APP = '417301b1-5101-456a-8a27-423e71a2ae26'
nc = fair_research_login.NativeClient(client_id=CFDE_NATIVE_APP)
nc.login(requested_scopes=[DERIVA_SCOPE, TRANSFER_SCOPE])
transfer_token = get_app_token(CFDE_CONFIG["DEPENDENT_SCOPES"]['transfer'])
auth = globus_sdk.AccessTokenAuthorizer(transfer_token)
transfer_client = globus_sdk.TransferClient(authorizer=auth)


def load_client_config():
    with open(client_config_filename) as f:
        return json.JSONDecoder(
            object_pairs_hook=collections.OrderedDict).decode(f.read())


@click.group()
def cli():
    pass