Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

network entity refactoring #77

Merged
merged 2 commits into from
Jul 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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},
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need double check: you're using 4095, not 4096?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes! 4096 is a invalid number

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