def _run_proxy_and_command(cmd, port, backend_port, update_listener, asynchronous): global PROCESS_THREAD log_startup_message("Kinesis") start_proxy_for_service("kinesis", port, backend_port, update_listener) # TODO: generalize into service manager once it is introduced try: PROCESS_THREAD = do_run(cmd, asynchronous) finally: if asynchronous: def _return_listener(*_): try: ret_code = PROCESS_THREAD.result_future.result() if ret_code not in [0, None]: LOGGER.error("kinesis terminated with return code %s", ret_code) finally: kinesis_stopped.set() start_thread(_return_listener) else: kinesis_stopped.set() return PROCESS_THREAD
def start_kinesis(port=None, update_listener=None, asynchronous=None) -> Server: """ Creates a singleton of a Kinesis server and starts it on a new thread. Uses either Kinesis Mock or Kinesalite based on value of config.KINESIS_PROVIDER :param port: port to run server on. Selects an arbitrary available port if None. :param update_listener: an update listener instance for server proxy :param asynchronous: currently unused but required by localstack.services.plugins.Service.start(). TODO: either make use of this param or refactor Service.start() to not pass it. :returns: A running Kinesis server instance :raises: ValueError: Value of config.KINESIS_PROVIDER is not recognized as one of "kinesis-mock" or "kinesalite" """ global _server if not _server: if config.KINESIS_PROVIDER == "kinesis-mock": _server = kinesis_mock_server.create_kinesis_mock_server() elif config.KINESIS_PROVIDER == "kinesalite": _server = kinesalite_server.create_kinesalite_server() else: raise ValueError('Unsupported Kinesis provider "%s"' % config.KINESIS_PROVIDER) _server.start() log_startup_message("Kinesis") port = port or config.service_port("kinesis") start_proxy_for_service( "kinesis", port, backend_port=_server.port, update_listener=update_listener, ) return _server
def start_dynamodb(port=None, asynchronous=False, update_listener=None): global PORT_DYNAMODB_BACKEND PORT_DYNAMODB_BACKEND = get_free_tcp_port() port = port or config.PORT_DYNAMODB install.install_dynamodb_local() ddb_data_dir_param = "-inMemory" if config.DATA_DIR: ddb_data_dir = "%s/dynamodb" % config.DATA_DIR mkdir(ddb_data_dir) # as the service command cds into a different directory, the absolute # path of the DATA_DIR is needed as the -dbPath absolute_path = os.path.abspath(ddb_data_dir) ddb_data_dir_param = "-dbPath %s" % absolute_path cmd = ( "cd %s/infra/dynamodb/; java -Djava.library.path=./DynamoDBLocal_lib " + "-Xmx%s -jar DynamoDBLocal.jar -port %s %s" ) % ( MODULE_MAIN_PATH, config.DYNAMODB_HEAP_SIZE, PORT_DYNAMODB_BACKEND, ddb_data_dir_param, ) log_startup_message("DynamoDB") start_proxy_for_service( "dynamodb", port, backend_port=PORT_DYNAMODB_BACKEND, update_listener=update_listener, ) return do_run(cmd, asynchronous, auto_restart=True)
def start_sqs_elasticmq(port=None, asynchronous=False, update_listener=None): global PORT_SQS_BACKEND port = port or config.PORT_SQS install_elasticmq() PORT_SQS_BACKEND = get_free_tcp_port() # create config file config_params = """ include classpath("application.conf") node-address { protocol = http host = "%s" port = %s context-path = "" } rest-sqs { enabled = true bind-port = %s bind-hostname = "0.0.0.0" sqs-limits = strict } """ % (LOCALSTACK_HOSTNAME, port, PORT_SQS_BACKEND) config_file = os.path.join(TMP_FOLDER, 'sqs.%s.conf' % short_uid()) TMP_FILES.append(config_file) save_file(config_file, config_params) # start process cmd = ('java -Dconfig.file=%s -Xmx%s -jar %s/elasticmq-server.jar' % (config_file, MAX_HEAP_SIZE, INSTALL_DIR_ELASTICMQ)) log_startup_message('SQS') start_proxy_for_service('sqs', port, PORT_SQS_BACKEND, update_listener) return do_run(cmd, asynchronous)
def start_kinesalite(port=None, asynchronous=False, update_listener=None): # install and apply patches install.install_kinesalite() apply_patches_kinesalite() # start up process port = port or config.PORT_KINESIS backend_port = get_free_tcp_port() latency = config.KINESIS_LATENCY kinesis_data_dir_param = "" if config.DATA_DIR: kinesis_data_dir = "%s/kinesis" % config.DATA_DIR mkdir(kinesis_data_dir) kinesis_data_dir_param = "--path %s" % kinesis_data_dir cmd = ( "%s/node_modules/kinesalite/cli.js --shardLimit %s --port %s" " --createStreamMs %s --deleteStreamMs %s --updateStreamMs %s %s") % ( MODULE_MAIN_PATH, config.KINESIS_SHARD_LIMIT, backend_port, latency, latency, latency, kinesis_data_dir_param, ) log_startup_message("Kinesis") start_proxy_for_service("kinesis", port, backend_port, update_listener) return do_run(cmd, asynchronous)
def start_stepfunctions(port=None, asynchronous=False, update_listener=None): port = port or config.PORT_STEPFUNCTIONS backend_port = config.LOCAL_PORT_STEPFUNCTIONS install.install_stepfunctions_local() cmd = get_command(backend_port) log_startup_message("StepFunctions") start_proxy_for_service("stepfunctions", port, backend_port, update_listener) return do_run(cmd, asynchronous)
def start_dynamodb(port=None, asynchronous=True, update_listener=None): global _server if not _server: _server = create_dynamodb_server() _server.start() log_startup_message("DynamoDB") start_proxy_for_service( "dynamodb", port, backend_port=_server.port, update_listener=update_listener, ) return _server
def start_sqs(*args, **kwargs): global _server, PORT_SQS_BACKEND if _server: return _server log_startup_message("SQS") if SQS_BACKEND_IMPL == "elasticmq": _server = start_sqs_elasticmq(*args, **kwargs) else: _server = start_sqs_moto(*args, **kwargs) PORT_SQS_BACKEND = _server.port return _server
def start_kinesis(port=None, asynchronous=False, update_listener=None): port = port or config.PORT_KINESIS install.install_kinesalite() backend_port = get_free_tcp_port() latency = config.KINESIS_LATENCY kinesis_data_dir_param = '' if config.DATA_DIR: kinesis_data_dir = '%s/kinesis' % config.DATA_DIR mkdir(kinesis_data_dir) kinesis_data_dir_param = '--path %s' % kinesis_data_dir cmd = ('%s/node_modules/kinesalite/cli.js --shardLimit %s --port %s' ' --createStreamMs %s --deleteStreamMs %s --updateStreamMs %s %s' ) % (ROOT_PATH, config.KINESIS_SHARD_LIMIT, backend_port, latency, latency, latency, kinesis_data_dir_param) log_startup_message('Kinesis') start_proxy_for_service('kinesis', port, backend_port, update_listener) return do_run(cmd, asynchronous)
def start_kms_local(port=None, backend_port=None, asynchronous=None, update_listener=None): port = port or config.PORT_KMS backend_port = get_free_tcp_port() kms_binary = INSTALL_PATH_KMS_BINARY_PATTERN.replace("<arch>", get_os()) log_startup_message("KMS") start_proxy_for_service("kms", port, backend_port, update_listener) env_vars = { "PORT": str(backend_port), "KMS_REGION": config.DEFAULT_REGION, "REGION": config.DEFAULT_REGION, "KMS_ACCOUNT_ID": TEST_AWS_ACCOUNT_ID, "ACCOUNT_ID": TEST_AWS_ACCOUNT_ID, } if config.dirs.data: env_vars["KMS_DATA_PATH"] = config.dirs.data result = do_run(kms_binary, asynchronous, env_vars=env_vars) wait_for_port_open(backend_port) return result
def start_kms(port=None, backend_port=None, asynchronous=None, update_listener=None): port = port or config.PORT_KMS backend_port = get_free_tcp_port() kms_binary = INSTALL_PATH_KMS_BINARY_PATTERN.replace('<arch>', get_arch()) log_startup_message('KMS') start_proxy_for_service('kms', port, backend_port, update_listener) env_vars = { 'PORT': str(backend_port), 'KMS_REGION': config.DEFAULT_REGION, 'REGION': config.DEFAULT_REGION, 'KMS_ACCOUNT_ID': TEST_AWS_ACCOUNT_ID, 'ACCOUNT_ID': TEST_AWS_ACCOUNT_ID } if config.DATA_DIR: env_vars['KMS_DATA_PATH'] = config.DATA_DIR result = do_run(kms_binary, asynchronous, env_vars=env_vars) wait_for_port_open(backend_port) return result
def start_stepfunctions(asynchronous=True): # TODO: introduce Server abstraction for StepFunctions process global PROCESS_THREAD backend_port = config.LOCAL_PORT_STEPFUNCTIONS install.install_stepfunctions_local() cmd = get_command(backend_port) log_startup_message("StepFunctions") # TODO: change ports in stepfunctions.jar, then update here PROCESS_THREAD = do_run( cmd, asynchronous, strip_color=True, env_vars={ "EDGE_PORT": config.EDGE_PORT_HTTP or config.EDGE_PORT, "EDGE_PORT_HTTP": config.EDGE_PORT_HTTP or config.EDGE_PORT, "DATA_DIR": config.DATA_DIR, }, ) return PROCESS_THREAD
def start_stepfunctions(port=None, asynchronous=False, update_listener=None): port = port or config.service_port("stepfunctions") backend_port = config.LOCAL_PORT_STEPFUNCTIONS install.install_stepfunctions_local() cmd = get_command(backend_port) log_startup_message("StepFunctions") start_proxy_for_service("stepfunctions", port, backend_port, update_listener) global PROCESS_THREAD # TODO: change ports in stepfunctions.jar, then update here PROCESS_THREAD = do_run( cmd, asynchronous, strip_color=True, env_vars={ "EDGE_PORT": config.EDGE_PORT_HTTP or config.EDGE_PORT, "EDGE_PORT_HTTP": config.EDGE_PORT_HTTP or config.EDGE_PORT, "DATA_DIR": config.DATA_DIR, }, ) return PROCESS_THREAD
def start_dynamodb(port=None, asynchronous=False, update_listener=None): global PORT_DYNAMODB_BACKEND PORT_DYNAMODB_BACKEND = get_free_tcp_port() port = port or config.PORT_DYNAMODB install.install_dynamodb_local() ddb_data_dir_param = '-inMemory' if config.DATA_DIR: ddb_data_dir = '%s/dynamodb' % config.DATA_DIR mkdir(ddb_data_dir) # as the service command cds into a different directory, the absolute # path of the DATA_DIR is needed as the -dbPath absolute_path = os.path.abspath(ddb_data_dir) ddb_data_dir_param = '-dbPath %s' % absolute_path cmd = ( 'cd %s/infra/dynamodb/; java -Djava.library.path=./DynamoDBLocal_lib ' + '-Xmx%s -jar DynamoDBLocal.jar -port %s %s') % ( ROOT_PATH, config.DYNAMODB_HEAP_SIZE, PORT_DYNAMODB_BACKEND, ddb_data_dir_param) log_startup_message('DynamoDB') start_proxy_for_service('dynamodb', port, backend_port=PORT_DYNAMODB_BACKEND, update_listener=update_listener) return do_run(cmd, asynchronous)