From e08a77ce64eec5cd0192ae1970fa859c00440174 Mon Sep 17 00:00:00 2001 From: Niall Crowe Date: Fri, 24 Jun 2022 15:43:05 +0100 Subject: Add "podman kube play" cmd The "podman kube play" command is designed to be a replacement for the "podman play kube" command. It performs the same function as "play kube" while also still working with the same flags and options. The "podman play kube" command is still functional as an alias of "kube play". Closes #12475 Signed-off-by: Niall Crowe Signed-off-by: Valentin Rothberg --- pkg/api/handlers/libpod/kube.go | 123 ++++++++++++++ pkg/api/handlers/libpod/play.go | 114 +------------ pkg/api/handlers/swagger/responses.go | 2 +- pkg/api/server/register_kube.go | 82 +++++++++ pkg/api/server/register_play.go | 80 --------- pkg/api/server/server.go | 2 +- pkg/bindings/kube/kube.go | 96 +++++++++++ pkg/bindings/kube/types.go | 48 ++++++ pkg/bindings/kube/types_play_options.go | 289 ++++++++++++++++++++++++++++++++ pkg/bindings/play/play.go | 88 +--------- pkg/bindings/play/types.go | 48 ------ pkg/bindings/play/types_kube_options.go | 289 -------------------------------- pkg/domain/entities/play.go | 2 + pkg/domain/infra/tunnel/play.go | 5 +- 14 files changed, 656 insertions(+), 612 deletions(-) create mode 100644 pkg/api/handlers/libpod/kube.go create mode 100644 pkg/api/server/register_kube.go delete mode 100644 pkg/api/server/register_play.go create mode 100644 pkg/bindings/kube/kube.go create mode 100644 pkg/bindings/kube/types.go create mode 100644 pkg/bindings/kube/types_play_options.go delete mode 100644 pkg/bindings/play/types.go delete mode 100644 pkg/bindings/play/types_kube_options.go (limited to 'pkg') diff --git a/pkg/api/handlers/libpod/kube.go b/pkg/api/handlers/libpod/kube.go new file mode 100644 index 000000000..6cad58795 --- /dev/null +++ b/pkg/api/handlers/libpod/kube.go @@ -0,0 +1,123 @@ +package libpod + +import ( + "fmt" + "net" + "net/http" + + "github.com/containers/image/v5/types" + "github.com/containers/podman/v4/libpod" + "github.com/containers/podman/v4/pkg/api/handlers/utils" + api "github.com/containers/podman/v4/pkg/api/types" + "github.com/containers/podman/v4/pkg/auth" + "github.com/containers/podman/v4/pkg/domain/entities" + "github.com/containers/podman/v4/pkg/domain/infra/abi" + "github.com/gorilla/schema" +) + +func KubePlay(w http.ResponseWriter, r *http.Request) { + runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) + decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder) + query := struct { + Annotations map[string]string `schema:"annotations"` + Network []string `schema:"network"` + TLSVerify bool `schema:"tlsVerify"` + LogDriver string `schema:"logDriver"` + LogOptions []string `schema:"logOptions"` + Start bool `schema:"start"` + StaticIPs []string `schema:"staticIPs"` + StaticMACs []string `schema:"staticMACs"` + NoHosts bool `schema:"noHosts"` + }{ + TLSVerify: true, + Start: true, + } + + if err := decoder.Decode(&query, r.URL.Query()); err != nil { + utils.Error(w, http.StatusBadRequest, fmt.Errorf("failed to parse parameters for %s: %w", r.URL.String(), err)) + return + } + + staticIPs := make([]net.IP, 0, len(query.StaticIPs)) + for _, ipString := range query.StaticIPs { + ip := net.ParseIP(ipString) + if ip == nil { + utils.Error(w, http.StatusBadRequest, fmt.Errorf("invalid IP address %s", ipString)) + return + } + staticIPs = append(staticIPs, ip) + } + + staticMACs := make([]net.HardwareAddr, 0, len(query.StaticMACs)) + for _, macString := range query.StaticMACs { + mac, err := net.ParseMAC(macString) + if err != nil { + utils.Error(w, http.StatusBadRequest, err) + return + } + staticMACs = append(staticMACs, mac) + } + + authConf, authfile, err := auth.GetCredentials(r) + if err != nil { + utils.Error(w, http.StatusBadRequest, err) + return + } + defer auth.RemoveAuthfile(authfile) + var username, password string + if authConf != nil { + username = authConf.Username + password = authConf.Password + } + + logDriver := query.LogDriver + if logDriver == "" { + config, err := runtime.GetConfig() + if err != nil { + utils.Error(w, http.StatusInternalServerError, err) + return + } + logDriver = config.Containers.LogDriver + } + + containerEngine := abi.ContainerEngine{Libpod: runtime} + options := entities.PlayKubeOptions{ + Annotations: query.Annotations, + Authfile: authfile, + Username: username, + Password: password, + Networks: query.Network, + NoHosts: query.NoHosts, + Quiet: true, + LogDriver: logDriver, + LogOptions: query.LogOptions, + StaticIPs: staticIPs, + StaticMACs: staticMACs, + } + if _, found := r.URL.Query()["tlsVerify"]; found { + options.SkipTLSVerify = types.NewOptionalBool(!query.TLSVerify) + } + if _, found := r.URL.Query()["start"]; found { + options.Start = types.NewOptionalBool(query.Start) + } + report, err := containerEngine.PlayKube(r.Context(), r.Body, options) + _ = r.Body.Close() + if err != nil { + utils.Error(w, http.StatusInternalServerError, fmt.Errorf("error playing YAML file: %w", err)) + return + } + utils.WriteResponse(w, http.StatusOK, report) +} + +func KubePlayDown(w http.ResponseWriter, r *http.Request) { + runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) + containerEngine := abi.ContainerEngine{Libpod: runtime} + options := new(entities.PlayKubeDownOptions) + report, err := containerEngine.PlayKubeDown(r.Context(), r.Body, *options) + _ = r.Body.Close() + if err != nil { + utils.Error(w, http.StatusInternalServerError, fmt.Errorf("error tearing down YAML file: %w", err)) + return + } + utils.WriteResponse(w, http.StatusOK, report) +} diff --git a/pkg/api/handlers/libpod/play.go b/pkg/api/handlers/libpod/play.go index f8ce52a72..74830badb 100644 --- a/pkg/api/handlers/libpod/play.go +++ b/pkg/api/handlers/libpod/play.go @@ -1,123 +1,13 @@ package libpod import ( - "fmt" - "net" "net/http" - - "github.com/containers/image/v5/types" - "github.com/containers/podman/v4/libpod" - "github.com/containers/podman/v4/pkg/api/handlers/utils" - api "github.com/containers/podman/v4/pkg/api/types" - "github.com/containers/podman/v4/pkg/auth" - "github.com/containers/podman/v4/pkg/domain/entities" - "github.com/containers/podman/v4/pkg/domain/infra/abi" - "github.com/gorilla/schema" ) func PlayKube(w http.ResponseWriter, r *http.Request) { - runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) - decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder) - query := struct { - Annotations map[string]string `schema:"annotations"` - Network []string `schema:"network"` - TLSVerify bool `schema:"tlsVerify"` - LogDriver string `schema:"logDriver"` - LogOptions []string `schema:"logOptions"` - Start bool `schema:"start"` - StaticIPs []string `schema:"staticIPs"` - StaticMACs []string `schema:"staticMACs"` - NoHosts bool `schema:"noHosts"` - }{ - TLSVerify: true, - Start: true, - } - - if err := decoder.Decode(&query, r.URL.Query()); err != nil { - utils.Error(w, http.StatusBadRequest, fmt.Errorf("failed to parse parameters for %s: %w", r.URL.String(), err)) - return - } - - staticIPs := make([]net.IP, 0, len(query.StaticIPs)) - for _, ipString := range query.StaticIPs { - ip := net.ParseIP(ipString) - if ip == nil { - utils.Error(w, http.StatusBadRequest, fmt.Errorf("invalid IP address %s", ipString)) - return - } - staticIPs = append(staticIPs, ip) - } - - staticMACs := make([]net.HardwareAddr, 0, len(query.StaticMACs)) - for _, macString := range query.StaticMACs { - mac, err := net.ParseMAC(macString) - if err != nil { - utils.Error(w, http.StatusBadRequest, err) - return - } - staticMACs = append(staticMACs, mac) - } - - authConf, authfile, err := auth.GetCredentials(r) - if err != nil { - utils.Error(w, http.StatusBadRequest, err) - return - } - defer auth.RemoveAuthfile(authfile) - var username, password string - if authConf != nil { - username = authConf.Username - password = authConf.Password - } - - logDriver := query.LogDriver - if logDriver == "" { - config, err := runtime.GetConfig() - if err != nil { - utils.Error(w, http.StatusInternalServerError, err) - return - } - logDriver = config.Containers.LogDriver - } - - containerEngine := abi.ContainerEngine{Libpod: runtime} - options := entities.PlayKubeOptions{ - Annotations: query.Annotations, - Authfile: authfile, - Username: username, - Password: password, - Networks: query.Network, - NoHosts: query.NoHosts, - Quiet: true, - LogDriver: logDriver, - LogOptions: query.LogOptions, - StaticIPs: staticIPs, - StaticMACs: staticMACs, - } - if _, found := r.URL.Query()["tlsVerify"]; found { - options.SkipTLSVerify = types.NewOptionalBool(!query.TLSVerify) - } - if _, found := r.URL.Query()["start"]; found { - options.Start = types.NewOptionalBool(query.Start) - } - report, err := containerEngine.PlayKube(r.Context(), r.Body, options) - _ = r.Body.Close() - if err != nil { - utils.Error(w, http.StatusInternalServerError, fmt.Errorf("error playing YAML file: %w", err)) - return - } - utils.WriteResponse(w, http.StatusOK, report) + KubePlay(w, r) } func PlayKubeDown(w http.ResponseWriter, r *http.Request) { - runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) - containerEngine := abi.ContainerEngine{Libpod: runtime} - options := new(entities.PlayKubeDownOptions) - report, err := containerEngine.PlayKubeDown(r.Context(), r.Body, *options) - _ = r.Body.Close() - if err != nil { - utils.Error(w, http.StatusInternalServerError, fmt.Errorf("error tearing down YAML file: %w", err)) - return - } - utils.WriteResponse(w, http.StatusOK, report) + KubePlayDown(w, r) } diff --git a/pkg/api/handlers/swagger/responses.go b/pkg/api/handlers/swagger/responses.go index 93a508b39..5731f8edd 100644 --- a/pkg/api/handlers/swagger/responses.go +++ b/pkg/api/handlers/swagger/responses.go @@ -71,7 +71,7 @@ type imagesRemoveResponseLibpod struct { // PlayKube response // swagger:response -type playKubeResponseLibpod struct { +type kubePlayResponseLibpod struct { // in:body Body entities.PlayKubeReport } diff --git a/pkg/api/server/register_kube.go b/pkg/api/server/register_kube.go new file mode 100644 index 000000000..6ae9e8123 --- /dev/null +++ b/pkg/api/server/register_kube.go @@ -0,0 +1,82 @@ +package server + +import ( + "net/http" + + "github.com/containers/podman/v4/pkg/api/handlers/libpod" + "github.com/gorilla/mux" +) + +func (s *APIServer) registerKubeHandlers(r *mux.Router) error { + // swagger:operation POST /libpod/kube/play libpod KubePlayLibpod + // --- + // tags: + // - containers + // - pods + // summary: Play a Kubernetes YAML file. + // description: Create and run pods based on a Kubernetes YAML file (pod or service kind). + // parameters: + // - in: query + // name: network + // type: array + // description: USe the network mode or specify an array of networks. + // items: + // type: string + // - in: query + // name: tlsVerify + // type: boolean + // default: true + // description: Require HTTPS and verify signatures when contacting registries. + // - in: query + // name: logDriver + // type: string + // description: Logging driver for the containers in the pod. + // - in: query + // name: start + // type: boolean + // default: true + // description: Start the pod after creating it. + // - in: query + // name: staticIPs + // type: array + // description: Static IPs used for the pods. + // items: + // type: string + // - in: query + // name: staticMACs + // type: array + // description: Static MACs used for the pods. + // items: + // type: string + // - in: body + // name: request + // description: Kubernetes YAML file. + // schema: + // type: string + // produces: + // - application/json + // responses: + // 200: + // $ref: "#/responses/kubePlayResponseLibpod" + // 500: + // $ref: "#/responses/internalError" + r.HandleFunc(VersionedPath("/libpod/kube/play"), s.APIHandler(libpod.KubePlay)).Methods(http.MethodPost) + r.HandleFunc(VersionedPath("/libpod/play/kube"), s.APIHandler(libpod.PlayKube)).Methods(http.MethodPost) + // swagger:operation DELETE /libpod/kube/play libpod KubePlayDownLibpod + // --- + // tags: + // - containers + // - pods + // summary: Remove pods from kube play + // description: Tears down pods defined in a YAML file + // produces: + // - application/json + // responses: + // 200: + // $ref: "#/responses/kubePlayResponseLibpod" + // 500: + // $ref: "#/responses/internalError" + r.HandleFunc(VersionedPath("/libpod/kube/play"), s.APIHandler(libpod.KubePlayDown)).Methods(http.MethodDelete) + r.HandleFunc(VersionedPath("/libpod/play/kube"), s.APIHandler(libpod.PlayKubeDown)).Methods(http.MethodDelete) + return nil +} diff --git a/pkg/api/server/register_play.go b/pkg/api/server/register_play.go deleted file mode 100644 index 35da80ccc..000000000 --- a/pkg/api/server/register_play.go +++ /dev/null @@ -1,80 +0,0 @@ -package server - -import ( - "net/http" - - "github.com/containers/podman/v4/pkg/api/handlers/libpod" - "github.com/gorilla/mux" -) - -func (s *APIServer) registerPlayHandlers(r *mux.Router) error { - // swagger:operation POST /libpod/play/kube libpod PlayKubeLibpod - // --- - // tags: - // - containers - // - pods - // summary: Play a Kubernetes YAML file. - // description: Create and run pods based on a Kubernetes YAML file (pod or service kind). - // parameters: - // - in: query - // name: network - // type: array - // description: USe the network mode or specify an array of networks. - // items: - // type: string - // - in: query - // name: tlsVerify - // type: boolean - // default: true - // description: Require HTTPS and verify signatures when contacting registries. - // - in: query - // name: logDriver - // type: string - // description: Logging driver for the containers in the pod. - // - in: query - // name: start - // type: boolean - // default: true - // description: Start the pod after creating it. - // - in: query - // name: staticIPs - // type: array - // description: Static IPs used for the pods. - // items: - // type: string - // - in: query - // name: staticMACs - // type: array - // description: Static MACs used for the pods. - // items: - // type: string - // - in: body - // name: request - // description: Kubernetes YAML file. - // schema: - // type: string - // produces: - // - application/json - // responses: - // 200: - // $ref: "#/responses/playKubeResponseLibpod" - // 500: - // $ref: "#/responses/internalError" - r.HandleFunc(VersionedPath("/libpod/play/kube"), s.APIHandler(libpod.PlayKube)).Methods(http.MethodPost) - // swagger:operation DELETE /libpod/play/kube libpod PlayKubeDownLibpod - // --- - // tags: - // - containers - // - pods - // summary: Remove pods from play kube - // description: Tears down pods defined in a YAML file - // produces: - // - application/json - // responses: - // 200: - // $ref: "#/responses/playKubeResponseLibpod" - // 500: - // $ref: "#/responses/internalError" - r.HandleFunc(VersionedPath("/libpod/play/kube"), s.APIHandler(libpod.PlayKubeDown)).Methods(http.MethodDelete) - return nil -} diff --git a/pkg/api/server/server.go b/pkg/api/server/server.go index 5482a8ec2..a6d8b5e4c 100644 --- a/pkg/api/server/server.go +++ b/pkg/api/server/server.go @@ -126,11 +126,11 @@ func newServer(runtime *libpod.Runtime, listener net.Listener, opts entities.Ser server.registerHealthCheckHandlers, server.registerImagesHandlers, server.registerInfoHandlers, + server.registerKubeHandlers, server.registerManifestHandlers, server.registerMonitorHandlers, server.registerNetworkHandlers, server.registerPingHandlers, - server.registerPlayHandlers, server.registerPluginsHandlers, server.registerPodsHandlers, server.registerSecretHandlers, diff --git a/pkg/bindings/kube/kube.go b/pkg/bindings/kube/kube.go new file mode 100644 index 000000000..b9cc0efa7 --- /dev/null +++ b/pkg/bindings/kube/kube.go @@ -0,0 +1,96 @@ +package kube + +import ( + "context" + "io" + "net/http" + "os" + "strconv" + + "github.com/containers/image/v5/types" + "github.com/containers/podman/v4/pkg/auth" + "github.com/containers/podman/v4/pkg/bindings" + "github.com/containers/podman/v4/pkg/domain/entities" + "github.com/sirupsen/logrus" +) + +func Play(ctx context.Context, path string, options *PlayOptions) (*entities.KubePlayReport, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + return PlayWithBody(ctx, f, options) +} + +func PlayWithBody(ctx context.Context, body io.Reader, options *PlayOptions) (*entities.KubePlayReport, error) { + var report entities.KubePlayReport + if options == nil { + options = new(PlayOptions) + } + + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + + params, err := options.ToParams() + if err != nil { + return nil, err + } + if options.SkipTLSVerify != nil { + params.Set("tlsVerify", strconv.FormatBool(options.GetSkipTLSVerify())) + } + if options.Start != nil { + params.Set("start", strconv.FormatBool(options.GetStart())) + } + + header, err := auth.MakeXRegistryAuthHeader(&types.SystemContext{AuthFilePath: options.GetAuthfile()}, options.GetUsername(), options.GetPassword()) + if err != nil { + return nil, err + } + + response, err := conn.DoRequest(ctx, body, http.MethodPost, "/kube/play", params, header) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if err := response.Process(&report); err != nil { + return nil, err + } + + return &report, nil +} + +func Down(ctx context.Context, path string) (*entities.KubePlayReport, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer func() { + if err := f.Close(); err != nil { + logrus.Warn(err) + } + }() + + return DownWithBody(ctx, f) +} + +func DownWithBody(ctx context.Context, body io.Reader) (*entities.KubePlayReport, error) { + var report entities.KubePlayReport + conn, err := bindings.GetClient(ctx) + if err != nil { + return nil, err + } + + response, err := conn.DoRequest(ctx, body, http.MethodDelete, "/kube/play", nil, nil) + if err != nil { + return nil, err + } + if err := response.Process(&report); err != nil { + return nil, err + } + return &report, nil +} diff --git a/pkg/bindings/kube/types.go b/pkg/bindings/kube/types.go new file mode 100644 index 000000000..783d1912a --- /dev/null +++ b/pkg/bindings/kube/types.go @@ -0,0 +1,48 @@ +package kube + +import ( + "net" +) + +//go:generate go run ../generator/generator.go PlayOptions +// PlayOptions are optional options for replaying kube YAML files +type PlayOptions struct { + // Annotations - Annotations to add to Pods + Annotations map[string]string + // Authfile - path to an authentication file. + Authfile *string + // CertDir - to a directory containing TLS certifications and keys. + CertDir *string + // Username for authenticating against the registry. + Username *string + // Password for authenticating against the registry. + Password *string + // Network - name of the networks to connect to. + Network *[]string + // NoHosts - do not generate /etc/hosts file in pod's containers + NoHosts *bool + // Quiet - suppress output when pulling images. + Quiet *bool + // SignaturePolicy - path to a signature-policy file. + SignaturePolicy *string + // SkipTLSVerify - skip https and certificate validation when + // contacting container registries. + SkipTLSVerify *bool + // SeccompProfileRoot - path to a directory containing seccomp + // profiles. + SeccompProfileRoot *string + // StaticIPs - Static IP address used by the pod(s). + StaticIPs *[]net.IP + // StaticMACs - Static MAC address used by the pod(s). + StaticMACs *[]net.HardwareAddr + // ConfigMaps - slice of pathnames to kubernetes configmap YAMLs. + ConfigMaps *[]string + // LogDriver for the container. For example: journald + LogDriver *string + // LogOptions for the container. For example: journald + LogOptions *[]string + // Start - don't start the pod if false + Start *bool + // Userns - define the user namespace to use. + Userns *string +} diff --git a/pkg/bindings/kube/types_play_options.go b/pkg/bindings/kube/types_play_options.go new file mode 100644 index 000000000..cdc2e9dd8 --- /dev/null +++ b/pkg/bindings/kube/types_play_options.go @@ -0,0 +1,289 @@ +// Code generated by go generate; DO NOT EDIT. +package kube + +import ( + "net" + "net/url" + + "github.com/containers/podman/v4/pkg/bindings/internal/util" +) + +// Changed returns true if named field has been set +func (o *PlayOptions) Changed(fieldName string) bool { + return util.Changed(o, fieldName) +} + +// ToParams formats struct fields to be passed to API service +func (o *PlayOptions) ToParams() (url.Values, error) { + return util.ToParams(o) +} + +// WithAnnotations set field Annotations to given value +func (o *PlayOptions) WithAnnotations(value map[string]string) *PlayOptions { + o.Annotations = value + return o +} + +// GetAnnotations returns value of field Annotations +func (o *PlayOptions) GetAnnotations() map[string]string { + if o.Annotations == nil { + var z map[string]string + return z + } + return o.Annotations +} + +// WithAuthfile set field Authfile to given value +func (o *PlayOptions) WithAuthfile(value string) *PlayOptions { + o.Authfile = &value + return o +} + +// GetAuthfile returns value of field Authfile +func (o *PlayOptions) GetAuthfile() string { + if o.Authfile == nil { + var z string + return z + } + return *o.Authfile +} + +// WithCertDir set field CertDir to given value +func (o *PlayOptions) WithCertDir(value string) *PlayOptions { + o.CertDir = &value + return o +} + +// GetCertDir returns value of field CertDir +func (o *PlayOptions) GetCertDir() string { + if o.CertDir == nil { + var z string + return z + } + return *o.CertDir +} + +// WithUsername set field Username to given value +func (o *PlayOptions) WithUsername(value string) *PlayOptions { + o.Username = &value + return o +} + +// GetUsername returns value of field Username +func (o *PlayOptions) GetUsername() string { + if o.Username == nil { + var z string + return z + } + return *o.Username +} + +// WithPassword set field Password to given value +func (o *PlayOptions) WithPassword(value string) *PlayOptions { + o.Password = &value + return o +} + +// GetPassword returns value of field Password +func (o *PlayOptions) GetPassword() string { + if o.Password == nil { + var z string + return z + } + return *o.Password +} + +// WithNetwork set field Network to given value +func (o *PlayOptions) WithNetwork(value []string) *PlayOptions { + o.Network = &value + return o +} + +// GetNetwork returns value of field Network +func (o *PlayOptions) GetNetwork() []string { + if o.Network == nil { + var z []string + return z + } + return *o.Network +} + +// WithNoHosts set field NoHosts to given value +func (o *PlayOptions) WithNoHosts(value bool) *PlayOptions { + o.NoHosts = &value + return o +} + +// GetNoHosts returns value of field NoHosts +func (o *PlayOptions) GetNoHosts() bool { + if o.NoHosts == nil { + var z bool + return z + } + return *o.NoHosts +} + +// WithQuiet set field Quiet to given value +func (o *PlayOptions) WithQuiet(value bool) *PlayOptions { + o.Quiet = &value + return o +} + +// GetQuiet returns value of field Quiet +func (o *PlayOptions) GetQuiet() bool { + if o.Quiet == nil { + var z bool + return z + } + return *o.Quiet +} + +// WithSignaturePolicy set field SignaturePolicy to given value +func (o *PlayOptions) WithSignaturePolicy(value string) *PlayOptions { + o.SignaturePolicy = &value + return o +} + +// GetSignaturePolicy returns value of field SignaturePolicy +func (o *PlayOptions) GetSignaturePolicy() string { + if o.SignaturePolicy == nil { + var z string + return z + } + return *o.SignaturePolicy +} + +// WithSkipTLSVerify set field SkipTLSVerify to given value +func (o *PlayOptions) WithSkipTLSVerify(value bool) *PlayOptions { + o.SkipTLSVerify = &value + return o +} + +// GetSkipTLSVerify returns value of field SkipTLSVerify +func (o *PlayOptions) GetSkipTLSVerify() bool { + if o.SkipTLSVerify == nil { + var z bool + return z + } + return *o.SkipTLSVerify +} + +// WithSeccompProfileRoot set field SeccompProfileRoot to given value +func (o *PlayOptions) WithSeccompProfileRoot(value string) *PlayOptions { + o.SeccompProfileRoot = &value + return o +} + +// GetSeccompProfileRoot returns value of field SeccompProfileRoot +func (o *PlayOptions) GetSeccompProfileRoot() string { + if o.SeccompProfileRoot == nil { + var z string + return z + } + return *o.SeccompProfileRoot +} + +// WithStaticIPs set field StaticIPs to given value +func (o *PlayOptions) WithStaticIPs(value []net.IP) *PlayOptions { + o.StaticIPs = &value + return o +} + +// GetStaticIPs returns value of field StaticIPs +func (o *PlayOptions) GetStaticIPs() []net.IP { + if o.StaticIPs == nil { + var z []net.IP + return z + } + return *o.StaticIPs +} + +// WithStaticMACs set field StaticMACs to given value +func (o *PlayOptions) WithStaticMACs(value []net.HardwareAddr) *PlayOptions { + o.StaticMACs = &value + return o +} + +// GetStaticMACs returns value of field StaticMACs +func (o *PlayOptions) GetStaticMACs() []net.HardwareAddr { + if o.StaticMACs == nil { + var z []net.HardwareAddr + return z + } + return *o.StaticMACs +} + +// WithConfigMaps set field ConfigMaps to given value +func (o *PlayOptions) WithConfigMaps(value []string) *PlayOptions { + o.ConfigMaps = &value + return o +} + +// GetConfigMaps returns value of field ConfigMaps +func (o *PlayOptions) GetConfigMaps() []string { + if o.ConfigMaps == nil { + var z []string + return z + } + return *o.ConfigMaps +} + +// WithLogDriver set field LogDriver to given value +func (o *PlayOptions) WithLogDriver(value string) *PlayOptions { + o.LogDriver = &value + return o +} + +// GetLogDriver returns value of field LogDriver +func (o *PlayOptions) GetLogDriver() string { + if o.LogDriver == nil { + var z string + return z + } + return *o.LogDriver +} + +// WithLogOptions set field LogOptions to given value +func (o *PlayOptions) WithLogOptions(value []string) *PlayOptions { + o.LogOptions = &value + return o +} + +// GetLogOptions returns value of field LogOptions +func (o *PlayOptions) GetLogOptions() []string { + if o.LogOptions == nil { + var z []string + return z + } + return *o.LogOptions +} + +// WithStart set field Start to given value +func (o *PlayOptions) WithStart(value bool) *PlayOptions { + o.Start = &value + return o +} + +// GetStart returns value of field Start +func (o *PlayOptions) GetStart() bool { + if o.Start == nil { + var z bool + return z + } + return *o.Start +} + +// WithUserns set field Userns to given value +func (o *PlayOptions) WithUserns(value string) *PlayOptions { + o.Userns = &value + return o +} + +// GetUserns returns value of field Userns +func (o *PlayOptions) GetUserns() string { + if o.Userns == nil { + var z string + return z + } + return *o.Userns +} diff --git a/pkg/bindings/play/play.go b/pkg/bindings/play/play.go index 0261b0250..d5d649135 100644 --- a/pkg/bindings/play/play.go +++ b/pkg/bindings/play/play.go @@ -3,95 +3,25 @@ package play import ( "context" "io" - "net/http" - "os" - "strconv" - "github.com/containers/image/v5/types" - "github.com/containers/podman/v4/pkg/auth" - "github.com/containers/podman/v4/pkg/bindings" + "github.com/containers/podman/v4/pkg/bindings/kube" "github.com/containers/podman/v4/pkg/domain/entities" - "github.com/sirupsen/logrus" ) -func Kube(ctx context.Context, path string, options *KubeOptions) (*entities.PlayKubeReport, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() +type KubeOptions = kube.PlayOptions - return KubeWithBody(ctx, f, options) +func Kube(ctx context.Context, path string, options *KubeOptions) (*entities.PlayKubeReport, error) { + return kube.Play(ctx, path, options) } func KubeWithBody(ctx context.Context, body io.Reader, options *KubeOptions) (*entities.PlayKubeReport, error) { - var report entities.PlayKubeReport - if options == nil { - options = new(KubeOptions) - } - - conn, err := bindings.GetClient(ctx) - if err != nil { - return nil, err - } - - params, err := options.ToParams() - if err != nil { - return nil, err - } - if options.SkipTLSVerify != nil { - params.Set("tlsVerify", strconv.FormatBool(options.GetSkipTLSVerify())) - } - if options.Start != nil { - params.Set("start", strconv.FormatBool(options.GetStart())) - } - - header, err := auth.MakeXRegistryAuthHeader(&types.SystemContext{AuthFilePath: options.GetAuthfile()}, options.GetUsername(), options.GetPassword()) - if err != nil { - return nil, err - } - - response, err := conn.DoRequest(ctx, body, http.MethodPost, "/play/kube", params, header) - if err != nil { - return nil, err - } - defer response.Body.Close() - - if err := response.Process(&report); err != nil { - return nil, err - } - - return &report, nil + return kube.PlayWithBody(ctx, body, options) } -func KubeDown(ctx context.Context, path string) (*entities.PlayKubeReport, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer func() { - if err := f.Close(); err != nil { - logrus.Warn(err) - } - }() - - return KubeDownWithBody(ctx, f) +func Down(ctx context.Context, path string) (*entities.PlayKubeReport, error) { + return kube.Down(ctx, path) } -func KubeDownWithBody(ctx context.Context, body io.Reader) (*entities.PlayKubeReport, error) { - var report entities.PlayKubeReport - conn, err := bindings.GetClient(ctx) - if err != nil { - return nil, err - } - - response, err := conn.DoRequest(ctx, body, http.MethodDelete, "/play/kube", nil, nil) - if err != nil { - return nil, err - } - if err := response.Process(&report); err != nil { - return nil, err - } - - return &report, nil +func DownWithBody(ctx context.Context, body io.Reader) (*entities.PlayKubeReport, error) { + return kube.DownWithBody(ctx, body) } diff --git a/pkg/bindings/play/types.go b/pkg/bindings/play/types.go deleted file mode 100644 index 5aaa87b8c..000000000 --- a/pkg/bindings/play/types.go +++ /dev/null @@ -1,48 +0,0 @@ -package play - -import ( - "net" -) - -//go:generate go run ../generator/generator.go KubeOptions -// KubeOptions are optional options for replaying kube YAML files -type KubeOptions struct { - // Annotations - Annotations to add to Pods - Annotations map[string]string - // Authfile - path to an authentication file. - Authfile *string - // CertDir - to a directory containing TLS certifications and keys. - CertDir *string - // Username for authenticating against the registry. - Username *string - // Password for authenticating against the registry. - Password *string - // Network - name of the networks to connect to. - Network *[]string - // NoHosts - do not generate /etc/hosts file in pod's containers - NoHosts *bool - // Quiet - suppress output when pulling images. - Quiet *bool - // SignaturePolicy - path to a signature-policy file. - SignaturePolicy *string - // SkipTLSVerify - skip https and certificate validation when - // contacting container registries. - SkipTLSVerify *bool - // SeccompProfileRoot - path to a directory containing seccomp - // profiles. - SeccompProfileRoot *string - // StaticIPs - Static IP address used by the pod(s). - StaticIPs *[]net.IP - // StaticMACs - Static MAC address used by the pod(s). - StaticMACs *[]net.HardwareAddr - // ConfigMaps - slice of pathnames to kubernetes configmap YAMLs. - ConfigMaps *[]string - // LogDriver for the container. For example: journald - LogDriver *string - // LogOptions for the container. For example: journald - LogOptions *[]string - // Start - don't start the pod if false - Start *bool - // Userns - define the user namespace to use. - Userns *string -} diff --git a/pkg/bindings/play/types_kube_options.go b/pkg/bindings/play/types_kube_options.go deleted file mode 100644 index 54c9a8e74..000000000 --- a/pkg/bindings/play/types_kube_options.go +++ /dev/null @@ -1,289 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -package play - -import ( - "net" - "net/url" - - "github.com/containers/podman/v4/pkg/bindings/internal/util" -) - -// Changed returns true if named field has been set -func (o *KubeOptions) Changed(fieldName string) bool { - return util.Changed(o, fieldName) -} - -// ToParams formats struct fields to be passed to API service -func (o *KubeOptions) ToParams() (url.Values, error) { - return util.ToParams(o) -} - -// WithAnnotations set field Annotations to given value -func (o *KubeOptions) WithAnnotations(value map[string]string) *KubeOptions { - o.Annotations = value - return o -} - -// GetAnnotations returns value of field Annotations -func (o *KubeOptions) GetAnnotations() map[string]string { - if o.Annotations == nil { - var z map[string]string - return z - } - return o.Annotations -} - -// WithAuthfile set field Authfile to given value -func (o *KubeOptions) WithAuthfile(value string) *KubeOptions { - o.Authfile = &value - return o -} - -// GetAuthfile returns value of field Authfile -func (o *KubeOptions) GetAuthfile() string { - if o.Authfile == nil { - var z string - return z - } - return *o.Authfile -} - -// WithCertDir set field CertDir to given value -func (o *KubeOptions) WithCertDir(value string) *KubeOptions { - o.CertDir = &value - return o -} - -// GetCertDir returns value of field CertDir -func (o *KubeOptions) GetCertDir() string { - if o.CertDir == nil { - var z string - return z - } - return *o.CertDir -} - -// WithUsername set field Username to given value -func (o *KubeOptions) WithUsername(value string) *KubeOptions { - o.Username = &value - return o -} - -// GetUsername returns value of field Username -func (o *KubeOptions) GetUsername() string { - if o.Username == nil { - var z string - return z - } - return *o.Username -} - -// WithPassword set field Password to given value -func (o *KubeOptions) WithPassword(value string) *KubeOptions { - o.Password = &value - return o -} - -// GetPassword returns value of field Password -func (o *KubeOptions) GetPassword() string { - if o.Password == nil { - var z string - return z - } - return *o.Password -} - -// WithNetwork set field Network to given value -func (o *KubeOptions) WithNetwork(value []string) *KubeOptions { - o.Network = &value - return o -} - -// GetNetwork returns value of field Network -func (o *KubeOptions) GetNetwork() []string { - if o.Network == nil { - var z []string - return z - } - return *o.Network -} - -// WithNoHosts set field NoHosts to given value -func (o *KubeOptions) WithNoHosts(value bool) *KubeOptions { - o.NoHosts = &value - return o -} - -// GetNoHosts returns value of field NoHosts -func (o *KubeOptions) GetNoHosts() bool { - if o.NoHosts == nil { - var z bool - return z - } - return *o.NoHosts -} - -// WithQuiet set field Quiet to given value -func (o *KubeOptions) WithQuiet(value bool) *KubeOptions { - o.Quiet = &value - return o -} - -// GetQuiet returns value of field Quiet -func (o *KubeOptions) GetQuiet() bool { - if o.Quiet == nil { - var z bool - return z - } - return *o.Quiet -} - -// WithSignaturePolicy set field SignaturePolicy to given value -func (o *KubeOptions) WithSignaturePolicy(value string) *KubeOptions { - o.SignaturePolicy = &value - return o -} - -// GetSignaturePolicy returns value of field SignaturePolicy -func (o *KubeOptions) GetSignaturePolicy() string { - if o.SignaturePolicy == nil { - var z string - return z - } - return *o.SignaturePolicy -} - -// WithSkipTLSVerify set field SkipTLSVerify to given value -func (o *KubeOptions) WithSkipTLSVerify(value bool) *KubeOptions { - o.SkipTLSVerify = &value - return o -} - -// GetSkipTLSVerify returns value of field SkipTLSVerify -func (o *KubeOptions) GetSkipTLSVerify() bool { - if o.SkipTLSVerify == nil { - var z bool - return z - } - return *o.SkipTLSVerify -} - -// WithSeccompProfileRoot set field SeccompProfileRoot to given value -func (o *KubeOptions) WithSeccompProfileRoot(value string) *KubeOptions { - o.SeccompProfileRoot = &value - return o -} - -// GetSeccompProfileRoot returns value of field SeccompProfileRoot -func (o *KubeOptions) GetSeccompProfileRoot() string { - if o.SeccompProfileRoot == nil { - var z string - return z - } - return *o.SeccompProfileRoot -} - -// WithStaticIPs set field StaticIPs to given value -func (o *KubeOptions) WithStaticIPs(value []net.IP) *KubeOptions { - o.StaticIPs = &value - return o -} - -// GetStaticIPs returns value of field StaticIPs -func (o *KubeOptions) GetStaticIPs() []net.IP { - if o.StaticIPs == nil { - var z []net.IP - return z - } - return *o.StaticIPs -} - -// WithStaticMACs set field StaticMACs to given value -func (o *KubeOptions) WithStaticMACs(value []net.HardwareAddr) *KubeOptions { - o.StaticMACs = &value - return o -} - -// GetStaticMACs returns value of field StaticMACs -func (o *KubeOptions) GetStaticMACs() []net.HardwareAddr { - if o.StaticMACs == nil { - var z []net.HardwareAddr - return z - } - return *o.StaticMACs -} - -// WithConfigMaps set field ConfigMaps to given value -func (o *KubeOptions) WithConfigMaps(value []string) *KubeOptions { - o.ConfigMaps = &value - return o -} - -// GetConfigMaps returns value of field ConfigMaps -func (o *KubeOptions) GetConfigMaps() []string { - if o.ConfigMaps == nil { - var z []string - return z - } - return *o.ConfigMaps -} - -// WithLogDriver set field LogDriver to given value -func (o *KubeOptions) WithLogDriver(value string) *KubeOptions { - o.LogDriver = &value - return o -} - -// GetLogDriver returns value of field LogDriver -func (o *KubeOptions) GetLogDriver() string { - if o.LogDriver == nil { - var z string - return z - } - return *o.LogDriver -} - -// WithLogOptions set field LogOptions to given value -func (o *KubeOptions) WithLogOptions(value []string) *KubeOptions { - o.LogOptions = &value - return o -} - -// GetLogOptions returns value of field LogOptions -func (o *KubeOptions) GetLogOptions() []string { - if o.LogOptions == nil { - var z []string - return z - } - return *o.LogOptions -} - -// WithStart set field Start to given value -func (o *KubeOptions) WithStart(value bool) *KubeOptions { - o.Start = &value - return o -} - -// GetStart returns value of field Start -func (o *KubeOptions) GetStart() bool { - if o.Start == nil { - var z bool - return z - } - return *o.Start -} - -// WithUserns set field Userns to given value -func (o *KubeOptions) WithUserns(value string) *KubeOptions { - o.Userns = &value - return o -} - -// GetUserns returns value of field Userns -func (o *KubeOptions) GetUserns() string { - if o.Userns == nil { - var z string - return z - } - return *o.Userns -} diff --git a/pkg/domain/entities/play.go b/pkg/domain/entities/play.go index f1ba21650..35a5d8a4a 100644 --- a/pkg/domain/entities/play.go +++ b/pkg/domain/entities/play.go @@ -90,6 +90,8 @@ type PlayKubeReport struct { PlayKubeTeardown } +type KubePlayReport = PlayKubeReport + // PlayKubeDownOptions are options for tearing down pods type PlayKubeDownOptions struct{} diff --git a/pkg/domain/infra/tunnel/play.go b/pkg/domain/infra/tunnel/play.go index d731a1d6c..ee9195681 100644 --- a/pkg/domain/infra/tunnel/play.go +++ b/pkg/domain/infra/tunnel/play.go @@ -5,12 +5,13 @@ import ( "io" "github.com/containers/image/v5/types" + "github.com/containers/podman/v4/pkg/bindings/kube" "github.com/containers/podman/v4/pkg/bindings/play" "github.com/containers/podman/v4/pkg/domain/entities" ) func (ic *ContainerEngine) PlayKube(ctx context.Context, body io.Reader, opts entities.PlayKubeOptions) (*entities.PlayKubeReport, error) { - options := new(play.KubeOptions).WithAuthfile(opts.Authfile).WithUsername(opts.Username).WithPassword(opts.Password) + options := new(kube.PlayOptions).WithAuthfile(opts.Authfile).WithUsername(opts.Username).WithPassword(opts.Password) options.WithCertDir(opts.CertDir).WithQuiet(opts.Quiet).WithSignaturePolicy(opts.SignaturePolicy).WithConfigMaps(opts.ConfigMaps) options.WithLogDriver(opts.LogDriver).WithNetwork(opts.Networks).WithSeccompProfileRoot(opts.SeccompProfileRoot) options.WithStaticIPs(opts.StaticIPs).WithStaticMACs(opts.StaticMACs) @@ -31,5 +32,5 @@ func (ic *ContainerEngine) PlayKube(ctx context.Context, body io.Reader, opts en } func (ic *ContainerEngine) PlayKubeDown(ctx context.Context, body io.Reader, _ entities.PlayKubeDownOptions) (*entities.PlayKubeReport, error) { - return play.KubeDownWithBody(ic.ClientCtx, body) + return play.DownWithBody(ic.ClientCtx, body) } -- cgit v1.2.3-54-g00ecf