From e7bc1ea9124b3837a80c54a202bb20c5f2468be6 Mon Sep 17 00:00:00 2001 From: Vivek Aggarwal Date: Mon, 22 Jul 2019 19:39:24 -0700 Subject: [PATCH 1/6] Exposed a new API to get number of CPU COres --- cns/api.go | 7 +++++++ cns/restserver/api.go | 1 + cns/restserver/restserver.go | 32 +++++++++++++++++++++++++++++++ cns/restserver/restserver_test.go | 20 +++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/cns/api.go b/cns/api.go index 97a2fe576e..21f0d56a9a 100644 --- a/cns/api.go +++ b/cns/api.go @@ -18,6 +18,7 @@ const ( GetIPAddressUtilizationPath = "/network/ip/utilization" GetUnhealthyIPAddressesPath = "/network/ipaddresses/unhealthy" GetHealthReportPath = "/network/health" + NumberOfCPUCoresPath = "/network/hostcpucores" V1Prefix = "/v0.1" V2Prefix = "/v0.2" ) @@ -139,6 +140,12 @@ type Response struct { Message string } +// getNumberOfCPUCores describes reponse that returns the host local IP Address. +type NumOfCPUCoresResponse struct { + Response Response + NumOfCPUCores int +} + // OptionMap describes generic options that can be passed to CNS. type OptionMap map[string]interface{} diff --git a/cns/restserver/api.go b/cns/restserver/api.go index 06ffc119ee..62c3bc4f85 100644 --- a/cns/restserver/api.go +++ b/cns/restserver/api.go @@ -21,6 +21,7 @@ const ( UnknownContainerID = 18 UnsupportedOrchestratorType = 19 DockerContainerNotSpecified = 20 + UnsupportedVerb = 21 UnexpectedError = 99 ) diff --git a/cns/restserver/restserver.go b/cns/restserver/restserver.go index e22b67ad66..2f23152abc 100644 --- a/cns/restserver/restserver.go +++ b/cns/restserver/restserver.go @@ -8,6 +8,7 @@ import ( "fmt" "net" "net/http" + "runtime" "sync" "time" @@ -157,6 +158,7 @@ func (service *HTTPRestService) Start(config *common.ServiceConfig) error { listener.AddHandler(cns.DetachContainerFromNetwork, service.detachNetworkContainerFromNetwork) listener.AddHandler(cns.CreateHnsNetworkPath, service.createHnsNetwork) listener.AddHandler(cns.DeleteHnsNetworkPath, service.deleteHnsNetwork) + listener.AddHandler(cns.NumberOfCPUCoresPath, service.getNumberOfCPUCores) // handlers for v0.2 listener.AddHandler(cns.V2Prefix+cns.SetEnvironmentPath, service.setEnvironment) @@ -177,6 +179,7 @@ func (service *HTTPRestService) Start(config *common.ServiceConfig) error { listener.AddHandler(cns.V2Prefix+cns.DetachContainerFromNetwork, service.detachNetworkContainerFromNetwork) listener.AddHandler(cns.V2Prefix+cns.CreateHnsNetworkPath, service.createHnsNetwork) listener.AddHandler(cns.V2Prefix+cns.DeleteHnsNetworkPath, service.deleteHnsNetwork) + listener.AddHandler(cns.V2Prefix+cns.NumberOfCPUCoresPath, service.getNumberOfCPUCores) log.Printf("[Azure CNS] Listening.") return nil @@ -1573,3 +1576,32 @@ func (service *HTTPRestService) getNetPluginDetails() *networkcontainers.NetPlug configPath, _ := service.GetOption(acn.OptNetPluginConfigFile).(string) return networkcontainers.NewNetPluginConfiguration(pluginBinPath, configPath) } + +// Retrieves the number of logic processors on a node. It will be primarily +// used to enforce per VM delegated NIC limit by DNC. +func (service *HTTPRestService) getNumberOfCPUCores(w http.ResponseWriter, r *http.Request) { + log.Printf("[Azure CNS] getNumberOfCPUCores") + log.Request(service.Name, "getNumberOfCPUCores", nil) + + var num = 0 + var returnCode = 0 + var errmsg string + + switch r.Method { + case "GET": + num = runtime.NumCPU() + default: + errmsg = "[Azure-CNS] getNumberOfCPUCores API expects a GET." + returnCode = UnsupportedVerb + } + + resp := cns.Response{ReturnCode: returnCode, Message: errmsg} + numOfCPUCoresResp := cns.NumOfCPUCoresResponse{ + Response: resp, + NumOfCPUCores: num, + } + + err := service.Listener.Encode(w, &numOfCPUCoresResp) + + log.Response(service.Name, numOfCPUCoresResp, resp.ReturnCode, ReturnCodeToString(resp.ReturnCode), err) +} diff --git a/cns/restserver/restserver_test.go b/cns/restserver/restserver_test.go index b55c11d4e3..57dd2b4f9d 100644 --- a/cns/restserver/restserver_test.go +++ b/cns/restserver/restserver_test.go @@ -689,3 +689,23 @@ func TestGetInterfaceForNetworkContainer(t *testing.T) { t.Fatal(err) } } + +func TestGetNumOfCPUCores(t *testing.T) { + fmt.Println("Test: getNumberOfCPUCores") + + req, err := http.NewRequest(http.MethodGet, cns.NumberOfCPUCoresPath, nil) + if err != nil { + t.Fatal(err) + } + + w := httptest.NewRecorder() + mux.ServeHTTP(w, req) + var numOfCoresResponse cns.NumOfCPUCoresResponse + + err = decodeResponse(w, &numOfCoresResponse) + if err != nil || numOfCoresResponse.Response.ReturnCode != 0 { + t.Errorf("getNumberOfCPUCores failed with response %+v", numOfCoresResponse) + } else { + fmt.Printf("getNumberOfCPUCores Responded with %+v\n", numOfCoresResponse) + } +} From 9f3c1f35de1b92d06745ae9cc0e881facb7fcc66 Mon Sep 17 00:00:00 2001 From: Vivek Aggarwal Date: Tue, 23 Jul 2019 14:22:47 -0700 Subject: [PATCH 2/6] Addressed feedback --- cns/api.go | 4 ++-- cns/restserver/restserver.go | 12 ++++++------ cns/restserver/restserver_test.go | 7 +++++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/cns/api.go b/cns/api.go index 21f0d56a9a..74b9319426 100644 --- a/cns/api.go +++ b/cns/api.go @@ -18,7 +18,7 @@ const ( GetIPAddressUtilizationPath = "/network/ip/utilization" GetUnhealthyIPAddressesPath = "/network/ipaddresses/unhealthy" GetHealthReportPath = "/network/health" - NumberOfCPUCoresPath = "/network/hostcpucores" + NumberOfCPUCoresPath = "/hostcpucores" V1Prefix = "/v0.1" V2Prefix = "/v0.2" ) @@ -140,7 +140,7 @@ type Response struct { Message string } -// getNumberOfCPUCores describes reponse that returns the host local IP Address. +// getNumberOfCPUCores describes reponse that returns num of cpu cores present on host. type NumOfCPUCoresResponse struct { Response Response NumOfCPUCores int diff --git a/cns/restserver/restserver.go b/cns/restserver/restserver.go index 2f23152abc..917b4f02da 100644 --- a/cns/restserver/restserver.go +++ b/cns/restserver/restserver.go @@ -1580,22 +1580,22 @@ func (service *HTTPRestService) getNetPluginDetails() *networkcontainers.NetPlug // Retrieves the number of logic processors on a node. It will be primarily // used to enforce per VM delegated NIC limit by DNC. func (service *HTTPRestService) getNumberOfCPUCores(w http.ResponseWriter, r *http.Request) { - log.Printf("[Azure CNS] getNumberOfCPUCores") + log.Printf("[Azure-CNS] getNumberOfCPUCores") log.Request(service.Name, "getNumberOfCPUCores", nil) - var num = 0 - var returnCode = 0 - var errmsg string + var num int + var returnCode int + var errMsg string switch r.Method { case "GET": num = runtime.NumCPU() default: - errmsg = "[Azure-CNS] getNumberOfCPUCores API expects a GET." + errMsg = "[Azure-CNS] getNumberOfCPUCores API expects a GET." returnCode = UnsupportedVerb } - resp := cns.Response{ReturnCode: returnCode, Message: errmsg} + resp := cns.Response{ReturnCode: returnCode, Message: errMsg} numOfCPUCoresResp := cns.NumOfCPUCoresResponse{ Response: resp, NumOfCPUCores: num, diff --git a/cns/restserver/restserver_test.go b/cns/restserver/restserver_test.go index 57dd2b4f9d..7471b41b0b 100644 --- a/cns/restserver/restserver_test.go +++ b/cns/restserver/restserver_test.go @@ -693,12 +693,15 @@ func TestGetInterfaceForNetworkContainer(t *testing.T) { func TestGetNumOfCPUCores(t *testing.T) { fmt.Println("Test: getNumberOfCPUCores") - req, err := http.NewRequest(http.MethodGet, cns.NumberOfCPUCoresPath, nil) + var err error + var req *http.Request + req, err = http.NewRequest(http.MethodGet, cns.NumberOfCPUCoresPath, nil) if err != nil { t.Fatal(err) } - w := httptest.NewRecorder() + var w *httptest.ResponseRecorder + w = httptest.NewRecorder() mux.ServeHTTP(w, req) var numOfCoresResponse cns.NumOfCPUCoresResponse From b7b4eb9b998217cce52b5177ea407b37a874879c Mon Sep 17 00:00:00 2001 From: Vivek Aggarwal Date: Tue, 23 Jul 2019 14:52:40 -0700 Subject: [PATCH 3/6] addressed missed feedback --- cns/restserver/restserver.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cns/restserver/restserver.go b/cns/restserver/restserver.go index 917b4f02da..b6a6853733 100644 --- a/cns/restserver/restserver.go +++ b/cns/restserver/restserver.go @@ -1583,9 +1583,11 @@ func (service *HTTPRestService) getNumberOfCPUCores(w http.ResponseWriter, r *ht log.Printf("[Azure-CNS] getNumberOfCPUCores") log.Request(service.Name, "getNumberOfCPUCores", nil) - var num int - var returnCode int - var errMsg string + var ( + num int + returnCode int + errMsg string + ) switch r.Method { case "GET": From f3708f5b177d1d90cfd4b0057264bebce8dc8066 Mon Sep 17 00:00:00 2001 From: Vivek Aggarwal Date: Tue, 23 Jul 2019 14:56:12 -0700 Subject: [PATCH 4/6] adding missed file --- cns/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cns/api.go b/cns/api.go index 74b9319426..571b0409a9 100644 --- a/cns/api.go +++ b/cns/api.go @@ -140,7 +140,7 @@ type Response struct { Message string } -// getNumberOfCPUCores describes reponse that returns num of cpu cores present on host. +// NumOfCPUCoresResponse describes reponse that returns num of cpu cores present on host. type NumOfCPUCoresResponse struct { Response Response NumOfCPUCores int From 6dbe8720674d54948b1e0eb0002f677dda15c522 Mon Sep 17 00:00:00 2001 From: Vivek Aggarwal Date: Tue, 23 Jul 2019 14:56:55 -0700 Subject: [PATCH 5/6] adding missed file --- cns/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cns/api.go b/cns/api.go index 571b0409a9..42ed300fa3 100644 --- a/cns/api.go +++ b/cns/api.go @@ -140,7 +140,7 @@ type Response struct { Message string } -// NumOfCPUCoresResponse describes reponse that returns num of cpu cores present on host. +// NumOfCPUCoresResponse describes num of cpu cores present on host. type NumOfCPUCoresResponse struct { Response Response NumOfCPUCores int From 917905b2f407ab93ce7698b5d7c0d5505351119c Mon Sep 17 00:00:00 2001 From: Vivek Aggarwal Date: Tue, 23 Jul 2019 15:06:23 -0700 Subject: [PATCH 6/6] fixed a comment --- cns/restserver/restserver_test.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cns/restserver/restserver_test.go b/cns/restserver/restserver_test.go index 7471b41b0b..5580681035 100644 --- a/cns/restserver/restserver_test.go +++ b/cns/restserver/restserver_test.go @@ -693,8 +693,11 @@ func TestGetInterfaceForNetworkContainer(t *testing.T) { func TestGetNumOfCPUCores(t *testing.T) { fmt.Println("Test: getNumberOfCPUCores") - var err error - var req *http.Request + var ( + err error + req *http.Request + ) + req, err = http.NewRequest(http.MethodGet, cns.NumberOfCPUCoresPath, nil) if err != nil { t.Fatal(err)