diff --git a/sysinv/sysinv/sysinv/sysinv/common/utils.py b/sysinv/sysinv/sysinv/sysinv/common/utils.py index b55a66dd38..980f3b5cd9 100644 --- a/sysinv/sysinv/sysinv/sysinv/common/utils.py +++ b/sysinv/sysinv/sysinv/sysinv/common/utils.py @@ -3726,7 +3726,7 @@ def get_primary_address_by_name(dbapi, db_address_name, networktype, raise_exc=F LOG.info(f"address {db_address_name} not found, returning") if raise_exc: raise exception.AddressNotFoundByName(name=db_address_name) - return address + return None # if there is a single entry, return here if len(address) == 1: @@ -3759,6 +3759,67 @@ def get_primary_address_by_name(dbapi, db_address_name, networktype, raise_exc=F return address +def get_secondary_address_by_name(dbapi, db_address_name, networktype, raise_exc=False): + """Search address by database name to retrieve the relevant address from + the secondary pool, if multipĺe entries for the same name are found, the + query will use the network's pool_uuid to get the address family (IPv4 or + IPv6) related to the secondary. + + :param dbapi: the database api reference + :param db_address_name: the address name in the database + :param networktype: the network type + :param raise_exc: raise AddressNotFoundByName instead of returning None + + :return: the address object if found, None otherwise + """ + address = None + secondary_pool = None + + if not db_address_name or not networktype: + LOG.info(f"no db_address_name={db_address_name} or networktype={networktype} provided") + return address + + try: + networks = dbapi.networks_get_by_type(networktype) + if networks and len(networks) == 1: + primary_pool = None + if networks[0].pool_uuid: + primary_pool = dbapi.address_pool_get(networks[0].pool_uuid) + else: + LOG.info(f"cannot find primary pool for {networks[0].name}:{networks[0].type}") + + net_pools = dbapi.network_addrpool_get_by_network_id(networks[0].id) + if len(net_pools) == 2 and primary_pool: + for net_pool in net_pools: + if net_pool.address_pool_uuid != primary_pool.uuid: + # this is the secondary + secondary_pool = dbapi.address_pool_get(net_pool.address_pool_uuid) + else: + LOG.info(f"network {networks[0].type} have {len(net_pools)} pools") + else: + LOG.info(f"we should only have one network obj for networktype={networktype}") + + if secondary_pool: + address = dbapi.address_get_by_name_and_family(db_address_name, + secondary_pool.family) + + except exception.AddressPoolNotFound: + LOG.info(f"cannot find address pool for name={db_address_name} with" + f" network type={networktype}") + pass + except exception.AddressNotFoundByNameAndFamily: + LOG.info(f"cannot find address for name={db_address_name} with" + f" network type={networktype}") + pass + except Exception as ex: + LOG.info(f"get_secondary_address_by_name general exception: {str(ex)}") + pass + + if not address and raise_exc: + raise exception.AddressNotFoundByName(name=db_address_name) + return address + + def update_config_file(config_filepath: str, values_to_update: list): """Update a config file with the desired information diff --git a/sysinv/sysinv/sysinv/sysinv/puppet/base.py b/sysinv/sysinv/sysinv/sysinv/puppet/base.py index 45a467775e..27ea14913a 100644 --- a/sysinv/sysinv/sysinv/sysinv/puppet/base.py +++ b/sysinv/sysinv/sysinv/sysinv/puppet/base.py @@ -170,7 +170,7 @@ class BasePuppet(object): def _get_address_by_name(self, name, networktype): """ - Retrieve an address entry by name and scoped by network type + Retrieve a primary address entry by name and scoped by network type """ addresses = self.context.setdefault('_address_names', {}) address_name = utils.format_address_name(name, networktype) @@ -183,6 +183,21 @@ class BasePuppet(object): return address + def _get_secondary_address_by_name(self, name, networktype): + """ + Retrieve a secondary address entry by name and scoped by network type + """ + addresses = self.context.setdefault('_sec_address_names', {}) + address_name = utils.format_address_name(name, networktype) + address = addresses.get(address_name) + if address is None: + address = utils.get_secondary_address_by_name(self.dbapi, + address_name, + networktype, True) + addresses[address_name] = address + + return address + def _get_address_by_name_and_family(self, name, family, networktype): """ Retrieve an address entry by name and scoped by network type diff --git a/sysinv/sysinv/sysinv/sysinv/puppet/platform.py b/sysinv/sysinv/sysinv/sysinv/puppet/platform.py index f159c5f469..469f6e880a 100644 --- a/sysinv/sysinv/sysinv/sysinv/puppet/platform.py +++ b/sysinv/sysinv/sysinv/sysinv/puppet/platform.py @@ -321,6 +321,16 @@ class PlatformPuppet(base.BasePuppet): except exception.NotFound: pass + # add the secondary public address if exists + try: + sec_public_address = self._get_secondary_address_by_name( + constants.CONTROLLER, constants.NETWORK_TYPE_OAM) + if sec_public_address: + config.update({'platform::haproxy::params::public_secondary_ip_address': + sec_public_address.address}) + except exception.AddressNotFoundByName: + pass + return config def _get_sdn_config(self):