Skip to content

Commit

Permalink
support generic userspace datapath & merge userspace and kernelspace …
Browse files Browse the repository at this point in the history
…datapath entity
  • Loading branch information
John-Lin committed Jul 6, 2018
1 parent 82d2e54 commit 44f7fd5
Show file tree
Hide file tree
Showing 9 changed files with 199 additions and 149 deletions.
18 changes: 9 additions & 9 deletions src/entity/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ const (
)

type Network struct {
ID bson.ObjectId `bson:"_id,omitempty" json:"id"`
Type NetworkType `bson:"type" json:"type"`
Name string `bson:"name" json:"name"`
Clusterwise bool `bson:"clusterwise" json:"clusterwise"`
NodeName string `bson:"nodeName,omitempty" json:"nodeName,omitempty"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
OVS OVSNetwork `bson:"ovs,omitempty" json:"ovs"`
OVSDPDK OVSDPDKNetwork `bson:"ovsdpdk,omitempty" json:"ovsdpdk"`
Fake FakeNetwork `json:"fake"` //FakeNetwork, for restful testing.
ID bson.ObjectId `bson:"_id,omitempty" json:"id"`
Type NetworkType `bson:"type" json:"type"`
Name string `bson:"name" json:"name"`
Clusterwise bool `bson:"clusterwise" json:"clusterwise"`
NodeName string `bson:"nodeName,omitempty" json:"nodeName,omitempty"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
OVS OVSNetwork `bson:"ovs,omitempty" json:"ovs"`
OVSUserspace OVSUserspaceNetwork `bson:"ovsUserspace,omitempty" json:"ovsUserspace"`
Fake FakeNetwork `json:"fake"` //FakeNetwork, for restful testing.
}

//GetCollection - get model mongo collection name.
Expand Down
13 changes: 0 additions & 13 deletions src/entity/network_dpdk.go

This file was deleted.

18 changes: 18 additions & 0 deletions src/entity/network_ovs.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
package entity

// physical NIC port
type PhysicalPort struct {
Name string `bson:"name" json:"name"`
MTU int `bson:"MTU" json:"MTU"`
VlanTags []int32 `bson:"vlanTags" MTC:"vlanTags"`
}

// physical NIC port dpdk enabled
type DPDKPhysicalPort struct {
Name string `bson:"name" json:"name"`
MTU int `bson:"MTU" json:"MTU"`
PCIID string `bson:"pciID" json:"pciID"`
VlanTags []int32 `bson:"vlanTags" json:"vlanTags"`
}

// kernel space datapath
type OVSNetwork struct {
BridgeName string `bson:"bridgeName" json:"bridgeName"`
PhysicalPorts []PhysicalPort `bson:"physicalPorts" json:"physicalPorts"`
}

// userspace space datapath
type OVSUserspaceNetwork struct {
BridgeName string `bson:"bridgeName" json:"bridgeName"`
// exclusive fields
PhysicalPorts []PhysicalPort `bson:"physicalPorts" json:"physicalPorts"`
DPDKPhysicalPorts []DPDKPhysicalPort `bson:"dpdkPhysicalPorts" json:"dpdkPhysicalPorts"`
}
39 changes: 33 additions & 6 deletions src/networkcontroller/network_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,14 +122,41 @@ func (nc *NetworkController) CreateOVSDPDKNetwork(bridgeName string, ports []ent
return nil
}

