Beispiel #1
0
def init_ps_server(settings):
    tabpy = settings['tabpy']
    existing_pos = tabpy.get_endpoints()
    for (object_name, obj_info) in (existing_pos.items() if sys.version_info >
                                    (3, 0) else existing_pos.iteritems()):
        try:
            object_version = obj_info['version']
            get_query_object_path(settings['state_file_path'], object_name,
                                  object_version)
        except Exception as e:
            log_error('Exception encounted when downloading object: %s'
                      ', error: %s' % (object_name, e))
Beispiel #2
0
def init_model_evaluator(settings):
    '''
    This will go through all models that the service currently have and initialize them.
    '''
    try:
        tabpy = settings['tabpy']
        py_handler = settings['py_handler']

        existing_pos = tabpy.get_endpoints()
        
        for (object_name, obj_info) in (existing_pos.items() if sys.version_info > (3,0) else existing_pos.iteritems()):
            object_version = obj_info['version']
            object_type = obj_info['type']
            object_path = get_query_object_path(
                os.environ['TABPY_STATE_PATH'],
                object_name, object_version)

            log_info('Load endpoint: %s, version: %s, type: %s' % \
                                (object_name, object_version, object_type))
            if object_type == 'alias':
                msg = LoadObject(object_name, obj_info['target'], object_version,
                    False, 'alias')
            else:
                local_path = object_path                    
                msg = LoadObject(object_name, local_path, object_version,
                            False, object_type)
            py_handler.manage_request(msg)

    except Exception as e:
        err_msg = format_exception(e, "Exception encounted when initializing evaluator host:%s" % host_to_initialize)
        log_error(err_msg)
Beispiel #3
0
def init_model_evaluator(settings):
    '''
    This will go through all models that the service currently have and initialize them.
    '''
    try:
        tabpy = settings['tabpy']
        py_handler = settings['py_handler']

        existing_pos = tabpy.get_endpoints()
        
        for (object_name, obj_info) in (existing_pos.items() if sys.version_info > (3,0) else existing_pos.iteritems()):
            object_version = obj_info['version']
            object_type = obj_info['type']
            object_path = get_query_object_path(
                settings['state_file_path'],
                object_name, object_version)

            log_info('Load endpoint: %s, version: %s, type: %s' % \
                                (object_name, object_version, object_type))
            if object_type == 'alias':
                msg = LoadObject(object_name, obj_info['target'], object_version,
                    False, 'alias')
            else:
                local_path = object_path                    
                msg = LoadObject(object_name, local_path, object_version,
                            False, object_type)
            py_handler.manage_request(msg)

    except Exception as e:
        err_msg = format_exception(e, "Exception encounted when initializing evaluator host:%s" % host_to_initialize)
        log_error(err_msg)
Beispiel #4
0
def init_ps_server(settings):
    tabpy = settings['tabpy']
    existing_pos = tabpy.get_endpoints()
    for (object_name, obj_info) in (existing_pos.items() if sys.version_info > (3,0) else existing_pos.iteritems()):
        try:
            object_version = obj_info['version']
            object_type = obj_info['type']
            object_path = get_query_object_path(
                                os.environ['TABPY_STATE_PATH'],
                                object_name, object_version)
        except Exception as e:
            log_error('Exception encounted when downloading object: %s, error: %s' % \
                                            (object_name, e))
Beispiel #5
0
def init_ps_server(settings):
    tabpy = settings['tabpy']
    existing_pos = tabpy.get_endpoints()
    for (object_name, obj_info) in (existing_pos.items() if sys.version_info >
                                    (3, 0) else existing_pos.iteritems()):
        try:
            object_version = obj_info['version']
            object_type = obj_info['type']
            object_path = get_query_object_path(os.environ['TABPY_STATE_PATH'],
                                                object_name, object_version)
        except Exception as e:
            log_error('Exception encounted when downloading object: %s, error: %s' % \
                                            (object_name, e))
Beispiel #6
0
def _get_latest_service_state(settings, new_ps_state):
    '''
    Update the endpoints from the latest remote state file.
    
    Returns
    --------
    (has_changes, endpoint_diff):
        has_changes: True or False
        endpoint_diff: Summary of what has changed, one entry for each changes
    '''
    tabpy = settings['tabpy']

    # Shortcut when nothing is changed
    changes = {'endpoints': {}}

    # update endpoints
    new_endpoints = new_ps_state.get_endpoints()
    diff = {}
    current_endpoints = settings['py_handler'].ps.query_objects
    for (endpoint_name, endpoint_info) in new_endpoints.items():
        existing_endpoint = current_endpoints.get(endpoint_name)
        if (existing_endpoint is None) or \
                endpoint_info['version'] != existing_endpoint['version']:
            # Either a new endpoint or new endpoint version
            path_to_new_version = get_query_object_path(
                settings['state_file_path'], endpoint_name,
                endpoint_info['version'])
            endpoint_type = endpoint_info.get('type', 'model')
            diff[endpoint_name] = \
                    (endpoint_type,
                     endpoint_info['version'],\
                     path_to_new_version)

    # add removed models too
    for (endpoint_name, endpoint_info) in current_endpoints.items():
        if endpoint_name not in new_endpoints.keys():
            endpoint_type = current_endpoints[endpoint_name].get(
                'type', 'model')
            diff[endpoint_name] = (endpoint_type, None, None)

    if diff:
        changes['endpoints'] = diff

    settings['tabpy'] = new_ps_state
    return (True, changes)
