Merge pull request #1709 from axel7083/main

feat: adding support for --profile cmd option
This commit is contained in:
Kubernetes Prow Robot 2023-09-26 06:45:26 -07:00 committed by GitHub
commit ddd5f33745
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 122 additions and 5 deletions

View File

@ -33,6 +33,7 @@ func (k *Kompose) Convert(options ConvertOptions) ([]runtime.Object, error) {
PushImageRegistry: options.PushImageRegistry,
CreateDeploymentConfig: k.createDeploymentConfig(options),
EmptyVols: false,
Profiles: options.Profiles,
Volumes: *options.VolumeType,
PVCRequestSize: options.PvcRequestSize,
InsecureRepository: k.insecureRepository(options),

View File

@ -2,6 +2,8 @@ package client
import (
"fmt"
v1 "k8s.io/api/core/v1"
"sort"
"testing"
"gotest.tools/v3/assert"
@ -69,7 +71,7 @@ func TestConvertWithDefaultOptions(t *testing.T) {
client, err := NewClient(WithErrorOnWarning())
assert.Check(t, is.Equal(err, nil))
objects, err := client.Convert(ConvertOptions{
OutFile: "./testdata/generated/",
ToStdout: true,
InputFiles: []string{
"./testdata/docker-compose.yaml",
},
@ -81,3 +83,89 @@ func TestConvertWithDefaultOptions(t *testing.T) {
}
}
}
func TestConvertWithProfiles(t *testing.T) {
client, err := NewClient(WithErrorOnWarning())
assert.Check(t, is.Equal(err, nil))
type Want struct {
deploymentsNames []string
servicesNames []string
}
tests := []struct {
name string
options ConvertOptions
want Want
}{
{
name: "No profiles provided",
options: ConvertOptions{
ToStdout: true,
InputFiles: []string{
"./testdata/docker-compose-profiles.yaml",
},
},
want: Want{
deploymentsNames: nil,
servicesNames: nil,
},
},
{
name: "All profiles provided",
options: ConvertOptions{
ToStdout: true,
InputFiles: []string{
"./testdata/docker-compose-profiles.yaml",
},
Profiles: []string{"hello", "world"},
},
want: Want{
deploymentsNames: []string{"backend", "frontend", "database"},
servicesNames: []string{"backend", "frontend", "database"},
},
},
{
name: "One profile only",
options: ConvertOptions{
ToStdout: true,
InputFiles: []string{
"./testdata/docker-compose-profiles.yaml",
},
Profiles: []string{"hello"},
},
want: Want{
deploymentsNames: []string{"backend", "frontend"},
servicesNames: []string{"backend", "frontend"},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
objects, err := client.Convert(tt.options)
assert.Check(t, is.Equal(err, nil))
sort.Strings(tt.want.deploymentsNames)
sort.Strings(tt.want.servicesNames)
var deploymentsNames []string
var servicesNames []string
for _, object := range objects {
if deployment, ok := object.(*appsv1.Deployment); ok {
deploymentsNames = append(deploymentsNames, deployment.Name)
}
if service, ok := object.(*v1.Service); ok {
servicesNames = append(servicesNames, service.Name)
}
}
sort.Strings(deploymentsNames)
sort.Strings(servicesNames)
assert.Check(t, is.DeepEqual(deploymentsNames, tt.want.deploymentsNames))
assert.Check(t, is.DeepEqual(servicesNames, tt.want.servicesNames))
})
}
}

View File

@ -0,0 +1,17 @@
version: '3'
services:
backend:
image: dummy:tag
profiles: ['hello', 'world']
ports:
- "80:80"
frontend:
image: dummy:tag
profiles: [ 'hello' ]
ports:
- "80:80"
database:
image: dummy:tag
profiles: [ 'world' ]
ports:
- "80:80"

View File

@ -44,6 +44,7 @@ type ConvertOptions struct {
PvcRequestSize string
WithKomposeAnnotations *bool
InputFiles []string
Profiles []string
Provider
GenerateNetworkPolicies bool
}

View File

@ -46,6 +46,7 @@ var (
ConvertDeploymentConfig bool
ConvertReplicas int
ConvertController string
ConvertProfiles []string
ConvertPushImage bool
ConvertNamespace string
ConvertPushImageRegistry string
@ -115,6 +116,7 @@ var convertCmd = &cobra.Command{
IsReplicaSetFlag: cmd.Flags().Lookup("replicas").Changed,
IsDeploymentConfigFlag: cmd.Flags().Lookup("deployment-config").Changed,
YAMLIndent: ConvertYAMLIndent,
Profiles: ConvertProfiles,
WithKomposeAnnotation: WithKomposeAnnotation,
MultipleContainerMode: MultipleContainerMode,
ServiceGroupMode: ServiceGroupMode,
@ -199,6 +201,8 @@ func init() {
convertCmd.Flags().IntVar(&ConvertYAMLIndent, "indent", 2, "Spaces length to indent generated yaml files")
convertCmd.Flags().StringArrayVar(&ConvertProfiles, "profile", []string{}, `Specify the profile to use, can use multiple profiles`)
// In order to 'separate' both OpenShift and Kubernetes only flags. A custom help page is created
customHelp := `Usage:{{if .Runnable}}
{{if .HasAvailableFlags}}{{appendIfNotPresent .UseLine "[flags]"}}{{else}}{{.UseLine}}{{end}}{{end}}{{if .HasAvailableSubCommands}}

View File

@ -217,7 +217,7 @@ func Convert(opt kobject.ConvertOptions) ([]runtime.Object, error) {
komposeObject := kobject.KomposeObject{
ServiceConfigs: make(map[string]kobject.ServiceConfig),
}
komposeObject, err = l.LoadFile(opt.InputFiles)
komposeObject, err = l.LoadFile(opt.InputFiles, opt.Profiles)
if err != nil {
log.Fatalf(err.Error())
}

View File

@ -53,6 +53,7 @@ type ConvertOptions struct {
BuildRepo string
BuildBranch string
Build string
Profiles []string
PushImage bool
PushImageRegistry string
CreateChart bool

View File

@ -149,14 +149,19 @@ func checkUnsupportedKey(composeProject *types.Project) []string {
}
// LoadFile loads a compose file into KomposeObject
func (c *Compose) LoadFile(files []string) (kobject.KomposeObject, error) {
func (c *Compose) LoadFile(files []string, profiles []string) (kobject.KomposeObject, error) {
// Gather the working directory
workingDir, err := getComposeFileDir(files)
if err != nil {
return kobject.KomposeObject{}, err
}
projectOptions, err := cli.NewProjectOptions(files, cli.WithOsEnv, cli.WithWorkingDirectory(workingDir), cli.WithInterpolation(true))
projectOptions, err := cli.NewProjectOptions(
files, cli.WithOsEnv,
cli.WithWorkingDirectory(workingDir),
cli.WithInterpolation(true),
cli.WithProfiles(profiles),
)
if err != nil {
return kobject.KomposeObject{}, errors.Wrap(err, "Unable to create compose options")
}

View File

@ -25,7 +25,7 @@ import (
// Loader interface defines loader that loads files and converts it to kobject representation
type Loader interface {
LoadFile(files []string) (kobject.KomposeObject, error)
LoadFile(files []string, profiles []string) (kobject.KomposeObject, error)
///Name() string
}