Add a new command that will create localnet port on specified LS.
The localnet port will have proper type, network_name and addresses
set.

Add a new command that will create router port on specified LS.
The router port will have proper type, router-port and addresses
set.

Reported-at: https://issues.redhat.com/browse/FDP-1838
Reported-at: https://issues.redhat.com/browse/FDP-1839
Suggested-by: Dumitru Ceara <[email protected]>
Signed-off-by: Ales Musil <[email protected]>

ovn-nbctl: Add new command called lsp-add-localnet.

Add a new command that will create localnet port on specified LS.
The localnet port will have proper type, network_name and addresses
set.

Reported-at: https://issues.redhat.com/browse/FDP-1839
Signed-off-by: Ales Musil <[email protected]>
---
 NEWS                  |   4 ++
 tests/ovn-nbctl.at    |  92 ++++++++++++++++++++++++++++++++++++
 utilities/ovn-nbctl.c | 106 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 202 insertions(+)

diff --git a/NEWS b/NEWS
index fb4d63194..3ef43bca3 100644
--- a/NEWS
+++ b/NEWS
@@ -44,6 +44,10 @@ Post v25.09.0
        function and the chassis hosting the port where the ACL is being
        enforced). Proper MTU needs to be configured to accomodate this
        encapsulation.
+   - Add ovn-nbctl ls-add-router-port which will create router port on
+     specified LS.
+   - Add ovn-nbctl ls-add-localnet-port which will create localnet port on
+     specified LS.
 
 OVN v25.09.0 - xxx xx xxxx
 --------------------------
diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
index 266789417..8cd9919a6 100644
--- a/tests/ovn-nbctl.at
+++ b/tests/ovn-nbctl.at
@@ -3335,3 +3335,95 @@ AT_CHECK([ovn-nbctl nf-list | uuidfilt], [0], [dnl
 AT_CHECK([ovn-nbctl nf-del nf2])
 AT_CHECK([ovn-nbctl nf-list | uuidfilt], [0], [])
 ])
