Providers/nxOMSAutomationWorker/automationworker/worker/configuration2.py (154 lines of code) (raw):

#!/usr/bin/env python2 # # Copyright (C) Microsoft Corporation, All rights reserved. import ConfigParser import os import sys import serializerfactory json = serializerfactory.get_serializer(sys.version_info) CONFIG_ENV_KEY = "WORKERCONF" WORKER_REQUIRED_CONFIG_SECTION = "worker-required" WORKER_OPTIONAL_CONFIG_SECTION = "worker-optional" METADATA_CONFIG_SECTION = "metadata" # manually set configuration values SOURCE_DIRECTORY_PATH = "source_directory_path" COMPONENT = "component" # required configuration keys CERT_PATH = "jrds_cert_path" KEY_PATH = "jrds_key_path" BASE_URI = "jrds_base_uri" ACCOUNT_ID = "account_id" MACHINE_ID = "machine_id" HYBRID_WORKER_GROUP_NAME = "hybrid_worker_group_name" WORKER_VERSION = "worker_version" WORKING_DIRECTORY_PATH = "working_directory_path" # optional configuration keys DEBUG_TRACES = "debug_traces" BYPASS_CERTIFICATE_VERIFICATION = "bypass_certificate_verification" ENFORCE_RUNBOOK_SIGNATURE_VALIDATION = "enforce_runbook_signature_validation" GPG_PUBLIC_KEYRING_PATH = "gpg_public_keyring_path" STATE_DIRECTORY_PATH = "state_directory_path" JRDS_POLLING_FREQUENCY = "jrds_polling_frequency" PROXY_CONFIGURATION_PATH = "proxy_configuration_path" # optional metadata configuration keys VM_ID = "vm_id" IS_AZURE_VM = "is_azure_vm" WORKER_TYPE = "worker_type" # optional configuration default values DEFAULT_EMPTY = "" DEFAULT_DEBUG_TRACES = "false" DEFAUTL_BYPASS_CERTIFICATE_VERIFICATION = "false" DEFAULT_ENFORCE_RUNBOOK_SIGNATURE_VALIDATION = "true" DEFAULT_GPG_PUBLIC_KEYRING_PATH = DEFAULT_EMPTY DEFAULT_STATE_DIRECTORY_PATH = DEFAULT_EMPTY DEFAULT_PROXY_CONFIGURATION_PATH = DEFAULT_EMPTY DEFAULT_UNKNOWN = "Unknown" DEFAULT_VM_ID = DEFAULT_UNKNOWN DEFAULT_WORKER_TYPE = DEFAULT_UNKNOWN DEFAULT_COMPONENT = DEFAULT_UNKNOWN DEFAULT_WORKER_VERSION = "1.7.8.0" DEFAULT_JRDS_POLLING_FREQUENCY = "15" # state configuration keys STATE_PID = "pid" STATE_RESOURCE_VERSION = "resource_version" STATE_WORKSPACE_ID = "workspace_id" STATE_WORKER_VERSION = "worker_version" # other configuration keys (optional and most likely not used by the worker) AGENT_ID = "agent_id" WORKSPACE_ID = "workspace_id" REGISTRATION_ENDPOINT = "registration_endpoint" CERTIFICATE_THUMBPRINT = "jrds_cert_thumbprint" worker_configuration_file_path = DEFAULT_EMPTY def read_and_set_configuration(configuration_file_path): """Reads the worker configuration from the file at config_path and sets the read configuration to the env variable. The configuration is read of the path, put into a dictionary which will be serialized and set in the env variable. Notes: The WORKER_VERSION has to be set manually for now. The COMPONENT has to be set manually at the entry point of each component (worker/sandbox). Args: configuration_file_path: string, the configuration file path. """ global worker_configuration_file_path worker_configuration_file_path = configuration_file_path clear_config() # init and set default values for optional configuration keys config = ConfigParser.SafeConfigParser({DEBUG_TRACES: DEFAULT_DEBUG_TRACES, BYPASS_CERTIFICATE_VERIFICATION: DEFAUTL_BYPASS_CERTIFICATE_VERIFICATION, ENFORCE_RUNBOOK_SIGNATURE_VALIDATION: DEFAULT_ENFORCE_RUNBOOK_SIGNATURE_VALIDATION, GPG_PUBLIC_KEYRING_PATH: DEFAULT_GPG_PUBLIC_KEYRING_PATH, STATE_DIRECTORY_PATH: DEFAULT_STATE_DIRECTORY_PATH, JRDS_POLLING_FREQUENCY: DEFAULT_JRDS_POLLING_FREQUENCY, PROXY_CONFIGURATION_PATH: DEFAULT_PROXY_CONFIGURATION_PATH, WORKER_TYPE: DEFAULT_WORKER_TYPE, VM_ID: DEFAULT_VM_ID, IS_AZURE_VM: "False"}) # load the worker configuration file config.read(configuration_file_path) # create the configuration dictionary # read required configuration values configuration = {CERT_PATH: os.path.abspath(config.get(WORKER_REQUIRED_CONFIG_SECTION, CERT_PATH)), KEY_PATH: os.path.abspath(config.get(WORKER_REQUIRED_CONFIG_SECTION, KEY_PATH)), BASE_URI: config.get(WORKER_REQUIRED_CONFIG_SECTION, BASE_URI), ACCOUNT_ID: config.get(WORKER_REQUIRED_CONFIG_SECTION, ACCOUNT_ID), MACHINE_ID: config.get(WORKER_REQUIRED_CONFIG_SECTION, MACHINE_ID), HYBRID_WORKER_GROUP_NAME: config.get(WORKER_REQUIRED_CONFIG_SECTION, HYBRID_WORKER_GROUP_NAME), WORKING_DIRECTORY_PATH: os.path.abspath( config.get(WORKER_REQUIRED_CONFIG_SECTION, WORKING_DIRECTORY_PATH)), SOURCE_DIRECTORY_PATH: os.path.dirname(os.path.realpath(__file__)), WORKER_VERSION: DEFAULT_WORKER_VERSION, COMPONENT: DEFAULT_COMPONENT} # read optional configuration section configuration.update({DEBUG_TRACES: config.getboolean(WORKER_OPTIONAL_CONFIG_SECTION, DEBUG_TRACES), BYPASS_CERTIFICATE_VERIFICATION: config.getboolean(WORKER_OPTIONAL_CONFIG_SECTION, BYPASS_CERTIFICATE_VERIFICATION), ENFORCE_RUNBOOK_SIGNATURE_VALIDATION: config.getboolean(WORKER_OPTIONAL_CONFIG_SECTION, ENFORCE_RUNBOOK_SIGNATURE_VALIDATION), GPG_PUBLIC_KEYRING_PATH: config.get(WORKER_OPTIONAL_CONFIG_SECTION, GPG_PUBLIC_KEYRING_PATH), STATE_DIRECTORY_PATH: config.get(WORKER_OPTIONAL_CONFIG_SECTION, STATE_DIRECTORY_PATH), JRDS_POLLING_FREQUENCY: config.getint(WORKER_OPTIONAL_CONFIG_SECTION, JRDS_POLLING_FREQUENCY), PROXY_CONFIGURATION_PATH: config.get(WORKER_OPTIONAL_CONFIG_SECTION, PROXY_CONFIGURATION_PATH), WORKER_TYPE: config.get(METADATA_CONFIG_SECTION, WORKER_TYPE), VM_ID: config.get(METADATA_CONFIG_SECTION, VM_ID), IS_AZURE_VM: config.getboolean(METADATA_CONFIG_SECTION, IS_AZURE_VM)}) # set the worker conf to env var set_config(configuration) def set_config(configuration): """Sets the worker configuration to the env variable. This method will merge the provided dictionary to any existent value in the environment variable. Args: configuration: dictionary(string), the configuration key value pairs. """ try: env_config = os.environ[CONFIG_ENV_KEY] config = json.loads(env_config) config.update(configuration) configuration = config except KeyError: pass os.environ[CONFIG_ENV_KEY] = json.dumps(configuration) def clear_config(): try: del os.environ[CONFIG_ENV_KEY] except Exception: pass def get_value(key): """Gets a specific value from the configuration value in the environment variable. This method will merge the provided dictionary to any existent value in the environment variable. Args: key: string, the configuration key value. Returns: The configuration value. """ try: return json.loads(os.environ[CONFIG_ENV_KEY])[key] except KeyError: raise KeyError("Configuration environment variable not found. [key=" + key + "].") def get_jrds_get_sandbox_actions_polling_freq(): return get_value(JRDS_POLLING_FREQUENCY) def get_jrds_get_job_actions_polling_freq(): return get_value(JRDS_POLLING_FREQUENCY) def get_component(): return get_value(COMPONENT) def get_jrds_cert_path(): return get_value(CERT_PATH) def get_jrds_key_path(): return get_value(KEY_PATH) def get_jrds_base_uri(): return get_value(BASE_URI) def get_account_id(): return get_value(ACCOUNT_ID) def get_machine_id(): return get_value(MACHINE_ID) def get_hybrid_worker_name(): return get_value(HYBRID_WORKER_GROUP_NAME) def get_worker_version(): return get_value(WORKER_VERSION) def get_worker_configuration_file_path(): return worker_configuration_file_path def get_working_directory_path(): return get_value(WORKING_DIRECTORY_PATH) def get_debug_traces(): return get_value(DEBUG_TRACES) def get_verify_certificates(): return get_value(BYPASS_CERTIFICATE_VERIFICATION) def get_source_directory_path(): return get_value(SOURCE_DIRECTORY_PATH) def get_enforce_runbook_signature_validation(): return get_value(ENFORCE_RUNBOOK_SIGNATURE_VALIDATION) def get_gpg_public_keyrings_path(): """Return a list of string representing keyring path.""" keyring_list = str(get_value(GPG_PUBLIC_KEYRING_PATH)).split(",") sanitized_list = map(str.strip, keyring_list) return sanitized_list def get_state_directory_path(): return get_value(STATE_DIRECTORY_PATH) def get_temporary_request_directory_path(): return os.path.join(get_working_directory_path(), "req_tmp") def get_proxy_configuration_path(): return get_value(PROXY_CONFIGURATION_PATH) def get_worker_type(): return get_value(WORKER_TYPE)