Compare commits
1 Commits
3.0.0-rc3
...
feat-compo
Author | SHA1 | Date | |
---|---|---|---|
1fa07c29e5 |
@@ -1,26 +0,0 @@
|
|||||||
version: "2"
|
|
||||||
run:
|
|
||||||
issues-exit-code: 1
|
|
||||||
linters:
|
|
||||||
enabled:
|
|
||||||
- unused
|
|
||||||
exclusions:
|
|
||||||
generated: lax
|
|
||||||
presets:
|
|
||||||
- comments
|
|
||||||
- common-false-positives
|
|
||||||
- legacy
|
|
||||||
- std-error-handling
|
|
||||||
paths:
|
|
||||||
- third_party$
|
|
||||||
- builtin$
|
|
||||||
- examples$
|
|
||||||
- "(.+)_test.go"
|
|
||||||
formatters:
|
|
||||||
exclusions:
|
|
||||||
generated: lax
|
|
||||||
paths:
|
|
||||||
- third_party$
|
|
||||||
- builtin$
|
|
||||||
- examples$
|
|
||||||
- "(.+)_test.go"
|
|
24
Makefile
24
Makefile
@@ -4,7 +4,7 @@ VERSION=$(shell git describe --exact-match --tags $(CUR_SHA) 2>/dev/null || echo
|
|||||||
CTN:=$(shell which podman 2>&1 1>/dev/null && echo "podman" || echo "docker")
|
CTN:=$(shell which podman 2>&1 1>/dev/null && echo "podman" || echo "docker")
|
||||||
PREFIX=~/.local
|
PREFIX=~/.local
|
||||||
|
|
||||||
GOVERSION=1.24
|
GOVERSION=1.23
|
||||||
GO=container
|
GO=container
|
||||||
OUT=katenary
|
OUT=katenary
|
||||||
RELEASE=""
|
RELEASE=""
|
||||||
@@ -12,8 +12,6 @@ BLD_CMD=go build -ldflags="-X 'katenary/generator.Version=$(RELEASE)$(VERSION)'"
|
|||||||
GOOS=linux
|
GOOS=linux
|
||||||
GOARCH=amd64
|
GOARCH=amd64
|
||||||
SIGNER=metal3d@gmail.com
|
SIGNER=metal3d@gmail.com
|
||||||
UPX_OPTS =
|
|
||||||
UPX ?= upx $(UPX_OPTS)
|
|
||||||
|
|
||||||
BUILD_IMAGE=docker.io/golang:$(GOVERSION)-alpine
|
BUILD_IMAGE=docker.io/golang:$(GOVERSION)-alpine
|
||||||
# SHELL=/bin/bash
|
# SHELL=/bin/bash
|
||||||
@@ -35,7 +33,7 @@ SHELL := bash
|
|||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
MAKEFLAGS += --warn-undefined-variables
|
MAKEFLAGS += --warn-undefined-variables
|
||||||
MAKEFLAGS += --no-builtin-rules
|
MAKEFLAGS += --no-builtin-rules
|
||||||
.PHONY: help clean build install tests test doc
|
.PHONY: help clean build install tests test
|
||||||
|
|
||||||
all: build
|
all: build
|
||||||
|
|
||||||
@@ -97,17 +95,17 @@ ifeq ($(GO),local)
|
|||||||
$(BLD_CMD)
|
$(BLD_CMD)
|
||||||
else ifeq ($(CTN),podman)
|
else ifeq ($(CTN),podman)
|
||||||
@podman run -e CGO_ENABLED=0 -e GOOS=$(GOOS) -e GOARCH=$(GOARCH) \
|
@podman run -e CGO_ENABLED=0 -e GOOS=$(GOOS) -e GOARCH=$(GOARCH) \
|
||||||
--rm -v $(PWD):/go/src/katenary:z -w /go/src/katenary --userns keep-id $(BUILD_IMAGE) $(BLD_CMD)
|
--rm -v $(PWD):/go/src/katenary:z -w /go/src/katenary --userns keep-id -it $(BUILD_IMAGE) $(BLD_CMD)
|
||||||
else
|
else
|
||||||
@docker run -e CGO_ENABLED=0 -e GOOS=$(GOOS) -e GOARCH=$(GOARCH) \
|
@docker run -e CGO_ENABLED=0 -e GOOS=$(GOOS) -e GOARCH=$(GOARCH) \
|
||||||
--rm -v $(PWD):/go/src/katenary:z -w /go/src/katenary --user $(shell id -u):$(shell id -g) -e HOME=/tmp $(BUILD_IMAGE) $(BLD_CMD)
|
--rm -v $(PWD):/go/src/katenary:z -w /go/src/katenary --user $(shell id -u):$(shell id -g) -e HOME=/tmp -it $(BUILD_IMAGE) $(BLD_CMD)
|
||||||
endif
|
endif
|
||||||
echo "=> Stripping if possible"
|
echo "=> Stripping if possible"
|
||||||
strip $(OUT) 2>/dev/null || echo "=> No strip available"
|
strip $(OUT) 2>/dev/null || echo "=> No strip available"
|
||||||
|
|
||||||
|
|
||||||
## Release build
|
## Release build
|
||||||
dist: prepare $(BINARIES) upx $(ASC_BINARIES)
|
dist: prepare $(BINARIES) $(ASC_BINARIES)
|
||||||
|
|
||||||
prepare: pull
|
prepare: pull
|
||||||
mkdir -p dist
|
mkdir -p dist
|
||||||
@@ -149,13 +147,6 @@ gpg-sign:
|
|||||||
dist/%.asc: dist/%
|
dist/%.asc: dist/%
|
||||||
gpg --armor --detach-sign --default-key $(SIGNER) $< &>/dev/null || exit 1
|
gpg --armor --detach-sign --default-key $(SIGNER) $< &>/dev/null || exit 1
|
||||||
|
|
||||||
|
|
||||||
upx:
|
|
||||||
$(UPX) dist/katenary-linux-amd64
|
|
||||||
$(UPX) dist/katenary-linux-arm64
|
|
||||||
$(UPX) dist/katenary.exe
|
|
||||||
$(UPX) dist/katenary-darwin-amd64 --force-macos
|
|
||||||
|
|
||||||
install: build
|
install: build
|
||||||
install -Dm755 katenary $(PREFIX)/bin/katenary
|
install -Dm755 katenary $(PREFIX)/bin/katenary
|
||||||
|
|
||||||
@@ -213,11 +204,6 @@ push-release: build-all
|
|||||||
@rm -f release.id
|
@rm -f release.id
|
||||||
|
|
||||||
|
|
||||||
doc:
|
|
||||||
@echo "=> Generating documentation..."
|
|
||||||
# generate the labels doc and code doc
|
|
||||||
$(MAKE) __label_doc
|
|
||||||
|
|
||||||
__label_doc:
|
__label_doc:
|
||||||
@command -v gomarkdoc || (echo "==> We need to install gomarkdoc..." && \
|
@command -v gomarkdoc || (echo "==> We need to install gomarkdoc..." && \
|
||||||
go install github.com/princjef/gomarkdoc/cmd/gomarkdoc@latest)
|
go install github.com/princjef/gomarkdoc/cmd/gomarkdoc@latest)
|
||||||
|
@@ -179,7 +179,7 @@ services:
|
|||||||
# this will use the database secrets and environment,
|
# this will use the database secrets and environment,
|
||||||
# see the "database" service to see the values
|
# see the "database" service to see the values
|
||||||
katenary.v3/values-from: |-
|
katenary.v3/values-from: |-
|
||||||
DB_USER: database.MARIADB_USER
|
DB_USER: databse.MARIADB_USER
|
||||||
DB_PASSWORD: database.MARIADB_PASSWORD
|
DB_PASSWORD: database.MARIADB_PASSWORD
|
||||||
|
|
||||||
database:
|
database:
|
||||||
|
@@ -10,11 +10,10 @@ import (
|
|||||||
"katenary/generator/katenaryfile"
|
"katenary/generator/katenaryfile"
|
||||||
"katenary/generator/labels"
|
"katenary/generator/labels"
|
||||||
"katenary/utils"
|
"katenary/utils"
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/cli"
|
"github.com/compose-spec/compose-go/v2/cli"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -25,10 +24,7 @@ Each [command] and subcommand has got an "help" and "--help" flag to show more i
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rootCmd := buildRootCmd()
|
rootCmd := buildRootCmd()
|
||||||
|
rootCmd.Execute()
|
||||||
if err := rootCmd.Execute(); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildRootCmd() *cobra.Command {
|
func buildRootCmd() *cobra.Command {
|
||||||
@@ -101,26 +97,26 @@ func generateCompletionCommand(name string) *cobra.Command {
|
|||||||
Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),
|
Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),
|
||||||
Short: "Generates completion scripts",
|
Short: "Generates completion scripts",
|
||||||
Long: fmt.Sprintf(completionHelp, name),
|
Long: fmt.Sprintf(completionHelp, name),
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return cmd.Help()
|
cmd.Help()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
switch args[0] {
|
switch args[0] {
|
||||||
case "bash":
|
case "bash":
|
||||||
// get the bash version
|
// get the bash version
|
||||||
if cmd.Flags().Changed("bash-v1") {
|
if cmd.Flags().Changed("bash-v1") {
|
||||||
return cmd.Root().GenBashCompletion(os.Stdout)
|
cmd.Root().GenBashCompletion(os.Stdout)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
return cmd.Root().GenBashCompletionV2(os.Stdout, true)
|
cmd.Root().GenBashCompletionV2(os.Stdout, true)
|
||||||
case "zsh":
|
case "zsh":
|
||||||
return cmd.Root().GenZshCompletion(os.Stdout)
|
cmd.Root().GenZshCompletion(os.Stdout)
|
||||||
case "fish":
|
case "fish":
|
||||||
return cmd.Root().GenFishCompletion(os.Stdout, true)
|
cmd.Root().GenFishCompletion(os.Stdout, true)
|
||||||
case "powershell":
|
case "powershell":
|
||||||
return cmd.Root().GenPowerShellCompletion(os.Stdout)
|
cmd.Root().GenPowerShellCompletion(os.Stdout)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("unknown completion type: %s", args[0])
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
MD012: false
|
|
||||||
MD013: false
|
|
||||||
MD022: false
|
|
||||||
MD033: false
|
|
||||||
MD046: false
|
|
@@ -460,9 +460,9 @@ database:
|
|||||||
MARIADB_USER: myuser
|
MARIADB_USER: myuser
|
||||||
MARIADB_PASSWORD: mypassword
|
MARIADB_PASSWORD: mypassword
|
||||||
labels:
|
labels:
|
||||||
# we can declare secrets
|
# it can be a secret
|
||||||
katenary.v3/secrets: |-
|
katenary.v3/secrets: |-
|
||||||
- MARIADB_PASSWORD
|
- DB_PASSWORD
|
||||||
php:
|
php:
|
||||||
image: php:7.4-fpm
|
image: php:7.4-fpm
|
||||||
environment:
|
environment:
|
||||||
|
@@ -35,7 +35,7 @@ var Version = "master" // changed at compile time
|
|||||||
```
|
```
|
||||||
|
|
||||||
<a name="Convert"></a>
|
<a name="Convert"></a>
|
||||||
## func [Convert](<https://github.com/metal3d/katenary/blob/develop/generator/converter.go#L99>)
|
## func [Convert](<https://github.com/metal3d/katenary/blob/develop/generator/converter.go#L93>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Convert(config ConvertOptions, dockerComposeFile ...string) error
|
func Convert(config ConvertOptions, dockerComposeFile ...string) error
|
||||||
@@ -92,7 +92,7 @@ NewCronJob creates a new CronJob from a compose service. The appName is the name
|
|||||||
## func [ToK8SYaml](<https://github.com/metal3d/katenary/blob/develop/generator/utils.go#L90>)
|
## func [ToK8SYaml](<https://github.com/metal3d/katenary/blob/develop/generator/utils.go#L90>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ToK8SYaml(obj any) ([]byte, error)
|
func ToK8SYaml(obj interface{}) ([]byte, error)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ func NewConfigMapFromDirectory(service types.ServiceConfig, appName, path string
|
|||||||
NewConfigMapFromDirectory creates a new ConfigMap from a compose service. This path is the path to the file or directory. If the path is a directory, all files in the directory are added to the ConfigMap. Each subdirectory are ignored. Note that the Generate\(\) function will create the subdirectories ConfigMaps.
|
NewConfigMapFromDirectory creates a new ConfigMap from a compose service. This path is the path to the file or directory. If the path is a directory, all files in the directory are added to the ConfigMap. Each subdirectory are ignored. Note that the Generate\(\) function will create the subdirectories ConfigMaps.
|
||||||
|
|
||||||
<a name="ConfigMap.AddBinaryData"></a>
|
<a name="ConfigMap.AddBinaryData"></a>
|
||||||
### func \(\*ConfigMap\) [AddBinaryData](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L157>)
|
### func \(\*ConfigMap\) [AddBinaryData](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L155>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (c *ConfigMap) AddBinaryData(key string, value []byte)
|
func (c *ConfigMap) AddBinaryData(key string, value []byte)
|
||||||
@@ -158,7 +158,7 @@ func (c *ConfigMap) AddBinaryData(key string, value []byte)
|
|||||||
AddBinaryData adds binary data to the configmap. Append or overwrite the value if the key already exists.
|
AddBinaryData adds binary data to the configmap. Append or overwrite the value if the key already exists.
|
||||||
|
|
||||||
<a name="ConfigMap.AddData"></a>
|
<a name="ConfigMap.AddData"></a>
|
||||||
### func \(\*ConfigMap\) [AddData](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L152>)
|
### func \(\*ConfigMap\) [AddData](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L150>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (c *ConfigMap) AddData(key, value string)
|
func (c *ConfigMap) AddData(key, value string)
|
||||||
@@ -167,7 +167,7 @@ func (c *ConfigMap) AddData(key, value string)
|
|||||||
AddData adds a key value pair to the configmap. Append or overwrite the value if the key already exists.
|
AddData adds a key value pair to the configmap. Append or overwrite the value if the key already exists.
|
||||||
|
|
||||||
<a name="ConfigMap.AppendDir"></a>
|
<a name="ConfigMap.AppendDir"></a>
|
||||||
### func \(\*ConfigMap\) [AppendDir](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L166>)
|
### func \(\*ConfigMap\) [AppendDir](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L164>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (c *ConfigMap) AppendDir(path string) error
|
func (c *ConfigMap) AppendDir(path string) error
|
||||||
@@ -176,7 +176,7 @@ func (c *ConfigMap) AppendDir(path string) error
|
|||||||
AddFile adds files from given path to the configmap. It is not recursive, to add all files in a directory, you need to call this function for each subdirectory.
|
AddFile adds files from given path to the configmap. It is not recursive, to add all files in a directory, you need to call this function for each subdirectory.
|
||||||
|
|
||||||
<a name="ConfigMap.AppendFile"></a>
|
<a name="ConfigMap.AppendFile"></a>
|
||||||
### func \(\*ConfigMap\) [AppendFile](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L213>)
|
### func \(\*ConfigMap\) [AppendFile](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L211>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (c *ConfigMap) AppendFile(path string) error
|
func (c *ConfigMap) AppendFile(path string) error
|
||||||
@@ -185,7 +185,7 @@ func (c *ConfigMap) AppendFile(path string) error
|
|||||||
|
|
||||||
|
|
||||||
<a name="ConfigMap.Filename"></a>
|
<a name="ConfigMap.Filename"></a>
|
||||||
### func \(\*ConfigMap\) [Filename](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L237>)
|
### func \(\*ConfigMap\) [Filename](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L235>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (c *ConfigMap) Filename() string
|
func (c *ConfigMap) Filename() string
|
||||||
@@ -194,7 +194,7 @@ func (c *ConfigMap) Filename() string
|
|||||||
Filename returns the filename of the configmap. If the configmap is used for files, the filename contains the path.
|
Filename returns the filename of the configmap. If the configmap is used for files, the filename contains the path.
|
||||||
|
|
||||||
<a name="ConfigMap.SetData"></a>
|
<a name="ConfigMap.SetData"></a>
|
||||||
### func \(\*ConfigMap\) [SetData](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L247>)
|
### func \(\*ConfigMap\) [SetData](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L245>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (c *ConfigMap) SetData(data map[string]string)
|
func (c *ConfigMap) SetData(data map[string]string)
|
||||||
@@ -203,7 +203,7 @@ func (c *ConfigMap) SetData(data map[string]string)
|
|||||||
SetData sets the data of the configmap. It replaces the entire data.
|
SetData sets the data of the configmap. It replaces the entire data.
|
||||||
|
|
||||||
<a name="ConfigMap.Yaml"></a>
|
<a name="ConfigMap.Yaml"></a>
|
||||||
### func \(\*ConfigMap\) [Yaml](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L252>)
|
### func \(\*ConfigMap\) [Yaml](<https://github.com/metal3d/katenary/blob/develop/generator/configMap.go#L250>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (c *ConfigMap) Yaml() ([]byte, error)
|
func (c *ConfigMap) Yaml() ([]byte, error)
|
||||||
@@ -275,7 +275,7 @@ Yaml returns the yaml representation of the cronjob.
|
|||||||
Implements the Yaml interface.
|
Implements the Yaml interface.
|
||||||
|
|
||||||
<a name="CronJobValue"></a>
|
<a name="CronJobValue"></a>
|
||||||
## type [CronJobValue](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L118-L123>)
|
## type [CronJobValue](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L113-L118>)
|
||||||
|
|
||||||
CronJobValue is a cronjob configuration that will be saved in values.yaml.
|
CronJobValue is a cronjob configuration that will be saved in values.yaml.
|
||||||
|
|
||||||
@@ -376,7 +376,7 @@ func (d *Deployment) BindFrom(service types.ServiceConfig, binded *Deployment)
|
|||||||
|
|
||||||
|
|
||||||
<a name="Deployment.BindMapFilesToContainer"></a>
|
<a name="Deployment.BindMapFilesToContainer"></a>
|
||||||
### func \(\*Deployment\) [BindMapFilesToContainer](<https://github.com/metal3d/katenary/blob/develop/generator/deployment.go#L374>)
|
### func \(\*Deployment\) [BindMapFilesToContainer](<https://github.com/metal3d/katenary/blob/develop/generator/deployment.go#L377>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (d *Deployment) BindMapFilesToContainer(service types.ServiceConfig, secrets []string, appName string) (*corev1.Container, int)
|
func (d *Deployment) BindMapFilesToContainer(service types.ServiceConfig, secrets []string, appName string) (*corev1.Container, int)
|
||||||
@@ -403,7 +403,7 @@ func (d *Deployment) Filename() string
|
|||||||
Filename returns the filename of the deployment.
|
Filename returns the filename of the deployment.
|
||||||
|
|
||||||
<a name="Deployment.MountExchangeVolumes"></a>
|
<a name="Deployment.MountExchangeVolumes"></a>
|
||||||
### func \(\*Deployment\) [MountExchangeVolumes](<https://github.com/metal3d/katenary/blob/develop/generator/deployment.go#L425>)
|
### func \(\*Deployment\) [MountExchangeVolumes](<https://github.com/metal3d/katenary/blob/develop/generator/deployment.go#L428>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (d *Deployment) MountExchangeVolumes()
|
func (d *Deployment) MountExchangeVolumes()
|
||||||
@@ -421,7 +421,7 @@ func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string, sam
|
|||||||
SetEnvFrom sets the environment variables to a configmap. The configmap is created.
|
SetEnvFrom sets the environment variables to a configmap. The configmap is created.
|
||||||
|
|
||||||
<a name="Deployment.Yaml"></a>
|
<a name="Deployment.Yaml"></a>
|
||||||
### func \(\*Deployment\) [Yaml](<https://github.com/metal3d/katenary/blob/develop/generator/deployment.go#L449>)
|
### func \(\*Deployment\) [Yaml](<https://github.com/metal3d/katenary/blob/develop/generator/deployment.go#L452>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (d *Deployment) Yaml() ([]byte, error)
|
func (d *Deployment) Yaml() ([]byte, error)
|
||||||
@@ -471,7 +471,7 @@ type HelmChart struct {
|
|||||||
```
|
```
|
||||||
|
|
||||||
<a name="Generate"></a>
|
<a name="Generate"></a>
|
||||||
### func [Generate](<https://github.com/metal3d/katenary/blob/develop/generator/generator.go#L31>)
|
### func [Generate](<https://github.com/metal3d/katenary/blob/develop/generator/generator.go#L29>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Generate(project *types.Project) (*HelmChart, error)
|
func Generate(project *types.Project) (*HelmChart, error)
|
||||||
@@ -509,7 +509,7 @@ func (chart *HelmChart) SaveTemplates(templateDir string)
|
|||||||
SaveTemplates the templates of the chart to the given directory.
|
SaveTemplates the templates of the chart to the given directory.
|
||||||
|
|
||||||
<a name="Ingress"></a>
|
<a name="Ingress"></a>
|
||||||
## type [Ingress](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L17-L21>)
|
## type [Ingress](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L17-L20>)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -521,7 +521,7 @@ type Ingress struct {
|
|||||||
```
|
```
|
||||||
|
|
||||||
<a name="NewIngress"></a>
|
<a name="NewIngress"></a>
|
||||||
### func [NewIngress](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L24>)
|
### func [NewIngress](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L23>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func NewIngress(service types.ServiceConfig, Chart *HelmChart) *Ingress
|
func NewIngress(service types.ServiceConfig, Chart *HelmChart) *Ingress
|
||||||
@@ -530,7 +530,7 @@ func NewIngress(service types.ServiceConfig, Chart *HelmChart) *Ingress
|
|||||||
NewIngress creates a new Ingress from a compose service.
|
NewIngress creates a new Ingress from a compose service.
|
||||||
|
|
||||||
<a name="Ingress.Filename"></a>
|
<a name="Ingress.Filename"></a>
|
||||||
### func \(\*Ingress\) [Filename](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L128>)
|
### func \(\*Ingress\) [Filename](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L122>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (ingress *Ingress) Filename() string
|
func (ingress *Ingress) Filename() string
|
||||||
@@ -539,7 +539,7 @@ func (ingress *Ingress) Filename() string
|
|||||||
|
|
||||||
|
|
||||||
<a name="Ingress.Yaml"></a>
|
<a name="Ingress.Yaml"></a>
|
||||||
### func \(\*Ingress\) [Yaml](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L132>)
|
### func \(\*Ingress\) [Yaml](<https://github.com/metal3d/katenary/blob/develop/generator/ingress.go#L126>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (ingress *Ingress) Yaml() ([]byte, error)
|
func (ingress *Ingress) Yaml() ([]byte, error)
|
||||||
@@ -548,7 +548,7 @@ func (ingress *Ingress) Yaml() ([]byte, error)
|
|||||||
|
|
||||||
|
|
||||||
<a name="IngressValue"></a>
|
<a name="IngressValue"></a>
|
||||||
## type [IngressValue](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L29-L36>)
|
## type [IngressValue](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L28-L35>)
|
||||||
|
|
||||||
IngressValue is a ingress configuration that will be saved in values.yaml.
|
IngressValue is a ingress configuration that will be saved in values.yaml.
|
||||||
|
|
||||||
@@ -809,19 +809,18 @@ func (r *ServiceAccount) Yaml() ([]byte, error)
|
|||||||
|
|
||||||
|
|
||||||
<a name="TLS"></a>
|
<a name="TLS"></a>
|
||||||
## type [TLS](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L23-L26>)
|
## type [TLS](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L23-L25>)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```go
|
```go
|
||||||
type TLS struct {
|
type TLS struct {
|
||||||
Enabled bool `yaml:"enabled"`
|
Enabled bool `yaml:"enabled"`
|
||||||
SecretName string `yaml:"secretName"`
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<a name="Value"></a>
|
<a name="Value"></a>
|
||||||
## type [Value](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L39-L50>)
|
## type [Value](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L38-L49>)
|
||||||
|
|
||||||
Value will be saved in values.yaml. It contains configuration for all deployment and services.
|
Value will be saved in values.yaml. It contains configuration for all deployment and services.
|
||||||
|
|
||||||
@@ -841,7 +840,7 @@ type Value struct {
|
|||||||
```
|
```
|
||||||
|
|
||||||
<a name="NewValue"></a>
|
<a name="NewValue"></a>
|
||||||
### func [NewValue](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L57>)
|
### func [NewValue](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L56>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func NewValue(service types.ServiceConfig, main ...bool) *Value
|
func NewValue(service types.ServiceConfig, main ...bool) *Value
|
||||||
@@ -852,7 +851,7 @@ NewValue creates a new Value from a compose service. The value contains the nece
|
|||||||
If \`main\` is true, the tag will be empty because it will be set in the helm chart appVersion.
|
If \`main\` is true, the tag will be empty because it will be set in the helm chart appVersion.
|
||||||
|
|
||||||
<a name="Value.AddIngress"></a>
|
<a name="Value.AddIngress"></a>
|
||||||
### func \(\*Value\) [AddIngress](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L90>)
|
### func \(\*Value\) [AddIngress](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L89>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (v *Value) AddIngress(host, path string)
|
func (v *Value) AddIngress(host, path string)
|
||||||
@@ -861,7 +860,7 @@ func (v *Value) AddIngress(host, path string)
|
|||||||
|
|
||||||
|
|
||||||
<a name="Value.AddPersistence"></a>
|
<a name="Value.AddPersistence"></a>
|
||||||
### func \(\*Value\) [AddPersistence](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L104>)
|
### func \(\*Value\) [AddPersistence](<https://github.com/metal3d/katenary/blob/develop/generator/values.go#L99>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func (v *Value) AddPersistence(volumeName string)
|
func (v *Value) AddPersistence(volumeName string)
|
||||||
|
@@ -17,7 +17,7 @@ func NotesFile(services []string) string
|
|||||||
NotesFile returns the content of the note.txt file.
|
NotesFile returns the content of the note.txt file.
|
||||||
|
|
||||||
<a name="ReadMeFile"></a>
|
<a name="ReadMeFile"></a>
|
||||||
## func [ReadMeFile](<https://github.com/metal3d/katenary/blob/develop/generator/extrafiles/readme.go#L46>)
|
## func [ReadMeFile](<https://github.com/metal3d/katenary/blob/develop/generator/extrafiles/readme.go#L45>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ReadMeFile(charname, description string, values map[string]any) string
|
func ReadMeFile(charname, description string, values map[string]any) string
|
||||||
|
@@ -12,7 +12,7 @@ A katenary file, named "katenary.yml" or "katenary.yaml", is a file where you ca
|
|||||||
|
|
||||||
Formely, the file describe the same structure as in labels, and so that can be validated and completed by LSP. It also ease the use of katenary.
|
Formely, the file describe the same structure as in labels, and so that can be validated and completed by LSP. It also ease the use of katenary.
|
||||||
|
|
||||||
## func [GenerateSchema](<https://github.com/metal3d/katenary/blob/develop/generator/katenaryfile/main.go#L137>)
|
## func [GenerateSchema](<https://github.com/metal3d/katenary/blob/develop/generator/katenaryfile/main.go#L131>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func GenerateSchema() string
|
func GenerateSchema() string
|
||||||
|
@@ -15,7 +15,7 @@ const KatenaryLabelPrefix = "katenary.v3"
|
|||||||
```
|
```
|
||||||
|
|
||||||
<a name="GetLabelHelp"></a>
|
<a name="GetLabelHelp"></a>
|
||||||
## func [GetLabelHelp](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L88>)
|
## func [GetLabelHelp](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L87>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func GetLabelHelp(asMarkdown bool) string
|
func GetLabelHelp(asMarkdown bool) string
|
||||||
@@ -24,7 +24,7 @@ func GetLabelHelp(asMarkdown bool) string
|
|||||||
Generate the help for the labels.
|
Generate the help for the labels.
|
||||||
|
|
||||||
<a name="GetLabelHelpFor"></a>
|
<a name="GetLabelHelpFor"></a>
|
||||||
## func [GetLabelHelpFor](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L97>)
|
## func [GetLabelHelpFor](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L96>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func GetLabelHelpFor(labelname string, asMarkdown bool) string
|
func GetLabelHelpFor(labelname string, asMarkdown bool) string
|
||||||
@@ -33,7 +33,7 @@ func GetLabelHelpFor(labelname string, asMarkdown bool) string
|
|||||||
GetLabelHelpFor returns the help for a specific label.
|
GetLabelHelpFor returns the help for a specific label.
|
||||||
|
|
||||||
<a name="GetLabelNames"></a>
|
<a name="GetLabelNames"></a>
|
||||||
## func [GetLabelNames](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L72>)
|
## func [GetLabelNames](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L71>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func GetLabelNames() []string
|
func GetLabelNames() []string
|
||||||
@@ -42,7 +42,7 @@ func GetLabelNames() []string
|
|||||||
GetLabelNames returns a sorted list of all katenary label names.
|
GetLabelNames returns a sorted list of all katenary label names.
|
||||||
|
|
||||||
<a name="Prefix"></a>
|
<a name="Prefix"></a>
|
||||||
## func [Prefix](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L235>)
|
## func [Prefix](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L224>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Prefix() string
|
func Prefix() string
|
||||||
@@ -51,7 +51,7 @@ func Prefix() string
|
|||||||
|
|
||||||
|
|
||||||
<a name="Help"></a>
|
<a name="Help"></a>
|
||||||
## type [Help](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L64-L69>)
|
## type [Help](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L63-L68>)
|
||||||
|
|
||||||
Help is the documentation of a label.
|
Help is the documentation of a label.
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ type Help struct {
|
|||||||
```
|
```
|
||||||
|
|
||||||
<a name="Label"></a>
|
<a name="Label"></a>
|
||||||
## type [Label](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L57>)
|
## type [Label](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L56>)
|
||||||
|
|
||||||
Label is a katenary label to find in compose files.
|
Label is a katenary label to find in compose files.
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ const (
|
|||||||
```
|
```
|
||||||
|
|
||||||
<a name="LabelName"></a>
|
<a name="LabelName"></a>
|
||||||
### func [LabelName](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L59>)
|
### func [LabelName](<https://github.com/metal3d/katenary/blob/develop/generator/labels/katenaryLabels.go#L58>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func LabelName(name string) Label
|
func LabelName(name string) Label
|
||||||
|
60
doc/docs/packages/update.md
Normal file
60
doc/docs/packages/update.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<!-- Code generated by gomarkdoc. DO NOT EDIT -->
|
||||||
|
|
||||||
|
# update
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "katenary/update"
|
||||||
|
```
|
||||||
|
|
||||||
|
Update package is used to check if a new version of katenary is available.
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
<a name="Version"></a>
|
||||||
|
|
||||||
|
```go
|
||||||
|
var (
|
||||||
|
Version = "master" // reset by cmd/main.go
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<a name="DownloadFile"></a>
|
||||||
|
## func [DownloadFile](<https://github.com/metal3d/katenary/blob/develop/update/main.go#L134>)
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DownloadFile(url, exe string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
DownloadFile will download a url to a local file. It also ensure that the file is executable.
|
||||||
|
|
||||||
|
<a name="DownloadLatestVersion"></a>
|
||||||
|
## func [DownloadLatestVersion](<https://github.com/metal3d/katenary/blob/develop/update/main.go#L80>)
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DownloadLatestVersion(assets []Asset) error
|
||||||
|
```
|
||||||
|
|
||||||
|
DownloadLatestVersion will download the latest version of katenary.
|
||||||
|
|
||||||
|
<a name="Asset"></a>
|
||||||
|
## type [Asset](<https://github.com/metal3d/katenary/blob/develop/update/main.go#L23-L26>)
|
||||||
|
|
||||||
|
Asset is a github asset from release url.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Asset struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
URL string `json:"browser_download_url"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<a name="CheckLatestVersion"></a>
|
||||||
|
### func [CheckLatestVersion](<https://github.com/metal3d/katenary/blob/develop/update/main.go#L29>)
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CheckLatestVersion() (string, []Asset, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
CheckLatestVersion check katenary latest version from release and propose to download it
|
||||||
|
|
||||||
|
Generated by [gomarkdoc](<https://github.com/princjef/gomarkdoc>)
|
@@ -8,7 +8,7 @@ import "katenary/utils"
|
|||||||
|
|
||||||
Utils package provides some utility functions used in katenary. It defines some constants and functions used in the whole project.
|
Utils package provides some utility functions used in katenary. It defines some constants and functions used in the whole project.
|
||||||
|
|
||||||
## func [AsResourceName](<https://github.com/metal3d/katenary/blob/develop/utils/utils.go#L193>)
|
## func [AsResourceName](<https://github.com/metal3d/katenary/blob/develop/utils/utils.go#L191>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func AsResourceName(name string) string
|
func AsResourceName(name string) string
|
||||||
@@ -35,7 +35,7 @@ func CountStartingSpaces(line string) int
|
|||||||
CountStartingSpaces counts the number of spaces at the beginning of a string.
|
CountStartingSpaces counts the number of spaces at the beginning of a string.
|
||||||
|
|
||||||
<a name="EncodeBasicYaml"></a>
|
<a name="EncodeBasicYaml"></a>
|
||||||
## func [EncodeBasicYaml](<https://github.com/metal3d/katenary/blob/develop/utils/utils.go#L175>)
|
## func [EncodeBasicYaml](<https://github.com/metal3d/katenary/blob/develop/utils/utils.go#L173>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func EncodeBasicYaml(data any) ([]byte, error)
|
func EncodeBasicYaml(data any) ([]byte, error)
|
||||||
@@ -44,7 +44,7 @@ func EncodeBasicYaml(data any) ([]byte, error)
|
|||||||
EncodeBasicYaml encodes a basic yaml from an interface.
|
EncodeBasicYaml encodes a basic yaml from an interface.
|
||||||
|
|
||||||
<a name="FixedResourceName"></a>
|
<a name="FixedResourceName"></a>
|
||||||
## func [FixedResourceName](<https://github.com/metal3d/katenary/blob/develop/utils/utils.go#L187>)
|
## func [FixedResourceName](<https://github.com/metal3d/katenary/blob/develop/utils/utils.go#L185>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func FixedResourceName(name string) string
|
func FixedResourceName(name string) string
|
||||||
@@ -146,7 +146,7 @@ GetContainerByName returns a container by name and its index in the array.
|
|||||||
## func [Warn](<https://github.com/metal3d/katenary/blob/develop/utils/icons.go#L25>)
|
## func [Warn](<https://github.com/metal3d/katenary/blob/develop/utils/icons.go#L25>)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Warn(msg ...any)
|
func Warn(msg ...interface{})
|
||||||
```
|
```
|
||||||
|
|
||||||
Warn prints a warning message
|
Warn prints a warning message
|
||||||
|
@@ -54,6 +54,7 @@ nav:
|
|||||||
- Go Packages:
|
- Go Packages:
|
||||||
- packages/cmd/katenary.md
|
- packages/cmd/katenary.md
|
||||||
- packages/parser.md
|
- packages/parser.md
|
||||||
|
- packages/update.md
|
||||||
- packages/utils.md
|
- packages/utils.md
|
||||||
- Generator:
|
- Generator:
|
||||||
- Index: packages/generator.md
|
- Index: packages/generator.md
|
||||||
|
@@ -6,13 +6,11 @@ import (
|
|||||||
"katenary/generator/labels/labelStructs"
|
"katenary/generator/labels/labelStructs"
|
||||||
"katenary/utils"
|
"katenary/utils"
|
||||||
"log"
|
"log"
|
||||||
"maps"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"slices"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -44,7 +42,7 @@ type HelmChart struct {
|
|||||||
composeHash *string `yaml:"-"`
|
composeHash *string `yaml:"-"`
|
||||||
Name string `yaml:"name"`
|
Name string `yaml:"name"`
|
||||||
Icon string `yaml:"icon,omitempty"`
|
Icon string `yaml:"icon,omitempty"`
|
||||||
APIVersion string `yaml:"apiVersion"`
|
ApiVersion string `yaml:"apiVersion"`
|
||||||
Version string `yaml:"version"`
|
Version string `yaml:"version"`
|
||||||
AppVersion string `yaml:"appVersion"`
|
AppVersion string `yaml:"appVersion"`
|
||||||
Description string `yaml:"description"`
|
Description string `yaml:"description"`
|
||||||
@@ -58,7 +56,7 @@ func NewChart(name string) *HelmChart {
|
|||||||
Name: name,
|
Name: name,
|
||||||
Templates: make(map[string]*ChartTemplate, 0),
|
Templates: make(map[string]*ChartTemplate, 0),
|
||||||
Description: "A Helm chart for " + name,
|
Description: "A Helm chart for " + name,
|
||||||
APIVersion: "v2",
|
ApiVersion: "v2",
|
||||||
Version: "",
|
Version: "",
|
||||||
AppVersion: "", // set to 0.1.0 by default if no "main-app" label is found
|
AppVersion: "", // set to 0.1.0 by default if no "main-app" label is found
|
||||||
Values: map[string]any{
|
Values: map[string]any{
|
||||||
@@ -118,11 +116,9 @@ func (chart *HelmChart) SaveTemplates(templateDir string) {
|
|||||||
fmt.Println(utils.IconFailure, err)
|
fmt.Println(utils.IconFailure, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
|
||||||
if _, err := f.Write(t); err != nil {
|
|
||||||
log.Fatal("error writing template file:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
f.Write(t)
|
||||||
|
f.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +126,7 @@ func (chart *HelmChart) SaveTemplates(templateDir string) {
|
|||||||
func (chart *HelmChart) generateConfigMapsAndSecrets(project *types.Project) error {
|
func (chart *HelmChart) generateConfigMapsAndSecrets(project *types.Project) error {
|
||||||
appName := chart.Name
|
appName := chart.Name
|
||||||
for _, s := range project.Services {
|
for _, s := range project.Services {
|
||||||
if len(s.Environment) == 0 {
|
if s.Environment == nil || len(s.Environment) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +134,9 @@ func (chart *HelmChart) generateConfigMapsAndSecrets(project *types.Project) err
|
|||||||
secretsVar := types.MappingWithEquals{}
|
secretsVar := types.MappingWithEquals{}
|
||||||
|
|
||||||
// copy env to originalEnv
|
// copy env to originalEnv
|
||||||
maps.Copy(originalEnv, s.Environment)
|
for k, v := range s.Environment {
|
||||||
|
originalEnv[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
if v, ok := s.Labels[labels.LabelSecrets]; ok {
|
if v, ok := s.Labels[labels.LabelSecrets]; ok {
|
||||||
list, err := labelStructs.SecretsFrom(v)
|
list, err := labelStructs.SecretsFrom(v)
|
||||||
@@ -374,7 +372,7 @@ func (chart *HelmChart) setEnvironmentValuesFrom(service types.ServiceConfig, de
|
|||||||
if dep == nil || target == nil {
|
if dep == nil || target == nil {
|
||||||
log.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)
|
container, index := utils.GetContainerByName(target.service.Name, target.Spec.Template.Spec.Containers)
|
||||||
if container == nil {
|
if container == nil {
|
||||||
log.Fatalf("Container %s not found", target.GetName())
|
log.Fatalf("Container %s not found", target.GetName())
|
||||||
}
|
}
|
||||||
@@ -385,8 +383,11 @@ func (chart *HelmChart) setEnvironmentValuesFrom(service types.ServiceConfig, de
|
|||||||
isSecret := false
|
isSecret := false
|
||||||
secrets, err := labelStructs.SecretsFrom(dep.service.Labels[labels.LabelSecrets])
|
secrets, err := labelStructs.SecretsFrom(dep.service.Labels[labels.LabelSecrets])
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if slices.Contains(secrets, depName[1]) {
|
for _, secret := range secrets {
|
||||||
|
if secret == depName[1] {
|
||||||
isSecret = true
|
isSecret = true
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,7 +12,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
@@ -142,9 +142,7 @@ func NewConfigMapFromDirectory(service types.ServiceConfig, appName, path string
|
|||||||
// cumulate the path to the WorkingDir
|
// cumulate the path to the WorkingDir
|
||||||
path = filepath.Join(service.WorkingDir, path)
|
path = filepath.Join(service.WorkingDir, path)
|
||||||
path = filepath.Clean(path)
|
path = filepath.Clean(path)
|
||||||
if err := cm.AppendDir(path); err != nil {
|
cm.AppendDir(path)
|
||||||
log.Fatal("Error adding files to configmap:", err)
|
|
||||||
}
|
|
||||||
return cm
|
return cm
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,13 +159,13 @@ func (c *ConfigMap) AddBinaryData(key string, value []byte) {
|
|||||||
c.BinaryData[key] = value
|
c.BinaryData[key] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendDir adds files from given path to the configmap. It is not recursive, to add all files in a directory,
|
// AddFile adds files from given path to the configmap. It is not recursive, to add all files in a directory,
|
||||||
// you need to call this function for each subdirectory.
|
// you need to call this function for each subdirectory.
|
||||||
func (c *ConfigMap) AppendDir(path string) error {
|
func (c *ConfigMap) AppendDir(path string) error {
|
||||||
// read all files in the path and add them to the configmap
|
// read all files in the path and add them to the configmap
|
||||||
stat, err := os.Stat(path)
|
stat, err := os.Stat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("path %s does not exist, %w", path, err)
|
return fmt.Errorf("Path %s does not exist, %w\n", path, err)
|
||||||
}
|
}
|
||||||
// recursively read all files in the path and add them to the configmap
|
// recursively read all files in the path and add them to the configmap
|
||||||
if stat.IsDir() {
|
if stat.IsDir() {
|
||||||
@@ -214,7 +212,7 @@ func (c *ConfigMap) AppendFile(path string) error {
|
|||||||
// read all files in the path and add them to the configmap
|
// read all files in the path and add them to the configmap
|
||||||
stat, err := os.Stat(path)
|
stat, err := os.Stat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("path %s doesn not exists, %w", path, err)
|
return fmt.Errorf("Path %s doesn not exists, %w", path, err)
|
||||||
}
|
}
|
||||||
// recursively read all files in the path and add them to the configmap
|
// recursively read all files in the path and add them to the configmap
|
||||||
if !stat.IsDir() {
|
if !stat.IsDir() {
|
||||||
|
@@ -6,7 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"sigs.k8s.io/yaml"
|
"sigs.k8s.io/yaml"
|
||||||
)
|
)
|
||||||
|
@@ -18,7 +18,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
const ingressClassHelp = `# Default value for ingress.class annotation
|
const ingressClassHelp = `# Default value for ingress.class annotation
|
||||||
@@ -113,11 +113,7 @@ func Convert(config ConvertOptions, dockerComposeFile ...string) error {
|
|||||||
fmt.Println(utils.IconFailure, err)
|
fmt.Println(utils.IconFailure, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer func() {
|
defer os.Chdir(currentDir) // after the generation, go back to the original directory
|
||||||
if err := os.Chdir(currentDir); err != nil { // after the generation, go back to the original directory
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// repove the directory part of the docker-compose files
|
// repove the directory part of the docker-compose files
|
||||||
for i, f := range dockerComposeFile {
|
for i, f := range dockerComposeFile {
|
||||||
@@ -631,11 +627,7 @@ func writeContent(path string, content []byte) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
defer func() {
|
f.Write(content)
|
||||||
if _, err := f.Write(content); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// helmLint runs "helm lint" on the output directory.
|
// helmLint runs "helm lint" on the output directory.
|
||||||
|
@@ -7,7 +7,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
batchv1 "k8s.io/api/batch/v1"
|
batchv1 "k8s.io/api/batch/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
@@ -12,7 +12,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -131,7 +131,7 @@ func (d *Deployment) AddContainer(service types.ServiceConfig) {
|
|||||||
Image: utils.TplValue(service.Name, "repository.image") + ":" +
|
Image: utils.TplValue(service.Name, "repository.image") + ":" +
|
||||||
utils.TplValue(service.Name, "repository.tag", d.defaultTag),
|
utils.TplValue(service.Name, "repository.tag", d.defaultTag),
|
||||||
Ports: ports,
|
Ports: ports,
|
||||||
Name: service.ContainerName,
|
Name: service.Name,
|
||||||
ImagePullPolicy: corev1.PullIfNotPresent,
|
ImagePullPolicy: corev1.PullIfNotPresent,
|
||||||
Resources: corev1.ResourceRequirements{
|
Resources: corev1.ResourceRequirements{
|
||||||
Requests: corev1.ResourceList{},
|
Requests: corev1.ResourceList{},
|
||||||
@@ -253,8 +253,8 @@ func (d *Deployment) BindFrom(service types.ServiceConfig, binded *Deployment) {
|
|||||||
// get the container
|
// get the container
|
||||||
}
|
}
|
||||||
// add volume mount to the container
|
// add volume mount to the container
|
||||||
targetContainer, ti := utils.GetContainerByName(service.ContainerName, d.Spec.Template.Spec.Containers)
|
targetContainer, ti := utils.GetContainerByName(service.Name, d.Spec.Template.Spec.Containers)
|
||||||
sourceContainer, _ := utils.GetContainerByName(service.ContainerName, binded.Spec.Template.Spec.Containers)
|
sourceContainer, _ := utils.GetContainerByName(service.Name, binded.Spec.Template.Spec.Containers)
|
||||||
for _, bindedMount := range sourceContainer.VolumeMounts {
|
for _, bindedMount := range sourceContainer.VolumeMounts {
|
||||||
if bindedMount.Name == bindedVolume.Name {
|
if bindedMount.Name == bindedVolume.Name {
|
||||||
targetContainer.VolumeMounts = append(targetContainer.VolumeMounts, bindedMount)
|
targetContainer.VolumeMounts = append(targetContainer.VolumeMounts, bindedMount)
|
||||||
@@ -305,7 +305,10 @@ func (d *Deployment) SetEnvFrom(service types.ServiceConfig, appName string, sam
|
|||||||
if len(service.Environment) == 0 {
|
if len(service.Environment) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
inSamePod := len(samePod) > 0 && samePod[0]
|
inSamePod := false
|
||||||
|
if len(samePod) > 0 && samePod[0] {
|
||||||
|
inSamePod = true
|
||||||
|
}
|
||||||
|
|
||||||
drop := []string{}
|
drop := []string{}
|
||||||
secrets := []string{}
|
secrets := []string{}
|
||||||
@@ -408,7 +411,7 @@ func (d *Deployment) BindMapFilesToContainer(service types.ServiceConfig, secret
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
container, index := utils.GetContainerByName(service.ContainerName, d.Spec.Template.Spec.Containers)
|
container, index := utils.GetContainerByName(service.Name, d.Spec.Template.Spec.Containers)
|
||||||
if container == nil {
|
if container == nil {
|
||||||
utils.Warn("Container not found for service " + service.Name)
|
utils.Warn("Container not found for service " + service.Name)
|
||||||
return nil, -1
|
return nil, -1
|
||||||
@@ -657,13 +660,11 @@ func (d *Deployment) appendFileToConfigMap(service types.ServiceConfig, appName
|
|||||||
d.configMaps[pathname].mountPath = mp
|
d.configMaps[pathname].mountPath = mp
|
||||||
|
|
||||||
}
|
}
|
||||||
if err := cm.AppendFile(volume.Source); err != nil {
|
cm.AppendFile(volume.Source)
|
||||||
log.Fatal("Error adding file to configmap:", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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, isSamePod bool, tobind map[string]bool, service types.ServiceConfig, appName string) {
|
||||||
container, index := utils.GetContainerByName(service.ContainerName, d.Spec.Template.Spec.Containers)
|
container, index := utils.GetContainerByName(service.Name, d.Spec.Template.Spec.Containers)
|
||||||
|
|
||||||
defer func(d *Deployment, container *corev1.Container, index int) {
|
defer func(d *Deployment, container *corev1.Container, index int) {
|
||||||
d.Spec.Template.Spec.Containers[index] = *container
|
d.Spec.Template.Spec.Containers[index] = *container
|
||||||
|
@@ -4,10 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"katenary/generator/labels"
|
"katenary/generator/labels"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
yaml3 "gopkg.in/yaml.v3"
|
|
||||||
v1 "k8s.io/api/apps/v1"
|
v1 "k8s.io/api/apps/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"sigs.k8s.io/yaml"
|
"sigs.k8s.io/yaml"
|
||||||
@@ -326,172 +324,14 @@ services:
|
|||||||
Environment map[string]string `yaml:"environment"`
|
Environment map[string]string `yaml:"environment"`
|
||||||
} `yaml:"web"`
|
} `yaml:"web"`
|
||||||
}{}
|
}{}
|
||||||
if err := yaml3.Unmarshal(valuesContent, &mapping); err != nil {
|
if err := yaml.Unmarshal(valuesContent, &mapping); err != nil {
|
||||||
t.Errorf(unmarshalError, err)
|
t.Errorf(unmarshalError, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, ok := mapping.Web.Environment["FOO"]; !ok {
|
if _, ok := mapping.Web.Environment["FOO"]; !ok {
|
||||||
t.Errorf("Expected FOO in web environment")
|
t.Errorf("Expected FOO in web environment")
|
||||||
if v != "bar" {
|
|
||||||
t.Errorf("Expected FOO to be bar, got %s", v)
|
|
||||||
}
|
}
|
||||||
}
|
if _, ok := mapping.Web.Environment["BAZ"]; ok {
|
||||||
if v, ok := mapping.Web.Environment["BAZ"]; ok {
|
|
||||||
t.Errorf("Expected BAZ not in web environment")
|
t.Errorf("Expected BAZ not in web environment")
|
||||||
if v != "qux" {
|
|
||||||
t.Errorf("Expected BAZ to be qux, got %s", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWithUnderscoreInContainerName(t *testing.T) {
|
|
||||||
composeFile := `
|
|
||||||
services:
|
|
||||||
web-app:
|
|
||||||
image: nginx:1.29
|
|
||||||
container_name: web_app_container
|
|
||||||
environment:
|
|
||||||
FOO: BAR
|
|
||||||
labels:
|
|
||||||
%s/values: |
|
|
||||||
- FOO
|
|
||||||
`
|
|
||||||
composeFile = fmt.Sprintf(composeFile, labels.Prefix())
|
|
||||||
tmpDir := setup(composeFile)
|
|
||||||
defer teardown(tmpDir)
|
|
||||||
|
|
||||||
currentDir, _ := os.Getwd()
|
|
||||||
os.Chdir(tmpDir)
|
|
||||||
defer os.Chdir(currentDir)
|
|
||||||
|
|
||||||
output := internalCompileTest(t, "-s", "templates/web_app/deployment.yaml")
|
|
||||||
dt := v1.Deployment{}
|
|
||||||
if err := yaml.Unmarshal([]byte(output), &dt); err != nil {
|
|
||||||
t.Errorf(unmarshalError, err)
|
|
||||||
}
|
|
||||||
// find container.name
|
|
||||||
containerName := dt.Spec.Template.Spec.Containers[0].Name
|
|
||||||
if strings.Contains(containerName, "_") {
|
|
||||||
t.Errorf("Expected container name to not contain underscores, got %s", containerName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWithDashes(t *testing.T) {
|
|
||||||
composeFile := `
|
|
||||||
services:
|
|
||||||
web-app:
|
|
||||||
image: nginx:1.29
|
|
||||||
environment:
|
|
||||||
FOO: BAR
|
|
||||||
labels:
|
|
||||||
%s/values: |
|
|
||||||
- FOO
|
|
||||||
`
|
|
||||||
|
|
||||||
composeFile = fmt.Sprintf(composeFile, labels.Prefix())
|
|
||||||
tmpDir := setup(composeFile)
|
|
||||||
defer teardown(tmpDir)
|
|
||||||
|
|
||||||
currentDir, _ := os.Getwd()
|
|
||||||
os.Chdir(tmpDir)
|
|
||||||
defer os.Chdir(currentDir)
|
|
||||||
|
|
||||||
output := internalCompileTest(t, "-s", "templates/web_app/deployment.yaml")
|
|
||||||
dt := v1.Deployment{}
|
|
||||||
if err := yaml.Unmarshal([]byte(output), &dt); err != nil {
|
|
||||||
t.Errorf(unmarshalError, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
valuesFile := "./chart/values.yaml"
|
|
||||||
if _, err := os.Stat(valuesFile); os.IsNotExist(err) {
|
|
||||||
t.Errorf("values.yaml does not exist")
|
|
||||||
}
|
|
||||||
valuesContent, err := os.ReadFile(valuesFile)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error reading values.yaml: %s", err)
|
|
||||||
}
|
|
||||||
mapping := struct {
|
|
||||||
Web struct {
|
|
||||||
Environment map[string]string `yaml:"environment"`
|
|
||||||
} `yaml:"web_app"`
|
|
||||||
}{}
|
|
||||||
if err := yaml3.Unmarshal(valuesContent, &mapping); err != nil {
|
|
||||||
t.Errorf(unmarshalError, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// we must have FOO in web_app environment (not web-app)
|
|
||||||
// this validates that the service name is converted to a valid k8s name
|
|
||||||
if v, ok := mapping.Web.Environment["FOO"]; !ok {
|
|
||||||
t.Errorf("Expected FOO in web_app environment")
|
|
||||||
if v != "BAR" {
|
|
||||||
t.Errorf("Expected FOO to be BAR, got %s", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDashesWithValueFrom(t *testing.T) {
|
|
||||||
composeFile := `
|
|
||||||
services:
|
|
||||||
web-app:
|
|
||||||
image: nginx:1.29
|
|
||||||
environment:
|
|
||||||
FOO: BAR
|
|
||||||
labels:
|
|
||||||
%[1]s/values: |
|
|
||||||
- FOO
|
|
||||||
web2:
|
|
||||||
image: nginx:1.29
|
|
||||||
labels:
|
|
||||||
%[1]s/values-from: |
|
|
||||||
BAR: web-app.FOO
|
|
||||||
`
|
|
||||||
|
|
||||||
composeFile = fmt.Sprintf(composeFile, labels.Prefix())
|
|
||||||
tmpDir := setup(composeFile)
|
|
||||||
defer teardown(tmpDir)
|
|
||||||
|
|
||||||
currentDir, _ := os.Getwd()
|
|
||||||
os.Chdir(tmpDir)
|
|
||||||
defer os.Chdir(currentDir)
|
|
||||||
|
|
||||||
output := internalCompileTest(t, "-s", "templates/web2/deployment.yaml")
|
|
||||||
dt := v1.Deployment{}
|
|
||||||
if err := yaml.Unmarshal([]byte(output), &dt); err != nil {
|
|
||||||
t.Errorf(unmarshalError, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
valuesFile := "./chart/values.yaml"
|
|
||||||
if _, err := os.Stat(valuesFile); os.IsNotExist(err) {
|
|
||||||
t.Errorf("values.yaml does not exist")
|
|
||||||
}
|
|
||||||
valuesContent, err := os.ReadFile(valuesFile)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Error reading values.yaml: %s", err)
|
|
||||||
}
|
|
||||||
mapping := struct {
|
|
||||||
Web struct {
|
|
||||||
Environment map[string]string `yaml:"environment"`
|
|
||||||
} `yaml:"web_app"`
|
|
||||||
}{}
|
|
||||||
if err := yaml3.Unmarshal(valuesContent, &mapping); err != nil {
|
|
||||||
t.Errorf(unmarshalError, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// we must have FOO in web_app environment (not web-app)
|
|
||||||
// this validates that the service name is converted to a valid k8s name
|
|
||||||
if v, ok := mapping.Web.Environment["FOO"]; !ok {
|
|
||||||
t.Errorf("Expected FOO in web_app environment")
|
|
||||||
if v != "BAR" {
|
|
||||||
t.Errorf("Expected FOO to be BAR, got %s", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ensure that the deployment has the value from the other service
|
|
||||||
barenv := dt.Spec.Template.Spec.Containers[0].Env[0]
|
|
||||||
if barenv.Value != "" {
|
|
||||||
t.Errorf("Expected value to be empty")
|
|
||||||
}
|
|
||||||
if barenv.ValueFrom == nil {
|
|
||||||
t.Errorf("Expected valueFrom to be set")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,17 +1,14 @@
|
|||||||
/*
|
/*
|
||||||
Package generator generates kubernetes objects from a "compose" file and transforms them into a helm chart.
|
The generator package generates kubernetes objects from a "compose" file and transforms them into a helm chart.
|
||||||
|
|
||||||
The generator package is the core of katenary. It is responsible for generating kubernetes objects from a compose file
|
The generator package is the core of katenary. It is responsible for generating kubernetes objects from a compose file and transforming them into a helm chart.
|
||||||
and transforming them into a helm chart.
|
Conversion manipulates Yaml representation of kubernetes object to add conditions, labels, annotations, etc. to the objects. It also create the values to be set to
|
||||||
Conversion manipulates Yaml representation of kubernetes object to add conditions, labels, annotations, etc. to the
|
the values.yaml file.
|
||||||
objects. It also create the values to be set to the values.yaml file.
|
|
||||||
|
|
||||||
The generate.Convert() create an HelmChart object and call "Generate()" method to convert from a compose file to a helm
|
The generate.Convert() create an HelmChart object and call "Generate()" method to convert from a compose file to a helm chart.
|
||||||
chart. It saves the helm chart in the given directory.
|
It saves the helm chart in the given directory.
|
||||||
|
|
||||||
If you want to change or override the write behavior, you can use the HelmChart.Generate() function and implement your
|
If you want to change or override the write behavior, you can use the HelmChart.Generate() function and implement your own write function. This function returns
|
||||||
own write function. This function returns
|
the helm chart object containing all kubernetes objects and helm chart ingormation. It does not write the helm chart to the disk.
|
||||||
the helm chart object containing all kubernetes objects and helm chart ingormation. It does not write the helm chart to
|
|
||||||
the disk.
|
|
||||||
*/
|
*/
|
||||||
package generator
|
package generator
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
/* Package extrafiles provides function to generate the Chart files that are not objects. Like README.md and notes.txt... */
|
/* extrafiles package provides function to generate the Chart files that are not objects. Like README.md and notes.txt... */
|
||||||
package extrafiles
|
package extrafiles
|
||||||
|
@@ -1,40 +0,0 @@
|
|||||||
package extrafiles
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
// override the embedded template for testing
|
|
||||||
var testTemplate = `
|
|
||||||
Some header
|
|
||||||
{{ ingress_list }}
|
|
||||||
Some footer
|
|
||||||
`
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
notesTemplate = testTemplate
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNotesFile_NoServices(t *testing.T) {
|
|
||||||
result := NotesFile([]string{})
|
|
||||||
if !strings.Contains(result, "Some header") || !strings.Contains(result, "Some footer") {
|
|
||||||
t.Errorf("Expected template header/footer in output, got: %s", result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNotesFile_WithServices(t *testing.T) {
|
|
||||||
services := []string{"svc1", "svc2"}
|
|
||||||
result := NotesFile(services)
|
|
||||||
|
|
||||||
for _, svc := range services {
|
|
||||||
cond := "{{- if and .Values." + svc + ".ingress .Values." + svc + ".ingress.enabled }}"
|
|
||||||
line := "{{- $count = add1 $count -}}{{- $listOfURL = printf \"%s\\n- http://%s\" $listOfURL (tpl .Values." + svc + ".ingress.host .) -}}"
|
|
||||||
if !strings.Contains(result, cond) {
|
|
||||||
t.Errorf("Expected condition for service %s in output", svc)
|
|
||||||
}
|
|
||||||
if !strings.Contains(result, line) {
|
|
||||||
t.Errorf("Expected line for service %s in output", svc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
@@ -21,7 +20,7 @@ type chart struct {
|
|||||||
Values []string
|
Values []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseValues(prefix string, values map[string]any, result map[string]string) {
|
func parseValues(prefix string, values map[string]interface{}, result map[string]string) {
|
||||||
for key, value := range values {
|
for key, value := range values {
|
||||||
path := key
|
path := key
|
||||||
if prefix != "" {
|
if prefix != "" {
|
||||||
@@ -29,11 +28,11 @@ func parseValues(prefix string, values map[string]any, result map[string]string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch v := value.(type) {
|
switch v := value.(type) {
|
||||||
case []any:
|
case []interface{}:
|
||||||
for i, u := range v {
|
for i, u := range v {
|
||||||
parseValues(fmt.Sprintf("%s[%d]", path, i), map[string]any{"value": u}, result)
|
parseValues(fmt.Sprintf("%s[%d]", path, i), map[string]interface{}{"value": u}, result)
|
||||||
}
|
}
|
||||||
case map[string]any:
|
case map[string]interface{}:
|
||||||
parseValues(path, v, result)
|
parseValues(path, v, result)
|
||||||
default:
|
default:
|
||||||
strValue := fmt.Sprintf("`%v`", value)
|
strValue := fmt.Sprintf("`%v`", value)
|
||||||
@@ -49,9 +48,7 @@ func ReadMeFile(charname, description string, values map[string]any) string {
|
|||||||
|
|
||||||
vv := map[string]any{}
|
vv := map[string]any{}
|
||||||
out, _ := yaml.Marshal(values)
|
out, _ := yaml.Marshal(values)
|
||||||
if err := yaml.Unmarshal(out, &vv); err != nil {
|
yaml.Unmarshal(out, &vv)
|
||||||
log.Printf("Error parsing values: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
result := make(map[string]string)
|
result := make(map[string]string)
|
||||||
parseValues("", vv, result)
|
parseValues("", vv, result)
|
||||||
|
@@ -1,33 +0,0 @@
|
|||||||
package extrafiles
|
|
||||||
|
|
||||||
import (
|
|
||||||
"regexp"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestReadMeFile_Basic(t *testing.T) {
|
|
||||||
values := map[string]any{
|
|
||||||
"replicas": 2,
|
|
||||||
"image": map[string]any{
|
|
||||||
"repository": "nginx",
|
|
||||||
"tag": "latest",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
result := ReadMeFile("testchart", "A test chart", values)
|
|
||||||
t.Logf("Generated README content:\n%s", result)
|
|
||||||
paramerRegExp := regexp.MustCompile(`\|\s+` + "`" + `(.*?)` + "`" + `\s+\|\s+` + "`" + `(.*?)` + "`" + `\s+\|`)
|
|
||||||
matches := paramerRegExp.FindAllStringSubmatch(result, -1)
|
|
||||||
if len(matches) != 3 {
|
|
||||||
t.Errorf("Expected 5 lines in the table for headers and parameters, got %d", len(matches))
|
|
||||||
}
|
|
||||||
if matches[0][1] != "image.repository" || matches[0][2] != "nginx" {
|
|
||||||
t.Errorf("Expected third line to be image.repository, got %s", matches[1])
|
|
||||||
}
|
|
||||||
if matches[1][1] != "image.tag" || matches[1][2] != "latest" {
|
|
||||||
t.Errorf("Expected fourth line to be image.tag, got %s", matches[2])
|
|
||||||
}
|
|
||||||
if matches[2][1] != "replicas" || matches[2][2] != "2" {
|
|
||||||
t.Errorf("Expected second line to be replicas, got %s", matches[0])
|
|
||||||
}
|
|
||||||
}
|
|
@@ -4,15 +4,13 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"katenary/generator/labels"
|
"katenary/generator/labels"
|
||||||
"katenary/generator/labels/labelStructs"
|
|
||||||
"katenary/utils"
|
"katenary/utils"
|
||||||
"log"
|
"log"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"sigs.k8s.io/yaml"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Generate a chart from a compose project.
|
// Generate a chart from a compose project.
|
||||||
@@ -45,16 +43,6 @@ func Generate(project *types.Project) (*HelmChart, error) {
|
|||||||
Annotations[labels.LabelName("compose-hash")] = hash
|
Annotations[labels.LabelName("compose-hash")] = hash
|
||||||
chart.composeHash = &hash
|
chart.composeHash = &hash
|
||||||
|
|
||||||
// drop all services with the "ignore" label
|
|
||||||
dropIngoredServices(project)
|
|
||||||
|
|
||||||
fixContainerNames(project)
|
|
||||||
|
|
||||||
// rename all services name to remove dashes
|
|
||||||
if err := fixResourceNames(project); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// find the "main-app" label, and set chart.AppVersion to the tag if exists
|
// find the "main-app" label, and set chart.AppVersion to the tag if exists
|
||||||
mainCount := 0
|
mainCount := 0
|
||||||
for _, service := range project.Services {
|
for _, service := range project.Services {
|
||||||
@@ -119,10 +107,7 @@ func Generate(project *types.Project) (*HelmChart, error) {
|
|||||||
for _, s := range project.Services {
|
for _, s := range project.Services {
|
||||||
for _, d := range s.GetDependencies() {
|
for _, d := range s.GetDependencies() {
|
||||||
if dep, ok := deployments[d]; ok {
|
if dep, ok := deployments[d]; ok {
|
||||||
err := deployments[s.Name].DependsOn(dep, d)
|
deployments[s.Name].DependsOn(dep, d)
|
||||||
if err != nil {
|
|
||||||
log.Printf("error creating init container for service %[1]s: %[2]s", s.Name, err)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service %[1]s depends on %[2]s, but %[2]s is not defined", s.Name, d)
|
log.Printf("service %[1]s depends on %[2]s, but %[2]s is not defined", s.Name, d)
|
||||||
}
|
}
|
||||||
@@ -134,9 +119,7 @@ func Generate(project *types.Project) (*HelmChart, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generate configmaps with environment variables
|
// generate configmaps with environment variables
|
||||||
if err := chart.generateConfigMapsAndSecrets(project); err != nil {
|
chart.generateConfigMapsAndSecrets(project)
|
||||||
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
|
// if the env-from label is set, we need to add the env vars from the configmap
|
||||||
// to the environment of the service
|
// to the environment of the service
|
||||||
@@ -204,52 +187,6 @@ func Generate(project *types.Project) (*HelmChart, error) {
|
|||||||
return chart, nil
|
return chart, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// dropIngoredServices removes all services with the "ignore" label set to true (or yes).
|
|
||||||
func dropIngoredServices(project *types.Project) {
|
|
||||||
for i, service := range project.Services {
|
|
||||||
if isIgnored(service) {
|
|
||||||
project.Services = append(project.Services[:i], project.Services[i+1:]...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fixResourceNames renames all services and related resources to remove dashes.
|
|
||||||
func fixResourceNames(project *types.Project) error {
|
|
||||||
// rename all services name to remove dashes
|
|
||||||
for i, service := range project.Services {
|
|
||||||
if service.Name != utils.AsResourceName(service.Name) {
|
|
||||||
fixed := utils.AsResourceName(service.Name)
|
|
||||||
for j, s := range project.Services {
|
|
||||||
// for the same-pod services, we need to keep the original name
|
|
||||||
if samepod, ok := s.Labels[labels.LabelSamePod]; ok && samepod == service.Name {
|
|
||||||
s.Labels[labels.LabelSamePod] = fixed
|
|
||||||
project.Services[j] = s
|
|
||||||
}
|
|
||||||
// also, the value-from label should be updated
|
|
||||||
if valuefrom, ok := s.Labels[labels.LabelValueFrom]; ok {
|
|
||||||
vf, err := labelStructs.GetValueFrom(valuefrom)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for varname, bind := range *vf {
|
|
||||||
log.Printf("service %s, varname %s, bind %s", service.Name, varname, bind)
|
|
||||||
bind := strings.ReplaceAll(bind, service.Name, fixed)
|
|
||||||
(*vf)[varname] = bind
|
|
||||||
}
|
|
||||||
output, err := yaml.Marshal(vf)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
s.Labels[labels.LabelValueFrom] = string(output)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
service.Name = fixed
|
|
||||||
project.Services[i] = service
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// serviceIsMain returns true if the service is the main app.
|
// serviceIsMain returns true if the service is the main app.
|
||||||
func serviceIsMain(service types.ServiceConfig) bool {
|
func serviceIsMain(service types.ServiceConfig) bool {
|
||||||
if main, ok := service.Labels[labels.LabelMainApp]; ok {
|
if main, ok := service.Labels[labels.LabelMainApp]; ok {
|
||||||
@@ -267,7 +204,7 @@ func addStaticVolumes(deployments map[string]*Deployment, service types.ServiceC
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
container, index := utils.GetContainerByName(service.ContainerName, d.Spec.Template.Spec.Containers)
|
container, index := utils.GetContainerByName(service.Name, d.Spec.Template.Spec.Containers)
|
||||||
if container == nil { // may append for the same-pod services
|
if container == nil { // may append for the same-pod services
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -319,7 +256,7 @@ func computeNIndent(b []byte) []byte {
|
|||||||
startSpaces = spaces[0]
|
startSpaces = spaces[0]
|
||||||
}
|
}
|
||||||
line = []byte(startSpaces + strings.TrimLeft(string(line), " "))
|
line = []byte(startSpaces + strings.TrimLeft(string(line), " "))
|
||||||
line = bytes.ReplaceAll(line, []byte("__indent__"), fmt.Appendf(nil, "%d", len(startSpaces)))
|
line = bytes.ReplaceAll(line, []byte("__indent__"), []byte(fmt.Sprintf("%d", len(startSpaces))))
|
||||||
lines[i] = line
|
lines[i] = line
|
||||||
}
|
}
|
||||||
return bytes.Join(lines, []byte("\n"))
|
return bytes.Join(lines, []byte("\n"))
|
||||||
@@ -392,7 +329,7 @@ func samePodVolume(service types.ServiceConfig, v types.ServiceVolumeConfig, dep
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(service.Volumes) == 0 {
|
if service.Volumes == nil || len(service.Volumes) == 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -418,15 +355,3 @@ func samePodVolume(service types.ServiceConfig, v types.ServiceVolumeConfig, dep
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func fixContainerNames(project *types.Project) {
|
|
||||||
// fix container names to be unique
|
|
||||||
for i, service := range project.Services {
|
|
||||||
if service.ContainerName == "" {
|
|
||||||
service.ContainerName = utils.FixedResourceName(service.Name)
|
|
||||||
} else {
|
|
||||||
service.ContainerName = utils.FixedResourceName(service.ContainerName)
|
|
||||||
}
|
|
||||||
project.Services[i] = service
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -7,7 +7,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
networkv1 "k8s.io/api/networking/v1"
|
networkv1 "k8s.io/api/networking/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
|
@@ -12,7 +12,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
"github.com/invopop/jsonschema"
|
"github.com/invopop/jsonschema"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
@@ -72,33 +72,29 @@ func OverrideWithConfig(project *types.Project) {
|
|||||||
}
|
}
|
||||||
for i, p := range project.Services {
|
for i, p := range project.Services {
|
||||||
name := p.Name
|
name := p.Name
|
||||||
if project.Services[i].Labels == nil {
|
if p.Labels == nil {
|
||||||
project.Services[i].Labels = make(map[string]string)
|
p.Labels = make(map[string]string)
|
||||||
}
|
project.Services[i] = p
|
||||||
mustGetLabelContent := func(o any, s *types.ServiceConfig, labelName string) {
|
|
||||||
err := getLabelContent(o, s, labelName)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if s, ok := services[name]; ok {
|
if s, ok := services[name]; ok {
|
||||||
mustGetLabelContent(s.MainApp, &project.Services[i], labels.LabelMainApp)
|
service := project.Services[i]
|
||||||
mustGetLabelContent(s.Values, &project.Services[i], labels.LabelValues)
|
getLabelContent(s.MainApp, &service, labels.LabelMainApp)
|
||||||
mustGetLabelContent(s.Secrets, &project.Services[i], labels.LabelSecrets)
|
getLabelContent(s.Values, &service, labels.LabelValues)
|
||||||
mustGetLabelContent(s.Ports, &project.Services[i], labels.LabelPorts)
|
getLabelContent(s.Secrets, &service, labels.LabelSecrets)
|
||||||
mustGetLabelContent(s.Ingress, &project.Services[i], labels.LabelIngress)
|
getLabelContent(s.Ports, &service, labels.LabelPorts)
|
||||||
mustGetLabelContent(s.HealthCheck, &project.Services[i], labels.LabelHealthCheck)
|
getLabelContent(s.Ingress, &service, labels.LabelIngress)
|
||||||
mustGetLabelContent(s.SamePod, &project.Services[i], labels.LabelSamePod)
|
getLabelContent(s.HealthCheck, &service, labels.LabelHealthCheck)
|
||||||
mustGetLabelContent(s.Description, &project.Services[i], labels.LabelDescription)
|
getLabelContent(s.SamePod, &service, labels.LabelSamePod)
|
||||||
mustGetLabelContent(s.Ignore, &project.Services[i], labels.LabelIgnore)
|
getLabelContent(s.Description, &service, labels.LabelDescription)
|
||||||
mustGetLabelContent(s.Dependencies, &project.Services[i], labels.LabelDependencies)
|
getLabelContent(s.Ignore, &service, labels.LabelIgnore)
|
||||||
mustGetLabelContent(s.ConfigMapFile, &project.Services[i], labels.LabelConfigMapFiles)
|
getLabelContent(s.Dependencies, &service, labels.LabelDependencies)
|
||||||
mustGetLabelContent(s.MapEnv, &project.Services[i], labels.LabelMapEnv)
|
getLabelContent(s.ConfigMapFile, &service, labels.LabelConfigMapFiles)
|
||||||
mustGetLabelContent(s.CronJob, &project.Services[i], labels.LabelCronJob)
|
getLabelContent(s.MapEnv, &service, labels.LabelMapEnv)
|
||||||
mustGetLabelContent(s.EnvFrom, &project.Services[i], labels.LabelEnvFrom)
|
getLabelContent(s.CronJob, &service, labels.LabelCronJob)
|
||||||
mustGetLabelContent(s.ExchangeVolumes, &project.Services[i], labels.LabelExchangeVolume)
|
getLabelContent(s.EnvFrom, &service, labels.LabelEnvFrom)
|
||||||
mustGetLabelContent(s.ValuesFrom, &project.Services[i], labels.LabelValueFrom)
|
getLabelContent(s.ExchangeVolumes, &service, labels.LabelExchangeVolume)
|
||||||
|
getLabelContent(s.ValuesFrom, &service, labels.LabelValueFrom)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Println(utils.IconInfo, "Katenary file loaded successfully, the services are now configured.")
|
fmt.Println(utils.IconInfo, "Katenary file loaded successfully, the services are now configured.")
|
||||||
@@ -129,6 +125,9 @@ func getLabelContent(o any, service *types.ServiceConfig, labelName string) erro
|
|||||||
val = strings.TrimSpace(string(c))
|
val = strings.TrimSpace(string(c))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if service.Labels == nil {
|
||||||
|
service.Labels = make(map[string]string)
|
||||||
|
}
|
||||||
service.Labels[labelName] = val
|
service.Labels[labelName] = val
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -161,5 +160,5 @@ func GenerateSchema() string {
|
|||||||
return err.Error()
|
return err.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
return out.String()
|
return string(out.Bytes())
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
package katenaryfile
|
package katenaryfile
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"katenary/generator/labels"
|
"katenary/generator/labels"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/cli"
|
"github.com/compose-spec/compose-go/v2/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBuildSchema(t *testing.T) {
|
func TestBuildSchema(t *testing.T) {
|
||||||
@@ -33,7 +34,7 @@ webapp:
|
|||||||
// create /tmp/katenary-test-override directory, save the compose.yaml file
|
// create /tmp/katenary-test-override directory, save the compose.yaml file
|
||||||
tmpDir, err := os.MkdirTemp("", "katenary-test-override")
|
tmpDir, err := os.MkdirTemp("", "katenary-test-override")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create temp directory: %s", err.Error())
|
t.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
composeFile := filepath.Join(tmpDir, "compose.yaml")
|
composeFile := filepath.Join(tmpDir, "compose.yaml")
|
||||||
katenaryFile := filepath.Join(tmpDir, "katenary.yaml")
|
katenaryFile := filepath.Join(tmpDir, "katenary.yaml")
|
||||||
@@ -56,10 +57,13 @@ webapp:
|
|||||||
cli.WithWorkingDirectory(tmpDir),
|
cli.WithWorkingDirectory(tmpDir),
|
||||||
cli.WithDefaultConfigPath,
|
cli.WithDefaultConfigPath,
|
||||||
)
|
)
|
||||||
project, err := cli.ProjectFromOptions(options)
|
project, err := cli.ProjectFromOptions(context.TODO(), options)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
OverrideWithConfig(project)
|
OverrideWithConfig(project)
|
||||||
w := project.Services[0].Labels
|
w := project.Services["webapp"].Labels
|
||||||
if v, ok := w[labels.LabelPorts]; !ok {
|
if v, ok := w[labels.LabelPorts]; !ok {
|
||||||
t.Fatal("Expected ports to be defined", v)
|
t.Fatal("Expected ports to be defined", v)
|
||||||
}
|
}
|
||||||
@@ -83,7 +87,7 @@ webapp:
|
|||||||
// create /tmp/katenary-test-override directory, save the compose.yaml file
|
// create /tmp/katenary-test-override directory, save the compose.yaml file
|
||||||
tmpDir, err := os.MkdirTemp("", "katenary-test-override")
|
tmpDir, err := os.MkdirTemp("", "katenary-test-override")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create temp directory: %s", err.Error())
|
t.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
composeFile := filepath.Join(tmpDir, "compose.yaml")
|
composeFile := filepath.Join(tmpDir, "compose.yaml")
|
||||||
katenaryFile := filepath.Join(tmpDir, "katenary.yaml")
|
katenaryFile := filepath.Join(tmpDir, "katenary.yaml")
|
||||||
@@ -106,10 +110,14 @@ webapp:
|
|||||||
cli.WithWorkingDirectory(tmpDir),
|
cli.WithWorkingDirectory(tmpDir),
|
||||||
cli.WithDefaultConfigPath,
|
cli.WithDefaultConfigPath,
|
||||||
)
|
)
|
||||||
project, err := cli.ProjectFromOptions(options)
|
project, err := cli.ProjectFromOptions(context.TODO(), options)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
OverrideWithConfig(project)
|
OverrideWithConfig(project)
|
||||||
w := project.Services[0].Labels
|
log.Println(project.Services["webapp"].Labels)
|
||||||
|
w := project.Services["webapp"].Labels
|
||||||
if v, ok := w[labels.LabelPorts]; !ok {
|
if v, ok := w[labels.LabelPorts]; !ok {
|
||||||
t.Fatal("Expected ports to be defined", v)
|
t.Fatal("Expected ports to be defined", v)
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ import (
|
|||||||
_ "embed"
|
_ "embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
"katenary/utils"
|
"katenary/utils"
|
||||||
"log"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -126,30 +125,23 @@ func GetLabelHelpFor(labelname string, asMarkdown bool) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
var err error
|
template.Must(template.New("shorthelp").Parse(help.Long)).Execute(&buf, struct {
|
||||||
err = template.Must(template.New("shorthelp").Parse(help.Long)).Execute(&buf, struct {
|
|
||||||
KatenaryPrefix string
|
KatenaryPrefix string
|
||||||
}{
|
}{
|
||||||
KatenaryPrefix: KatenaryLabelPrefix,
|
KatenaryPrefix: KatenaryLabelPrefix,
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error executing template: %v", err)
|
|
||||||
}
|
|
||||||
help.Long = buf.String()
|
help.Long = buf.String()
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
|
|
||||||
err = template.Must(template.New("example").Parse(help.Example)).Execute(&buf, struct {
|
template.Must(template.New("example").Parse(help.Example)).Execute(&buf, struct {
|
||||||
KatenaryPrefix string
|
KatenaryPrefix string
|
||||||
}{
|
}{
|
||||||
KatenaryPrefix: KatenaryLabelPrefix,
|
KatenaryPrefix: KatenaryLabelPrefix,
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error executing template: %v", err)
|
|
||||||
}
|
|
||||||
help.Example = buf.String()
|
help.Example = buf.String()
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
|
|
||||||
err = template.Must(template.New("complete").Parse(helpTemplate)).Execute(&buf, struct {
|
template.Must(template.New("complete").Parse(helpTemplate)).Execute(&buf, struct {
|
||||||
Name string
|
Name string
|
||||||
Help Help
|
Help Help
|
||||||
KatenaryPrefix string
|
KatenaryPrefix string
|
||||||
@@ -158,9 +150,6 @@ func GetLabelHelpFor(labelname string, asMarkdown bool) string {
|
|||||||
Help: help,
|
Help: help,
|
||||||
KatenaryPrefix: KatenaryLabelPrefix,
|
KatenaryPrefix: KatenaryLabelPrefix,
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error executing template: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ package generator
|
|||||||
import (
|
import (
|
||||||
"katenary/utils"
|
"katenary/utils"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
rbacv1 "k8s.io/api/rbac/v1"
|
rbacv1 "k8s.io/api/rbac/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
@@ -6,7 +6,7 @@ import (
|
|||||||
"katenary/utils"
|
"katenary/utils"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
|
@@ -5,7 +5,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
|
@@ -49,7 +49,6 @@ func internalCompileTest(t *testing.T, options ...string) string {
|
|||||||
ChartVersion: chartVersion,
|
ChartVersion: chartVersion,
|
||||||
}
|
}
|
||||||
if err := Convert(convertOptions, "compose.yml"); err != nil {
|
if err := Convert(convertOptions, "compose.yml"); err != nil {
|
||||||
log.Printf("Failed to convert: %s", err)
|
|
||||||
return err.Error()
|
return err.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,7 +8,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"sigs.k8s.io/yaml"
|
"sigs.k8s.io/yaml"
|
||||||
)
|
)
|
||||||
@@ -53,8 +53,8 @@ func fixPorts(service *types.ServiceConfig) error {
|
|||||||
ports, err := labelStructs.PortsFrom(portsLabel)
|
ports, err := labelStructs.PortsFrom(portsLabel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// maybe it's a string, comma separated
|
// maybe it's a string, comma separated
|
||||||
parts := strings.SplitSeq(portsLabel, ",")
|
parts := strings.Split(portsLabel, ",")
|
||||||
for part := range parts {
|
for _, part := range parts {
|
||||||
part = strings.TrimSpace(part)
|
part = strings.TrimSpace(part)
|
||||||
if part == "" {
|
if part == "" {
|
||||||
continue
|
continue
|
||||||
@@ -87,7 +87,7 @@ func UnWrapTPL(in []byte) []byte {
|
|||||||
return regexpLineWrap.ReplaceAll(in, []byte(" }}"))
|
return regexpLineWrap.ReplaceAll(in, []byte(" }}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func ToK8SYaml(obj any) ([]byte, error) {
|
func ToK8SYaml(obj interface{}) ([]byte, error) {
|
||||||
if o, err := yaml.Marshal(obj); err != nil {
|
if o, err := yaml.Marshal(obj); err != nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
} else {
|
} else {
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
package generator
|
package generator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"katenary/generator/labels"
|
"katenary/generator/labels"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/cli"
|
"github.com/compose-spec/compose-go/v2/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSplitPorts(t *testing.T) {
|
func TestSplitPorts(t *testing.T) {
|
||||||
@@ -37,15 +38,18 @@ services:
|
|||||||
cli.WithWorkingDirectory(tmpDir),
|
cli.WithWorkingDirectory(tmpDir),
|
||||||
cli.WithDefaultConfigPath,
|
cli.WithDefaultConfigPath,
|
||||||
)
|
)
|
||||||
project, err := cli.ProjectFromOptions(options)
|
project, err := cli.ProjectFromOptions(context.TODO(), options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := fixPorts(&project.Services[0]); err != nil {
|
service := project.Services["foo"]
|
||||||
|
if err := fixPorts(&service); err != nil {
|
||||||
t.Errorf("Expected no error, got %s", err)
|
t.Errorf("Expected no error, got %s", err)
|
||||||
}
|
}
|
||||||
|
project.Services["foo"] = service
|
||||||
found := 0
|
found := 0
|
||||||
for _, p := range project.Services[0].Ports {
|
t.Log(service.Ports, project.Services["foo"].Ports)
|
||||||
|
for _, p := range project.Services["foo"].Ports {
|
||||||
switch p.Target {
|
switch p.Target {
|
||||||
case 80, 443:
|
case 80, 443:
|
||||||
found++
|
found++
|
||||||
@@ -85,15 +89,16 @@ services:
|
|||||||
cli.WithWorkingDirectory(tmpDir),
|
cli.WithWorkingDirectory(tmpDir),
|
||||||
cli.WithDefaultConfigPath,
|
cli.WithDefaultConfigPath,
|
||||||
)
|
)
|
||||||
project, err := cli.ProjectFromOptions(options)
|
project, err := cli.ProjectFromOptions(context.TODO(), options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := fixPorts(&project.Services[0]); err != nil {
|
service := project.Services["foo"]
|
||||||
|
if err := fixPorts(&service); err != nil {
|
||||||
t.Errorf("Expected no error, got %s", err)
|
t.Errorf("Expected no error, got %s", err)
|
||||||
}
|
}
|
||||||
found := 0
|
found := 0
|
||||||
for _, p := range project.Services[0].Ports {
|
for _, p := range service.Ports {
|
||||||
switch p.Target {
|
switch p.Target {
|
||||||
case 80, 443, 8080:
|
case 80, 443, 8080:
|
||||||
found++
|
found++
|
||||||
|
@@ -3,7 +3,7 @@ package generator
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RepositoryValue is a docker repository image and tag that will be saved in values.yaml.
|
// RepositoryValue is a docker repository image and tag that will be saved in values.yaml.
|
||||||
|
@@ -8,7 +8,7 @@ import (
|
|||||||
func TestVersion(t *testing.T) {
|
func TestVersion(t *testing.T) {
|
||||||
// we build on "devel" branch
|
// we build on "devel" branch
|
||||||
v := GetVersion()
|
v := GetVersion()
|
||||||
if !strings.Contains(v, "(devel)") {
|
if strings.Contains(v, "(devel)") {
|
||||||
t.Errorf("Expected version to be set, got %s", v)
|
t.Errorf("Expected version to be set, got %s", v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@ import (
|
|||||||
"katenary/utils"
|
"katenary/utils"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
44
go.mod
44
go.mod
@@ -1,19 +1,19 @@
|
|||||||
module katenary // github.com/metal3d/katenary
|
module katenary // github.com/metal3d/katenary
|
||||||
|
|
||||||
go 1.24.0
|
go 1.23.0
|
||||||
|
|
||||||
toolchain go1.24.3
|
toolchain go1.23.4
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/compose-spec/compose-go v1.20.2
|
github.com/compose-spec/compose-go/v2 v2.4.6
|
||||||
github.com/invopop/jsonschema v0.13.0
|
github.com/invopop/jsonschema v0.12.0
|
||||||
github.com/mitchellh/go-wordwrap v1.0.1
|
github.com/mitchellh/go-wordwrap v1.0.1
|
||||||
github.com/spf13/cobra v1.9.1
|
github.com/spf13/cobra v1.8.1
|
||||||
github.com/thediveo/netdb v1.1.2
|
github.com/thediveo/netdb v1.1.2
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
k8s.io/api v0.33.2
|
k8s.io/api v0.32.0
|
||||||
k8s.io/apimachinery v0.33.2
|
k8s.io/apimachinery v0.32.0
|
||||||
sigs.k8s.io/yaml v1.5.0
|
sigs.k8s.io/yaml v1.4.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@@ -22,38 +22,34 @@ require (
|
|||||||
github.com/distribution/reference v0.6.0 // indirect
|
github.com/distribution/reference v0.6.0 // indirect
|
||||||
github.com/docker/go-connections v0.5.0 // indirect
|
github.com/docker/go-connections v0.5.0 // indirect
|
||||||
github.com/docker/go-units v0.5.0 // indirect
|
github.com/docker/go-units v0.5.0 // indirect
|
||||||
github.com/fxamacker/cbor/v2 v2.8.0 // indirect
|
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.2 // indirect
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
github.com/go-viper/mapstructure/v2 v2.0.0 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/imdario/mergo v0.3.16 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/kr/text v0.2.0 // indirect
|
github.com/kr/text v0.2.0 // indirect
|
||||||
github.com/mailru/easyjson v0.9.0 // indirect
|
github.com/mailru/easyjson v0.9.0 // indirect
|
||||||
github.com/mattn/go-shellwords v1.0.12 // indirect
|
github.com/mattn/go-shellwords v1.0.12 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
|
||||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||||
github.com/spf13/pflag v1.0.6 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
|
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
|
||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
go.yaml.in/yaml/v2 v2.4.2 // indirect
|
golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e // indirect
|
||||||
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
|
golang.org/x/net v0.32.0 // indirect
|
||||||
golang.org/x/net v0.41.0 // indirect
|
golang.org/x/sync v0.10.0 // indirect
|
||||||
golang.org/x/sync v0.15.0 // indirect
|
golang.org/x/sys v0.28.0 // indirect
|
||||||
golang.org/x/sys v0.33.0 // indirect
|
golang.org/x/text v0.21.0 // indirect
|
||||||
golang.org/x/text v0.26.0 // indirect
|
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
k8s.io/klog/v2 v2.130.1 // indirect
|
k8s.io/klog/v2 v2.130.1 // indirect
|
||||||
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect
|
k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
|
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
|
||||||
sigs.k8s.io/randfill v1.0.0 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
109
go.sum
109
go.sum
@@ -2,39 +2,43 @@ github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPn
|
|||||||
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
|
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
|
||||||
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
|
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
|
||||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
||||||
github.com/compose-spec/compose-go v1.20.2 h1:u/yfZHn4EaHGdidrZycWpxXgFffjYULlTbRfJ51ykjQ=
|
github.com/compose-spec/compose-go/v2 v2.4.6 h1:QiqXQ2L/f0OCbAl41bPpeiGAWVRIQ+GEDrYxO+dRPhQ=
|
||||||
github.com/compose-spec/compose-go v1.20.2/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM=
|
github.com/compose-spec/compose-go/v2 v2.4.6/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||||
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
||||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||||
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
||||||
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
|
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
|
||||||
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
||||||
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU=
|
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
|
||||||
github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
||||||
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||||
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc=
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
|
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
|
||||||
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
|
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E=
|
github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI=
|
||||||
github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
|
github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
|
||||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
@@ -49,8 +53,6 @@ github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebG
|
|||||||
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
|
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
|
||||||
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
|
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
|
||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
|
||||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@@ -62,24 +64,23 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
|
|||||||
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
|
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||||
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||||
|
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
|
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
|
||||||
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
|
||||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/thediveo/netdb v1.1.2 h1:XdLx/YJPutxrSkPYtmCAIY5sgAvxtkS1Tz+Z0UX2I+U=
|
github.com/thediveo/netdb v1.1.2 h1:XdLx/YJPutxrSkPYtmCAIY5sgAvxtkS1Tz+Z0UX2I+U=
|
||||||
github.com/thediveo/netdb v1.1.2/go.mod h1:KJczM//7VIIiovQO1qDooHvM8+0pt6RdRt3rVDZxEGM=
|
github.com/thediveo/netdb v1.1.2/go.mod h1:KJczM//7VIIiovQO1qDooHvM8+0pt6RdRt3rVDZxEGM=
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
|
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
|
||||||
@@ -95,44 +96,40 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
|
|||||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
|
|
||||||
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
|
|
||||||
go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
|
|
||||||
go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
|
golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e h1:4qufH0hlUYs6AO6XmZC3GqfDPGSXHVXUFR6OND+iJX4=
|
||||||
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
|
golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
|
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
|
||||||
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
|
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
|
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||||
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||||
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
|
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||||
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
|
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
|
golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
|
||||||
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
|
golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@@ -147,21 +144,17 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
|
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
|
||||||
gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
|
gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
|
||||||
k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
|
k8s.io/api v0.32.0 h1:OL9JpbvAU5ny9ga2fb24X8H6xQlVp+aJMFlgtQjR9CE=
|
||||||
k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
|
k8s.io/api v0.32.0/go.mod h1:4LEwHZEf6Q/cG96F3dqR965sYOfmPM7rq81BLgsE0p0=
|
||||||
k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
|
k8s.io/apimachinery v0.32.0 h1:cFSE7N3rmEEtv4ei5X6DaJPHHX0C+upp+v5lVPiEwpg=
|
||||||
k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
|
k8s.io/apimachinery v0.32.0/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
|
||||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||||
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
|
k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
|
||||||
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
|
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
|
||||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
||||||
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
|
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk=
|
||||||
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
|
sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
|
||||||
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
|
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI=
|
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
|
|
||||||
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
|
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
|
||||||
sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
|
|
||||||
sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
|
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
// Package parser is a wrapper around compose-go to parse compose files.
|
// Parser package is a wrapper around compose-go to parse compose files.
|
||||||
package parser
|
package parser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"log"
|
"log"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/cli"
|
"github.com/compose-spec/compose-go/v2/cli"
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -53,5 +54,5 @@ func Parse(profiles []string, envFiles []string, dockerComposeFile ...string) (*
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return cli.ProjectFromOptions(options)
|
return cli.ProjectFromOptions(context.TODO(), options)
|
||||||
}
|
}
|
||||||
|
@@ -1,60 +0,0 @@
|
|||||||
package parser
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
const composeFile = `
|
|
||||||
services:
|
|
||||||
app:
|
|
||||||
image: nginx:latest
|
|
||||||
`
|
|
||||||
|
|
||||||
func setupTest() (string, error) {
|
|
||||||
// write the composeFile to a temporary file
|
|
||||||
tmpDir, err := os.MkdirTemp("", "katenary-test-parse")
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
writeFile := filepath.Join(tmpDir, "compose.yaml")
|
|
||||||
writeErr := os.WriteFile(writeFile, []byte(composeFile), 0644)
|
|
||||||
return writeFile, writeErr
|
|
||||||
}
|
|
||||||
|
|
||||||
func tearDownTest(tmpDir string) {
|
|
||||||
if tmpDir != "" {
|
|
||||||
if err := os.RemoveAll(tmpDir); err != nil {
|
|
||||||
log.Fatalf("Failed to remove temporary directory %s: %s", tmpDir, err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestParse(t *testing.T) {
|
|
||||||
file, err := setupTest()
|
|
||||||
dirname := filepath.Dir(file)
|
|
||||||
currentDir, _ := os.Getwd()
|
|
||||||
if err := os.Chdir(dirname); err != nil {
|
|
||||||
t.Fatalf("Failed to change directory to %s: %s", dirname, err.Error())
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
tearDownTest(dirname)
|
|
||||||
if err := os.Chdir(currentDir); err != nil {
|
|
||||||
t.Fatalf("Failed to change back to original directory %s: %s", currentDir, err.Error())
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to setup test: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
Project, err := Parse(nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to parse compose file: %s", err.Error())
|
|
||||||
}
|
|
||||||
if Project == nil {
|
|
||||||
t.Fatal("Expected project to be not nil")
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,3 +1,2 @@
|
|||||||
// Package utils provides some utility functions used in katenary.
|
// Utils package provides some utility functions used in katenary. It defines some constants and functions used in the whole project.
|
||||||
// It defines some constants and functions used in the whole project.
|
|
||||||
package utils
|
package utils
|
||||||
|
@@ -1,13 +0,0 @@
|
|||||||
package utils
|
|
||||||
|
|
||||||
import "testing"
|
|
||||||
|
|
||||||
func TestHash(t *testing.T) {
|
|
||||||
h, err := HashComposefiles([]string{"./hash.go"})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to hash compose files: %v", err)
|
|
||||||
}
|
|
||||||
if len(h) == 0 {
|
|
||||||
t.Fatal("hash should not be empty")
|
|
||||||
}
|
|
||||||
}
|
|
@@ -22,7 +22,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Warn prints a warning message
|
// Warn prints a warning message
|
||||||
func Warn(msg ...any) {
|
func Warn(msg ...interface{}) {
|
||||||
orange := "\033[38;5;214m"
|
orange := "\033[38;5;214m"
|
||||||
reset := "\033[0m"
|
reset := "\033[0m"
|
||||||
fmt.Print(IconWarning, orange, " ")
|
fmt.Print(IconWarning, orange, " ")
|
||||||
|
@@ -7,7 +7,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/v2/types"
|
||||||
"github.com/mitchellh/go-wordwrap"
|
"github.com/mitchellh/go-wordwrap"
|
||||||
"github.com/thediveo/netdb"
|
"github.com/thediveo/netdb"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
@@ -90,7 +90,7 @@ func GetContainerByName(name string, containers []corev1.Container) (*corev1.Con
|
|||||||
return nil, -1
|
return nil, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
// TplValue returns a container by name and its index in the array.
|
// GetContainerByName returns a container by name and its index in the array.
|
||||||
func TplValue(serviceName, variable string, pipes ...string) string {
|
func TplValue(serviceName, variable string, pipes ...string) string {
|
||||||
if len(pipes) == 0 {
|
if len(pipes) == 0 {
|
||||||
return `{{ tpl .Values.` + serviceName + `.` + variable + ` $ }}`
|
return `{{ tpl .Values.` + serviceName + `.` + variable + ` $ }}`
|
||||||
@@ -136,12 +136,12 @@ func GetValuesFromLabel(service types.ServiceConfig, LabelValues string) map[str
|
|||||||
switch val := value.(type) {
|
switch val := value.(type) {
|
||||||
case string:
|
case string:
|
||||||
descriptions[val] = nil
|
descriptions[val] = nil
|
||||||
case map[string]any:
|
case map[string]interface{}:
|
||||||
for k, v := range value.(map[string]any) {
|
for k, v := range value.(map[string]interface{}) {
|
||||||
descriptions[k] = &EnvConfig{Service: service, Description: v.(string)}
|
descriptions[k] = &EnvConfig{Service: service, Description: v.(string)}
|
||||||
}
|
}
|
||||||
case map[any]any:
|
case map[interface{}]interface{}:
|
||||||
for k, v := range value.(map[any]any) {
|
for k, v := range value.(map[interface{}]interface{}) {
|
||||||
descriptions[k.(string)] = &EnvConfig{Service: service, Description: v.(string)}
|
descriptions[k.(string)] = &EnvConfig{Service: service, Description: v.(string)}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -165,9 +165,7 @@ func Confirm(question string, icon ...Icon) bool {
|
|||||||
fmt.Print(question + " [y/N] ")
|
fmt.Print(question + " [y/N] ")
|
||||||
}
|
}
|
||||||
var response string
|
var response string
|
||||||
if _, err := fmt.Scanln(&response); err != nil {
|
fmt.Scanln(&response)
|
||||||
log.Fatalf("Error parsing response: %s", err.Error())
|
|
||||||
}
|
|
||||||
return strings.ToLower(response) == "y"
|
return strings.ToLower(response) == "y"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user