@@ -12,76 +12,96 @@ import (
1212 "github.com/Azure/azure-container-networking/cns/filter"
1313 "github.com/Azure/azure-container-networking/cns/logger"
1414 "github.com/Azure/azure-container-networking/cns/types"
15+ "github.com/pkg/errors"
1516)
1617
1718// used to request an IPConfig from the CNS state
1819func (service * HTTPRestService ) requestIPConfigHandler (w http.ResponseWriter , r * http.Request ) {
19- var (
20- err error
21- ipconfigRequest cns.IPConfigRequest
22- podIpInfo cns.PodIpInfo
23- returnCode types.ResponseCode
24- returnMessage string
25- )
26-
27- err = service .Listener .Decode (w , r , & ipconfigRequest )
20+ var ipconfigRequest cns.IPConfigRequest
21+ err := service .Listener .Decode (w , r , & ipconfigRequest )
2822 operationName := "requestIPConfigHandler"
2923 logger .Request (service .Name + operationName , ipconfigRequest , err )
3024 if err != nil {
3125 return
3226 }
3327
3428 // retrieve ipconfig from nc
35- _ , returnCode , returnMessage = service .validateIPConfigRequest (ipconfigRequest )
36- if returnCode == types .Success {
37- if podIpInfo , err = requestIPConfigHelper (service , ipconfigRequest ); err != nil {
38- returnCode = types .FailedToAllocateIPConfig
39- returnMessage = fmt .Sprintf ("AllocateIPConfig failed: %v, IP config request is %s" , err , ipconfigRequest )
29+ podInfo , returnCode , returnMessage := service .validateIPConfigRequest (ipconfigRequest )
30+ if returnCode != types .Success {
31+ reserveResp := & cns.IPConfigResponse {
32+ Response : cns.Response {
33+ ReturnCode : returnCode ,
34+ Message : returnMessage ,
35+ },
4036 }
37+ err = service .Listener .Encode (w , & reserveResp )
38+ logger .ResponseEx (service .Name + operationName , ipconfigRequest , reserveResp , reserveResp .Response .ReturnCode , err )
39+ return
4140 }
4241
43- resp := cns.Response {
44- ReturnCode : returnCode ,
45- Message : returnMessage ,
42+ // record a pod requesting an IP
43+ service .podsPendingIPAllocation .Push (podInfo .Key ())
44+
45+ podIPInfo , err := requestIPConfigHelper (service , ipconfigRequest )
46+ if err != nil {
47+ reserveResp := & cns.IPConfigResponse {
48+ Response : cns.Response {
49+ ReturnCode : types .FailedToAllocateIPConfig ,
50+ Message : fmt .Sprintf ("AllocateIPConfig failed: %v, IP config request is %s" , err , ipconfigRequest ),
51+ },
52+ PodIpInfo : podIPInfo ,
53+ }
54+ err = service .Listener .Encode (w , & reserveResp )
55+ logger .ResponseEx (service .Name + operationName , ipconfigRequest , reserveResp , reserveResp .Response .ReturnCode , err )
56+ return
4657 }
4758
59+ // record a pod allocated an IP
60+ defer func () {
61+ // observe allocation wait time
62+ if since := service .podsPendingIPAllocation .Pop (podInfo .Key ()); since > 0 {
63+ ipAllocationLatency .Observe (float64 (since ))
64+ }
65+ }()
4866 reserveResp := & cns.IPConfigResponse {
49- Response : resp ,
67+ Response : cns.Response {
68+ ReturnCode : types .Success ,
69+ },
70+ PodIpInfo : podIPInfo ,
5071 }
51- reserveResp .PodIpInfo = podIpInfo
5272
5373 err = service .Listener .Encode (w , & reserveResp )
54- logger .ResponseEx (service .Name + operationName , ipconfigRequest , reserveResp , resp .ReturnCode , err )
74+ logger .ResponseEx (service .Name + operationName , ipconfigRequest , reserveResp , reserveResp . Response .ReturnCode , err )
5575}
5676
5777func (service * HTTPRestService ) releaseIPConfigHandler (w http.ResponseWriter , r * http.Request ) {
58- req := cns.IPConfigRequest {}
59- resp := cns.Response {}
60- var err error
61-
62- defer func () {
63- err = service .Listener .Encode (w , & resp )
64- logger .ResponseEx (service .Name , req , resp , resp .ReturnCode , err )
65- }()
66-
67- err = service .Listener .Decode (w , r , & req )
78+ var req cns.IPConfigRequest
79+ err := service .Listener .Decode (w , r , & req )
6880 logger .Request (service .Name + "releaseIPConfigHandler" , req , err )
6981 if err != nil {
70- resp .ReturnCode = types .UnexpectedError
71- resp .Message = err .Error ()
82+ resp := cns.Response {
83+ ReturnCode : types .UnexpectedError ,
84+ Message : err .Error (),
85+ }
7286 logger .Errorf ("releaseIPConfigHandler decode failed becase %v, release IP config info %s" , resp .Message , req )
87+ err = service .Listener .Encode (w , & resp )
88+ logger .ResponseEx (service .Name , req , resp , resp .ReturnCode , err )
7389 return
7490 }
7591
76- var podInfo cns.PodInfo
77- podInfo , resp .ReturnCode , resp .Message = service .validateIPConfigRequest (req )
92+ podInfo , returnCode , message := service .validateIPConfigRequest (req )
7893
7994 if err = service .releaseIPConfig (podInfo ); err != nil {
80- resp .ReturnCode = types .UnexpectedError
81- resp .Message = err .Error ()
82- logger .Errorf ("releaseIPConfigHandler releaseIPConfig failed because %v, release IP config info %s" , resp .Message , req )
83- return
95+ returnCode = types .UnexpectedError
96+ message = err .Error ()
97+ logger .Errorf ("releaseIPConfigHandler releaseIPConfig failed because %v, release IP config info %s" , message , req )
8498 }
99+ resp := cns.Response {
100+ ReturnCode : returnCode ,
101+ Message : message ,
102+ }
103+ err = service .Listener .Encode (w , & resp )
104+ logger .ResponseEx (service .Name , req , resp , resp .ReturnCode , err )
85105}
86106
87107// MarkIPAsPendingRelease will set the IPs which are in PendingProgramming or Available to PendingRelease state
@@ -418,20 +438,15 @@ func (service *HTTPRestService) AllocateAnyAvailableIPConfig(podInfo cns.PodInfo
418438
419439// If IPConfig is already allocated for pod, it returns that else it returns one of the available ipconfigs.
420440func requestIPConfigHelper (service * HTTPRestService , req cns.IPConfigRequest ) (cns.PodIpInfo , error ) {
421- var (
422- podIpInfo cns.PodIpInfo
423- isExist bool
424- )
425-
426441 // check if ipconfig already allocated for this pod and return if exists or error
427442 // if error, ipstate is nil, if exists, ipstate is not nil and error is nil
428443 podInfo , err := cns .NewPodInfoFromIPConfigRequest (req )
429444 if err != nil {
430- return podIpInfo , err
445+ return cns. PodIpInfo {}, errors . Wrapf ( err , "failed to parse IPConfigRequest %v" , req )
431446 }
432447
433- if podIpInfo , isExist , err = service .GetExistingIPConfig (podInfo ); err != nil || isExist {
434- return podIpInfo , err
448+ if podIPInfo , isExist , err : = service .GetExistingIPConfig (podInfo ); err != nil || isExist {
449+ return podIPInfo , err
435450 }
436451
437452 // return desired IPConfig
0 commit comments