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 <ihrac...@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 --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 c3be40a2f..7921251ea 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -4974,6 +4974,9 @@ loop_done: if (file_system_id) { free(file_system_id); } + if (cli_system_id) { + free(cli_system_id); + } service_stop(); exit(retval); @@ -4999,6 +5002,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} @@ -5050,6 +5054,10 @@ parse_options(int argc, char *argv[]) vif_plug_dummy_enable(); break; + case 'n': + cli_system_id = xstrdup(optarg); + break; + case '?': exit(EXIT_FAILURE); @@ -5085,6 +5093,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 523387eed..6933fe21d 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 cb7bbcb7a..3d2911241 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -34352,3 +34352,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 +]) -- 2.38.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev