get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/810805/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 810805,
    "url": "http://patchwork.ozlabs.org/api/patches/810805/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/20170906210839.26091-5-mmichels@redhat.com/",
    "project": {
        "id": 47,
        "url": "http://patchwork.ozlabs.org/api/projects/47/?format=api",
        "name": "Open vSwitch",
        "link_name": "openvswitch",
        "list_id": "ovs-dev.openvswitch.org",
        "list_email": "ovs-dev@openvswitch.org",
        "web_url": "http://openvswitch.org/",
        "scm_url": "git@github.com:openvswitch/ovs.git",
        "webscm_url": "https://github.com/openvswitch/ovs",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20170906210839.26091-5-mmichels@redhat.com>",
    "list_archive_url": null,
    "date": "2017-09-06T21:08:39",
    "name": "[ovs-dev,4/4] ovn: Add IPv6 capability to ovn-nbctl lb-add",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "5e0a132224a70c11b0424a65dff14112d472b964",
    "submitter": {
        "id": 71978,
        "url": "http://patchwork.ozlabs.org/api/people/71978/?format=api",
        "name": "Mark Michelson",
        "email": "mmichels@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/20170906210839.26091-5-mmichels@redhat.com/mbox/",
    "series": [
        {
            "id": 1883,
            "url": "http://patchwork.ozlabs.org/api/series/1883/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/openvswitch/list/?series=1883",
            "date": "2017-09-06T21:08:35",
            "name": "ovn: Add support for IPv6 load balancers",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/1883/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/810805/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/810805/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ovs-dev-bounces@openvswitch.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "dev@openvswitch.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "ovs-dev@mail.linuxfoundation.org"
        ],
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=openvswitch.org\n\t(client-ip=140.211.169.12; helo=mail.linuxfoundation.org;\n\tenvelope-from=ovs-dev-bounces@openvswitch.org;\n\treceiver=<UNKNOWN>)",
            "ext-mx10.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com",
            "ext-mx10.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=mmichels@redhat.com"
        ],
        "Received": [
            "from mail.linuxfoundation.org (mail.linuxfoundation.org\n\t[140.211.169.12])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xnbqk4CHYz9t2r\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu,  7 Sep 2017 07:11:46 +1000 (AEST)",
            "from mail.linux-foundation.org (localhost [127.0.0.1])\n\tby mail.linuxfoundation.org (Postfix) with ESMTP id 66250BAD;\n\tWed,  6 Sep 2017 21:08:49 +0000 (UTC)",
            "from smtp1.linuxfoundation.org (smtp1.linux-foundation.org\n\t[172.17.192.35])\n\tby mail.linuxfoundation.org (Postfix) with ESMTPS id 834D3B9F\n\tfor <dev@openvswitch.org>; Wed,  6 Sep 2017 21:08:47 +0000 (UTC)",
            "from mx1.redhat.com (mx1.redhat.com [209.132.183.28])\n\tby smtp1.linuxfoundation.org (Postfix) with ESMTPS id 8A3AE48F\n\tfor <dev@openvswitch.org>; Wed,  6 Sep 2017 21:08:45 +0000 (UTC)",
            "from smtp.corp.redhat.com\n\t(int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 14BF65F7AE\n\tfor <dev@openvswitch.org>; Wed,  6 Sep 2017 21:08:45 +0000 (UTC)",
            "from monae.redhat.com (ovpn-121-224.rdu2.redhat.com\n\t[10.10.121.224])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 3A63D17C6F\n\tfor <dev@openvswitch.org>; Wed,  6 Sep 2017 21:08:44 +0000 (UTC)"
        ],
        "X-Greylist": [
            "domain auto-whitelisted by SQLgrey-1.7.6",
            "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.39]);\n\tWed, 06 Sep 2017 21:08:45 +0000 (UTC)"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 14BF65F7AE",
        "From": "Mark Michelson <mmichels@redhat.com>",
        "To": "dev@openvswitch.org",
        "Date": "Wed,  6 Sep 2017 16:08:39 -0500",
        "Message-Id": "<20170906210839.26091-5-mmichels@redhat.com>",
        "In-Reply-To": "<20170906210839.26091-1-mmichels@redhat.com>",
        "References": "<20170906210839.26091-1-mmichels@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.14",
        "X-Spam-Status": "No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI,\n\tRP_MATCHES_RCVD autolearn=disabled version=3.3.1",
        "X-Spam-Checker-Version": "SpamAssassin 3.3.1 (2010-03-16) on\n\tsmtp1.linux-foundation.org",
        "Subject": "[ovs-dev] [PATCH 4/4] ovn: Add IPv6 capability to ovn-nbctl lb-add",
        "X-BeenThere": "ovs-dev@openvswitch.org",
        "X-Mailman-Version": "2.1.12",
        "Precedence": "list",
        "List-Id": "<ovs-dev.openvswitch.org>",
        "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n\t<mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>",
        "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>",
        "List-Post": "<mailto:ovs-dev@openvswitch.org>",
        "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>",
        "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n\t<mailto:ovs-dev-request@openvswitch.org?subject=subscribe>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Sender": "ovs-dev-bounces@openvswitch.org",
        "Errors-To": "ovs-dev-bounces@openvswitch.org"
    },
    "content": "ovn-nbctl will now accept IPv6 addresses for load balancer VIPs and\ndesetination addresses.\n\nIn addition, the ovn-nbctl lb-list, lr-lb-list, and ls-lb-list have been\nmodified to be able to fit IPv6 addresses on screen.\n\nSigned-off-by: Mark Michelson <mmichels@redhat.com>\n---\n ovn/utilities/ovn-nbctl.c | 175 +++++++++++++++------\n tests/ovn-nbctl.at        | 379 ++++++++++++++++++++++++++++++++++++++--------\n 2 files changed, 451 insertions(+), 103 deletions(-)",
    "diff": "diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c\nindex 46ede4e50..93e1bfc81 100644\n--- a/ovn/utilities/ovn-nbctl.c\n+++ b/ovn/utilities/ovn-nbctl.c\n@@ -1548,40 +1548,76 @@ nbctl_lb_add(struct ctl_context *ctx)\n         }\n     }\n \n-    ovs_be32 ipv4 = 0;\n-    ovs_be16 port = 0;\n-    char *error = ip_parse_port(lb_vip, &ipv4, &port);\n+    struct sockaddr_storage ss_vip;\n+    char *error;\n+    error = ipv46_parse(lb_vip, PORT_OPTIONAL, &ss_vip);\n     if (error) {\n         free(error);\n-        if (!ip_parse(lb_vip, &ipv4)) {\n-            ctl_fatal(\"%s: should be an IPv4 address (or an IPv4 address \"\n-                    \"and a port number with : as a separator).\", lb_vip);\n+        ctl_fatal(\"%s: should be an IP address (or an IP address \"\n+                  \"and a port number with : as a separator).\", lb_vip);\n+    }\n+\n+    char lb_vip_normalized[INET6_ADDRSTRLEN + 8];\n+    char normalized_ip[INET6_ADDRSTRLEN];\n+    if (ss_vip.ss_family == AF_INET) {\n+        struct sockaddr_in *sin = ALIGNED_CAST(struct sockaddr_in *, &ss_vip);\n+        inet_ntop(AF_INET, &sin->sin_addr, normalized_ip,\n+                  sizeof normalized_ip);\n+        if (sin->sin_port) {\n+            is_vip_with_port = true;\n+            snprintf(lb_vip_normalized, sizeof lb_vip_normalized, \"%s:%d\",\n+                     normalized_ip, ntohs(sin->sin_port));\n+        } else {\n+            is_vip_with_port = false;\n+            ovs_strlcpy(lb_vip_normalized, normalized_ip,\n+                        sizeof lb_vip_normalized);\n         }\n-\n-        if (is_update_proto) {\n-            ctl_fatal(\"Protocol is unnecessary when no port of vip \"\n-                    \"is given.\");\n+    } else {\n+        struct sockaddr_in6 *sin6 = ALIGNED_CAST(struct sockaddr_in6 *,\n+                                                 &ss_vip);\n+        inet_ntop(AF_INET6, &sin6->sin6_addr, normalized_ip,\n+                  sizeof normalized_ip);\n+        if (sin6->sin6_port) {\n+            is_vip_with_port = true;\n+            snprintf(lb_vip_normalized, sizeof lb_vip_normalized, \"[%s]:%d\",\n+                     normalized_ip, ntohs(sin6->sin6_port));\n+        } else {\n+            is_vip_with_port = false;\n+            ovs_strlcpy(lb_vip_normalized, normalized_ip,\n+                        sizeof lb_vip_normalized);\n         }\n-        is_vip_with_port = false;\n+    }\n+\n+    if (!is_vip_with_port && is_update_proto) {\n+        ctl_fatal(\"Protocol is unnecessary when no port of vip \"\n+                  \"is given.\");\n     }\n \n     char *token = NULL, *save_ptr = NULL;\n     struct ds lb_ips_new = DS_EMPTY_INITIALIZER;\n     for (token = strtok_r(lb_ips, \",\", &save_ptr);\n             token != NULL; token = strtok_r(NULL, \",\", &save_ptr)) {\n-        if (is_vip_with_port) {\n-            error = ip_parse_port(token, &ipv4, &port);\n-            if (error) {\n-                free(error);\n-                ds_destroy(&lb_ips_new);\n-                ctl_fatal(\"%s: should be an IPv4 address and a port \"\n+        struct sockaddr_storage ss_dst;\n+\n+        error = ipv46_parse(token, is_vip_with_port\n+                ? PORT_REQUIRED\n+                : PORT_FORBIDDEN,\n+                &ss_dst);\n+\n+        if (error) {\n+            free(error);\n+            if (is_vip_with_port) {\n+                ctl_fatal(\"%s: should be an IP address and a port \"\n                         \"number with : as a separator.\", token);\n+            } else {\n+                ctl_fatal(\"%s: should be an IP address.\", token);\n             }\n-        } else {\n-            if (!ip_parse(token, &ipv4)) {\n-                ds_destroy(&lb_ips_new);\n-                ctl_fatal(\"%s: should be an IPv4 address.\", token);\n-            }\n+        }\n+\n+        if (ss_vip.ss_family != ss_dst.ss_family) {\n+            ds_destroy(&lb_ips_new);\n+            ctl_fatal(\"%s: IP address family is different from VIP %s.\",\n+                    token, lb_vip_normalized);\n         }\n         ds_put_format(&lb_ips_new, \"%s%s\",\n                 lb_ips_new.length ? \",\" : \"\", token);\n@@ -1591,19 +1627,19 @@ nbctl_lb_add(struct ctl_context *ctx)\n     if (!add_duplicate) {\n         lb = lb_by_name_or_uuid(ctx, lb_name, false);\n         if (lb) {\n-            if (smap_get(&lb->vips, lb_vip)) {\n+            if (smap_get(&lb->vips, lb_vip_normalized)) {\n                 if (!may_exist) {\n                     ds_destroy(&lb_ips_new);\n                     ctl_fatal(\"%s: a load balancer with this vip (%s) \"\n-                            \"already exists\", lb_name, lb_vip);\n+                            \"already exists\", lb_name, lb_vip_normalized);\n                 }\n                 /* Update the vips. */\n                 smap_replace(CONST_CAST(struct smap *, &lb->vips),\n-                        lb_vip, ds_cstr(&lb_ips_new));\n+                        lb_vip_normalized, ds_cstr(&lb_ips_new));\n             } else {\n                 /* Add the new vips. */\n                 smap_add(CONST_CAST(struct smap *, &lb->vips),\n-                        lb_vip, ds_cstr(&lb_ips_new));\n+                        lb_vip_normalized, ds_cstr(&lb_ips_new));\n             }\n \n             /* Update the load balancer. */\n@@ -1623,7 +1659,7 @@ nbctl_lb_add(struct ctl_context *ctx)\n     nbrec_load_balancer_set_name(lb, lb_name);\n     nbrec_load_balancer_set_protocol(lb, lb_proto);\n     smap_add(CONST_CAST(struct smap *, &lb->vips),\n-            lb_vip, ds_cstr(&lb_ips_new));\n+            lb_vip_normalized, ds_cstr(&lb_ips_new));\n     nbrec_load_balancer_set_vips(lb, &lb->vips);\n     ds_destroy(&lb_ips_new);\n }\n@@ -1665,32 +1701,49 @@ nbctl_lb_del(struct ctl_context *ctx)\n \n static void\n lb_info_add_smap(const struct nbrec_load_balancer *lb,\n-                 struct smap *lbs)\n+                 struct smap *lbs, int vip_width)\n {\n     struct ds key = DS_EMPTY_INITIALIZER;\n     struct ds val = DS_EMPTY_INITIALIZER;\n     char *error, *protocol;\n-    ovs_be32 ipv4 = 0;\n-    ovs_be16 port = 0;\n \n     const struct smap_node **nodes = smap_sort(&lb->vips);\n     if (nodes) {\n         for (int i = 0; i < smap_count(&lb->vips); i++) {\n             const struct smap_node *node = nodes[i];\n             protocol = lb->protocol;\n-            error = ip_parse_port(node->key, &ipv4, &port);\n+\n+            struct sockaddr_storage ss;\n+            error = ipv46_parse(node->key, PORT_OPTIONAL, &ss);\n             if (error) {\n+                VLOG_WARN(\"%s\", error);\n                 free(error);\n-                protocol = \"tcp/udp\";\n+                continue;\n+            }\n+\n+            if (ss.ss_family == AF_INET) {\n+                struct sockaddr_in *sin = ALIGNED_CAST(struct sockaddr_in *,\n+                                                       &ss);\n+                if (!sin->sin_port) {\n+                    protocol = \"tcp/udp\";\n+                }\n+            } else {\n+                struct sockaddr_in6 *sin6 = ALIGNED_CAST(struct sockaddr_in6 *,\n+                                                         &ss);\n+                if (!sin6->sin6_port) {\n+                    protocol = \"tcp/udp\";\n+                }\n             }\n \n             i == 0 ? ds_put_format(&val,\n-                        UUID_FMT \"    %-20.16s%-11.7s%-25.21s%s\",\n+                        UUID_FMT \"    %-20.16s%-11.7s%-*.*s%s\",\n                         UUID_ARGS(&lb->header_.uuid),\n                         lb->name, protocol,\n+                        vip_width + 4, vip_width,\n                         node->key, node->value)\n-                   : ds_put_format(&val, \"\\n%60s%-11.7s%-25.21s%s\",\n+                   : ds_put_format(&val, \"\\n%60s%-11.7s%-*.*s%s\",\n                         \"\", protocol,\n+                        vip_width + 4, vip_width,\n                         node->key, node->value);\n         }\n \n@@ -1704,12 +1757,12 @@ lb_info_add_smap(const struct nbrec_load_balancer *lb,\n }\n \n static void\n-lb_info_print(struct ctl_context *ctx, struct smap *lbs)\n+lb_info_print(struct ctl_context *ctx, struct smap *lbs, int vip_width)\n {\n     const struct smap_node **nodes = smap_sort(lbs);\n     if (nodes) {\n-        ds_put_format(&ctx->output, \"%-40.36s%-20.16s%-11.7s%-25.21s%s\\n\",\n-                \"UUID\", \"LB\", \"PROTO\", \"VIP\", \"IPs\");\n+        ds_put_format(&ctx->output, \"%-40.36s%-20.16s%-11.7s%-*.*s%s\\n\",\n+                \"UUID\", \"LB\", \"PROTO\", vip_width + 4, vip_width, \"VIP\", \"IPs\");\n         for (size_t i = 0; i < smap_count(lbs); i++) {\n             const struct smap_node *node = nodes[i];\n             ds_put_format(&ctx->output, \"%s\\n\", node->value);\n@@ -1719,21 +1772,45 @@ lb_info_print(struct ctl_context *ctx, struct smap *lbs)\n     }\n }\n \n+static int\n+lb_get_max_vip_length(const struct nbrec_load_balancer *lb, int vip_width)\n+{\n+    const struct smap_node *node;\n+    int max_length = vip_width;\n+\n+    SMAP_FOR_EACH (node, &lb->vips) {\n+        size_t keylen = strlen(node->key);\n+        if (max_length < keylen) {\n+            max_length = keylen;\n+        }\n+    }\n+\n+    return max_length;\n+}\n+\n static void\n lb_info_list_all(struct ctl_context *ctx,\n                  const char *lb_name, bool lb_check)\n {\n     const struct nbrec_load_balancer *lb;\n     struct smap lbs = SMAP_INITIALIZER(&lbs);\n+    int vip_width = 0;\n+\n+    NBREC_LOAD_BALANCER_FOR_EACH (lb, ctx->idl) {\n+        if (lb_check && strcmp(lb->name, lb_name)) {\n+            continue;\n+        }\n+        vip_width = lb_get_max_vip_length(lb, vip_width);\n+    }\n \n     NBREC_LOAD_BALANCER_FOR_EACH(lb, ctx->idl) {\n         if (lb_check && strcmp(lb->name, lb_name)) {\n             continue;\n         }\n-        lb_info_add_smap(lb, &lbs);\n+        lb_info_add_smap(lb, &lbs, vip_width);\n     }\n \n-    lb_info_print(ctx, &lbs);\n+    lb_info_print(ctx, &lbs, vip_width);\n     smap_destroy(&lbs);\n }\n \n@@ -1832,15 +1909,21 @@ nbctl_lr_lb_list(struct ctl_context *ctx)\n     const char *lr_name = ctx->argv[1];\n     const struct nbrec_logical_router *lr;\n     struct smap lbs = SMAP_INITIALIZER(&lbs);\n+    int vip_width = 0;\n \n     lr = lr_by_name_or_uuid(ctx, lr_name, true);\n     for (int i = 0; i < lr->n_load_balancer; i++) {\n         const struct nbrec_load_balancer *lb\n             = lr->load_balancer[i];\n-        lb_info_add_smap(lb, &lbs);\n+        vip_width = lb_get_max_vip_length(lb, vip_width);\n+    }\n+    for (int i = 0; i < lr->n_load_balancer; i++) {\n+        const struct nbrec_load_balancer *lb\n+            = lr->load_balancer[i];\n+        lb_info_add_smap(lb, &lbs, vip_width);\n     }\n \n-    lb_info_print(ctx, &lbs);\n+    lb_info_print(ctx, &lbs, vip_width);\n     smap_destroy(&lbs);\n }\n \n@@ -1929,15 +2012,21 @@ nbctl_ls_lb_list(struct ctl_context *ctx)\n     const char *ls_name = ctx->argv[1];\n     const struct nbrec_logical_switch *ls;\n     struct smap lbs = SMAP_INITIALIZER(&lbs);\n+    int vip_width = 0;\n \n     ls = ls_by_name_or_uuid(ctx, ls_name, true);\n     for (int i = 0; i < ls->n_load_balancer; i++) {\n         const struct nbrec_load_balancer *lb\n             = ls->load_balancer[i];\n-        lb_info_add_smap(lb, &lbs);\n+        vip_width = lb_get_max_vip_length(lb, vip_width);\n+    }\n+    for (int i = 0; i < ls->n_load_balancer; i++) {\n+        const struct nbrec_load_balancer *lb\n+            = ls->load_balancer[i];\n+        lb_info_add_smap(lb, &lbs, vip_width);\n     }\n \n-    lb_info_print(ctx, &lbs);\n+    lb_info_print(ctx, &lbs, vip_width);\n     smap_destroy(&lbs);\n }\n \ndiff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at\nindex 354b8df96..3f39af2a3 100644\n--- a/tests/ovn-nbctl.at\n+++ b/tests/ovn-nbctl.at\n@@ -399,47 +399,43 @@ OVN_NBCTL_TEST_START\n \n dnl Add two LBs.\n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10:80a 192.168.10.10:80,192.168.10.20:80 tcp], [1], [],\n-[ovn-nbctl: 30.0.0.10:80a: should be an IPv4 address (or an IPv4 address and a port number with : as a separator).\n+[ovn-nbctl: 30.0.0.10:80a: should be an IP address (or an IP address and a port number with : as a separator).\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10:a80 192.168.10.10:80,192.168.10.20:80 tcp], [1], [],\n-[ovn-nbctl: 30.0.0.10:a80: should be an IPv4 address (or an IPv4 address and a port number with : as a separator).\n+[ovn-nbctl: 30.0.0.10:a80: should be an IP address (or an IP address and a port number with : as a separator).\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10: 192.168.10.10:80,192.168.10.20:80 tcp], [1], [],\n-[ovn-nbctl: 30.0.0.10:: should be an IPv4 address (or an IPv4 address and a port number with : as a separator).\n+[ovn-nbctl: 30.0.0.10:: should be an IP address (or an IP address and a port number with : as a separator).\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10:80 192.168.10.10:80,192.168.10.20 tcp], [1], [],\n-[ovn-nbctl: 192.168.10.20: should be an IPv4 address and a port number with : as a separator.\n+[ovn-nbctl: 192.168.10.20: should be an IP address and a port number with : as a separator.\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.1a 192.168.10.10:80,192.168.10.20:80], [1], [],\n-[ovn-nbctl: 30.0.0.1a: should be an IPv4 address (or an IPv4 address and a port number with : as a separator).\n+[ovn-nbctl: 30.0.0.1a: should be an IP address (or an IP address and a port number with : as a separator).\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0 192.168.10.10:80,192.168.10.20:80], [1], [],\n-[ovn-nbctl: 30.0.0: should be an IPv4 address (or an IPv4 address and a port number with : as a separator).\n+[ovn-nbctl: 192.168.10.10:80: should be an IP address.\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10 192.168.10.10,192.168.10.20:80], [1], [],\n-[ovn-nbctl: 192.168.10.20:80: should be an IPv4 address.\n+[ovn-nbctl: 192.168.10.20:80: should be an IP address.\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10 192.168.10.10:a80], [1], [],\n-[ovn-nbctl: 192.168.10.10:a80: should be an IPv4 address.\n+[ovn-nbctl: 192.168.10.10:a80: should be an IP address.\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10 192.168.10.10:], [1], [],\n-[ovn-nbctl: 192.168.10.10:: should be an IPv4 address.\n+[ovn-nbctl: 192.168.10.10:: should be an IP address.\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10 192.168.10.1a], [1], [],\n-[ovn-nbctl: 192.168.10.1a: should be an IPv4 address.\n-])\n-\n-AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10 192.168.10], [1], [],\n-[ovn-nbctl: 192.168.10: should be an IPv4 address.\n+[ovn-nbctl: 192.168.10.1a: should be an IP address.\n ])\n \n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10 192.168.10.10 tcp], [1], [],\n@@ -454,9 +450,9 @@ dnl Add ips to lb\n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10:80 ,,,192.168.10.10:80,,,,,])\n AT_CHECK([ovn-nbctl lb-add lb1 30.0.0.10:80 ,,,192.168.10.10:80,,,,192.168.10.20:80,,,,])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80\n-<1>    lb1                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80\n+<1>    lb1                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n ])\n AT_CHECK([ovn-nbctl lb-del lb0])\n AT_CHECK([ovn-nbctl lb-del lb1])\n@@ -464,51 +460,51 @@ AT_CHECK([ovn-nbctl lb-del lb1])\n AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10:80 192.168.10.10:80,192.168.10.20:80])\n AT_CHECK([ovn-nbctl lb-add lb1 30.0.0.10:80 192.168.10.10:80,192.168.10.20:80 tcp])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n ])\n \n dnl Update the VIP of the lb1.\n AT_CHECK([ovn-nbctl --may-exist lb-add lb1 30.0.0.10:80 192.168.10.10:80,192.168.10.20:8080])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:8080\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:8080\n ])\n \n AT_CHECK([ovn-nbctl --may-exist lb-add lb1 30.0.0.10:80 192.168.10.10:80,192.168.10.20:8080 udp])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:8080\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:8080\n ])\n \n dnl Config lb1 with another VIP.\n AT_CHECK([ovn-nbctl lb-add lb1 30.0.0.20:80 192.168.10.10:80 udp])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:8080\n-                                                            udp        30.0.0.20:80             192.168.10.10:80\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:8080\n+                                                            udp        30.0.0.20:80    192.168.10.10:80\n ])\n \n AT_CHECK([ovn-nbctl lb-del lb1 30.0.0.20:80])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:8080\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:8080\n ])\n \n dnl Add LBs whose vip is just an IP address.\n AT_CHECK([ovn-nbctl lb-add lb2 30.0.0.30 192.168.10.10])\n AT_CHECK([ovn-nbctl lb-add lb3 30.0.0.30 192.168.10.10])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:8080\n-<2>    lb2                 tcp/udp    30.0.0.30                192.168.10.10\n-<3>    lb3                 tcp/udp    30.0.0.30                192.168.10.10\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:8080\n+<2>    lb2                 tcp/udp    30.0.0.30       192.168.10.10\n+<3>    lb3                 tcp/udp    30.0.0.30       192.168.10.10\n ])\n AT_CHECK([ovn-nbctl lb-del lb2 30.0.0.30])\n AT_CHECK([ovn-nbctl lb-del lb3 30.0.0.30])\n@@ -516,11 +512,11 @@ AT_CHECK([ovn-nbctl lb-del lb3 30.0.0.30])\n AT_CHECK([ovn-nbctl lb-add lb2 30.0.0.10:8080 192.168.10.10:80,192.168.10.20:80 tcp])\n AT_CHECK([ovn-nbctl --add-duplicate lb-add lb2 30.0.0.10:8080 192.168.10.10:80,192.168.10.20:80 tcp])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:8080\n-<2>    lb2                 tcp        30.0.0.10:8080           192.168.10.10:80,192.168.10.20:80\n-<3>    lb2                 tcp        30.0.0.10:8080           192.168.10.10:80,192.168.10.20:80\n+UUID                                    LB                  PROTO      VIP               IPs\n+<0>    lb0                 tcp        30.0.0.10:80      192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 udp        30.0.0.10:80      192.168.10.10:80,192.168.10.20:8080\n+<2>    lb2                 tcp        30.0.0.10:8080    192.168.10.10:80,192.168.10.20:80\n+<3>    lb2                 tcp        30.0.0.10:8080    192.168.10.10:80,192.168.10.20:80\n ])\n \n dnl If there are multiple load balancers with the same name, use a UUID to update/delete.\n@@ -538,9 +534,9 @@ AT_CHECK([ovn-nbctl --may-exist lb-add lb1 30.0.0.10:9090 192.168.10.10:8080,192\n AT_CHECK([ovn-nbctl lb-del lb0 30.0.0.10:80])\n AT_CHECK([ovn-nbctl lb-del lb1])\n AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb2                 tcp        30.0.0.10:8080           192.168.10.10:80,192.168.10.20:80\n-<1>    lb2                 tcp        30.0.0.10:8080           192.168.10.10:80,192.168.10.20:80\n+UUID                                    LB                  PROTO      VIP               IPs\n+<0>    lb2                 tcp        30.0.0.10:8080    192.168.10.10:80,192.168.10.20:80\n+<1>    lb2                 tcp        30.0.0.10:8080    192.168.10.10:80,192.168.10.20:80\n ])\n \n dnl Add load balancer to logical switch.\n@@ -557,17 +553,17 @@ AT_CHECK([ovn-nbctl ls-lb-add ls0 lb2], [1], [],\n AT_CHECK([ovn-nbctl ls-lb-add ls0 lb3])\n \n AT_CHECK([ovn-nbctl ls-lb-list ls0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<2>    lb3                 tcp/udp    30.0.0.10                192.168.10.10,192.168.10.20\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<2>    lb3                 tcp/udp    30.0.0.10       192.168.10.10,192.168.10.20\n ])\n \n AT_CHECK([ovn-nbctl ls-lb-del ls0 lb0])\n AT_CHECK([ovn-nbctl ls-lb-list ls0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb3                 tcp/udp    30.0.0.10                192.168.10.10,192.168.10.20\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb3                 tcp/udp    30.0.0.10       192.168.10.10,192.168.10.20\n ])\n \n AT_CHECK([ovn-nbctl ls-lb-del ls0 lb1])\n@@ -593,17 +589,17 @@ AT_CHECK([ovn-nbctl lr-lb-add lr0 lb2], [1], [],\n AT_CHECK([ovn-nbctl lr-lb-add lr0 lb3])\n \n AT_CHECK([ovn-nbctl lr-lb-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb0                 tcp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<2>    lb3                 tcp/udp    30.0.0.10                192.168.10.10,192.168.10.20\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb0                 tcp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<2>    lb3                 tcp/udp    30.0.0.10       192.168.10.10,192.168.10.20\n ])\n \n AT_CHECK([ovn-nbctl lr-lb-del lr0 lb0])\n AT_CHECK([ovn-nbctl lr-lb-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n-UUID                                    LB                  PROTO      VIP                      IPs\n-<0>    lb1                 udp        30.0.0.10:80             192.168.10.10:80,192.168.10.20:80\n-<1>    lb3                 tcp/udp    30.0.0.10                192.168.10.10,192.168.10.20\n+UUID                                    LB                  PROTO      VIP             IPs\n+<0>    lb1                 udp        30.0.0.10:80    192.168.10.10:80,192.168.10.20:80\n+<1>    lb3                 tcp/udp    30.0.0.10       192.168.10.10,192.168.10.20\n ])\n \n AT_CHECK([ovn-nbctl lr-lb-del lr0 lb1])\n@@ -620,7 +616,270 @@ AT_CHECK([ovn-nbctl lr-lb-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [])\n \n OVN_NBCTL_TEST_STOP\n AT_CLEANUP\n+dnl\n+dnl ---------------------------------------------------------------------\n+\n+AT_SETUP([ovn-nbctl - LBs IPv6])\n+OVN_NBCTL_TEST_START\n+\n+dnl A bunch of commands that should fail\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]:80a [[fd0f::10]]:80,[[fd0f::20]]:80 tcp], [1], [],\n+[ovn-nbctl: [[ae0f::10]]:80a: should be an IP address (or an IP address and a port number with : as a separator).\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]:a80 [[fd0f::10]]:80,[[fd0f::20]]:80 tcp], [1], [],\n+[ovn-nbctl: [[ae0f::10]]:a80: should be an IP address (or an IP address and a port number with : as a separator).\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]: [[fd0f::10]]:80,[[fd0f::20]]:80 tcp], [1], [],\n+[ovn-nbctl: [[ae0f::10]]:: should be an IP address (or an IP address and a port number with : as a separator).\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]:80 [[fd0f::10]]:80,fd0f::20 tcp], [1], [],\n+[ovn-nbctl: fd0f::20: should be an IP address and a port number with : as a separator.\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10fff [[fd0f::10]]:80,fd0f::20 tcp], [1], [],\n+[ovn-nbctl: ae0f::10fff: should be an IP address (or an IP address and a port number with : as a separator).\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 [[fd0f::10]]:80,[[fd0f::20]]:80], [1], [],\n+[ovn-nbctl: [[fd0f::10]]:80: should be an IP address.\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 fd0f::10,[[fd0f::20]]:80], [1], [],\n+[ovn-nbctl: [[fd0f::20]]:80: should be an IP address.\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 [[fd0f::10]]:a80], [1], [],\n+[ovn-nbctl: [[fd0f::10]]:a80: should be an IP address.\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 [[fd0f::10]]:], [1], [],\n+[ovn-nbctl: [[fd0f::10]]:: should be an IP address.\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 fd0f::1001a], [1], [],\n+[ovn-nbctl: fd0f::1001a: should be an IP address.\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 fd0f::10 tcp], [1], [],\n+[ovn-nbctl: Protocol is unnecessary when no port of vip is given.\n+])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 [[fd0f::10]]:900 tcp], [1], [],\n+[ovn-nbctl: Protocol is unnecessary when no port of vip is given.\n+])\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 192.168.10.10], [1], [],\n+[ovn-nbctl: 192.168.10.10: IP address family is different from VIP ae0f::10.\n+])\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 192.168.10.10], [1], [],\n+[ovn-nbctl: 192.168.10.10: IP address family is different from VIP ae0f::10.\n+])\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]:80 192.168.10.10:80], [1], [],\n+[ovn-nbctl: 192.168.10.10:80: IP address family is different from VIP [[ae0f::10]]:80.\n+])\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10 ae0f::10], [1], [],\n+[ovn-nbctl: ae0f::10: IP address family is different from VIP 30.0.0.10.\n+])\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 30.0.0.10:80 [[ae0f::10]]:80], [1], [],\n+[ovn-nbctl: [[ae0f::10]]:80: IP address family is different from VIP 30.0.0.10:80.\n+])\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f::10 fd0f::10])\n+AT_CHECK([ovn-nbctl lb-add lb0 ae0f:0000:0000:0000:0000:0000:0000:0010 fd0f::20],\n+[1], [], [ovn-nbctl: lb0: a load balancer with this vip (ae0f::10) already exists\n+])\n+\n+AT_CHECK([ovn-nbctl lb-del lb0])\n+\n+dnl Add ips to lb\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]:80 ,,,[[fd0f::10]]:80,,,,,])\n+AT_CHECK([ovn-nbctl lb-add lb1 [[ae0f::10]]:80 ,,,[[fd0f::10]]:80,,,,[[fd0f::20]]:80,,,,])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80\n+<1>    lb1                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+])\n+AT_CHECK([ovn-nbctl lb-del lb0])\n+AT_CHECK([ovn-nbctl lb-del lb1])\n+\n+\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]:80 [[fd0f::10]]:80,[[fd0f::20]]:80])\n+AT_CHECK([ovn-nbctl lb-add lb1 [[ae0f::10]]:80 [[fd0f::10]]:80,[[fd0f::20]]:80 tcp])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+])\n+\n+dnl Update the VIP of the lb1.\n+AT_CHECK([ovn-nbctl --may-exist lb-add lb1 [[ae0f::10]]:80 [[fd0f::10]]:80,[[fd0f::20]]:8080])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:8080\n+])\n+\n+AT_CHECK([ovn-nbctl --may-exist lb-add lb1 [[ae0f::10]]:80 [[fd0f::10]]:80,[[fd0f::20]]:8080 udp])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:8080\n+])\n+\n+dnl Config lb1 with another VIP.\n+AT_CHECK([ovn-nbctl lb-add lb1 [[ae0f::20]]:80 [[fd0f::10]]:80 udp])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:8080\n+                                                            udp        [[ae0f::20]]:80    [[fd0f::10]]:80\n+])\n+\n+AT_CHECK([ovn-nbctl lb-del lb1 [[ae0f::20]]:80])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:8080\n+])\n \n+dnl Add LBs whose vip is just an IP address.\n+AT_CHECK([ovn-nbctl lb-add lb2 ae0f::30 fd0f::10])\n+AT_CHECK([ovn-nbctl lb-add lb3 ae0f::30 fd0f::10])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:8080\n+<2>    lb2                 tcp/udp    ae0f::30         fd0f::10\n+<3>    lb3                 tcp/udp    ae0f::30         fd0f::10\n+])\n+AT_CHECK([ovn-nbctl lb-del lb2 ae0f::30])\n+AT_CHECK([ovn-nbctl lb-del lb3 ae0f::30])\n+\n+AT_CHECK([ovn-nbctl lb-add lb2 [[ae0f::10]]:8080 [[fd0f::10]]:80,[[fd0f::20]]:80 tcp])\n+AT_CHECK([ovn-nbctl --add-duplicate lb-add lb2 [[ae0f::10]]:8080 [[fd0f::10]]:80,[[fd0f::20]]:80 tcp])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP                IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80      [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 udp        [[ae0f::10]]:80      [[fd0f::10]]:80,[[fd0f::20]]:8080\n+<2>    lb2                 tcp        [[ae0f::10]]:8080    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<3>    lb2                 tcp        [[ae0f::10]]:8080    [[fd0f::10]]:80,[[fd0f::20]]:80\n+])\n+\n+dnl If there are multiple load balancers with the same name, use a UUID to update/delete.\n+AT_CHECK([ovn-nbctl lb-add lb2 [[ae0f::10]]:8080 [[fd0f::10]]:80,[[fd0f::20]]:80 tcp], [1], [],\n+[ovn-nbctl: Multiple load balancers named 'lb2'.  Use a UUID.\n+])\n+\n+AT_CHECK([ovn-nbctl lb-del lb2], [1], [],\n+[ovn-nbctl: Multiple load balancers named 'lb2'.  Use a UUID.\n+])\n+\n+AT_CHECK([ovn-nbctl --may-exist lb-add lb1 [[ae0f::10]]:80 [[fd0f::10]]:8080,[[fd0f::20]]:8080 udp])\n+AT_CHECK([ovn-nbctl --may-exist lb-add lb1 [[ae0f::10]]:8080 [[fd0f::10]]:8080,[[fd0f::20]]:8080 udp])\n+AT_CHECK([ovn-nbctl --may-exist lb-add lb1 [[ae0f::10]]:9090 [[fd0f::10]]:8080,[[fd0f::20]]:8080 udp])\n+AT_CHECK([ovn-nbctl lb-del lb0 [[ae0f::10]]:80])\n+AT_CHECK([ovn-nbctl lb-del lb1])\n+AT_CHECK([ovn-nbctl lb-list | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP                IPs\n+<0>    lb2                 tcp        [[ae0f::10]]:8080    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb2                 tcp        [[ae0f::10]]:8080    [[fd0f::10]]:80,[[fd0f::20]]:80\n+])\n+\n+dnl Add load balancer to logical switch.\n+AT_CHECK([ovn-nbctl ls-add ls0])\n+AT_CHECK([ovn-nbctl lb-add lb0 [[ae0f::10]]:80 [[fd0f::10]]:80,[[fd0f::20]]:80])\n+AT_CHECK([ovn-nbctl lb-add lb1 [[ae0f::10]]:80 [[fd0f::10]]:80,[[fd0f::20]]:80 udp])\n+AT_CHECK([ovn-nbctl lb-add lb3 ae0f::10 fd0f::10,fd0f::20])\n+AT_CHECK([ovn-nbctl ls-lb-add ls0 lb0])\n+AT_CHECK([ovn-nbctl ls-lb-add ls0 lb1])\n+AT_CHECK([ovn-nbctl --may-exist ls-lb-add ls0 lb1])\n+AT_CHECK([ovn-nbctl ls-lb-add ls0 lb2], [1], [],\n+[ovn-nbctl: Multiple load balancers named 'lb2'.  Use a UUID.\n+])\n+AT_CHECK([ovn-nbctl ls-lb-add ls0 lb3])\n+\n+AT_CHECK([ovn-nbctl ls-lb-list ls0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<2>    lb3                 tcp/udp    ae0f::10         fd0f::10,fd0f::20\n+])\n+\n+AT_CHECK([ovn-nbctl ls-lb-del ls0 lb0])\n+AT_CHECK([ovn-nbctl ls-lb-list ls0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb3                 tcp/udp    ae0f::10         fd0f::10,fd0f::20\n+])\n+\n+AT_CHECK([ovn-nbctl ls-lb-del ls0 lb1])\n+AT_CHECK([ovn-nbctl ls-lb-del ls0 lb3])\n+AT_CHECK([ovn-nbctl ls-lb-list ls0 | ${PERL} $srcdir/uuidfilt.pl], [0], [])\n+AT_CHECK([ovn-nbctl --if-exists ls-lb-del ls0 lb1])\n+\n+dnl Remove all load balancers from logical switch.\n+AT_CHECK([ovn-nbctl ls-lb-add ls0 lb0])\n+AT_CHECK([ovn-nbctl ls-lb-add ls0 lb1])\n+AT_CHECK([ovn-nbctl ls-lb-add ls0 lb3])\n+AT_CHECK([ovn-nbctl ls-lb-del ls0])\n+AT_CHECK([ovn-nbctl ls-lb-list ls0 | ${PERL} $srcdir/uuidfilt.pl], [0], [])\n+\n+dnl Add load balancer to logical router.\n+AT_CHECK([ovn-nbctl lr-add lr0])\n+AT_CHECK([ovn-nbctl lr-lb-add lr0 lb0])\n+AT_CHECK([ovn-nbctl lr-lb-add lr0 lb1])\n+AT_CHECK([ovn-nbctl --may-exist lr-lb-add lr0 lb1])\n+AT_CHECK([ovn-nbctl lr-lb-add lr0 lb2], [1], [],\n+[ovn-nbctl: Multiple load balancers named 'lb2'.  Use a UUID.\n+])\n+AT_CHECK([ovn-nbctl lr-lb-add lr0 lb3])\n+\n+AT_CHECK([ovn-nbctl lr-lb-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb0                 tcp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<2>    lb3                 tcp/udp    ae0f::10         fd0f::10,fd0f::20\n+])\n+\n+AT_CHECK([ovn-nbctl lr-lb-del lr0 lb0])\n+AT_CHECK([ovn-nbctl lr-lb-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl\n+UUID                                    LB                  PROTO      VIP              IPs\n+<0>    lb1                 udp        [[ae0f::10]]:80    [[fd0f::10]]:80,[[fd0f::20]]:80\n+<1>    lb3                 tcp/udp    ae0f::10         fd0f::10,fd0f::20\n+])\n+\n+AT_CHECK([ovn-nbctl lr-lb-del lr0 lb1])\n+AT_CHECK([ovn-nbctl lr-lb-del lr0 lb3])\n+AT_CHECK([ovn-nbctl lr-lb-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [])\n+AT_CHECK([ovn-nbctl --if-exists lr-lb-del lr0 lb1])\n+\n+dnl Remove all load balancers from logical router.\n+AT_CHECK([ovn-nbctl lr-lb-add lr0 lb0])\n+AT_CHECK([ovn-nbctl lr-lb-add lr0 lb1])\n+AT_CHECK([ovn-nbctl lr-lb-add lr0 lb3])\n+AT_CHECK([ovn-nbctl lr-lb-del lr0])\n+AT_CHECK([ovn-nbctl lr-lb-list lr0 | ${PERL} $srcdir/uuidfilt.pl], [0], [])\n+\n+OVN_NBCTL_TEST_STOP\n+AT_CLEANUP\n dnl ---------------------------------------------------------------------\n \n AT_SETUP([ovn-nbctl - basic logical router commands])\n",
    "prefixes": [
        "ovs-dev",
        "4/4"
    ]
}