def preload_services(): """ Preload services if EAGER_SERVICE_LOADING is true. """ # TODO: lazy loading should become the default beginning 0.13.0 if not config.EAGER_SERVICE_LOADING: # listing the available service plugins will cause resolution of the entry points SERVICE_PLUGINS.list_available() return apis = list() for api in SERVICE_PLUGINS.list_available(): try: SERVICE_PLUGINS.require(api) apis.append(api) except ServiceDisabled as e: LOG.debug("%s", e) except Exception: LOG.exception("could not load service plugin %s", api) if persistence.is_persistence_enabled(): if not config.is_env_true(constants.ENV_PRO_ACTIVATED): LOG.warning( "Persistence mechanism for community services (based on API calls record&replay) will be " "deprecated in 0.13.0 ") persistence.restore_persisted_data(apis)
def kinesis_mock_install_path() -> str: machine = platform.machine().lower() system = platform.system().lower() version = platform.version().lower() is_probably_m1 = system == "darwin" and ("arm64" in version or "arm32" in version) LOG.debug("getting kinesis-mock for %s %s", system, machine) if config.is_env_true("KINESIS_MOCK_FORCE_JAVA"): # sometimes the static binaries may have problems, and we want to fal back to Java bin_file = "kinesis-mock.jar" elif (machine == "x86_64" or machine == "amd64") and not is_probably_m1: if system == "windows": bin_file = "kinesis-mock-mostly-static.exe" elif system == "linux": bin_file = "kinesis-mock-linux-amd64-static" elif system == "darwin": bin_file = "kinesis-mock-macos-amd64-dynamic" else: bin_file = "kinesis-mock.jar" else: bin_file = "kinesis-mock.jar" bin_file_path = os.path.join(INSTALL_DIR_KINESIS_MOCK, bin_file) return bin_file_path
def preload_services(): """ Preload services - restore persistence, and initialize services if EAGER_SERVICE_LOADING=1. """ # listing the available service plugins will cause resolution of the entry points available_services = SERVICE_PLUGINS.list_available() if persistence.is_persistence_enabled(): if not config.is_env_true(constants.ENV_PRO_ACTIVATED): LOG.warning( "Persistence mechanism for community services (based on API calls record&replay) " "will be deprecated in versions 0.13.0 and above" ) persistence.restore_persisted_data(available_services) # lazy is the default beginning with version 0.13.0 if not config.EAGER_SERVICE_LOADING: return for api in available_services: try: SERVICE_PLUGINS.require(api) except ServiceDisabled as e: LOG.debug("%s", e) except Exception: LOG.exception("could not load service plugin %s", api)
def install_kinesis_mock(): target_dir = INSTALL_PATH_KINESIS_MOCK machine = platform.machine().lower() system = platform.system().lower() version = platform.version().lower() is_probably_m1 = system == "darwin" and ("arm64" in version or "arm32" in version) LOG.debug("getting kinesis-mock for %s %s", system, machine) if is_env_true("KINESIS_MOCK_FORCE_JAVA"): # sometimes the static binaries may have problems, and we want to fal back to Java bin_file = "kinesis-mock.jar" elif (machine == "x86_64" or machine == "amd64") and not is_probably_m1: if system == "windows": bin_file = "kinesis-mock-mostly-static.exe" elif system == "linux": bin_file = "kinesis-mock-linux-amd64-static" elif system == "darwin": bin_file = "kinesis-mock-macos-amd64-dynamic" else: bin_file = "kinesis-mock.jar" else: bin_file = "kinesis-mock.jar" bin_file_path = os.path.join(target_dir, bin_file) if os.path.exists(bin_file_path): LOG.debug("kinesis-mock found at %s", bin_file_path) return bin_file_path response = requests.get(KINESIS_MOCK_RELEASE_URL) if not response.ok: raise ValueError("Could not get list of releases from %s: %s" % (KINESIS_MOCK_RELEASE_URL, response.text)) github_release = response.json() download_url = None for asset in github_release.get("assets", []): # find the correct binary in the release if asset["name"] == bin_file: download_url = asset["browser_download_url"] break if download_url is None: raise ValueError("could not find required binary %s in release %s" % (bin_file, KINESIS_MOCK_RELEASE_URL)) mkdir(target_dir) LOG.info("downloading kinesis-mock binary from %s", download_url) download(download_url, bin_file_path) chmod_r(bin_file_path, 0o777) return bin_file_path
def read_client_metadata() -> ClientMetadata: return ClientMetadata( session_id=get_session_id(), machine_id=get_machine_id(), api_key=read_api_key_safe(), system=get_system(), version=get_version_string(), is_ci=os.getenv("CI") is not None, is_docker=config.is_in_docker, is_testing=config.is_env_true(constants.ENV_INTERNAL_TEST_RUN), )
def install_predefined_cert_if_available(): try: from localstack_ext.bootstrap import install if is_env_true("SKIP_SSL_CERT_DOWNLOAD"): LOG.debug( "Skipping download of local SSL cert, as SKIP_SSL_CERT_DOWNLOAD=1" ) return install.setup_ssl_cert() except Exception: pass
def create_dynamodb_server(port=None) -> DynamodbServer: """ Creates a dynamodb server from the LocalStack configuration. """ port = port or get_free_tcp_port() server = DynamodbServer(port) if config.DATA_DIR: ddb_data_dir = "%s/dynamodb" % config.DATA_DIR mkdir(ddb_data_dir) absolute_path = os.path.abspath(ddb_data_dir) server.db_path = absolute_path server.heap_size = config.DYNAMODB_HEAP_SIZE server.share_db = is_env_true("DYNAMODB_SHARE_DB") server.optimize_db_before_startup = is_env_true( "DYNAMODB_OPTIMIZE_DB_BEFORE_STARTUP") server.delay_transient_statuses = is_env_true( "DYNAMODB_DELAY_TRANSIENT_STATUSES") server.cors = os.getenv("DYNAMODB_CORS", None) return server
def is_tracking_disabled(self): if self.force_tracking: return False # don't track if event tracking is disabled globally if config.DISABLE_EVENTS: return True # don't track for internal test runs (like integration tests) if config.is_env_true(constants.ENV_INTERNAL_TEST_RUN): return True if self.tracking_disabled: return True return False
def create_dynamodb_server(port=None, db_path: Optional[str] = None, clean_db_path: bool = False) -> DynamodbServer: """ Creates a dynamodb server from the LocalStack configuration. """ port = port or get_free_tcp_port() server = DynamodbServer(port) db_path = f"{config.dirs.data}/dynamodb" if not db_path and config.dirs.data else db_path if db_path: if clean_db_path: rm_rf(db_path) mkdir(db_path) absolute_path = os.path.abspath(db_path) server.db_path = absolute_path server.heap_size = config.DYNAMODB_HEAP_SIZE server.share_db = is_env_true("DYNAMODB_SHARE_DB") server.optimize_db_before_startup = is_env_true( "DYNAMODB_OPTIMIZE_DB_BEFORE_STARTUP") server.delay_transient_statuses = is_env_true( "DYNAMODB_DELAY_TRANSIENT_STATUSES") server.cors = os.getenv("DYNAMODB_CORS", None) return server
def save_startup_info(): from localstack_ext.constants import VERSION as LOCALSTACK_EXT_VERSION file_path = os.path.join(DATA_DIR, STARTUP_INFO_FILE) info = StartupInfo( timestamp=datetime.datetime.now().isoformat(), localstack_version=constants.VERSION, localstack_ext_version=LOCALSTACK_EXT_VERSION, pro_activated=is_env_true(constants.ENV_PRO_ACTIVATED), ) LOG.debug("saving startup info %s", info) try: _append_startup_info(file_path, info) except IOError as e: LOG.error("could not save startup info: %s", e) return info
def save_startup_info(): from localstack_ext import __version__ as localstack_ext_version file_path = os.path.join(config.dirs.data, STARTUP_INFO_FILE) info = StartupInfo( timestamp=datetime.datetime.now().isoformat(), localstack_version=constants.VERSION, localstack_ext_version=localstack_ext_version, pro_activated=is_env_true(constants.ENV_PRO_ACTIVATED), ) LOG.debug("saving startup info %s", info) try: _append_startup_info(file_path, info) except IOError as e: LOG.error("could not save startup info: %s", e) chmod_r(file_path, 0o777) return info
def startup_monitor() -> None: """ The startup monitor is a thread that waits for the startup_monitor_event and, once the event is true, starts a localstack instance in it's own thread context. """ logger.info("waiting on localstack_start signal") startup_monitor_event.wait() if localstack_stop.is_set(): # this is called if _trigger_stop() is called before any test has requested the localstack_runtime fixture. logger.info("ending startup_monitor") localstack_stopped.set() return if is_env_true("TEST_SKIP_LOCALSTACK_START") or os.environ.get("TEST_TARGET") == "AWS_CLOUD": logger.info("TEST_SKIP_LOCALSTACK_START is set, not starting localstack") localstack_started.set() return logger.info("running localstack") run_localstack()
def should_run(): return config.is_env_true('TEST_ERROR_INJECTION')