cirro.config

  1import configparser
  2import os
  3import re
  4from pathlib import Path
  5from typing import NamedTuple, Dict, Optional, List
  6
  7import requests
  8from requests import RequestException
  9
 10from cirro.models.tenant import Tenant
 11
 12
 13class Constants:
 14    home = os.environ.get('CIRRO_HOME', '~/.cirro')
 15    config_path = Path(home, 'config.ini').expanduser()
 16    default_base_url = 'cirro.bio'
 17    default_max_retries = 10
 18
 19
 20class UserConfig(NamedTuple):
 21    auth_method: str
 22    auth_method_config: Dict  # This needs to match the init params of the auth method
 23    base_url: Optional[str]
 24    transfer_max_retries: Optional[int]
 25    enable_additional_checksum: Optional[bool]
 26
 27
 28def extract_base_url(base_url: str):
 29    # remove http(s):// if it's there
 30    base_url = re.compile(r'https?://').sub('', base_url).strip()
 31    # remove anything after the first slash if it's there
 32    base_url = base_url.split('/')[0]
 33    return base_url
 34
 35
 36def list_tenants() -> List[Tenant]:
 37    resp = requests.get(f'https://nexus.{Constants.default_base_url}/info')
 38    resp.raise_for_status()
 39    return resp.json()['tenants']
 40
 41
 42def save_user_config(user_config: UserConfig):
 43    original_user_config = load_user_config()
 44    ini_config = configparser.ConfigParser()
 45    ini_config['General'] = {
 46        'auth_method': user_config.auth_method,
 47        'base_url': user_config.base_url,
 48        'transfer_max_retries': Constants.default_max_retries
 49    }
 50    if original_user_config:
 51        ini_config['General']['transfer_max_retries'] = str(original_user_config.transfer_max_retries)
 52
 53    ini_config[user_config.auth_method] = user_config.auth_method_config
 54    Constants.config_path.parent.mkdir(exist_ok=True)
 55    with Constants.config_path.open('w') as configfile:
 56        ini_config.write(configfile)
 57
 58
 59def load_user_config() -> Optional[UserConfig]:
 60    if not Constants.config_path.exists():
 61        return None
 62
 63    try:
 64        ini_config = configparser.ConfigParser()
 65        ini_config.read(str(Constants.config_path.absolute()))
 66        main_config = ini_config['General']
 67        auth_method = main_config.get('auth_method')
 68        base_url = main_config.get('base_url')
 69        transfer_max_retries = main_config.getint('transfer_max_retries', Constants.default_max_retries)
 70        enable_additional_checksum = main_config.getboolean('enable_additional_checksum', False)
 71
 72        if auth_method and ini_config.has_section(auth_method):
 73            auth_method_config = dict(ini_config[auth_method])
 74        else:
 75            auth_method_config = {}
 76
 77        return UserConfig(
 78            auth_method=auth_method,
 79            auth_method_config=auth_method_config,
 80            base_url=base_url,
 81            transfer_max_retries=transfer_max_retries,
 82            enable_additional_checksum=enable_additional_checksum
 83        )
 84    except Exception:
 85        raise RuntimeError('Configuration load error, please re-run configuration')
 86
 87
 88class AppConfig:
 89    def __init__(self, base_url: str = None):
 90        self.user_config = load_user_config()
 91        self.base_url = (base_url or
 92                         os.environ.get('CIRRO_BASE_URL') or
 93                         (self.user_config.base_url if self.user_config else None))
 94        if not self.base_url:
 95            raise RuntimeError('No base URL provided, please run cirro configure,'
 96                               ' set the CIRRO_BASE_URL environment variable, or provide the base_url parameter.')
 97        # remove http(s):// if it's there
 98        self.base_url = re.compile(r'https?://').sub('', self.base_url).strip()
 99        self.transfer_max_retries = self.user_config.transfer_max_retries\
100            if self.user_config else Constants.default_max_retries
101        self.enable_additional_checksum = self.user_config.enable_additional_checksum\
102            if self.user_config else False
103        self._init_config()
104
105    def _init_config(self):
106        self.rest_endpoint = f'https://{self.base_url}/api'
107        self.auth_endpoint = f'https://{self.base_url}/api/auth'
108
109        try:
110            info_resp = requests.get(f'{self.rest_endpoint}/info/system')
111            info_resp.raise_for_status()
112
113            info = info_resp.json()
114            self.client_id = info['auth']['sdkAppId']
115            self.user_pool_id = info['auth']['userPoolId']
116            self.references_bucket = info['referencesBucket']
117            self.resources_bucket = info['resourcesBucket']
118            self.region = info['region']
119        except RequestException:
120            raise RuntimeError(f'Failed connecting to {self.base_url}, please check your configuration')
class Constants:
14class Constants:
15    home = os.environ.get('CIRRO_HOME', '~/.cirro')
16    config_path = Path(home, 'config.ini').expanduser()
17    default_base_url = 'cirro.bio'
18    default_max_retries = 10
home = '~/.cirro'
config_path = PosixPath('/home/runner/.cirro/config.ini')
default_base_url = 'cirro.bio'
default_max_retries = 10
class UserConfig(typing.NamedTuple):
21class UserConfig(NamedTuple):
22    auth_method: str
23    auth_method_config: Dict  # This needs to match the init params of the auth method
24    base_url: Optional[str]
25    transfer_max_retries: Optional[int]
26    enable_additional_checksum: Optional[bool]

UserConfig(auth_method, auth_method_config, base_url, transfer_max_retries, enable_additional_checksum)

