Do you think we should print a warning (at least once) to indicate that the 
integration bridge is missing?  Otherwise, it could be confusing to someone why 
nothing's happening if they typo-ed their bridge name.

Acked-by: Justin Pettit <jpet...@nicira.com>

--Justin


> On Jul 28, 2015, at 8:44 AM, Ben Pfaff <b...@nicira.com> wrote:
> 
> Until now, if the integration bridge was missing, ovn-controller exited.
> This commit makes it wait until the integration bridge is created.
> 
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
> ovn/controller/binding.c        |  4 +++-
> ovn/controller/encaps.c         |  2 +-
> ovn/controller/ofctrl.c         | 16 ++++++++++------
> ovn/controller/ovn-controller.c | 39 ++++++++++-----------------------------
> 4 files changed, 24 insertions(+), 37 deletions(-)
> 
> diff --git a/ovn/controller/binding.c b/ovn/controller/binding.c
> index 2cb0b42..b6b345e 100644
> --- a/ovn/controller/binding.c
> +++ b/ovn/controller/binding.c
> @@ -91,7 +91,9 @@ binding_run(struct controller_ctx *ctx, const struct 
> ovsrec_bridge *br_int,
> 
>     sset_init(&lports);
>     sset_init(&all_lports);
> -    get_local_iface_ids(br_int, &lports);
> +    if (br_int) {
> +        get_local_iface_ids(br_int, &lports);
> +    }
>     sset_clone(&all_lports, &lports);
> 
>     ovsdb_idl_txn_add_comment(ctx->ovnsb_idl_txn,
> diff --git a/ovn/controller/encaps.c b/ovn/controller/encaps.c
> index 7aa523f..f150246 100644
> --- a/ovn/controller/encaps.c
> +++ b/ovn/controller/encaps.c
> @@ -231,7 +231,7 @@ void
> encaps_run(struct controller_ctx *ctx, const struct ovsrec_bridge *br_int,
>            const char *chassis_id)
> {
> -    if (!ctx->ovs_idl_txn) {
> +    if (!ctx->ovs_idl_txn || !br_int) {
>         return;
>     }
> 
> diff --git a/ovn/controller/ofctrl.c b/ovn/controller/ofctrl.c
> index c548645..b1c421c 100644
> --- a/ovn/controller/ofctrl.c
> +++ b/ovn/controller/ofctrl.c
> @@ -92,13 +92,17 @@ ofctrl_init(void)
> void
> ofctrl_run(const struct ovsrec_bridge *br_int, struct hmap *flow_table)
> {
> -    char *target;
> -    target = xasprintf("unix:%s/%s.mgmt", ovs_rundir(), br_int->name);
> -    if (strcmp(target, rconn_get_target(swconn))) {
> -        VLOG_INFO("%s: connecting to switch", target);
> -        rconn_connect(swconn, target, target);
> +    if (br_int) {
> +        char *target;
> +        target = xasprintf("unix:%s/%s.mgmt", ovs_rundir(), br_int->name);
> +        if (strcmp(target, rconn_get_target(swconn))) {
> +            VLOG_INFO("%s: connecting to switch", target);
> +            rconn_connect(swconn, target, target);
> +        }
> +        free(target);
> +    } else {
> +        rconn_disconnect(swconn);
>     }
> -    free(target);
> 
>     rconn_run(swconn);
> 
> diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c
> index e3c745a..d7ab7a3 100644
> --- a/ovn/controller/ovn-controller.c
> +++ b/ovn/controller/ovn-controller.c
> @@ -108,7 +108,6 @@ get_core_config(struct controller_ctx *ctx, char 
> **br_int_namep,
>             exit(EXIT_FAILURE);
>         }
> 
> -        const struct ovsrec_bridge *br_int;
>         const char *remote, *system_id, *br_int_name;
> 
>         br_int_name = smap_get(&cfg->external_ids, "ovn-bridge");
> @@ -116,13 +115,6 @@ get_core_config(struct controller_ctx *ctx, char 
> **br_int_namep,
>             br_int_name = DEFAULT_BRIDGE_NAME;
>         }
> 
> -        br_int = get_bridge(ctx, br_int_name);
> -        if (!br_int) {
> -            VLOG_INFO("Integration bridge '%s' does not exist.  Waiting...",
> -                      br_int_name);
> -            goto try_again;
> -        }
> -
>         remote = smap_get(&cfg->external_ids, "ovn-remote");
>         if (!remote) {
>             VLOG_INFO("OVN OVSDB remote not specified.  Waiting...");
> @@ -280,24 +272,19 @@ main(int argc, char *argv[])
>         ctx.ovnsb_idl_txn = idl_loop_run(&ovnsb_idl_loop);
>         ctx.ovs_idl_txn = idl_loop_run(&ovs_idl_loop);
> 
> -        /* xxx If run into any surprising changes, we exit.  We should
> -         * xxx handle this more gracefully. */
>         const struct ovsrec_bridge *br_int = get_bridge(&ctx, br_int_name);
> -        if (!br_int) {
> -            VLOG_ERR("Integration bridge '%s' disappeared", br_int_name);
> -            retval = EXIT_FAILURE;
> -            goto exit;
> -        }
> 
>         chassis_run(&ctx, chassis_id);
>         encaps_run(&ctx, br_int, chassis_id);
>         binding_run(&ctx, br_int, chassis_id);
> 
> -        struct hmap flow_table = HMAP_INITIALIZER(&flow_table);
> -        pipeline_run(&ctx, &flow_table);
> -        physical_run(&ctx, br_int, chassis_id, &flow_table);
> -        ofctrl_run(br_int, &flow_table);
> -        hmap_destroy(&flow_table);
> +        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);
> +            ofctrl_run(br_int, &flow_table);
> +            hmap_destroy(&flow_table);
> +        }
> 
>         unixctl_server_run(unixctl);
> 
> @@ -309,7 +296,9 @@ main(int argc, char *argv[])
>         idl_loop_commit_and_wait(&ovnsb_idl_loop);
>         idl_loop_commit_and_wait(&ovs_idl_loop);
> 
> -        ofctrl_wait();
> +        if (br_int) {
> +            ofctrl_wait();
> +        }
>         poll_block();
>     }
> 
> @@ -319,14 +308,7 @@ main(int argc, char *argv[])
>         ctx.ovnsb_idl_txn = idl_loop_run(&ovnsb_idl_loop);
>         ctx.ovs_idl_txn = idl_loop_run(&ovs_idl_loop);
> 
> -        /* xxx If run into any surprising changes, we exit.  We should
> -         * xxx handle this more gracefully. */
>         const struct ovsrec_bridge *br_int = get_bridge(&ctx, br_int_name);
> -        if (!br_int) {
> -            VLOG_ERR("Integration bridge '%s' disappeared", br_int_name);
> -            retval = EXIT_FAILURE;
> -            goto exit;
> -        }
> 
>         /* Run all of the cleanup functions, even if one of them returns 
> false.
>          * We're done if all of them return true. */
> @@ -342,7 +324,6 @@ main(int argc, char *argv[])
>         poll_block();
>     }
> 
> -exit:
>     unixctl_server_destroy(unixctl);
>     pipeline_destroy(&ctx);
>     ofctrl_destroy();
> -- 
> 2.1.3
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to