Beispiel #7
0
def _get_latest_service_state(settings, new_ps_state):
    '''
    Update the endpoints from the latest remote state file.
    
    Returns
    --------
    (has_changes, endpoint_diff):
        has_changes: True or False
        endpoint_diff: Summary of what has changed, one entry for each changes
    '''
    tabpy = settings['tabpy']

    # Shortcut when nothing is changed
    changes = {'endpoints': {}}

    # update endpoints
    new_endpoints = new_ps_state.get_endpoints()
    diff = {}
    current_endpoints = settings['py_handler'].ps.query_objects
    for (endpoint_name, endpoint_info) in new_endpoints.items():
        existing_endpoint = current_endpoints.get(endpoint_name)
        if (existing_endpoint is None) or \
                endpoint_info['version'] != existing_endpoint['version']:
            # Either a new endpoint or new endpoint version
            path_to_new_version = get_query_object_path(
                os.environ['TABPY_STATE_PATH'],
                endpoint_name, endpoint_info['version'])
            endpoint_type = endpoint_info.get('type', 'model')
            diff[endpoint_name] = \
                    (endpoint_type, 
                     endpoint_info['version'],\
                     path_to_new_version)

    # add removed models too
    for (endpoint_name, endpoint_info) in current_endpoints.items():
        if endpoint_name not in new_endpoints.keys():
            endpoint_type = current_endpoints[endpoint_name].get('type', 'model')
            diff[endpoint_name] = (endpoint_type, None, None)

    if diff:
        changes['endpoints'] = diff

    settings['tabpy'] = new_ps_state
    return (True, changes)
Beispiel #8
0
    def delete(self, name):
        try:
            endpoints = self.tabpy.get_endpoints(name)
            if len(endpoints) == 0:
                self.error_out(404,
                               "endpoint %s does not exist." % name)
                self.finish()
                return

            # update state
            try:
                endpoint_info = self.tabpy.delete_endpoint(name)
            except Exception as e:
                self.error_out(400,
                               "Error when removing endpoint: %s" % e.message)
                self.finish()
                return

            # delete files
            if endpoint_info['type'] != 'alias':
                delete_path = get_query_object_path(self.settings['state_file_path'], name, None)
                try:
                    yield self._delete_po_future(delete_path)
                except Exception as e:
                    self.error_out(400,
                                   "Error while deleting: %s" % e)
                    self.finish()
                    return

            self.set_status(204)
            self.finish()

        except Exception as e:
            err_msg = format_exception(e, 'delete endpoint')
            self.error_out(500, err_msg)
            self.finish()

        on_state_change(self.settings)
Beispiel #9
0
    def delete(self, name):
        try:
            endpoints = self.tabpy.get_endpoints(name)
            if len(endpoints) == 0:
                self.error_out(404,
                               "endpoint %s does not exist." % name)
                self.finish()
                return

            # update state
            try:
                endpoint_info = self.tabpy.delete_endpoint(name)
            except Exception as e:
                self.error_out(400,
                               "Error when removing endpoint: %s" % e.message)
                self.finish()
                return

            # delete files
            if endpoint_info['type'] != 'alias':
                delete_path = get_query_object_path(self.settings['state_file_path'], name, None)
                try:
                    yield self._delete_po_future(delete_path)
                except Exception as e:
                    self.error_out(400,
                                   "Error while deleting: %s" % e)
                    self.finish()
                    return

            self.set_status(204)
            self.finish()

        except Exception as e:
            err_msg = format_exception(e, 'delete endpoint')
            self.error_out(500, err_msg)
            self.finish()

        on_state_change(self.settings)