+
+dnl ---------------------------------------------------------------------
+
+OVN_NBCTL_TEST([ls_add_router_port], [Add router port], [
+AT_CHECK([ovn-nbctl ls-add-router-port ls ls-lr lr-ls], [1], [],
+  [ovn-nbctl: ls: switch name not found
+])
+
+check ovn-nbctl ls-add ls
+ovn-nbctl ls-add-router-port ls ls-lr lr-ls
+check_row_count nb:Logical_Switch_Port 1 addresses=[[router]] 
options:router-port="lr-ls"
+AT_CHECK([ovn-nbctl show | uuidfilt], [0], [dnl
+switch <0> (ls)
+    port ls-lr
+        type: router
+        router-port: lr-ls
+])
+
+check ovn-nbctl lsp-del ls-lr
+
+check ovn-nbctl ls-add ls1
+check ovn-nbctl lsp-add ls1 ls-lr
+
+AT_CHECK([ovn-nbctl ls-add-router-port ls ls-lr lr-ls], [1], [],
+  [ovn-nbctl: ls-lr: a port with this name already exists
+])
+
+AT_CHECK([ovn-nbctl --may-exist ls-add-router-port ls ls-lr lr-ls], [1], [],
+  [ovn-nbctl: ls-lr: a port already exists but in switch ls1
+])
+
+check ovn-nbctl lsp-del ls-lr
+check ovn-nbctl lsp-add ls ls-lr -- lsp-set-options ls-lr router-port=lr-ls2
+
+AT_CHECK([ovn-nbctl --may-exist ls-add-router-port ls ls-lr lr-ls], [1], [],
+  [ovn-nbctl: ls-lr: a port already exists but with different type ""
+])
+
+check ovn-nbctl lsp-set-type ls-lr router
+AT_CHECK([ovn-nbctl --may-exist ls-add-router-port ls ls-lr lr-ls], [1], [],
+  [ovn-nbctl: ls-lr: a port already exists but with different router-port 
"lr-ls2"
+])
+
+check ovn-nbctl lsp-set-options ls-lr router-port=lr-ls
+check ovn-nbctl --may-exist ls-add-router-port ls ls-lr lr-ls
+])
+
+dnl ---------------------------------------------------------------------
+
+OVN_NBCTL_TEST([ls_add_localnet_port], [Add localnet port], [
+AT_CHECK([ovn-nbctl ls-add-localnet-port ls ln_port net1], [1], [],
+  [ovn-nbctl: ls: switch name not found
+])
+
+check ovn-nbctl ls-add ls
+check ovn-nbctl ls-add-localnet-port ls ln_port net1
+check_row_count nb:Logical_Switch_Port 1 addresses=[[unknown]] 
options:network_name="net1"
+AT_CHECK([ovn-nbctl show | uuidfilt], [0], [dnl
+switch <0> (ls)
+    port ln_port
+        type: localnet
+        addresses: [["unknown"]]
+])
+
+check ovn-nbctl lsp-del ln_port
+
+check ovn-nbctl ls-add ls1
+check ovn-nbctl lsp-add ls1 ln_port
+
+AT_CHECK([ovn-nbctl ls-add-localnet-port ls ln_port net1], [1], [],
+  [ovn-nbctl: ln_port: a port with this name already exists
+])
+
+AT_CHECK([ovn-nbctl --may-exist ls-add-localnet-port ls ln_port net1], [1], [],
+  [ovn-nbctl: ln_port: a port already exists but in switch ls1
+])
+
+check ovn-nbctl lsp-del ln_port
+check ovn-nbctl lsp-add ls ln_port -- lsp-set-options ln_port network_name=net2
+
+AT_CHECK([ovn-nbctl --may-exist ls-add-localnet-port ls ln_port net1], [1], [],
+  [ovn-nbctl: ln_port: a port already exists but with different type ""
+])
+
+check ovn-nbctl lsp-set-type ln_port localnet
+AT_CHECK([ovn-nbctl --may-exist ls-add-localnet-port ls ln_port net1], [1], [],
+  [ovn-nbctl: ln_port: a port already exists but with different network_name 
"net2"
+])
+
+check ovn-nbctl lsp-set-options ln_port network_name=net1
+check ovn-nbctl --may-exist ls-add-localnet-port ls ln_port net1
+])
diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
index 058ad8968..7d82bb9bd 100644
--- a/utilities/ovn-nbctl.c
+++ b/utilities/ovn-nbctl.c
@@ -538,6 +538,15 @@ MAC_Binding commands:\n\
                                     Delete Static_MAC_Binding entry\n\
   static-mac-binding-list           List all Static_MAC_Binding entries\n\
 \n\
+\n\
+Miscellaneous commands:\n\
+  ls-add-route-port LS PORT LRP_PEER\n\
+                                    Create LSP of type router with\n\
+                                    router-port set to LRP_PEER\n\
+  lsp-add-localnet-port LS PORT NETWORK\n\
+                                    Create LSP of type localnet with\n\
+                                    network_name set to NETWORK\n\
+\n\
 %s\
 %s\
 \n\
@@ -8680,6 +8689,95 @@ nbctl_mirror_list(struct ctl_context *ctx)
     vector_destroy(&mirrors);
 }
 
