def check_cse_installation(config, msg_update_callback=None): """Ensure that CSE is installed on vCD according to the config file. Checks, 1. AMQP exchange exists 2. CSE is registered with vCD, 3. CSE K8 catalog exists :param dict config: config yaml file as a dictionary :param utils.ConsoleMessagePrinter msg_update_callback: Callback object that writes messages onto console. :raises Exception: if CSE is not registered to vCD as an extension, or if specified catalog does not exist, or if specified template(s) do not exist. """ if msg_update_callback: msg_update_callback.info( "Validating CSE installation according to config file") err_msgs = [] client = None try: log_filename = None log_wire = str_to_bool(config['service'].get('log_wire')) if log_wire: log_filename = SERVER_DEBUG_WIRELOG_FILEPATH client = Client(config['vcd']['host'], api_version=config['vcd']['api_version'], verify_ssl_certs=config['vcd']['verify'], log_file=log_filename, log_requests=log_wire, log_headers=log_wire, log_bodies=log_wire) credentials = BasicLoginCredentials(config['vcd']['username'], SYSTEM_ORG_NAME, config['vcd']['password']) client.set_credentials(credentials) # check that AMQP exchange exists amqp = config['amqp'] credentials = pika.PlainCredentials(amqp['username'], amqp['password']) parameters = pika.ConnectionParameters(amqp['host'], amqp['port'], amqp['vhost'], credentials, ssl=amqp['ssl'], connection_attempts=3, retry_delay=2, socket_timeout=5) connection = None try: connection = pika.BlockingConnection(parameters) channel = connection.channel() try: channel.exchange_declare(exchange=amqp['exchange'], exchange_type=EXCHANGE_TYPE, durable=True, passive=True, auto_delete=False) if msg_update_callback: msg_update_callback.general( f"AMQP exchange '{amqp['exchange']}' exists") except pika.exceptions.ChannelClosed: msg = f"AMQP exchange '{amqp['exchange']}' does not exist" if msg_update_callback: msg_update_callback.error(msg) err_msgs.append(msg) except Exception: # TODO() replace raw exception with specific msg = f"Could not connect to AMQP exchange '{amqp['exchange']}'" if msg_update_callback: msg_update_callback.error(msg) err_msgs.append(msg) finally: if connection is not None: connection.close() # check that CSE is registered to vCD correctly ext = APIExtension(client) try: cse_info = ext.get_extension(CSE_SERVICE_NAME, namespace=CSE_SERVICE_NAMESPACE) rkey_matches = cse_info['routingKey'] == amqp['routing_key'] exchange_matches = cse_info['exchange'] == amqp['exchange'] if not rkey_matches or not exchange_matches: msg = "CSE is registered as an extension, but the extension " \ "settings on vCD are not the same as config settings." if not rkey_matches: msg += f"\nvCD-CSE routing key: {cse_info['routingKey']}" \ f"\nCSE config routing key: {amqp['routing_key']}" if not exchange_matches: msg += f"\nvCD-CSE exchange: {cse_info['exchange']}" \ f"\nCSE config exchange: {amqp['exchange']}" if msg_update_callback: msg_update_callback.info(msg) err_msgs.append(msg) if cse_info['enabled'] == 'true': if msg_update_callback: msg_update_callback.general( "CSE on vCD is currently enabled") else: if msg_update_callback: msg_update_callback.info( "CSE on vCD is currently disabled") except MissingRecordException: msg = "CSE is not registered to vCD" if msg_update_callback: msg_update_callback.error(msg) err_msgs.append(msg) # check that catalog exists in vCD org_name = config['broker']['org'] org = get_org(client, org_name=org_name) catalog_name = config['broker']['catalog'] if catalog_exists(org, catalog_name): if msg_update_callback: msg_update_callback.general(f"Found catalog '{catalog_name}'") else: msg = f"Catalog '{catalog_name}' not found" if msg_update_callback: msg_update_callback.error(msg) err_msgs.append(msg) finally: if client: client.logout() if err_msgs: raise Exception(err_msgs) if msg_update_callback: msg_update_callback.general("CSE installation is valid")
def check_cse_installation(config, check_template='*'): """Ensures that CSE is installed on vCD according to the config file. Checks if CSE is registered to vCD, if catalog exists, and if templates exist. :param dict config: config yaml file as a dictionary :param str check_template: which template to check for. Default value of '*' means to check all templates specified in @config :raises EntityNotFoundException: if CSE is not registered to vCD as an extension, or if specified catalog does not exist, or if specified template(s) do not exist. """ click.secho(f"Validating CSE installation according to config file", fg='yellow') err_msgs = [] client = None try: client = Client(config['vcd']['host'], api_version=config['vcd']['api_version'], verify_ssl_certs=config['vcd']['verify']) credentials = BasicLoginCredentials(config['vcd']['username'], SYSTEM_ORG_NAME, config['vcd']['password']) client.set_credentials(credentials) # check that AMQP exchange exists amqp = config['amqp'] credentials = pika.PlainCredentials(amqp['username'], amqp['password']) parameters = pika.ConnectionParameters(amqp['host'], amqp['port'], amqp['vhost'], credentials, ssl=amqp['ssl'], connection_attempts=3, retry_delay=2, socket_timeout=5) connection = None try: connection = pika.BlockingConnection(parameters) channel = connection.channel() try: channel.exchange_declare(exchange=amqp['exchange'], exchange_type=EXCHANGE_TYPE, durable=True, passive=True, auto_delete=False) click.secho(f"AMQP exchange '{amqp['exchange']}' exists", fg='green') except pika.exceptions.ChannelClosed: msg = f"AMQP exchange '{amqp['exchange']}' does not exist" click.secho(msg, fg='red') err_msgs.append(msg) except Exception: # TODO replace raw exception with specific msg = f"Could not connect to AMQP exchange '{amqp['exchange']}'" click.secho(msg, fg='red') err_msgs.append(msg) finally: if connection is not None: connection.close() # check that CSE is registered to vCD ext = APIExtension(client) try: cse_info = ext.get_extension(CSE_NAME, namespace=CSE_NAMESPACE) if cse_info['enabled'] == 'true': click.secho( "CSE is registered to vCD and is currently " "enabled", fg='green') else: click.secho( "CSE is registered to vCD and is currently " "disabled", fg='yellow') except MissingRecordException: msg = "CSE is not registered to vCD" click.secho(msg, fg='red') err_msgs.append(msg) # check that catalog exists in vCD org = Org(client, resource=client.get_org()) catalog_name = config['broker']['catalog'] if catalog_exists(org, catalog_name): click.secho(f"Found catalog '{catalog_name}'", fg='green') # check that templates exist in vCD for template in config['broker']['templates']: if check_template != '*' and \ check_template != template['name']: continue catalog_item_name = template['catalog_item'] if catalog_item_exists(org, catalog_name, catalog_item_name): click.secho( f"Found template '{catalog_item_name}' in " f"catalog '{catalog_name}'", fg='green') else: msg = f"Template '{catalog_item_name}' not found in " \ f"catalog '{catalog_name}'" click.secho(msg, fg='red') err_msgs.append(msg) else: msg = f"Catalog '{catalog_name}' not found" click.secho(msg, fg='red') err_msgs.append(msg) finally: if client is not None: client.logout() if err_msgs: raise EntityNotFoundException(err_msgs) click.secho(f"CSE installation is valid", fg='green')