void
binding_run(struct controller_ctx *ctx)
{
+ const struct sbrec_chassis *chassis_rec;
const struct sbrec_binding *binding_rec;
struct ovsdb_idl_txn *txn;
struct sset lports, all_lports;
const char *name;
int retval;
+ chassis_rec = get_chassis_by_name(ctx->ovnsb_idl, ctx->chassis_id);
+ if (!chassis_rec) {
+ return;
+ }
+
sset_init(&lports);
sset_init(&all_lports);
get_local_iface_ids(ctx, &lports);
if (sset_find_and_delete(&lports, binding_rec->logical_port) ||
(binding_rec->parent_port && binding_rec->parent_port[0] &&
sset_contains(&all_lports, binding_rec->parent_port))) {
- if (!strcmp(binding_rec->chassis, ctx->chassis_id)) {
+ if (binding_rec->chassis == chassis_rec) {
continue;
}
- if (binding_rec->chassis[0]) {
+ if (binding_rec->chassis) {
VLOG_INFO("Changing chassis for lport %s from %s to %s",
- binding_rec->logical_port, binding_rec->chassis,
- ctx->chassis_id);
+ binding_rec->logical_port,
+ binding_rec->chassis->name,
+ chassis_rec->name);
}
- sbrec_binding_set_chassis(binding_rec, ctx->chassis_id);
- } else if (!strcmp(binding_rec->chassis, ctx->chassis_id)) {
- sbrec_binding_set_chassis(binding_rec, "");
+ sbrec_binding_set_chassis(binding_rec, chassis_rec);
+ } else if (binding_rec->chassis == chassis_rec) {
+ sbrec_binding_set_chassis(binding_rec, NULL);
}
}
void
binding_destroy(struct controller_ctx *ctx)
{
+ const struct sbrec_chassis *chassis_rec;
int retval = TXN_TRY_AGAIN;
ovs_assert(ctx->ovnsb_idl);
+ chassis_rec = get_chassis_by_name(ctx->ovnsb_idl, ctx->chassis_id);
+ if (!chassis_rec) {
+ return;
+ }
+
while (retval != TXN_SUCCESS && retval != TXN_UNCHANGED) {
const struct sbrec_binding *binding_rec;
struct ovsdb_idl_txn *txn;
ctx->chassis_id);
SBREC_BINDING_FOR_EACH(binding_rec, ctx->ovnsb_idl) {
- if (!strcmp(binding_rec->chassis, ctx->chassis_id)) {
- sbrec_binding_set_chassis(binding_rec, "");
+ if (binding_rec->chassis == chassis_rec) {
+ sbrec_binding_set_chassis(binding_rec, NULL);
}
}
int retval = TXN_TRY_AGAIN;
struct ovsdb_idl_txn *txn;
- SBREC_CHASSIS_FOR_EACH(chassis_rec, ctx->ovnsb_idl) {
- if (!strcmp(chassis_rec->name, ctx->chassis_id)) {
- break;
- }
- }
+ chassis_rec = get_chassis_by_name(ctx->ovnsb_idl, ctx->chassis_id);
/* xxx Need to support more than one encap. Also need to support
* xxx encap options. */
const struct sbrec_chassis *chassis_rec;
struct ovsdb_idl_txn *txn;
- SBREC_CHASSIS_FOR_EACH(chassis_rec, ctx->ovnsb_idl) {
- if (!strcmp(chassis_rec->name, ctx->chassis_id)) {
- break;
- }
- }
-
+ chassis_rec = get_chassis_by_name(ctx->ovnsb_idl, ctx->chassis_id);
if (!chassis_rec) {
break;
}
#ifndef OVN_CONTROLLER_H
#define OVN_CONTROLLER_H 1
+#include "ovn/lib/ovn-sb-idl.h"
+
struct controller_ctx {
char *chassis_id; /* ID for this chassis. */
char *br_int_name; /* Name of local integration bridge. */
const struct ovsrec_bridge *br_int;
};
+static inline const struct sbrec_chassis *
+get_chassis_by_name(struct ovsdb_idl *ovnsb_idl, char *chassis_id)
+{
+ const struct sbrec_chassis *chassis_rec;
+
+ SBREC_CHASSIS_FOR_EACH(chassis_rec, ovnsb_idl) {
+ if (!strcmp(chassis_rec->name, chassis_id)) {
+ break;
+ }
+ }
+
+ return chassis_rec;
+}
+
#endif /* ovn/ovn-controller.h */