diff mbox series

[ovs-dev,v8,4/7] Support passing chassis name via CLI

Message ID 20221201022641.1953882-5-ihrachys@redhat.com
State Superseded, archived
Headers show
Series Support 2+ controllers on the same vswitchd | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes success github build: passed

Commit Message

Ihar Hrachyshka Dec. 1, 2022, 2:26 a.m. UTC
This patch adds support for the desired system-id (chassis name) to be
passed via CLI:

$ ovn-controller -n <chassis-name>

If passed, CLI overrides any settings stored in ovsdb or in
system-id-override file.

This may be useful when running multiple controller instances using the
same vswitchd instance.

Signed-off-by: Ihar Hrachyshka <ihrachys@redhat.com>
---
 controller/chassis.c            |  5 +++++
 controller/chassis.h            |  1 +
 controller/ovn-controller.8.xml |  6 +++--
 controller/ovn-controller.c     |  9 ++++++++
 tests/ovn-macros.at             |  4 ++--
 tests/ovn.at                    | 39 +++++++++++++++++++++++++++++++++
 6 files changed, 60 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/controller/chassis.c b/controller/chassis.c
index 8566f5e40..77e892bee 100644
--- a/controller/chassis.c
+++ b/controller/chassis.c
@@ -37,6 +37,7 @@  VLOG_DEFINE_THIS_MODULE(chassis);
 #define HOST_NAME_MAX 255
 #endif /* HOST_NAME_MAX */
 
+char *cli_system_id = NULL;
 char *file_system_id = NULL;
 
 /*
@@ -829,6 +830,10 @@  chassis_get_mac(const struct sbrec_chassis *chassis_rec,
 const char *
 get_ovs_chassis_id(const struct ovsrec_open_vswitch_table *ovs_table)
 {
+    if (cli_system_id) {
+        return cli_system_id;
+    }
+
     if (file_system_id) {
         return file_system_id;
     }
diff --git a/controller/chassis.h b/controller/chassis.h
index ea085ed47..03cc2f906 100644
--- a/controller/chassis.h
+++ b/controller/chassis.h
@@ -33,6 +33,7 @@  struct sset;
 struct eth_addr;
 struct smap;
 
+extern char *cli_system_id;
 extern char *file_system_id;
 
 void chassis_register_ovs_idl(struct ovsdb_idl *);
diff --git a/controller/ovn-controller.8.xml b/controller/ovn-controller.8.xml
index 1783209c1..73a3bbf9b 100644
--- a/controller/ovn-controller.8.xml
+++ b/controller/ovn-controller.8.xml
@@ -75,8 +75,10 @@ 
       stale <code>Chassis</code> and <code>Chassis_Private</code> records
       after changing the <code>system-id</code>. Note that the chassis name can
       also be provided via the <code>system-id-override</code> file in the
-      local OVN "etc" directory. The file configuration overrides the one from
-      the database, if both are present.</dd>
+      local OVN "etc" directory or via the <code>-n</code> command-line option.
+      The following precedence is used: first, the command-line option is read;
+      if not present, the <code>system-id-override</code> file is read; if not
+      present, then the name configured in the database is used.</dd>
 
       <dt><code>external_ids:hostname</code></dt>
       <dd>The hostname to use in the Chassis table.</dd>
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index d648f221b..6842bca8f 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -4627,6 +4627,9 @@  loop_done:
     if (file_system_id) {
         free(file_system_id);
     }
+    if (cli_system_id) {
+        free(cli_system_id);
+    }
     service_stop();
 
     exit(retval);
@@ -4652,6 +4655,7 @@  parse_options(int argc, char *argv[])
         STREAM_SSL_LONG_OPTIONS,
         {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT},
         {"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
+        {"chassis", required_argument, NULL, 'n'},
         {"enable-dummy-vif-plug", no_argument, NULL,
          OPT_ENABLE_DUMMY_VIF_PLUG},
         {NULL, 0, NULL, 0}
@@ -4703,6 +4707,10 @@  parse_options(int argc, char *argv[])
             vif_plug_dummy_enable();
             break;
 
+        case 'n':
+            cli_system_id = xstrdup(optarg);
+            break;
+
         case '?':
             exit(EXIT_FAILURE);
 
@@ -4738,6 +4746,7 @@  usage(void)
     daemon_usage();
     vlog_usage();
     printf("\nOther options:\n"
+           "  -n                      custom chassis name\n"
            "  -h, --help              display this help message\n"
            "  -V, --version           display version information\n");
     exit(EXIT_SUCCESS);
diff --git a/tests/ovn-macros.at b/tests/ovn-macros.at
index 8266ae526..ef7191c6a 100644
--- a/tests/ovn-macros.at
+++ b/tests/ovn-macros.at
@@ -290,7 +290,7 @@  net_attach () {
 
 # ovn_az_attach AZ NETWORK BRIDGE IP [MASKLEN] [ENCAP]
 ovn_az_attach() {
-    local az=$1 net=$2 bridge=$3 ip=$4 masklen=${5-24} encap=${6-geneve,vxlan} systemid=${7-$sandbox}
+    local az=$1 net=$2 bridge=$3 ip=$4 masklen=${5-24} encap=${6-geneve,vxlan} systemid=${7-$sandbox} cli_args=${@:8}
     net_attach $net $bridge || return 1
 
     mac=`ovs-vsctl get Interface $bridge mac_in_use | sed s/\"//g`
@@ -331,7 +331,7 @@  ovn_az_attach() {
         ovs-vsctl set open . external_ids:ovn-monitor-all=true
     fi
 
-    start_daemon ovn-controller --enable-dummy-vif-plug || return 1
+    start_daemon ovn-controller --enable-dummy-vif-plug ${cli_args} || return 1
 }
 
 # ovn_attach NETWORK BRIDGE IP [MASKLEN] [ENCAP]
diff --git a/tests/ovn.at b/tests/ovn.at
index af7bba137..6929e5d11 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -33527,3 +33527,42 @@  check_column "" Encap ip chassis_name=hv1 type=vxlan
 OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 ])
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([chassis name override via CLI])
+ovn_start
+net_add n1
+
+sim_add hv1
+as hv1
+ovs-vsctl add-br br-phys
+
+ovs-vsctl \
+    -- set Open_vSwitch . external-ids:ovn-encap-type-hv3=geneve \
+    -- set Open_vSwitch . external-ids:ovn-encap-ip-hv3=192.168.1.1
+
+as hv1 ovs-vsctl set-ssl \
+   $PKIDIR/testpki-hv3-privkey.pem \
+   $PKIDIR/testpki-hv3-cert.pem \
+   $PKIDIR/testpki-cacert.pem
+
+# also validate that even with the override file present, CLI takes precedence
+echo hv3 > ${OVN_SYSCONFDIR}/test_hv
+
+# the last argument is passed to ovn-controller through cli
+ovn_attach n1 br-phys 192.168.0.1 24 vxlan hv1 -n hv3
+
+sim_add hv2
+as hv2
+ovs-vsctl add-br br-phys
+ovn_attach n1 br-phys 192.168.0.2 24 geneve
+
+# despite that we configured ovn-encap-ip=192.168.0.1, this setting is
+# overridden by chassis specific ovn-encap-ip-hv3
+wait_column 192.168.1.1 Encap ip chassis_name=hv3 type=geneve
+
+check_column "" Encap ip chassis_name=hv1 type=vxlan
+
+OVN_CLEANUP([hv1],[hv2])
+AT_CLEANUP
+])