← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~ack/maas:1914762-install-ovs-testing into maas:master

 

Alberto Donato has proposed merging ~ack/maas:1914762-install-ovs-testing into maas:master.

Commit message:
LP:1914762 install openvswitch package for network testing



Requested reviews:
  MAAS Lander (maas-lander)
  Björn Tillenius (bjornt)
Related bugs:
  Bug #1914762 in MAAS: "test network configuration broken with openvswitch bridge"
  https://bugs.launchpad.net/maas/+bug/1914762

For more details, see:
https://code.launchpad.net/~ack/maas/+git/maas/+merge/442028
-- 
Your team MAAS Committers is subscribed to branch maas:master.
diff --git a/src/metadataserver/tests/test_vendor_data.py b/src/metadataserver/tests/test_vendor_data.py
index 85b0c90..b15c56a 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, NodeKey
 from maasserver.node_status import COMMISSIONING_LIKE_STATUSES
 from maasserver.secrets import SecretManager
@@ -29,6 +29,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,
@@ -317,6 +318,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 6fb9b7e..807428c 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, NodeKey, NodeMetadata
 from maasserver.models.controllerinfo import get_target_version
 from maasserver.node_status import COMMISSIONING_LIKE_STATUSES
@@ -47,6 +48,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),
     )
@@ -54,7 +56,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 (
@@ -193,6 +196,19 @@ 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 = node.current_config.interface_set.filter(
+        type=INTERFACE_TYPE.BRIDGE,
+        params__bridge_type=BRIDGE_TYPE.OVS,
+    ).exists()
+    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):

Follow ups