Beispiel #10
0
    def _add_or_update_endpoint(self, action, name, version, request_data):
        '''
        Add or update an endpoint
        '''
        _name_checker = _compile('^[a-zA-Z0-9-_\ ]+$')
        if not isinstance(name, (str, unicode)):
            raise TypeError("Endpoint name must be a string or unicode")

        if not _name_checker.match(name):
            raise gen.Return('endpoint name can only contain: a-z, A-Z, 0-9,'
                             ' underscore, hyphens and spaces.')

        if self.settings.get('add_or_updating_endpoint'):
            raise RuntimeError("Another endpoint update is already in progress"
                               ", please wait a while and try again")

        request_uuid = random_uuid()
        self.settings['add_or_updating_endpoint'] = request_uuid
        try:
            description = (request_data['description']
                           if 'description' in request_data else None)
            if 'docstring' in request_data:
                if sys.version_info > (3, 0):
                    docstring = str(
                        bytes(request_data['docstring'],
                              "utf-8").decode('unicode_escape'))
                else:
                    docstring = request_data['docstring'].decode(
                        'string_escape')
            else:
                docstring = None
            endpoint_type = (request_data['type']
                             if 'type' in request_data else None)
            methods = (request_data['methods']
                       if 'methods' in request_data else [])
            dependencies = (request_data['dependencies']
                            if 'dependencies' in request_data else None)
            target = (request_data['target']
                      if 'target' in request_data else None)
            schema = (request_data['schema']
                      if 'schema' in request_data else None)

            src_path = (request_data['src_path']
                        if 'src_path' in request_data else None)
            target_path = get_query_object_path(
                self.settings['state_file_path'], name, version)
            _path_checker = _compile('^[\\a-zA-Z0-9-_\ /]+$')
            # copy from staging
            if src_path:
                if not isinstance(request_data['src_path'], (str, unicode)):
                    raise gen.Return("src_path must be a string.")
                if not _path_checker.match(src_path):
                    raise gen.Return('Endpoint name can only contain: a-z, A-'
                                     'Z, 0-9,underscore, hyphens and spaces.')

                yield self._copy_po_future(src_path, target_path)
            elif endpoint_type != 'alias':
                raise gen.Return("src_path is required to add/update an "
                                 "endpoint.")

            # alias special logic:
            if endpoint_type == 'alias':
                if not target:
                    raise gen.Return('Target is required for alias endpoint.')
                dependencies = [target]

            # update local config
            try:
                if action == 'add':
                    self.tabpy.add_endpoint(name=name,
                                            description=description,
                                            docstring=docstring,
                                            endpoint_type=endpoint_type,
                                            methods=methods,
                                            dependencies=dependencies,
                                            target=target,
                                            schema=schema)
                else:
                    self.tabpy.update_endpoint(name=name,
                                               description=description,
                                               docstring=docstring,
                                               endpoint_type=endpoint_type,
                                               methods=methods,
                                               dependencies=dependencies,
                                               target=target,
                                               schema=schema,
                                               version=version)

            except Exception as e:
                raise gen.Return("Error when changing TabPy state: %s" % e)

            on_state_change(self.settings)

        finally:
            self.settings['add_or_updating_endpoint'] = None
Beispiel #11
0
    def _add_or_update_endpoint(self, action, name, version, request_data):
        '''
        Add or update an endpoint
        '''
        _name_checker = _compile('^[a-zA-Z0-9-_\ ]+$')
        if not isinstance(name, (str,unicode)):
            raise TypeError("Endpoint name must be a string or unicode")

        if not _name_checker.match(name):
            raise gen.Return('endpoint name can only contain: a-z, A-Z, 0-9,'
            ' underscore, hyphens and spaces.')

        if self.settings.get('add_or_updating_endpoint'):
            raise RuntimeError("Another endpoint update is already in progress, "
                                "please wait a while and try again")

        request_uuid = random_uuid()
        self.settings['add_or_updating_endpoint'] = request_uuid
        try:
            description = request_data['description'] if 'description' in request_data else None
            if 'docstring' in request_data:
                if sys.version_info > (3, 0):
                    docstring = str(bytes(request_data['docstring'], "utf-8").decode('unicode_escape'))
                else:
                    docstring = request_data['docstring'].decode('string_escape')
            else:
                docstring=None
            endpoint_type = request_data['type'] if 'type' in request_data else None
            methods = request_data['methods'] if 'methods' in request_data else []
            dependencies = request_data['dependencies'] if 'dependencies' in request_data else None
            target = request_data['target'] if 'target' in request_data else None
            schema = request_data['schema'] if 'schema' in request_data else None

            src_path = request_data['src_path'] if 'src_path' in request_data else None
            target_path = get_query_object_path(self.settings['state_file_path'], name, version)
            _path_checker = _compile('^[\\a-zA-Z0-9-_\ /]+$')
            # copy from staging
            if src_path:
                if not isinstance(request_data['src_path'], (str,unicode)):
                    raise gen.Return("src_path must be a string.")
                if not _path_checker.match(src_path):
                    raise gen.Return('Endpoint name can only contain: a-z, A-Z, 0-9,underscore, hyphens and spaces.')

                yield self._copy_po_future(src_path, target_path)
            elif endpoint_type != 'alias':
                    raise gen.Return("src_path is required to add/update an endpoint.")

            # alias special logic:
            if endpoint_type == 'alias':
                if not target:
                    raise gen.Return('Target is required for alias endpoint.')
                dependencies = [target]

            # update local config
            try:
                if action == 'add':
                    self.tabpy.add_endpoint(
                        name=name,
                        description=description,
                        docstring=docstring,
                        endpoint_type=endpoint_type,
                        methods=methods,
                        dependencies=dependencies,
                        target=target,
                        schema=schema)
                else:
                    self.tabpy.update_endpoint(
                        name=name,
                        description=description,
                        docstring=docstring,
                        endpoint_type=endpoint_type,
                        methods=methods,
                        dependencies=dependencies,
                        target=target,
                        schema=schema,
                        version=version)

            except Exception as e:
                raise gen.Return("Error when changing TabPy state: %s" % e)

            on_state_change(self.settings)

        finally:
            self.settings['add_or_updating_endpoint'] = None