[ovs-dev] [PATCH 09/22] ovn-controller: Tolerate missing 'chassis_id'.
Ben Pfaff
blp at nicira.com
Sun Jul 19 22:44:55 UTC 2015
Until now, if the chassis id was missing, ovn-controller exited. This
commit makes ovn-controller wait for it to return.
Signed-off-by: Ben Pfaff <blp at nicira.com>
---
ovn/controller/binding.c | 3 +++
ovn/controller/chassis.c | 4 ++++
ovn/controller/ovn-controller.c | 38 +++++++++++++++++++++-----------------
3 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/ovn/controller/binding.c b/ovn/controller/binding.c
index b6b345e..4cf8636 100644
--- a/ovn/controller/binding.c
+++ b/ovn/controller/binding.c
@@ -135,6 +135,9 @@ binding_cleanup(struct controller_ctx *ctx, const char *chassis_id)
return false;
}
+ if (!chassis_id) {
+ return true;
+ }
const struct sbrec_chassis *chassis_rec
= get_chassis_by_name(ctx->ovnsb_idl, chassis_id);
if (!chassis_rec) {
diff --git a/ovn/controller/chassis.c b/ovn/controller/chassis.c
index 511d5c9..2dfce19 100644
--- a/ovn/controller/chassis.c
+++ b/ovn/controller/chassis.c
@@ -104,6 +104,10 @@ chassis_run(struct controller_ctx *ctx, const char *chassis_id)
bool
chassis_cleanup(struct controller_ctx *ctx, const char *chassis_id)
{
+ if (!chassis_id) {
+ return true;
+ }
+
/* Delete Chassis row. */
const struct sbrec_chassis *chassis_rec
= get_chassis_by_name(ctx->ovnsb_idl, chassis_id);
diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c
index ce62136..73a07c2 100644
--- a/ovn/controller/ovn-controller.c
+++ b/ovn/controller/ovn-controller.c
@@ -86,6 +86,13 @@ get_bridge(struct controller_ctx *ctx, const char *name)
return NULL;
}
+static const char *
+get_chassis_id(const struct ovsdb_idl *ovs_idl)
+{
+ const struct ovsrec_open_vswitch *cfg = ovsrec_open_vswitch_first(ovs_idl);
+ return cfg ? smap_get(&cfg->external_ids, "system-id") : 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
@@ -94,8 +101,7 @@ get_bridge(struct controller_ctx *ctx, const char *name)
* xxx ovn-controller does not support changing any of these mid-run,
* xxx but that should be addressed later. */
static void
-get_core_config(struct controller_ctx *ctx, char **br_int_namep,
- char **chassis_idp)
+get_core_config(struct controller_ctx *ctx, char **br_int_namep)
{
while (1) {
const struct ovsrec_open_vswitch *cfg;
@@ -106,7 +112,7 @@ get_core_config(struct controller_ctx *ctx, char **br_int_namep,
exit(EXIT_FAILURE);
}
- const char *remote, *system_id, *br_int_name;
+ const char *remote, *br_int_name;
ovsdb_idl_run(ctx->ovs_idl);
@@ -121,14 +127,7 @@ get_core_config(struct controller_ctx *ctx, char **br_int_namep,
goto try_again;
}
- system_id = smap_get(&cfg->external_ids, "system-id");
- if (!system_id) {
- VLOG_INFO("system-id not specified. Waiting...");
- goto try_again;
- }
-
ovnsb_remote = xstrdup(remote);
- *chassis_idp = xstrdup(system_id);
*br_int_namep = xstrdup(br_int_name);
return;
@@ -256,8 +255,8 @@ main(int argc, char *argv[])
get_initial_snapshot(ctx.ovs_idl);
- char *br_int_name, *chassis_id;
- get_core_config(&ctx, &br_int_name, &chassis_id);
+ char *br_int_name;
+ get_core_config(&ctx, &br_int_name);
ctx.ovnsb_idl = ovsdb_idl_create(ovnsb_remote, &sbrec_idl_class,
true, true);
@@ -273,15 +272,20 @@ main(int argc, char *argv[])
ctx.ovs_idl_txn = idl_loop_run(&ovs_idl_loop);
const struct ovsrec_bridge *br_int = get_bridge(&ctx, br_int_name);
+ const char *chassis_id = get_chassis_id(ctx.ovs_idl);
- chassis_run(&ctx, chassis_id);
- encaps_run(&ctx, br_int, chassis_id);
- binding_run(&ctx, br_int, chassis_id);
+ if (chassis_id) {
+ chassis_run(&ctx, chassis_id);
+ encaps_run(&ctx, br_int, chassis_id);
+ binding_run(&ctx, br_int, chassis_id);
+ }
if (br_int) {
struct hmap flow_table = HMAP_INITIALIZER(&flow_table);
pipeline_run(&ctx, &flow_table);
- physical_run(&ctx, br_int, chassis_id, &flow_table);
+ if (chassis_id) {
+ physical_run(&ctx, br_int, chassis_id, &flow_table);
+ }
ofctrl_run(br_int, &flow_table);
hmap_destroy(&flow_table);
}
@@ -309,6 +313,7 @@ main(int argc, char *argv[])
ctx.ovs_idl_txn = idl_loop_run(&ovs_idl_loop);
const struct ovsrec_bridge *br_int = get_bridge(&ctx, br_int_name);
+ const char *chassis_id = get_chassis_id(ctx.ovs_idl);
/* Run all of the cleanup functions, even if one of them returns false.
* We're done if all of them return true. */
@@ -332,7 +337,6 @@ main(int argc, char *argv[])
idl_loop_destroy(&ovnsb_idl_loop);
free(br_int_name);
- free(chassis_id);
free(ovnsb_remote);
free(ovs_remote);
--
2.1.3
More information about the dev
mailing list