Skip to content

Commit 431ac08

Browse files
jaer-tsunsharmasushant
authored andcommitted
Enable Circleci (#220)
Enable CircleCi
1 parent cace8b8 commit 431ac08

File tree

7 files changed

+189
-25
lines changed

7 files changed

+189
-25
lines changed

.circleci/config.yml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
version: 2
2+
jobs:
3+
setup-and-test:
4+
# docker:
5+
# - image: golang:1.10
6+
machine:
7+
image: circleci/classic:latest
8+
steps:
9+
- checkout
10+
- run:
11+
name: Setup-and-test
12+
command: |
13+
sudo -E env "PATH=$PATH" apt-get update
14+
sudo -E env "PATH=$PATH" apt-get install -y ebtables
15+
sudo -E env "PATH=$PATH" apt-get install -y ipset
16+
mkdir -p /home/circleci/go1-10
17+
mkdir --parents /home/circleci/.goproject/src/github.com/Azure/azure-container-networking
18+
wget https://storage.googleapis.com/golang/go1.10.2.linux-amd64.tar.gz
19+
tar -C /home/circleci/go1-10 -xvf go1.10.2.linux-amd64.tar.gz
20+
rm go1.10.2.linux-amd64.tar.gz
21+
mv * /home/circleci/.goproject/src/github.com/Azure/azure-container-networking
22+
cd /home/circleci/.goproject/src/github.com/Azure/azure-container-networking
23+
export GOROOT='/home/circleci/go1-10/go'
24+
export GOPATH='/home/circleci/.goproject'
25+
export PATH=$GOROOT/bin:$PATH
26+
go get ./...
27+
go get github.com/docker/libnetwork/driverapi
28+
go get github.com/gorilla/mux
29+
sudo -E env "PATH=$PATH" go test ./ipam/
30+
sudo -E env "PATH=$PATH" go test ./log/
31+
sudo -E env "PATH=$PATH" go test ./netlink/
32+
sudo -E env "PATH=$PATH" go test ./store/
33+
sudo -E env "PATH=$PATH" go test ./telemetry/
34+
sudo -E env "PATH=$PATH" go test ./cni/ipam/
35+
sudo -E env "PATH=$PATH" go test ./cnm/network/
36+
sudo -E env "PATH=$PATH" go test ./cns/ipamclient/
37+
#sudo -E env "PATH=$PATH" go test ./cns/restserver/
38+
workflows:
39+
version: 2
40+
run-tests:
41+
jobs:
42+
- setup-and-test

cnm/ipam/ipam_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func handleIpamQuery(w http.ResponseWriter, r *http.Request) {
101101
// Decodes plugin's responses to test requests.
102102
func decodeResponse(w *httptest.ResponseRecorder, response interface{}) error {
103103
if w.Code != http.StatusOK {
104-
return fmt.Errorf("Request failed with HTTP error %s", w.Code)
104+
return fmt.Errorf("Request failed with HTTP error %d", w.Code)
105105
}
106106

107107
if w.Body == nil {

cnm/network/network_test.go

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,13 @@ import (
2323
var plugin NetPlugin
2424
var mux *http.ServeMux
2525

26-
var anyInterface = "test0"
26+
var anyInterface = "dummy"
2727
var anySubnet = "192.168.1.0/24"
28+
var ipnet = net.IPNet{IP: net.ParseIP("192.168.1.0"), Mask: net.IPv4Mask(255, 255, 255, 0)}
29+
var networkID = "N1"
30+
31+
// endpoint ID must contain 7 characters
32+
var endpointID = "E1-xxxx"
2833

2934
// Wraps the test run with plugin setup and teardown.
3035
func TestMain(m *testing.M) {
@@ -52,7 +57,7 @@ func TestMain(m *testing.M) {
5257
err = netlink.AddLink(&netlink.DummyLink{
5358
LinkInfo: netlink.LinkInfo{
5459
Type: netlink.LINK_TYPE_DUMMY,
55-
Name: "dummy",
60+
Name: anyInterface,
5661
},
5762
})
5863

@@ -67,6 +72,12 @@ func TestMain(m *testing.M) {
6772
os.Exit(4)
6873
}
6974

75+
err = netlink.AddIpAddress(anyInterface, net.ParseIP("192.168.1.4"), &ipnet)
76+
if err != nil {
77+
fmt.Printf("Failed to add test IP address, err:%v.\n", err)
78+
os.Exit(5)
79+
}
80+
7081
// Get the internal http mux as test hook.
7182
mux = plugin.(*netPlugin).Listener.GetMux()
7283

@@ -83,7 +94,7 @@ func TestMain(m *testing.M) {
8394
// Decodes plugin's responses to test requests.
8495
func decodeResponse(w *httptest.ResponseRecorder, response interface{}) error {
8596
if w.Code != http.StatusOK {
86-
return fmt.Errorf("Request failed with HTTP error %s", w.Code)
97+
return fmt.Errorf("Request failed with HTTP error %d", w.Code)
8798
}
8899

89100
if w.Body == nil {
@@ -144,7 +155,7 @@ func TestCreateNetwork(t *testing.T) {
144155
_, pool, _ := net.ParseCIDR(anySubnet)
145156

146157
info := &remoteApi.CreateNetworkRequest{
147-
NetworkID: "N1",
158+
NetworkID: networkID,
148159
IPv4Data: []driverApi.IPAMData{
149160
{
150161
Pool: pool,
@@ -164,23 +175,25 @@ func TestCreateNetwork(t *testing.T) {
164175

165176
err = decodeResponse(w, &resp)
166177

167-
if err != nil || resp.Err != "" {
178+
if err != nil || resp.Response.Err != "" {
168179
t.Errorf("CreateNetwork response is invalid %+v", resp)
169180
}
170181
}
171182

172-
// Tests NetworkDriver.DeleteNetwork functionality.
173-
func TestDeleteNetwork(t *testing.T) {
183+
// Tests NetworkDriver.CreateEndpoint functionality.
184+
func TestCreateEndpoint(t *testing.T) {
174185
var body bytes.Buffer
175-
var resp remoteApi.DeleteNetworkResponse
186+
var resp remoteApi.CreateEndpointResponse
176187

177-
info := &remoteApi.DeleteNetworkRequest{
178-
NetworkID: "N1",
188+
info := &remoteApi.CreateEndpointRequest{
189+
NetworkID: networkID,
190+
EndpointID: endpointID,
191+
Interface: &remoteApi.EndpointInterface{Address: anySubnet},
179192
}
180193

181194
json.NewEncoder(&body).Encode(info)
182195

183-
req, err := http.NewRequest(http.MethodGet, deleteNetworkPath, &body)
196+
req, err := http.NewRequest(http.MethodGet, createEndpointPath, &body)
184197
if err != nil {
185198
t.Fatal(err)
186199
}
@@ -190,8 +203,8 @@ func TestDeleteNetwork(t *testing.T) {
190203

191204
err = decodeResponse(w, &resp)
192205

193-
if err != nil || resp.Err != "" {
194-
t.Errorf("DeleteNetwork response is invalid %+v", resp)
206+
if err != nil || resp.Response.Err != "" {
207+
t.Errorf("CreateEndpoint response is invalid %+v", resp)
195208
}
196209
}
197210

@@ -201,8 +214,8 @@ func TestEndpointOperInfo(t *testing.T) {
201214
var resp remoteApi.EndpointInfoResponse
202215

203216
info := &remoteApi.EndpointInfoRequest{
204-
NetworkID: "N1",
205-
EndpointID: "E1",
217+
NetworkID: networkID,
218+
EndpointID: endpointID,
206219
}
207220

208221
json.NewEncoder(&body).Encode(info)
@@ -216,8 +229,33 @@ func TestEndpointOperInfo(t *testing.T) {
216229
mux.ServeHTTP(w, req)
217230

218231
err = decodeResponse(w, &resp)
219-
220232
if err != nil || resp.Err != "" {
221233
t.Errorf("EndpointOperInfo response is invalid %+v", resp)
222234
}
223235
}
236+
237+
// Tests NetworkDriver.DeleteNetwork functionality.
238+
func TestDeleteNetwork(t *testing.T) {
239+
var body bytes.Buffer
240+
var resp remoteApi.DeleteNetworkResponse
241+
242+
info := &remoteApi.DeleteNetworkRequest{
243+
NetworkID: networkID,
244+
}
245+
246+
json.NewEncoder(&body).Encode(info)
247+
248+
req, err := http.NewRequest(http.MethodGet, deleteNetworkPath, &body)
249+
if err != nil {
250+
t.Fatal(err)
251+
}
252+
253+
w := httptest.NewRecorder()
254+
mux.ServeHTTP(w, req)
255+
256+
err = decodeResponse(w, &resp)
257+
258+
if err != nil || resp.Err != "" {
259+
t.Errorf("DeleteNetwork response is invalid %+v", resp)
260+
}
261+
}

cns/restserver/restserver_test.go

Lines changed: 88 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,78 @@ package restserver
66
import (
77
"bytes"
88
"encoding/json"
9+
"encoding/xml"
910
"fmt"
1011
"net/http"
1112
"net/http/httptest"
13+
"net/url"
1214
"os"
1315
"testing"
1416

1517
"github.com/Azure/azure-container-networking/cns"
1618
"github.com/Azure/azure-container-networking/cns/common"
19+
"github.com/Azure/azure-container-networking/cns/imdsclient"
20+
acncommon "github.com/Azure/azure-container-networking/common"
1721
)
1822

19-
var service HTTPService
20-
var mux *http.ServeMux
23+
type IPAddress struct {
24+
XMLName xml.Name `xml:"IPAddress"`
25+
Address string `xml:"Address,attr"`
26+
IsPrimary bool `xml:"IsPrimary,attr"`
27+
}
28+
type IPSubnet struct {
29+
XMLName xml.Name `xml:"IPSubnet"`
30+
Prefix string `xml:"Prefix,attr"`
31+
IPAddress []IPAddress
32+
}
33+
34+
type Interface struct {
35+
XMLName xml.Name `xml:"Interface"`
36+
MacAddress string `xml:"MacAddress,attr"`
37+
IsPrimary bool `xml:"IsPrimary,attr"`
38+
IPSubnet []IPSubnet
39+
}
40+
41+
type xmlDocument struct {
42+
XMLName xml.Name `xml:"Interfaces"`
43+
Interface []Interface
44+
}
45+
46+
var (
47+
service HTTPService
48+
mux *http.ServeMux
49+
hostQueryForProgrammedVersionResponse = `{"httpStatusCode":"200","networkContainerId":"eab2470f-test-test-test-b3cd316979d5","version":"1"}`
50+
hostQueryResponse = xmlDocument{
51+
XMLName: xml.Name{Local: "Interfaces"},
52+
Interface: []Interface{Interface{
53+
XMLName: xml.Name{Local: "Interface"},
54+
MacAddress: "*",
55+
IsPrimary: true,
56+
IPSubnet: []IPSubnet{
57+
IPSubnet{XMLName: xml.Name{Local: "IPSubnet"},
58+
Prefix: "10.0.0.0/16",
59+
IPAddress: []IPAddress{
60+
IPAddress{
61+
XMLName: xml.Name{Local: "IPAddress"},
62+
Address: "10.0.0.4",
63+
IsPrimary: true},
64+
}},
65+
},
66+
}},
67+
}
68+
)
69+
70+
func getInterfaceInfo(w http.ResponseWriter, r *http.Request) {
71+
w.Header().Set("Content-Type", "application/xml")
72+
output, _ := xml.Marshal(hostQueryResponse)
73+
w.Write(output)
74+
}
75+
76+
func getContainerInfo(w http.ResponseWriter, r *http.Request) {
77+
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
78+
w.WriteHeader(http.StatusOK)
79+
w.Write([]byte(hostQueryForProgrammedVersionResponse))
80+
}
2181

2282
// Wraps the test run with service setup and teardown.
2383
func TestMain(m *testing.M) {
@@ -33,6 +93,11 @@ func TestMain(m *testing.M) {
3393

3494
// Configure test mode.
3595
service.(*httpRestService).Name = "cns-test-server"
96+
service.(*httpRestService).imdsClient.HostQueryURL = imdsclient.HostQueryURL
97+
service.(*httpRestService).imdsClient.HostQueryURLForProgrammedVersion = imdsclient.HostQueryURLForProgrammedVersion
98+
// Following HostQueryURL and HostQueryURLForProgrammedVersion are only for mock environment.
99+
// service.(*httpRestService).imdsClient.HostQueryURL = "http://localhost:9000/getInterface"
100+
// service.(*httpRestService).imdsClient.HostQueryURLForProgrammedVersion = "http://localhost:9000/machine/plugins/?comp=nmagent&type=NetworkManagement/interfaces/%s/networkContainers/%s/authenticationToken/%s/api-version/%s"
36101

37102
// Start the service.
38103
err = service.Start(&config)
@@ -44,6 +109,26 @@ func TestMain(m *testing.M) {
44109
// Get the internal http mux as test hook.
45110
mux = service.(*httpRestService).Listener.GetMux()
46111

112+
// Setup mock nmagent server
113+
u, err := url.Parse("tcp://localhost:9000")
114+
if err != nil {
115+
fmt.Println(err.Error())
116+
}
117+
118+
nmAgentServer, err := acncommon.NewListener(u)
119+
if err != nil {
120+
fmt.Println(err.Error())
121+
}
122+
123+
nmAgentServer.AddHandler("/getInterface", getInterfaceInfo)
124+
nmAgentServer.AddHandler("machine/plugins/?comp=nmagent&type=NetworkManagement/interfaces/{interface}/networkContainers/{networkContainer}/authenticationToken/{authToken}/api-version/{version}", getContainerInfo)
125+
126+
err = nmAgentServer.Start(make(chan error, 1))
127+
if err != nil {
128+
fmt.Printf("Failed to start agent, err:%v.\n", err)
129+
return
130+
}
131+
47132
// Run tests.
48133
exitCode := m.Run()
49134

@@ -71,7 +156,7 @@ func setEnv(t *testing.T) *httptest.ResponseRecorder {
71156
envRequestJSON := new(bytes.Buffer)
72157
json.NewEncoder(envRequestJSON).Encode(envRequest)
73158

74-
req, err := http.NewRequest(http.MethodPost, cns.V1Prefix+cns.SetEnvironmentPath, envRequestJSON)
159+
req, err := http.NewRequest(http.MethodPost, cns.V2Prefix+cns.SetEnvironmentPath, envRequestJSON)
75160
if err != nil {
76161
t.Fatal(err)
77162
}

log/logger_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ func TestLogFileRotatesWhenSizeLimitIsReached(t *testing.T) {
2727

2828
l.Close()
2929

30-
fn := logName + ".log"
30+
fn := l.GetLogDirectory() + logName + ".log"
3131
_, err := os.Stat(fn)
3232
if err != nil {
3333
t.Errorf("Failed to find active log file.")
3434
}
3535
os.Remove(fn)
3636

37-
fn = logName + ".log.1"
37+
fn = l.GetLogDirectory() + logName + ".log.1"
3838
_, err = os.Stat(fn)
3939
if err != nil {
4040
t.Errorf("Failed to find the 1st rotated log file.")
4141
}
4242
os.Remove(fn)
4343

44-
fn = logName + ".log.2"
44+
fn = l.GetLogDirectory() + logName + ".log.2"
4545
_, err = os.Stat(fn)
4646
if err == nil {
4747
t.Errorf("Found the 2nd rotated log file which should have been deleted.")

netlink/netlink_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
const (
1212
ifName = "nltest"
1313
ifName2 = "nltest2"
14-
dummyName = "dummy0"
14+
dummyName = "dummy1"
1515
)
1616

1717
// AddDummyInterface creates a dummy test interface used during actual tests.

network/network_linux.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ func (nm *networkManager) connectExternalInterface(extIf *externalInterface, nwI
210210
bridge, err := net.InterfaceByName(bridgeName)
211211
if err != nil {
212212
// Create the bridge.
213-
214213
if err := networkClient.CreateBridge(); err != nil {
215214
log.Printf("Error while creating bridge %+v", err)
216215
return err

0 commit comments

Comments
 (0)