Skip to content

Commit

Permalink
Merge branch 'master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
cglewis authored May 21, 2020
2 parents 33d360b + bedf09a commit 716441c
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 9 deletions.
25 changes: 25 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: test

on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: int_test
run: |
sudo modprobe openvswitch && \
sudo modprobe 8021q && \
export DEBIAN_FRONTEND=noninteractive && \
echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
sudo apt-get update && \
sudo apt-get remove docker docker-engine docker.io containerd runc python3-yaml && \
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io && \
sudo pip3 install -U pip && \
sudo pip3 install -U setuptools && \
sudo pip3 install -U faucet && \
./test_dovesnap.sh
13 changes: 12 additions & 1 deletion ovs/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ const (
bridgePrefix = "ovsbr-"
containerEthName = "eth"

bridgeAddPorts = "ovs.bridge.add_ports"

bridgeDpid = "ovs.bridge.dpid"
bridgeController = "ovs.bridge.controller"

Expand Down Expand Up @@ -113,6 +115,11 @@ func (d *Driver) CreateNetwork(r *networkplugin.CreateNetworkRequest) error {
return err
}

add_ports, err := getBridgeAddPorts(r)
if err != nil {
return err
}

ns := &NetworkState{
BridgeName: bridgeName,
MTU: mtu,
Expand All @@ -124,7 +131,7 @@ func (d *Driver) CreateNetwork(r *networkplugin.CreateNetworkRequest) error {
d.networks[r.NetworkID] = ns

log.Debugf("Initializing bridge for network %s", r.NetworkID)
if err := d.initBridge(r.NetworkID, controller, dpid); err != nil {
if err := d.initBridge(r.NetworkID, controller, dpid, add_ports); err != nil {
delete(d.networks, r.NetworkID)
return err
}
Expand Down Expand Up @@ -373,6 +380,10 @@ func getBridgeDpid(r *networkplugin.CreateNetworkRequest) (string, error) {
return getGenericOption(r, bridgeDpid), nil
}

func getBridgeAddPorts(r *networkplugin.CreateNetworkRequest) (string, error) {
return getGenericOption(r, bridgeAddPorts), nil
}

func getGatewayIP(r *networkplugin.CreateNetworkRequest) (string, string, error) {
// FIXME: Dear future self, I'm sorry for leaving you with this mess, but I want to get this working ASAP
// This should be an array
Expand Down
36 changes: 28 additions & 8 deletions ovs/ovs_bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ovs

import (
"fmt"
"strings"

log "github.com/Sirupsen/logrus"
"github.com/docker/libnetwork/iptables"
Expand All @@ -18,25 +19,44 @@ func (ovsdber *ovsdber) deleteBridge(bridgeName string) error {
}

// setupBridge If bridge does not exist create it.
func (d *Driver) initBridge(id string, controller string, dpid string) error {
func (d *Driver) initBridge(id string, controller string, dpid string, add_ports string) error {
bridgeName := d.networks[id].BridgeName
if err := d.ovsdber.addBridge(bridgeName); err != nil {
log.Errorf("error creating ovs bridge [ %s ] : [ %s ]", bridgeName, err)
return err
}
var ovsConfigCmds [][]string

if dpid != "" {
err := VsCtl("set", "bridge", bridgeName, fmt.Sprintf("other-config:datapath-id=%s", dpid))
if err != nil {
return err
}
ovsConfigCmds = append(ovsConfigCmds, []string{"set", "bridge", bridgeName, fmt.Sprintf("other-config:datapath-id=%s", dpid)})
}

if controller != "" {
err := VsCtl("set-controller", bridgeName, controller)
ovsConfigCmds = append(ovsConfigCmds, []string{"set", "bridge", bridgeName, "fail-mode=secure"})
controllers := append([]string{"set-controller", bridgeName}, strings.Split(controller, ",")...)
ovsConfigCmds = append(ovsConfigCmds, controllers)
}

if add_ports != "" {
for _, add_port_number_str := range strings.Split(add_ports, ",") {
add_port_number := strings.Split(add_port_number_str, "/")
add_port := add_port_number[0]
if len(add_port_number) == 2 {
number := add_port_number[1]
ovsConfigCmds = append(ovsConfigCmds, []string{"add-port", bridgeName, add_port, "--", "set", "Interface", add_port, fmt.Sprintf("ofport_request=%s", number)})
} else {
ovsConfigCmds = append(ovsConfigCmds, []string{"add-port", bridgeName, add_port})
}
}
}

for _, cmd := range ovsConfigCmds {
err := VsCtl(cmd...)
if err != nil {
return err
}
// At least one bridge config failed, so delete the bridge.
VsCtl("del-br", bridgeName)
return err
}
}

bridgeMode := d.networks[id].Mode
Expand Down
32 changes: 32 additions & 0 deletions test_dovesnap.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/bash

export TMPDIR=/tmp
export FAUCET_CONFIG=$TMPDIR/faucet.yaml
export FAUCET_LOG=$TMPDIR/faucet.log
export FAUCET_EXCEPTION_LOG=$TMPDIR/faucet_exception.log

cat >$FAUCET_CONFIG <<EOC
dps:
ovs:
dp_id: 0x1
hardware: Open vSwitch
interfaces:
0xfffffffe:
native_vlan: 100
interface_ranges:
1-10:
native_vlan: 100
EOC

/usr/local/bin/faucet --version || exit 1
nohup /usr/local/bin/faucet &
FAUCETPID=$!

docker-compose build && docker-compose up -d || exit 1
docker network create testnet -d ovs -o ovs.bridge.mode=nat -o ovs.bridge.dpid=0x1 -o ovs.bridge.controller=tcp:127.0.0.1:6653 || exit 1
# github test runner can't use ping.
docker run -t --net=testnet --rm busybox wget -q -O- https://google.com || exit 1
docker network rm testnet || exit 1
docker-compose stop

kill $FAUCETPID

0 comments on commit 716441c

Please sign in to comment.