From patchwork Tue Nov 12 16:14:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dumitru Ceara X-Patchwork-Id: 1193669 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) 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 Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="ggAccQO8"; dkim-atps=neutral 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 47CCXQ2Fkkz9sNH for ; Wed, 13 Nov 2019 03:15:50 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 9BAA9D93; Tue, 12 Nov 2019 16:15:02 +0000 (UTC) X-Original-To: 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 60908D89 for ; Tue, 12 Nov 2019 16:15:01 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by smtp1.linuxfoundation.org (Postfix) with ESMTP id 04FBD8DE for ; Tue, 12 Nov 2019 16:14:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1573575298; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2OHRt6vJWPt7Iojx/0VHw59X43MdKDW8nrh5e2lbUi0=; b=ggAccQO86dekkH2LjtouYg49KdvJd6JNjxoCQJuCf7Krkhswkzjl/lTyXzlnnbMI+NqXoV iYV9SHesyRd38TerNbQX5cUNVQX4QIjvsyUg5J/atj9RTf1dSYOjuwEEA/S+5lgHR3Etxh syCQiRtm+1sV/LyIYn9yRjzL6Cs9lVI= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-397-ZuM4rf_oMSieBeZ8rO1kGQ-1; Tue, 12 Nov 2019 11:14:57 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A75D2107ACE5; Tue, 12 Nov 2019 16:14:56 +0000 (UTC) Received: from dceara.remote.csb (ovpn-116-150.ams2.redhat.com [10.36.116.150]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7459D5DA2C; Tue, 12 Nov 2019 16:14:55 +0000 (UTC) From: Dumitru Ceara To: dev@openvswitch.org Date: Tue, 12 Nov 2019 17:14:52 +0100 Message-Id: <20191112161450.29633.71781.stgit@dceara.remote.csb> In-Reply-To: <20191112161411.29633.23008.stgit@dceara.remote.csb> References: <20191112161411.29633.23008.stgit@dceara.remote.csb> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-MC-Unique: ZuM4rf_oMSieBeZ8rO1kGQ-1 X-Mimecast-Spam-Score: 0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: hzhou@ovn.org Subject: [ovs-dev] [PATCH v2 ovn 1/3] ovn-detrace: Fix rundir. 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 After the separation of OVS and OVN rundirs, the ovn-detrace script hasn't been updated to use the OVN rundir instead of the OVS one. Signed-off-by: Dumitru Ceara --- utilities/ovn-detrace.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utilities/ovn-detrace.in b/utilities/ovn-detrace.in index c842adc..9471e37 100755 --- a/utilities/ovn-detrace.in +++ b/utilities/ovn-detrace.in @@ -169,16 +169,16 @@ def main(): "(use --help for help)\n" % argv0) sys.exit(1) - ovs_rundir = os.getenv('OVS_RUNDIR', '@RUNDIR@') + ovn_rundir = os.getenv('OVN_RUNDIR', '@OVN_RUNDIR@') if not ovnsb_db: ovnsb_db = os.getenv('OVN_SB_DB') if not ovnsb_db: - ovnsb_db = 'unix:%s/ovnsb_db.sock' % ovs_rundir + ovnsb_db = 'unix:%s/ovnsb_db.sock' % ovn_rundir if not ovnnb_db: ovnnb_db = os.getenv('OVN_NB_DB') if not ovnnb_db: - ovnnb_db = 'unix:%s/ovnnb_db.sock' % ovs_rundir + ovnnb_db = 'unix:%s/ovnnb_db.sock' % ovn_rundir ovsdb_ovnsb = OVSDB(ovnsb_db, 'OVN_Southbound') ovsdb_ovnnb = OVSDB(ovnnb_db, 'OVN_Northbound') From patchwork Tue Nov 12 16:15:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dumitru Ceara X-Patchwork-Id: 1193670 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) 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 Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="Z+xv73MD"; dkim-atps=neutral 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 47CCYS0dw1z9sNH for ; Wed, 13 Nov 2019 03:16:44 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 6DA75D9F; Tue, 12 Nov 2019 16:16:40 +0000 (UTC) X-Original-To: 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 6AD85D39 for ; Tue, 12 Nov 2019 16:16:39 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by smtp1.linuxfoundation.org (Postfix) with ESMTP id 1839A8DE for ; Tue, 12 Nov 2019 16:16:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1573575331; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KWERE+vDy86o9TXSzuJT8sl4iDhb2jUSE6LuyWPNUsE=; b=Z+xv73MDZmgYrK+81bfp4kpvaPgi/v5IYgLvKRtJ87Z9yi0/gzYp1h/qxP81Fmrqe0mynq gl07UaKy3NXRib5X9bwdAp+2UkvXS9Hses5kqzAJi++Xv+9hLfGn0CllgrBrrgJMmYL4dx wX0PUm1Z8ZcOFftV6dV8NVcql9nldRU= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-201-vcgF5WHYNsiIGFm30zGKoA-1; Tue, 12 Nov 2019 11:15:30 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DD3001800D7A; Tue, 12 Nov 2019 16:15:29 +0000 (UTC) Received: from dceara.remote.csb (ovpn-116-150.ams2.redhat.com [10.36.116.150]) by smtp.corp.redhat.com (Postfix) with ESMTP id D1FB9610E5; Tue, 12 Nov 2019 16:15:28 +0000 (UTC) From: Dumitru Ceara To: dev@openvswitch.org Date: Tue, 12 Nov 2019 17:15:23 +0100 Message-Id: <20191112161501.29633.34481.stgit@dceara.remote.csb> In-Reply-To: <20191112161411.29633.23008.stgit@dceara.remote.csb> References: <20191112161411.29633.23008.stgit@dceara.remote.csb> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-MC-Unique: vcgF5WHYNsiIGFm30zGKoA-1 X-Mimecast-Spam-Score: 0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: hzhou@ovn.org Subject: [ovs-dev] [PATCH v2 ovn 2/3] ovn-detrace: Fix line parsing. 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 The script was never parsing the first cookie in the input. Also, add a check to make sure that the cookie refers to a Logical_Flow before trying to print the record. Signed-off-by: Dumitru Ceara --- utilities/ovn-detrace.in | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/utilities/ovn-detrace.in b/utilities/ovn-detrace.in index 9471e37..34b6b0e 100755 --- a/utilities/ovn-detrace.in +++ b/utilities/ovn-detrace.in @@ -188,22 +188,26 @@ def main(): cookie = None while True: line = sys.stdin.readline() + + if line == '': + break + + line = line.strip() + if cookie: # print lflow info when the current flow block ends - if regex_table_id.match(line) or line.strip() == '': + if regex_table_id.match(line): lflow = get_lflow_from_cookie(ovsdb_ovnsb, cookie) - print_lflow(lflow, " * ") - print_lflow_nb_hint(lflow, " * ", ovsdb_ovnnb) - cookie = None + if lflow: + print_lflow(lflow, " * ") + print_lflow_nb_hint(lflow, " * ", ovsdb_ovnnb) + cookie = None - print line.strip() - if line == "": - break + print line m = regex_cookie.match(line) - if not m: - continue - cookie = m.group(1) + if m: + cookie = m.group(1) if __name__ == "__main__": From patchwork Tue Nov 12 16:15:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dumitru Ceara X-Patchwork-Id: 1193672 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) 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 Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="BPrwvodv"; dkim-atps=neutral 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 47CCZ866ygz9sNH for ; Wed, 13 Nov 2019 03:17:20 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2FF05DAB; Tue, 12 Nov 2019 16:16:51 +0000 (UTC) X-Original-To: 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 6315BD9B for ; Tue, 12 Nov 2019 16:16:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by smtp1.linuxfoundation.org (Postfix) with ESMTP id BAC138E6 for ; Tue, 12 Nov 2019 16:16:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1573575353; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YGTeCIAVoca1wtWAFvG/E+ReNgvuxZo2GFY8LreCKc0=; b=BPrwvodvA9Dd/NuBS2ReeJuK6imVT6fXJWFGa1AIgTmokGTuURdrcHawD35OW2ZuIfiBmF Ig7lfnRiF4Wun0N2S1Dtn/DZ5093NLY8BW+AH8cfwKFsDmFQcJN+EjyAAf2fhtoggv0j4l plpex+BLmETq+h/G82JKMyUeYlKh4+s= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-120--sPbMY3XP0-NP3x7I0S47Q-1; Tue, 12 Nov 2019 11:15:49 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1056EDBA3; Tue, 12 Nov 2019 16:15:49 +0000 (UTC) Received: from dceara.remote.csb (ovpn-116-150.ams2.redhat.com [10.36.116.150]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0F483101E3CB; Tue, 12 Nov 2019 16:15:47 +0000 (UTC) From: Dumitru Ceara To: dev@openvswitch.org Date: Tue, 12 Nov 2019 17:15:45 +0100 Message-Id: <20191112161535.29633.81507.stgit@dceara.remote.csb> In-Reply-To: <20191112161411.29633.23008.stgit@dceara.remote.csb> References: <20191112161411.29633.23008.stgit@dceara.remote.csb> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: -sPbMY3XP0-NP3x7I0S47Q-1 X-Mimecast-Spam-Score: 0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: hzhou@ovn.org Subject: [ovs-dev] [PATCH v2 ovn 3/3] ovn-detrace: Add support for other types of SB cookies. 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 Commit eb25a7da639e ("Improve debuggability of OVN to OpenFlow translations.") added cookies for Port_Binding, Mac_Binding, Multicast_Group, Chassis records to the OpenfFlow entries they generate. Add support for parsing such cookies in ovn-detrace too. Also: - refactor ovn-detrace to allow a more generic way of defining cookie handlers. - properly handle potential collisions between cookie -> UUID mappings. - change print statements to print() calls. - add custom printing functions to simplify prefixing outputs. Signed-off-by: Dumitru Ceara --- utilities/ovn-detrace.in | 197 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 135 insertions(+), 62 deletions(-) diff --git a/utilities/ovn-detrace.in b/utilities/ovn-detrace.in index 34b6b0e..00d162f 100755 --- a/utilities/ovn-detrace.in +++ b/utilities/ovn-detrace.in @@ -14,6 +14,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function + +import functools import getopt import os import re @@ -37,7 +40,7 @@ argv0 = sys.argv[0] def usage(): - print """\ + print("""\ %(argv0)s: usage: %(argv0)s < FILE where FILE is output from ovs-appctl ofproto/trace. @@ -47,9 +50,21 @@ The following options are also available: -V, --version display version information --ovnsb=DATABASE use DATABASE as southbound DB --ovnnb=DATABASE use DATABASE as northbound DB\ -""" % {'argv0': argv0} +""" % {'argv0': argv0}) sys.exit(0) +pprint = functools.partial(print, ' * ') +hprint = functools.partial(print, ' * ') + +def datapath_str(datapath): + return '"%s" (%s)' % (str(datapath.external_ids.get('name')), + datapath.uuid) + +def chassis_str(chassis): + if len(chassis) == 0: + return '' + ch = chassis[0] + return 'chassis-name "%s", chassis-str "%s"' % (ch.name, ch.hostname) class OVSDB(object): @staticmethod @@ -87,59 +102,112 @@ class OVSDB(object): def get_table(self, table_name): return self._idl_conn.tables[table_name] - def _find_row(self, table_name, find): - return next( - (row for row in self.get_table(table_name).rows.values() - if find(row)), None) + def _find_row(self, table_name, find_fn): + return filter(find_fn, self.get_table(table_name).rows.values()) - def _find_row_by_name(self, table_name, value): + def _find_rows_by_name(self, table_name, value): return self._find_row(table_name, lambda row: row.name == value) - def find_row_by_partial_uuid(self, table_name, value): - return self._find_row(table_name, lambda row: value in str(row.uuid)) - - -def get_lflow_from_cookie(ovnsb_db, cookie): - return ovnsb_db.find_row_by_partial_uuid('Logical_Flow', cookie) - - -def print_lflow(lflow, prefix): - ldp_uuid = lflow.logical_datapath.uuid - ldp_name = str(lflow.logical_datapath.external_ids.get('name')) - - print '%sLogical datapath: "%s" (%s) [%s]' % (prefix, - ldp_name, - ldp_uuid, - lflow.pipeline) - print "%sLogical flow: table=%s (%s), priority=%s, " \ - "match=(%s), actions=(%s)" % (prefix, - lflow.table_id, - lflow.external_ids.get('stage-name'), - lflow.priority, - str(lflow.match).strip('"'), - str(lflow.actions).strip('"')) - - -def print_lflow_nb_hint(lflow, prefix, ovnnb_db): - external_ids = lflow.external_ids - if external_ids.get('stage-name') in ['ls_in_acl', - 'ls_out_acl']: - acl_hint = external_ids.get('stage-hint') - if not acl_hint: - return - acl = ovnnb_db.find_row_by_partial_uuid('ACL', acl_hint) - if not acl: - return - output = "%sACL: %s, priority=%s, " \ - "match=(%s), %s" % (prefix, - acl.direction, - acl.priority, - acl.match.strip('"'), - acl.action) - if acl.log: - output += ' (log)' - print output - + def find_rows_by_partial_uuid(self, table_name, value): + return self._find_row(table_name, + lambda row: str(row.uuid).startswith(value)) + +class CookieHandler(object): + def __init__(self, db, table): + self._db = db + self._table = table + + def get_records(self, cookie): + # Adjust cookie to include leading zeroes if needed. + cookie = cookie.zfill(8) + return self._db.find_rows_by_partial_uuid(self._table, cookie) + + def print_record(self, record): + pass + + def print_hint(self, record, db): + pass + +class LogicalFlowHandler(CookieHandler): + def __init__(self, ovnsb_db): + super(LogicalFlowHandler, self).__init__(ovnsb_db, 'Logical_Flow') + + def print_record(self, lflow): + pprint('Logical datapath: %s [%s]' % + (datapath_str(lflow.logical_datapath), lflow.pipeline)) + pprint('Logical flow: table=%s (%s), priority=%s, ' + 'match=(%s), actions=(%s)' % + (lflow.table_id, lflow.external_ids.get('stage-name'), + lflow.priority, + str(lflow.match).strip('"'), + str(lflow.actions).strip('"'))) + + def print_hint(self, lflow, ovnnb_db): + external_ids = lflow.external_ids + if external_ids.get('stage-name') in ['ls_in_acl', + 'ls_out_acl']: + acl_hint = external_ids.get('stage-hint') + if not acl_hint: + return + for i, acl in enumerate( + ovnnb_db.find_rows_by_partial_uuid('ACL', acl_hint)): + if i > 0: + hprint('[Duplicate uuid ACL hint]') + + output = 'ACL: %s, priority=%s, ' \ + 'match=(%s), %s' % (acl.direction, + acl.priority, + acl.match.strip('"'), + acl.action) + if acl.log: + output += ' (log)' + hprint(output) + +class PortBindingHandler(CookieHandler): + def __init__(self, ovnsb_db): + super(PortBindingHandler, self).__init__(ovnsb_db, 'Port_Binding') + + def print_record(self, pb): + pprint('Logical datapath: %s' % (datapath_str(pb.datapath))) + pprint('Port Binding: logical_port "%s", tunnel_key %ld, %s' % + (pb.logical_port, pb.tunnel_key, + chassis_str(pb.chassis))) + +class MacBindingHandler(CookieHandler): + def __init__(self, ovnsb_db): + super(MacBindingHandler, self).__init__(ovnsb_db, 'MAC_Binding') + + def print_record(self, mb): + pprint('Logical datapath: %s' % (datapath_str(mb.datapath))) + pprint('MAC Binding: ip "%s", logical_port "%s", mac "%s"' % + (mb.ip, mb.logical_port, mb.mac)) + +class MulticastGroupHandler(CookieHandler): + def __init__(self, ovnsb_db): + super(MulticastGroupHandler, self).__init__(ovnsb_db, + 'Multicast_Group') + + def print_record(self, mc): + mc_ports = ', '.join([pb.logical_port for pb in mc.ports]) + + pprint('Logical datapath: %s' % (datapath_str(mc.datapath))) + pprint('Multicast Group: name "%s", tunnel_key %ld ports: (%s)' % + (mc.name, mc.tunnel_key, mc_ports)) + +class ChassisHandler(CookieHandler): + def __init__(self, ovnsb_db): + super(ChassisHandler, self).__init__(ovnsb_db, 'Chassis') + + def print_record(self, chassis): + pprint('%sChassis: %s' % (chassis_str([chassis]))) + +def print_sb_record_from_cookie(ovnnb_db, ovnsb_db, cookie_handlers, cookie): + for handler in cookie_handlers: + for i, sb_record in enumerate(handler.get_records(cookie)): + if i > 0: + handler.print('[Duplicate uuid cookie]') + handler.print_record(sb_record) + handler.print_hint(sb_record, ovnnb_db) def main(): try: @@ -156,7 +224,7 @@ def main(): if key in ['-h', '--help']: usage() elif key in ['-V', '--version']: - print "%s (Open vSwitch) @VERSION@" % argv0 + print("%s (Open vSwitch) @VERSION@" % argv0) elif key in ['--ovnsb']: ovnsb_db = value elif key in ['--ovnnb']: @@ -183,6 +251,14 @@ def main(): ovsdb_ovnsb = OVSDB(ovnsb_db, 'OVN_Southbound') ovsdb_ovnnb = OVSDB(ovnnb_db, 'OVN_Northbound') + cookie_handlers = [ + LogicalFlowHandler(ovsdb_ovnsb), + PortBindingHandler(ovsdb_ovnsb), + MacBindingHandler(ovsdb_ovnsb), + MulticastGroupHandler(ovsdb_ovnsb), + ChassisHandler(ovsdb_ovnsb) + ] + regex_cookie = re.compile(r'^.*cookie 0x([0-9a-fA-F]+)') regex_table_id = re.compile(r'^[0-9]+\.') cookie = None @@ -194,16 +270,13 @@ def main(): line = line.strip() - if cookie: - # print lflow info when the current flow block ends - if regex_table_id.match(line): - lflow = get_lflow_from_cookie(ovsdb_ovnsb, cookie) - if lflow: - print_lflow(lflow, " * ") - print_lflow_nb_hint(lflow, " * ", ovsdb_ovnnb) - cookie = None + # Print SB record info when the current flow block ends. + if cookie and regex_table_id.match(line): + print_sb_record_from_cookie(ovsdb_ovnnb, ovsdb_ovnsb, + cookie_handlers, cookie) + cookie = None - print line + print(line) m = regex_cookie.match(line) if m: