This patch configures the ovs records for a new controller to br-int
and an endpoint for the new controller
Signed-off-by: Babu Shanmugam <bscha...@redhat.com>
---
ovn/controller/ovn-controller.c | 62
+++++++++++++++++++++++++++++++++++++++--
1 file changed, 59 insertions(+), 3 deletions(-)
diff --git a/ovn/controller/ovn-controller.c
b/ovn/controller/ovn-controller.c
index 3f29b25..343de28 100644
--- a/ovn/controller/ovn-controller.c
+++ b/ovn/controller/ovn-controller.c
@@ -21,6 +21,7 @@
#include <getopt.h>
#include <signal.h>
#include <stdlib.h>
+#include <unistd.h>
#include <string.h>
#include "command-line.h"
@@ -56,6 +57,7 @@ static unixctl_cb_func ct_zone_list;
#define DEFAULT_BRIDGE_NAME "br-int"
static void parse_options(int argc, char *argv[]);
+static char const *get_switch_controller_path(void);
OVS_NO_RETURN static void usage(void);
static char *ovs_remote;
@@ -100,10 +102,58 @@ get_bridge(struct ovsdb_idl *ovs_idl, const char
*br_name)
return NULL;
}
+static char const *
+get_switch_controller_path(void)
+{
+ static char *path = NULL;
+
+ if (!path) {
+ path = xasprintf("%s/%s.%ld.sock",
+ ovs_rundir(), "ovn-controller", (long int)
getpid());
+ }
+ return path;
+}
+
+static void
+ovs_bridge_set_controller(struct controller_ctx *ctx,
+ struct ovsrec_bridge const *br)
+{
+ struct ovsrec_controller *controller;
+ struct ovsdb_datum const *bctrl, *target;
+ bool set = false;
+ static char *proto = NULL;
+
+ if (!proto) {
+ proto = xasprintf("unix:%s", get_switch_controller_path());
+ }
+
+ if (!br || !ctx || !ctx->ovs_idl_txn || !ctx->ovs_idl) {
+ return;
+ }
+
+ bctrl = ovsrec_bridge_get_controller(br, OVSDB_TYPE_UUID);
+ if (bctrl && bctrl->n > 0) {
+ struct ovsrec_controller const *ctrler;
+
+ ctrler =
+ ovsrec_controller_get_for_uuid(ctx->ovs_idl,
&bctrl->keys[0].uuid);
+ target = ovsrec_controller_get_target(ctrler, OVSDB_TYPE_STRING);
+ if (strcmp(target->keys[0].string, proto) != 0) {
+ set = true;
+ }
+ } else {
+ set = true;
+ }
+ if (set) {
+ controller = ovsrec_controller_insert(ctx->ovs_idl_txn);
+ ovsrec_controller_set_target(controller, proto);
+ ovsrec_bridge_set_controller(br, &controller, 1);
+ }
+}
+
static const struct ovsrec_bridge *
create_br_int(struct controller_ctx *ctx,
- const struct ovsrec_open_vswitch *cfg,
- const char *bridge_name)
+ const struct ovsrec_open_vswitch *cfg, const char
*bridge_name)
{
if (!ctx->ovs_idl_txn) {
return NULL;
@@ -158,8 +208,9 @@ get_br_int(struct controller_ctx *ctx)
const struct ovsrec_bridge *br;
br = get_bridge(ctx->ovs_idl, br_int_name);
if (!br) {
- return create_br_int(ctx, cfg, br_int_name);
+ br = create_br_int(ctx, cfg, br_int_name);
}
+ ovs_bridge_set_controller(ctx, br);
return br;
}
@@ -246,6 +297,11 @@ main(int argc, char *argv[])
ovsdb_idl_add_column(ovs_idl_loop.idl, &ovsrec_bridge_col_name);
ovsdb_idl_add_column(ovs_idl_loop.idl, &ovsrec_bridge_col_fail_mode);
ovsdb_idl_add_column(ovs_idl_loop.idl,
&ovsrec_bridge_col_other_config);
+ ovsdb_idl_add_column(ovs_idl_loop.idl, &ovsrec_bridge_col_controller);
+ ovsdb_idl_add_table(ovs_idl_loop.idl, &ovsrec_table_controller);
+ ovsdb_idl_add_column(ovs_idl_loop.idl, &ovsrec_controller_col_target);
+ ovsdb_idl_add_column(ovs_idl_loop.idl,
+ &ovsrec_controller_col_is_connected);
chassis_register_ovs_idl(ovs_idl_loop.idl);
encaps_register_ovs_idl(ovs_idl_loop.idl);
binding_register_ovs_idl(ovs_idl_loop.idl);
--
1.9.1
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev