Ejemplo n.º 1
0
def _get_omega_from_config(configfile, qualifier=None):
    from omegaml import Omega
    from omegaml import settings, _base_config
    defaults = settings()
    with open(configfile, 'r') as fconfig:
        configs = yaml.safe_load(fconfig)
    qualifier = qualifier or 'default'
    if qualifier == 'default':
        config = configs.get(qualifier, configs)
    else:
        config = configs[qualifier]
    _base_config.update_from_dict(config, attrs=defaults)
    settings(reload=True)
    om = Omega(defaults=defaults)
    return om
Ejemplo n.º 2
0
def _save_userconfig_from_apikey(configfile,
                                 userid,
                                 apikey,
                                 api_url=None,
                                 requested_userid=None,
                                 view=False,
                                 keys=None,
                                 qualifier=None):
    from omegaml import settings
    defaults = settings()
    api_url = ensure_api_url(api_url, defaults)
    required_keys = [
        'OMEGA_USERID', 'OMEGA_APIKEY', 'OMEGA_RESTAPI_URL', 'OMEGA_QUALIFIER'
    ]
    keys = keys or []
    auth_env = AuthenticationEnv.secure()
    with open(configfile, 'w') as fconfig:
        configs = auth_env.get_userconfig_from_api(
            api_url=api_url,
            userid=userid,
            apikey=apikey,
            requested_userid=requested_userid,
            qualifier=qualifier,
            view=view)
        config = configs['objects'][0]['data']
        config['OMEGA_RESTAPI_URL'] = api_url
        config['OMEGA_QUALIFIER'] = qualifier or 'default'
        config['OMEGA_USERID'] = userid
        config['OMEGA_APIKEY'] = apikey
        config = {
            k: v
            for k, v in config.items() if k in (required_keys + keys)
        }
        yaml.safe_dump(config, fconfig, default_flow_style=False)
        print("Config is in {configfile}".format(**locals()))
Ejemplo n.º 3
0
 def apply_mixins(self):
     """
     apply mixins in defaults.OMEGA_RUNTIME_MIXINS
     """
     from omegaml import settings
     defaults = settings()
     for mixin in defaults.OMEGA_RUNTIME_MIXINS:
         extend_instance(self, mixin)
Ejemplo n.º 4
0
def get_omega_from_apikey(userid,
                          apikey,
                          api_url=None,
                          requested_userid=None,
                          qualifier=None,
                          view=False):
    """
    setup an Omega instance from userid and apikey

    :param userid: the userid
    :param apikey: the apikey
    :param api_url: the api URL
    :param requested_userid: the userid to request config for. in this case userid
      and apikey must for a staff user for the request to succeed
    :param qualifier: the database qualifier requested. defaults to 'default'
    :returns: the Omega instance configured for the given user
    """
    from omegaml import Omega
    from omegaml import settings, _base_config

    defaults = settings()
    qualifier = qualifier or 'default'
    api_url = api_url or defaults.OMEGA_RESTAPI_URL
    if api_url.startswith('http') or any('test' in v for v in sys.argv):
        api_auth = OmegaRestApiAuth(userid, apikey)
        configs = get_user_config_from_api(api_auth,
                                           api_url=api_url,
                                           requested_userid=requested_userid,
                                           view=view)
        configs = configs['objects'][0]['data']
    elif api_url == 'local':
        configs = {
            k: getattr(defaults, k)
            for k in dir(defaults) if k.startswith('OMEGA')
        }
    else:
        raise ValueError('invalid api_url {}'.format(api_url))
    if qualifier == 'default':
        config = configs.get(qualifier, configs)
    else:
        config = configs[qualifier]
    _base_config.update_from_dict(config)
    settings(reload=True)
    om = Omega(defaults=defaults)
    return om
Ejemplo n.º 5
0
 def _apply_mixins(self):
     """
     apply mixins in defaults.OMEGA_MDF_APPLY_MIXINS
     """
     from omegaml import settings
     defaults = settings()
     for mixin, applyto in defaults.OMEGA_MDF_APPLY_MIXINS:
         if any(v in self.caller._applyto for v in applyto.split(',')):
             extend_instance(self, mixin)
Ejemplo n.º 6
0
def MongoClient(*args, **kwargs):
    """
    Shim function adding SSL kwargs on MongoClient instead of changing 
    each and every location
    """
    from omegaml import settings
    defaults = settings()
    kwargs.update(defaults.OMEGA_MONGO_SSL_KWARGS)
    return RealMongoClient(*args, **kwargs)
