in cns/restserver/api.go [75:178]
func (service *HTTPRestService) createNetwork(w http.ResponseWriter, r *http.Request) {
logger.Printf("[Azure CNS] createNetwork")
var err error
var returnCode types.ResponseCode
returnMessage := ""
if service.state.Initialized {
var req cns.CreateNetworkRequest
err = common.Decode(w, r, &req)
logger.Request(service.Name, &req, err)
if err != nil {
//nolint:goconst // ignore const string
returnMessage = "[Azure CNS] Error. Unable to decode input request."
returnCode = types.InvalidParameter
} else {
switch r.Method {
case http.MethodPost:
dc := service.dockerClient
rt := service.routingTable
err = dc.NetworkExists(req.NetworkName)
// Network does not exist.
if err != nil {
switch service.state.NetworkType {
case "Underlay":
switch service.state.Location {
case "Azure":
logger.Printf("[Azure CNS] Creating network with name %v.", req.NetworkName)
err = rt.GetRoutingTable()
if err != nil {
// We should not fail the call to create network for this.
// This is because restoring routes is a fallback mechanism in case
// network driver is not behaving as expected.
// The responsibility to restore routes is with network driver.
logger.Printf("[Azure CNS] Unable to get routing table from node, %+v.", err.Error())
}
var nicInfo *wireserver.InterfaceInfo
nicInfo, err = service.getPrimaryHostInterface(context.TODO())
if err != nil {
returnMessage = fmt.Sprintf("[Azure CNS] Error. GetPrimaryInterfaceInfoFromHost failed %v.", err.Error())
returnCode = types.UnexpectedError
break
}
err = dc.CreateNetwork(req.NetworkName, nicInfo, req.Options)
if err != nil {
returnMessage = fmt.Sprintf("[Azure CNS] Error. CreateNetwork failed %v.", err.Error())
returnCode = types.UnexpectedError
}
err = rt.RestoreRoutingTable()
if err != nil {
logger.Printf("[Azure CNS] Unable to restore routing table on node, %+v.", err.Error())
}
networkInfo := &networkInfo{
NetworkName: req.NetworkName,
NicInfo: nicInfo,
Options: req.Options,
}
service.state.Networks[req.NetworkName] = networkInfo
case "StandAlone":
returnMessage = fmt.Sprintf("[Azure CNS] Error. Underlay network is not supported in StandAlone environment. %v.", err.Error())
returnCode = types.UnsupportedEnvironment
}
case "Overlay":
returnMessage = fmt.Sprintf("[Azure CNS] Error. Overlay support not yet available. %v.", err.Error())
returnCode = types.UnsupportedEnvironment
}
} else {
returnMessage = fmt.Sprintf("[Azure CNS] Received a request to create an already existing network %v", req.NetworkName)
logger.Printf(returnMessage)
}
default:
returnMessage = "[Azure CNS] Error. CreateNetwork did not receive a POST."
returnCode = types.InvalidParameter
}
}
} else {
returnMessage = "[Azure CNS] Error. CNS is not yet initialized with environment."
returnCode = types.UnsupportedEnvironment
}
resp := &cns.Response{
ReturnCode: returnCode,
Message: returnMessage,
}
err = common.Encode(w, &resp)
if returnCode == 0 {
service.saveState()
}
logger.Response(service.Name, resp, resp.ReturnCode, err)
}