UserConfig( auth_method: str, auth_method_config: Dict, base_url: Optional[str], transfer_max_retries: Optional[int], enable_additional_checksum: Optional[bool])

Create new instance of UserConfig(auth_method, auth_method_config, base_url, transfer_max_retries, enable_additional_checksum)

auth_method: str

Alias for field number 0

auth_method_config: Dict

Alias for field number 1

base_url: Optional[str]

Alias for field number 2

transfer_max_retries: Optional[int]

Alias for field number 3

enable_additional_checksum: Optional[bool]

Alias for field number 4

def extract_base_url(base_url: str):
29def extract_base_url(base_url: str):
30    # remove http(s):// if it's there
31    base_url = re.compile(r'https?://').sub('', base_url).strip()
32    # remove anything after the first slash if it's there
33    base_url = base_url.split('/')[0]
34    return base_url
def list_tenants() -> List[cirro.models.tenant.Tenant]:
37def list_tenants() -> List[Tenant]:
38    resp = requests.get(f'https://nexus.{Constants.default_base_url}/info')
39    resp.raise_for_status()
40    return resp.json()['tenants']
def save_user_config(user_config: UserConfig):
43def save_user_config(user_config: UserConfig):
44    original_user_config = load_user_config()
45    ini_config = configparser.ConfigParser()
46    ini_config['General'] = {
47        'auth_method': user_config.auth_method,
48        'base_url': user_config.base_url,
49        'transfer_max_retries': Constants.default_max_retries
50    }
51    if original_user_config:
52        ini_config['General']['transfer_max_retries'] = str(original_user_config.transfer_max_retries)
53
54    ini_config[user_config.auth_method] = user_config.auth_method_config
55    Constants.config_path.parent.mkdir(exist_ok=True)
56    with Constants.config_path.open('w') as configfile:
57        ini_config.write(configfile)
def load_user_config() -> Optional[UserConfig]:
60def load_user_config() -> Optional[UserConfig]:
61    if not Constants.config_path.exists():
62        return None
63
64    try:
65        ini_config = configparser.ConfigParser()
66        ini_config.read(str(Constants.config_path.absolute()))
67        main_config = ini_config['General']
68        auth_method = main_config.get('auth_method')
69        base_url = main_config.get('base_url')
70        transfer_max_retries = main_config.getint('transfer_max_retries', Constants.default_max_retries)
71        enable_additional_checksum = main_config.getboolean('enable_additional_checksum', False)
72
73        if auth_method and ini_config.has_section(auth_method):
74            auth_method_config = dict(ini_config[auth_method])
75        else:
76            auth_method_config = {}
77
78        return UserConfig(
79            auth_method=auth_method,
80            auth_method_config=auth_method_config,
81            base_url=base_url,
82            transfer_max_retries=transfer_max_retries,
83            enable_additional_checksum=enable_additional_checksum
84        )
85    except Exception:
86        raise RuntimeError('Configuration load error, please re-run configuration')
class AppConfig:
 89class AppConfig:
 90    def __init__(self, base_url: str = None):
 91        self.user_config = load_user_config()
 92        self.base_url = (base_url or
 93                         os.environ.get('CIRRO_BASE_URL') or
 94                         (self.user_config.base_url if self.user_config else None))
 95        if not self.base_url:
 96            raise RuntimeError('No base URL provided, please run cirro configure,'
 97                               ' set the CIRRO_BASE_URL environment variable, or provide the base_url parameter.')
 98        # remove http(s):// if it's there
 99        self.base_url = re.compile(r'https?://').sub('', self.base_url).strip()
100        self.transfer_max_retries = self.user_config.transfer_max_retries\
101            if self.user_config else Constants.default_max_retries
102        self.enable_additional_checksum = self.user_config.enable_additional_checksum\
103            if self.user_config else False
104        self._init_config()
105
106    def _init_config(self):
107        self.rest_endpoint = f'https://{self.base_url}/api'
108        self.auth_endpoint = f'https://{self.base_url}/api/auth'
109
110        try:
111            info_resp = requests.get(f'{self.rest_endpoint}/info/system')
112            info_resp.raise_for_status()
113
114            info = info_resp.json()
115            self.client_id = info['auth']['sdkAppId']
116            self.user_pool_id = info['auth']['userPoolId']
117            self.references_bucket = info['referencesBucket']
118            self.resources_bucket = info['resourcesBucket']
119            self.region = info['region']
120        except RequestException:
121            raise RuntimeError(f'Failed connecting to {self.base_url}, please check your configuration')
AppConfig(base_url: str = None)
 90    def __init__(self, base_url: str = None):
 91        self.user_config = load_user_config()
 92        self.base_url = (base_url or
 93                         os.environ.get('CIRRO_BASE_URL') or
 94                         (self.user_config.base_url if self.user_config else None))
 95        if not self.base_url:
 96            raise RuntimeError('No base URL provided, please run cirro configure,'
 97                               ' set the CIRRO_BASE_URL environment variable, or provide the base_url parameter.')
 98        # remove http(s):// if it's there
 99        self.base_url = re.compile(r'https?://').sub('', self.base_url).strip()
100        self.transfer_max_retries = self.user_config.transfer_max_retries\
101            if self.user_config else Constants.default_max_retries
102        self.enable_additional_checksum = self.user_config.enable_additional_checksum\
103            if self.user_config else False
104        self._init_config()
user_config
base_url
transfer_max_retries
enable_additional_checksum