Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

APIv2 compatibility network connect|disconnect #8078

Merged
merged 1 commit into from
Oct 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions libpod/events/filters.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ func generateEventUntilOption(timeUntil time.Time) func(e *Event) bool {
}

func parseFilter(filter string) (string, string, error) {
filterSplit := strings.Split(filter, "=")
if len(filterSplit) != 2 {
filterSplit := strings.SplitN(filter, "=", 2)
if len(filterSplit) == 1 {
return "", "", errors.Errorf("%s is an invalid filter", filter)
}
return filterSplit[0], filterSplit[1], nil
Expand Down
23 changes: 6 additions & 17 deletions pkg/api/handlers/compat/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -410,25 +410,14 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON,
return nil, err
}

networkSettingsDefault := types.DefaultNetworkSettings{
EndpointID: "",
Gateway: "",
GlobalIPv6Address: "",
GlobalIPv6PrefixLen: 0,
IPAddress: "",
IPPrefixLen: 0,
IPv6Gateway: "",
MacAddress: l.Config().StaticMAC.String(),
}

networkSettingsBase := types.NetworkSettingsBase{
Ports: ports,
n, err := json.Marshal(inspect.NetworkSettings)
if err != nil {
return nil, err
}

networkSettings := types.NetworkSettings{
NetworkSettingsBase: networkSettingsBase,
DefaultNetworkSettings: networkSettingsDefault,
Networks: nil,
networkSettings := types.NetworkSettings{}
if err := json.Unmarshal(n, &networkSettings); err != nil {
return nil, err
}

c := types.ContainerJSON{
Expand Down
79 changes: 79 additions & 0 deletions pkg/api/handlers/compat/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
dockerNetwork "github.com/docker/docker/api/types/network"
"github.com/gorilla/schema"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)

func InspectNetwork(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -312,3 +313,81 @@ func RemoveNetwork(w http.ResponseWriter, r *http.Request) {
}
utils.WriteResponse(w, http.StatusNoContent, "")
}

// Connect adds a container to a network
// TODO: For now this func is a no-op that checks the container name, network name, and
// responds with a 200. This allows the call to remain intact. We need to decide how
// we make this work with CNI networking and setup/teardown.
func Connect(w http.ResponseWriter, r *http.Request) {
runtime := r.Context().Value("runtime").(*libpod.Runtime)

var netConnect types.NetworkConnect
if err := json.NewDecoder(r.Body).Decode(&netConnect); err != nil {
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "Decode()"))
return
}
config, err := runtime.GetConfig()
if err != nil {
utils.InternalServerError(w, err)
return
}
name := utils.GetName(r)
exists, err := network.Exists(config, name)
if err != nil {
utils.InternalServerError(w, err)
baude marked this conversation as resolved.
Show resolved Hide resolved
return
}
if !exists {
utils.Error(w, "network not found", http.StatusNotFound, define.ErrNoSuchNetwork)
return
}
if _, err = runtime.LookupContainer(netConnect.Container); err != nil {
if errors.Cause(err) == define.ErrNoSuchCtr {
utils.ContainerNotFound(w, netConnect.Container, err)
return
}
utils.Error(w, "unable to lookup container", http.StatusInternalServerError, err)
return
}
logrus.Warnf("network connect endpoint is not fully implemented - tried to connect container %s to network %s", netConnect.Container, name)
utils.WriteResponse(w, http.StatusOK, "OK")
}

// Disconnect removes a container from a network
// TODO: For now this func is a no-op that checks the container name, network name, and
// responds with a 200. This allows the call to remain intact. We need to decide how
// we make this work with CNI networking and setup/teardown.
func Disconnect(w http.ResponseWriter, r *http.Request) {
runtime := r.Context().Value("runtime").(*libpod.Runtime)

var netDisconnect types.NetworkDisconnect
if err := json.NewDecoder(r.Body).Decode(&netDisconnect); err != nil {
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "Decode()"))
return
}
config, err := runtime.GetConfig()
if err != nil {
utils.InternalServerError(w, err)
return
}
name := utils.GetName(r)
exists, err := network.Exists(config, name)
if err != nil {
utils.InternalServerError(w, err)
return
}
if !exists {
utils.Error(w, "network not found", http.StatusNotFound, define.ErrNoSuchNetwork)
return
}
if _, err = runtime.LookupContainer(netDisconnect.Container); err != nil {
if errors.Cause(err) == define.ErrNoSuchCtr {
utils.ContainerNotFound(w, netDisconnect.Container, err)
return
}
utils.Error(w, "unable to lookup container", http.StatusInternalServerError, err)
return
}
logrus.Warnf("network disconnect endpoint is not fully implemented - tried to connect container %s to network %s", netDisconnect.Container, name)
utils.WriteResponse(w, http.StatusOK, "OK")
}
14 changes: 14 additions & 0 deletions pkg/api/handlers/compat/swagger.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,17 @@ type swagCompatNetworkCreateResponse struct {
// in:body
Body struct{ types.NetworkCreate }
}