Ejemplo n.º 7
0
def _get_omega_from_apikey(userid,
                           apikey,
                           api_url=None,
                           requested_userid=None,
                           qualifier=None,
                           view=False):
    """
    setup an Omega instance from userid and apikey

    :param userid: the userid
    :param apikey: the apikey
    :param api_url: the api URL
    :param requested_userid: the userid to request config for. in this case userid
      and apikey must for a staff user for the request to succeed
    :param qualifier: the database qualifier requested. defaults to 'default'
    :returns: OmegaCloud instance configured for the given user

    Returns:
        OmegaCloud
    """
    from omegaml.client.cloud import OmegaCloud
    from omegaml import settings, _base_config

    defaults = settings(reload=True)
    qualifier = qualifier or 'default'
    defaults.OMEGA_USERID = userid
    defaults.OMEGA_APIKEY = apikey
    defaults.OMEGA_QUALIFIER = qualifier
    api_url = ensure_api_url(api_url, defaults)
    auth_env = AuthenticationEnv.secure()
    if api_url.startswith('http') or any('test' in v for v in sys.argv):
        configs = auth_env.get_userconfig_from_api(
            requested_userid=requested_userid, view=view, defaults=defaults)
        configs = configs['objects'][0]['data']
    elif api_url == 'local':
        configs = {
            k: getattr(defaults, k)
            for k in dir(defaults) if k.startswith('OMEGA')
        }
    else:
        raise ValueError('invalid api_url {}'.format(api_url))
    config = configs.get(qualifier, configs)
    # update
    _base_config.update_from_dict(config, attrs=defaults)
    _base_config.update_from_config(defaults)
    _base_config.load_framework_support(defaults)
    _base_config.load_user_extensions(defaults)
    auth = auth_env.get_runtime_auth(defaults)
    om = OmegaCloud(defaults=defaults, auth=auth)
    # update config to reflect request
    om.defaults.OMEGA_RESTAPI_URL = api_url
    om.defaults.OMEGA_USERID = userid
    om.defaults.OMEGA_APIKEY = apikey
    om.defaults.OMEGA_QUALIFIER = qualifier
    return om
Ejemplo n.º 8
0
def before_all(context):
    # setup omegaml
    import omegaml as om
    use_fixture(splinter_browser, context)
    # set url and admin password
    context.web_url = os.environ.get('OMEGA_URL', 'http://localhost:5000')
    context.jynb_url = os.environ.get('JUPYTER_URL', 'http://localhost:8888')
    # setup environment
    context.debug = os.environ.get('BEHAVE_DEBUG', False)
    defaults = settings()
    context.om = om.setup()
    context.nbfiles = os.environ.get('BEHAVE_NBFILES', './docs/source/nb')
Ejemplo n.º 9
0
    def get_omega_for_task(cls, task, auth=None):
        """
        Get Omega instance configured for user in auth

        If auth is passed, a request is made to OMEGA_RESTAPI_URL to
        retrieve the configuration object for this user.

        If auth is the tuple (None, None, 'default') the omegaml module
        is returned, which is configured to the default instance with
        authentication according to the installation. To raise an
        error instead set settings OMEGA_ALLOW_TASK_DEFAULT_AUTH=False

        :param auth: the OmegaRuntimeAuthentication object
        :return: the Omega instance configured for the user
        """
        from omegaml.util import settings

        default_auth = (None, None, 'default')
        is_auth_provided = lambda auth: (auth is not None and auth !=
                                         default_auth)
        defaults = settings()

        if is_auth_provided(auth):
            if isinstance(auth, (list, tuple)):
                # we get a serialized tuple, recreate auth object
                # -- this is a hack to easily support python 2/3 client/server mix
                userid, apikey, qualifier = auth
                # by default assume worker is in cluster
                # TODO refactor this setting to eedefaults
                view = defaults.OMEGA_SERVICES_INCLUSTER
                om = cls.get_omega_from_apikey(userid,
                                               apikey,
                                               qualifier=qualifier,
                                               view=view)
            else:
                raise ValueError(
                    'cannot parse authentication as {}'.format(auth))
        elif auth == default_auth:
            # we provide the default implementation as per configuration
            from omegaml import _omega
            om = _omega._om
            if not getattr(defaults, 'OMEGA_ALLOW_TASK_DEFAULT_AUTH', True):
                raise ValueError(
                    'Default task authentication is not allowed, got {}'.
                    format(auth))
        else:
            raise ValueError(
                'missing authentication tuple as (userid, apikey, qualifier), got {}'
                .format(auth))
        return om
