Skip to content
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
1 change: 1 addition & 0 deletions cns/NetworkContainerContract.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
const (
SetOrchestratorType = "/network/setorchestratortype"
GetHomeAz = "/homeaz"
GetNCList = "/nclist"
GetVMUniqueID = "/metadata/vmuniqueid"
CreateOrUpdateNetworkContainer = "/network/createorupdatenetworkcontainer"
DeleteNetworkContainer = "/network/deletenetworkcontainer"
Expand Down
6 changes: 6 additions & 0 deletions cns/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ const (
CreateHostNCApipaEndpointPath = "/network/createhostncapipaendpoint"
DeleteHostNCApipaEndpointPath = "/network/deletehostncapipaendpoint"
NmAgentSupportedApisPath = "/network/nmagentsupportedapis"
NMAgentGetNCListAPIPath = "/nclist"
V1Prefix = "/v0.1"
V2Prefix = "/v0.2"
EndpointPath = "/network/endpoints/"
Expand Down Expand Up @@ -353,6 +354,11 @@ type NmAgentSupportedApisResponse struct {
SupportedApis []string
}

type NCListResponse struct {
Response Response `json:"response"`
NCList []string `json:"ncList"`
}

type HomeAzResponse struct {
IsSupported bool `json:"isSupported"`
HomeAz uint `json:"homeAz"`
Expand Down
37 changes: 37 additions & 0 deletions cns/restserver/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -1300,3 +1300,40 @@ func (service *HTTPRestService) getVMUniqueID(w http.ResponseWriter, r *http.Req
})
}
}

// This function is used to query all NCs on a node from NMAgent
func (service *HTTPRestService) nmAgentNCListHandler(w http.ResponseWriter, r *http.Request) {
logger.Request(service.Name, "nmAgentNCListHandler", nil)
var (
returnCode types.ResponseCode
networkContainerList []string
)

returnMessage := "Successfully fetched NC list from NMAgent"
ctx := r.Context()
switch r.Method {
case http.MethodGet:
ncVersionList, ncVersionerr := service.nma.GetNCVersionList(ctx)
if ncVersionerr != nil {
returnCode = types.NmAgentNCVersionListError
returnMessage = "[Azure-CNS] " + ncVersionerr.Error()
break
}

for _, container := range ncVersionList.Containers {
networkContainerList = append(networkContainerList, container.NetworkContainerID)
}

default:
returnMessage = "[Azure-CNS] NmAgentNCList API expects a GET method."
}

resp := cns.Response{ReturnCode: returnCode, Message: returnMessage}
NCListResponse := &cns.NCListResponse{
Response: resp,
NCList: networkContainerList,
}

serviceErr := common.Encode(w, &NCListResponse)
logger.Response(service.Name, NCListResponse, resp.ReturnCode, serviceErr)
}
64 changes: 64 additions & 0 deletions cns/restserver/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1302,6 +1302,70 @@ func TestNmAgentSupportedApisHandler(t *testing.T) {
fmt.Printf("nmAgentSupportedApisHandler Responded with %+v\n", nmAgentSupportedApisResponse)
}

func TestNMAgentNCListHandler(t *testing.T) {
fmt.Println("Test: nmAgentNCListHandler")

setEnv(t)
errSetOrch := setOrchestratorType(t, cns.Kubernetes)
if errSetOrch != nil {
t.Fatalf("TestNMAgentNCListHandler failed with error:%+v", errSetOrch)
}

mnma := &fakes.NMAgentClientFake{}
cleanupNMA := setMockNMAgent(svc, mnma)
defer cleanupNMA()

wsproxy := fakes.WireserverProxyFake{}
cleanupWSP := setWireserverProxy(svc, &wsproxy)
defer cleanupWSP()

params := createOrUpdateNetworkContainerParams{
ncID: "f47ac10b-58cc-0372-8567-0e02b2c3d475", // random guid
ncIP: "11.0.0.5",
ncType: cns.AzureContainerInstance,
ncVersion: "0",
vnetID: "vnet1",
podName: "testpod",
podNamespace: "testpodnamespace",
}

err := createNC(params)
if err != nil {
t.Fatal("error creating NC: err:", err)
}

mnma.GetNCVersionListF = func(_ context.Context) (nmagent.NCVersionList, error) {
return nmagent.NCVersionList{
Containers: []nmagent.NCVersion{
{
// Must set it as params.ncID without cns.SwiftPrefix to mock real nmagent nc format.
NetworkContainerID: params.ncID,
Version: params.ncVersion,
},
},
}, nil
}

// test CNS' new GET /ncList API
var req *http.Request
req, err = http.NewRequestWithContext(context.TODO(), http.MethodGet, cns.NMAgentGetNCListAPIPath, http.NoBody)
if err != nil {
t.Fatal(err)
}

w := httptest.NewRecorder()
mux.ServeHTTP(w, req)
var nmAgentNCListResponse cns.NCListResponse

err = decodeResponse(w, &nmAgentNCListResponse)
if err != nil || nmAgentNCListResponse.Response.ReturnCode != 0 {
t.Errorf("nmAgentNCListHandler failed with response %+v", nmAgentNCListResponse)
}

fmt.Printf("nmAgentNCListHandler responded with %+v\n", nmAgentNCListResponse)
require.Equal(t, params.ncID, nmAgentNCListResponse.NCList[0])
}

// Testing GetHomeAz API handler, return UnsupportedVerb if http method is not supported
func TestGetHomeAz_UnsupportedHttpMethod(t *testing.T) {
req, err := http.NewRequestWithContext(context.TODO(), http.MethodPost, cns.GetHomeAz, http.NoBody)
Expand Down
6 changes: 4 additions & 2 deletions cns/restserver/restserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,9 +292,10 @@ func (service *HTTPRestService) Init(config *common.ServiceConfig) error {
listener.AddHandler(cns.NetworkContainersURLPath, service.getOrRefreshNetworkContainers)
listener.AddHandler(cns.GetHomeAz, service.getHomeAz)
listener.AddHandler(cns.EndpointPath, service.EndpointHandlerAPI)
// This API is only needed for Direct channel mode with Swift v2.
// This API is only needed for Direct channel mode.
if config.ChannelMode == cns.Direct {
listener.AddHandler(cns.GetVMUniqueID, service.getVMUniqueID)
listener.AddHandler(cns.GetNCList, service.nmAgentNCListHandler)
}

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

// Initialize HTTP client to be reused in CNS
Expand Down
1 change: 1 addition & 0 deletions cns/types/codes.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ const (
FailedToAllocateBackendConfig ResponseCode = 44
ConnectionError ResponseCode = 45
UnexpectedError ResponseCode = 99
NmAgentNCVersionListError ResponseCode = 100
)

// nolint:gocyclo
Expand Down
2 changes: 1 addition & 1 deletion nmagent/responses.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ type NCVersion struct {
Version string `json:"version"` // the current network container version
}

// NetworkContainerListResponse is a collection of network container IDs mapped
// NCVersionList is a collection of network container IDs mapped
// to their current versions.
type NCVersionList struct {
Containers []NCVersion `json:"networkContainers"`
Expand Down
Loading