func()

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)
}