Skip to content

Commit 2c7dc77

Browse files
authored
Merge pull request #379 from ninzavivek/nic_limit
Exposed a new API to get number of CPU Cores on a Node
2 parents 22f945d + 917905b commit 2c7dc77

File tree

4 files changed

+68
-0
lines changed

4 files changed

+68
-0
lines changed

cns/api.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
GetIPAddressUtilizationPath = "/network/ip/utilization"
1919
GetUnhealthyIPAddressesPath = "/network/ipaddresses/unhealthy"
2020
GetHealthReportPath = "/network/health"
21+
NumberOfCPUCoresPath = "/hostcpucores"
2122
V1Prefix = "/v0.1"
2223
V2Prefix = "/v0.2"
2324
)
@@ -139,6 +140,12 @@ type Response struct {
139140
Message string
140141
}
141142

143+
// NumOfCPUCoresResponse describes num of cpu cores present on host.
144+
type NumOfCPUCoresResponse struct {
145+
Response Response
146+
NumOfCPUCores int
147+
}
148+
142149
// OptionMap describes generic options that can be passed to CNS.
143150
type OptionMap map[string]interface{}
144151

cns/restserver/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const (
2121
UnknownContainerID = 18
2222
UnsupportedOrchestratorType = 19
2323
DockerContainerNotSpecified = 20
24+
UnsupportedVerb = 21
2425
UnexpectedError = 99
2526
)
2627

cns/restserver/restserver.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"net"
1010
"net/http"
11+
"runtime"
1112
"sync"
1213
"time"
1314

@@ -157,6 +158,7 @@ func (service *HTTPRestService) Start(config *common.ServiceConfig) error {
157158
listener.AddHandler(cns.DetachContainerFromNetwork, service.detachNetworkContainerFromNetwork)
158159
listener.AddHandler(cns.CreateHnsNetworkPath, service.createHnsNetwork)
159160
listener.AddHandler(cns.DeleteHnsNetworkPath, service.deleteHnsNetwork)
161+
listener.AddHandler(cns.NumberOfCPUCoresPath, service.getNumberOfCPUCores)
160162

161163
// handlers for v0.2
162164
listener.AddHandler(cns.V2Prefix+cns.SetEnvironmentPath, service.setEnvironment)
@@ -177,6 +179,7 @@ func (service *HTTPRestService) Start(config *common.ServiceConfig) error {
177179
listener.AddHandler(cns.V2Prefix+cns.DetachContainerFromNetwork, service.detachNetworkContainerFromNetwork)
178180
listener.AddHandler(cns.V2Prefix+cns.CreateHnsNetworkPath, service.createHnsNetwork)
179181
listener.AddHandler(cns.V2Prefix+cns.DeleteHnsNetworkPath, service.deleteHnsNetwork)
182+
listener.AddHandler(cns.V2Prefix+cns.NumberOfCPUCoresPath, service.getNumberOfCPUCores)
180183

181184
log.Printf("[Azure CNS] Listening.")
182185
return nil
@@ -1573,3 +1576,34 @@ func (service *HTTPRestService) getNetPluginDetails() *networkcontainers.NetPlug
15731576
configPath, _ := service.GetOption(acn.OptNetPluginConfigFile).(string)
15741577
return networkcontainers.NewNetPluginConfiguration(pluginBinPath, configPath)
15751578
}
1579+
1580+
// Retrieves the number of logic processors on a node. It will be primarily
1581+
// used to enforce per VM delegated NIC limit by DNC.
1582+
func (service *HTTPRestService) getNumberOfCPUCores(w http.ResponseWriter, r *http.Request) {
1583+
log.Printf("[Azure-CNS] getNumberOfCPUCores")
1584+
log.Request(service.Name, "getNumberOfCPUCores", nil)
1585+
1586+
var (
1587+
num int
1588+
returnCode int
1589+
errMsg string
1590+
)
1591+
1592+
switch r.Method {
1593+
case "GET":
1594+
num = runtime.NumCPU()
1595+
default:
1596+
errMsg = "[Azure-CNS] getNumberOfCPUCores API expects a GET."
1597+
returnCode = UnsupportedVerb
1598+
}
1599+
1600+
resp := cns.Response{ReturnCode: returnCode, Message: errMsg}
1601+
numOfCPUCoresResp := cns.NumOfCPUCoresResponse{
1602+
Response: resp,
1603+
NumOfCPUCores: num,
1604+
}
1605+
1606+
err := service.Listener.Encode(w, &numOfCPUCoresResp)
1607+
1608+
log.Response(service.Name, numOfCPUCoresResp, resp.ReturnCode, ReturnCodeToString(resp.ReturnCode), err)
1609+
}

cns/restserver/restserver_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,3 +689,29 @@ func TestGetInterfaceForNetworkContainer(t *testing.T) {
689689
t.Fatal(err)
690690
}
691691
}
692+
693+
func TestGetNumOfCPUCores(t *testing.T) {
694+
fmt.Println("Test: getNumberOfCPUCores")
695+
696+
var (
697+
err error
698+
req *http.Request
699+
)
700+
701+
req, err = http.NewRequest(http.MethodGet, cns.NumberOfCPUCoresPath, nil)
702+
if err != nil {
703+
t.Fatal(err)
704+
}
705+
706+
var w *httptest.ResponseRecorder
707+
w = httptest.NewRecorder()
708+
mux.ServeHTTP(w, req)
709+
var numOfCoresResponse cns.NumOfCPUCoresResponse
710+
711+
err = decodeResponse(w, &numOfCoresResponse)
712+
if err != nil || numOfCoresResponse.Response.ReturnCode != 0 {
713+
t.Errorf("getNumberOfCPUCores failed with response %+v", numOfCoresResponse)
714+
} else {
715+
fmt.Printf("getNumberOfCPUCores Responded with %+v\n", numOfCoresResponse)
716+
}
717+
}

0 commit comments

Comments
 (0)