@@ -154,6 +154,8 @@ func (service *HTTPRestService) Start(config *common.ServiceConfig) error {
154154 listener .AddHandler (cns .GetNetworkContainerByOrchestratorContext , service .getNetworkContainerByOrchestratorContext )
155155 listener .AddHandler (cns .AttachContainerToNetwork , service .attachNetworkContainerToNetwork )
156156 listener .AddHandler (cns .DetachContainerFromNetwork , service .detachNetworkContainerFromNetwork )
157+ listener .AddHandler (cns .CreateHnsNetworkPath , service .createHnsNetwork )
158+ listener .AddHandler (cns .DeleteHnsNetworkPath , service .deleteHnsNetwork )
157159
158160 // handlers for v0.2
159161 listener .AddHandler (cns .V2Prefix + cns .SetEnvironmentPath , service .setEnvironment )
@@ -172,6 +174,8 @@ func (service *HTTPRestService) Start(config *common.ServiceConfig) error {
172174 listener .AddHandler (cns .V2Prefix + cns .GetNetworkContainerByOrchestratorContext , service .getNetworkContainerByOrchestratorContext )
173175 listener .AddHandler (cns .V2Prefix + cns .AttachContainerToNetwork , service .attachNetworkContainerToNetwork )
174176 listener .AddHandler (cns .V2Prefix + cns .DetachContainerFromNetwork , service .detachNetworkContainerFromNetwork )
177+ listener .AddHandler (cns .V2Prefix + cns .CreateHnsNetworkPath , service .createHnsNetwork )
178+ listener .AddHandler (cns .V2Prefix + cns .DeleteHnsNetworkPath , service .deleteHnsNetwork )
175179
176180 log .Printf ("[Azure CNS] Listening." )
177181 return nil
@@ -248,7 +252,7 @@ func (service *HTTPRestService) createNetwork(w http.ResponseWriter, r *http.Req
248252 case "Underlay" :
249253 switch service .state .Location {
250254 case "Azure" :
251- log .Printf ("[Azure CNS] Goign to create network with name %v." , req .NetworkName )
255+ log .Printf ("[Azure CNS] Creating network with name %v." , req .NetworkName )
252256
253257 err = rt .GetRoutingTable ()
254258 if err != nil {
@@ -344,7 +348,7 @@ func (service *HTTPRestService) deleteNetwork(w http.ResponseWriter, r *http.Req
344348
345349 // Network does exist
346350 if err == nil {
347- log .Printf ("[Azure CNS] Goign to delete network with name %v." , req .NetworkName )
351+ log .Printf ("[Azure CNS] Deleting network with name %v." , req .NetworkName )
348352 err := dc .DeleteNetwork (req .NetworkName )
349353 if err != nil {
350354 returnMessage = fmt .Sprintf ("[Azure CNS] Error. DeleteNetwork failed %v." , err .Error ())
@@ -379,6 +383,115 @@ func (service *HTTPRestService) deleteNetwork(w http.ResponseWriter, r *http.Req
379383 log .Response (service .Name , resp , resp .ReturnCode , ReturnCodeToString (resp .ReturnCode ), err )
380384}
381385
386+ // Handles CreateHnsNetwork requests.
387+ func (service * HTTPRestService ) createHnsNetwork (w http.ResponseWriter , r * http.Request ) {
388+ log .Printf ("[Azure CNS] createHnsNetwork" )
389+
390+ var err error
391+ returnCode := 0
392+ returnMessage := ""
393+
394+ var req cns.CreateHnsNetworkRequest
395+ err = service .Listener .Decode (w , r , & req )
396+ log .Request (service .Name , & req , err )
397+
398+ if err != nil {
399+ returnMessage = fmt .Sprintf ("[Azure CNS] Error. Unable to decode input request." )
400+ returnCode = InvalidParameter
401+ } else {
402+ switch r .Method {
403+ case "POST" :
404+ if err := platform .CreateHnsNetwork (req ); err == nil {
405+ // Save the newly created HnsNetwork name. CNS deleteHnsNetwork API
406+ // will only allow deleting these networks.
407+ networkInfo := & networkInfo {
408+ NetworkName : req .NetworkName ,
409+ }
410+ service .lock .Lock ()
411+ service .state .Networks [req .NetworkName ] = networkInfo
412+ service .lock .Unlock ()
413+ returnMessage = fmt .Sprintf ("[Azure CNS] Successfully created HNS network: %s" , req .NetworkName )
414+ } else {
415+ returnMessage = fmt .Sprintf ("[Azure CNS] CreateHnsNetwork failed with error %v" , err .Error ())
416+ returnCode = UnexpectedError
417+ }
418+ default :
419+ returnMessage = "[Azure CNS] Error. CreateHnsNetwork did not receive a POST."
420+ returnCode = InvalidParameter
421+ }
422+ }
423+
424+ resp := & cns.Response {
425+ ReturnCode : returnCode ,
426+ Message : returnMessage ,
427+ }
428+
429+ err = service .Listener .Encode (w , & resp )
430+
431+ if returnCode == 0 {
432+ service .lock .Lock ()
433+ service .saveState ()
434+ service .lock .Unlock ()
435+ }
436+
437+ log .Response (service .Name , resp , resp .ReturnCode , ReturnCodeToString (resp .ReturnCode ), err )
438+ }
439+
440+ // Handles deleteHnsNetwork requests.
441+ func (service * HTTPRestService ) deleteHnsNetwork (w http.ResponseWriter , r * http.Request ) {
442+ log .Printf ("[Azure CNS] deleteHnsNetwork" )
443+
444+ var err error
445+ var req cns.DeleteHnsNetworkRequest
446+ returnCode := 0
447+ returnMessage := ""
448+
449+ err = service .Listener .Decode (w , r , & req )
450+ log .Request (service .Name , & req , err )
451+
452+ if err != nil {
453+ returnMessage = fmt .Sprintf ("[Azure CNS] Error. Unable to decode input request." )
454+ returnCode = InvalidParameter
455+ } else {
456+ switch r .Method {
457+ case "POST" :
458+ service .lock .Lock ()
459+ networkInfo , ok := service .state .Networks [req .NetworkName ]
460+ if ok && networkInfo .NetworkName == req .NetworkName {
461+ if err = platform .DeleteHnsNetwork (req .NetworkName ); err == nil {
462+ returnMessage = fmt .Sprintf ("[Azure CNS] Successfully deleted HNS network: %s" , req .NetworkName )
463+ } else {
464+ returnMessage = fmt .Sprintf ("[Azure CNS] DeleteHnsNetwork failed with error %v" , err .Error ())
465+ returnCode = UnexpectedError
466+ }
467+ } else {
468+ returnMessage = fmt .Sprintf ("[Azure CNS] Network %s not found" , req .NetworkName )
469+ returnCode = InvalidParameter
470+ }
471+ service .lock .Unlock ()
472+ default :
473+ returnMessage = "[Azure CNS] Error. DeleteHnsNetwork did not receive a POST."
474+ returnCode = InvalidParameter
475+ }
476+ }
477+
478+ resp := & cns.Response {
479+ ReturnCode : returnCode ,
480+ Message : returnMessage ,
481+ }
482+
483+ err = service .Listener .Encode (w , & resp )
484+
485+ if returnCode == 0 {
486+ service .lock .Lock ()
487+ delete (service .state .Networks , req .NetworkName )
488+ service .saveState ()
489+ service .lock .Unlock ()
490+ }
491+
492+ log .Response (service .Name , resp , resp .ReturnCode , ReturnCodeToString (resp .ReturnCode ), err )
493+ }
494+
382495// Handles ip reservation requests.
383496func (service * HTTPRestService ) reserveIPAddress (w http.ResponseWriter , r * http.Request ) {
384497 log .Printf ("[Azure CNS] reserveIPAddress" )
0 commit comments