Skip to content

Commit

Permalink
Merge pull request #77 from linkernetworks/johnlin/network-entity
Browse files Browse the repository at this point in the history
network entity refactoring
  • Loading branch information
Hung-Wei Chiu authored Jul 12, 2018
2 parents 1eec4d1 + 3f0b324 commit ed661fd
Show file tree
Hide file tree
Showing 15 changed files with 909 additions and 788 deletions.
33 changes: 23 additions & 10 deletions src/entity/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,32 @@ const (
NetworkCollectionName string = "networks"
)

type PhyInterface struct {
Name string `bson:"name" json:"name"`
PCIID string `bson:"pciID" json:"pciID"`
}

type Node struct {
Name string `bson:"name" json:"name"`
PhyInterfaces []PhyInterface `bson:"physicalInterfaces" json:"physicalInterfaces"`

// Fake fields for restful testing
FakeParameter string `json:"fakeParameter"`
ShouldFail bool `json:"shouldFail"`
}

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"`
OVSUserspace OVSUserspaceNetwork `bson:"ovsUserspace,omitempty" json:"ovsUserspace"`
Fake FakeNetwork `json:"fake"` //FakeNetwork, for restful testing.
ID bson.ObjectId `bson:"_id,omitempty" json:"id"`
Type NetworkType `bson:"type" json:"type"`
IsDPDKPort bool `bson:"isDPDKPort" json:"isDPDKPort"`
Name string `bson:"name" json:"name"`
VLANTags []int32 `bson:"VLANTags" json:"VLANTags"`
BridgeName string `bson:"bridgeName" json:"bridgeName"`
Nodes []Node `bson:"nodes" json:"nodes"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
}

//GetCollection - get model mongo collection name.
// GetCollection - get model mongo collection name.
func (m Network) GetCollection() string {
return NetworkCollectionName
}
79 changes: 20 additions & 59 deletions src/networkcontroller/network_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,35 +31,35 @@ func New(serverAddress string) (*NetworkController, error) {
}, nil
}

func (nc *NetworkController) CreateOVSNetwork(bridgeName string, ports []entity.PhysicalPort) error {
func (nc *NetworkController) CreateOVSNetwork(datapathType string, bridgeName string, phyIfaces []entity.PhyInterface, vlanTags []int32) error {
if _, err := nc.ClientCtl.CreateBridge(
nc.Context,
&pb.CreateBridgeRequest{
BridgeName: bridgeName,
DatapathType: "system",
DatapathType: datapathType,
}); err != nil {
return err
}

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

if len(port.VlanTags) > 0 {
if len(vlanTags) > 0 {
_, err := nc.ClientCtl.SetPort(
nc.Context,
&pb.SetPortRequest{
IfaceName: port.Name,
IfaceName: phyIface.Name,
Options: &pb.PortOptions{
VLANMode: "trunk",
Trunk: port.VlanTags,
Trunk: vlanTags,
},
})
if err != nil {
Expand All @@ -70,19 +70,7 @@ func (nc *NetworkController) CreateOVSNetwork(bridgeName string, ports []entity.
return nil
}

func (nc *NetworkController) DeleteOVSNetwork(bridgeName string) error {
_, err := nc.ClientCtl.DeleteBridge(
nc.Context,
&pb.DeleteBridgeRequest{
BridgeName: bridgeName,
})
if err != nil {
return err
}
return nil
}

func (nc *NetworkController) CreateOVSDPDKNetwork(bridgeName string, ports []entity.DPDKPhysicalPort) error {
func (nc *NetworkController) CreateOVSDPDKNetwork(bridgeName string, phyIfaces []entity.PhyInterface, vlanTags []int32) error {
if _, err := nc.ClientCtl.CreateBridge(
nc.Context,
&pb.CreateBridgeRequest{
Expand All @@ -92,26 +80,26 @@ func (nc *NetworkController) CreateOVSDPDKNetwork(bridgeName string, ports []ent
return err
}

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

if len(port.VlanTags) > 0 {
if len(vlanTags) > 0 {
_, err := nc.ClientCtl.SetPort(
nc.Context,
&pb.SetPortRequest{
IfaceName: port.Name,
IfaceName: phyIface.Name,
Options: &pb.PortOptions{
VLANMode: "trunk",
Trunk: port.VlanTags,
Trunk: vlanTags,
},
})
if err != nil {
Expand All @@ -122,41 +110,14 @@ func (nc *NetworkController) CreateOVSDPDKNetwork(bridgeName string, ports []ent
return nil
}

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

for _, port := range ports {
_, err := nc.ClientCtl.AddPort(
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
}
89 changes: 47 additions & 42 deletions src/networkcontroller/network_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,88 +100,93 @@ func (suite *NetworkControllerTestSuite) TestNew() {
}

func (suite *NetworkControllerTestSuite) TestCreateNetwork() {
//Parameters
eth1 := entity.PhysicalPort{
Name: suite.ifName,
MTU: 1500,
VlanTags: []int32{2043, 2143, 2243},
}

tName := namesgenerator.GetRandomName(0)
network := entity.Network{
Name: tName,
OVS: entity.OVSNetwork{
BridgeName: tName,
PhysicalPorts: []entity.PhysicalPort{eth1},
Type: entity.OVSKernelspaceNetworkType,
Name: tName,
VLANTags: []int32{0, 2048, 4095},
BridgeName: tName,
Nodes: []entity.Node{
entity.Node{
Name: suite.nodeName,
PhyInterfaces: []entity.PhyInterface{
entity.PhyInterface{
Name: suite.ifName,
PCIID: "",
},
},
},
},
Type: "ovs",
NodeName: suite.nodeName,
}

nodeIP, err := suite.kubectl.GetNodeExternalIP(suite.nodeName)
suite.NoError(err)
nc, err := New(net.JoinHostPort(nodeIP, DEFAULT_CONTROLLER_PORT))
suite.NoError(err)
err = nc.CreateOVSNetwork(tName, network.OVSUserspace.PhysicalPorts)
err = nc.CreateOVSNetwork("system", tName, network.Nodes[0].PhyInterfaces, network.VLANTags)
suite.NoError(err)

//TODO we need support the list function to check the ovs is existed
defer exec.Command("ovs-vsctl", "del-br", tName).Run()
}

func (suite *NetworkControllerTestSuite) TestCreateOVSUserpsaceNetwork() {
eth1 := entity.PhysicalPort{
Name: suite.ifName,
MTU: 1500,
VlanTags: []int32{2043, 2143, 2243},
}

tName := namesgenerator.GetRandomName(0)
network := entity.Network{
Name: tName,
OVSUserspace: entity.OVSUserspaceNetwork{
BridgeName: tName,
PhysicalPorts: []entity.PhysicalPort{eth1},
Type: entity.OVSUserspaceNetworkType,
IsDPDKPort: false,
Name: tName,
VLANTags: []int32{0, 2048, 4095},
BridgeName: tName,
Nodes: []entity.Node{
entity.Node{
Name: suite.nodeName,
PhyInterfaces: []entity.PhyInterface{
entity.PhyInterface{
Name: suite.ifName,
PCIID: "",
},
},
},
},
Type: "netdev",
NodeName: suite.nodeName,
}

nodeIP, err := suite.kubectl.GetNodeExternalIP(suite.nodeName)
suite.NoError(err)
nc, err := New(net.JoinHostPort(nodeIP, DEFAULT_CONTROLLER_PORT))
suite.NoError(err)
err = nc.CreateOVSUserpsaceNetwork(tName, network.OVS.PhysicalPorts)
err = nc.CreateOVSNetwork("netdev", tName, network.Nodes[0].PhyInterfaces, network.VLANTags)
suite.NoError(err)

//TODO we need support the list function to check the ovs is existed
defer exec.Command("ovs-vsctl", "del-br", tName).Run()
}

func (suite *NetworkControllerTestSuite) TestDeleteNetwork() {
//Parameters
eth1 := entity.PhysicalPort{
Name: suite.ifName,
MTU: 1500,
VlanTags: []int32{2043, 2143, 2243},
}

tName := namesgenerator.GetRandomName(0)
network := entity.Network{
Name: tName,
OVS: entity.OVSNetwork{
BridgeName: tName,
PhysicalPorts: []entity.PhysicalPort{eth1},
Type: entity.OVSKernelspaceNetworkType,
Name: tName,
VLANTags: []int32{0, 2048, 4095},
BridgeName: tName,
Nodes: []entity.Node{
entity.Node{
Name: suite.nodeName,
PhyInterfaces: []entity.PhyInterface{
entity.PhyInterface{
Name: suite.ifName,
PCIID: "",
},
},
},
},
Type: "ovs",
NodeName: suite.nodeName,
}

nodeIP, err := suite.kubectl.GetNodeExternalIP(suite.nodeName)
suite.NoError(err)
nc, err := New(net.JoinHostPort(nodeIP, DEFAULT_CONTROLLER_PORT))
suite.NoError(err)
err = nc.CreateOVSNetwork(tName, network.OVS.PhysicalPorts)
err = nc.CreateOVSNetwork("system", tName, network.Nodes[0].PhyInterfaces, network.VLANTags)
suite.NoError(err)

err = nc.DeleteOVSNetwork(tName)
Expand All @@ -193,6 +198,6 @@ func (suite *NetworkControllerTestSuite) TestCreateNetworkWithInvalidAddress() {
suite.NoError(err)

tName := namesgenerator.GetRandomName(0)
err = nc.CreateOVSNetwork(tName, []entity.PhysicalPort{})
err = nc.CreateOVSNetwork("system", tName, []entity.PhyInterface{}, []int32{})
suite.Error(err)
}
32 changes: 21 additions & 11 deletions src/networkprovider/fake.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,37 @@ import (
"github.com/linkernetworks/vortex/src/serviceprovider"
)

type FakeNetworkProvider struct {
entity.FakeNetwork
type fakeNetworkProvider struct {
networkName string
bridgeName string
vlanTags []int32
nodes []entity.Node
isDPDKPort bool
}

func (fake FakeNetworkProvider) ValidateBeforeCreating(sp *serviceprovider.Container, net *entity.Network) error {
if fake.FakeParameter == "" {
return fmt.Errorf("Fail to validate but don't worry, I'm fake network")
func (fnp fakeNetworkProvider) ValidateBeforeCreating(sp *serviceprovider.Container) error {
for _, node := range fnp.nodes {
if node.FakeParameter == "" {
return fmt.Errorf("Fail to validate but don't worry, I'm fake network")
}
}
return nil
}

func (fake FakeNetworkProvider) CreateNetwork(sp *serviceprovider.Container, net *entity.Network) error {
if fake.IWantFail {
return fmt.Errorf("Fail to create network but don't worry, I'm fake network")
func (fnp fakeNetworkProvider) CreateNetwork(sp *serviceprovider.Container) error {
for _, node := range fnp.nodes {
if node.ShouldFail {
return fmt.Errorf("Fail to validate but don't worry, I'm fake network")
}
}
return nil
}

func (fake FakeNetworkProvider) DeleteNetwork(sp *serviceprovider.Container, net *entity.Network) error {
if fake.IWantFail {
return fmt.Errorf("Fail to delete network but don't worry, I'm fake network")
func (fnp fakeNetworkProvider) DeleteNetwork(sp *serviceprovider.Container) error {
for _, node := range fnp.nodes {
if node.ShouldFail {
return fmt.Errorf("Fail to delete network but don't worry, I'm fake network")
}
}
return nil
}
Loading

0 comments on commit ed661fd

Please sign in to comment.