Skip to content

Commit

Permalink
Merge pull request #8363 from AlbanBedel/play-kube-create-only
Browse files Browse the repository at this point in the history
Add an option to control if play kube should start the pod
  • Loading branch information
openshift-merge-robot authored Nov 17, 2020
2 parents 0886fab + 7ab936e commit 770b03a
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 12 deletions.
5 changes: 5 additions & 0 deletions cmd/podman/play/kube.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type playKubeOptionsWrapper struct {

TLSVerifyCLI bool
CredentialsCLI string
StartCLI bool
}

var (
Expand Down Expand Up @@ -68,6 +69,7 @@ func init() {

flags.BoolVarP(&kubeOptions.Quiet, "quiet", "q", false, "Suppress output information when pulling images")
flags.BoolVar(&kubeOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
flags.BoolVar(&kubeOptions.StartCLI, "start", true, "Start the pod after creating it")

authfileFlagName := "authfile"
flags.StringVar(&kubeOptions.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
Expand Down Expand Up @@ -100,6 +102,9 @@ func kube(cmd *cobra.Command, args []string) error {
if cmd.Flags().Changed("tls-verify") {
kubeOptions.SkipTLSVerify = types.NewOptionalBool(!kubeOptions.TLSVerifyCLI)
}
if cmd.Flags().Changed("start") {
kubeOptions.Start = types.NewOptionalBool(kubeOptions.StartCLI)
}
if kubeOptions.Authfile != "" {
if _, err := os.Stat(kubeOptions.Authfile); err != nil {
return err
Expand Down
4 changes: 4 additions & 0 deletions docs/source/markdown/podman-play-kube.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ Suppress output information when pulling images

Directory path for seccomp profiles (default: "/var/lib/kubelet/seccomp"). (Not available for remote commands)

#### **--start**=*true|false*

Start the pod after creating it, set to false to only create it.

#### **--tls-verify**=*true|false*

Require HTTPS and verify certificates when contacting registries (default: true). If explicitly set to true,
Expand Down
5 changes: 5 additions & 0 deletions pkg/api/handlers/libpod/play.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ func PlayKube(w http.ResponseWriter, r *http.Request) {
Network string `schema:"reference"`
TLSVerify bool `schema:"tlsVerify"`
LogDriver string `schema:"logDriver"`
Start bool `schema:"start"`
}{
TLSVerify: true,
Start: true,
}

if err := decoder.Decode(&query, r.URL.Query()); err != nil {
Expand Down Expand Up @@ -73,6 +75,9 @@ func PlayKube(w http.ResponseWriter, r *http.Request) {
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(), tmpfile.Name(), options)
if err != nil {
Expand Down
5 changes: 5 additions & 0 deletions pkg/api/server/register_play.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ func (s *APIServer) registerPlayHandlers(r *mux.Router) error {
// 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: body
// name: request
// description: Kubernetes YAML file.
Expand Down
3 changes: 3 additions & 0 deletions pkg/bindings/play/play.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ func Kube(ctx context.Context, path string, options entities.PlayKubeOptions) (*
if options.SkipTLSVerify != types.OptionalBoolUndefined {
params.Set("tlsVerify", strconv.FormatBool(options.SkipTLSVerify != types.OptionalBoolTrue))
}
if options.Start != types.OptionalBoolUndefined {
params.Set("start", strconv.FormatBool(options.Start == types.OptionalBoolTrue))
}

// TODO: have a global system context we can pass around (1st argument)
header, err := auth.Header(nil, auth.XRegistryAuthHeader, options.Authfile, options.Username, options.Password)
Expand Down
2 changes: 2 additions & 0 deletions pkg/domain/entities/play.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ type PlayKubeOptions struct {
ConfigMaps []string
// LogDriver for the container. For example: journald
LogDriver string
// Start - don't start the pod if false
Start types.OptionalBool
}

// PlayKubePod represents a single pod and associated containers created by play kube
Expand Down
26 changes: 14 additions & 12 deletions pkg/domain/infra/abi/play.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,20 +297,22 @@ func (ic *ContainerEngine) playKubePod(ctx context.Context, podName string, podY
containers = append(containers, ctr)
}

//start the containers
podStartErrors, err := pod.Start(ctx)
if err != nil {
return nil, err
}
if options.Start != types.OptionalBoolFalse {
//start the containers
podStartErrors, err := pod.Start(ctx)
if err != nil {
return nil, err
}

// Previous versions of playkube started containers individually and then
// looked for errors. Because we now use the uber-Pod start call, we should
// iterate the map of possible errors and return one if there is a problem. This
// keeps the behavior the same
// Previous versions of playkube started containers individually and then
// looked for errors. Because we now use the uber-Pod start call, we should
// iterate the map of possible errors and return one if there is a problem. This
// keeps the behavior the same

for _, e := range podStartErrors {
if e != nil {
return nil, e
for _, e := range podStartErrors {
if e != nil {
return nil, e
}
}
}

Expand Down
15 changes: 15 additions & 0 deletions test/e2e/play_kube_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1482,4 +1482,19 @@ MemoryReservation: {{ .HostConfig.MemoryReservation }}`})
Expect(inspect.ExitCode()).To(Equal(0))
Expect(inspect.OutputToString()).To(ContainSubstring("journald"))
})

It("podman play kube test only creating the containers", func() {
pod := getPod()
err := generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())

kube := podmanTest.Podman([]string{"play", "kube", "--start=false", kubeYaml})
kube.WaitWithDefaultTimeout()
Expect(kube.ExitCode()).To(Equal(0))

inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "{{ .State.Running }}"})
inspect.WaitWithDefaultTimeout()
Expect(inspect.ExitCode()).To(Equal(0))
Expect(inspect.OutputToString()).To(Equal("false"))
})
})

0 comments on commit 770b03a

Please sign in to comment.