Flavio Leitner <f...@sysclose.org> writes: > Today the exit code refers to the execution of the change > in the database. However, when not using parameter --no-wait > (default), the ovs-vsctl also checks if OVSDB transactions > are successfully recorded and reload by ovs-vswitchd. In this > case, an error message is printed if there is a problem during > the reload, like for example the one below: > > # ovs-vsctl add-port br0 gre0 -- \ > set interface gre0 type=ip6gre options:key=100 \ > options:remote_ip=2001::2 > ovs-vsctl: Error detected while setting up 'gre0': could not \ > add network device gre0 to ofproto (Address family not supported\ > by protocol). See ovs-vswitchd log for details. > ovs-vsctl: The default log directory is "/var/log/openvswitch". > # echo $? > 0 > > This patch changes to exit with specific error code '3' > if errors were reported during the reload. > > This change may break existing scripts because ovs-vsctl will > start to fail when before it was succeeding. However, if an > error is printed, then it is likely that the change was not > functional anyway. > > Reported-at: https://bugzilla.redhat.com/1731553 > Signed-off-by: Flavio Leitner <f...@sysclose.org> > --- > NEWS | 3 +++ > tests/ovs-vsctl.at | 19 +++++++++++++++++-- > tests/ovs-vswitchd.at | 2 +- > tests/tunnel.at | 2 +- > utilities/ovs-vsctl.8.in | 2 ++ > utilities/ovs-vsctl.c | 29 +++++++++++++++++++++++------ > 6 files changed, 47 insertions(+), 10 deletions(-) > > diff --git a/NEWS b/NEWS > index cfd466663..f8f7b7655 100644 > --- a/NEWS > +++ b/NEWS > @@ -28,6 +28,9 @@ Post-v3.1.0 > * Added new options --[ovsdb-server|ovs-vswitchd]-umask=MODE to set > umask > value when starting OVS daemons. E.g., use --ovsdb-server-umask=0002 > in order to create OVSDB sockets with access mode of 0770. > + - ovs-vsctl: > + * Exit with error code 3 if errors were reported while checking if OVSDB > + transactions are successfully recorded and reload by ovs-vswitchd. > - QoS: > * Added new configuration option 'jitter' for a linux-netem QoS type. > - DPDK: > diff --git a/tests/ovs-vsctl.at b/tests/ovs-vsctl.at > index a368bff6e..2554152df 100644 > --- a/tests/ovs-vsctl.at > +++ b/tests/ovs-vsctl.at > @@ -1522,7 +1522,7 @@ cat >experr <<EOF > ovs-vsctl: Error detected while setting up 'reserved_name'. See > ovs-vswitchd log for details. > ovs-vsctl: The default log directory is "$OVS_RUNDIR". > EOF > -AT_CHECK([ovs-vsctl add-port br0 reserved_name], [0], [], [experr]) > +AT_CHECK([ovs-vsctl add-port br0 reserved_name], [3], [], [experr]) > # Prevent race. > OVS_WAIT_UNTIL([test `grep -- "|WARN|" ovs-vswitchd.log | wc -l` -ge 1]) > # Detect the warning log message > @@ -1560,7 +1560,7 @@ cat >experr <<EOF > ovs-vsctl: Error detected while setting up 'reserved_name'. See > ovs-vswitchd log for details. > ovs-vsctl: The default log directory is "$OVS_RUNDIR". > EOF > -AT_CHECK([ovs-vsctl add-port br0 reserved_name], [0], [], [experr]) > +AT_CHECK([ovs-vsctl add-port br0 reserved_name], [3], [], [experr]) > # Prevent race. > OVS_WAIT_UNTIL([test `grep -- "|WARN|" ovs-vswitchd.log | wc -l` -ge 1]) > # Detect the warning log message > @@ -1737,3 +1737,18 @@ AT_CHECK([ovs-vsctl --no-wait --bare --columns > _uuid,name list bridge tst1], [0] > > OVS_VSCTL_CLEANUP > AT_CLEANUP > + > +AT_SETUP([ovs-vsctl -- return error if OVSDB reload issues are reported]) > +OVS_VSWITCHD_START > +dnl check if ovs-vsctl returns error 3 if ovs-vswitchd fails to reload. > + > +cat >experr << EOF > +ovs-vsctl: Error detected while setting up 'gre0': gre0: bad ip6gre > 'remote_ip' > +gre0: ip6gre type requires valid 'remote_ip' argument. See ovs-vswitchd log > for details. > +ovs-vsctl: The default log directory is "$OVS_RUNDIR". > +EOF > +AT_CHECK([ovs-vsctl add-port br0 gre0 -- set interface gre0 type=ip6gre > options:key=100 options:remote_ip=192.168.0.300], [3], [], [experr]) > +OVS_VSWITCHD_STOP(["/is not a valid IP address/d > +/netdev_vport|WARN|gre0: bad ip6gre 'remote_ip'/d > +/netdev|WARN|gre0: could not set configuration/d"]) > +AT_CLEANUP > diff --git a/tests/ovs-vswitchd.at b/tests/ovs-vswitchd.at > index 977b2eba1..81604111b 100644 > --- a/tests/ovs-vswitchd.at > +++ b/tests/ovs-vswitchd.at > @@ -222,7 +222,7 @@ cat >experr <<EOF > ovs-vsctl: Error detected while setting up 'b/c'. See ovs-vswitchd log for > details. > ovs-vsctl: The default log directory is "$OVS_RUNDIR". > EOF > -AT_CHECK([ovs-vsctl add-br b/c -- set bridge b/c datapath-type=dummy], [0], > [], [experr]) > +AT_CHECK([ovs-vsctl add-br b/c -- set bridge b/c datapath-type=dummy], [3], > [], [experr]) > AT_CHECK([test ! -e b/c.mgmt]) > > OVS_VSWITCHD_STOP(['/ignoring bridge with invalid name/d']) > diff --git a/tests/tunnel.at b/tests/tunnel.at > index ddeb66bc9..cf66cc085 100644 > --- a/tests/tunnel.at > +++ b/tests/tunnel.at > @@ -1009,7 +1009,7 @@ OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 > type=vxlan \ > options:remote_ip=flow ofport_request=1]) > > AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=vxlan \ > - options:remote_ip=flow options:exts=gbp options:key=1 > ofport_request=2], [0], > + options:remote_ip=flow options:exts=gbp options:key=1 > ofport_request=2], [3], > [], [ignore]) > > AT_CHECK([grep 'p2: could not set configuration (File exists)' > ovs-vswitchd.log | sed "s/^.*\(p2:.*\)$/\1/"], [0], > diff --git a/utilities/ovs-vsctl.8.in b/utilities/ovs-vsctl.8.in > index 9e319aa1c..929285e66 100644 > --- a/utilities/ovs-vsctl.8.in > +++ b/utilities/ovs-vsctl.8.in > @@ -892,6 +892,8 @@ Usage, syntax, or configuration file error. > .IP "2" > The \fIbridge\fR argument to \fBbr\-exists\fR specified the name of a > bridge that does not exist. > +.IP "3" > +An error has been reported post OVSDB reload. > .SH "SEE ALSO" > . > .BR ovsdb\-server (1), > diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c > index 2f5ac1a26..8daa1d409 100644 > --- a/utilities/ovs-vsctl.c > +++ b/utilities/ovs-vsctl.c > @@ -56,6 +56,9 @@ > > VLOG_DEFINE_THIS_MODULE(vsctl); > > +/* Post OVSDB reload error reported. */ > +#define EXIT_POSTDB_ERROR 3 > +
Maybe we can use a definition from sysexits.h, like: #define EX_SOFTWARE 70 /* internal software error */ or #define EX_PROTOCOL 76 /* remote error in protocol */ WDYT? There's an effort to try and standardize the exit codes (according to https://tldp.org/LDP/abs/html/exitcodes.html and https://man.freebsd.org/cgi/man.cgi?query=sysexits&sektion=3) Maybe we should try and adopt it? > struct vsctl_context; > > /* --db: The database server to contact. */ > @@ -115,7 +118,7 @@ static void parse_options(int argc, char *argv[], struct > shash *local_options); > static void run_prerequisites(struct ctl_command[], size_t n_commands, > struct ovsdb_idl *); > static bool do_vsctl(const char *args, struct ctl_command *, size_t n, > - struct ovsdb_idl *); > + struct ovsdb_idl *, bool *); > > /* post_db_reload_check frame work is to allow ovs-vsctl to do additional > * checks after OVSDB transactions are successfully recorded and reload by > @@ -134,11 +137,13 @@ static bool do_vsctl(const char *args, struct > ctl_command *, size_t n, > * Current implementation only check for Post OVSDB reload failures on new > * interface additions with 'add-br' and 'add-port' commands. > * > + * post_db_reload_check returns 'true' if a failure is reported. > + * > * post_db_reload_expect_iface() > * > * keep track of interfaces to be checked post OVSDB reload. */ > static void post_db_reload_check_init(void); > -static void post_db_reload_do_checks(const struct vsctl_context *); > +static bool post_db_reload_do_checks(const struct vsctl_context *); > static void post_db_reload_expect_iface(const struct ovsrec_interface *); > > static struct uuid *neoteric_ifaces; > @@ -200,9 +205,15 @@ main(int argc, char *argv[]) > } > > if (seqno != ovsdb_idl_get_seqno(idl)) { > + bool postdb_err; > + > seqno = ovsdb_idl_get_seqno(idl); > - if (do_vsctl(args, commands, n_commands, idl)) { > + if (do_vsctl(args, commands, n_commands, idl, &postdb_err)) { > free(args); > + if (postdb_err) { > + exit(EXIT_POSTDB_ERROR); > + } > + > exit(EXIT_SUCCESS); > } > } > @@ -2674,7 +2685,7 @@ post_db_reload_expect_iface(const struct > ovsrec_interface *iface) > neoteric_ifaces[n_neoteric_ifaces++] = iface->header_.uuid; > } > > -static void > +static bool > post_db_reload_do_checks(const struct vsctl_context *vsctl_ctx) > { > bool print_error = false; > @@ -2707,6 +2718,8 @@ post_db_reload_do_checks(const struct vsctl_context > *vsctl_ctx) > if (print_error) { > ovs_error(0, "The default log directory is \"%s\".", ovs_logdir()); > } > + > + return print_error; > } > > > @@ -2815,7 +2828,7 @@ vsctl_parent_process_info(void) > > static bool > do_vsctl(const char *args, struct ctl_command *commands, size_t n_commands, > - struct ovsdb_idl *idl) > + struct ovsdb_idl *idl, bool *postdb_err) > { > struct ovsdb_idl_txn *txn; > const struct ovsrec_open_vswitch *ovs; > @@ -2827,6 +2840,8 @@ do_vsctl(const char *args, struct ctl_command > *commands, size_t n_commands, > int64_t next_cfg = 0; > char *ppid_info = NULL; > > + ovs_assert(postdb_err); > + *postdb_err = false; > txn = the_idl_txn = ovsdb_idl_txn_create(idl); > if (dry_run) { > ovsdb_idl_txn_set_dry_run(txn); > @@ -2989,7 +3004,9 @@ do_vsctl(const char *args, struct ctl_command > *commands, size_t n_commands, > ovsdb_idl_run(idl); > OVSREC_OPEN_VSWITCH_FOR_EACH (ovs, idl) { > if (ovs->cur_cfg >= next_cfg) { > - post_db_reload_do_checks(&vsctl_ctx); > + if (post_db_reload_do_checks(&vsctl_ctx)) { > + *postdb_err = true; > + } > goto done; > } > } _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev