Read kube_generate_type from containers.conf

Use the kube_generate_type from the containers.conf as
the default value for the --type flag for kube generate.
Override the default when userexplicitly sets the --type
flag.

Signed-off-by: Urvashi Mohnani <umohnani@redhat.com>
This commit is contained in:
Urvashi Mohnani
2023-04-06 14:04:37 -04:00
parent 1f2775cbdc
commit 1bf5bdc689
4 changed files with 63 additions and 19 deletions

View File

@ -4,14 +4,12 @@ import (
"fmt"
"io"
"os"
"strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v4/cmd/podman/common"
"github.com/containers/podman/v4/cmd/podman/generate"
"github.com/containers/podman/v4/cmd/podman/registry"
"github.com/containers/podman/v4/cmd/podman/utils"
"github.com/containers/podman/v4/libpod/define"
"github.com/containers/podman/v4/pkg/domain/entities"
"github.com/spf13/cobra"
)
@ -53,16 +51,16 @@ func init() {
Command: generateKubeCmd,
Parent: generate.GenerateCmd,
})
generateFlags(generateKubeCmd)
generateFlags(generateKubeCmd, registry.PodmanConfig())
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: kubeGenerateCmd,
Parent: kubeCmd,
})
generateFlags(kubeGenerateCmd)
generateFlags(kubeGenerateCmd, registry.PodmanConfig())
}
func generateFlags(cmd *cobra.Command) {
func generateFlags(cmd *cobra.Command, podmanConfig *entities.PodmanConfig) {
flags := cmd.Flags()
flags.BoolVarP(&generateOptions.Service, "service", "s", false, "Generate YAML for a Kubernetes service object")
@ -70,9 +68,13 @@ func generateFlags(cmd *cobra.Command) {
flags.StringVarP(&generateFile, filenameFlagName, "f", "", "Write output to the specified path")
_ = cmd.RegisterFlagCompletionFunc(filenameFlagName, completion.AutocompleteDefault)
// TODO: default should be configurable in containers.conf
typeFlagName := "type"
flags.StringVarP(&generateOptions.Type, typeFlagName, "t", define.K8sKindPod, "Generate YAML for the given Kubernetes kind")
// If remote, don't read the client's containers.conf file
defaultGenerateType := ""
if !registry.IsRemote() {
defaultGenerateType = podmanConfig.ContainersConfDefaultsRO.Engine.KubeGenerateType
}
flags.StringVarP(&generateOptions.Type, typeFlagName, "t", defaultGenerateType, "Generate YAML for the given Kubernetes kind")
_ = cmd.RegisterFlagCompletionFunc(typeFlagName, completion.AutocompleteNone)
replicasFlagName := "replicas"
@ -83,15 +85,6 @@ func generateFlags(cmd *cobra.Command) {
}
func generateKube(cmd *cobra.Command, args []string) error {
typeVal, err := cmd.Flags().GetString("type")
if err != nil {
return err
}
typeVal = strings.ToLower(typeVal)
if typeVal != define.K8sKindPod && typeVal != define.K8sKindDeployment {
return fmt.Errorf("invalid type given, only supported types are pod and deployment")
}
report, err := registry.ContainerEngine().GenerateKube(registry.GetContext(), args, generateOptions)
if err != nil {
return err

View File

@ -5,7 +5,6 @@ import (
"net/http"
"github.com/containers/podman/v4/libpod"
"github.com/containers/podman/v4/libpod/define"
"github.com/containers/podman/v4/pkg/api/handlers/utils"
api "github.com/containers/podman/v4/pkg/api/types"
"github.com/containers/podman/v4/pkg/domain/entities"
@ -96,7 +95,6 @@ func GenerateKube(w http.ResponseWriter, r *http.Request) {
Replicas int32 `schema:"replicas"`
}{
// Defaults would go here.
Type: define.K8sKindPod,
Replicas: 1,
}
@ -105,8 +103,19 @@ func GenerateKube(w http.ResponseWriter, r *http.Request) {
return
}
// Read the default kubeGenerateType from containers.conf it the user doesn't specify it
generateType := query.Type
if generateType == "" {
config, err := runtime.GetConfigNoCopy()
if err != nil {
utils.Error(w, http.StatusInternalServerError, err)
return
}
generateType = config.Engine.KubeGenerateType
}
containerEngine := abi.ContainerEngine{Libpod: runtime}
options := entities.GenerateKubeOptions{Service: query.Service, Type: query.Type, Replicas: query.Replicas}
options := entities.GenerateKubeOptions{Service: query.Service, Type: generateType, Replicas: query.Replicas}
report, err := containerEngine.GenerateKube(r.Context(), query.Names, options)
if err != nil {
utils.Error(w, http.StatusInternalServerError, fmt.Errorf("generating YAML: %w", err))

View File

@ -62,6 +62,7 @@ no_hosts=true
network_cmd_options=["allow_host_loopback=true"]
service_timeout=1234
kube_generate_type="deployment"
volume_plugin_timeout = 15

View File

@ -135,4 +135,45 @@ status | = | null
run_podman rmi $(pause_image)
}
@test "podman kube generate - deployment" {
skip_if_remote "containersconf needs to be set on server side"
local pname=p$(random_string 15)
local cname1=c1$(random_string 15)
local cname2=c2$(random_string 15)
run_podman pod create --name $pname
run_podman container create --name $cname1 --pod $pname $IMAGE top
run_podman container create --name $cname2 --pod $pname $IMAGE bottom
containersconf=$PODMAN_TMPDIR/containers.conf
cat >$containersconf <<EOF
[engine]
kube_generate_type="deployment"
EOF
CONTAINERS_CONF_OVERRIDE=$containersconf run_podman kube generate $pname
json=$(yaml2json <<<"$output")
# For debugging purposes in the event we regress, we can see the generate output to know what went wrong
jq . <<<"$json"
# See container test above for description of this table
expect="
apiVersion | = | apps/v1
kind | = | Deployment
metadata.creationTimestamp | =~ | [0-9T:-]\\+Z
metadata.labels.app | = | ${pname}
metadata.name | = | ${pname}-deployment
"
while read key op expect; do
actual=$(jq -r -c ".$key" <<<"$json")
assert "$actual" $op "$expect" ".$key"
done < <(parse_table "$expect")
run_podman rm $cname1 $cname2
run_podman pod rm $pname
run_podman rmi $(pause_image)
}
# vim: filetype=sh