Ejemplo n.º 10
0
def save_userconfig_from_apikey(configfile, userid, apikey, api_url=None, requested_userid=None,
                                view=False):
    from omegaml import settings
    defaults = settings()
    api_url = api_url or defaults.OMEGA_RESTAPI_URL
    with open(configfile, 'w') as fconfig:
        auth = OmegaRestApiAuth(userid, apikey)
        configs = get_user_config_from_api(auth,
                                           api_url=api_url,
                                           requested_userid=requested_userid,
                                           view=view)
        config = configs['objects'][0]['data']
        config['OMEGA_RESTAPI_URL'] = api_url
        yaml.safe_dump(config, fconfig, default_flow_style=False)
        print("Config is in {configfile}".format(**locals()))
Ejemplo n.º 11
0
def _get_userconfig_from_api(api_auth,
                             api_url=None,
                             requested_userid=None,
                             qualifier=None,
                             view=False):
    # safe way to talk to either the remote API or the in-process test server
    from omegaml import settings
    defaults = settings()
    api_url = ensure_api_url(api_url, defaults)
    api_url += '/api/v1/config/'
    api_url = api_url.replace('//api', '/api')
    query = []
    if requested_userid:
        query.append('user={}'.format(requested_userid))
    if view:
        query.append('view={}'.format(int(view)))
    if qualifier:
        query.append('qualifier={}'.format(qualifier))
    api_url += '?' + '&'.join(query)
    # -- setup appropriate client API
    if api_url.startswith('http'):
        import requests
        server = session_backoff()
        server_kwargs = dict(auth=api_auth)
        deserialize = lambda resp: resp.json()
    elif api_url.startswith('test') or any('test' in v for v in sys.argv):
        try:
            from tastypie.test import TestApiClient
        except ModuleNotFoundError as e:
            # we need omegaee environment to proceed
            raise
        server = TestApiClient()
        server.close = lambda: None
        server_kwargs = dict(authentication=api_auth.get_credentials())
        deserialize = lambda resp: json.loads(resp.content.decode('utf-8'))
    else:
        raise ValueError('invalid api_url {}'.format(api_url))
    # -- actual logic to get configs
    fail_msg = ("Not authenticated using userid {api_auth.username}"
                " apikey {api_auth.apikey}, error was {resp.status_code} "
                "using {api_url}\n{resp.content}")
    resp = server.get(api_url, **server_kwargs)
    assert resp.status_code == 200, fail_msg.format(**locals())
    configs = deserialize(resp)
    server.close()
    return configs
Ejemplo n.º 12
0
 def get_userconfig_from_api(cls,
                             api_auth=None,
                             api_url=None,
                             userid=None,
                             apikey=None,
                             requested_userid=None,
                             defaults=None,
                             qualifier=None,
                             view=False):
     from omegaml.client.userconf import _get_userconfig_from_api, ensure_api_url
     defaults = defaults or settings()
     api_auth = api_auth or cls.get_restapi_auth(userid=userid,
                                                 apikey=apikey,
                                                 qualifier=qualifier,
                                                 defaults=defaults)
     return _get_userconfig_from_api(api_auth,
                                     api_url=ensure_api_url(
                                         api_url, defaults),
                                     qualifier=qualifier
                                     or defaults.OMEGA_QUALIFIER,
                                     requested_userid=requested_userid,
                                     view=view)
Ejemplo n.º 13
0
def get_user_config_from_api(api_auth,
                             api_url=None,
                             requested_userid=None,
                             view=False):
    # safe way to talk to either the remote API or the in-process test server
    defaults = settings()
    api_url = api_url or defaults.OMEGA_RESTAPI_URL
    api_url += '/api/v1/config/'
    api_url = api_url.replace('//api', '/api')
    query = []
    if requested_userid:
        query.append('user={}'.format(requested_userid))
    if view:
        query.append('view={}'.format(int(view)))
    api_url += '?' + '&'.join(query)
    # -- setup appropriate client API
    if api_url.startswith('http'):
        import requests
        server = requests
        server_kwargs = dict(auth=api_auth)
        deserialize = lambda resp: resp.json()
    elif any('test' in v for v in sys.argv):
        # test support
        import json
        from tastypie.test import TestApiClient
        server = TestApiClient()
        server_kwargs = dict(authentication=api_auth.get_credentials())
        deserialize = lambda resp: json.loads(resp.content.decode('utf-8'))
    else:
        raise ValueError('invalid api_url {}'.format(api_url))
    # -- actual logic to get configs
    fail_msg = ("Not authenticated using userid {api_auth.username}"
                " apikey {api_auth.apikey}, error was {resp.status_code} "
                "using {api_url}\n{resp.content}")
    resp = server.get(api_url, **server_kwargs)
    assert resp.status_code == 200, fail_msg.format(**locals())
    configs = deserialize(resp)
    return configs
Ejemplo n.º 14
0
def setup(app):
    from omegaml import settings
    # app.add_stylesheet('custom.css')
    del os.environ['DJANGO_SETTINGS_MODULE']
    defaults = settings()