forked from LaconicNetwork/kompose
customize the resource name individually via labels kompose.service.name_override
Signed-off-by: jose luis <2064537+sosan@users.noreply.github.com>
This commit is contained in:
parent
497809c81c
commit
7b6888edd1
@ -464,7 +464,7 @@ func dockerComposeToKomposeMapping(composeObject *types.Project) (kobject.Kompos
|
|||||||
for _, composeServiceConfig := range composeObject.Services {
|
for _, composeServiceConfig := range composeObject.Services {
|
||||||
// Standard import
|
// Standard import
|
||||||
// No need to modify before importation
|
// No need to modify before importation
|
||||||
name := strings.ToLower(composeServiceConfig.Name)
|
name := parseResourceName(composeServiceConfig.Name, composeServiceConfig.Labels)
|
||||||
serviceConfig := kobject.ServiceConfig{}
|
serviceConfig := kobject.ServiceConfig{}
|
||||||
serviceConfig.Name = name
|
serviceConfig.Name = name
|
||||||
serviceConfig.Image = composeServiceConfig.Image
|
serviceConfig.Image = composeServiceConfig.Image
|
||||||
@ -792,6 +792,10 @@ func parseKomposeLabels(labels map[string]string, serviceConfig *kobject.Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
serviceConfig.CronJobBackoffLimit = cronJobBackoffLimit
|
serviceConfig.CronJobBackoffLimit = cronJobBackoffLimit
|
||||||
|
case LabelNameOverride:
|
||||||
|
// generate a valid k8s resource name
|
||||||
|
normalizedName := normalizeServiceNames(value)
|
||||||
|
serviceConfig.Name = normalizedName
|
||||||
default:
|
default:
|
||||||
serviceConfig.Labels[key] = value
|
serviceConfig.Labels[key] = value
|
||||||
}
|
}
|
||||||
|
|||||||
@ -601,3 +601,113 @@ func checkConstraints(t *testing.T, caseName string, output, expected map[string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_parseKomposeLabels(t *testing.T) {
|
||||||
|
service := kobject.ServiceConfig{
|
||||||
|
Name: "name",
|
||||||
|
ContainerName: "containername",
|
||||||
|
Image: "image",
|
||||||
|
Labels: nil,
|
||||||
|
Annotations: map[string]string{"abc": "def"},
|
||||||
|
Restart: "always",
|
||||||
|
}
|
||||||
|
|
||||||
|
type args struct {
|
||||||
|
labels types.Labels
|
||||||
|
serviceConfig *kobject.ServiceConfig
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
expected *kobject.ServiceConfig
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "override with overriding",
|
||||||
|
args: args{
|
||||||
|
labels: types.Labels{
|
||||||
|
LabelNameOverride: "overriding",
|
||||||
|
},
|
||||||
|
serviceConfig: &service,
|
||||||
|
},
|
||||||
|
expected: &kobject.ServiceConfig{
|
||||||
|
Name: "overriding",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "override",
|
||||||
|
args: args{
|
||||||
|
labels: types.Labels{
|
||||||
|
LabelNameOverride: "overriding-resource-name",
|
||||||
|
},
|
||||||
|
serviceConfig: &service,
|
||||||
|
},
|
||||||
|
expected: &kobject.ServiceConfig{
|
||||||
|
Name: "overriding-resource-name",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "hyphen in the middle",
|
||||||
|
args: args{
|
||||||
|
labels: types.Labels{
|
||||||
|
LabelNameOverride: "overriding_resource-name",
|
||||||
|
},
|
||||||
|
serviceConfig: &service,
|
||||||
|
},
|
||||||
|
expected: &kobject.ServiceConfig{
|
||||||
|
Name: "overriding-resource-name",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "hyphen in the middle with mays",
|
||||||
|
args: args{
|
||||||
|
labels: types.Labels{
|
||||||
|
LabelNameOverride: "OVERRIDING_RESOURCE-NAME",
|
||||||
|
},
|
||||||
|
serviceConfig: &service,
|
||||||
|
},
|
||||||
|
expected: &kobject.ServiceConfig{
|
||||||
|
Name: "overriding-resource-name",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// This is a corner case that is expected to fail because
|
||||||
|
// it does not account for scenarios where the string
|
||||||
|
// starts or ends with a '-' or any other character
|
||||||
|
// this test will fail with current tests
|
||||||
|
// {
|
||||||
|
// name: "Add a prefix with a dash at the start and end, with a hyphen in the middle.",
|
||||||
|
// args: args{
|
||||||
|
// labels: types.Labels{
|
||||||
|
// LabelNameOverride: "-OVERRIDING_RESOURCE-NAME-",
|
||||||
|
// },
|
||||||
|
// serviceConfig: &service,
|
||||||
|
// },
|
||||||
|
// expected: &kobject.ServiceConfig{
|
||||||
|
// Name: "overriding-resource-name",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// not fail
|
||||||
|
{
|
||||||
|
name: "Add a prefix with a dash at the start and end, with a hyphen in the middle.",
|
||||||
|
args: args{
|
||||||
|
labels: types.Labels{
|
||||||
|
LabelNameOverride: "-OVERRIDING_RESOURCE-NAME-",
|
||||||
|
},
|
||||||
|
serviceConfig: &service,
|
||||||
|
},
|
||||||
|
expected: &kobject.ServiceConfig{
|
||||||
|
Name: "-overriding-resource-name-",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if err := parseKomposeLabels(tt.args.labels, tt.args.serviceConfig); err != nil {
|
||||||
|
t.Errorf("parseKomposeLabels(): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if tt.expected.Name != tt.args.serviceConfig.Name {
|
||||||
|
t.Errorf("Name are not equal, expected: %v, output: %v", tt.expected.Name, tt.args.serviceConfig.Name)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/compose-spec/compose-go/types"
|
||||||
"github.com/kubernetes/kompose/pkg/kobject"
|
"github.com/kubernetes/kompose/pkg/kobject"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
@ -87,6 +88,8 @@ const (
|
|||||||
LabelCronJobConcurrencyPolicy = "kompose.cronjob.concurrency_policy"
|
LabelCronJobConcurrencyPolicy = "kompose.cronjob.concurrency_policy"
|
||||||
// LabelCronJobBackoffLimit defines the job backoff limit
|
// LabelCronJobBackoffLimit defines the job backoff limit
|
||||||
LabelCronJobBackoffLimit = "kompose.cronjob.backoff_limit"
|
LabelCronJobBackoffLimit = "kompose.cronjob.backoff_limit"
|
||||||
|
// LabelNameOverride defines the override resource name
|
||||||
|
LabelNameOverride = "kompose.service.name_override"
|
||||||
)
|
)
|
||||||
|
|
||||||
// load environment variables from compose file
|
// load environment variables from compose file
|
||||||
@ -194,3 +197,15 @@ func ReadFile(fileName string) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
return os.ReadFile(fileName)
|
return os.ReadFile(fileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Choose normalized name from resource in case exist LabelNameOverride
|
||||||
|
// from label
|
||||||
|
func parseResourceName(resourceName string, labels types.Labels) string {
|
||||||
|
// Opted to use normalizeContainerNames over normalizeServiceNames
|
||||||
|
// as in tests, normalization is only to lowercase.
|
||||||
|
normalizedName := normalizeContainerNames(resourceName)
|
||||||
|
if labelValue, exist := labels[LabelNameOverride]; exist {
|
||||||
|
normalizedName = normalizeContainerNames(labelValue)
|
||||||
|
}
|
||||||
|
return normalizedName
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user