On Tue, Sep 20, 2022 at 2:05 AM Ihar Hrachyshka <ihrac...@redhat.com> wrote:
> Before the patch, system-id could be configured via a global config > option in ovsdb. This patch adds another option - configure system-id > via a file. This is achieved by writing the desired system-id into the > following file location: ${OVN_SYSCONFDIR}/system-id-override. > > The file is read on controller startup. The file setting overrides > configuration stored in ovsdb, if any. > > This may be useful when running multiple containerized controller > instances using the same vswitchd. > > Signed-off-by: Ihar Hrachyshka <ihrac...@redhat.com> > --- > controller/chassis.c | 6 ++++++ > controller/chassis.h | 2 ++ > controller/ovn-controller.c | 34 ++++++++++++++++++++++++++++++ > tests/ovn.at | 42 +++++++++++++++++++++++++++++++++++++ > tests/ovs-macros.at | 2 ++ > 5 files changed, 86 insertions(+) > > diff --git a/controller/chassis.c b/controller/chassis.c > index 241913d1f..bc8fb5282 100644 > --- a/controller/chassis.c > +++ b/controller/chassis.c > @@ -37,6 +37,8 @@ VLOG_DEFINE_THIS_MODULE(chassis); > #define HOST_NAME_MAX 255 > #endif /* HOST_NAME_MAX */ > > +char *file_system_id = NULL; > + > /* > * Structure for storing the chassis config parsed from the ovs table. > */ > @@ -277,6 +279,10 @@ chassis_parse_ovs_iface_types(char **iface_types, > size_t n_iface_types, > const char * > get_ovs_chassis_id(const struct ovsrec_open_vswitch_table *ovs_table) > { > + if (file_system_id) { > + return file_system_id; > + } > + > const struct ovsrec_open_vswitch *cfg > = ovsrec_open_vswitch_table_first(ovs_table); > const char *chassis_id = cfg ? smap_get(&cfg->external_ids, > "system-id") > diff --git a/controller/chassis.h b/controller/chassis.h > index 05a96bb0c..baa327059 100644 > --- a/controller/chassis.h > +++ b/controller/chassis.h > @@ -31,6 +31,8 @@ struct sset; > struct eth_addr; > struct smap; > > +extern char *file_system_id; > + > void chassis_register_ovs_idl(struct ovsdb_idl *); > const struct sbrec_chassis *chassis_run( > struct ovsdb_idl_txn *ovnsb_idl_txn, > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c > index 59ae732b3..c71b0851f 100644 > --- a/controller/ovn-controller.c > +++ b/controller/ovn-controller.c > @@ -18,10 +18,14 @@ > #include "ovn-controller.h" > > #include <errno.h> > +#include <fcntl.h> > #include <getopt.h> > #include <signal.h> > #include <stdlib.h> > #include <string.h> > +#include <sys/stat.h> > +#include <sys/types.h> > +#include <unistd.h> > > #include "bfd.h" > #include "binding.h" > @@ -55,6 +59,7 @@ > #include "lib/ip-mcast-index.h" > #include "lib/mac-binding-index.h" > #include "lib/mcast-group-index.h" > +#include "lib/ovn-dirs.h" > #include "lib/ovn-sb-idl.h" > #include "lib/ovn-util.h" > #include "patch.h" > @@ -151,6 +156,29 @@ struct pending_pkt { > /* Registered ofctrl seqno type for nb_cfg propagation. */ > static size_t ofctrl_seq_type_nb_cfg; > > +static char *get_file_system_id(void) > +{ > + char *ret = NULL; > + char *filename = xasprintf("%s/system-id-override", ovn_sysconfdir()); > + errno = 0; > + int fd = open(filename, O_RDONLY); > + if (fd != -1) { > + char system_id[64]; > + int nread = read(fd, system_id, sizeof system_id); > + if (nread) { > + system_id[nread] = '\0'; > + if (system_id[nread - 1] == '\n') { > + system_id[nread - 1] = '\0'; > + } > + ret = xstrdup(system_id); > + } > + close(fd); > + } > + > + free(filename); > + return ret; > +} > + > static unsigned int > update_sb_monitors(struct ovsdb_idl *ovnsb_idl, > const struct sbrec_chassis *chassis, > @@ -3519,6 +3547,9 @@ main(int argc, char *argv[]) > struct ovn_controller_exit_args exit_args = {&exiting, &restart}; > int retval; > > + /* Read from system-id-override file once on startup. */ > + file_system_id = get_file_system_id(); > + > ovs_cmdl_proctitle_init(argc, argv); > ovn_set_program_name(argv[0]); > service_start(&argc, &argv); > @@ -4485,6 +4516,9 @@ loop_done: > > ovs_feature_support_destroy(); > free(ovs_remote); > + if (file_system_id) { > + free(file_system_id); > + } > service_stop(); > > exit(retval); > diff --git a/tests/ovn.at b/tests/ovn.at > index 3614601e2..5972089f1 100644 > --- a/tests/ovn.at > +++ b/tests/ovn.at > @@ -32930,3 +32930,45 @@ AT_CHECK(test x$encap_hv1_ip == x) > OVN_CLEANUP([hv1],[hv2]) > AT_CLEANUP > ]) > + > +OVN_FOR_EACH_NORTHD([ > +AT_SETUP([chassis name override via file]) > +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 > + > +echo hv3 > ${OVN_SYSCONFDIR}/system-id-override > +ovn_attach n1 br-phys 192.168.0.1 24 vxlan > + > +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 > +OVS_WAIT_UNTIL([ > + test "1" = "$(ovn-sbctl list Encap | grep -c '192.168.1.1')" > +]) > + > +encap_hv3_ip=$(fetch_column Encap ip chassis_name=hv3 type=geneve) > +AT_CHECK(test x$encap_hv3_ip == x192.168.1.1) > + > +encap_hv1_ip=$(fetch_column Encap ip chassis_name=hv1 type=vxlan) > +AT_CHECK(test x$encap_hv1_ip == x) > + > +OVN_CLEANUP([hv1],[hv2]) > +AT_CLEANUP > +]) > diff --git a/tests/ovs-macros.at b/tests/ovs-macros.at > index 5a06fe956..36b58b5ae 100644 > --- a/tests/ovs-macros.at > +++ b/tests/ovs-macros.at > @@ -88,7 +88,9 @@ ovs_setenv() { > OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR > OVS_DBDIR=$ovs_dir; export OVS_DBDIR > OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR > + OVN_SYSCONFDIR=$ovs_dir; export OVN_SYSCONFDIR > OVS_PKGDATADIR=$ovs_dir; export OVS_PKGDATADIR > + OVN_PKGDATADIR=$ovs_dir; export OVN_PKGDATADIR > } > > # Prints the integers from $1 to $2, increasing by $3 (default 1) on > stdout. > -- > 2.34.1 > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > Looks good to me, thanks. Reviewed-by: Ales Musil <amu...@redhat.com> -- Ales Musil Senior Software Engineer - OVN Core Red Hat EMEA <https://www.redhat.com> amu...@redhat.com IM: amusil <https://red.ht/sig> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev