add ovsdpdk cni 79/38579/1
authorGuo Ruijing <ruijing.guo@intel.com>
Tue, 1 Aug 2017 21:44:21 +0000 (14:44 -0700)
committerGuo Ruijing <ruijing.guo@intel.com>
Tue, 1 Aug 2017 21:46:09 +0000 (14:46 -0700)
Change-Id: Id3eba33d3b33deee815596c0a56bbe77954e2214
Signed-off-by: Guo Ruijing <ruijing.guo@intel.com>
src/cni/ovsdpdk/Dockerfile [new file with mode: 0644]
src/cni/ovsdpdk/Vagrantfile [new file with mode: 0644]
src/cni/ovsdpdk/build_cni_ovsdpdk.sh [new file with mode: 0755]
src/cni/ovsdpdk/install_cni.sh [new file with mode: 0644]
src/cni/ovsdpdk/kube_ovsdpdk.yml [new file with mode: 0644]
src/cni/ovsdpdk/ovsdpdk.patch [new file with mode: 0644]
src/cni/ovsdpdk/setup_ovsdpdk.sh [new file with mode: 0755]
src/cni/ovsdpdk/teardown_ovsdpdk.sh [new file with mode: 0755]

diff --git a/src/cni/ovsdpdk/Dockerfile b/src/cni/ovsdpdk/Dockerfile
new file mode 100644 (file)
index 0000000..2a7208c
--- /dev/null
@@ -0,0 +1,7 @@
+FROM ubuntu:16.04
+
+WORKDIR /cni
+ADD setup_ovsdpdk.sh .
+ADD teardown_ovsdpdk.sh .
+ADD ovsdpdk .
+ADD install_cni.sh .
diff --git a/src/cni/ovsdpdk/Vagrantfile b/src/cni/ovsdpdk/Vagrantfile
new file mode 100644 (file)
index 0000000..f170c69
--- /dev/null
@@ -0,0 +1,16 @@
+Vagrant.require_version ">= 1.8.6"
+Vagrant.configure("2") do |config|
+
+  config.vm.box = "bento/ubuntu-16.04"
+  config.vm.provider :virtualbox do |vb|
+    vb.customize ["modifyvm", :id, "--memory", 4096]
+    vb.customize ["modifyvm", :id, "--cpus", 4]
+    vb.customize "post-boot",["controlvm", :id, "setlinkstate1", "on"]
+  end
+
+  config.vm.define "cni-ovsdpdk" do |config|
+    config.vm.hostname = "cni-ovsdpdk"
+    config.vm.provision "shell", path: "build_cni_ovsdpdk.sh", privileged: false
+  end
+
+end
diff --git a/src/cni/ovsdpdk/build_cni_ovsdpdk.sh b/src/cni/ovsdpdk/build_cni_ovsdpdk.sh
new file mode 100755 (executable)
index 0000000..71318d8
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+set -ex
+
+sudo apt-get update
+sudo apt-get install -y docker.io devscripts git
+wget -qO- https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz | sudo tar -C /usr/local -xz
+echo 'export GOPATH=/go; export PATH=/usr/local/go/bin:$GOPATH/bin:$PATH' >> ~/.bashrc
+export GOPATH=/go; export PATH=/usr/local/go/bin:$GOPATH/bin:$PATH
+git clone https://github.com/containernetworking/cni
+echo sudo CNI_PATH=$CNI_PATH ./priv-net-run.sh ifconfig
+git clone https://github.com/containernetworking/plugins
+cd plugins
+git checkout 5544d9ced0d6e908fe26e9dbe529c7feb87d21f5
+patch -p1 < /vagrant/ovsdpdk.patch
+./build.sh
+cd bin
+cp /vagrant/* .
+sudo docker build -t openretriever/cni-ovsdpdk .
diff --git a/src/cni/ovsdpdk/install_cni.sh b/src/cni/ovsdpdk/install_cni.sh
new file mode 100644 (file)
index 0000000..8f5b78a
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+set -ex
+cp /cni/ovsdpdk /opt/cni/bin
+cp /cni/setup_ovsdpdk.sh /opt/cni/bin
+cp /cni/teardown_ovsdpdk.sh /opt/cni/bin
+cp /etc/kube-ovsdpdk/cni-conf.json  /etc/cni/net.d/10-ovsdpdk.conf
+while true; do sleep 3600; done
diff --git a/src/cni/ovsdpdk/kube_ovsdpdk.yml b/src/cni/ovsdpdk/kube_ovsdpdk.yml
new file mode 100644 (file)
index 0000000..2bcebdc
--- /dev/null
@@ -0,0 +1,71 @@
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: ovsdpdk
+  namespace: kube-system
+---
+kind: ConfigMap
+apiVersion: v1
+metadata:
+  name: kube-ovsdpdk-cfg
+  namespace: kube-system
+  labels:
+    tier: node
+    app: ovsdpdk
+data:
+  cni-conf.json: |
+    {
+      "name": "ovsdpdk",
+      "type": "ovsdpdk",
+      "bridge": "br-dpdk",
+      "ipam": {
+        "type": "host-local",
+        "subnet": "10.244.0.0/16"
+      }
+    }
+---
+apiVersion: extensions/v1beta1
+kind: DaemonSet
+metadata:
+  name: kube-ovsdpdk-ds
+  namespace: kube-system
+  labels:
+    tier: node
+    app: ovsdpdk
+spec:
+  template:
+    metadata:
+      labels:
+        tier: node
+        app: ovsdpdk
+    spec:
+      hostNetwork: true
+      nodeSelector:
+        beta.kubernetes.io/arch: amd64
+      tolerations:
+      - key: node-role.kubernetes.io/master
+        operator: Exists
+        effect: NoSchedule
+      serviceAccountName: ovsdpdk
+      containers:
+      - name: install-cni
+        image: openretriever/cni-ovsdpdk
+        command: [ "/bin/bash", "/cni/install_cni.sh" ]
+        volumeMounts:
+        - name: cni-bin
+          mountPath: /opt/cni/bin
+        - name: cni-cfg
+          mountPath: /etc/cni/net.d
+        - name: ovsdpdk-cfg
+          mountPath: /etc/kube-ovsdpdk
+      volumes:
+        - name: cni-bin
+          hostPath:
+            path: /opt/cni/bin
+        - name: cni-cfg
+          hostPath:
+            path: /etc/cni/net.d
+        - name: ovsdpdk-cfg
+          configMap:
+            name: kube-ovsdpdk-cfg
diff --git a/src/cni/ovsdpdk/ovsdpdk.patch b/src/cni/ovsdpdk/ovsdpdk.patch
new file mode 100644 (file)
index 0000000..67b3703
--- /dev/null
@@ -0,0 +1,136 @@
+diff --git a/build.sh b/build.sh
+index cd21ba8..bc60d91 100755
+--- a/build.sh
++++ b/build.sh
+@@ -19,7 +19,7 @@ export GOPATH=${PWD}/gopath
+ mkdir -p "${PWD}/bin"
+ echo "Building plugins"
+-PLUGINS="plugins/meta/* plugins/main/* plugins/ipam/* plugins/sample"
++PLUGINS="plugins/main/ovsdpdk plugins/main/bridge plugins/ipam/host-local"
+ for d in $PLUGINS; do
+       if [ -d "$d" ]; then
+               plugin="$(basename "$d")"
+diff --git a/plugins/main/ovsdpdk/ovsdpdk.go b/plugins/main/ovsdpdk/ovsdpdk.go
+new file mode 100644
+index 0000000..1b931d4
+--- /dev/null
++++ b/plugins/main/ovsdpdk/ovsdpdk.go
+@@ -0,0 +1,117 @@
++// Copyright 2014 CNI authors
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++//     http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++
++package main
++
++import (
++      "encoding/json"
++      "errors"
++      "fmt"
++      //"net"
++      "runtime"
++      //"syscall"
++        "os/exec"
++      //"io/ioutil"
++
++      "github.com/containernetworking/cni/pkg/skel"
++      "github.com/containernetworking/cni/pkg/types"
++      "github.com/containernetworking/cni/pkg/types/current"
++      "github.com/containernetworking/cni/pkg/version"
++      //"github.com/containernetworking/plugins/pkg/ip"
++      "github.com/containernetworking/plugins/pkg/ipam"
++      //"github.com/containernetworking/plugins/pkg/ns"
++      //"github.com/containernetworking/plugins/pkg/utils"
++      //"github.com/vishvananda/netlink"
++)
++
++const defaultBrName = "cni0"
++
++type NetConf struct {
++      types.NetConf
++      BrName       string `json:"bridge"`
++}
++
++func init() {
++      // this ensures that main runs only on main thread (thread group leader).
++      // since namespace ops (unshare, setns) are done for a single thread, we
++      // must ensure that the goroutine does not jump from OS thread to thread
++      runtime.LockOSThread()
++}
++
++func loadNetConf(bytes []byte) (*NetConf, string, error) {
++      n := &NetConf{
++              BrName: defaultBrName,
++      }
++      if err := json.Unmarshal(bytes, n); err != nil {
++              return nil, "", fmt.Errorf("failed to load netconf: %v", err)
++      }
++      return n, n.CNIVersion, nil
++}
++
++func setupVhostUser(args *skel.CmdArgs, types string) error {
++    exec.Command("/bin/bash", "/opt/cni/bin/setup_ovsdpdk.sh", args.Netns, args.ContainerID, types).Output()
++    return nil
++}
++
++
++func cmdAdd(args *skel.CmdArgs) error {
++      n, cniVersion, err := loadNetConf(args.StdinData)
++      if err != nil {
++              return err
++      }
++
++      // run the IPAM plugin and get back the config to apply
++      r, err := ipam.ExecAdd(n.IPAM.Type, args.StdinData)
++      if err != nil {
++              return err
++      }
++
++      // Convert whatever the IPAM result was into the current Result type
++      result, err := current.NewResultFromResult(r)
++      if err != nil {
++              return err
++      }
++
++      if len(result.IPs) == 0 {
++              return errors.New("IPAM plugin returned missing IP config")
++      }
++
++        setupVhostUser(args, result.String())
++
++        return types.PrintResult(result, cniVersion)
++}
++
++func tearDownVhostUser(args *skel.CmdArgs) error {
++    exec.Command("/bin/bash", "/opt/cni/bin/teardown_ovsdpdk.sh", args.Netns, args.ContainerID).Output()
++    return nil
++}
++
++func cmdDel(args *skel.CmdArgs) error {
++        n, _, err := loadNetConf(args.StdinData)
++        if err != nil {
++                return err
++        }
++
++        if err := ipam.ExecDel(n.IPAM.Type, args.StdinData); err != nil {
++                return err
++        }
++
++        tearDownVhostUser(args)
++        return err
++
++}
++
++func main() {
++      skel.PluginMain(cmdAdd, cmdDel, version.All)
++}
diff --git a/src/cni/ovsdpdk/setup_ovsdpdk.sh b/src/cni/ovsdpdk/setup_ovsdpdk.sh
new file mode 100755 (executable)
index 0000000..a1813c9
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+netns=$1
+containerid=$2
+ip=$3
+pid=$(echo $netns | cut -f3 -d"/")
+
+sudo ovs-vsctl --may-exist add-br br-dpdk -- set bridge br-dpdk datapath_type=netdev
+sudo ovs-vsctl --may-exist add-port br-dpdk vhost-user-$pid -- set Interface vhost-user-$pid type=dpdkvhostuser
+sudo ln -sf $netns /var/run/netns/$pid
+sudo ip link add dummy-$pid type dummy
+sudo ip link set dummy-$pid netns $pid
+sudo mkdir -p /var/run/cni
+echo $ip | sudo tee /var/run/cni/netconf-$pid
diff --git a/src/cni/ovsdpdk/teardown_ovsdpdk.sh b/src/cni/ovsdpdk/teardown_ovsdpdk.sh
new file mode 100755 (executable)
index 0000000..857738e
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+netns=$1
+containerid=$2
+pid=$(echo $netns | cut -f3 -d"/")
+
+sudo ovs-vsctl del-port br-dpdk vhost-user-$pid
+sudo ip netns exec $pid link delete dummy-$pid
+sudo rm -rf /var/run/cni/netconf-$pid