ovn-nbctl is intended to be a utility for manually interacting with the OVN northbound db. A real consumer of OVN, such as OpenStack, should be using ovsdb directly. However, a utility like this is useful during development and testing of both ovn itself as well as the OpenStack Neutron plugin.
Signed-off-by: Russell Bryant <[email protected]> --- ovn/.gitignore | 2 + ovn/automake.mk | 8 ++- ovn/ovn-nbctl.8.xml | 18 +++++++ ovn/ovn-nbctl.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 ovn/ovn-nbctl.8.xml create mode 100644 ovn/ovn-nbctl.c diff --git a/ovn/.gitignore b/ovn/.gitignore index 011bb1c..f320a6b 100644 --- a/ovn/.gitignore +++ b/ovn/.gitignore @@ -12,3 +12,5 @@ /ovn-nb-idl.c /ovn-nb-idl.h /ovn-nb-idl.ovsidl +/ovn-nbctl +/ovn-nbctl.8 diff --git a/ovn/automake.mk b/ovn/automake.mk index cc1f8ae..37b0ca6 100644 --- a/ovn/automake.mk +++ b/ovn/automake.mk @@ -66,8 +66,8 @@ ovn/ovn-nb.5: \ $(srcdir)/ovn/ovn-nb.xml > [email protected] && \ mv [email protected] $@ -man_MANS += ovn/ovn-controller.8 ovn/ovn-architecture.7 -EXTRA_DIST += ovn/ovn-controller.8.in ovn/ovn-architecture.7.xml +man_MANS += ovn/ovn-controller.8 ovn/ovn-architecture.7 ovn/ovn-nbctl.8 +EXTRA_DIST += ovn/ovn-controller.8.in ovn/ovn-architecture.7.xml ovn/ovn-nbctl.8.xml SUFFIXES += .xml %: %.xml @@ -115,3 +115,7 @@ ovn_libovn_la_SOURCES = \ ovn/ovn-idl.h \ ovn/ovn-nb-idl.c \ ovn/ovn-nb-idl.h + +bin_PROGRAMS += ovn/ovn-nbctl +ovn_ovn_nbctl_SOURCES = ovn/ovn-nbctl.c +ovn_ovn_nbctl_LDADD = ovn/libovn.la ovsdb/libovsdb.la lib/libopenvswitch.la diff --git a/ovn/ovn-nbctl.8.xml b/ovn/ovn-nbctl.8.xml new file mode 100644 index 0000000..1745283 --- /dev/null +++ b/ovn/ovn-nbctl.8.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<manpage program="ovn-nbctl" section="8" title="ovn-nbctl"> + <h1>Name</h1> + <p>ovn-nbctl -- Open Virtual Network northbound db management utility</p> + + <h1>Synopsys</h1> + <p>ovn-nbctl [OPTIONS] COMMAND [ARG...]</p> + + <h1>Description</h1> + <p>This utility can be used to manage the OVN northbound database.</p> + + <h1>Commands</h1> + <p>add-lswitch</p> + + <h1>Options</h1> + <p>-h | --help</p> + <p>-V | --version</p> +</manpage> diff --git a/ovn/ovn-nbctl.c b/ovn/ovn-nbctl.c new file mode 100644 index 0000000..0084ae5 --- /dev/null +++ b/ovn/ovn-nbctl.c @@ -0,0 +1,142 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <config.h> + +#include <getopt.h> +#include <stdlib.h> +#include <stdio.h> + +#include "command-line.h" +#include "dirs.h" +#include "fatal-signal.h" +#include "ovn/ovn-nb-idl.h" +#include "poll-loop.h" +#include "util.h" +#include "openvswitch/vlog.h" + +struct nbctl_context { + struct ovsdb_idl *idl; + struct ovsdb_idl_txn *txn; + const char *db; +}; + +static const struct ovs_cmdl_command *get_all_commands(void); + +static void +usage(void) +{ + printf("\ +%s: OVN northbound DB management utility\n\ +usage: %s [OPTIONS] COMMAND [ARG...]\n\ +\n\ +Commands:\n\ + add-lswitch Create a logical switch\n\ + list-lswitch List configured logical switches\n\ +Options:\n\ + -h, --help display this help message\n\ + -V, --version display version information\n\ +", program_name, program_name); +} + +static const char * +default_db(void) +{ + static char *db; + if (!db) { + db = xasprintf("unix:%s/db.sock", ovs_rundir()); + } + return db; +} + +static void +do_add_lswitch(struct ovs_cmdl_context *ctx) +{ + struct nbctl_context *nb_ctx = ctx->pvt; + + nbrec_logical_switch_insert(nb_ctx->txn); +} + +static void +parse_options(int argc, char *argv[]) +{ + static const struct option long_options[] = { + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'V'}, + {NULL, 0, NULL, 0}, + }; + char *short_options = ovs_cmdl_long_options_to_short_options(long_options); + + for (;;) { + int c; + + c = getopt_long(argc, argv, short_options, long_options, NULL); + if (c == -1) { + break; + } + + switch (c) { + case 'h': + usage(); + + case 'V': + ovs_print_version(0, 0); + exit(EXIT_SUCCESS); + + default: + break; + } + } + + free(short_options); +} + +static const struct ovs_cmdl_command all_commands[] = { + { "add-lswitch", "", 0, 0, do_add_lswitch }, + { NULL, NULL, 0, 0, NULL }, +}; + +static const struct ovs_cmdl_command *get_all_commands(void) +{ + return all_commands; +} + +int +main(int argc, char *argv[]) +{ + struct ovs_cmdl_context ctx; + struct nbctl_context nb_ctx = { NULL, }; + enum ovsdb_idl_txn_status txn_status; + + fatal_ignore_sigpipe(); + set_program_name(argv[0]); + parse_options(argc, argv); + nbrec_init(); + + nb_ctx.db = default_db(); + nb_ctx.idl = ovsdb_idl_create(nb_ctx.db, &nbrec_idl_class, true, false); + ctx.pvt = &nb_ctx; + ctx.argc = argc - optind; + ctx.argv = argv + optind; + + do { + /* XXX this loop needs to be a lot smarter */ + ovsdb_idl_run(nb_ctx.idl); + nb_ctx.txn = ovsdb_idl_txn_create(nb_ctx.idl); + ovs_cmdl_run_command(&ctx, get_all_commands()); + txn_status = ovsdb_idl_txn_commit_block(nb_ctx.txn); + } while (txn_status == TXN_TRY_AGAIN); + + exit(0); +} -- 2.1.0 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
