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))
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)
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)
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))
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))
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)
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)
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)
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
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