Prefix kube resource with compose project name to avoid name clashes between projects.

Kube resource name follow the form `<PROJECT>-<SERVICE>`. (“_” are not allowed there, using “-“. Project names can include “-“, so we can’t parse back to retrieve project and service names, we MUST rely on labels.

Signed-off-by: Guillaume Tardif <guillaume.tardif@gmail.com>
This commit is contained in:
Guillaume Tardif 2021-02-04 13:37:29 +01:00
parent 12dcf4cc37
commit 6b61902a23
3 changed files with 24 additions and 15 deletions

View File

@ -45,7 +45,7 @@ func MapToKubernetesObjects(project *types.Project) (map[string]runtime.Object,
for _, service := range project.Services {
svcObject := mapToService(project, service)
if svcObject != nil {
objects[fmt.Sprintf("%s-service.yaml", service.Name)] = svcObject
objects[fmt.Sprintf("%s-service.yaml", getProjectServiceName(project, service))] = svcObject
} else {
log.Println("Missing port mapping from service config.")
}
@ -55,13 +55,13 @@ func MapToKubernetesObjects(project *types.Project) (map[string]runtime.Object,
if err != nil {
return nil, err
}
objects[fmt.Sprintf("%s-daemonset.yaml", service.Name)] = daemonset
objects[fmt.Sprintf("%s-daemonset.yaml", getProjectServiceName(project, service))] = daemonset
} else {
deployment, err := mapToDeployment(project, service)
if err != nil {
return nil, err
}
objects[fmt.Sprintf("%s-deployment.yaml", service.Name)] = deployment
objects[fmt.Sprintf("%s-deployment.yaml", getProjectServiceName(project, service))] = deployment
}
for _, vol := range service.Volumes {
if vol.Type == "volume" {
@ -98,7 +98,7 @@ func mapToService(project *types.Project, service types.ServiceConfig) *core.Ser
APIVersion: "v1",
},
ObjectMeta: meta.ObjectMeta{
Name: service.Name,
Name: getProjectServiceName(project, service),
},
Spec: core.ServiceSpec{
ClusterIP: clusterIP,
@ -126,7 +126,7 @@ func mapToDeployment(project *types.Project, service types.ServiceConfig) (*apps
APIVersion: "apps/v1",
},
ObjectMeta: meta.ObjectMeta{
Name: service.Name,
Name: getProjectServiceName(project, service),
Labels: labels,
},
Spec: apps.DeploymentSpec{
@ -138,6 +138,10 @@ func mapToDeployment(project *types.Project, service types.ServiceConfig) (*apps
}, nil
}
func getProjectServiceName(project *types.Project, service types.ServiceConfig) string {
return fmt.Sprintf("%s-%s", project.Name, service.Name)
}
func selectorLabels(projectName string, serviceName string) map[string]string {
return map[string]string{
compose.ProjectTag: projectName,
@ -154,7 +158,7 @@ func mapToDaemonset(project *types.Project, service types.ServiceConfig) (*apps.
return &apps.DaemonSet{
ObjectMeta: meta.ObjectMeta{
Name: service.Name,
Name: getProjectServiceName(project, service),
Labels: labels,
},
Spec: apps.DaemonSetSpec{

View File

@ -29,7 +29,7 @@ import (
)
func TestServiceWithExposedPort(t *testing.T) {
model, err := loadYAML(`
model, err := loadYAML("myproject", `
services:
nginx:
image: nginx
@ -45,10 +45,10 @@ services:
APIVersion: "v1",
},
ObjectMeta: meta.ObjectMeta{
Name: "nginx",
Name: "myproject-nginx",
},
Spec: core.ServiceSpec{
Selector: map[string]string{"com.docker.compose.service": "nginx", "com.docker.compose.project": ""},
Selector: map[string]string{"com.docker.compose.service": "nginx", "com.docker.compose.project": "myproject"},
Ports: []core.ServicePort{
{
Name: "80-tcp",
@ -62,7 +62,7 @@ services:
}
func TestServiceWithoutExposedPort(t *testing.T) {
model, err := loadYAML(`
model, err := loadYAML("myproject", `
services:
nginx:
image: nginx
@ -76,10 +76,10 @@ services:
APIVersion: "v1",
},
ObjectMeta: meta.ObjectMeta{
Name: "nginx",
Name: "myproject-nginx",
},
Spec: core.ServiceSpec{
Selector: map[string]string{"com.docker.compose.service": "nginx", "com.docker.compose.project": ""},
Selector: map[string]string{"com.docker.compose.service": "nginx", "com.docker.compose.project": "myproject"},
ClusterIP: "None",
Ports: []core.ServicePort{},
Type: core.ServiceTypeClusterIP,

View File

@ -31,7 +31,7 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
)
func loadYAML(yaml string) (*types.Project, error) {
func loadYAML(projectName string, yaml string) (*types.Project, error) {
dict, err := loader.ParseYAML([]byte(yaml))
if err != nil {
return nil, err
@ -51,7 +51,12 @@ func loadYAML(yaml string) (*types.Project, error) {
ConfigFiles: configs,
Environment: nil,
}
return loader.Load(config)
project, err := loader.Load(config)
if err != nil {
return nil, err
}
project.Name = projectName
return project, nil
}
func podTemplate(t *testing.T, yaml string) apiv1.PodTemplateSpec {
@ -61,7 +66,7 @@ func podTemplate(t *testing.T, yaml string) apiv1.PodTemplateSpec {
}
func podTemplateWithError(yaml string) (apiv1.PodTemplateSpec, error) {
model, err := loadYAML(yaml)
model, err := loadYAML("myproject", yaml)
if err != nil {
return apiv1.PodTemplateSpec{}, err
}