4 Commits

Author SHA1 Message Date
19c2277d04 Merge branch 'master' into feat-fix-install-sh 2025-10-18 13:21:53 +00:00
584bcc6033 Fix typo
not important but...
2025-09-14 14:18:53 +02:00
aeff9215aa Fixup comments remove hard coded tagname 2025-09-14 14:16:19 +02:00
33e74b9758 feat(install)
All checks were successful
Go-Tests / tests (pull_request) Successful in 1m38s
Go-Tests / sonar (pull_request) Successful in 39s
Installation should now be taken from katenary.io
2025-09-05 10:11:16 +02:00
19 changed files with 67 additions and 207 deletions

View File

@@ -6,13 +6,13 @@ package main
import (
"fmt"
"log"
"os"
"strings"
"katenary.io/internal/generator"
"katenary.io/internal/generator/katenaryfile"
"katenary.io/internal/generator/labels"
"katenary.io/internal/logger"
"katenary.io/internal/utils"
"github.com/compose-spec/compose-go/v2/cli"
@@ -28,7 +28,7 @@ func main() {
rootCmd := buildRootCmd()
if err := rootCmd.Execute(); err != nil {
logger.Fatal(err)
log.Fatal(err)
}
}

View File

@@ -49,7 +49,6 @@ fi
# Where to download the binary
TAG=$(curl -sLf https://repo.katenary.io/api/v1/repos/katenary/katenary/releases/latest 2>/dev/null | grep -Po '"tag_name":\s*"[^"]*"' | cut -d ":" -f2 | tr -d '"')
TAG=${TAG#releases/}
# use the right names for the OS and architecture
if [ $ARCH = "x86_64" ]; then
@@ -58,7 +57,6 @@ fi
BIN_URL="https://repo.katenary.io/api/packages/Katenary/generic/katenary/$TAG/katenary-$OS-$ARCH"
echo
echo "Downloading $BIN_URL"

View File

@@ -2,6 +2,7 @@ package generator
import (
"fmt"
"log"
"maps"
"os"
"path/filepath"
@@ -330,12 +331,12 @@ func (chart *HelmChart) setSharedConf(service types.ServiceConfig, deployments m
}
fromservices, err := labelstructs.EnvFromFrom(service.Labels[labels.LabelEnvFrom])
if err != nil {
logger.Fatal("error unmarshaling env-from label:", err)
log.Fatal("error unmarshaling env-from label:", err)
}
// find the configmap in the chart templates
for _, fromservice := range fromservices {
if _, ok := chart.Templates[fromservice+".configmap.yaml"]; !ok {
logger.Warnf("configmap %s not found in chart templates", fromservice)
log.Printf("configmap %s not found in chart templates", fromservice)
continue
}
// find the corresponding target deployment
@@ -355,7 +356,7 @@ func (chart *HelmChart) setEnvironmentValuesFrom(service types.ServiceConfig, de
}
mapping, err := labelstructs.GetValueFrom(service.Labels[labels.LabelValuesFrom])
if err != nil {
logger.Fatal("error unmarshaling values-from label:", err)
log.Fatal("error unmarshaling values-from label:", err)
}
findDeployment := func(name string) *Deployment {
@@ -374,11 +375,11 @@ func (chart *HelmChart) setEnvironmentValuesFrom(service types.ServiceConfig, de
dep := findDeployment(depName[0])
target := findDeployment(service.Name)
if dep == nil || target == nil {
logger.Fatalf("deployment %s or %s not found", depName[0], service.Name)
log.Fatalf("deployment %s or %s not found", depName[0], service.Name)
}
container, index := utils.GetContainerByName(target.service.ContainerName, target.Spec.Template.Spec.Containers)
if container == nil {
logger.Fatalf("Container %s not found", target.GetName())
log.Fatalf("Container %s not found", target.GetName())
}
reourceName := fmt.Sprintf(`{{ include "%s.fullname" . }}-%s`, chart.Name, depName[0])
// add environment with from

View File

@@ -2,6 +2,7 @@ package generator
import (
"fmt"
"log"
"os"
"path/filepath"
"regexp"
@@ -68,7 +69,7 @@ func NewConfigMap(service types.ServiceConfig, appName string, forFile bool) *Co
// get the secrets from the labels
secrets, err := labelstructs.SecretsFrom(service.Labels[labels.LabelSecrets])
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
// drop the secrets from the environment
for _, secret := range secrets {
@@ -94,7 +95,7 @@ func NewConfigMap(service types.ServiceConfig, appName string, forFile bool) *Co
if l, ok := service.Labels[labels.LabelMapEnv]; ok {
envmap, err := labelstructs.MapEnvFrom(l)
if err != nil {
logger.Fatal("Error parsing map-env", err)
log.Fatal("Error parsing map-env", err)
}
for key, value := range envmap {
cm.AddData(key, strings.ReplaceAll(value, "__APP__", appName))
@@ -144,7 +145,7 @@ func NewConfigMapFromDirectory(service types.ServiceConfig, appName, path string
path = filepath.Join(service.WorkingDir, path)
path = filepath.Clean(path)
if err := cm.AppendDir(path); err != nil {
logger.Fatal("Error adding files to configmap:", err)
log.Fatal("Error adding files to configmap:", err)
}
return cm
}

View File

@@ -4,6 +4,7 @@ import (
"bytes"
"errors"
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
@@ -595,7 +596,7 @@ func callHelmUpdate(config ConvertOptions) {
func removeNewlinesInsideBrackets(values []byte) []byte {
re, err := regexp.Compile(`(?s)\{\{(.*?)\}\}`)
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
return re.ReplaceAllFunc(values, func(b []byte) []byte {
// get the first match
@@ -634,7 +635,7 @@ func writeContent(path string, content []byte) {
defer f.Close()
defer func() {
if _, err := f.Write(content); err != nil {
logger.Fatal(err)
log.Fatal(err)
}
}()
}

View File

@@ -1,11 +1,11 @@
package generator
import (
"log"
"strings"
"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/v2/types"
@@ -33,7 +33,7 @@ func NewCronJob(service types.ServiceConfig, chart *HelmChart, appName string) (
}
mapping, err := labelstructs.CronJobFrom(labels)
if err != nil {
logger.Fatalf("Error parsing cronjob labels: %s", err)
log.Fatalf("Error parsing cronjob labels: %s", err)
return nil, nil
}

View File

@@ -2,6 +2,7 @@ package generator
import (
"fmt"
"log"
"os"
"path/filepath"
"regexp"
@@ -165,7 +166,7 @@ func (d *Deployment) AddHealthCheck(service types.ServiceConfig, container *core
if v, ok := service.Labels[labels.LabelHealthCheck]; ok {
probes, err := labelstructs.ProbeFrom(v)
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
container.LivenessProbe = probes.LivenessProbe
container.ReadinessProbe = probes.ReadinessProbe
@@ -200,7 +201,7 @@ func (d *Deployment) AddVolumes(service types.ServiceConfig, appName string) {
if v, ok := service.Labels[labels.LabelConfigMapFiles]; ok {
binds, err := labelstructs.ConfigMapFileFrom(v)
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
for _, bind := range binds {
tobind[bind] = true
@@ -268,12 +269,13 @@ func (d *Deployment) DependsOn(to *Deployment, servicename string) error {
for _, container := range to.Spec.Template.Spec.Containers {
commands := []string{}
if len(container.Ports) == 0 {
logger.Fatal("No ports found for service ",
logger.Warn("No ports found for service ",
servicename,
". You should declare a port in the service or use "+
labels.LabelPorts+
" label.",
)
os.Exit(1)
}
for _, port := range container.Ports {
command := fmt.Sprintf("until nc -z %s %d; do\n sleep 1;\ndone", to.Name, port.ContainerPort)
@@ -309,7 +311,7 @@ func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string, sam
defer func() {
c, index := d.BindMapFilesToContainer(service, secrets, appName)
if c == nil || index == -1 {
logger.Warn("Container not found for service ", service.Name)
log.Println("Container not found for service ", service.Name)
return
}
d.Spec.Template.Spec.Containers[index] = *c
@@ -318,7 +320,7 @@ func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string, sam
// secrets from label
labelSecrets, err := labelstructs.SecretsFrom(service.Labels[labels.LabelSecrets])
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
// values from label
@@ -333,7 +335,7 @@ func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string, sam
_, ok := service.Environment[secret]
if !ok {
drop = append(drop, secret)
logger.Warn("Secret " + secret + " not found in service " + service.Name + " - skipped")
logger.Warn("Secret " + secret + " not found in service " + service.Name + " - skpped")
continue
}
secrets = append(secrets, secret)
@@ -350,7 +352,7 @@ func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string, sam
val, ok := service.Environment[value]
if !ok {
drop = append(drop, value)
logger.Warn("Environment variable " + value + " not found in service " + service.Name + " - skipped")
logger.Warn("Environment variable " + value + " not found in service " + service.Name + " - skpped")
continue
}
if d.chart.Values[service.Name].(*Value).Environment == nil {
@@ -382,8 +384,8 @@ func (d *Deployment) BindMapFilesToContainer(service types.ServiceConfig, secret
if envSize > 0 {
if service.Name == "db" {
logger.Info("Service ", service.Name, " has environment variables")
logger.Info(service.Environment)
log.Println("Service ", service.Name, " has environment variables")
log.Println(service.Environment)
}
fromSources = append(fromSources, corev1.EnvFromSource{
ConfigMapRef: &corev1.ConfigMapEnvSource{
@@ -613,7 +615,7 @@ func (d *Deployment) appendDirectoryToConfigMap(service types.ServiceConfig, app
// TODO: make it recursive to add all files in the directory and subdirectories
_, err := os.ReadDir(volume.Source)
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
cm := NewConfigMapFromDirectory(service, appName, volume.Source)
d.configMaps[pathnme] = &ConfigMapMount{
@@ -658,7 +660,7 @@ func (d *Deployment) appendFileToConfigMap(service types.ServiceConfig, appName
}
if err := cm.AppendFile(volume.Source); err != nil {
logger.Fatal("Error adding file to configmap:", err)
log.Fatal("Error adding file to configmap:", err)
}
}
@@ -719,7 +721,7 @@ func (d *Deployment) bindVolumes(volume types.ServiceVolumeConfig, tobind map[st
// Add volume to container
stat, err := os.Stat(volume.Source)
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
if stat.IsDir() {

View File

@@ -4,12 +4,12 @@ import (
"bytes"
_ "embed"
"fmt"
"log"
"sort"
"strings"
"text/template"
"gopkg.in/yaml.v3"
"katenary.io/internal/logger"
)
//go:embed readme.tpl
@@ -50,7 +50,7 @@ func ReadMeFile(charname, description string, values map[string]any) string {
vv := map[string]any{}
out, _ := yaml.Marshal(values)
if err := yaml.Unmarshal(out, &vv); err != nil {
logger.Warnf("Error parsing values: %s", err)
log.Printf("Error parsing values: %s", err)
}
result := make(map[string]string)

View File

@@ -3,6 +3,7 @@ package generator
import (
"bytes"
"fmt"
"log"
"regexp"
"strings"
@@ -144,7 +145,7 @@ func Generate(project *types.Project) (*HelmChart, error) {
// generate configmaps with environment variables
if err := chart.generateConfigMapsAndSecrets(project); err != nil {
logger.Fatalf("error generating configmaps and secrets: %s", err)
log.Fatalf("error generating configmaps and secrets: %s", err)
}
// if the env-from label is set, we need to add the env vars from the configmap
@@ -279,7 +280,7 @@ func addStaticVolumes(deployments map[string]*Deployment, service types.ServiceC
var d *Deployment
var ok bool
if d, ok = deployments[service.Name]; !ok {
logger.Warnf("service %s not found in deployments", service.Name)
log.Printf("service %s not found in deployments", service.Name)
return
}
@@ -291,7 +292,7 @@ func addStaticVolumes(deployments map[string]*Deployment, service types.ServiceC
var y []byte
var err error
if y, err = config.configMap.Yaml(); err != nil {
logger.Fatal(err)
log.Fatal(err)
}
// add the configmap to the chart
@@ -433,7 +434,7 @@ func samePodVolume(service types.ServiceConfig, v types.ServiceVolumeConfig, dep
// check if it has the same volume
for _, tv := range target.Spec.Template.Spec.Volumes {
if tv.Name == v.Source {
logger.Warnf("found same pod volume %s in deployment %s and %s", tv.Name, service.Name, targetDeployment)
log.Printf("found same pod volume %s in deployment %s and %s", tv.Name, service.Name, targetDeployment)
return true
}
}

View File

@@ -1,11 +1,11 @@
package generator
import (
"log"
"strings"
"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/v2/types"
@@ -36,7 +36,7 @@ func NewIngress(service types.ServiceConfig, Chart *HelmChart) *Ingress {
mapping, err := labelstructs.IngressFrom(label)
if err != nil {
logger.Fatalf("Failed to parse ingress label: %s\n", err)
log.Fatalf("Failed to parse ingress label: %s\n", err)
}
if mapping.Hostname == "" {
mapping.Hostname = service.Name + ".tld"

View File

@@ -3,6 +3,7 @@ package katenaryfile
import (
"bytes"
"encoding/json"
"log"
"os"
"reflect"
"strings"
@@ -66,7 +67,7 @@ func OverrideWithConfig(project *types.Project) {
return
}
if err := yaml.NewDecoder(fp).Decode(&services); err != nil {
logger.Fatal(err)
log.Fatal(err)
return
}
for _, p := range project.Services {
@@ -78,7 +79,7 @@ func OverrideWithConfig(project *types.Project) {
}
err := getLabelContent(o, &s, labelName)
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
project.Services[name] = s
}
@@ -112,7 +113,7 @@ func getLabelContent(o any, service *types.ServiceConfig, labelName string) erro
c, err := yaml.Marshal(o)
if err != nil {
logger.Failure(err.Error())
log.Println(err)
return err
}
val := strings.TrimSpace(string(c))
@@ -120,7 +121,7 @@ func getLabelContent(o any, service *types.ServiceConfig, labelName string) erro
// special case, values must be set from some defaults
ing, err := labelstructs.IngressFrom(val)
if err != nil {
logger.Fatal(err)
log.Fatal(err)
return err
}
c, err := yaml.Marshal(ing)

View File

@@ -4,13 +4,13 @@ import (
"bytes"
_ "embed"
"fmt"
"log"
"regexp"
"sort"
"strings"
"text/tabwriter"
"text/template"
"katenary.io/internal/logger"
"katenary.io/internal/utils"
"sigs.k8s.io/yaml"
@@ -134,7 +134,7 @@ func GetLabelHelpFor(labelname string, asMarkdown bool) string {
KatenaryPrefix: KatenaryLabelPrefix,
})
if err != nil {
logger.Fatalf("Error executing template: %v", err)
log.Fatalf("Error executing template: %v", err)
}
help.Long = buf.String()
buf.Reset()
@@ -145,7 +145,7 @@ func GetLabelHelpFor(labelname string, asMarkdown bool) string {
KatenaryPrefix: KatenaryLabelPrefix,
})
if err != nil {
logger.Fatalf("Error executing template: %v", err)
log.Fatalf("Error executing template: %v", err)
}
help.Example = buf.String()
buf.Reset()
@@ -160,7 +160,7 @@ func GetLabelHelpFor(labelname string, asMarkdown bool) string {
KatenaryPrefix: KatenaryLabelPrefix,
})
if err != nil {
logger.Fatalf("Error executing template: %v", err)
log.Fatalf("Error executing template: %v", err)
}
return buf.String()

View File

@@ -2,10 +2,10 @@ package labelstructs
import (
"encoding/json"
"log"
"gopkg.in/yaml.v3"
corev1 "k8s.io/api/core/v1"
"katenary.io/internal/logger"
)
type HealthCheck struct {
@@ -24,13 +24,13 @@ func ProbeFrom(data string) (*HealthCheck, error) {
if livenessProbe, ok := tmp["livenessProbe"]; ok {
livenessProbeBytes, err := json.Marshal(livenessProbe)
if err != nil {
logger.Warnf("Error marshalling livenessProbe: %v", err)
log.Printf("Error marshalling livenessProbe: %v", err)
return nil, err
}
livenessProbe := &corev1.Probe{}
err = json.Unmarshal(livenessProbeBytes, livenessProbe)
if err != nil {
logger.Warnf("Error unmarshalling livenessProbe: %v", err)
log.Printf("Error unmarshalling livenessProbe: %v", err)
return nil, err
}
mapping.LivenessProbe = livenessProbe
@@ -39,13 +39,13 @@ func ProbeFrom(data string) (*HealthCheck, error) {
if readinessProbe, ok := tmp["readinessProbe"]; ok {
readinessProbeBytes, err := json.Marshal(readinessProbe)
if err != nil {
logger.Warnf("Error marshalling readinessProbe: %v", err)
log.Printf("Error marshalling readinessProbe: %v", err)
return nil, err
}
readinessProbe := &corev1.Probe{}
err = json.Unmarshal(readinessProbeBytes, readinessProbe)
if err != nil {
logger.Warnf("Error unmarshalling readinessProbe: %v", err)
log.Printf("Error unmarshalling readinessProbe: %v", err)
return nil, err
}
mapping.ReadinessProbe = readinessProbe

View File

@@ -1,11 +1,11 @@
package generator
import (
"log"
"os"
"os/exec"
"testing"
"katenary.io/internal/logger"
"katenary.io/internal/parser"
)
@@ -23,7 +23,7 @@ func setup(content string) string {
func teardown(tmpDir string) {
// remove the temporary directory
logger.Info("Removing temporary directory: ", tmpDir)
log.Println("Removing temporary directory: ", tmpDir)
if err := os.RemoveAll(tmpDir); err != nil {
panic(err)
}
@@ -59,7 +59,7 @@ func compileTest(t *testing.T, force bool, options ...string) string {
ChartVersion: chartVersion,
}
if err := Convert(convertOptions, "compose.yml"); err != nil {
logger.Warnf("Failed to convert: %s", err)
log.Printf("Failed to convert: %s", err)
return err.Error()
}

View File

@@ -1,11 +1,6 @@
// Package logger provides simple logging functions with icons and colors.
package logger
import (
"fmt"
"os"
)
// Icon is a unicode icon
type Icon string
@@ -27,91 +22,30 @@ const (
const reset = "\033[0m"
// Print prints a message without icon.
func Print(msg ...any) {
fmt.Print(msg...)
}
// Printf prints a formatted message without icon.
func Printf(format string, msg ...any) {
fmt.Printf(format, msg...)
}
// Info prints an informational message.
func Info(msg ...any) {
message("", IconInfo, msg...)
}
// Infof prints a formatted informational message.
func Infof(format string, msg ...any) {
message("", IconInfo, fmt.Sprintf(format, msg...))
}
// Warn prints a warning message.
func Warn(msg ...any) {
orange := "\033[38;5;214m"
message(orange, IconWarning, msg...)
}
// Warnf prints a formatted warning message.
func Warnf(format string, msg ...any) {
orange := "\033[38;5;214m"
message(orange, IconWarning, fmt.Sprintf(format, msg...))
}
// Success prints a success message.
func Success(msg ...any) {
green := "\033[38;5;34m"
message(green, IconSuccess, msg...)
}
// Successf prints a formatted success message.
func Successf(format string, msg ...any) {
green := "\033[38;5;34m"
message(green, IconSuccess, fmt.Sprintf(format, msg...))
}
// Failure prints a failure message.
func Failure(msg ...any) {
red := "\033[38;5;196m"
message(red, IconFailure, msg...)
}
// Failuref prints a formatted failure message.
func Failuref(format string, msg ...any) {
red := "\033[38;5;196m"
message(red, IconFailure, fmt.Sprintf(format, msg...))
}
// Log prints a message with a custom icon.
func Log(icon Icon, msg ...any) {
message("", icon, msg...)
}
// Logf prints a formatted message with a custom icon.
func Logf(icon Icon, format string, msg ...any) {
message("", icon, fmt.Sprintf(format, msg...))
}
func fatal(red string, icon Icon, msg ...any) {
fmt.Print(icon, " ", red)
fmt.Print(msg...)
fmt.Println(reset)
os.Exit(1)
}
func fatalf(red string, icon Icon, format string, msg ...any) {
fatal(red, icon, fmt.Sprintf(format, msg...))
}
// Fatal prints a fatal error message and exits with code 1.
func Fatal(msg ...any) {
red := "\033[38;5;196m"
fatal(red, IconFailure, msg...)
}
// Fatalf prints a fatal error message with formatting and exits with code 1.
func Fatalf(format string, msg ...any) {
red := "\033[38;5;196m"
fatalf(red, IconFailure, format, msg...)
}

View File

@@ -1,79 +0,0 @@
package logger
import (
"testing"
)
func TestIcons(t *testing.T) {
tests := []struct {
name string
got Icon
expected Icon
}{
{"IconSuccess", IconSuccess, "✅"},
{"IconFailure", IconFailure, "❌"},
{"IconWarning", IconWarning, "❕"},
{"IconNote", IconNote, "📝"},
{"IconWorld", IconWorld, "🌐"},
{"IconPlug", IconPlug, "🔌"},
{"IconPackage", IconPackage, "📦"},
{"IconCabinet", IconCabinet, "🗄️"},
{"IconInfo", IconInfo, "🔵"},
{"IconSecret", IconSecret, "🔒"},
{"IconConfig", IconConfig, "🔧"},
{"IconDependency", IconDependency, "🔗"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.got != tt.expected {
t.Errorf("got %q, want %q", tt.got, tt.expected)
}
})
}
}
func TestInfo(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Errorf("Info panicked: %v", r)
}
}()
Info("test message")
}
func TestWarn(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Errorf("Warn panicked: %v", r)
}
}()
Warn("test warning")
}
func TestSuccess(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Errorf("Success panicked: %v", r)
}
}()
Success("test success")
}
func TestFailure(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Errorf("Failure panicked: %v", r)
}
}()
Failure("test failure")
}
func TestLog(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Errorf("Log panicked: %v", r)
}
}()
Log(IconInfo, "test log")
}

View File

@@ -3,11 +3,11 @@ package parser
import (
"context"
"log"
"path/filepath"
"github.com/compose-spec/compose-go/v2/cli"
"github.com/compose-spec/compose-go/v2/types"
"katenary.io/internal/logger"
)
func init() {
@@ -37,11 +37,11 @@ func Parse(profiles []string, envFiles []string, dockerComposeFile ...string) (*
var err error
envFiles[i], err = filepath.Abs(envFiles[i])
if err != nil {
logger.Fatal(err)
log.Fatal(err)
}
}
options, err := cli.NewProjectOptions(dockerComposeFile,
options, err := cli.NewProjectOptions(nil,
cli.WithProfiles(profiles),
cli.WithInterpolation(true),
cli.WithDefaultConfigPath,

View File

@@ -1,11 +1,10 @@
package parser
import (
"log"
"os"
"path/filepath"
"testing"
"katenary.io/internal/logger"
)
const composeFile = `
@@ -28,7 +27,7 @@ func setupTest() (string, error) {
func tearDownTest(tmpDir string) {
if tmpDir != "" {
if err := os.RemoveAll(tmpDir); err != nil {
logger.Fatalf("Failed to remove temporary directory %s: %s", tmpDir, err.Error())
log.Fatalf("Failed to remove temporary directory %s: %s", tmpDir, err.Error())
}
}
}

View File

@@ -3,6 +3,7 @@ package utils
import (
"bytes"
"fmt"
"log"
"path/filepath"
"strings"
@@ -132,8 +133,8 @@ func GetValuesFromLabel(service types.ServiceConfig, LabelValues string) map[str
labelContent := []any{}
err := yaml.Unmarshal([]byte(v), &labelContent)
if err != nil {
logger.Warnf("Error parsing label %s: %s", v, err)
logger.Fatal(err)
log.Printf("Error parsing label %s: %s", v, err)
log.Fatal(err)
}
for _, value := range labelContent {
@@ -149,7 +150,7 @@ func GetValuesFromLabel(service types.ServiceConfig, LabelValues string) map[str
descriptions[k.(string)] = &EnvConfig{Service: service, Description: v.(string)}
}
default:
logger.Fatalf("Unknown type in label: %s %T", LabelValues, value)
log.Fatalf("Unknown type in label: %s %T", LabelValues, value)
}
}
}
@@ -170,7 +171,7 @@ func Confirm(question string, icon ...logger.Icon) bool {
}
var response string
if _, err := fmt.Scanln(&response); err != nil {
logger.Fatalf("Error parsing response: %s", err.Error())
log.Fatalf("Error parsing response: %s", err.Error())
}
return strings.ToLower(response) == "y"
}