Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/810805/?format=api
{ "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" ] }