Yocto 2.4
Move OpenBMC to Yocto 2.4(rocko)
Tested: Built and verified Witherspoon and Palmetto images
Change-Id: I12057b18610d6fb0e6903c60213690301e9b0c67
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/import-layers/meta-virtualization/recipes-networking/cni/cni_git.bb b/import-layers/meta-virtualization/recipes-networking/cni/cni_git.bb
new file mode 100644
index 0000000..427a812
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/cni/cni_git.bb
@@ -0,0 +1,95 @@
+HOMEPAGE = "https://github.com/containernetworking/cni"
+SUMMARY = "Container Network Interface - networking for Linux containers"
+DESCRIPTION = "CNI (Container Network Interface), a Cloud Native Computing \
+Foundation project, consists of a specification and libraries for writing \
+plugins to configure network interfaces in Linux containers, along with a \
+number of supported plugins. CNI concerns itself only with network connectivity \
+of containers and removing allocated resources when the container is deleted. \
+Because of this focus, CNI has a wide range of support and the specification \
+is simple to implement. \
+"
+
+SRCREV_cni = "4b9e11a5266fe50222ed00c5973c6ea4a384a4bb"
+SRCREV_plugins = "c238c93b5e7c681f1935ff813b30e82f96f6c367"
+SRC_URI = "\
+ git://github.com/containernetworking/cni.git;nobranch=1;name=cni \
+ git://github.com/containernetworking/plugins.git;nobranch=1;destsuffix=plugins;name=plugins \
+ "
+
+RPROVIDES_${PN} += "kubernetes-cni"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://src/import/LICENSE;md5=fa818a259cbed7ce8bc2a22d35a464fc"
+
+GO_IMPORT = "import"
+
+PV = "0.6.0+git${SRCREV_cni}"
+
+inherit go
+inherit goarch
+
+do_compile() {
+ export GOARCH="${TARGET_GOARCH}"
+ export GOROOT="${STAGING_LIBDIR_NATIVE}/${TARGET_SYS}/go"
+ export GOPATH="${S}/src/import:${S}/src/import/vendor"
+
+ # Pass the needed cflags/ldflags so that cgo
+ # can find the needed headers files and libraries
+ export CGO_ENABLED="1"
+ export CFLAGS=""
+ export LDFLAGS=""
+ export CGO_CFLAGS="${BUILDSDK_CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+ export CGO_LDFLAGS="${BUILDSDK_LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+
+ # link fixups for compilation
+ rm -f ${S}/src/import/vendor/src
+ ln -sf ./ ${S}/src/import/vendor/src
+ rm -rf ${S}/src/import/plugins
+ rm -rf ${S}/src/import/vendor/github.com/containernetworking/plugins
+
+ mkdir -p ${S}/src/import/vendor/github.com/containernetworking/cni
+
+ ln -sf ../../../../libcni ${S}/src/import/vendor/github.com/containernetworking/cni/libcni
+ ln -sf ../../../../pkg ${S}/src/import/vendor/github.com/containernetworking/cni/pkg
+ ln -sf ../../../../cnitool ${S}/src/import/vendor/github.com/containernetworking/cni/cnitool
+ ln -sf ${WORKDIR}/plugins ${S}/src/import/vendor/github.com/containernetworking/plugins
+
+ export GOPATH="${S}/src/import/.gopath:${S}/src/import/vendor:${STAGING_DIR_TARGET}/${prefix}/local/go"
+ export GOROOT="${STAGING_DIR_NATIVE}/${nonarch_libdir}/${HOST_SYS}/go"
+
+ # Pass the needed cflags/ldflags so that cgo
+ # can find the needed headers files and libraries
+ export CGO_ENABLED="1"
+ export CGO_CFLAGS="${CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+ export CGO_LDFLAGS="${LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+
+ cd ${S}/src/import/vendor/github.com/containernetworking/cni/libcni
+ go build
+
+ cd ${S}/src/import/vendor/github.com/containernetworking/cni/cnitool
+ go build
+
+ cd ${S}/src/import/vendor/github.com/containernetworking/plugins/
+ PLUGINS="plugins/meta/* plugins/main/*"
+ mkdir -p ${WORKDIR}/plugins/bin/
+ for p in $PLUGINS; do
+ plugin="$(basename "$p")"
+ echo "building: $p"
+ go build -o ${WORKDIR}/plugins/bin/$plugin github.com/containernetworking/plugins/$p
+ done
+}
+
+do_install() {
+ localbindir="/opt/cni/bin"
+
+ install -d ${D}${localbindir}
+ install -d ${D}/${sysconfdir}/cni/net.d
+
+ install -m 755 ${S}/src/import/cnitool/cnitool ${D}/${localbindir}
+ install -m 755 -D ${WORKDIR}/plugins/bin/* ${D}/${localbindir}
+}
+
+FILES_${PN} += "/opt/cni/bin/*"
+
+INHIBIT_PACKAGE_STRIP = "1"
+INSANE_SKIP_${PN} += "ldflags already-stripped"
diff --git a/import-layers/meta-virtualization/recipes-networking/netns/files/0001-Use-correct-go-cross-compiler.patch b/import-layers/meta-virtualization/recipes-networking/netns/files/0001-Use-correct-go-cross-compiler.patch
new file mode 100644
index 0000000..ed66e11
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/netns/files/0001-Use-correct-go-cross-compiler.patch
@@ -0,0 +1,77 @@
+From d5c319bb61155d94bef2571a095d82983d786b94 Mon Sep 17 00:00:00 2001
+From: Paul Barker <pbarker@toganlabs.com>
+Date: Fri, 13 Oct 2017 17:58:11 +0000
+Subject: [PATCH] Use correct go cross-compiler
+
+Signed-off-by: Paul Barker <pbarker@toganlabs.com>
+Upstream-status: Pending
+---
+ Makefile | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index cb9a46d..633f884 100644
+--- a/src/import/Makefile
++++ b/src/import/Makefile
+@@ -33,12 +33,12 @@ build: $(NAME) ## Builds a dynamic executable or package
+
+ $(NAME): *.go VERSION
+ @echo "+ $@"
+- go build -tags "$(BUILDTAGS)" ${GO_LDFLAGS} -o $(NAME) .
++ $(GO) build -tags "$(BUILDTAGS)" ${GO_LDFLAGS} -o $(NAME) .
+
+ .PHONY: static
+ static: ## Builds a static executable
+ @echo "+ $@"
+- CGO_ENABLED=0 go build \
++ CGO_ENABLED=0 $(GO) build \
+ -tags "$(BUILDTAGS) static_build" \
+ ${GO_LDFLAGS_STATIC} -o $(NAME) .
+
+@@ -55,21 +55,21 @@ lint: ## Verifies `golint` passes
+ .PHONY: test
+ test: ## Runs the go tests
+ @echo "+ $@"
+- @go test -v -tags "$(BUILDTAGS) cgo" $(shell go list ./... | grep -v vendor)
++ @$(GO) test -v -tags "$(BUILDTAGS) cgo" $(shell $(GO) list ./... | grep -v vendor)
+
+ .PHONY: vet
+ vet: ## Verifies `go vet` passes
+ @echo "+ $@"
+- @go vet $(shell go list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr
++ @$(GO) vet $(shell $(GO) list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr
+
+ .PHONY: install
+ install: ## Installs the executable or package
+ @echo "+ $@"
+- @go install .
++ @$(GO) install .
+
+ define buildpretty
+ mkdir -p $(BUILDDIR)/$(1)/$(2);
+-GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 go build \
++GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 $(GO) build \
+ -o $(BUILDDIR)/$(1)/$(2)/$(NAME) \
+ -a -tags "$(BUILDTAGS) static_build netgo" \
+ -installsuffix netgo ${GO_LDFLAGS_STATIC} .;
+@@ -83,7 +83,7 @@ cross: *.go VERSION ## Builds the cross-compiled binaries, creating a clean dire
+ $(foreach GOOSARCH,$(GOOSARCHES), $(call buildpretty,$(subst /,,$(dir $(GOOSARCH))),$(notdir $(GOOSARCH))))
+
+ define buildrelease
+-GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 go build \
++GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 $(GO) build \
+ -o $(BUILDDIR)/$(NAME)-$(1)-$(2) \
+ -a -tags "$(BUILDTAGS) static_build netgo" \
+ -installsuffix netgo ${GO_LDFLAGS_STATIC} .;
+@@ -99,7 +99,7 @@ release: *.go VERSION ## Builds the cross-compiled binaries, naming them in such
+ .PHONY: bump-version
+ BUMP := patch
+ bump-version: ## Bump the version in the version file. Set KIND to [ patch | major | minor ]
+- @go get -u github.com/jessfraz/junk/sembump # update sembump tool
++ @$(GO) get -u github.com/jessfraz/junk/sembump # update sembump tool
+ $(eval NEW_VERSION = $(shell sembump --kind $(BUMP) $(VERSION)))
+ @echo "Bumping VERSION from $(VERSION) to $(NEW_VERSION)"
+ echo $(NEW_VERSION) > VERSION
+--
+2.7.4
+
diff --git a/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb b/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb
index 641d55f..d35836e 100644
--- a/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb
+++ b/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb
@@ -1,11 +1,14 @@
HOMEPAGE = "https://github.com/jfrazelle/netns"
SUMMARY = "Runc hook for setting up default bridge networking."
LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=20ce4c6a4f32d6ee4a68e3a7506db3f1"
+LIC_FILES_CHKSUM = "file://src/import/LICENSE;md5=20ce4c6a4f32d6ee4a68e3a7506db3f1"
-SRC_URI = "git://github.com/jessfraz/netns;branch=master"
-SRCREV = "85b1ab9fcccbaa404a2636b52a48bbde02437cf7"
-PV = "0.1.0+git${SRCPV}"
+SRC_URI = "git://github.com/jessfraz/netns;branch=master \
+ file://0001-Use-correct-go-cross-compiler.patch \
+ "
+SRCREV = "74e23a0e5c4e7ac011aafcc4623586c196f1b3ef"
+PV = "0.2.1"
+GO_IMPORT = "import"
S = "${WORKDIR}/git"
@@ -20,12 +23,13 @@
# Go looks in a src directory under any directory in GOPATH but netns
# uses 'vendor' instead of 'vendor/src'. We can fix this with a symlink.
#
- # We also need to link in the ipallocator directory as that is not under
- # a src directory.
- ln -sfn . "${S}/vendor/src"
- mkdir -p "${S}/vendor/src/github.com/jessfraz/netns"
- ln -sfn "${S}/ipallocator" "${S}/vendor/src/github.com/jessfraz/netns/ipallocator"
- export GOPATH="${S}/vendor"
+ # We also need to link in the ipallocator and version directories as
+ # they are not under the src directory.
+ ln -sfn . "${S}/src/import/vendor/src"
+ mkdir -p "${S}/src/import/vendor/src/github.com/jessfraz/netns"
+ ln -sfn "${S}/src/import/ipallocator" "${S}/src/import/vendor/src/github.com/jessfraz/netns/ipallocator"
+ ln -sfn "${S}/src/import/version" "${S}/src/import/vendor/src/github.com/jessfraz/netns/version"
+ export GOPATH="${S}/src/import/vendor"
# Pass the needed cflags/ldflags so that cgo
# can find the needed headers files and libraries
@@ -35,10 +39,11 @@
export CGO_CFLAGS="${BUILDSDK_CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
export CGO_LDFLAGS="${BUILDSDK_LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+ cd ${S}/src/import
oe_runmake static
}
do_install() {
install -d ${D}/${sbindir}
- install ${S}/netns ${D}/${sbindir}/netns
+ install ${S}/src/import/netns ${D}/${sbindir}/netns
}
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/configure-Only-link-against-libpcap-on-FreeBSD.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/configure-Only-link-against-libpcap-on-FreeBSD.patch
deleted file mode 100644
index 0a44b85..0000000
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/configure-Only-link-against-libpcap-on-FreeBSD.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From d30e714ccb9d13caf39d14d5b2fc9523b678ed51 Mon Sep 17 00:00:00 2001
-From: Ben Pfaff <blp@nicira.com>
-Date: Thu, 14 Mar 2013 15:20:55 -0700
-Subject: [PATCH] configure: Only link against libpcap on FreeBSD.
-
-commit d30e714ccb9d13caf39d14d5b2fc9523b678ed51 upstream
-http://git.openvswitch.org/git/openvswitch
-
-On other platforms there is no benefit to linking against libpcap, because
-it is not used.
-
-Signed-off-by: Ben Pfaff <blp@nicira.com>
-CC: Ed Maste <emaste@freebsd.org>
----
- acinclude.m4 | 7 ++++++-
- configure.ac | 3 +--
- 2 files changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/acinclude.m4 b/acinclude.m4
-index f0610c9..19a47dd 100644
---- a/acinclude.m4
-+++ b/acinclude.m4
-@@ -1,6 +1,6 @@
- # -*- autoconf -*-
-
--# Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
-+# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
-@@ -295,6 +295,8 @@ AC_DEFUN([OVS_CHECK_IF_PACKET],
- fi])
-
- dnl Checks for net/if_dl.h.
-+dnl
-+dnl (We use this as a proxy for checking whether we're building on FreeBSD.)
- AC_DEFUN([OVS_CHECK_IF_DL],
- [AC_CHECK_HEADER([net/if_dl.h],
- [HAVE_IF_DL=yes],
-@@ -303,6 +305,9 @@ AC_DEFUN([OVS_CHECK_IF_DL],
- if test "$HAVE_IF_DL" = yes; then
- AC_DEFINE([HAVE_IF_DL], [1],
- [Define to 1 if net/if_dl.h is available.])
-+
-+ # On FreeBSD we use libpcap to access network devices.
-+ AC_SEARCH_LIBS([pcap_open_live], [pcap])
- fi])
-
- dnl Checks for buggy strtok_r.
-diff --git a/configure.ac b/configure.ac
-index 1cacd29..bd49179 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1,4 +1,4 @@
--# Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
-+# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
-@@ -44,7 +44,6 @@ AC_SYS_LARGEFILE
- AC_SEARCH_LIBS([pow], [m])
- AC_SEARCH_LIBS([clock_gettime], [rt])
- AC_SEARCH_LIBS([timer_create], [rt])
--AC_SEARCH_LIBS([pcap_open_live], [pcap])
-
- OVS_CHECK_ESX
- OVS_CHECK_COVERAGE
---
-1.8.3.2
-
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch
index 68f46ff..4441c1e 100644
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch
@@ -33,7 +33,7 @@
+++ b/build-aux/check-structs
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
import os.path
import sys
@@ -43,7 +43,7 @@
+++ b/build-aux/extract-ofp-actions
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
import sys
import os.path
@@ -53,7 +53,7 @@
+++ b/build-aux/extract-ofp-errors
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
import sys
import os.path
@@ -63,7 +63,7 @@
+++ b/build-aux/extract-ofp-fields
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
import getopt
import sys
@@ -73,7 +73,7 @@
+++ b/build-aux/extract-ofp-msgs
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
import sys
import os.path
@@ -83,7 +83,7 @@
+++ b/build-aux/xml2nroff
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
# Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
#
@@ -93,7 +93,7 @@
+++ b/ovn/utilities/ovn-docker-overlay-driver
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
# Copyright (C) 2015 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -103,7 +103,7 @@
+++ b/ovn/utilities/ovn-docker-underlay-driver
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
# Copyright (C) 2015 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -113,7 +113,7 @@
+++ b/ovsdb/ovsdb-doc
@@ -1,4 +1,4 @@
-#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
# Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
#
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-switch-remaining-scripts-to-use-python3.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-switch-remaining-scripts-to-use-python3.patch
new file mode 100644
index 0000000..a02b2a4
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-switch-remaining-scripts-to-use-python3.patch
@@ -0,0 +1,113 @@
+From 176528ca3a8b76c9d0bb71b1e56eeebccc655c71 Mon Sep 17 00:00:00 2001
+From: Mark Asselstine <mark.asselstine@windriver.com>
+Date: Wed, 3 May 2017 10:39:12 -0400
+Subject: [PATCH] python: switch remaining scripts to use python3
+
+Work to remove the main openvswitch package's dependency on python 2.
+
+Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
+---
+ ofproto/ipfix-gen-entities | 2 +-
+ tests/test-l7.py | 2 +-
+ utilities/checkpatch.py | 2 +-
+ utilities/ovs-dev.py | 2 +-
+ utilities/ovs-pipegen.py | 2 +-
+ vtep/ovs-vtep | 2 +-
+ xenserver/etc_xapi.d_plugins_openvswitch-cfg-update | 2 +-
+ xenserver/opt_xensource_libexec_interface-reconfigure | 2 +-
+ xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync | 2 +-
+ 9 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/ofproto/ipfix-gen-entities b/ofproto/ipfix-gen-entities
+index 0be7199..d2cce42 100755
+--- a/ofproto/ipfix-gen-entities
++++ b/ofproto/ipfix-gen-entities
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ #
+ # Copyright (C) 2012 Nicira, Inc.
+ #
+diff --git a/tests/test-l7.py b/tests/test-l7.py
+index d7854a1..f09defb 100755
+--- a/tests/test-l7.py
++++ b/tests/test-l7.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # Copyright (c) 2015, 2016 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
+index 26eb5c3..2e1932b 100755
+--- a/utilities/checkpatch.py
++++ b/utilities/checkpatch.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # Copyright (c) 2016 Red Hat, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/utilities/ovs-dev.py b/utilities/ovs-dev.py
+index 9ce0f04..839e13e 100755
+--- a/utilities/ovs-dev.py
++++ b/utilities/ovs-dev.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # Copyright (c) 2013, 2014, 2015, 2016 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/utilities/ovs-pipegen.py b/utilities/ovs-pipegen.py
+index 4bf240f..2a8f13e 100755
+--- a/utilities/ovs-pipegen.py
++++ b/utilities/ovs-pipegen.py
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ # Copyright (c) 2013, 2014, 2015 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/vtep/ovs-vtep b/vtep/ovs-vtep
+index fd652d4..19d63f9 100755
+--- a/vtep/ovs-vtep
++++ b/vtep/ovs-vtep
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ # Copyright (C) 2013 Nicira, Inc. All Rights Reserved.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update
+index e7404e3..5edad76 100755
+--- a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update
++++ b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ #
+ # xapi plugin script to update the cache of configuration items in the
+ # ovs-vswitchd configuration that are managed in the xapi database when
+diff --git a/xenserver/opt_xensource_libexec_interface-reconfigure b/xenserver/opt_xensource_libexec_interface-reconfigure
+index ea4a742..c6745ee 100755
+--- a/xenserver/opt_xensource_libexec_interface-reconfigure
++++ b/xenserver/opt_xensource_libexec_interface-reconfigure
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ #
+ # Copyright (c) 2008,2009 Citrix Systems, Inc.
+ #
+diff --git a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
+index a776c00..d5ff8af 100755
+--- a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
++++ b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ # Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+--
+2.7.4
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0001-Python3-compatibility-Convert-print-statements.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0001-Python3-compatibility-Convert-print-statements.patch
new file mode 100644
index 0000000..d619758
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0001-Python3-compatibility-Convert-print-statements.patch
@@ -0,0 +1,1264 @@
+From c5c18f9c5f1b7217d43af43be9736c1762c7ebba Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 1/8] Python3 compatibility: Convert print statements
+
+Commit d34a1cc02536f9a812517a71accec3fbd3c6c98b from
+https://github.com/openvswitch/ovs.git
+
+This patch fixes up all the print statements to work with python3 or
+python2.
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/check-structs | 4 +-
+ build-aux/extract-ofp-actions | 68 +++---
+ build-aux/extract-ofp-errors | 2 +-
+ build-aux/extract-ofp-fields | 2 +-
+ build-aux/extract-ofp-msgs | 6 +-
+ ovsdb/ovsdb-doc | 6 +-
+ ovsdb/ovsdb-idlc.in | 523 +++++++++++++++++++++---------------------
+ 7 files changed, 306 insertions(+), 305 deletions(-)
+
+diff --git a/build-aux/check-structs b/build-aux/check-structs
+index f79f235..bae511f 100755
+--- a/build-aux/check-structs
++++ b/build-aux/check-structs
+@@ -211,7 +211,7 @@ def checkStructs():
+
+ if '--help' in sys.argv:
+ argv0 = os.path.basename(sys.argv[0])
+- print '''\
++ print('''\
+ %(argv0)s, for checking struct and struct member alignment
+ usage: %(argv0)s -Ipath HEADER [HEADER]...
+
+@@ -226,7 +226,7 @@ assertions using OFP_ASSERT.
+
+ This program is specialized for reading Open vSwitch's OpenFlow header
+ files. It will not work on arbitrary header files without extensions.\
+-''' % {"argv0": argv0}
++''' % {"argv0": argv0})
+ sys.exit(0)
+
+ global fileName
+diff --git a/build-aux/extract-ofp-actions b/build-aux/extract-ofp-actions
+index 0062ab8..874e6b4 100755
+--- a/build-aux/extract-ofp-actions
++++ b/build-aux/extract-ofp-actions
+@@ -67,7 +67,7 @@ def fatal(msg):
+
+ def usage():
+ argv0 = os.path.basename(sys.argv[0])
+- print ('''\
++ print('''\
+ %(argv0)s, for extracting OpenFlow action data
+ usage: %(argv0)s OFP_ACTIONS.C [--prototypes | --definitions]
+
+@@ -238,36 +238,36 @@ def extract_ofp_actions(fn, definitions):
+ if n_errors:
+ sys.exit(1)
+
+- print """\
++ print("""\
+ /* Generated automatically; do not modify! -*- buffer-read-only: t -*- */
+-"""
++""")
+
+ if definitions:
+- print "/* Verify that structs used as actions are reasonable sizes. */"
++ print("/* Verify that structs used as actions are reasonable sizes. */")
+ for s in sorted(arg_structs):
+- print "BUILD_ASSERT_DECL(sizeof(%s) %% OFP_ACTION_ALIGN == 0);" % s
++ print("BUILD_ASSERT_DECL(sizeof(%s) %% OFP_ACTION_ALIGN == 0);" % s)
+
+- print "\nstatic struct ofpact_raw_instance all_raw_instances[] = {"
++ print("\nstatic struct ofpact_raw_instance all_raw_instances[] = {")
+ for vendor in domain:
+ for type_ in domain[vendor]:
+ for version in domain[vendor][type_]:
+ d = domain[vendor][type_][version]
+- print " { { 0x%08x, %2d, 0x%02x }, " % (
+- vendor, type_, version)
+- print " %s," % d["enum"]
+- print " HMAP_NODE_NULL_INITIALIZER,"
+- print " HMAP_NODE_NULL_INITIALIZER,"
+- print " %s," % d["min_length"]
+- print " %s," % d["max_length"]
+- print " %s," % d["arg_ofs"]
+- print " %s," % d["arg_len"]
+- print " \"%s\"," % re.sub('_RAW[0-9]*', '', d["enum"], 1)
++ print(" { { 0x%08x, %2d, 0x%02x }, " % (
++ vendor, type_, version))
++ print(" %s," % d["enum"])
++ print(" HMAP_NODE_NULL_INITIALIZER,")
++ print(" HMAP_NODE_NULL_INITIALIZER,")
++ print(" %s," % d["min_length"])
++ print(" %s," % d["max_length"])
++ print(" %s," % d["arg_ofs"])
++ print(" %s," % d["arg_len"])
++ print(" \"%s\"," % re.sub('_RAW[0-9]*', '', d["enum"], 1))
+ if d["deprecation"]:
+- print " \"%s\"," % re.sub(r'(["\\])', r'\\\1', d["deprecation"])
++ print(" \"%s\"," % re.sub(r'(["\\])', r'\\\1', d["deprecation"]))
+ else:
+- print " NULL,"
+- print " },"
+- print "};";
++ print(" NULL,")
++ print(" },")
++ print("};")
+
+ for versions in enums.values():
+ need_ofp_version = False
+@@ -314,11 +314,11 @@ def extract_ofp_actions(fn, definitions):
+ decl += "}"
+ else:
+ decl += ";"
+- print decl
+- print
++ print(decl)
++ print("")
+
+ if definitions:
+- print """\
++ print("""\
+ static enum ofperr
+ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+ enum ofp_version version, uint64_t arg,
+@@ -326,14 +326,14 @@ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+ uint64_t *tlv_bitmap, struct ofpbuf *out)
+ {
+ switch (raw) {\
+-"""
++""")
+ for versions in enums.values():
+ enum = versions[0]["enum"]
+- print " case %s:" % enum
++ print(" case %s:" % enum)
+ base_argtype = versions[0]["base_argtype"]
+ arg_vl_mff_map = versions[0]["arg_vl_mff_map"]
+ if base_argtype == 'void':
+- print " return decode_%s(out);" % enum
++ print(" return decode_%s(out);" % enum)
+ else:
+ if base_argtype.startswith('struct'):
+ arg = "ALIGNED_CAST(const %s *, a)" % base_argtype
+@@ -344,16 +344,16 @@ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+ else:
+ arg = "arg"
+ if arg_vl_mff_map:
+- print " return decode_%s(%s, version, vl_mff_map, tlv_bitmap, out);" % (enum, arg)
++ print(" return decode_%s(%s, version, vl_mff_map, tlv_bitmap, out);" % (enum, arg))
+ else:
+- print " return decode_%s(%s, version, out);" % (enum, arg)
+- print
+- print """\
++ print(" return decode_%s(%s, version, out);" % (enum, arg))
++ print("")
++ print("""\
+ default:
+ OVS_NOT_REACHED();
+ }
+ }\
+-"""
++""")
+ else:
+ for versions in enums.values():
+ enum = versions[0]["enum"]
+@@ -368,15 +368,15 @@ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+ if arg_vl_mff_map:
+ prototype += 'const struct vl_mff_map *, uint64_t *, '
+ prototype += "struct ofpbuf *);"
+- print prototype
++ print(prototype)
+
+- print """
++ print("""
+ static enum ofperr ofpact_decode(const struct ofp_action_header *,
+ enum ofp_raw_action_type raw,
+ enum ofp_version version,
+ uint64_t arg, const struct vl_mff_map *vl_mff_map,
+ uint64_t *tlv_bitmap, struct ofpbuf *out);
+-"""
++""")
+
+ if __name__ == '__main__':
+ if '--help' in sys.argv:
+diff --git a/build-aux/extract-ofp-errors b/build-aux/extract-ofp-errors
+index 2312b76..336a240 100755
+--- a/build-aux/extract-ofp-errors
++++ b/build-aux/extract-ofp-errors
+@@ -426,7 +426,7 @@ static const struct ofperr_domain %s = {
+ vendor, type_, code = map[enum]
+ if code == None:
+ code = -1
+- print " { %#8x, %2d, %3d }, /* %s */" % (vendor, type_, code, enum)
++ print (" { %#8x, %2d, %3d }, /* %s */" % (vendor, type_, code, enum))
+ else:
+ print (" { -1, -1, -1 }, /* %s */" % enum)
+ print ("""\
+diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
+index 498b887..425a85f 100755
+--- a/build-aux/extract-ofp-fields
++++ b/build-aux/extract-ofp-fields
+@@ -728,7 +728,7 @@ def make_ovs_fields(meta_flow_h, meta_flow_xml):
+ ovs\-fields \- protocol header fields in OpenFlow and Open vSwitch
+ .
+ .PP
+-''') % version
++''' % version)
+
+ recursively_replace(doc, 'oxm_classes', make_oxm_classes_xml(document))
+
+diff --git a/build-aux/extract-ofp-msgs b/build-aux/extract-ofp-msgs
+index 1813638..a67e870 100755
+--- a/build-aux/extract-ofp-msgs
++++ b/build-aux/extract-ofp-msgs
+@@ -56,14 +56,14 @@ def fatal(msg):
+
+ def usage():
+ argv0 = os.path.basename(sys.argv[0])
+- print '''\
++ print('''\
+ %(argv0)s, for extracting OpenFlow message types from header files
+ usage: %(argv0)s INPUT OUTPUT
+ where INPUT is the name of the input header file
+ and OUTPUT is the output file name.
+ Despite OUTPUT, the output is written to stdout, and the OUTPUT argument
+ only controls #line directives in the output.\
+-''' % {"argv0": argv0}
++''' % {"argv0": argv0})
+ sys.exit(0)
+
+ def make_sizeof(s):
+@@ -378,5 +378,5 @@ if __name__ == '__main__':
+ line_number = 0
+
+ for line in extract_ofp_msgs(sys.argv[2]):
+- print line
++ print(line)
+
+diff --git a/ovsdb/ovsdb-doc b/ovsdb/ovsdb-doc
+index 5cf26ee..b34fb11 100755
+--- a/ovsdb/ovsdb-doc
++++ b/ovsdb/ovsdb-doc
+@@ -258,7 +258,7 @@ represent strong references; thin lines represent weak references.
+ return s
+
+ def usage():
+- print """\
++ print("""\
+ %(argv0)s: ovsdb schema documentation generator
+ Prints documentation for an OVSDB schema as an nroff-formatted manpage.
+ usage: %(argv0)s [OPTIONS] SCHEMA XML
+@@ -269,7 +269,7 @@ The following options are also available:
+ --er-diagram=DIAGRAM.PIC include E-R diagram from DIAGRAM.PIC
+ --version=VERSION use VERSION to display on document footer
+ -h, --help display this help message\
+-""" % {'argv0': argv0}
++""" % {'argv0': argv0})
+ sys.exit(0)
+
+ if __name__ == "__main__":
+@@ -304,7 +304,7 @@ if __name__ == "__main__":
+ for line in s.split("\n"):
+ line = line.strip()
+ if len(line):
+- print line
++ print(line)
+
+ except error.Error, e:
+ sys.stderr.write("%s: %s\n" % (argv0, e.msg))
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 721ab50..1064448 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -1,5 +1,6 @@
+ #! @PYTHON@
+
++from __future__ import print_function
+ import getopt
+ import os
+ import re
+@@ -123,7 +124,7 @@ def sorted_columns(table):
+ def printCIDLHeader(schemaFile):
+ schema = parseSchema(schemaFile)
+ prefix = schema.idlPrefix
+- print '''\
++ print('''\
+ /* Generated automatically -- do not modify! -*- buffer-read-only: t -*- */
+
+ #ifndef %(prefix)sIDL_HEADER
+@@ -135,39 +136,39 @@ def printCIDLHeader(schemaFile):
+ #include "ovsdb-data.h"
+ #include "ovsdb-idl-provider.h"
+ #include "smap.h"
+-#include "uuid.h"''' % {'prefix': prefix.upper()}
++#include "uuid.h"''' % {'prefix': prefix.upper()})
+
+ for tableName, table in sorted(schema.tables.iteritems()):
+ structName = "%s%s" % (prefix, tableName.lower())
+
+- print ""
+- print "/* %s table. */" % tableName
+- print "struct %s {" % structName
+- print "\tstruct ovsdb_idl_row header_;"
++ print("")
++ print("/* %s table. */" % tableName)
++ print("struct %s {" % structName)
++ print("\tstruct ovsdb_idl_row header_;")
+ for columnName, column in sorted_columns(table):
+- print "\n\t/* %s column. */" % columnName
++ print("\n\t/* %s column. */" % columnName)
+ comment, members = cMembers(prefix, tableName,
+ columnName, column, False)
+ for member in members:
+- print "\t%(type)s%(name)s;%(comment)s" % member
+- print "};"
++ print("\t%(type)s%(name)s;%(comment)s" % member)
++ print("};")
+
+ # Column indexes.
+ printEnum("%s_column_id" % structName.lower(), ["%s_COL_%s" % (structName.upper(), columnName.upper())
+ for columnName, column in sorted_columns(table)]
+ + ["%s_N_COLUMNS" % structName.upper()])
+
+- print
++ print("")
+ for columnName in table.columns:
+- print "#define %(s)s_col_%(c)s (%(s)s_columns[%(S)s_COL_%(C)s])" % {
++ print("#define %(s)s_col_%(c)s (%(s)s_columns[%(S)s_COL_%(C)s])" % {
+ 's': structName,
+ 'S': structName.upper(),
+ 'c': columnName,
+- 'C': columnName.upper()}
++ 'C': columnName.upper()})
+
+- print "\nextern struct ovsdb_idl_column %s_columns[%s_N_COLUMNS];" % (structName, structName.upper())
++ print("\nextern struct ovsdb_idl_column %s_columns[%s_N_COLUMNS];" % (structName, structName.upper()))
+
+- print '''
++ print('''
+ const struct %(s)s *%(s)s_get_for_uuid(const struct ovsdb_idl *, const struct uuid *);
+ const struct %(s)s *%(s)s_first(const struct ovsdb_idl *);
+ const struct %(s)s *%(s)s_next(const struct %(s)s *);
+@@ -205,87 +206,87 @@ void %(s)s_init(struct %(s)s *);
+ void %(s)s_delete(const struct %(s)s *);
+ struct %(s)s *%(s)s_insert(struct ovsdb_idl_txn *);
+ bool %(s)s_is_updated(const struct %(s)s *, enum %(s)s_column_id);
+-''' % {'s': structName, 'S': structName.upper()}
++''' % {'s': structName, 'S': structName.upper()})
+
+ for columnName, column in sorted_columns(table):
+- print 'void %(s)s_verify_%(c)s(const struct %(s)s *);' % {'s': structName, 'c': columnName}
++ print('void %(s)s_verify_%(c)s(const struct %(s)s *);' % {'s': structName, 'c': columnName})
+
+- print
++ print("")
+ for columnName, column in sorted_columns(table):
+ if column.type.value:
+ valueParam = ', enum ovsdb_atomic_type value_type'
+ else:
+ valueParam = ''
+- print 'const struct ovsdb_datum *%(s)s_get_%(c)s(const struct %(s)s *, enum ovsdb_atomic_type key_type%(v)s);' % {
+- 's': structName, 'c': columnName, 'v': valueParam}
++ print('const struct ovsdb_datum *%(s)s_get_%(c)s(const struct %(s)s *, enum ovsdb_atomic_type key_type%(v)s);' % {
++ 's': structName, 'c': columnName, 'v': valueParam})
+
+- print
++ print("")
+ for columnName, column in sorted_columns(table):
+- print 'void %(s)s_set_%(c)s(const struct %(s)s *,' % {'s': structName, 'c': columnName},
++ print('void %(s)s_set_%(c)s(const struct %(s)s *,' % {'s': structName, 'c': columnName}, end=' ')
+ if column.type.is_smap():
+ args = ['const struct smap *']
+ else:
+ comment, members = cMembers(prefix, tableName, columnName,
+ column, True)
+ args = ['%(type)s%(name)s' % member for member in members]
+- print '%s);' % ', '.join(args)
++ print('%s);' % ', '.join(args))
+
+- print
++ print("")
+ for columnName, column in sorted_columns(table):
+ if column.type.is_map():
+- print 'void %(s)s_update_%(c)s_setkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+- print '%(coltype)s, %(valtype)s);' % {'coltype':column.type.key.to_const_c_type(prefix), 'valtype':column.type.value.to_const_c_type(prefix)}
+- print 'void %(s)s_update_%(c)s_delkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+- print '%(coltype)s);' % {'coltype':column.type.key.to_const_c_type(prefix)}
++ print('void %(s)s_update_%(c)s_setkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++ print('%(coltype)s, %(valtype)s);' % {'coltype':column.type.key.to_const_c_type(prefix), 'valtype':column.type.value.to_const_c_type(prefix)})
++ print('void %(s)s_update_%(c)s_delkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++ print('%(coltype)s);' % {'coltype':column.type.key.to_const_c_type(prefix)})
+ if column.type.is_set():
+- print 'void %(s)s_update_%(c)s_addvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+- print '%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)}
+- print 'void %(s)s_update_%(c)s_delvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+- print '%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)}
++ print('void %(s)s_update_%(c)s_addvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++ print('%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)})
++ print('void %(s)s_update_%(c)s_delvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++ print('%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)})
+
+- print 'void %(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *, enum ovsdb_function function,' % {'s': structName, 'c': columnName},
++ print('void %(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *, enum ovsdb_function function,' % {'s': structName, 'c': columnName}, end=' ')
+ if column.type.is_smap():
+ args = ['const struct smap *']
+ else:
+ comment, members = cMembers(prefix, tableName, columnName,
+ column, True, refTable=False)
+ args = ['%(type)s%(name)s' % member for member in members]
+- print '%s);' % ', '.join(args)
++ print('%s);' % ', '.join(args))
+
+- print 'void %(s)s_set_condition(struct ovsdb_idl *, struct ovsdb_idl_condition *);' % {'s': structName},
++ print('void %(s)s_set_condition(struct ovsdb_idl *, struct ovsdb_idl_condition *);' % {'s': structName})
+
+- print
++ print("")
+
+ # Table indexes.
+ printEnum("%stable_id" % prefix.lower(), ["%sTABLE_%s" % (prefix.upper(), tableName.upper()) for tableName in sorted(schema.tables)] + ["%sN_TABLES" % prefix.upper()])
+- print
++ print("")
+ for tableName in schema.tables:
+- print "#define %(p)stable_%(t)s (%(p)stable_classes[%(P)sTABLE_%(T)s])" % {
++ print("#define %(p)stable_%(t)s (%(p)stable_classes[%(P)sTABLE_%(T)s])" % {
+ 'p': prefix,
+ 'P': prefix.upper(),
+ 't': tableName.lower(),
+- 'T': tableName.upper()}
+- print "\nextern struct ovsdb_idl_table_class %stable_classes[%sN_TABLES];" % (prefix, prefix.upper())
++ 'T': tableName.upper()})
++ print("\nextern struct ovsdb_idl_table_class %stable_classes[%sN_TABLES];" % (prefix, prefix.upper()))
+
+- print "\nextern struct ovsdb_idl_class %sidl_class;" % prefix
++ print("\nextern struct ovsdb_idl_class %sidl_class;" % prefix)
+
+- print "\nconst char * %sget_db_version(void);" % prefix
+- print "\n#endif /* %(prefix)sIDL_HEADER */" % {'prefix': prefix.upper()}
++ print("\nconst char * %sget_db_version(void);" % prefix)
++ print("\n#endif /* %(prefix)sIDL_HEADER */" % {'prefix': prefix.upper()})
+
+ def printEnum(type, members):
+ if len(members) == 0:
+ return
+
+- print "\nenum %s {" % type
++ print("\nenum %s {" % type)
+ for member in members[:-1]:
+- print " %s," % member
+- print " %s" % members[-1]
+- print "};"
++ print(" %s," % member)
++ print(" %s" % members[-1])
++ print("};")
+
+ def printCIDLSource(schemaFile):
+ schema = parseSchema(schemaFile)
+ prefix = schema.idlPrefix
+- print '''\
++ print('''\
+ /* Generated automatically -- do not modify! -*- buffer-read-only: t -*- */
+
+ #include <config.h>
+@@ -296,33 +297,33 @@ def printCIDLSource(schemaFile):
+ #include "ovsdb-error.h"
+ #include "util.h"
+
+-''' % schema.idlHeader
++''' % schema.idlHeader)
+
+ # Cast functions.
+ for tableName, table in sorted(schema.tables.iteritems()):
+ structName = "%s%s" % (prefix, tableName.lower())
+- print '''
++ print('''
+ static struct %(s)s *
+ %(s)s_cast(const struct ovsdb_idl_row *row)
+ {
+ return row ? CONTAINER_OF(row, struct %(s)s, header_) : NULL;
+ }\
+-''' % {'s': structName}
++''' % {'s': structName})
+
+
+ for tableName, table in sorted(schema.tables.iteritems()):
+ structName = "%s%s" % (prefix, tableName.lower())
+- print ""
+- print "/* %s table. */" % (tableName)
++ print("")
++ print("/* %s table. */" % (tableName))
+
+ # Parse functions.
+ for columnName, column in sorted_columns(table):
+- print '''
++ print('''
+ static void
+ %(s)s_parse_%(c)s(struct ovsdb_idl_row *row_, const struct ovsdb_datum *datum)
+ {
+ struct %(s)s *row = %(s)s_cast(row_);''' % {'s': structName,
+- 'c': columnName}
++ 'c': columnName})
+ type = column.type
+ if type.value:
+ keyVar = "row->key_%s" % columnName
+@@ -332,89 +333,89 @@ static void
+ valueVar = None
+
+ if type.is_smap():
+- print " smap_init(&row->%s);" % columnName
+- print " for (size_t i = 0; i < datum->n; i++) {"
+- print " smap_add(&row->%s," % columnName
+- print " datum->keys[i].string,"
+- print " datum->values[i].string);"
+- print " }"
++ print(" smap_init(&row->%s);" % columnName)
++ print(" for (size_t i = 0; i < datum->n; i++) {")
++ print(" smap_add(&row->%s," % columnName)
++ print(" datum->keys[i].string,")
++ print(" datum->values[i].string);")
++ print(" }")
+ elif (type.n_min == 1 and type.n_max == 1) or type.is_optional_pointer():
+- print
+- print " if (datum->n >= 1) {"
++ print("")
++ print(" if (datum->n >= 1) {")
+ if not type.key.ref_table:
+- print " %s = datum->keys[0].%s;" % (keyVar, type.key.type.to_string())
++ print(" %s = datum->keys[0].%s;" % (keyVar, type.key.type.to_string()))
+ else:
+- print " %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->keys[0].uuid));" % (keyVar, prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower())
++ print(" %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->keys[0].uuid));" % (keyVar, prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower()))
+
+ if valueVar:
+ if not type.value.ref_table:
+- print " %s = datum->values[0].%s;" % (valueVar, type.value.type.to_string())
++ print(" %s = datum->values[0].%s;" % (valueVar, type.value.type.to_string()))
+ else:
+- print " %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->values[0].uuid));" % (valueVar, prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower())
+- print " } else {"
+- print " %s" % type.key.initCDefault(keyVar, type.n_min == 0)
++ print(" %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->values[0].uuid));" % (valueVar, prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower()))
++ print(" } else {")
++ print(" %s" % type.key.initCDefault(keyVar, type.n_min == 0))
+ if valueVar:
+- print " %s" % type.value.initCDefault(valueVar, type.n_min == 0)
+- print " }"
++ print(" %s" % type.value.initCDefault(valueVar, type.n_min == 0))
++ print(" }")
+ else:
+ if type.n_max != sys.maxint:
+- print " size_t n = MIN(%d, datum->n);" % type.n_max
++ print(" size_t n = MIN(%d, datum->n);" % type.n_max)
+ nMax = "n"
+ else:
+ nMax = "datum->n"
+- print " %s = NULL;" % keyVar
++ print(" %s = NULL;" % keyVar)
+ if valueVar:
+- print " %s = NULL;" % valueVar
+- print " row->n_%s = 0;" % columnName
+- print " for (size_t i = 0; i < %s; i++) {" % nMax
++ print(" %s = NULL;" % valueVar)
++ print(" row->n_%s = 0;" % columnName)
++ print(" for (size_t i = 0; i < %s; i++) {" % nMax)
+ if type.key.ref_table:
+- print """\
++ print("""\
+ struct %s%s *keyRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->keys[i].uuid));
+ if (!keyRow) {
+ continue;
+ }\
+-""" % (prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower())
++""" % (prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower()))
+ keySrc = "keyRow"
+ else:
+ keySrc = "datum->keys[i].%s" % type.key.type.to_string()
+ if type.value and type.value.ref_table:
+- print """\
++ print("""\
+ struct %s%s *valueRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->values[i].uuid));
+ if (!valueRow) {
+ continue;
+ }\
+-""" % (prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower())
++""" % (prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower()))
+ valueSrc = "valueRow"
+ elif valueVar:
+ valueSrc = "datum->values[i].%s" % type.value.type.to_string()
+- print " if (!row->n_%s) {" % (columnName)
++ print(" if (!row->n_%s) {" % (columnName))
+
+- print " %s = xmalloc(%s * sizeof *%s);" % (
+- keyVar, nMax, keyVar)
++ print(" %s = xmalloc(%s * sizeof *%s);" % (
++ keyVar, nMax, keyVar))
+ if valueVar:
+- print " %s = xmalloc(%s * sizeof *%s);" % (
+- valueVar, nMax, valueVar)
+- print " }"
+- print " %s[row->n_%s] = %s;" % (keyVar, columnName, keySrc)
++ print(" %s = xmalloc(%s * sizeof *%s);" % (
++ valueVar, nMax, valueVar))
++ print(" }")
++ print(" %s[row->n_%s] = %s;" % (keyVar, columnName, keySrc))
+ if valueVar:
+- print " %s[row->n_%s] = %s;" % (valueVar, columnName, valueSrc)
+- print " row->n_%s++;" % columnName
+- print " }"
+- print "}"
++ print(" %s[row->n_%s] = %s;" % (valueVar, columnName, valueSrc))
++ print(" row->n_%s++;" % columnName)
++ print(" }")
++ print("}")
+
+ # Unparse functions.
+ for columnName, column in sorted_columns(table):
+ type = column.type
+ if type.is_smap() or (type.n_min != 1 or type.n_max != 1) and not type.is_optional_pointer():
+- print '''
++ print('''
+ static void
+ %(s)s_unparse_%(c)s(struct ovsdb_idl_row *row_)
+ {
+ struct %(s)s *row = %(s)s_cast(row_);''' % {'s': structName,
+- 'c': columnName}
++ 'c': columnName})
+
+ if type.is_smap():
+- print " smap_destroy(&row->%s);" % columnName
++ print(" smap_destroy(&row->%s);" % columnName)
+ else:
+ if type.value:
+ keyVar = "row->key_%s" % columnName
+@@ -422,45 +423,45 @@ static void
+ else:
+ keyVar = "row->%s" % columnName
+ valueVar = None
+- print " free(%s);" % keyVar
++ print(" free(%s);" % keyVar)
+ if valueVar:
+- print " free(%s);" % valueVar
+- print '}'
++ print(" free(%s);" % valueVar)
++ print('}')
+ else:
+- print '''
++ print('''
+ static void
+ %(s)s_unparse_%(c)s(struct ovsdb_idl_row *row OVS_UNUSED)
+ {
+ /* Nothing to do. */
+-}''' % {'s': structName, 'c': columnName}
++}''' % {'s': structName, 'c': columnName})
+
+ # Generic Row Initialization function.
+- print """
++ print("""
+ static void
+ %(s)s_init__(struct ovsdb_idl_row *row)
+ {
+ %(s)s_init(%(s)s_cast(row));
+-}""" % {'s': structName}
++}""" % {'s': structName})
+
+ # Row Initialization function.
+- print """
++ print("""
+ /* Clears the contents of 'row' in table "%(t)s". */
+ void
+ %(s)s_init(struct %(s)s *row)
+ {
+- memset(row, 0, sizeof *row); """ % {'s': structName, 't': tableName}
++ memset(row, 0, sizeof *row); """ % {'s': structName, 't': tableName})
+ for columnName, column in sorted_columns(table):
+ if column.type.is_smap():
+- print " smap_init(&row->%s);" % columnName
++ print(" smap_init(&row->%s);" % columnName)
+ elif (column.type.n_min == 1 and
+ column.type.n_max == 1 and
+ column.type.key.type == ovs.db.types.StringType and
+ not column.type.value):
+- print " row->%s = \"\";" % columnName
+- print "}"
++ print(" row->%s = \"\";" % columnName)
++ print("}")
+
+ # First, next functions.
+- print '''
++ print('''
+ /* Searches table "%(t)s" in 'idl' for a row with UUID 'uuid'. Returns
+ * a pointer to the row if there is one, otherwise a null pointer. */
+ const struct %(s)s *
+@@ -514,9 +515,9 @@ const struct %(s)s
+ 'P': prefix.upper(),
+ 't': tableName,
+ 'tl': tableName.lower(),
+- 'T': tableName.upper()}
++ 'T': tableName.upper()})
+
+- print '''
++ print('''
+
+ /* Deletes 'row' from table "%(t)s". 'row' may be freed, so it must not be
+ * accessed afterward.
+@@ -550,11 +551,11 @@ bool
+ 'P': prefix.upper(),
+ 't': tableName,
+ 'tl': tableName.lower(),
+- 'T': tableName.upper()}
++ 'T': tableName.upper()})
+
+ # Verify functions.
+ for columnName, column in sorted_columns(table):
+- print '''
++ print('''
+ /* Causes the original contents of column "%(c)s" in 'row' to be
+ * verified as a prerequisite to completing the transaction. That is, if
+ * "%(c)s" in 'row' changed (or if 'row' was deleted) between the
+@@ -585,7 +586,7 @@ void
+ }''' % {'s': structName,
+ 'S': structName.upper(),
+ 'c': columnName,
+- 'C': columnName.upper()}
++ 'C': columnName.upper()})
+
+ # Get functions.
+ for columnName, column in sorted_columns(table):
+@@ -597,7 +598,7 @@ void
+ valueParam = ''
+ valueType = ''
+ valueComment = ''
+- print """
++ print("""
+ /* Returns the "%(c)s" column's value from the "%(t)s" table in 'row'
+ * as a struct ovsdb_datum. This is useful occasionally: for example,
+ * ovsdb_datum_find_key() is an easier and more efficient way to search
+@@ -625,7 +626,7 @@ const struct ovsdb_datum *
+ return ovsdb_idl_read(&row->header_, &%(s)s_col_%(c)s);
+ }""" % {'t': tableName, 's': structName, 'c': columnName,
+ 'kt': column.type.key.toAtomicType(),
+- 'v': valueParam, 'vt': valueType, 'vc': valueComment}
++ 'v': valueParam, 'vt': valueType, 'vc': valueComment})
+
+ # Set functions.
+ for columnName, column in sorted_columns(table):
+@@ -635,8 +636,8 @@ const struct ovsdb_datum *
+ column, True)
+
+ if type.is_smap():
+- print comment
+- print """void
++ print(comment)
++ print("""void
+ %(s)s_set_%(c)s(const struct %(s)s *row, const struct smap *%(c)s)
+ {
+ struct ovsdb_datum datum;
+@@ -654,7 +655,7 @@ const struct ovsdb_datum *
+ 's': structName,
+ 'S': structName.upper(),
+ 'c': columnName,
+- 'C': columnName.upper()}
++ 'C': columnName.upper()})
+ continue
+
+ keyVar = members[0]['name']
+@@ -668,84 +669,84 @@ const struct ovsdb_datum *
+ if len(members) > 1:
+ nVar = members[1]['name']
+
+- print comment
+- print """\
++ print(comment)
++ print("""\
+ void
+ %(s)s_set_%(c)s(const struct %(s)s *row, %(args)s)
+ {
+ struct ovsdb_datum datum;""" % {'s': structName,
+ 'c': columnName,
+ 'args': ', '.join(['%(type)s%(name)s'
+- % m for m in members])}
++ % m for m in members])})
+ if type.n_min == 1 and type.n_max == 1:
+- print " union ovsdb_atom key;"
++ print(" union ovsdb_atom key;")
+ if type.value:
+- print " union ovsdb_atom value;"
+- print
+- print " datum.n = 1;"
+- print " datum.keys = &key;"
+- print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar)
++ print(" union ovsdb_atom value;")
++ print("")
++ print(" datum.n = 1;")
++ print(" datum.keys = &key;")
++ print(" " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar))
+ if type.value:
+- print " datum.values = &value;"
+- print " "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar)
++ print(" datum.values = &value;")
++ print(" "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar))
+ else:
+- print " datum.values = NULL;"
++ print(" datum.values = NULL;")
+ txn_write_func = "ovsdb_idl_txn_write_clone"
+ elif type.is_optional_pointer():
+- print " union ovsdb_atom key;"
+- print
+- print " if (%s) {" % keyVar
+- print " datum.n = 1;"
+- print " datum.keys = &key;"
+- print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar)
+- print " } else {"
+- print " datum.n = 0;"
+- print " datum.keys = NULL;"
+- print " }"
+- print " datum.values = NULL;"
++ print(" union ovsdb_atom key;")
++ print("")
++ print(" if (%s) {" % keyVar)
++ print(" datum.n = 1;")
++ print(" datum.keys = &key;")
++ print(" " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar))
++ print(" } else {")
++ print(" datum.n = 0;")
++ print(" datum.keys = NULL;")
++ print(" }")
++ print(" datum.values = NULL;")
+ txn_write_func = "ovsdb_idl_txn_write_clone"
+ elif type.n_max == 1:
+- print " union ovsdb_atom key;"
+- print
+- print " if (%s) {" % nVar
+- print " datum.n = 1;"
+- print " datum.keys = &key;"
+- print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar)
+- print " } else {"
+- print " datum.n = 0;"
+- print " datum.keys = NULL;"
+- print " }"
+- print " datum.values = NULL;"
++ print(" union ovsdb_atom key;")
++ print("")
++ print(" if (%s) {" % nVar)
++ print(" datum.n = 1;")
++ print(" datum.keys = &key;")
++ print(" " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar))
++ print(" } else {")
++ print(" datum.n = 0;")
++ print(" datum.keys = NULL;")
++ print(" }")
++ print(" datum.values = NULL;")
+ txn_write_func = "ovsdb_idl_txn_write_clone"
+ else:
+- print
+- print " datum.n = %s;" % nVar
+- print " datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar)
++ print("")
++ print(" datum.n = %s;" % nVar)
++ print(" datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar))
+ if type.value:
+- print " datum.values = xmalloc(%s * sizeof *datum.values);" % nVar
++ print(" datum.values = xmalloc(%s * sizeof *datum.values);" % nVar)
+ else:
+- print " datum.values = NULL;"
+- print " for (size_t i = 0; i < %s; i++) {" % nVar
+- print " " + type.key.copyCValue("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar)
++ print(" datum.values = NULL;")
++ print(" for (size_t i = 0; i < %s; i++) {" % nVar)
++ print(" " + type.key.copyCValue("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar))
+ if type.value:
+- print " " + type.value.copyCValue("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar)
+- print " }"
++ print(" " + type.value.copyCValue("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar))
++ print(" }")
+ if type.value:
+ valueType = type.value.toAtomicType()
+ else:
+ valueType = "OVSDB_TYPE_VOID"
+ txn_write_func = "ovsdb_idl_txn_write"
+- print " %(f)s(&row->header_, &%(s)s_col_%(c)s, &datum);" \
++ print(" %(f)s(&row->header_, &%(s)s_col_%(c)s, &datum);" \
+ % {'f': txn_write_func,
+ 's': structName,
+ 'S': structName.upper(),
+- 'c': columnName}
+- print "}"
++ 'c': columnName})
++ print("}")
+ # Update/Delete of partial map column functions
+ for columnName, column in sorted_columns(table):
+ type = column.type
+ if type.is_map():
+- print '''
++ print('''
+ /* Sets an element of the "%(c)s" map column from the "%(t)s" table in 'row'
+ * to 'new_value' given the key value 'new_key'.
+ *
+@@ -761,17 +762,17 @@ void
+ datum->values = xmalloc(datum->n * sizeof *datum->values);
+ ''' % {'s': structName, 'c': columnName,'coltype':column.type.key.to_const_c_type(prefix),
+ 'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper(),
+- 'C': columnName.upper(), 't': tableName}
++ 'C': columnName.upper(), 't': tableName})
+
+- print " "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_key")
+- print " "+ type.value.copyCValue("datum->values[0].%s" % type.value.type.to_string(), "new_value")
+- print '''
++ print(" "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_key"))
++ print(" "+ type.value.copyCValue("datum->values[0].%s" % type.value.type.to_string(), "new_value"))
++ print('''
+ ovsdb_idl_txn_write_partial_map(&row->header_,
+ &%(s)s_col_%(c)s,
+ datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+- 'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()}
+- print '''
++ 'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()})
++ print('''
+ /* Deletes an element of the "%(c)s" map column from the "%(t)s" table in 'row'
+ * given the key value 'delete_key'.
+ *
+@@ -787,19 +788,19 @@ void
+ datum->values = NULL;
+ ''' % {'s': structName, 'c': columnName,'coltype':column.type.key.to_const_c_type(prefix),
+ 'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper(),
+- 'C': columnName.upper(), 't': tableName}
++ 'C': columnName.upper(), 't': tableName})
+
+- print " "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_key")
+- print '''
++ print(" "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_key"))
++ print('''
+ ovsdb_idl_txn_delete_partial_map(&row->header_,
+ &%(s)s_col_%(c)s,
+ datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+- 'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()}
++ 'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()})
+ # End Update/Delete of partial maps
+ # Update/Delete of partial set column functions
+ if type.is_set():
+- print '''
++ print('''
+ /* Adds the value 'new_value' to the "%(c)s" set column from the "%(t)s" table
+ * in 'row'.
+ *
+@@ -814,16 +815,16 @@ void
+ datum->keys = xmalloc(datum->n * sizeof *datum->values);
+ datum->values = NULL;
+ ''' % {'s': structName, 'c': columnName,
+- 'valtype':column.type.key.to_const_c_type(prefix), 't': tableName}
++ 'valtype':column.type.key.to_const_c_type(prefix), 't': tableName})
+
+- print " "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_value")
+- print '''
++ print(" "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_value"))
++ print('''
+ ovsdb_idl_txn_write_partial_set(&row->header_,
+ &%(s)s_col_%(c)s,
+ datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+- 'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()}
+- print '''
++ 'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()})
++ print('''
+ /* Deletes the value 'delete_value' from the "%(c)s" set column from the
+ * "%(t)s" table in 'row'.
+ *
+@@ -839,15 +840,15 @@ void
+ datum->values = NULL;
+ ''' % {'s': structName, 'c': columnName,'coltype':column.type.key.to_const_c_type(prefix),
+ 'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper(),
+- 'C': columnName.upper(), 't': tableName}
++ 'C': columnName.upper(), 't': tableName})
+
+- print " "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_value")
+- print '''
++ print(" "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_value"))
++ print('''
+ ovsdb_idl_txn_delete_partial_set(&row->header_,
+ &%(s)s_col_%(c)s,
+ datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+- 'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()}
++ 'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()})
+ # End Update/Delete of partial set
+
+ # Add clause functions.
+@@ -858,8 +859,8 @@ void
+ column, True, refTable=False)
+
+ if type.is_smap():
+- print comment
+- print """void
++ print(comment)
++ print("""void
+ %(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *cond, enum ovsdb_function function, const struct smap *%(c)s)
+ {
+ struct ovsdb_datum datum;
+@@ -884,7 +885,7 @@ void
+ 'P': prefix.upper(),
+ 's': structName,
+ 'S': structName.upper(),
+- 'c': columnName}
++ 'c': columnName})
+ continue
+
+ keyVar = members[0]['name']
+@@ -898,73 +899,73 @@ void
+ if len(members) > 1:
+ nVar = members[1]['name']
+
+- print comment
+- print 'void'
+- print '%(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *cond, enum ovsdb_function function, %(args)s)' % \
++ print(comment)
++ print('void')
++ print('%(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *cond, enum ovsdb_function function, %(args)s)' % \
+ {'s': structName, 'c': columnName,
+- 'args': ', '.join(['%(type)s%(name)s' % m for m in members])}
+- print "{"
+- print " struct ovsdb_datum datum;"
++ 'args': ', '.join(['%(type)s%(name)s' % m for m in members])})
++ print("{")
++ print(" struct ovsdb_datum datum;")
+ free = []
+ if type.n_min == 1 and type.n_max == 1:
+- print " union ovsdb_atom key;"
++ print(" union ovsdb_atom key;")
+ if type.value:
+- print " union ovsdb_atom value;"
+- print
+- print " datum.n = 1;"
+- print " datum.keys = &key;"
+- print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False)
++ print(" union ovsdb_atom value;")
++ print("")
++ print(" datum.n = 1;")
++ print(" datum.keys = &key;")
++ print(" " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False))
+ if type.value:
+- print " datum.values = &value;"
+- print " "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar, refTable=False)
++ print(" datum.values = &value;")
++ print(" "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar, refTable=False))
+ else:
+- print " datum.values = NULL;"
++ print(" datum.values = NULL;")
+ elif type.is_optional_pointer():
+- print " union ovsdb_atom key;"
+- print
+- print " if (%s) {" % keyVar
+- print " datum.n = 1;"
+- print " datum.keys = &key;"
+- print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False)
+- print " } else {"
+- print " datum.n = 0;"
+- print " datum.keys = NULL;"
+- print " }"
+- print " datum.values = NULL;"
++ print(" union ovsdb_atom key;")
++ print("")
++ print(" if (%s) {" % keyVar)
++ print(" datum.n = 1;")
++ print(" datum.keys = &key;")
++ print(" " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False))
++ print(" } else {")
++ print(" datum.n = 0;")
++ print(" datum.keys = NULL;")
++ print(" }")
++ print(" datum.values = NULL;")
+ elif type.n_max == 1:
+- print " union ovsdb_atom key;"
+- print
+- print " if (%s) {" % nVar
+- print " datum.n = 1;"
+- print " datum.keys = &key;"
+- print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar, refTable=False)
+- print " } else {"
+- print " datum.n = 0;"
+- print " datum.keys = NULL;"
+- print " }"
+- print " datum.values = NULL;"
++ print(" union ovsdb_atom key;")
++ print("")
++ print(" if (%s) {" % nVar)
++ print(" datum.n = 1;")
++ print(" datum.keys = &key;")
++ print(" " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar, refTable=False))
++ print(" } else {")
++ print(" datum.n = 0;")
++ print(" datum.keys = NULL;")
++ print(" }")
++ print(" datum.values = NULL;")
+ else:
+- print " datum.n = %s;" % nVar
+- print " datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar)
++ print(" datum.n = %s;" % nVar)
++ print(" datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar))
+ free += ['datum.keys']
+ if type.value:
+- print " datum.values = xmalloc(%s * sizeof *datum.values);" % nVar
++ print(" datum.values = xmalloc(%s * sizeof *datum.values);" % nVar)
+ free += ['datum.values']
+ else:
+- print " datum.values = NULL;"
+- print " for (size_t i = 0; i < %s; i++) {" % nVar
+- print " " + type.key.assign_c_value_casting_away_const("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar, refTable=False)
++ print(" datum.values = NULL;")
++ print(" for (size_t i = 0; i < %s; i++) {" % nVar)
++ print(" " + type.key.assign_c_value_casting_away_const("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar, refTable=False))
+ if type.value:
+- print " " + type.value.assign_c_value_casting_away_const("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar, refTable=False)
+- print " }"
++ print(" " + type.value.assign_c_value_casting_away_const("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar, refTable=False))
++ print(" }")
+ if type.value:
+ valueType = type.value.toAtomicType()
+ else:
+ valueType = "OVSDB_TYPE_VOID"
+- print " ovsdb_datum_sort_unique(&datum, %s, %s);" % (
+- type.key.toAtomicType(), valueType)
++ print(" ovsdb_datum_sort_unique(&datum, %s, %s);" % (
++ type.key.toAtomicType(), valueType))
+
+- print""" ovsdb_idl_condition_add_clause(cond,
++ print(""" ovsdb_idl_condition_add_clause(cond,
+ function,
+ &%(s)s_col_%(c)s,
+ &datum);\
+@@ -974,28 +975,28 @@ void
+ 'P': prefix.upper(),
+ 's': structName,
+ 'S': structName.upper(),
+- 'c': columnName}
++ 'c': columnName})
+ for var in free:
+- print " free(%s);" % var
+- print "}"
++ print(" free(%s);" % var)
++ print("}")
+
+- print """
++ print("""
+ void
+ %(s)s_set_condition(struct ovsdb_idl *idl, struct ovsdb_idl_condition *condition)
+ {
+ ovsdb_idl_set_condition(idl, &%(p)stable_%(tl)s, condition);
+ }""" % {'p': prefix,
+ 's': structName,
+- 'tl': tableName.lower()}
++ 'tl': tableName.lower()})
+
+ # Table columns.
+ for columnName, column in sorted_columns(table):
+ prereqs = []
+ x = column.type.cInitType("%s_col_%s" % (tableName, columnName), prereqs)
+ if prereqs:
+- print '\n'.join(prereqs)
+- print "\nstruct ovsdb_idl_column %s_columns[%s_N_COLUMNS] = {" % (
+- structName, structName.upper())
++ print('\n'.join(prereqs))
++ print("\nstruct ovsdb_idl_column %s_columns[%s_N_COLUMNS] = {" % (
++ structName, structName.upper()))
+ for columnName, column in sorted_columns(table):
+ if column.mutable:
+ mutable = "true"
+@@ -1003,7 +1004,7 @@ void
+ mutable = "false"
+ type_init = '\n'.join(" " + x
+ for x in column.type.cInitType("%s_col_%s" % (tableName, columnName), prereqs))
+- print """\
++ print("""\
+ [%(P)s%(T)s_COL_%(C)s] = {
+ .name = "%(c)s",
+ .type = {
+@@ -1018,38 +1019,38 @@ void
+ 'C': columnName.upper(),
+ 's': structName,
+ 'mutable': mutable,
+- 'type': type_init}
+- print "};"
++ 'type': type_init})
++ print("};")
+
+ # Table classes.
+- print ""
+- print "struct ovsdb_idl_table_class %stable_classes[%sN_TABLES] = {" % (prefix, prefix.upper())
++ print("")
++ print("struct ovsdb_idl_table_class %stable_classes[%sN_TABLES] = {" % (prefix, prefix.upper()))
+ for tableName, table in sorted(schema.tables.iteritems()):
+ structName = "%s%s" % (prefix, tableName.lower())
+ if table.is_root:
+ is_root = "true"
+ else:
+ is_root = "false"
+- print " {\"%s\", %s," % (tableName, is_root)
+- print " %s_columns, ARRAY_SIZE(%s_columns)," % (
+- structName, structName)
+- print " sizeof(struct %s), %s_init__}," % (structName, structName)
+- print "};"
++ print(" {\"%s\", %s," % (tableName, is_root))
++ print(" %s_columns, ARRAY_SIZE(%s_columns)," % (
++ structName, structName))
++ print(" sizeof(struct %s), %s_init__}," % (structName, structName))
++ print("};")
+
+ # IDL class.
+- print "\nstruct ovsdb_idl_class %sidl_class = {" % prefix
+- print " \"%s\", %stable_classes, ARRAY_SIZE(%stable_classes)" % (
+- schema.name, prefix, prefix)
+- print "};"
++ print("\nstruct ovsdb_idl_class %sidl_class = {" % prefix)
++ print(" \"%s\", %stable_classes, ARRAY_SIZE(%stable_classes)" % (
++ schema.name, prefix, prefix))
++ print("};")
+
+- print """
++ print("""
+ /* Return the schema version. The caller must not free the returned value. */
+ const char *
+ %sget_db_version(void)
+ {
+ return "%s";
+ }
+-""" % (prefix, schema.version)
++""" % (prefix, schema.version))
+
+
+
+@@ -1075,7 +1076,7 @@ def ovsdb_escape(string):
+ return re.sub(r'["\\\000-\037]', escape, string)
+
+ def usage():
+- print """\
++ print("""\
+ %(argv0)s: ovsdb schema compiler
+ usage: %(argv0)s [OPTIONS] COMMAND ARG...
+
+@@ -1087,7 +1088,7 @@ The following commands are supported:
+ The following options are also available:
+ -h, --help display this help message
+ -V, --version display version information\
+-""" % {'argv0': argv0}
++""" % {'argv0': argv0})
+ sys.exit(0)
+
+ if __name__ == "__main__":
+@@ -1105,7 +1106,7 @@ if __name__ == "__main__":
+ if key in ['-h', '--help']:
+ usage()
+ elif key in ['-V', '--version']:
+- print "ovsdb-idlc (Open vSwitch) @VERSION@"
++ print("ovsdb-idlc (Open vSwitch) @VERSION@")
+ elif key in ['-C', '--directory']:
+ os.chdir(value)
+ else:
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0002-Python3-compatibility-exception-cleanup.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0002-Python3-compatibility-exception-cleanup.patch
new file mode 100644
index 0000000..59c0f3e
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0002-Python3-compatibility-exception-cleanup.patch
@@ -0,0 +1,79 @@
+From c98fee41d130cb946aa4e60fefaa6cbf203f6790 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 2/8] Python3 compatibility: exception cleanup
+
+Commit 52e4a477f0b3c0a0ece7adeede6e06e07814f8b9 from
+https://github.com/openvswitch/ovs.git
+
+The exception syntax which is compatible with python2 and python3 is
+to use the "as" form for "except:".
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/extract-ofp-fields | 2 +-
+ ovsdb/ovsdb-doc | 4 ++--
+ ovsdb/ovsdb-idlc.in | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
+index 425a85f..61e752b 100755
+--- a/build-aux/extract-ofp-fields
++++ b/build-aux/extract-ofp-fields
+@@ -784,7 +784,7 @@ if __name__ == "__main__":
+ try:
+ options, args = getopt.gnu_getopt(sys.argv[1:], 'h',
+ ['help', 'ovs-version='])
+- except getopt.GetoptError, geo:
++ except getopt.GetoptError as geo:
+ sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
+ sys.exit(1)
+
+diff --git a/ovsdb/ovsdb-doc b/ovsdb/ovsdb-doc
+index b34fb11..918e88a 100755
+--- a/ovsdb/ovsdb-doc
++++ b/ovsdb/ovsdb-doc
+@@ -278,7 +278,7 @@ if __name__ == "__main__":
+ options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
+ ['er-diagram=',
+ 'version=', 'help'])
+- except getopt.GetoptError, geo:
++ except getopt.GetoptError as geo:
+ sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
+ sys.exit(1)
+
+@@ -306,7 +306,7 @@ if __name__ == "__main__":
+ if len(line):
+ print(line)
+
+- except error.Error, e:
++ except error.Error as e:
+ sys.stderr.write("%s: %s\n" % (argv0, e.msg))
+ sys.exit(1)
+
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 1064448..8b85f0d 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -1098,7 +1098,7 @@ if __name__ == "__main__":
+ ['directory',
+ 'help',
+ 'version'])
+- except getopt.GetoptError, geo:
++ except getopt.GetoptError as geo:
+ sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
+ sys.exit(1)
+
+@@ -1136,7 +1136,7 @@ if __name__ == "__main__":
+ sys.exit(1)
+
+ func(*args[1:])
+- except ovs.db.error.Error, e:
++ except ovs.db.error.Error as e:
+ sys.stderr.write("%s: %s\n" % (argv0, e))
+ sys.exit(1)
+
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0003-Python3-compatibility-execfile-to-exec.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0003-Python3-compatibility-execfile-to-exec.patch
new file mode 100644
index 0000000..a85980e
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0003-Python3-compatibility-execfile-to-exec.patch
@@ -0,0 +1,33 @@
+From 9cbae86be03756df76560c15720756f9ac088144 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 3/8] Python3 compatibility: execfile to exec
+
+Commit a4d10a7ca937d73873f6f98619d88682e69f5dbe from
+https://github.com/openvswitch/ovs.git
+
+Allow compability with python3 and python2 by changing execfile() to
+exec().
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ ovsdb/ovsdb-idlc.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 8b85f0d..3fa1a0f 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -17,7 +17,7 @@ def parseSchema(filename):
+
+ def annotateSchema(schemaFile, annotationFile):
+ schemaJson = ovs.json.from_file(schemaFile)
+- execfile(annotationFile, globals(), {"s": schemaJson})
++ exec(compile(open(annotationFile, "rb").read(), annotationFile, 'exec'), globals(), {"s": schemaJson})
+ ovs.json.to_stream(schemaJson, sys.stdout)
+ sys.stdout.write('\n')
+
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0004-Python3-compatibility-iteritems-to-items.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0004-Python3-compatibility-iteritems-to-items.patch
new file mode 100644
index 0000000..ddc86db
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0004-Python3-compatibility-iteritems-to-items.patch
@@ -0,0 +1,102 @@
+From 0f318e472d9897d99395adcfb17cbeaff05677ba Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 4/8] Python3 compatibility: iteritems to items
+
+Commit 4ab665623cbb4c6506e48b82e0c9fe8585f42e13 from
+https://github.com/openvswitch/ovs.git
+
+Allow compability with python3 and python2 by changing iteritems() to
+items().
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/extract-ofp-actions | 2 +-
+ build-aux/extract-ofp-errors | 2 +-
+ build-aux/extract-ofp-fields | 2 +-
+ ovsdb/ovsdb-idlc.in | 8 ++++----
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/build-aux/extract-ofp-actions b/build-aux/extract-ofp-actions
+index 874e6b4..c11297c 100755
+--- a/build-aux/extract-ofp-actions
++++ b/build-aux/extract-ofp-actions
+@@ -13,7 +13,7 @@ version_map = {"1.0": 0x01,
+ "1.3": 0x04,
+ "1.4": 0x05,
+ "1.5": 0x06}
+-version_reverse_map = dict((v, k) for (k, v) in version_map.iteritems())
++version_reverse_map = dict((v, k) for (k, v) in version_map.items())
+
+ # Map from vendor name to the length of the action header.
+ vendor_map = {"OF": (0x00000000, 4),
+diff --git a/build-aux/extract-ofp-errors b/build-aux/extract-ofp-errors
+index 336a240..71ae0bd 100755
+--- a/build-aux/extract-ofp-errors
++++ b/build-aux/extract-ofp-errors
+@@ -14,7 +14,7 @@ version_map = {"1.0": 0x01,
+ "1.4": 0x05,
+ "1.5": 0x06,
+ "1.6": 0x07}
+-version_reverse_map = dict((v, k) for (k, v) in version_map.iteritems())
++version_reverse_map = dict((v, k) for (k, v) in version_map.items())
+
+ token = None
+ line = ""
+diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
+index 61e752b..ef997dd 100755
+--- a/build-aux/extract-ofp-fields
++++ b/build-aux/extract-ofp-fields
+@@ -16,7 +16,7 @@ VERSION = {"1.0": 0x01,
+ "1.3": 0x04,
+ "1.4": 0x05,
+ "1.5": 0x06}
+-VERSION_REVERSE = dict((v,k) for k, v in VERSION.iteritems())
++VERSION_REVERSE = dict((v,k) for k, v in VERSION.items())
+
+ TYPES = {"u8": (1, False),
+ "be16": (2, False),
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 3fa1a0f..615548f 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -138,7 +138,7 @@ def printCIDLHeader(schemaFile):
+ #include "smap.h"
+ #include "uuid.h"''' % {'prefix': prefix.upper()})
+
+- for tableName, table in sorted(schema.tables.iteritems()):
++ for tableName, table in sorted(schema.tables.items()):
+ structName = "%s%s" % (prefix, tableName.lower())
+
+ print("")
+@@ -300,7 +300,7 @@ def printCIDLSource(schemaFile):
+ ''' % schema.idlHeader)
+
+ # Cast functions.
+- for tableName, table in sorted(schema.tables.iteritems()):
++ for tableName, table in sorted(schema.tables.items()):
+ structName = "%s%s" % (prefix, tableName.lower())
+ print('''
+ static struct %(s)s *
+@@ -311,7 +311,7 @@ static struct %(s)s *
+ ''' % {'s': structName})
+
+
+- for tableName, table in sorted(schema.tables.iteritems()):
++ for tableName, table in sorted(schema.tables.items()):
+ structName = "%s%s" % (prefix, tableName.lower())
+ print("")
+ print("/* %s table. */" % (tableName))
+@@ -1025,7 +1025,7 @@ void
+ # Table classes.
+ print("")
+ print("struct ovsdb_idl_table_class %stable_classes[%sN_TABLES] = {" % (prefix, prefix.upper()))
+- for tableName, table in sorted(schema.tables.iteritems()):
++ for tableName, table in sorted(schema.tables.items()):
+ structName = "%s%s" % (prefix, tableName.lower())
+ if table.is_root:
+ is_root = "true"
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0005-Python3-compatibility-fix-integer-problems.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0005-Python3-compatibility-fix-integer-problems.patch
new file mode 100644
index 0000000..717a97d
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0005-Python3-compatibility-fix-integer-problems.patch
@@ -0,0 +1,51 @@
+From bc29f98f0137fa1083a4cacf832d52f740d150a8 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 5/8] Python3 compatibility: fix integer problems
+
+Commit fa145f1a53943243f94a32ce98525db8494b0052 from
+https://github.com/openvswitch/ovs.git
+
+In python3 maxint is not defined, but maxsize is defined in both
+python2 and python3.
+
+The put_text() will not automatically use a value which came in as
+float due to a pior math function and python3 will throw an exception.
+The simple answer is to convert it with int() and move on.
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ ovsdb/ovsdb-idlc.in | 2 +-
+ python/build/nroff.py | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 615548f..7cbcbf5 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -358,7 +358,7 @@ static void
+ print(" %s" % type.value.initCDefault(valueVar, type.n_min == 0))
+ print(" }")
+ else:
+- if type.n_max != sys.maxint:
++ if type.n_max != sys.maxsize:
+ print(" size_t n = MIN(%d, datum->n);" % type.n_max)
+ nMax = "n"
+ else:
+diff --git a/python/build/nroff.py b/python/build/nroff.py
+index c23837f..401f699 100644
+--- a/python/build/nroff.py
++++ b/python/build/nroff.py
+@@ -148,6 +148,8 @@ def fatal(msg):
+
+
+ def put_text(text, x, y, s):
++ x = int(x)
++ y = int(y)
+ extend = x + len(s) - len(text[y])
+ if extend > 0:
+ text[y] += ' ' * extend
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0006-Python3-compatibility-math-error-compatibility.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0006-Python3-compatibility-math-error-compatibility.patch
new file mode 100644
index 0000000..54905cd
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0006-Python3-compatibility-math-error-compatibility.patch
@@ -0,0 +1,56 @@
+From 3a9fcf1c8f60c160c282c9755ee1c7f9f7e113c3 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 6/8] Python3 compatibility: math error compatibility
+
+Commit 3fa5aa4294377e0f35267936d0c5caea3e61db48 from
+https://github.com/openvswitch/ovs.git
+
+The way math is handled with typing is completely different in python3.
+
+% python2<<EOF
+x=10
+y=8
+print((x + (y - 1)) / y * y)
+EOF
+16
+
+python3<<EOF
+x=10
+y=8
+print((x + (y - 1)) / y * y)
+EOF
+17.0
+
+So we need to force an integer for the round function as follows and
+maintain compatibility with python2.
+
+python3<<EOF
+x=10
+y=8
+print(int((x + (y - 1)) / y) * y)
+EOF
+16
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/extract-ofp-actions | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/build-aux/extract-ofp-actions b/build-aux/extract-ofp-actions
+index c11297c..bd7131f 100755
+--- a/build-aux/extract-ofp-actions
++++ b/build-aux/extract-ofp-actions
+@@ -35,7 +35,7 @@ line = ""
+ arg_structs = set()
+
+ def round_up(x, y):
+- return (x + (y - 1)) / y * y
++ return int((x + (y - 1)) / y) * y
+
+ def open_file(fn):
+ global file_name
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0007-Python3-compatibility-unicode-to-str.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0007-Python3-compatibility-unicode-to-str.patch
new file mode 100644
index 0000000..faa32b7
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0007-Python3-compatibility-unicode-to-str.patch
@@ -0,0 +1,51 @@
+From 2fe58f87b00d0ec24d6997930d0bcdb130c84396 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 7/8] Python3 compatibility: unicode to str
+
+Commit 7430959d4ad17db89b8387c3aef58c8b230cad10 from
+https://github.com/openvswitch/ovs.git
+
+When transitioning from python2 to python3 the following type class
+changes occured:
+
+python2 -> python3
+unicode -> str
+str -> bytes
+
+That means we have to check the python version and do the right type
+check python3 will throw an error when it tries to use the unicode
+type because it doesn't exist.
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ ovsdb/ovsdb-doc | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/ovsdb/ovsdb-doc b/ovsdb/ovsdb-doc
+index 918e88a..406c293 100755
+--- a/ovsdb/ovsdb-doc
++++ b/ovsdb/ovsdb-doc
+@@ -65,9 +65,15 @@ def columnGroupToNroff(table, groupXml, documented_columns):
+ if node.hasAttribute('type'):
+ type_string = node.attributes['type'].nodeValue
+ type_json = ovs.json.from_string(str(type_string))
+- if type(type_json) in (str, unicode):
+- raise error.Error("%s %s:%s has invalid 'type': %s"
+- % (table.name, name, key, type_json))
++ # py2 -> py3 means str -> bytes and unicode -> str
++ try:
++ if type(type_json) in (str, unicode):
++ raise error.Error("%s %s:%s has invalid 'type': %s"
++ % (table.name, name, key, type_json))
++ except:
++ if type(type_json) in (bytes, str):
++ raise error.Error("%s %s:%s has invalid 'type': %s"
++ % (table.name, name, key, type_json))
+ type_ = ovs.db.types.BaseType.from_json(type_json)
+ else:
+ type_ = column.type.value
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0008-AUTHORS-Add-Jason-Wessel.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0008-AUTHORS-Add-Jason-Wessel.patch
new file mode 100644
index 0000000..d2c2be7
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0008-AUTHORS-Add-Jason-Wessel.patch
@@ -0,0 +1,28 @@
+From a3289add8368e0c970ae1c1c84f5df1f817ed43c Mon Sep 17 00:00:00 2001
+From: Ben Pfaff <blp@ovn.org>
+Date: Thu, 6 Jul 2017 14:01:27 -0700
+Subject: [PATCH 8/8] AUTHORS: Add Jason Wessel.
+
+Commit a91c4cfaf863718bc94fb9c88939bd0b0385a6fe from
+https://github.com/openvswitch/ovs.git
+
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ AUTHORS.rst | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/AUTHORS.rst b/AUTHORS.rst
+index 63e6a8d..d0dc70d 100644
+--- a/AUTHORS.rst
++++ b/AUTHORS.rst
+@@ -156,6 +156,7 @@ Jan Scheurich jan.scheurich@ericsson.com
+ Jan Vansteenkiste jan@vstone.eu
+ Jarno Rajahalme jarno@ovn.org
+ Jason Kölker jason@koelker.net
++Jason Wessel jason.wessel@windriver.com
+ Jasper Capel jasper@capel.tv
+ Jean Tourrilhes jt@hpl.hp.com
+ Jeremy Stribling strib@nicira.com
+--
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/CVE-2017-9263.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/CVE-2017-9263.patch
new file mode 100644
index 0000000..0fc3aa1
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/CVE-2017-9263.patch
@@ -0,0 +1,29 @@
+A buggy or malicious switch could send a role status message with a bad
+reason code, which if printed by OVS would cause it to abort. This fixes
+the problem.
+
+CVE: CVE-2017-9263
+Upstream-Status: Submitted
+
+Reported-by: Bhargava Shastry <bshastry at sec.t-labs.tu-berlin.de>
+Signed-off-by: Ben Pfaff <blp at ovn.org>
+---
+ lib/ofp-print.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/ofp-print.c b/lib/ofp-print.c
+index 7ca953100539..1932baf4871f 100644
+--- a/lib/ofp-print.c
++++ b/lib/ofp-print.c
+@@ -2147,7 +2147,8 @@ ofp_print_role_status_message(struct ds *string, const struct ofp_header *oh)
+ break;
+ case OFPCRR_N_REASONS:
+ default:
+- OVS_NOT_REACHED();
++ ds_put_cstr(string, "(unknown)");
++ break;
+ }
+ }
+
+--
+2.10.2
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-c298ef781c2d35d939fe163cbc2f41ea7b1cb8d1.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-b29cb89e9e9fe3119b2e5dd5d4fb79141635b7cc.patch
similarity index 100%
rename from import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-c298ef781c2d35d939fe163cbc2f41ea7b1cb8d1.patch
rename to import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-b29cb89e9e9fe3119b2e5dd5d4fb79141635b7cc.patch
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc
index 1f0b52b..58e0fcb 100644
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc
@@ -11,11 +11,11 @@
SECTION = "networking"
LICENSE = "Apache-2"
-DEPENDS += "bridge-utils openssl python perl python-six-native coreutils-native"
+DEPENDS += "bridge-utils openssl python3 perl python3-six-native coreutils-native"
RDEPENDS_${PN} += "util-linux-uuidgen util-linux-libuuid coreutils \
- python perl perl-module-strict ${PN}-switch \
- bash python-twisted python-six"
+ python3 perl perl-module-strict ${PN}-switch \
+ bash python3-twisted python3-six"
RDEPENDS_${PN}-testcontroller = "${PN} lsb ${PN}-pki"
RDEPENDS_${PN}-switch = "${PN} openssl procps util-linux-uuidgen"
RDEPENDS_${PN}-pki = "${PN}"
@@ -34,7 +34,7 @@
"
EXTRA_OECONF += "\
- PYTHON=python \
+ PYTHON=python3 \
PYTHON3=python3 \
PERL=${bindir}/perl \
"
@@ -70,7 +70,7 @@
FILES_${PN} += "/run"
FILES_${PN} += "${libdir}/python${PYTHON_BASEVERSION}/"
-inherit autotools update-rc.d systemd pythonnative
+inherit autotools update-rc.d systemd python3native
SYSTEMD_PACKAGES = "${PN}-switch"
SYSTEMD_SERVICE_${PN}-switch = " \
@@ -86,6 +86,12 @@
INITSCRIPT_NAME_${PN}-testcontroller = "openvswitch-testcontroller"
INITSCRIPT_PARAMS_${PN}-testcontroller = "defaults 72"
+do_configure_prepend() {
+ # Work around the for Makefile CC=$(if ....) by swapping out any
+ # "-Wa," assembly directives with "-Xassembler
+ CC=`echo '${CC}' | sed 's/-Wa,/-Xassembler /g'`
+}
+
do_install_append() {
install -d ${D}/${sysconfdir}/default/
install -m 660 ${WORKDIR}/openvswitch-switch-setup ${D}/${sysconfdir}/default/openvswitch-switch
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb
index 1fb82ae..b4aab35 100644
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb
@@ -3,20 +3,20 @@
DEPENDS += "virtual/kernel"
RDEPENDS_${PN}-ptest += "\
- python-logging python-syslog python-argparse python-io \
- python-fcntl python-shell python-lang python-xml python-math \
- python-datetime python-netclient python sed \
+ python3-logging python3-syslog python3-argparse python3-io \
+ python3-fcntl python3-shell python3-lang python3-xml python3-math \
+ python3-datetime python3-netclient python3 sed \
ldd perl-module-socket perl-module-carp perl-module-exporter \
- perl-module-xsloader python-netserver python-threading \
- python-resource python-subprocess \
+ perl-module-xsloader python3-netserver python3-threading \
+ python3-resource python3-subprocess findutils which \
"
S = "${WORKDIR}/git"
-PV = "2.7.0+${SRCREV}"
+PV = "2.7.1+${SRCREV}"
FILESEXTRAPATHS_append := "${THISDIR}/${PN}-git:"
-SRCREV = "c298ef781c2d35d939fe163cbc2f41ea7b1cb8d1"
+SRCREV = "b29cb89e9e9fe3119b2e5dd5d4fb79141635b7cc"
SRC_URI = "file://openvswitch-switch \
file://openvswitch-switch-setup \
file://openvswitch-testcontroller \
@@ -29,12 +29,30 @@
file://python-make-remaining-scripts-use-usr-bin-env.patch \
file://0001-use-the-linux-if_packet.h-Interface-directly.patch \
file://0002-Define-WAIT_ANY-if-not-provided-by-system.patch \
+ file://CVE-2017-9263.patch \
+ file://python-switch-remaining-scripts-to-use-python3.patch \
"
+# Temporarily backport patches to better support py3. These have been
+# merged upstream but are not part of v2.7.1.
+SRC_URI += " \
+ file://0001-Python3-compatibility-Convert-print-statements.patch \
+ file://0002-Python3-compatibility-exception-cleanup.patch \
+ file://0003-Python3-compatibility-execfile-to-exec.patch \
+ file://0004-Python3-compatibility-iteritems-to-items.patch \
+ file://0005-Python3-compatibility-fix-integer-problems.patch \
+ file://0006-Python3-compatibility-math-error-compatibility.patch \
+ file://0007-Python3-compatibility-unicode-to-str.patch \
+ file://0008-AUTHORS-Add-Jason-Wessel.patch \
+"
+
LIC_FILES_CHKSUM = "file://COPYING;md5=17b2c9d4c70853a09c0e143137754b35"
-PACKAGECONFIG ?= ""
-PACKAGECONFIG[dpdk] = "--with-dpdk=${STAGING_DIR_TARGET}/opt/dpdk/${TARGET_ARCH}-native-linuxapp-gcc,,dpdk,"
+DPDK_INSTALL_DIR ?= "/opt/dpdk"
+
+PACKAGECONFIG ?= "libcap-ng"
+PACKAGECONFIG[dpdk] = "--with-dpdk=${STAGING_DIR_TARGET}${DPDK_INSTALL_DIR}/share/${TARGET_ARCH}-native-linuxapp-gcc,,dpdk,dpdk"
+PACKAGECONFIG[libcap-ng] = "--enable-libcapng,--disable-libcapng,libcap-ng,"
# Don't compile kernel modules by default since it heavily depends on
# kernel version. Use the in-kernel module for now.