From 614a1df5ba543cc930154bf8ff38c310713605e1 Mon Sep 17 00:00:00 2001 From: Patrice Ferlet Date: Tue, 23 Sep 2025 12:30:43 +0200 Subject: [PATCH] fix(dependson): Fixes how depends-on are managed - depends-on were not renamed - static files were not well managed - droping depends-on deployment to fast fixes #174 and #173 --- internal/generator/converter.go | 2 +- internal/generator/deployment.go | 14 ++++---------- internal/generator/generator.go | 27 ++++++++++++++++++++++----- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/internal/generator/converter.go b/internal/generator/converter.go index 6526b0f..1bc9d3f 100644 --- a/internal/generator/converter.go +++ b/internal/generator/converter.go @@ -130,7 +130,7 @@ func Convert(config ConvertOptions, dockerComposeFile ...string) error { // parse the compose files project, err := parser.Parse(config.Profiles, config.EnvFiles, dockerComposeFile...) if err != nil { - fmt.Println(err) + logger.Failure("Cannot parse compose files", err.Error()) return err } diff --git a/internal/generator/deployment.go b/internal/generator/deployment.go index a1fc677..3d079bd 100644 --- a/internal/generator/deployment.go +++ b/internal/generator/deployment.go @@ -208,15 +208,8 @@ func (d *Deployment) AddVolumes(service types.ServiceConfig, appName string) { } } - isSamePod := false - if v, ok := service.Labels[labels.LabelSamePod]; !ok { - isSamePod = false - } else { - isSamePod = v != "" - } - for _, volume := range service.Volumes { - d.bindVolumes(volume, isSamePod, tobind, service, appName) + d.bindVolumes(volume, tobind, service, appName) } } @@ -272,6 +265,7 @@ func (d *Deployment) BindFrom(service types.ServiceConfig, binded *Deployment) { func (d *Deployment) DependsOn(to *Deployment, servicename string) error { // Add a initContainer with busybox:latest using netcat to check if the service is up // it will wait until the service responds to all ports + logger.Info("Adding dependency from ", d.service.Name, " to ", to.service.Name) for _, container := range to.Spec.Template.Spec.Containers { commands := []string{} if len(container.Ports) == 0 { @@ -670,14 +664,14 @@ func (d *Deployment) appendFileToConfigMap(service types.ServiceConfig, appName } } -func (d *Deployment) bindVolumes(volume types.ServiceVolumeConfig, isSamePod bool, tobind map[string]bool, service types.ServiceConfig, appName string) { +func (d *Deployment) bindVolumes(volume types.ServiceVolumeConfig, tobind map[string]bool, service types.ServiceConfig, appName string) { container, index := utils.GetContainerByName(service.ContainerName, d.Spec.Template.Spec.Containers) defer func(d *Deployment, container *corev1.Container, index int) { d.Spec.Template.Spec.Containers[index] = *container }(d, container, index) - if _, found := tobind[volume.Source]; !isSamePod && volume.Type == "bind" && !found { + if _, found := tobind[volume.Source]; volume.Type == "bind" && !found { logger.Warn( "Bind volumes are not supported yet, " + "excepting for those declared as " + diff --git a/internal/generator/generator.go b/internal/generator/generator.go index 7548e03..80c1c48 100644 --- a/internal/generator/generator.go +++ b/internal/generator/generator.go @@ -9,6 +9,7 @@ import ( "katenary.io/internal/generator/labels" "katenary.io/internal/generator/labels/labelstructs" + "katenary.io/internal/logger" "katenary.io/internal/utils" "github.com/compose-spec/compose-go/types" @@ -99,6 +100,7 @@ func Generate(project *types.Project) (*HelmChart, error) { // drop all "same-pod" deployments because the containers and volumes are already // in the target deployment + drops := []string{} for _, service := range podToMerge { if samepod, ok := service.Labels[labels.LabelSamePod]; ok && samepod != "" { // move this deployment volumes to the target deployment @@ -109,9 +111,11 @@ func Generate(project *types.Project) (*HelmChart, error) { // copy all init containers initContainers := deployments[service.Name].Spec.Template.Spec.InitContainers target.Spec.Template.Spec.InitContainers = append(target.Spec.Template.Spec.InitContainers, initContainers...) - delete(deployments, service.Name) + drops = append(drops, service.Name) } else { - log.Printf("service %[1]s is declared as %[2]s, but %[2]s is not defined", service.Name, labels.LabelSamePod) + err := fmt.Errorf("service %s is declared as %s, but %s is not defined", service.Name, labels.LabelSamePod, samepod) + logger.Failure(err.Error()) + return nil, err } } } @@ -122,13 +126,18 @@ func Generate(project *types.Project) (*HelmChart, error) { if dep, ok := deployments[d]; ok { err := deployments[s.Name].DependsOn(dep, d) if err != nil { - log.Printf("error creating init container for service %[1]s: %[2]s", s.Name, err) + logger.Info(fmt.Sprintf("error creating init container for service %[1]s: %[2]s", s.Name, err)) } } else { - log.Printf("service %[1]s depends on %[2]s, but %[2]s is not defined", s.Name, d) + err := fmt.Errorf("service %[1]s depends on %[2]s, but %[2]s is not defined", s.Name, d) + logger.Failure(err.Error()) + return nil, err } } } + for _, name := range drops { + delete(deployments, name) + } // it's now time to get "value-from", before makeing the secrets and configmaps! for _, s := range project.Services { chart.setEnvironmentValuesFrom(s, deployments) @@ -226,6 +235,7 @@ func fixResourceNames(project *types.Project) error { s.Labels[labels.LabelSamePod] = fixed project.Services[j] = s } + // also, the value-from label should be updated if valuefrom, ok := s.Labels[labels.LabelValuesFrom]; ok { vf, err := labelstructs.GetValueFrom(valuefrom) @@ -244,8 +254,15 @@ func fixResourceNames(project *types.Project) error { } } service.Name = fixed - project.Services[i] = service } + // rename depends_on + for _, d := range service.GetDependencies() { + depname := utils.AsResourceName(d) + dep := service.DependsOn[d] + delete(service.DependsOn, d) + service.DependsOn[depname] = dep + } + project.Services[i] = service } return nil }