← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~ack/maas:1914762-3.3 into maas:3.3

 

You have been requested to review the proposed merge of ~ack/maas:1914762-3.3 into maas:3.3.

For more details, see:
https://code.launchpad.net/~ack/maas/+git/maas/+merge/442331



-- 
Your team MAAS Maintainers is requested to review the proposed merge of ~ack/maas:1914762-3.3 into maas:3.3.
diff --git a/src/metadataserver/tests/test_vendor_data.py b/src/metadataserver/tests/test_vendor_data.py
index 561320d..d7e5668 100644
--- a/src/metadataserver/tests/test_vendor_data.py
+++ b/src/metadataserver/tests/test_vendor_data.py
@@ -9,7 +9,7 @@ import tempita
 from testtools.matchers import ContainsDict, Equals, KeysEqual, MatchesDict
 import yaml
 
-from maasserver.enum import NODE_STATUS
+from maasserver.enum import BRIDGE_TYPE, INTERFACE_TYPE, NODE_STATUS
 from maasserver.models import Config, ControllerInfo
 from maasserver.node_status import COMMISSIONING_LIKE_STATUSES
 from maasserver.secrets import SecretManager
@@ -30,6 +30,7 @@ from metadataserver.vendor_data import (
     generate_hardware_sync_systemd_configuration,
     generate_kvm_pod_configuration,
     generate_ntp_configuration,
+    generate_openvswitch_configuration,
     generate_rack_controller_configuration,
     generate_snap_configuration,
     generate_system_info,
@@ -318,6 +319,37 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
         )
 
 
+class TestGenerateOpenVSwitchConfiguration(MAASServerTestCase):
+    def test_yields_empty_without_ovs(self):
+        node = factory.make_Node(status=NODE_STATUS.TESTING)
+        iface = factory.make_Interface(node=node)
+        # regular bridge
+        factory.make_Interface(
+            node=node,
+            iftype=INTERFACE_TYPE.BRIDGE,
+            parents=[iface],
+            params={"bridge_type": BRIDGE_TYPE.STANDARD},
+        )
+        self.assertCountEqual(
+            generate_openvswitch_configuration(node),
+            [],
+        )
+
+    def test_yields_openvswitch_configuration_when_ovs_bridge(self):
+        node = factory.make_Node(status=NODE_STATUS.TESTING)
+        iface = factory.make_Interface(node=node)
+        factory.make_Interface(
+            node=node,
+            iftype=INTERFACE_TYPE.BRIDGE,
+            parents=[iface],
+            params={"bridge_type": BRIDGE_TYPE.OVS},
+        )
+        self.assertCountEqual(
+            generate_openvswitch_configuration(node),
+            [("packages", ["openvswitch-switch"])],
+        )
+
+
 class TestGenerateKVMPodConfiguration(MAASServerTestCase):
     def test_yields_configuration_when_machine_install_kvm_true(self):
         password = "123secure"
diff --git a/src/metadataserver/vendor_data.py b/src/metadataserver/vendor_data.py
index 06cf64b..4b599a0 100644
--- a/src/metadataserver/vendor_data.py
+++ b/src/metadataserver/vendor_data.py
@@ -17,6 +17,7 @@ import tempita
 import yaml
 
 from maasserver import ntp
+from maasserver.enum import BRIDGE_TYPE, INTERFACE_TYPE
 from maasserver.models import Config, NodeMetadata
 from maasserver.models.controllerinfo import get_target_version
 from maasserver.node_status import COMMISSIONING_LIKE_STATUSES
@@ -48,6 +49,7 @@ def get_vendor_data(node, proxy):
         generate_kvm_pod_configuration(node),
         generate_ephemeral_netplan_lock_removal(node),
         generate_ephemeral_deployment_network_configuration(node),
+        generate_openvswitch_configuration(node),
         generate_vcenter_configuration(node),
         generate_hardware_sync_systemd_configuration(node),
     )
@@ -55,7 +57,8 @@ def get_vendor_data(node, proxy):
     for key, value in chain(*generators):
         # some keys can be returned by different generators. In that case,
         # collect entries from each generator.
-        if key in ("runcmd", "write_files"):
+        # XXX we should use the cloud-init API to merge configurations
+        if key in ("runcmd", "write_files", "packages"):
             vendor_data.setdefault(key, []).extend(value)
         else:
             assert (
@@ -194,6 +197,21 @@ def generate_ephemeral_deployment_network_configuration(node):
     ]
 
 
+def generate_openvswitch_configuration(node):
+    """Install OpenVSwitch package if needed."""
+    if node.status not in COMMISSIONING_LIKE_STATUSES:
+        return
+
+    has_ovs = any(
+        params.get("bridge_type") == BRIDGE_TYPE.OVS
+        for params in node.current_config.interface_set.filter(
+            type=INTERFACE_TYPE.BRIDGE
+        ).values_list("params", flat=True)
+    )
+    if has_ovs:
+        yield "packages", ["openvswitch-switch"]
+
+
 def generate_kvm_pod_configuration(node):
     """Generate cloud-init configuration to install the node as a KVM pod."""
     if node.netboot or not (node.install_kvm or node.register_vmhost):

References