From patchwork Thu Jul 11 15:48:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Bianconi X-Patchwork-Id: 1130865 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45l13T3fsjz9sNF for ; Fri, 12 Jul 2019 02:00:05 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 311375258; Thu, 11 Jul 2019 15:58:11 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 11B4051B1 for ; Thu, 11 Jul 2019 15:49:35 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 4EA80891 for ; Thu, 11 Jul 2019 15:49:34 +0000 (UTC) Received: by mail-wm1-f66.google.com with SMTP id s3so6179788wms.2 for ; Thu, 11 Jul 2019 08:49:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WbR9N4qtcaLeTLYJMu8IFrhkJyHj3nCt2+Uazt96QPQ=; b=Zmvvjs6knjwbjB71TuhD5YHUHpzhJHKAb1XA1Te9YPSrvgZo+Ev6HuS1uQ2pIyWfu9 mcHLZB3D0MvQSa+2a4D1PcEaXf2efTYYnnMwuDDPjAtNCY5bL+sFrpKS/nQxU9eHBbBX bR0iwXq7tJZyssRyqR1v14o1b/qKF6D37eeHvc2Vndm+k0mQ0Sy2nQedj+PQA42tX9f3 FlbD6R85XZK/dEbYxlno0KWMhrlG8w/PrqIzG07xA9e/c4RHHKbIIb7UXYBKffj/Z38W FHuBku6aXf1vDhv06cagvv5TaY0CZ1UbV/I54A3o5G2heGWWOpzI/Mesm2AoUh7znre2 jc/A== X-Gm-Message-State: APjAAAXlq4TWC0ujDcWtv6sD/gJO1Qc6XK4bAtgvl9FHbjsGLtg6fzmE VpIw69/KofoWz7dgx7V26kgnPeKJjlM= X-Google-Smtp-Source: APXvYqx/YouXUN+C51hL4u566++YSzgkp3hD3iGgTGJa+pnE2nc4+6nzyRdDTNXPhXn46fCiMmJCLg== X-Received: by 2002:a7b:c206:: with SMTP id x6mr4856277wmi.156.1562860172675; Thu, 11 Jul 2019 08:49:32 -0700 (PDT) Received: from localhost.localdomain.com (nat-pool-mxp-t.redhat.com. [149.6.153.186]) by smtp.gmail.com with ESMTPSA id e6sm6507334wrw.23.2019.07.11.08.49.31 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 11 Jul 2019 08:49:32 -0700 (PDT) From: Lorenzo Bianconi To: ovs-dev@openvswitch.org Date: Thu, 11 Jul 2019 17:48:45 +0200 Message-Id: <820908df8684bf5a21b7bded05b2718c1697162b.1562858727.git.lorenzo.bianconi@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH v2 3/3] OVN: use trigger_event action to report 'empty_lb_rule' events X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Add northd logical flows in order to reports that the controller received an IP packet for LB rule witn no backends. This configuration is used by OpenShift to spin up a idle POD Signed-off-by: Mark Michelson Co-authored-by: Mark Michelson Signed-off-by: Lorenzo Bianconi --- ovn/northd/ovn-northd.c | 33 +++++++++++++++++++++ ovn/ovn-nb.xml | 11 +++++++ tests/ovn.at | 65 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c index ce382ac89..4929fb666 100644 --- a/ovn/northd/ovn-northd.c +++ b/ovn/northd/ovn-northd.c @@ -70,6 +70,8 @@ static const char *unixctl_path; static struct hmap macam = HMAP_INITIALIZER(&macam); static struct eth_addr mac_prefix; +static bool controller_event_en; + #define MAX_OVN_TAGS 4096 /* Pipeline stages. */ @@ -3626,6 +3628,34 @@ build_pre_lb(struct ovn_datapath *od, struct hmap *lflows) sset_add(&all_ips, ip_address); } + if (controller_event_en && !node->value[0]) { + struct ds match = DS_EMPTY_INITIALIZER; + char *action; + + if (addr_family == AF_INET) { + ds_put_format(&match, "ip4.dst == %s && %s", + ip_address, lb->protocol); + } else { + ds_put_format(&match, "ip6.dst == %s && %s", + ip_address, lb->protocol); + } + if (port) { + ds_put_format(&match, " && %s.dst == %u", lb->protocol, + port); + } + action = xasprintf("trigger_event(event = \"%s\", " + "vip = \"%s\", protocol = \"%s\", " + "load_balancer = \"" UUID_FMT "\");", + event_to_string(OVN_EVENT_EMPTY_LB_BACKENDS), + node->key, lb->protocol, + UUID_ARGS(&lb->header_.uuid)); + ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_LB, 120, + ds_cstr(&match), action); + ds_destroy(&match); + free(action); + continue; + } + free(ip_address); /* Ignore L4 port information in the key because fragmented packets @@ -8115,6 +8145,9 @@ ovnnb_db_run(struct northd_context *ctx, smap_destroy(&options); } + controller_event_en = smap_get_bool(&nb->options, + "controller_event", false); + cleanup_macam(&macam); } diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml index 318379c1f..b0287563b 100644 --- a/ovn/ovn-nb.xml +++ b/ovn/ovn-nb.xml @@ -107,6 +107,17 @@ Configure a given OUI to be used as prefix when L2 address is dynamically assigned, e.g. 00:11:22 + + + Value set by the CMS to enable/disable ovn-controller event reporting. + Traffic into OVS can raise a 'controller' event that results in a + Controller_Event being written to the + table in SBDB. When the CMS has seen the event and taken appropriate + action, it can remove the correponding row in + table. + The intention is for a CMS to see the events and take some sort of + action. Please see the table in SBDB. + diff --git a/tests/ovn.at b/tests/ovn.at index e9ec715df..d2823d77a 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -14344,3 +14344,68 @@ AT_CHECK([ovn-nbctl ls-add sw1], [1], [ignore], ]) AT_CLEANUP + +AT_SETUP([ovn -- controller event]) +AT_KEYWORDS([ovn_controller_event]) +ovn_start + +# Create hypervisors hv[12]. +# Add vif1[12] to hv1, vif2[12] to hv2 +# Add all of the vifs to a single logical switch sw0. + +net_add n1 +ovn-nbctl ls-add sw0 +for i in 1 2; do + sim_add hv$i + as hv$i + ovs-vsctl add-br br-phys + ovn_attach n1 br-phys 192.168.0.$i + + for j in 1 2; do + ovn-nbctl lsp-add sw0 sw0-p$i$j -- \ + lsp-set-addresses sw0-p$i$j "00:00:00:00:00:$i$j 192.168.1.$i$j" + + ovs-vsctl -- add-port br-int vif$i$j -- \ + set interface vif$i$j \ + external-ids:iface-id=sw0-p$i$j \ + options:tx_pcap=hv$i/vif$i$j-tx.pcap \ + options:rxq_pcap=hv$i/vif$i$j-rx.pcap \ + ofport-request=$i$j + done +done + +ovn-nbctl --wait=hv set NB_Global . options:controller_event=true +ovn-nbctl lb-add lb0 192.168.1.100:80 "" +ovn-nbctl ls-lb-add sw0 lb0 +uuid_lb=$(ovn-nbctl --bare --columns=_uuid find load_balancer name=lb0) + +OVN_POPULATE_ARP +ovn-nbctl --timeout=3 --wait=hv sync +ovn-sbctl lflow-list +as hv1 ovs-ofctl dump-flows br-int + +packet="inport==\"sw0-p11\" && eth.src==00:00:00:00:00:11 && eth.dst==00:00:00:00:00:21 && + ip4 && ip.ttl==64 && ip4.src==192.168.1.11 && ip4.dst==192.168.1.100 && + tcp && tcp.src==10000 && tcp.dst==80" +as hv1 ovs-appctl -t ovn-controller inject-pkt "$packet" + +ovn-sbctl list controller_event +uuid=$(ovn-sbctl list controller_event | awk '/_uuid/{print $3}') +AT_CHECK([ovn-sbctl get controller_event $uuid event_type], [0], [dnl +empty_lb_backends +]) +AT_CHECK([ovn-sbctl get controller_event $uuid event_info:vip], [0], [dnl +"192.168.1.100:80" +]) +AT_CHECK([ovn-sbctl get controller_event $uuid event_info:protocol], [0], [dnl +tcp +]) +AT_CHECK_UNQUOTED([ovn-sbctl get controller_event $uuid event_info:load_balancer], [0], [dnl +"$uuid_lb" +]) +AT_CHECK([ovn-sbctl get controller_event $uuid seq_num], [0], [dnl +1 +]) + +OVN_CLEANUP([hv1], [hv2]) +AT_CLEANUP