+static void
+nbctl_pre_ls_add_misc_port(struct ctl_context *ctx)
+{
+    nbctl_pre_context(ctx);
+
+    ovsdb_idl_add_column(ctx->idl, &nbrec_logical_switch_port_col_type);
+    ovsdb_idl_add_column(ctx->idl, &nbrec_logical_switch_port_col_options);
+    ovsdb_idl_add_column(ctx->idl, &nbrec_logical_switch_port_col_addresses);
+}
+
+static void
+nbctl_ls_add_misc_port(struct ctl_context *ctx)
+{
+    struct nbctl_context *nbctx = nbctl_context_get(ctx);
+
+    bool may_exist = shash_find(&ctx->options, "--may-exist") != NULL;
+    bool router_port = !strcmp(ctx->argv[0], "ls-add-router-port");
+    const char *ls_name = ctx->argv[1];
+    const char *lsp_name = ctx->argv[2];
+    const char *option = ctx->argv[3];
+    const char *type = router_port ? "router" : "localnet";
+    const char *option_name = router_port ? "router-port" : "network_name";
+
+    const struct nbrec_logical_switch *ls;
+    ctx->error = ls_by_name_or_uuid(ctx, ls_name, true, &ls);
+    if (ctx->error) {
+        return;
+    }
+
+    const struct nbrec_logical_switch_port *lsp;
+    ctx->error = lsp_by_name_or_uuid(ctx, lsp_name, false, &lsp);
+    if (ctx->error) {
+        return;
+    }
+
+    if (lsp) {
+        if (!may_exist) {
+            ctl_error(ctx, "%s: a port with this name already exists",
+                      lsp_name);
+            return;
+        }
+
+        const struct nbrec_logical_switch *lsw;
+        ctx->error = lsp_to_ls(ctx, lsp, &lsw);
+        if (ctx->error) {
+            return;
+        }
+
+        if (lsw != ls) {
+            char uuid_s[UUID_LEN + 1];
+            ctl_error(ctx, "%s: a port already exists but in switch %s",
+                      lsp_name, ls_get_name(lsw, uuid_s, sizeof uuid_s));
+            return;
+        }
+
+        if (strcmp(lsp->type, type)) {
+            ctl_error(ctx, "%s: a port already exists but with different"
+                      " type \"%s\"", lsp_name, lsp->type);
+            return;
+        }
+
+        const char *lsp_option =
+            smap_get_def(&lsp->options, option_name, "");
+        if (strcmp(lsp_option, option)) {
+            ctl_error(ctx, "%s: a port already exists but with different"
+                      " %s \"%s\"", lsp_name, option_name, lsp_option);
+            return;
+        }
+
+        return;
+    }
+
+    lsp = nbrec_logical_switch_port_insert(ctx->txn);
+    nbrec_logical_switch_port_set_name(lsp, lsp_name);
+    nbrec_logical_switch_port_set_type(lsp, type);
+
+    const char *addresses[] = { router_port ? "router": "unknown" };
+    nbrec_logical_switch_port_set_addresses(lsp, addresses, 1);
+
+    struct smap options = SMAP_CONST1(&options, option_name, option);
+    nbrec_logical_switch_port_set_options(lsp, &options);
+
+    /* Insert the logical port into the logical switch. */
+    nbrec_logical_switch_update_ports_addvalue(ls, lsp);
+
+    /* Updating runtime cache. */
+    shash_add(&nbctx->lsp_to_ls_map, lsp_name, ls);
+}
+
 static const struct ctl_table_class tables[NBREC_N_TABLES] = {
     [NBREC_TABLE_DHCP_OPTIONS].row_ids
     = {{&nbrec_logical_switch_port_col_name, NULL,
@@ -9061,6 +9159,14 @@ static const struct ctl_command_syntax nbctl_commands[] 
= {
       nbctl_pre_static_mac_binding, nbctl_static_mac_binding_list, NULL,
       "", RO },
 
+    /* Misc command */
+    { "ls-add-router-port", 3, 3, "LOGICAL_SWITCH PORT LRP_PEER",
+      nbctl_pre_ls_add_misc_port, nbctl_ls_add_misc_port, NULL,
+      "--may-exist", RW },
+    { "ls-add-localnet-port", 3, 3, "LOGICAL_SWITCH PORT NETWORK",
+      nbctl_pre_ls_add_misc_port, nbctl_ls_add_misc_port, NULL,
+      "--may-exist", RW },
+
     {NULL, 0, 0, NULL, NULL, NULL, NULL, "", RO},
 };
 
-- 
2.51.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to