-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #30 from linkernetworks/alex/network-controller
Add network controller Former-commit-id: c0298a16614b2adc44cafd777b4270d2c2bcec08 [formerly c0298a16614b2adc44cafd777b4270d2c2bcec08 [formerly dd01cbf]] Former-commit-id: b983b59baae23791621a1de3f22c9176c76f9632 Former-commit-id: 7069fbe
- Loading branch information
Showing
10 changed files
with
747 additions
and
193 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package networkcontroller | ||
|
||
import ( | ||
"time" | ||
|
||
pb "github.com/linkernetworks/network-controller/messages" | ||
"github.com/linkernetworks/vortex/src/entity" | ||
"github.com/linkernetworks/vortex/src/kubernetes" | ||
"golang.org/x/net/context" | ||
"google.golang.org/grpc" | ||
) | ||
|
||
type NetworkController struct { | ||
KubeCtl *kubernetes.KubeCtl | ||
ClientCtl pb.NetworkControlClient | ||
Network entity.Network | ||
Context context.Context | ||
} | ||
|
||
func New(kubeCtl *kubernetes.KubeCtl, network entity.Network) (*NetworkController, error) { | ||
nodeIP, err := kubeCtl.GetNodeExternalIP(network.NodeName) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
// Set up a connection to the server. | ||
conn, err := grpc.Dial(nodeIP+":50051", grpc.WithInsecure()) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
ctx, _ := context.WithTimeout(context.Background(), time.Second) | ||
|
||
return &NetworkController{ | ||
KubeCtl: kubeCtl, | ||
ClientCtl: pb.NewNetworkControlClient(conn), | ||
Network: network, | ||
Context: ctx, | ||
}, nil | ||
} | ||
|
||
func (nc *NetworkController) CreateNetwork() error { | ||
_, err := nc.ClientCtl.CreateBridge( | ||
nc.Context, | ||
&pb.CreateBridgeRequest{ | ||
BridgeName: nc.Network.BridgeName, | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
for _, port := range nc.Network.PhysicalPorts { | ||
_, err := nc.ClientCtl.AddPort( | ||
nc.Context, | ||
&pb.AddPortRequest{ | ||
BridgeName: nc.Network.BridgeName, | ||
IfaceName: port.Name, | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
package networkcontroller | ||
|
||
import ( | ||
"fmt" | ||
"github.com/linkernetworks/vortex/src/entity" | ||
"github.com/linkernetworks/vortex/src/kubernetes" | ||
"github.com/moby/moby/pkg/namesgenerator" | ||
"github.com/stretchr/testify/suite" | ||
"math/rand" | ||
"os" | ||
"os/exec" | ||
"runtime" | ||
"testing" | ||
"time" | ||
|
||
corev1 "k8s.io/api/core/v1" | ||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||
fakeclientset "k8s.io/client-go/kubernetes/fake" | ||
) | ||
|
||
func init() { | ||
rand.Seed(time.Now().UnixNano()) | ||
} | ||
|
||
type NetworkControllerTestSuite struct { | ||
suite.Suite | ||
kubectl *kubernetes.KubeCtl | ||
ifName string | ||
nodeName string | ||
} | ||
|
||
func (suite *NetworkControllerTestSuite) SetupSuite() { | ||
// init fakeclient | ||
fakeclient := fakeclientset.NewSimpleClientset() | ||
namespace := "default" | ||
suite.kubectl = kubernetes.New(fakeclient, namespace) | ||
|
||
//Create a fake clinet | ||
//Init | ||
nodeAddr := corev1.NodeAddress{ | ||
Type: "ExternalIP", | ||
Address: "127.0.0.1", | ||
} | ||
|
||
suite.nodeName = namesgenerator.GetRandomName(0)[0:8] | ||
node := corev1.Node{ | ||
ObjectMeta: metav1.ObjectMeta{ | ||
Name: suite.nodeName, | ||
}, | ||
Status: corev1.NodeStatus{ | ||
Addresses: []corev1.NodeAddress{nodeAddr}, | ||
}, | ||
} | ||
_, err := suite.kubectl.Clientset.CoreV1().Nodes().Create(&node) | ||
suite.NoError(err) | ||
|
||
//There's a length limit of link name | ||
suite.ifName = namesgenerator.GetRandomName(0)[0:8] | ||
pName := namesgenerator.GetRandomName(0)[0:8] | ||
//Create a veth for testing | ||
err = exec.Command("ip", "link", "add", suite.ifName, "type", "veth", "peer", "name", pName).Run() | ||
suite.NoError(err) | ||
} | ||
|
||
func TestNetworkControllerSuite(t *testing.T) { | ||
if runtime.GOOS != "linux" { | ||
fmt.Println("We only testing the ovs function on Linux Host") | ||
t.Skip() | ||
return | ||
} | ||
if _, defined := os.LookupEnv("TEST_GRPC"); !defined { | ||
t.SkipNow() | ||
return | ||
} | ||
suite.Run(t, new(NetworkControllerTestSuite)) | ||
} | ||
|
||
func (suite *NetworkControllerTestSuite) TestNewNetworkController() { | ||
network := entity.Network{ | ||
NodeName: suite.nodeName, | ||
} | ||
|
||
_, err := New(suite.kubectl, network) | ||
suite.NoError(err) | ||
} | ||
|
||
func (suite *NetworkControllerTestSuite) TestCreateNetwork() { | ||
//Parameters | ||
eth1 := entity.PhysicalPort{ | ||
Name: suite.ifName, | ||
MTU: 1500, | ||
VlanTags: []int{2043, 2143, 2243}, | ||
} | ||
|
||
tName := namesgenerator.GetRandomName(0) | ||
network := entity.Network{ | ||
BridgeName: tName, | ||
BridgeType: "ovs", | ||
NodeName: suite.nodeName, | ||
PhysicalPorts: []entity.PhysicalPort{eth1}, | ||
} | ||
|
||
nc, err := New(suite.kubectl, network) | ||
suite.NoError(err) | ||
err = nc.CreateNetwork() | ||
suite.NoError(err) | ||
|
||
defer exec.Command("ovs-vsctl", "del-br", tName).Run() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.