func (nc *NetworkController) DeleteOVSDPDKNetwork(bridgeName string) error {
_, err := nc.ClientCtl.DeleteBridge(
func (nc *NetworkController) CreateOVSUserpsaceNetwork(bridgeName string, ports []entity.PhysicalPort) error {
if _, err := nc.ClientCtl.CreateBridge(
nc.Context,
&pb.DeleteBridgeRequest{
BridgeName: bridgeName,
})
if err != nil {
&pb.CreateBridgeRequest{
BridgeName: bridgeName,
DatapathType: "netdev",
}); err != nil {
return err
}

for _, port := range ports {
_, err := nc.ClientCtl.AddDPDKPort(
nc.Context,
&pb.AddPortRequest{
BridgeName: bridgeName,
IfaceName: port.Name,
})
if err != nil {
return err
}

if len(port.VlanTags) > 0 {
_, err := nc.ClientCtl.SetPort(
nc.Context,
&pb.SetPortRequest{
IfaceName: port.Name,
Options: &pb.PortOptions{
VLANMode: "trunk",
Trunk: port.VlanTags,
},
})
if err != nil {
return err
}
}
}
return nil
}
2 changes: 1 addition & 1 deletion src/networkprovider/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func GetNetworkProvider(network *entity.Network) (NetworkProvider, error) {
case entity.OVSKernelspaceNetworkType:
return OVSNetworkProvider{network.OVS}, nil
case entity.OVSUserspaceNetworkType:
return OVSDPDKNetworkProvider{network.OVSDPDK}, nil
return OVSUserspaceNetworkProvider{network.OVSUserspace}, nil
case entity.FakeNetworkType:
return FakeNetworkProvider{network.Fake}, nil
default:
Expand Down
2 changes: 1 addition & 1 deletion src/networkprovider/network_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func TestGetNetworkProvider(t *testing.T) {
netProviderType interface{}
}{
{"system", entity.OVSKernelspaceNetworkType, reflect.TypeOf(OVSNetworkProvider{})},
{"netdev", entity.OVSUserspaceNetworkType, reflect.TypeOf(OVSDPDKNetworkProvider{})},
{"netdev", entity.OVSUserspaceNetworkType, reflect.TypeOf(OVSUserspaceNetworkProvider{})},
{"fake", entity.FakeNetworkType, reflect.TypeOf(FakeNetworkProvider{})},
}

Expand Down
105 changes: 0 additions & 105 deletions src/networkprovider/ovs_dpdk.go

This file was deleted.

123 changes: 123 additions & 0 deletions src/networkprovider/ovs_netdev.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package networkprovider

import (
"fmt"
"net"

"github.com/linkernetworks/vortex/src/entity"
"github.com/linkernetworks/vortex/src/networkcontroller"
"github.com/linkernetworks/vortex/src/serviceprovider"
"gopkg.in/mgo.v2/bson"
)

type OVSUserspaceNetworkProvider struct {
entity.OVSUserspaceNetwork
}

func (ovsu OVSUserspaceNetworkProvider) ValidateBeforeCreating(sp *serviceprovider.Container, network *entity.Network) error {
session := sp.Mongo.NewSession()
defer session.Close()
// FIXME validate both dpdk or userspace datapath
// Check whether vlangTag is 0~4095
for _, pp := range ovsu.DPDKPhysicalPorts {
for _, vlangTag := range pp.VlanTags {
if vlangTag < 0 || vlangTag > 4095 {
return fmt.Errorf("The vlangTag %v in PhysicalPort %v should between 0 and 4095", pp.Name, vlangTag)
}
}
}

q := bson.M{}
if network.Clusterwise {
//Only check the bridge name
q = bson.M{"ovsUserspace.bridgeName": ovsu.BridgeName}
} else {
q = bson.M{"nodeName": network.NodeName, "ovsUserspace.bridgeName": ovsu.BridgeName}
}

n, err := session.Count(entity.NetworkCollectionName, q)
if n >= 1 {
return fmt.Errorf("The bridge name %s is exist, please check your cluster type and reassign another bridge name", ovsu.BridgeName)
} else if err != nil {
return err
}
return nil
}

func (ovsu OVSUserspaceNetworkProvider) CreateNetwork(sp *serviceprovider.Container, network *entity.Network) error {
if network.Clusterwise {
nodes, _ := sp.KubeCtl.GetNodes()
for _, v := range nodes {
nodeIP, err := sp.KubeCtl.GetNodeExternalIP(v.GetName())
if err != nil {
return err
}
// TODO if dpdk==true
if err := createOVSDPDKNetwork(nodeIP, network.OVSUserspace.BridgeName, network.OVSUserspace.DPDKPhysicalPorts); err != nil {
return err
}
// TODO else dpdk==false
// if err := createOVSUserspaceNetwork(nodeIP, network.OVS.BridgeName, network.OVS.PhysicalPorts); err != nil {
// return err
// }
}
return nil
}
nodeIP, err := sp.KubeCtl.GetNodeExternalIP(network.NodeName)
if err != nil {
return err
}
// TODO if dpdk==true
return createOVSDPDKNetwork(nodeIP, network.OVSUserspace.BridgeName, network.OVSUserspace.DPDKPhysicalPorts)
// TODO else dpdk==false
// return createOVSUserspaceNetwork(nodeIP, network.OVS.BridgeName, network.OVS.PhysicalPorts)
}

func (ovsu OVSUserspaceNetworkProvider) DeleteNetwork(sp *serviceprovider.Container, network *entity.Network) error {
if network.Clusterwise {
nodes, _ := sp.KubeCtl.GetNodes()
for _, v := range nodes {
nodeIP, err := sp.KubeCtl.GetNodeExternalIP(v.GetName())
if err != nil {
return err
}
if err := deleteOVSUserspaceNetwork(nodeIP, ovsu.BridgeName); err != nil {
return err
}
}
return nil
}

nodeIP, err := sp.KubeCtl.GetNodeExternalIP(network.NodeName)
if err != nil {
return err
}
return deleteOVSUserspaceNetwork(nodeIP, ovsu.BridgeName)
}

func createOVSDPDKNetwork(nodeIP string, bridgeName string, ports []entity.DPDKPhysicalPort) error {
nodeAddr := net.JoinHostPort(nodeIP, networkcontroller.DEFAULT_CONTROLLER_PORT)
nc, err := networkcontroller.New(nodeAddr)
if err != nil {
return err
}
return nc.CreateOVSDPDKNetwork(bridgeName, ports)
}

func createOVSUserspaceNetwork(nodeIP string, bridgeName string, ports []entity.PhysicalPort) error {
nodeAddr := net.JoinHostPort(nodeIP, networkcontroller.DEFAULT_CONTROLLER_PORT)
nc, err := networkcontroller.New(nodeAddr)
if err != nil {
return err
}
return nc.CreateOVSUserpsaceNetwork(bridgeName, ports)
}

func deleteOVSUserspaceNetwork(nodeIP string, bridgeName string) error {
nodeAddr := net.JoinHostPort(nodeIP, networkcontroller.DEFAULT_CONTROLLER_PORT)
nc, err := networkcontroller.New(nodeAddr)
if err != nil {
return err
}
return nc.DeleteOVSNetwork(bridgeName)
}
Loading

0 comments on commit 44f7fd5

Please sign in to comment.