mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-09-06 23:57:48 +00:00
Add the abilitiy to deploy the generated kube yaml to a kubernetes cluster with the podman kube apply command. Add support to directly apply containers, pods, or volumes by passing in their names or ids to the command. Use the kubernetes API endpoints and http requests to connect to the cluster and deploy the various kubernetes object kinds. Signed-off-by: Urvashi Mohnani <umohnani@redhat.com>
111 lines
3.5 KiB
Go
111 lines
3.5 KiB
Go
package kube
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/containers/common/pkg/completion"
|
|
"github.com/containers/podman/v4/cmd/podman/common"
|
|
"github.com/containers/podman/v4/cmd/podman/registry"
|
|
"github.com/containers/podman/v4/cmd/podman/utils"
|
|
"github.com/containers/podman/v4/pkg/domain/entities"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
applyOptions = entities.ApplyOptions{}
|
|
applyDescription = `Command applies a podman container, pod, volume, or kube yaml to a Kubernetes cluster when a kubeconfig file is given.`
|
|
|
|
applyCmd = &cobra.Command{
|
|
Use: "apply [options] [CONTAINER...|POD...|VOLUME...]",
|
|
Short: "Deploy a podman container, pod, volume, or Kubernetes yaml to a Kubernetes cluster",
|
|
Long: applyDescription,
|
|
RunE: apply,
|
|
ValidArgsFunction: common.AutocompleteForKube,
|
|
Example: `podman kube apply ctrName volName
|
|
podman kube apply --namespace project -f fileName`,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
|
Command: applyCmd,
|
|
Parent: kubeCmd,
|
|
})
|
|
applyFlags(applyCmd)
|
|
}
|
|
|
|
func applyFlags(cmd *cobra.Command) {
|
|
flags := cmd.Flags()
|
|
flags.SetNormalizeFunc(utils.AliasFlags)
|
|
|
|
kubeconfigFlagName := "kubeconfig"
|
|
flags.StringVarP(&applyOptions.Kubeconfig, kubeconfigFlagName, "k", os.Getenv("KUBECONFIG"), "Path to the kubeconfig file for the Kubernetes cluster")
|
|
_ = cmd.RegisterFlagCompletionFunc(kubeconfigFlagName, completion.AutocompleteDefault)
|
|
|
|
namespaceFlagName := "ns"
|
|
flags.StringVarP(&applyOptions.Namespace, namespaceFlagName, "", "", "The namespace to deploy the workload to on the Kubernetes cluster")
|
|
_ = cmd.RegisterFlagCompletionFunc(namespaceFlagName, completion.AutocompleteNone)
|
|
|
|
caCertFileFlagName := "ca-cert-file"
|
|
flags.StringVarP(&applyOptions.CACertFile, caCertFileFlagName, "", "", "Path to the CA cert file for the Kubernetes cluster.")
|
|
_ = cmd.RegisterFlagCompletionFunc(caCertFileFlagName, completion.AutocompleteDefault)
|
|
|
|
fileFlagName := "file"
|
|
flags.StringVarP(&applyOptions.File, fileFlagName, "f", "", "Path to the Kubernetes yaml file to deploy.")
|
|
_ = cmd.RegisterFlagCompletionFunc(fileFlagName, completion.AutocompleteDefault)
|
|
|
|
serviceFlagName := "service"
|
|
flags.BoolVarP(&applyOptions.Service, serviceFlagName, "s", false, "Create a service object for the container being deployed.")
|
|
}
|
|
|
|
func apply(cmd *cobra.Command, args []string) error {
|
|
if cmd.Flags().Changed("file") && cmd.Flags().Changed("service") {
|
|
return errors.New("cannot set --service and --file at the same time")
|
|
}
|
|
|
|
kubeconfig, err := cmd.Flags().GetString("kubeconfig")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if kubeconfig == "" {
|
|
return errors.New("kubeconfig not given, unable to connect to cluster")
|
|
}
|
|
|
|
var reader io.Reader
|
|
if cmd.Flags().Changed("file") {
|
|
yamlFile := applyOptions.File
|
|
if yamlFile == "-" {
|
|
yamlFile = os.Stdin.Name()
|
|
}
|
|
|
|
f, err := os.Open(yamlFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
reader = f
|
|
} else {
|
|
generateOptions.Service = applyOptions.Service
|
|
report, err := registry.ContainerEngine().GenerateKube(registry.GetContext(), args, generateOptions)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if r, ok := report.Reader.(io.ReadCloser); ok {
|
|
defer r.Close()
|
|
}
|
|
reader = report.Reader
|
|
}
|
|
|
|
fmt.Println("Deploying to cluster...")
|
|
|
|
if err = registry.ContainerEngine().KubeApply(registry.GetContext(), reader, applyOptions); err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Println("Successfully deployed workloads to cluster!")
|
|
|
|
return nil
|
|
}
|