@@ -44,41 +44,17 @@ chassis_register_ovs_idl(struct ovsdb_idl *ovs_idl)
}
static const char *
-pop_tunnel_name(uint32_t *type)
-{
- if (*type & GENEVE) {
- *type &= ~GENEVE;
- return "geneve";
- } else if (*type & STT) {
- *type &= ~STT;
- return "stt";
- } else if (*type & VXLAN) {
- *type &= ~VXLAN;
- return "vxlan";
- }
-
- OVS_NOT_REACHED();
-}
-
-static const char *
get_bridge_mappings(const struct smap *ext_ids)
{
return smap_get_def(ext_ids, "ovn-bridge-mappings", "");
}
-/* Returns this chassis's Chassis record, if it is available and is currently
- * amenable to a transaction. */
+/* Returns this chassis's Chassis record */
const struct sbrec_chassis *
chassis_run(struct controller_ctx *ctx, const char *chassis_id,
const struct ovsrec_bridge *br_int)
{
- if (!ctx->ovnsb_idl_txn) {
- return NULL;
- }
-
const struct ovsrec_open_vswitch *cfg;
- const char *encap_type, *encap_ip;
- static bool inited = false;
cfg = ovsrec_open_vswitch_first(ctx->ovs_idl);
if (!cfg) {
@@ -86,147 +62,68 @@ chassis_run(struct controller_ctx *ctx, const char *chassis_id,
return NULL;
}
- encap_type = smap_get(&cfg->external_ids, "ovn-encap-type");
- encap_ip = smap_get(&cfg->external_ids, "ovn-encap-ip");
- if (!encap_type || !encap_ip) {
- VLOG_INFO("Need to specify an encap type and ip");
+ const struct sbrec_chassis *chassis_rec
+ = get_chassis(ctx->ovnsb_idl, chassis_id);
+
+ if (!chassis_rec) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_WARN_RL(&rl, "No chassis row defined for chassis '%s'.",
+ chassis_id);
return NULL;
}
- char *tokstr = xstrdup(encap_type);
- char *save_ptr = NULL;
- char *token;
- uint32_t req_tunnels = 0;
- for (token = strtok_r(tokstr, ",", &save_ptr); token != NULL;
- token = strtok_r(NULL, ",", &save_ptr)) {
- uint32_t type = get_tunnel_type(token);
- if (!type) {
- VLOG_INFO("Unknown tunnel type: %s", token);
- }
- req_tunnels |= type;
+ uint32_t cur_tunnels = 0;
+ for (int i = 0; i < chassis_rec->n_encaps; i++) {
+ cur_tunnels |= get_tunnel_type(chassis_rec->encaps[i]->type);
}
- free(tokstr);
- const char *hostname = smap_get_def(&cfg->external_ids, "hostname", "");
- char hostname_[HOST_NAME_MAX + 1];
- if (!hostname[0]) {
- if (gethostname(hostname_, sizeof hostname_)) {
- hostname_[0] = '\0';
- }
- hostname = hostname_;
+ if (!cur_tunnels) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_WARN_RL(&rl, "Invalid or no encap params for chassis '%s'.",
+ chassis_id);
+ return NULL;
}
- const char *bridge_mappings = get_bridge_mappings(&cfg->external_ids);
- const char *datapath_type =
- br_int && br_int->datapath_type ? br_int->datapath_type : "";
-
- struct ds iface_types = DS_EMPTY_INITIALIZER;
- ds_put_cstr(&iface_types, "");
- for (int j = 0; j < cfg->n_iface_types; j++) {
- ds_put_format(&iface_types, "%s,", cfg->iface_types[j]);
+ if (!chassis_rec->hostname[0]) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_WARN_RL(&rl, "No hostname defined for chassis '%s'.",
+ chassis_id);
+ return NULL;
}
- ds_chomp(&iface_types, ',');
- const char *iface_types_str = ds_cstr(&iface_types);
-
- const struct sbrec_chassis *chassis_rec
- = get_chassis(ctx->ovnsb_idl, chassis_id);
-
- if (chassis_rec) {
- if (strcmp(hostname, chassis_rec->hostname)) {
- sbrec_chassis_set_hostname(chassis_rec, hostname);
- }
-
- /* Determine new values for Chassis external-ids. */
- const char *chassis_bridge_mappings
- = get_bridge_mappings(&chassis_rec->external_ids);
- const char *chassis_datapath_type
- = smap_get_def(&chassis_rec->external_ids, "datapath-type", "");
- const char *chassis_iface_types
- = smap_get_def(&chassis_rec->external_ids, "iface-types", "");
-
- /* If any of the external-ids should change, update them. */
- if (strcmp(bridge_mappings, chassis_bridge_mappings) ||
- strcmp(datapath_type, chassis_datapath_type) ||
- strcmp(iface_types_str, chassis_iface_types)) {
- struct smap new_ids;
- smap_clone(&new_ids, &chassis_rec->external_ids);
- smap_replace(&new_ids, "ovn-bridge-mappings", bridge_mappings);
- smap_replace(&new_ids, "datapath-type", datapath_type);
- smap_replace(&new_ids, "iface-types", iface_types_str);
- sbrec_chassis_verify_external_ids(chassis_rec);
- sbrec_chassis_set_external_ids(chassis_rec, &new_ids);
- smap_destroy(&new_ids);
- }
- /* Compare desired tunnels against those currently in the database. */
- uint32_t cur_tunnels = 0;
- bool same = true;
- for (int i = 0; i < chassis_rec->n_encaps; i++) {
- cur_tunnels |= get_tunnel_type(chassis_rec->encaps[i]->type);
- same = same && !strcmp(chassis_rec->encaps[i]->ip, encap_ip);
-
- same = same && smap_get_bool(&chassis_rec->encaps[i]->options,
- "csum", false);
- }
- same = same && req_tunnels == cur_tunnels;
-
- if (same) {
- /* Nothing changed. */
- inited = true;
- ds_destroy(&iface_types);
- return chassis_rec;
- } else if (!inited) {
- struct ds cur_encaps = DS_EMPTY_INITIALIZER;
- for (int i = 0; i < chassis_rec->n_encaps; i++) {
- ds_put_format(&cur_encaps, "%s,",
- chassis_rec->encaps[i]->type);
- }
- ds_chomp(&cur_encaps, ',');
-
- VLOG_WARN("Chassis config changing on startup, make sure "
- "multiple chassis are not configured : %s/%s->%s/%s",
- ds_cstr(&cur_encaps),
- chassis_rec->encaps[0]->ip,
- encap_type, encap_ip);
- ds_destroy(&cur_encaps);
+ const struct sbrec_chassis *cr;
+ SBREC_CHASSIS_FOR_EACH(cr, ctx->ovnsb_idl) {
+ if (strcmp(chassis_rec->name, cr->name) &&
+ !strcmp(chassis_rec->hostname, cr->hostname)) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_WARN_RL(&rl, "hostname defined for this chassis '%s' is "
+ "same as other chassis '%s'", chassis_id, cr->name);
+ return NULL;
}
}
- ovsdb_idl_txn_add_comment(ctx->ovnsb_idl_txn,
- "ovn-controller: registering chassis '%s'",
- chassis_id);
-
- if (!chassis_rec) {
- struct smap ext_ids = SMAP_INITIALIZER(&ext_ids);
- smap_add(&ext_ids, "ovn-bridge-mappings", bridge_mappings);
- smap_add(&ext_ids, "datapath-type", datapath_type);
- smap_add(&ext_ids, "iface-types", iface_types_str);
- chassis_rec = sbrec_chassis_insert(ctx->ovnsb_idl_txn);
- sbrec_chassis_set_name(chassis_rec, chassis_id);
- sbrec_chassis_set_hostname(chassis_rec, hostname);
- sbrec_chassis_set_external_ids(chassis_rec, &ext_ids);
- smap_destroy(&ext_ids);
- }
-
- ds_destroy(&iface_types);
- int n_encaps = count_1bits(req_tunnels);
- struct sbrec_encap **encaps = xmalloc(n_encaps * sizeof *encaps);
- const struct smap options = SMAP_CONST1(&options, "csum", "true");
-
- for (int i = 0; i < n_encaps; i++) {
- const char *type = pop_tunnel_name(&req_tunnels);
+ const char *bridge_mappings = get_bridge_mappings(&cfg->external_ids);
+ const char *datapath_type =
+ br_int && br_int->datapath_type ? br_int->datapath_type : "";
- encaps[i] = sbrec_encap_insert(ctx->ovnsb_idl_txn);
+ const char *chassis_bridge_mappings
+ = get_bridge_mappings(&chassis_rec->external_ids);
+ const char *chassis_datapath_type
+ = smap_get_def(&chassis_rec->external_ids, "datapath-type", "");
- sbrec_encap_set_type(encaps[i], type);
- sbrec_encap_set_ip(encaps[i], encap_ip);
- sbrec_encap_set_options(encaps[i], &options);
+ if (strcmp(bridge_mappings, chassis_bridge_mappings)) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_WARN_RL(&rl, "bridge_mappings configuration mismatch. Defined -,"
+ " %s, Expected - %s", chassis_bridge_mappings,
+ bridge_mappings);
}
- sbrec_chassis_set_encaps(chassis_rec, encaps, n_encaps);
- free(encaps);
+ if (strcmp(datapath_type, chassis_datapath_type)) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_WARN_RL(&rl, "datapath_type configuration mismatch. Defined - %s,"
+ " Expected - %s", chassis_datapath_type, datapath_type);
+ }
- inited = true;
return chassis_rec;
}
@@ -75,12 +75,6 @@
table of the local OVS instance:
</p>
<dl>
- <dt><code>external_ids:system-id</code></dt>
- <dd>The chassis name to use in the Chassis table.</dd>
-
- <dt><code>external_ids:hostname</code></dt>
- <dd>The hostname to use in the Chassis table.</dd>
-
<dt><code>external_ids:ovn-bridge</code></dt>
<dd>
The integration bridge to which logical ports are attached. The
@@ -117,36 +111,6 @@
</p>
</dd>
- <dt><code>external_ids:ovn-encap-type</code></dt>
- <dd>
- <p>
- The encapsulation type that a chassis should use to connect to
- this node. Multiple encapsulation types may be specified with
- a comma-separated list. Each listed encapsulation type will
- be paired with <code>ovn-encap-ip</code>.
- </p>
-
- <p>
- Supported tunnel types for connecting hypervisors
- are <code>geneve</code> and <code>stt</code>. Gateways may
- use <code>geneve</code>, <code>vxlan</code>, or
- <code>stt</code>.
- </p>
-
- <p>
- Due to the limited amount of metadata in <code>vxlan</code>,
- the capabilities and performance of connected gateways will be
- reduced versus other tunnel formats.
- </p>
- </dd>
-
- <dt><code>external_ids:ovn-encap-ip</code></dt>
- <dd>
- The IP address that a chassis should use to connect to this node
- using encapsulation types specified by
- <code>external_ids:ovn-encap-type</code>.
- </dd>
-
<dt><code>external_ids:ovn-bridge-mappings</code></dt>
<dd>
A list of key-value pairs that map a physical network name to a local
@@ -156,30 +120,6 @@
</dd>
</dl>
- <p>
- <code>ovn-controller</code> reads the following values from the
- <code>Open_vSwitch</code> database of the local OVS instance:
- </p>
-
- <dl>
- <dt><code>datapath-type</code> from <ref table="Bridge" db="Open_vSwitch"/> table</dt>
- <dd>
- This value is read from local OVS integration bridge row of
- <ref table="Bridge" db="Open_vSwitch"/> table and populated in
- <ref key="datapath-type" table="Chassis" column="external_ids"
- db="OVN_Southbound"/> of the <ref table="Chassis" db="OVN_Southbound"/>
- table in the OVN_Southbound database.
- </dd>
-
- <dt><code>iface-types</code> from <ref table="Open_vSwitch" db="Open_vSwitch"/> table</dt>
- <dd>
- This value is populated in <ref key="iface-types" table="Chassis"
- column="external_ids" db="OVN_Southbound"/> of the
- <ref table="Chassis" db="OVN_Southbound"/> table in the OVN_Southbound
- database.
- </dd>
- </dl>
-
<h1>Open vSwitch Database Usage</h1>
<p>
@@ -175,36 +175,33 @@
<table name="Chassis" title="Physical Network Hypervisor and Gateway Information">
<p>
Each row in this table represents a hypervisor or gateway (a chassis) in
- the physical network (PN). Each chassis, via
- <code>ovn-controller</code>/<code>ovn-controller-vtep</code>, adds
- and updates its own row, and keeps a copy of the remaining rows to
- determine how to reach other hypervisors.
+ the physical network (PN). <code>ovn-controller</code> running on each
+ chassis expects the row pertaining to it to be added by an
+ Administrator. Unless <code>ovn-controller</code> finds its row
+ in this table, it will not translate the logical flows to OF flows.
+ <code>ovn-controller-vtep</code>, adds
+ and updates its own row. Each chassis keeps a copy of the remaining rows
+ to determine how to reach other hypervisors.
</p>
<p>
- When a chassis shuts down gracefully, it should remove its own row.
- (This is not critical because resources hosted on the chassis are equally
- unreachable regardless of whether the row is present.) If a chassis
- shuts down permanently without removing its row, some kind of manual or
- automatic cleanup is eventually needed; we can devise a process for that
- as necessary.
+ When a chassis shuts down gracefully, Administrator should remove
+ the corresponding row. (This is not critical because resources hosted on
+ the chassis are equally unreachable regardless of whether the row is
+ present.).
</p>
<column name="name">
OVN does not prescribe a particular format for chassis names.
- ovn-controller populates this column using <ref key="system-id"
- table="Open_vSwitch" column="external_ids" db="Open_vSwitch"/>
- in the Open_vSwitch database's <ref table="Open_vSwitch"
- db="Open_vSwitch"/> table. ovn-controller-vtep populates this
- column with <ref table="Physical_Switch" column="name"
- db="hardware_vtep"/> in the hardware_vtep database's
+ ovn-controller-vtep populates this column with
+ <ref table="Physical_Switch" column="name" db="hardware_vtep"/> in the
+ hardware_vtep database's
<ref table="Physical_Switch" db="hardware_vtep"/> table.
</column>
<column name="hostname">
- The hostname of the chassis, if applicable. ovn-controller will populate
- this column with the hostname of the host it is running on.
- ovn-controller-vtep will leave this column empty.
+ The hostname of the chassis, if applicable. ovn-controller-vtep will
+ leave this column empty.
</column>
<column name="nb_cfg">
@@ -215,26 +212,28 @@
</column>
<column name="external_ids" key="ovn-bridge-mappings">
- <code>ovn-controller</code> populates this key with the set of bridge
- mappings it has been configured to use. Other applications should treat
- this key as read-only. See <code>ovn-controller</code>(8) for more
- information.
+ <code>ovn-controller</code> expects this key to be populated with the set
+ of bridge mappings it has been configured to use. Other applications
+ could read this value to know the bridge mappings configued on this
+ chassis.
</column>
<column name="external_ids" key="datapath-type">
- <code>ovn-controller</code> populates this key with the datapath type
- configured in the <ref table="Bridge" column="datapath_type"/> column of
- the Open_vSwitch database's <ref table="Bridge" db="Open_vSwitch"/>
- table. Other applications should treat this key as read-only. See
- <code>ovn-controller</code>(8) for more information.
+ <code>ovn-controller</code> expects this key to be populated with the
+ datapath type configured in the
+ <ref table="Bridge" column="datapath_type"/> column of the Open_vSwitch
+ database's <ref table="Bridge" db="Open_vSwitch"/>
+ table. Other applications could read this value to know the datapath
+ type supported by this chassis.
</column>
<column name="external_ids" key="iface-types">
- <code>ovn-controller</code> populates this key with the interface types
- configured in the <ref table="Open_vSwitch" column="iface_types"/> column
- of the Open_vSwitch database's <ref table="Open_vSwitch"
- db="Open_vSwitch"/> table. Other applications should treat this key as
- read-only. See <code>ovn-controller</code>(8) for more information.
+ <code>ovn-controller</code> expects this key to be populated with the
+ interface types configured in the
+ <ref table="Open_vSwitch" column="iface_types"/> column of the
+ Open_vSwitch database's <ref table="Open_vSwitch"
+ db="Open_vSwitch"/> table. Other applications could read this value to
+ know the interface types supported by this chassis.
</column>
<group title="Common Columns">
@@ -295,9 +295,10 @@ General commands:\n\
show print overview of database contents\n\
\n\
Chassis commands:\n\
- chassis-add CHASSIS ENCAP-TYPE ENCAP-IP create a new chassis named\n\
- CHASSIS with ENCAP-TYPE tunnels\n\
- and ENCAP-IP\n\
+ chassis-add CHASSIS ENCAP-TYPE ENCAP-IP [HOSTNAME] create a new chassis\n\
+ named CHASSIS with\n\
+ ENCAP-TYPE tunnels and\n\
+ ENCAP-IP\n\
chassis-del CHASSIS delete CHASSIS and all of its encaps\n\
and gateway_ports\n\
\n\
@@ -563,7 +564,9 @@ cmd_chassis_add(struct ctl_context *ctx)
sbrec_chassis_set_name(ch, ch_name);
sbrec_chassis_set_encaps(ch, encaps, n_encaps);
free(encaps);
-
+ if (ctx->argc == 5) {
+ sbrec_chassis_set_hostname(ch, ctx->argv[4]);
+ }
sbctl_context_invalidate_cache(ctx);
}
@@ -1027,8 +1030,8 @@ static const struct ctl_command_syntax sbctl_commands[] = {
{ "init", 0, 0, "", NULL, sbctl_init, NULL, "", RW },
/* Chassis commands. */
- {"chassis-add", 3, 3, "CHASSIS ENCAP-TYPE ENCAP-IP", pre_get_info,
- cmd_chassis_add, NULL, "--may-exist", RW},
+ {"chassis-add", 3, 4, "CHASSIS ENCAP-TYPE ENCAP-IP [HOSTNAME]",
+ pre_get_info, cmd_chassis_add, NULL, "--may-exist", RW},
{"chassis-del", 1, 1, "CHASSIS", pre_get_info, cmd_chassis_del, NULL,
"--if-exists", RW},
@@ -258,6 +258,7 @@ ovn_attach() {
-- add-br br-int \
-- set bridge br-int fail-mode=secure other-config:disable-in-band=true \
|| return 1
+ ovn-sbctl chassis-add $sandbox geneve,vxlan $ip $sandbox
start_daemon ovn-controller || return 1
}
@@ -47,14 +47,12 @@ patch
}
# Make sure that the configured bridge mappings in the Open_vSwitch db
-# is mirrored into the Chassis record in the OVN_Southbound db.
+# is not mirrored into the Chassis record in the OVN_Southbound db as
+# ovn-controller doesn't write to the SB DB.
check_bridge_mappings () {
- local_mappings=$1
sysid=$(ovs-vsctl get Open_vSwitch . external_ids:system-id)
chassis_mappings=$(ovn-sbctl get Chassis ${sysid} external_ids:ovn-bridge-mappings | sed -e 's/\"//g')
- echo $local_mappings
- echo $chassis_mappings
- AT_CHECK([test "${local_mappings}" = "${chassis_mappings}"])
+ AT_CHECK([test "${chassis_mappings}" = ""])
}
# Initially there should be no patch ports.
@@ -129,6 +127,9 @@ on_exit 'kill `cat $ovs_base/ovn-sb/ovsdb-server-2.pid`'
ovsdb-tool create $ovs_base/ovn-sb/ovn-sb1.db "$abs_top_srcdir"/ovn/ovn-sb.ovsschema
as ovn-sb ovsdb-server --detach --pidfile=$ovs_base/ovn-sb/ovsdb-server-2.pid --remote=punix:$ovs_base/ovn-sb/ovn-sb1.sock $ovs_base/ovn-sb/ovn-sb1.db \
--unixctl=$ovs_base/ovn-sb/ovsdb-server-2.ctl
+ovn-sbctl --db=unix:$ovs_base/ovn-sb/ovn-sb1.sock init
+ovn-sbctl --db=unix:$ovs_base/ovn-sb/ovn-sb1.sock chassis-add hv geneve,vxlan 127.0.0.1 hv
+
AT_CHECK([ovs-vsctl -- set Open_vSwitch . external-ids:ovn-remote=unix:$ovs_base/ovn-sb/ovn-sb1.sock])
check_patches
AT_CHECK([ovs-vsctl -- set Open_vSwitch . external-ids:ovn-remote=unix:$ovs_base/ovn-sb/ovn-sb.sock])
@@ -152,8 +153,9 @@ OVS_APP_EXIT_AND_WAIT([ovsdb-server])
AT_CLEANUP
-# Checks that ovn-controller populates datapath-type and iface-types
-# correctly in the Chassis external-ids column.
+# Checks that ovn-controller doesn't populates datapath-type and iface-types
+# in the Chassis external-ids column on its own as it cannot write to the
+# SB DB
AT_SETUP([ovn-controller - Chassis external_ids])
AT_KEYWORDS([ovn])
ovn_init_db ovn-sb
@@ -171,40 +173,39 @@ ovn_attach n1 br-phys 192.168.0.1
sysid=$(ovs-vsctl get Open_vSwitch . external_ids:system-id)
# Make sure that the datapath_type set in the Bridge table
-# is mirrored into the Chassis record in the OVN_Southbound db.
+# is not mirrored into the Chassis record in the OVN_Southbound db.
check_datapath_type () {
- datapath_type=$1
chassis_datapath_type=$(ovn-sbctl get Chassis ${sysid} external_ids:datapath-type | sed -e 's/"//g') #"
- test "${datapath_type}" = "${chassis_datapath_type}"
+ test "${datapath_type}" = ""
}
-OVS_WAIT_UNTIL([check_datapath_type ""])
+OVS_WAIT_UNTIL([check_datapath_type])
ovs-vsctl set Bridge br-int datapath-type=foo
-OVS_WAIT_UNTIL([check_datapath_type foo])
+OVS_WAIT_UNTIL([check_datapath_type])
# Change "ovn-bridge-mappings" value. It should not change the "datapath-type".
ovs-vsctl set Open_vSwitch . external_ids:ovn-bridge-mappings=foo-mapping
check_datapath_type foo
ovs-vsctl set Bridge br-int datapath-type=bar
-OVS_WAIT_UNTIL([check_datapath_type bar])
+OVS_WAIT_UNTIL([check_datapath_type])
ovs-vsctl set Bridge br-int datapath-type=\"\"
-OVS_WAIT_UNTIL([check_datapath_type ""])
+OVS_WAIT_UNTIL([check_datapath_type])
expected_iface_types=$(ovs-vsctl get Open_vSwitch . iface_types|sed 's/[[]][[ ]]//g')
chassis_iface_types=$(ovn-sbctl get Chassis ${sysid} external_ids:iface-types | sed -e 's/\"//g')
echo "chassis_iface_types = ${chassis_iface_types}"
-AT_CHECK([test "${expected_iface_types}" = "${chassis_iface_types}"])
+AT_CHECK([test "${expected_iface_types}" != "${chassis_iface_types}"])
# Change the value of external_ids:iface-types using ovn-sbctl.
-# ovn-controller should again set it back to proper one.
+# ovn-controller should not modify it.
ovn-sbctl set Chassis ${sysid} external_ids:iface-types="foo"
OVS_WAIT_UNTIL([
chassis_iface_types=$(ovn-sbctl get Chassis ${sysid} external_ids:iface-types | sed -e 's/\"//g')
echo "chassis_iface_types = ${chassis_iface_types}"
- test "${expected_iface_types}" = "${chassis_iface_types}"
+ test "${expected_iface_types}" != "${chassis_iface_types}"
])
# Gracefully terminate daemons
@@ -369,6 +369,7 @@ if $ovn; then
ovs-vsctl set open . external-ids:ovn-remote=unix:"$sandbox"/ovnsb_db.sock
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
ovs-vsctl set open . external-ids:ovn-encap-ip=127.0.0.1
+ ovn-sbctl chassis-add 56b18105-5706-46ef-80c4-ff20979ab068 geneve,vxlan 127.0.0.1 sandbox
ovn-nbctl init
ovn-sbctl init
With this patch ovn-controller will not create a chassis row in the OVN SB DB and will not modify the Chassis table row for the chassis. Instead it expects the chassis row to be created externally. Signed-off-by: Numan Siddique <nusiddiq@redhat.com> --- ovn/controller/chassis.c | 195 +++++++++--------------------------- ovn/controller/ovn-controller.8.xml | 60 ----------- ovn/ovn-sb.xml | 65 ++++++------ ovn/utilities/ovn-sbctl.c | 15 +-- tests/ofproto-macros.at | 1 + tests/ovn-controller.at | 35 +++---- tutorial/ovs-sandbox | 1 + 7 files changed, 107 insertions(+), 265 deletions(-)