add ovsdpdk cni
[openretriever.git] / src / cni / ovsdpdk / ovsdpdk.patch
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)
++}