in cns/restserver/api.go [909:1003]
func (service *HTTPRestService) publishNetworkContainer(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "PublishNetworkContainer expects a POST", http.StatusBadRequest)
return
}
var req cns.PublishNetworkContainerRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, fmt.Sprintf("could not decode request body: %v", err), http.StatusBadRequest)
return
}
logger.Request(service.Name, req, nil)
ncParams, err := extractNCParamsFromURL(req.CreateNetworkContainerURL)
if err != nil {
resp := cns.PublishNetworkContainerResponse{
Response: cns.Response{
ReturnCode: http.StatusBadRequest,
Message: fmt.Sprintf("unexpected create nc url format. url %s: %v ", req.CreateNetworkContainerURL, err),
},
}
respondJSON(w, http.StatusBadRequest, resp)
logger.Response(service.Name, resp, resp.Response.ReturnCode, err)
return
}
ctx := r.Context()
joinResp, err := service.wsproxy.JoinNetwork(ctx, req.NetworkID) //nolint:govet // ok to shadow
if err != nil {
resp := cns.PublishNetworkContainerResponse{
Response: cns.Response{
ReturnCode: types.NetworkJoinFailed,
Message: fmt.Sprintf("failed to join network %s: %v", req.NetworkID, err),
},
PublishErrorStr: err.Error(),
}
respondJSON(w, http.StatusOK, resp) // legacy behavior
logger.Response(service.Name, resp, resp.Response.ReturnCode, err)
return
}
joinBytes, _ := io.ReadAll(joinResp.Body)
_ = joinResp.Body.Close()
if joinResp.StatusCode != http.StatusOK {
resp := cns.PublishNetworkContainerResponse{
Response: cns.Response{
ReturnCode: types.NetworkJoinFailed,
Message: fmt.Sprintf("failed to join network %s. did not get 200 from wireserver", req.NetworkID),
},
PublishStatusCode: joinResp.StatusCode,
PublishResponseBody: joinBytes,
}
respondJSON(w, http.StatusOK, resp) // legacy behavior
logger.Response(service.Name, resp, resp.Response.ReturnCode, nil)
return
}
service.setNetworkStateJoined(req.NetworkID)
logger.Printf("[Azure-CNS] joined vnet %s during nc %s publish. wireserver response: %v", req.NetworkID, req.NetworkContainerID, string(joinBytes))
publishResp, err := service.wsproxy.PublishNC(ctx, ncParams, req.CreateNetworkContainerRequestBody)
if err != nil {
resp := cns.PublishNetworkContainerResponse{
Response: cns.Response{
ReturnCode: types.NetworkContainerPublishFailed,
Message: fmt.Sprintf("failed to publish nc %s: %v", req.NetworkContainerID, err),
},
PublishErrorStr: err.Error(),
}
respondJSON(w, http.StatusOK, resp) // legacy behavior
logger.Response(service.Name, resp, resp.Response.ReturnCode, err)
return
}
publishBytes, _ := io.ReadAll(publishResp.Body)
_ = publishResp.Body.Close()
resp := cns.PublishNetworkContainerResponse{
PublishStatusCode: publishResp.StatusCode,
PublishResponseBody: publishBytes,
}
if publishResp.StatusCode != http.StatusOK {
resp.Response = cns.Response{
ReturnCode: types.NetworkContainerPublishFailed,
Message: fmt.Sprintf("failed to publish nc %s. did not get 200 from wireserver", req.NetworkContainerID),
}
}
respondJSON(w, http.StatusOK, resp)
logger.Response(service.Name, resp, resp.Response.ReturnCode, nil)
}