[ovs-dev] [PATCH ovn v4 5/9] ovn-controller: Make integration bridge config part of general context.

Ben Pfaff blp at nicira.com
Wed Apr 29 17:12:31 UTC 2015


From: Justin Pettit <jpettit at nicira.com>

The integration bridge will be needed by other components soon, so make
it part of the general ovn-controller context.

Signed-off-by: Justin Pettit <jpettit at nicira.com>
Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 ovn/controller/bindings.c       | 33 +++----------------------------
 ovn/controller/ovn-controller.c | 44 ++++++++++++++++++++++++++++++++++++++---
 ovn/controller/ovn-controller.h |  5 ++++-
 3 files changed, 48 insertions(+), 34 deletions(-)

diff --git a/ovn/controller/bindings.c b/ovn/controller/bindings.c
index 746110e..dcaee6c 100644
--- a/ovn/controller/bindings.c
+++ b/ovn/controller/bindings.c
@@ -25,8 +25,6 @@
 
 VLOG_DEFINE_THIS_MODULE(bindings);
 
-#define DEFAULT_BRIDGE_NAME "br-int"
-
 void
 bindings_init(struct controller_ctx *ctx)
 {
@@ -49,39 +47,14 @@ bindings_init(struct controller_ctx *ctx)
 static void
 get_local_iface_ids(struct controller_ctx *ctx, struct sset *lports)
 {
-    const struct ovsrec_open_vswitch *cfg;
-    const struct ovsrec_bridge *bridge_rec;
-    const char *bridge_name;
     int i;
 
-    cfg = ovsrec_open_vswitch_first(ctx->ovs_idl);
-    if (!cfg) {
-        VLOG_INFO("No Open_vSwitch row defined.");
-        return;
-    }
-
-    bridge_name = smap_get(&cfg->external_ids, "ovn-bridge");
-    if (!bridge_name) {
-        bridge_name = DEFAULT_BRIDGE_NAME;
-    }
-
-    OVSREC_BRIDGE_FOR_EACH(bridge_rec, ctx->ovs_idl) {
-        if (!strcmp(bridge_rec->name, bridge_name)) {
-            break;
-        }
-    }
-
-    if (!bridge_rec) {
-        VLOG_INFO("Could not find bridge '%s'", bridge_name);
-        return;
-    }
-
-    for (i = 0; i < bridge_rec->n_ports; i++) {
-        const struct ovsrec_port *port_rec = bridge_rec->ports[i];
+    for (i = 0; i < ctx->br_int->n_ports; i++) {
+        const struct ovsrec_port *port_rec = ctx->br_int->ports[i];
         const char *iface_id;
         int j;
 
-        if (!strcmp(port_rec->name, bridge_rec->name)) {
+        if (!strcmp(port_rec->name, ctx->br_int_name)) {
             continue;
         }
 
diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c
index cfc562c..12931b5 100644
--- a/ovn/controller/ovn-controller.c
+++ b/ovn/controller/ovn-controller.c
@@ -46,6 +46,8 @@ VLOG_DEFINE_THIS_MODULE(main);
 
 static unixctl_cb_func ovn_controller_exit;
 
+#define DEFAULT_BRIDGE_NAME "br-int"
+
 static void parse_options(int argc, char *argv[]);
 OVS_NO_RETURN static void usage(void);
 
@@ -66,8 +68,23 @@ get_initial_snapshot(struct ovsdb_idl *idl)
     }
 }
 
-/* Retrieve the OVN remote location from the "external-ids:ovn-remote"
- * key and the chassis name from the "external-ids:system-id" key in the
+static const struct ovsrec_bridge *
+get_bridge(struct controller_ctx *ctx, const char *name)
+{
+    const struct ovsrec_bridge *br;
+
+    OVSREC_BRIDGE_FOR_EACH(br, ctx->ovs_idl) {
+        if (!strcmp(br->name, name)) {
+            return br;
+        }
+    }
+
+    return NULL;
+}
+
+/* Retrieve the OVN integration bridge from the "external-ids:ovn-bridge"
+ * key, the remote location from the "external-ids:ovn-remote" key, and
+ * the chassis name from the "external-ids:system-id" key in the
  * Open_vSwitch table of the OVS database instance. */
 static void
 get_core_config(struct controller_ctx *ctx)
@@ -82,10 +99,23 @@ get_core_config(struct controller_ctx *ctx)
     }
 
     while (1) {
+        const struct ovsrec_bridge *br_int;
         const char *remote, *system_id;
 
         ovsdb_idl_run(ctx->ovs_idl);
 
+        ctx->br_int_name = smap_get(&cfg->external_ids, "ovn-bridge");
+        if (!ctx->br_int_name) {
+            ctx->br_int_name = DEFAULT_BRIDGE_NAME;
+        }
+
+        br_int = get_bridge(ctx, ctx->br_int_name);
+        if (!br_int) {
+            VLOG_INFO("Integration bridge '%s' does not exist.  Waiting...",
+                      ctx->br_int_name);
+            goto try_again;
+        }
+
         /* xxx This does not support changing OVN Southbound OVSDB mid-run. */
         remote = smap_get(&cfg->external_ids, "ovn-remote");
         if (!remote) {
@@ -114,7 +144,7 @@ int
 main(int argc, char *argv[])
 {
     struct unixctl_server *unixctl;
-    struct controller_ctx ctx = { .chassis_name = NULL };
+    struct controller_ctx ctx = { .chassis_name = NULL, .br_int_name = NULL };
     bool exiting;
     int retval;
 
@@ -163,6 +193,14 @@ main(int argc, char *argv[])
         ovsdb_idl_run(ctx.ovs_idl);
         ovsdb_idl_run(ctx.ovnsb_idl);
 
+        ctx.br_int = get_bridge(&ctx, ctx.br_int_name);
+        if (!ctx.br_int) {
+            VLOG_ERR("Integration bridge '%s' disappeared",
+                     ctx.br_int_name);
+            retval = EXIT_FAILURE;
+            break;
+        }
+
         if (!ovsdb_idl_is_alive(ctx.ovnsb_idl)) {
             int retval = ovsdb_idl_get_last_error(ctx.ovnsb_idl);
             VLOG_ERR("%s: database connection failed (%s)",
diff --git a/ovn/controller/ovn-controller.h b/ovn/controller/ovn-controller.h
index c701edc..e22c265 100644
--- a/ovn/controller/ovn-controller.h
+++ b/ovn/controller/ovn-controller.h
@@ -18,9 +18,12 @@
 #define OVN_CONTROLLER_H 1
 
 struct controller_ctx {
-    char *chassis_name;
+    char *chassis_name;             /* Name for this chassis. */
+    const char *br_int_name;        /* Name of local integration bridge. */
     struct ovsdb_idl *ovnsb_idl;
     struct ovsdb_idl *ovs_idl;
+
+    const struct ovsrec_bridge *br_int;
 };
 
 #endif /* ovn/ovn-controller.h */
-- 
2.1.3




More information about the dev mailing list