diff --git a/charms/openstack-hypervisor/config.yaml b/charms/openstack-hypervisor/config.yaml index 73499ef5..e54b5581 100644 --- a/charms/openstack-hypervisor/config.yaml +++ b/charms/openstack-hypervisor/config.yaml @@ -25,3 +25,6 @@ options: use-migration-binding: default: False type: boolean + use-data-binding: + default: False + type: boolean diff --git a/charms/openstack-hypervisor/metadata.yaml b/charms/openstack-hypervisor/metadata.yaml index d49dd20d..a7c27098 100644 --- a/charms/openstack-hypervisor/metadata.yaml +++ b/charms/openstack-hypervisor/metadata.yaml @@ -39,6 +39,7 @@ provides: extra-bindings: migration: + data: # this binding will be used to support project networking between hypervisors # This charm has no peer relation by design. This charm needs to scale to # hundreds of units and this is limited by the peer relation. diff --git a/charms/openstack-hypervisor/src/charm.py b/charms/openstack-hypervisor/src/charm.py index faf9d1d8..c2a385b2 100755 --- a/charms/openstack-hypervisor/src/charm.py +++ b/charms/openstack-hypervisor/src/charm.py @@ -68,6 +68,7 @@ from utils import ( logger = logging.getLogger(__name__) MIGRATION_BINDING = "migration" +DATA_BINDING = "data" MTLS_USAGES = {x509.OID_SERVER_AUTH, x509.OID_CLIENT_AUTH} @@ -213,6 +214,20 @@ class HypervisorOperatorCharm(sunbeam_charm.OSBaseOperatorCharm): return None return str(address) + @property + def data_address(self) -> Optional[str]: + """Get address from data binding.""" + use_binding = self.model.config.get("use-data-binding") + if not use_binding: + return None + binding = self.model.get_binding(DATA_BINDING) + if binding is None: + return None + address = binding.network.bind_address + if address is None: + return None + return str(address) + def check_relation_exists(self, relation_name: str) -> bool: """Check if a relation exists or not.""" if self.model.get_relation(relation_name): @@ -418,7 +433,9 @@ class HypervisorOperatorCharm(sunbeam_charm.OSBaseOperatorCharm): "external-bridge-address" ) or "10.20.20.1/24", - "network.ip-address": config("ip-address") or local_ip, + "network.ip-address": self.data_address + or config("ip-address") + or local_ip, "network.ovn-key": base64.b64encode( contexts.certificates.key.encode() ).decode(),