#!/usr/bin/env python import os import logging import sys from sqlalchemy import create_engine from sqlalchemy import text try: import ConfigParser PARSER_OPTS = {} except ImportError: import configparser as ConfigParser PARSER_OPTS = {"strict": False} # Create logger, console handler and formatter logger = logging.getLogger('OpenStack-Helm Keystone Endpoint management') logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') # Set the formatter and add the handler ch.setFormatter(formatter) logger.addHandler(ch) # Get the connection string for the service db if "OPENSTACK_CONFIG_FILE" in os.environ: os_conf = os.environ['OPENSTACK_CONFIG_FILE'] if "OPENSTACK_CONFIG_DB_SECTION" in os.environ: os_conf_section = os.environ['OPENSTACK_CONFIG_DB_SECTION'] else: logger.critical( 'environment variable OPENSTACK_CONFIG_DB_SECTION not set') sys.exit(1) if "OPENSTACK_CONFIG_DB_KEY" in os.environ: os_conf_key = os.environ['OPENSTACK_CONFIG_DB_KEY'] else: logger.critical('environment variable OPENSTACK_CONFIG_DB_KEY not set') sys.exit(1) try: config = ConfigParser.RawConfigParser(**PARSER_OPTS) logger.info("Using {0} as db config source".format(os_conf)) config.read(os_conf) logger.info("Trying to load db config from {0}:{1}".format( os_conf_section, os_conf_key)) user_db_conn = config.get(os_conf_section, os_conf_key) logger.info("Got config from {0}".format(os_conf)) except: logger.critical( "Tried to load config from {0} but failed.".format(os_conf)) raise elif "DB_CONNECTION" in os.environ: user_db_conn = os.environ['DB_CONNECTION'] logger.info('Got config from DB_CONNECTION env var') else: logger.critical( 'Could not get db config, either from config file or env var') sys.exit(1) # User DB engine try: user_engine = create_engine(user_db_conn) except: logger.critical('Could not get user database config') raise # Set Internal Endpoint try: endpoint_url = os.environ['OS_BOOTSTRAP_INTERNAL_URL'] region_id = os.environ['OS_REGION_NAME'] cmd = text("update endpoint set url = :endpoint_url where interface ='internal' and " "service_id = (select id from service where " "service.type = 'identity') and " "region_id = :region_id") with user_engine.connect() as connection: connection.execute(cmd, {"endpoint_url": endpoint_url, "region_id": region_id}) try: connection.commit() except AttributeError: pass except: logger.critical("Could not update internal endpoint") raise # Set Admin Endpoint try: endpoint_url = os.environ['OS_BOOTSTRAP_ADMIN_URL'] region_id = os.environ['OS_REGION_NAME'] cmd = text("update endpoint set url = :endpoint_url where interface ='admin' " "and service_id = (select id from service where " "service.type = 'identity') " "and region_id = :region_id") with user_engine.connect() as connection: connection.execute(cmd, {"endpoint_url": endpoint_url, "region_id": region_id}) try: connection.commit() except AttributeError: pass except: logger.critical("Could not update admin endpoint") raise # Set Public Endpoint try: endpoint_url = os.environ['OS_BOOTSTRAP_PUBLIC_URL'] region_id = os.environ['OS_REGION_NAME'] cmd = text("update endpoint set url = :endpoint_url where interface ='public' " "and service_id = (select id from service where " "service.type = 'identity') " "and region_id = :region_id") with user_engine.connect() as connection: connection.execute(cmd, {"endpoint_url": endpoint_url, "region_id": region_id}) try: connection.commit() except AttributeError: pass except: logger.critical("Could not update public endpoint") raise # Print endpoints try: with user_engine.connect() as connection: endpoints = connection.execute( text("select interface, url from endpoint where service_id = " "(select id from service where service.type = 'identity')") ).fetchall() for row in endpoints: logger.info("endpoint ({0}): {1}".format(row[0], row[1])) except: logger.critical("Could not update endpoint") raise logger.info('Finished Endpoint Management')