Merge pull request #1243 from gtardif/Kube_name_clash

Prefix kube resource with compose project name to avoid name clashes between projects.
This commit is contained in:
Guillaume Tardif 2021-02-04 15:30:23 +01:00 committed by GitHub
commit caec924532
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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 { for _, service := range project.Services {
svcObject := mapToService(project, service) svcObject := mapToService(project, service)
if svcObject != nil { if svcObject != nil {
objects[fmt.Sprintf("%s-service.yaml", service.Name)] = svcObject objects[fmt.Sprintf("%s-service.yaml", getProjectServiceName(project, service))] = svcObject
} else { } else {
log.Println("Missing port mapping from service config.") log.Println("Missing port mapping from service config.")
} }
@ -55,13 +55,13 @@ func MapToKubernetesObjects(project *types.Project) (map[string]runtime.Object,
if err != nil { if err != nil {
return nil, err return nil, err
} }
objects[fmt.Sprintf("%s-daemonset.yaml", service.Name)] = daemonset objects[fmt.Sprintf("%s-daemonset.yaml", getProjectServiceName(project, service))] = daemonset
} else { } else {
deployment, err := mapToDeployment(project, service) deployment, err := mapToDeployment(project, service)
if err != nil { if err != nil {
return nil, err 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 { for _, vol := range service.Volumes {
if vol.Type == "volume" { if vol.Type == "volume" {
@ -98,7 +98,7 @@ func mapToService(project *types.Project, service types.ServiceConfig) *core.Ser
APIVersion: "v1", APIVersion: "v1",
}, },
ObjectMeta: meta.ObjectMeta{ ObjectMeta: meta.ObjectMeta{
Name: service.Name, Name: getProjectServiceName(project, service),
}, },
Spec: core.ServiceSpec{ Spec: core.ServiceSpec{
ClusterIP: clusterIP, ClusterIP: clusterIP,
@ -126,7 +126,7 @@ func mapToDeployment(project *types.Project, service types.ServiceConfig) (*apps
APIVersion: "apps/v1", APIVersion: "apps/v1",
}, },
ObjectMeta: meta.ObjectMeta{ ObjectMeta: meta.ObjectMeta{
Name: service.Name, Name: getProjectServiceName(project, service),
Labels: labels, Labels: labels,
}, },
Spec: apps.DeploymentSpec{ Spec: apps.DeploymentSpec{
@ -138,6 +138,10 @@ func mapToDeployment(project *types.Project, service types.ServiceConfig) (*apps
}, nil }, 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 { func selectorLabels(projectName string, serviceName string) map[string]string {
return map[string]string{ return map[string]string{
compose.ProjectTag: projectName, compose.ProjectTag: projectName,
@ -154,7 +158,7 @@ func mapToDaemonset(project *types.Project, service types.ServiceConfig) (*apps.
return &apps.DaemonSet{ return &apps.DaemonSet{
ObjectMeta: meta.ObjectMeta{ ObjectMeta: meta.ObjectMeta{
Name: service.Name, Name: getProjectServiceName(project, service),
Labels: labels, Labels: labels,
}, },
Spec: apps.DaemonSetSpec{ Spec: apps.DaemonSetSpec{

View File

@ -29,7 +29,7 @@ import (
) )
func TestServiceWithExposedPort(t *testing.T) { func TestServiceWithExposedPort(t *testing.T) {
model, err := loadYAML(` model, err := loadYAML("myproject", `
services: services:
nginx: nginx:
image: nginx image: nginx
@ -45,10 +45,10 @@ services:
APIVersion: "v1", APIVersion: "v1",
}, },
ObjectMeta: meta.ObjectMeta{ ObjectMeta: meta.ObjectMeta{
Name: "nginx", Name: "myproject-nginx",
}, },
Spec: core.ServiceSpec{ 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{ Ports: []core.ServicePort{
{ {
Name: "80-tcp", Name: "80-tcp",
@ -62,7 +62,7 @@ services:
} }
func TestServiceWithoutExposedPort(t *testing.T) { func TestServiceWithoutExposedPort(t *testing.T) {
model, err := loadYAML(` model, err := loadYAML("myproject", `
services: services:
nginx: nginx:
image: nginx image: nginx
@ -76,10 +76,10 @@ services:
APIVersion: "v1", APIVersion: "v1",
}, },
ObjectMeta: meta.ObjectMeta{ ObjectMeta: meta.ObjectMeta{
Name: "nginx", Name: "myproject-nginx",
}, },
Spec: core.ServiceSpec{ 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", ClusterIP: "None",
Ports: []core.ServicePort{}, Ports: []core.ServicePort{},
Type: core.ServiceTypeClusterIP, Type: core.ServiceTypeClusterIP,

View File

@ -31,7 +31,7 @@ import (
"k8s.io/apimachinery/pkg/api/resource" "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)) dict, err := loader.ParseYAML([]byte(yaml))
if err != nil { if err != nil {
return nil, err return nil, err
@ -51,7 +51,12 @@ func loadYAML(yaml string) (*types.Project, error) {
ConfigFiles: configs, ConfigFiles: configs,
Environment: nil, 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 { 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) { func podTemplateWithError(yaml string) (apiv1.PodTemplateSpec, error) {
model, err := loadYAML(yaml) model, err := loadYAML("myproject", yaml)
if err != nil { if err != nil {
return apiv1.PodTemplateSpec{}, err return apiv1.PodTemplateSpec{}, err
} }