// Network disconnect
// swagger:model NetworkConnectRequest
type swagCompatNetworkConnectRequest struct {
// in:body
Body struct{ types.NetworkConnect }
}

// Network disconnect
// swagger:model NetworkDisconnectRequest
type swagCompatNetworkDisconnectRequest struct {
// in:body
Body struct{ types.NetworkDisconnect }
}
57 changes: 57 additions & 0 deletions pkg/api/server/register_networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,63 @@ func (s *APIServer) registerNetworkHandlers(r *mux.Router) error {
// $ref: "#/responses/InternalError"
r.HandleFunc(VersionedPath("/networks/create"), s.APIHandler(compat.CreateNetwork)).Methods(http.MethodPost)
r.HandleFunc("/networks/create", s.APIHandler(compat.CreateNetwork)).Methods(http.MethodPost)
// swagger:operation POST /networks/{name}/connect compat compatConnectNetwork
// ---
// tags:
// - networks (compat)
// summary: Connect container to network
// description: Connect a container to a network. This endpoint is current a no-op
// produces:
// - application/json
// parameters:
// - in: path
// name: name
// type: string
// required: true
// description: the name of the network
// - in: body
// name: create
// description: attributes for connecting a container to a network
// schema:
// $ref: "#/definitions/NetworkConnectRequest"
// responses:
// 200:
// description: OK
// 400:
// $ref: "#/responses/BadParamError"
// 500:
// $ref: "#/responses/InternalError"
r.HandleFunc(VersionedPath("/networks/{name}/connect"), s.APIHandler(compat.Connect)).Methods(http.MethodPost)
r.HandleFunc("/networks/{name}/connect", s.APIHandler(compat.Connect)).Methods(http.MethodPost)
// swagger:operation POST /networks/{name}/disconnect compat compatDisconnectNetwork
// ---
// tags:
// - networks (compat)
// summary: Disconnect container from network
// description: Disconnect a container from a network. This endpoint is current a no-op
// produces:
// - application/json
// parameters:
// - in: path
// name: name
// type: string
// required: true
// description: the name of the network
// - in: body
// name: create
// description: attributes for disconnecting a container from a network
// schema:
// $ref: "#/definitions/NetworkDisconnectRequest"
// responses:
// 200:
// description: OK
// 400:
// $ref: "#/responses/BadParamError"
// 500:
// $ref: "#/responses/InternalError"
r.HandleFunc(VersionedPath("/networks/{name}/disconnect"), s.APIHandler(compat.Disconnect)).Methods(http.MethodPost)
r.HandleFunc("/networks/{name}/disconnect", s.APIHandler(compat.Disconnect)).Methods(http.MethodPost)

// swagger:operation DELETE /libpod/networks/{name} libpod libpodRemoveNetwork
// ---
// tags:
Expand Down