Skip to content

Commit 967efbd

Browse files
authored
Expose GET NC list API in CNS client (#3449)
* initial changes to expose getnclist API in cns client * add a test * linter fix * linter fix * linter fix * change return message to provide a default value * address comments * linter fix * address comments
1 parent 865de8d commit 967efbd

File tree

7 files changed

+114
-3
lines changed

7 files changed

+114
-3
lines changed

cns/NetworkContainerContract.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
const (
2020
SetOrchestratorType = "/network/setorchestratortype"
2121
GetHomeAz = "/homeaz"
22+
GetNCList = "/nclist"
2223
GetVMUniqueID = "/metadata/vmuniqueid"
2324
CreateOrUpdateNetworkContainer = "/network/createorupdatenetworkcontainer"
2425
DeleteNetworkContainer = "/network/deletenetworkcontainer"

cns/api.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const (
2828
CreateHostNCApipaEndpointPath = "/network/createhostncapipaendpoint"
2929
DeleteHostNCApipaEndpointPath = "/network/deletehostncapipaendpoint"
3030
NmAgentSupportedApisPath = "/network/nmagentsupportedapis"
31+
NMAgentGetNCListAPIPath = "/nclist"
3132
V1Prefix = "/v0.1"
3233
V2Prefix = "/v0.2"
3334
EndpointPath = "/network/endpoints/"
@@ -353,6 +354,11 @@ type NmAgentSupportedApisResponse struct {
353354
SupportedApis []string
354355
}
355356

357+
type NCListResponse struct {
358+
Response Response `json:"response"`
359+
NCList []string `json:"ncList"`
360+
}
361+
356362
type HomeAzResponse struct {
357363
IsSupported bool `json:"isSupported"`
358364
HomeAz uint `json:"homeAz"`

cns/restserver/api.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,3 +1300,40 @@ func (service *HTTPRestService) getVMUniqueID(w http.ResponseWriter, r *http.Req
13001300
})
13011301
}
13021302
}
1303+
1304+
// This function is used to query all NCs on a node from NMAgent
1305+
func (service *HTTPRestService) nmAgentNCListHandler(w http.ResponseWriter, r *http.Request) {
1306+
logger.Request(service.Name, "nmAgentNCListHandler", nil)
1307+
var (
1308+
returnCode types.ResponseCode
1309+
networkContainerList []string
1310+
)
1311+
1312+
returnMessage := "Successfully fetched NC list from NMAgent"
1313+
ctx := r.Context()
1314+
switch r.Method {
1315+
case http.MethodGet:
1316+
ncVersionList, ncVersionerr := service.nma.GetNCVersionList(ctx)
1317+
if ncVersionerr != nil {
1318+
returnCode = types.NmAgentNCVersionListError
1319+
returnMessage = "[Azure-CNS] " + ncVersionerr.Error()
1320+
break
1321+
}
1322+
1323+
for _, container := range ncVersionList.Containers {
1324+
networkContainerList = append(networkContainerList, container.NetworkContainerID)
1325+
}
1326+
1327+
default:
1328+
returnMessage = "[Azure-CNS] NmAgentNCList API expects a GET method."
1329+
}
1330+
1331+
resp := cns.Response{ReturnCode: returnCode, Message: returnMessage}
1332+
NCListResponse := &cns.NCListResponse{
1333+
Response: resp,
1334+
NCList: networkContainerList,
1335+
}
1336+
1337+
serviceErr := common.Encode(w, &NCListResponse)
1338+
logger.Response(service.Name, NCListResponse, resp.ReturnCode, serviceErr)
1339+
}

cns/restserver/api_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,70 @@ func TestNmAgentSupportedApisHandler(t *testing.T) {
13021302
fmt.Printf("nmAgentSupportedApisHandler Responded with %+v\n", nmAgentSupportedApisResponse)
13031303
}
13041304

1305+
func TestNMAgentNCListHandler(t *testing.T) {
1306+
fmt.Println("Test: nmAgentNCListHandler")
1307+
1308+
setEnv(t)
1309+
errSetOrch := setOrchestratorType(t, cns.Kubernetes)
1310+
if errSetOrch != nil {
1311+
t.Fatalf("TestNMAgentNCListHandler failed with error:%+v", errSetOrch)
1312+
}
1313+
1314+
mnma := &fakes.NMAgentClientFake{}
1315+
cleanupNMA := setMockNMAgent(svc, mnma)
1316+
defer cleanupNMA()
1317+
1318+
wsproxy := fakes.WireserverProxyFake{}
1319+
cleanupWSP := setWireserverProxy(svc, &wsproxy)
1320+
defer cleanupWSP()
1321+
1322+
params := createOrUpdateNetworkContainerParams{
1323+
ncID: "f47ac10b-58cc-0372-8567-0e02b2c3d475", // random guid
1324+
ncIP: "11.0.0.5",
1325+
ncType: cns.AzureContainerInstance,
1326+
ncVersion: "0",
1327+
vnetID: "vnet1",
1328+
podName: "testpod",
1329+
podNamespace: "testpodnamespace",
1330+
}
1331+
1332+
err := createNC(params)
1333+
if err != nil {
1334+
t.Fatal("error creating NC: err:", err)
1335+
}
1336+
1337+
mnma.GetNCVersionListF = func(_ context.Context) (nmagent.NCVersionList, error) {
1338+
return nmagent.NCVersionList{
1339+
Containers: []nmagent.NCVersion{
1340+
{
1341+
// Must set it as params.ncID without cns.SwiftPrefix to mock real nmagent nc format.
1342+
NetworkContainerID: params.ncID,
1343+
Version: params.ncVersion,
1344+
},
1345+
},
1346+
}, nil
1347+
}
1348+
1349+
// test CNS' new GET /ncList API
1350+
var req *http.Request
1351+
req, err = http.NewRequestWithContext(context.TODO(), http.MethodGet, cns.NMAgentGetNCListAPIPath, http.NoBody)
1352+
if err != nil {
1353+
t.Fatal(err)
1354+
}
1355+
1356+
w := httptest.NewRecorder()
1357+
mux.ServeHTTP(w, req)
1358+
var nmAgentNCListResponse cns.NCListResponse
1359+
1360+
err = decodeResponse(w, &nmAgentNCListResponse)
1361+
if err != nil || nmAgentNCListResponse.Response.ReturnCode != 0 {
1362+
t.Errorf("nmAgentNCListHandler failed with response %+v", nmAgentNCListResponse)
1363+
}
1364+
1365+
fmt.Printf("nmAgentNCListHandler responded with %+v\n", nmAgentNCListResponse)
1366+
require.Equal(t, params.ncID, nmAgentNCListResponse.NCList[0])
1367+
}
1368+
13051369
// Testing GetHomeAz API handler, return UnsupportedVerb if http method is not supported
13061370
func TestGetHomeAz_UnsupportedHttpMethod(t *testing.T) {
13071371
req, err := http.NewRequestWithContext(context.TODO(), http.MethodPost, cns.GetHomeAz, http.NoBody)

cns/restserver/restserver.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,10 @@ func (service *HTTPRestService) Init(config *common.ServiceConfig) error {
292292
listener.AddHandler(cns.NetworkContainersURLPath, service.getOrRefreshNetworkContainers)
293293
listener.AddHandler(cns.GetHomeAz, service.getHomeAz)
294294
listener.AddHandler(cns.EndpointPath, service.EndpointHandlerAPI)
295-
// This API is only needed for Direct channel mode with Swift v2.
295+
// This API is only needed for Direct channel mode.
296296
if config.ChannelMode == cns.Direct {
297297
listener.AddHandler(cns.GetVMUniqueID, service.getVMUniqueID)
298+
listener.AddHandler(cns.GetNCList, service.nmAgentNCListHandler)
298299
}
299300

300301
// handlers for v0.2
@@ -318,9 +319,10 @@ func (service *HTTPRestService) Init(config *common.ServiceConfig) error {
318319
listener.AddHandler(cns.V2Prefix+cns.NmAgentSupportedApisPath, service.nmAgentSupportedApisHandler)
319320
listener.AddHandler(cns.V2Prefix+cns.GetHomeAz, service.getHomeAz)
320321
listener.AddHandler(cns.V2Prefix+cns.EndpointPath, service.EndpointHandlerAPI)
321-
// This API is only needed for Direct channel mode with Swift v2.
322+
// This API is only needed for Direct channel mode.
322323
if config.ChannelMode == cns.Direct {
323324
listener.AddHandler(cns.V2Prefix+cns.GetVMUniqueID, service.getVMUniqueID)
325+
listener.AddHandler(cns.V2Prefix+cns.GetNCList, service.nmAgentNCListHandler)
324326
}
325327

326328
// Initialize HTTP client to be reused in CNS

cns/types/codes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const (
4646
FailedToAllocateBackendConfig ResponseCode = 44
4747
ConnectionError ResponseCode = 45
4848
UnexpectedError ResponseCode = 99
49+
NmAgentNCVersionListError ResponseCode = 100
4950
)
5051

5152
// nolint:gocyclo

nmagent/responses.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type NCVersion struct {
3737
Version string `json:"version"` // the current network container version
3838
}
3939

40-
// NetworkContainerListResponse is a collection of network container IDs mapped
40+
// NCVersionList is a collection of network container IDs mapped
4141
// to their current versions.
4242
type NCVersionList struct {
4343
Containers []NCVersion `json:"networkContainers"`

0 commit comments

Comments
 (0)