From 02a8c6b826308ea52f21c8eed5476c56170c66fa Mon Sep 17 00:00:00 2001 From: baude Date: Fri, 8 Nov 2019 07:53:51 -0600 Subject: [PATCH] pod create and container create first pass at pod and container create. the container create does not quite work yet but it is very close. pod create needs a partial rewrite. also broken off the DELETE (rm/rmi) to specific handler funcs. Signed-off-by: baude --- pkg/serviceapi/handler_containers.go | 1 + pkg/serviceapi/handler_containers_create.go | 121 ++++++++++++++++++++ pkg/serviceapi/handler_pods.go | 2 + pkg/serviceapi/types.go | 9 ++ 4 files changed, 133 insertions(+) create mode 100644 pkg/serviceapi/handler_containers_create.go diff --git a/pkg/serviceapi/handler_containers.go b/pkg/serviceapi/handler_containers.go index 1936c577e4..d37514686e 100644 --- a/pkg/serviceapi/handler_containers.go +++ b/pkg/serviceapi/handler_containers.go @@ -15,6 +15,7 @@ import ( ) func registerContainersHandlers(r *mux.Router) error { + r.Handle(unversionedPath("/containers/create"), serviceHandler(createContainer)) r.Handle(unversionedPath("/containers/{name:..*}"), serviceHandler(removeContainer)).Methods("DELETE") r.Handle(unversionedPath("/containers/{name:..*}/json"), serviceHandler(container)) r.Handle(unversionedPath("/containers/{name:..*}/kill"), serviceHandler(killContainer)) diff --git a/pkg/serviceapi/handler_containers_create.go b/pkg/serviceapi/handler_containers_create.go new file mode 100644 index 0000000000..b556d7a9f5 --- /dev/null +++ b/pkg/serviceapi/handler_containers_create.go @@ -0,0 +1,121 @@ +package serviceapi + +import ( + "context" + "encoding/json" + "net/http" + + "github.com/containers/libpod/cmd/podman/shared" + "github.com/containers/libpod/libpod" + createconfig "github.com/containers/libpod/pkg/spec" +) + +func createContainer(w http.ResponseWriter, r *http.Request, runtime *libpod.Runtime) { + ctx := context.Background() + input := CreateContainer{} + if err := json.NewDecoder(r.Body).Decode(&input); err != nil { + Error(w, "Something went wrong.", http.StatusInternalServerError, err) + return + } + cc, err := makeCreateConfig(input) + if err != nil { + Error(w, "Something went wrong.", http.StatusInternalServerError, err) + return + } + + var pod *libpod.Pod + _, err = shared.CreateContainerFromCreateConfig(runtime, &cc, ctx, pod) + if err != nil { + Error(w, "Something went wrong.", http.StatusInternalServerError, err) + return + } + return +} + +func makeCreateConfig(input CreateContainer) (createconfig.CreateConfig, error) { + m := createconfig.CreateConfig{ + Annotations: nil, + Args: nil, + CapAdd: input.HostConfig.CapAdd, + CapDrop: input.HostConfig.CapDrop, + CidFile: "", + ConmonPidFile: "", //podman + Cgroupns: "", //podman + Cgroups: "", //podman + CgroupParent: input.HostConfig.CgroupParent, + Command: input.Cmd, + UserCommand: nil, //podman + Detach: false, // + //Devices: input.HostConfig.Devices, + DNSOpt: input.HostConfig.DNSOptions, + DNSSearch: input.HostConfig.DNSSearch, + DNSServers: input.HostConfig.DNS, + Entrypoint: input.Entrypoint, + //Env: input.Env, + ExposedPorts: input.ExposedPorts, + GroupAdd: input.HostConfig.GroupAdd, + HealthCheck: nil, // + NoHosts: false, //podman + HostAdd: input.HostConfig.ExtraHosts, + Hostname: input.Hostname, + HTTPProxy: false, //podman + //Init: input.HostConfig.Init, + InitPath: "", // tbd + Image: input.Image, + ImageID: "", // added later + BuiltinImgVolumes: nil, //podman + IDMappings: nil, //podman + ImageVolumeType: "", //podman + Interactive: false, + //IpcMode: input.HostConfig.IpcMode, + IP6Address: "", + IPAddress: "", + Labels: input.Labels, + LinkLocalIP: nil, //docker-only + LogDriver: input.HostConfig.LogConfig.Type, // is this correct + //LogDriverOpt: input.HostConfig.LogConfig.Config, + MacAddress: input.MacAddress, + Name: input.Name, + //NetMode: input.HostConfig.NetworkMode, + Network: input.HostConfig.NetworkMode.NetworkName(), + NetworkAlias: nil, // dockeronly ? + //PidMode: input.HostConfig.PidMode, + Pod: "", //podman + PodmanPath: "", //podman + CgroupMode: "", //podman + PortBindings: input.HostConfig.PortBindings, + Privileged: input.HostConfig.Privileged, + Publish: nil, //podman + PublishAll: input.HostConfig.PublishAllPorts, + Quiet: false, //front-end only + ReadOnlyRootfs: input.HostConfig.ReadonlyRootfs, + ReadOnlyTmpfs: false, //podman + Resources: createconfig.CreateResourceConfig{}, + //RestartPolicy: input.HostConfig.RestartPolicy, + Rm: input.HostConfig.AutoRemove, + //StopSignal: input.StopSignal, + //StopTimeout: input.StopTimeout, + Sysctl: input.HostConfig.Sysctls, + Systemd: false, //podman + //Tmpfs: input.HostConfig.Tmpfs, + Tty: input.Tty, + //UsernsMode: input.HostConfig.UsernsMode, + User: input.User, + //UtsMode: input.HostConfig.UTSMode, + Mounts: nil, //we populate + //MountsFlag: input.HostConfig.Mounts, + NamedVolumes: nil, // we populate + //Volumes: input.Volumes, + VolumesFrom: input.HostConfig.VolumesFrom, + WorkDir: input.WorkingDir, + LabelOpts: nil, // we populate + NoNewPrivs: false, // we populate + ApparmorProfile: "", // we populate + SeccompProfilePath: "", //we populate + SecurityOpts: input.HostConfig.SecurityOpt, + Rootfs: "", //podman + Syslog: false, //podman + } + + return m, nil +} diff --git a/pkg/serviceapi/handler_pods.go b/pkg/serviceapi/handler_pods.go index 196725020c..33e2e95a29 100644 --- a/pkg/serviceapi/handler_pods.go +++ b/pkg/serviceapi/handler_pods.go @@ -34,6 +34,8 @@ func registerPodsHandlers(r *mux.Router) error { } func podCreate(w http.ResponseWriter, r *http.Request, runtime *libpod.Runtime) { + //TODO This is ALL wrong. Brent to completely redo. Should be using JSON structures + // and not forms. var ( options []libpod.PodCreateOption err error diff --git a/pkg/serviceapi/types.go b/pkg/serviceapi/types.go index 77e52b939e..0af3a12f47 100644 --- a/pkg/serviceapi/types.go +++ b/pkg/serviceapi/types.go @@ -2,6 +2,7 @@ package serviceapi import ( "context" + "github.com/docker/docker/api/types/network" "time" podmanImage "github.com/containers/libpod/libpod/image" @@ -34,6 +35,7 @@ type Info struct { } type Container struct { + docker.ContainerCreateConfig docker.ContainerJSON } @@ -88,6 +90,13 @@ type ContainerWaitOKBody struct { } } +type CreateContainer struct { + Name string + dockerContainer.Config + HostConfig dockerContainer.HostConfig + NetworkingConfig network.NetworkingConfig +} + func ImageToImageSummary(p *podmanImage.Image) (*ImageSummary, error) { containers, err := p.Containers() if err != nil {