From 72c2fa0260af11e222e561f820d78b54b77c5d3f Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Thu, 6 Jun 2024 23:07:00 +0200 Subject: [PATCH 01/22] feat: add specsFile --- .gitignore | 3 + clabverter/assets/topology-clab.yaml.template | 3 + clabverter/assets/topology.yaml.template | 3 - clabverter/clabverter.go | 111 ++++++++++++++++-- clabverter/clabverter_test.go | 4 + .../test-fixtures/clabversiontest/specs.yaml | 7 ++ .../simple-no-explicit-namespace/topo01.yaml | 7 +- clabverter/types.go | 5 +- cmd/clabverter/cli/entrypoint.go | 8 ++ go.mod | 3 + go.sum | 25 ++++ testhelper/helm.go | 12 +- 12 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 clabverter/assets/topology-clab.yaml.template create mode 100644 clabverter/test-fixtures/clabversiontest/specs.yaml diff --git a/.gitignore b/.gitignore index 445b66b..3b19403 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ cover.out # goreleaser dist dir for testing builds and such locally .dist/ + +# build files +cmd/clabverter/build/ diff --git a/clabverter/assets/topology-clab.yaml.template b/clabverter/assets/topology-clab.yaml.template new file mode 100644 index 0000000..5f722d1 --- /dev/null +++ b/clabverter/assets/topology-clab.yaml.template @@ -0,0 +1,3 @@ + definition: + containerlab: |- + {{- .ClabConfig }} diff --git a/clabverter/assets/topology.yaml.template b/clabverter/assets/topology.yaml.template index 1c8d7bc..24bc55b 100644 --- a/clabverter/assets/topology.yaml.template +++ b/clabverter/assets/topology.yaml.template @@ -56,6 +56,3 @@ spec: naming: {{ .Naming }} {{- end }} connectivity: vxlan - definition: - containerlab: |- - {{- .ClabConfig }} diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index e1b9a8c..55a1ac4 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -16,17 +16,20 @@ import ( clabernetesutil "github.com/srl-labs/clabernetes/util" clabernetesutilcontainerlab "github.com/srl-labs/clabernetes/util/containerlab" clabernetesutilkubernetes "github.com/srl-labs/clabernetes/util/kubernetes" + yamlConfig "go.uber.org/config" + "gopkg.in/yaml.v3" ) const ( specIndentSpaces = 4 - specDefinitionIndentSpaces = 8 + specDefinitionIndentSpaces = 10 maxBytesForConfigMap = 950_000 ) // MustNewClabverter returns an instance of Clabverter or panics. func MustNewClabverter( topologyFile, + specsFile, outputDirectory, destinationNamespace, naming, @@ -90,6 +93,7 @@ func MustNewClabverter( return &Clabverter{ logger: clabverterLogger, topologyFile: topologyFile, + specsFile: specsFile, githubToken: githubToken, outputDirectory: outputDirectory, stdout: stdout, @@ -113,6 +117,7 @@ type Clabverter struct { logger claberneteslogging.Instance topologyFile string + specsFile string outputDirectory string stdout bool @@ -126,6 +131,7 @@ type Clabverter struct { topologyPath string topologyPathParent string isRemotePath bool + valuesPath string githubGroup string githubRepo string githubToken string @@ -135,6 +141,8 @@ type Clabverter struct { rawClabConfig string clabConfig *clabernetesutilcontainerlab.Config + rawSpecValues string + // mapping of nodeName -> startup-config info for the templating process; this is its own thing // because configurations may be huge and configmaps have a 1M char limit, so while keeping them // by themselves may not "solve" for ginormous configs, it can certainly give us a little extra @@ -362,6 +370,38 @@ func (c *Clabverter) load() error { c.logger.Debug("loading and validating containerlab topology file complete!") + if c.specsFile != "" { + c.valuesPath, err = filepath.Abs(c.specsFile) + if err != nil { + c.logger.Criticalf("failed determining absolute path of values file, error: %s", err) + + return err + } + + c.logger.Debugf( + "determined fully qualified spec values file path as: %s", c.valuesPath, + ) + + c.logger.Debug("attempting to load spec values....") + + rawSpecValuesBytes, err := os.ReadFile(c.valuesPath) + + if err != nil { + c.logger.Criticalf( + "failed reading spec values file at '%s' from disk, error: %s", + c.valuesPath, err, + ) + + return err + } + + // specs file content is non-indented, need to make it match spec indent + c.rawSpecValues = "spec:\n" + clabernetesutil.Indent( + string(rawSpecValuesBytes), + specIndentSpaces, + ) + } + return nil } @@ -453,13 +493,8 @@ func (c *Clabverter) handleManifest() error { err = t.Execute( &rendered, containerlabTemplateVars{ - Name: c.clabConfig.Name, - Namespace: c.destinationNamespace, - // pad w/ a newline so the template can look prettier :) - ClabConfig: "\n" + clabernetesutil.Indent( - c.rawClabConfig, - specDefinitionIndentSpaces, - ), + Name: c.clabConfig.Name, + Namespace: c.destinationNamespace, Files: files, FilesFromURL: c.extraFilesFromURL, InsecureRegistries: c.insecureRegistries, @@ -470,19 +505,75 @@ func (c *Clabverter) handleManifest() error { }, ) if err != nil { - c.logger.Criticalf("failed executing configmap template: %s", err) + c.logger.Criticalf("failed executing topology template: %s", err) return err } fileName := fmt.Sprintf("%s/%s.yaml", c.outputDirectory, c.clabConfig.Name) + // merge yamls + // spec values override rendered values + rendered_yaml := yamlConfig.Source(strings.NewReader(rendered.String())) + spec_yaml := yamlConfig.Source(strings.NewReader(c.rawSpecValues)) + + merged_yaml, err := yamlConfig.NewYAML(rendered_yaml, spec_yaml) + if err != nil { + c.logger.Criticalf("failed merging topology spec values: %s", err) + + return err + } + + var target interface{} + err = merged_yaml.Get(yamlConfig.Root).Populate(&target) + if err != nil { + c.logger.Criticalf("failed extracting spec values: %s", err) + + return err + } + + rendered_bytes, err := yaml.Marshal(target) + if err != nil { + c.logger.Criticalf("error marshalling topology YAML: %s", err) + + return err + } + + // marshalling removes the yaml start document chars, adding them back + rendered_bytes = append([]byte("---\n"), rendered_bytes...) + + // marshalling uglifies multilne clab topo, appending separate template render to keep it pretty + t_clab, err := template.ParseFS(Assets, "assets/topology-clab.yaml.template") + if err != nil { + c.logger.Criticalf("failed loading containerlab definition manifest from assets: %s", err) + + return err + } + + var rendered_clab bytes.Buffer + + err = t_clab.Execute( + &rendered_clab, + containerlabDefinitionTemplateVars{ + // pad w/ a newline so the template can look prettier :) + ClabConfig: "\n" + clabernetesutil.Indent( + c.rawClabConfig, + specDefinitionIndentSpaces, + ), + }, + ) + if err != nil { + c.logger.Criticalf("failed executing configmap template: %s", err) + + return err + } + c.renderedFiles = append( c.renderedFiles, renderedContent{ friendlyName: "clabernetes manifest", fileName: fileName, - content: rendered.Bytes(), + content: append(rendered_bytes, rendered_clab.Bytes()...), }, ) diff --git a/clabverter/clabverter_test.go b/clabverter/clabverter_test.go index a94b231..5694a6c 100644 --- a/clabverter/clabverter_test.go +++ b/clabverter/clabverter_test.go @@ -22,6 +22,7 @@ func TestClabvert(t *testing.T) { cases := []struct { name string topologyFile string + specsFile string destinationNamespace string insecureRegistries string imagePullSecrets string @@ -32,6 +33,7 @@ func TestClabvert(t *testing.T) { { name: "simple", topologyFile: "test-fixtures/clabversiontest/clab.yaml", + specsFile: "", destinationNamespace: "notclabernetes", insecureRegistries: "1.2.3.4", imagePullSecrets: "", @@ -41,6 +43,7 @@ func TestClabvert(t *testing.T) { { name: "simple-no-explicit-namespace", topologyFile: "test-fixtures/clabversiontest/clab.yaml", + specsFile: "test-fixtures/clabversiontest/specs.yaml", insecureRegistries: "1.2.3.4", imagePullSecrets: "regcred", disableExpose: true, @@ -87,6 +90,7 @@ func TestClabvert(t *testing.T) { clabverter := clabernetesclabverter.MustNewClabverter( testCase.topologyFile, + testCase.specsFile, actualDir, testCase.destinationNamespace, testCase.naming, diff --git a/clabverter/test-fixtures/clabversiontest/specs.yaml b/clabverter/test-fixtures/clabversiontest/specs.yaml new file mode 100644 index 0000000..40fcbae --- /dev/null +++ b/clabverter/test-fixtures/clabversiontest/specs.yaml @@ -0,0 +1,7 @@ +statusProbes: + enabled: true + excludedNodes: + - baguette + probeConfiguration: + tcpProbeConfiguration: + port: 22 diff --git a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml index ce5c686..28248af 100755 --- a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml @@ -96,11 +96,14 @@ spec: - regcred naming: non-prefixed statusProbes: - enabled: false - excludedNodes: null + enabled: true + excludedNodes: + - baguette nodeProbeConfigurations: null probeConfiguration: startupSeconds: 0 + tcpProbeConfiguration: + port: 22 status: conditions: null configs: null diff --git a/clabverter/types.go b/clabverter/types.go index 4811277..f784d14 100644 --- a/clabverter/types.go +++ b/clabverter/types.go @@ -28,7 +28,6 @@ type topologyFileFromURLTemplateVars struct { type containerlabTemplateVars struct { Name string Namespace string - ClabConfig string Files map[string][]topologyConfigMapTemplateVars FilesFromURL map[string][]topologyFileFromURLTemplateVars InsecureRegistries []string @@ -38,6 +37,10 @@ type containerlabTemplateVars struct { ContainerlabVersion string } +type containerlabDefinitionTemplateVars struct { + ClabConfig string +} + type renderedContent struct { friendlyName string fileName string diff --git a/cmd/clabverter/cli/entrypoint.go b/cmd/clabverter/cli/entrypoint.go index eb673c3..45dc705 100644 --- a/cmd/clabverter/cli/entrypoint.go +++ b/cmd/clabverter/cli/entrypoint.go @@ -9,6 +9,7 @@ import ( const ( topologyFile = "topologyFile" + specsFile = "specsFile" outputDirectory = "outputDirectory" destinationNamespace = "destinationNamespace" insecureRegistries = "insecureRegistries" @@ -37,6 +38,12 @@ If not set, clabverter will look for a file named '*.clab.y*ml'`, Required: false, Value: "", }, + &cli.StringFlag{ + Name: specsFile, + Usage: `set the values file to parse that will be included in the topology manifest spec.`, + Required: false, + Value: "", + }, &cli.StringFlag{ Name: outputDirectory, Usage: "set the output directory for the converted manifest(s)", @@ -102,6 +109,7 @@ If not set, clabverter will look for a file named '*.clab.y*ml'`, Action: func(c *cli.Context) error { err := clabernetesclabverter.MustNewClabverter( c.String(topologyFile), + c.String(specsFile), c.String(outputDirectory), c.String(destinationNamespace), c.String(naming), diff --git a/go.mod b/go.mod index 23107b5..641de62 100644 --- a/go.mod +++ b/go.mod @@ -89,9 +89,11 @@ require ( go.opentelemetry.io/otel/sdk v1.19.0 // indirect go.opentelemetry.io/otel/trace v1.19.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/config v1.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect golang.org/x/sync v0.7.0 // indirect @@ -99,6 +101,7 @@ require ( golang.org/x/term v0.20.0 // indirect golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.20.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect diff --git a/go.sum b/go.sum index f293736..87b20e8 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= @@ -78,6 +79,7 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -98,6 +100,7 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr 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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -138,6 +141,7 @@ github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lne github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -152,6 +156,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -189,13 +194,19 @@ go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1 go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/config v1.4.0 h1:upnMPpMm6WlbZtXoasNkK4f0FhxwS+W4Iqz5oNznehQ= +go.uber.org/config v1.4.0/go.mod h1:aCyrMHmUAc/s2h9sv1koP84M9ZF/4K+g2oleyESO/Ig= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -205,9 +216,13 @@ golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -242,6 +257,7 @@ golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= @@ -252,6 +268,11 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191104232314-dc038396d1f0/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -279,19 +300,23 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= diff --git a/testhelper/helm.go b/testhelper/helm.go index 8c932fd..d976f14 100644 --- a/testhelper/helm.go +++ b/testhelper/helm.go @@ -19,7 +19,7 @@ const ( // HelmTest executes a test against a helm chart -- this is a very simple/dumb test meant only to // ensure that we don't accidentally screw up charts. We do this by storing the "golden" output of // a rendered chart (and subcharts if applicable) with a given values file. -func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, chartsDir string) { +func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chartsDir string) { t.Helper() // we have to make the chartname/templates dir too since thats where helm wants to write things @@ -31,10 +31,10 @@ func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, char ) actualDir := fmt.Sprintf("%s/%s/templates", actualRootDir, chartName) - var valuesFile string + var specsFile string - if valuesFileName != "" { - valuesFile = fmt.Sprintf( + if specsFileName != "" { + specsFile = fmt.Sprintf( "%s/tests/%s/test-fixtures/%s-values.yaml", chartName, testName, @@ -74,8 +74,8 @@ func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, char args = append(args, "--namespace", namespace) } - if valuesFile != "" { - args = append(args, "--values", valuesFile) + if specsFile != "" { + args = append(args, "--values", specsFile) } HelmCommand( From beee173a3a7c9827c90ab4e7ed64eab232565774 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Thu, 6 Jun 2024 23:27:19 +0200 Subject: [PATCH 02/22] revert helm.go --- testhelper/helm.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/testhelper/helm.go b/testhelper/helm.go index d976f14..8c932fd 100644 --- a/testhelper/helm.go +++ b/testhelper/helm.go @@ -19,7 +19,7 @@ const ( // HelmTest executes a test against a helm chart -- this is a very simple/dumb test meant only to // ensure that we don't accidentally screw up charts. We do this by storing the "golden" output of // a rendered chart (and subcharts if applicable) with a given values file. -func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chartsDir string) { +func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, chartsDir string) { t.Helper() // we have to make the chartname/templates dir too since thats where helm wants to write things @@ -31,10 +31,10 @@ func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chart ) actualDir := fmt.Sprintf("%s/%s/templates", actualRootDir, chartName) - var specsFile string + var valuesFile string - if specsFileName != "" { - specsFile = fmt.Sprintf( + if valuesFileName != "" { + valuesFile = fmt.Sprintf( "%s/tests/%s/test-fixtures/%s-values.yaml", chartName, testName, @@ -74,8 +74,8 @@ func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chart args = append(args, "--namespace", namespace) } - if specsFile != "" { - args = append(args, "--values", specsFile) + if valuesFile != "" { + args = append(args, "--values", valuesFile) } HelmCommand( From 0aac4d6e4c3864e3e4cd34eed9dabaa6b24d9742 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Thu, 6 Jun 2024 23:38:50 +0200 Subject: [PATCH 03/22] fix lint --- e2e/clabverter/clabverter_basic_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/clabverter/clabverter_basic_test.go b/e2e/clabverter/clabverter_basic_test.go index 3c3d986..35c5f00 100644 --- a/e2e/clabverter/clabverter_basic_test.go +++ b/e2e/clabverter/clabverter_basic_test.go @@ -25,6 +25,7 @@ func TestClabverterBasic(t *testing.T) { c := clabernetesclabverter.MustNewClabverter( "test-fixtures/basic_clab.yaml", + "", "test-fixtures", namespace, "prefixed", From 9e987b4a6f69822974a26e8a63b5269de3163918 Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Fri, 7 Jun 2024 09:13:16 -0700 Subject: [PATCH 04/22] chore: appease lll in clabverter entrypoint --- clabverter/clabverter.go | 1 - cmd/clabverter/cli/entrypoint.go | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 55a1ac4..5d51c0d 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -385,7 +385,6 @@ func (c *Clabverter) load() error { c.logger.Debug("attempting to load spec values....") rawSpecValuesBytes, err := os.ReadFile(c.valuesPath) - if err != nil { c.logger.Criticalf( "failed reading spec values file at '%s' from disk, error: %s", diff --git a/cmd/clabverter/cli/entrypoint.go b/cmd/clabverter/cli/entrypoint.go index 45dc705..7843036 100644 --- a/cmd/clabverter/cli/entrypoint.go +++ b/cmd/clabverter/cli/entrypoint.go @@ -33,14 +33,15 @@ func Entrypoint() *cli.App { Flags: []cli.Flag{ &cli.StringFlag{ Name: topologyFile, - Usage: `set the topology file to parse. -If not set, clabverter will look for a file named '*.clab.y*ml'`, + Usage: "set the topology file to parse. If not set, clabverter will look for" + + " a file named '*.clab.y*ml'", Required: false, Value: "", }, &cli.StringFlag{ - Name: specsFile, - Usage: `set the values file to parse that will be included in the topology manifest spec.`, + Name: specsFile, + Usage: "set the values file to parse that will be included in the topology" + + " manifest spec", Required: false, Value: "", }, From 17fe786a4a2c5ba8b70ae916d9c15430842a13b9 Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Fri, 7 Jun 2024 09:16:55 -0700 Subject: [PATCH 05/22] chore: appease wsl cuddle buddy --- clabverter/clabverter.go | 1 + 1 file changed, 1 insertion(+) diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 5d51c0d..be5b173 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -524,6 +524,7 @@ func (c *Clabverter) handleManifest() error { } var target interface{} + err = merged_yaml.Get(yamlConfig.Root).Populate(&target) if err != nil { c.logger.Criticalf("failed extracting spec values: %s", err) From 52cca6663939c350289f4da2166ad2ffdd3a3123 Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Fri, 7 Jun 2024 10:05:50 -0700 Subject: [PATCH 06/22] changeme --- clabverter/clabverter.go | 88 +++++------- .../test-fixtures/clabversiontest/specs.yaml | 16 ++- clabverter/types.go | 4 - go.mod | 45 ------ go.sum | 133 ------------------ 5 files changed, 43 insertions(+), 243 deletions(-) diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index be5b173..e3878d3 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -6,18 +6,18 @@ import ( "fmt" "os" "path/filepath" + sigsyaml "sigs.k8s.io/yaml" "slices" "sort" "strings" "text/template" + clabernetesapisv1alpha1 "github.com/srl-labs/clabernetes/apis/v1alpha1" clabernetesconstants "github.com/srl-labs/clabernetes/constants" claberneteslogging "github.com/srl-labs/clabernetes/logging" clabernetesutil "github.com/srl-labs/clabernetes/util" clabernetesutilcontainerlab "github.com/srl-labs/clabernetes/util/containerlab" clabernetesutilkubernetes "github.com/srl-labs/clabernetes/util/kubernetes" - yamlConfig "go.uber.org/config" - "gopkg.in/yaml.v3" ) const ( @@ -504,80 +504,60 @@ func (c *Clabverter) handleManifest() error { }, ) if err != nil { - c.logger.Criticalf("failed executing topology template: %s", err) + c.logger.Criticalf("failed executing topology template, error: %s", err) return err } + finalRendered, err := c.mergeConfigSpecWithRenderedTopology(rendered.Bytes()) + if err != nil { + c.logger.Criticalf("failed merging spec config with rendered topology, error: %s", err) + } + fileName := fmt.Sprintf("%s/%s.yaml", c.outputDirectory, c.clabConfig.Name) - // merge yamls - // spec values override rendered values - rendered_yaml := yamlConfig.Source(strings.NewReader(rendered.String())) - spec_yaml := yamlConfig.Source(strings.NewReader(c.rawSpecValues)) + c.renderedFiles = append( + c.renderedFiles, + renderedContent{ + friendlyName: "clabernetes manifest", + fileName: fileName, + content: finalRendered, + }, + ) - merged_yaml, err := yamlConfig.NewYAML(rendered_yaml, spec_yaml) - if err != nil { - c.logger.Criticalf("failed merging topology spec values: %s", err) + return nil +} - return err - } +func (c *Clabverter) mergeConfigSpecWithRenderedTopology( + renderedTopologyBytes []byte, +) ([]byte, error) { + finalTopologySpec := &clabernetesapisv1alpha1.Topology{} - var target interface{} + if c.specsFile == "" { + return renderedTopologyBytes, nil + } - err = merged_yaml.Get(yamlConfig.Root).Populate(&target) + content, err := os.ReadFile(c.specsFile) if err != nil { - c.logger.Criticalf("failed extracting spec values: %s", err) - - return err + return nil, err } - rendered_bytes, err := yaml.Marshal(target) + err = sigsyaml.Unmarshal(content, &finalTopologySpec) if err != nil { - c.logger.Criticalf("error marshalling topology YAML: %s", err) - - return err + return nil, err } - // marshalling removes the yaml start document chars, adding them back - rendered_bytes = append([]byte("---\n"), rendered_bytes...) - - // marshalling uglifies multilne clab topo, appending separate template render to keep it pretty - t_clab, err := template.ParseFS(Assets, "assets/topology-clab.yaml.template") + err = sigsyaml.Unmarshal(renderedTopologyBytes, finalTopologySpec) if err != nil { - c.logger.Criticalf("failed loading containerlab definition manifest from assets: %s", err) - - return err + return nil, err } - var rendered_clab bytes.Buffer - - err = t_clab.Execute( - &rendered_clab, - containerlabDefinitionTemplateVars{ - // pad w/ a newline so the template can look prettier :) - ClabConfig: "\n" + clabernetesutil.Indent( - c.rawClabConfig, - specDefinitionIndentSpaces, - ), - }, - ) + finalTopologyBytes, err := sigsyaml.Marshal(finalTopologySpec) if err != nil { - c.logger.Criticalf("failed executing configmap template: %s", err) - - return err + return nil, err } - c.renderedFiles = append( - c.renderedFiles, - renderedContent{ - friendlyName: "clabernetes manifest", - fileName: fileName, - content: append(rendered_bytes, rendered_clab.Bytes()...), - }, - ) - - return nil + return finalTopologyBytes, nil } func (c *Clabverter) output() error { diff --git a/clabverter/test-fixtures/clabversiontest/specs.yaml b/clabverter/test-fixtures/clabversiontest/specs.yaml index 40fcbae..65bde8c 100644 --- a/clabverter/test-fixtures/clabversiontest/specs.yaml +++ b/clabverter/test-fixtures/clabversiontest/specs.yaml @@ -1,7 +1,9 @@ -statusProbes: - enabled: true - excludedNodes: - - baguette - probeConfiguration: - tcpProbeConfiguration: - port: 22 +--- +deployment: + statusProbes: + enabled: true + excludedNodes: + - baguette + probeConfiguration: + tcpProbeConfiguration: + port: 22 \ No newline at end of file diff --git a/clabverter/types.go b/clabverter/types.go index f784d14..552fe97 100644 --- a/clabverter/types.go +++ b/clabverter/types.go @@ -37,10 +37,6 @@ type containerlabTemplateVars struct { ContainerlabVersion string } -type containerlabDefinitionTemplateVars struct { - ClabConfig string -} - type renderedContent struct { friendlyName string fileName string diff --git a/go.mod b/go.mod index 641de62..94e447e 100644 --- a/go.mod +++ b/go.mod @@ -24,98 +24,53 @@ require ( require golang.org/x/crypto v0.23.0 require ( - github.com/NYTimes/gziphandler v1.1.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect - github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/coreos/go-semver v0.3.1 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cel-go v0.17.8 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.4.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/imdario/mergo v0.3.15 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect - github.com/moby/spdystream v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.18.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect - go.etcd.io/etcd/api/v3 v3.5.10 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect - go.etcd.io/etcd/client/v3 v3.5.10 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/config v1.4.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/term v0.20.0 // indirect golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.20.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect - google.golang.org/grpc v1.60.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiserver v0.30.1 // indirect - k8s.io/component-base v0.30.1 // indirect - k8s.io/kms v0.30.1 // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/go.sum b/go.sum index 87b20e8..0bb4e5c 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,11 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/carlmontanari/difflibgo v0.0.0-20240227210139-93685b1c22ae h1:h4sxL/AXg3FRPf+sT2Y4daEQQE/UAkNAM3U0t4Cgha8= github.com/carlmontanari/difflibgo v0.0.0-20240227210139-93685b1c22ae/go.mod h1:+3MuSIeC3qmdSesR12cTLeb47R/Vvo+bHdB6hC5HShk= github.com/carlmontanari/slurpeeth v0.0.0-20240209224827-246fa87e31f3 h1:+XFqJFGVs1EVP5GajTTDB91tTKG+mF0jlN1U1jT90tI= github.com/carlmontanari/slurpeeth v0.0.0-20240209224827-246fa87e31f3/go.mod h1:Qd8tERCTEs3R6Smq0Kjy0aPONCZ/yYXzjiq3bwg3oqk= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= 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= @@ -36,15 +19,10 @@ github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCv github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= @@ -57,7 +35,6 @@ github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ 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/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -66,8 +43,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto= -github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -79,28 +54,16 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -112,8 +75,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 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/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -121,8 +82,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= @@ -141,23 +100,16 @@ github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lne github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -170,59 +122,23 @@ github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQut 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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= -go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= -go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= -go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= -go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= -go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 h1:ZOLJc06r4CB42laIXg/7udr0pbZyuAihN10A/XuiQRY= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/config v1.4.0 h1:upnMPpMm6WlbZtXoasNkK4f0FhxwS+W4Iqz5oNznehQ= -go.uber.org/config v1.4.0/go.mod h1:aCyrMHmUAc/s2h9sv1koP84M9ZF/4K+g2oleyESO/Ig= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -237,8 +153,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ 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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -246,33 +160,21 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191104232314-dc038396d1f0/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -287,70 +189,35 @@ gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= -k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= -k8s.io/apiextensions-apiserver v0.30.0 h1:jcZFKMqnICJfRxTgnC4E+Hpcq8UEhT8B2lhBcQ+6uAs= -k8s.io/apiextensions-apiserver v0.30.0/go.mod h1:N9ogQFGcrbWqAY9p2mUAL5mGxsLqwgtUce127VtRX5Y= k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= -k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= -k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/apiserver v0.30.1 h1:BEWEe8bzS12nMtDKXzCF5Q5ovp6LjjYkSp8qOPk8LZ8= -k8s.io/apiserver v0.30.1/go.mod h1:i87ZnQ+/PGAmSbD/iEKM68bm1D5reX8fO4Ito4B01mo= -k8s.io/client-go v0.30.0 h1:sB1AGGlhY/o7KCyCEQ0bPWzYDL0pwOZO4vAtTSh/gJQ= -k8s.io/client-go v0.30.0/go.mod h1:g7li5O5256qe6TYdAMyX/otJqMhIiGgTapdLchhmOaY= k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= -k8s.io/component-base v0.30.1 h1:bvAtlPh1UrdaZL20D9+sWxsJljMi0QZ3Lmw+kmZAaxQ= -k8s.io/component-base v0.30.1/go.mod h1:e/X9kDiOebwlI41AvBHuWdqFriSRrX50CdwA9TFaHLI= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.30.1 h1:gEIbEeCbFiaN2tNfp/EUhFdGr5/CSj8Eyq6Mkr7cCiY= -k8s.io/kms v0.30.1/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4= -k8s.io/kube-openapi v0.0.0-20240430033511-f0e62f92d13f h1:0LQagt0gDpKqvIkAMPaRGcXawNMouPECM1+F9BVxEaM= -k8s.io/kube-openapi v0.0.0-20240430033511-f0e62f92d13f/go.mod h1:S9tOR0FxgyusSNR+MboCuiDpVWkAifZvaYI1Q2ubgro= k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a h1:zD1uj3Jf+mD4zmA7W+goE5TxDkI7OGJjBNBzq5fJtLA= k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 h1:/U5vjBbQn3RChhv7P11uhYvCSm5G2GaIi5AIGBS6r4c= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0/go.mod h1:z7+wmGM2dfIiLRfrC6jb5kV2Mq/sK1ZP303cxzkV5Y4= -sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q= -sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= sigs.k8s.io/controller-runtime v0.18.3 h1:B5Wmmo8WMWK7izei+2LlXLVDGzMwAHBNLX68lwtlSR4= sigs.k8s.io/controller-runtime v0.18.3/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= From 7cc6c4cdfd4fa8ab116dcbd966de34c57bc9261d Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Thu, 6 Jun 2024 23:07:00 +0200 Subject: [PATCH 07/22] feat: add specsFile --- .gitignore | 3 + clabverter/assets/topology-clab.yaml.template | 3 + clabverter/assets/topology.yaml.template | 3 - clabverter/clabverter.go | 111 ++++++++++++++++-- clabverter/clabverter_test.go | 4 + .../test-fixtures/clabversiontest/specs.yaml | 7 ++ .../simple-no-explicit-namespace/topo01.yaml | 7 +- clabverter/types.go | 5 +- cmd/clabverter/cli/entrypoint.go | 8 ++ go.mod | 3 + go.sum | 25 ++++ testhelper/helm.go | 12 +- 12 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 clabverter/assets/topology-clab.yaml.template create mode 100644 clabverter/test-fixtures/clabversiontest/specs.yaml diff --git a/.gitignore b/.gitignore index 445b66b..3b19403 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ cover.out # goreleaser dist dir for testing builds and such locally .dist/ + +# build files +cmd/clabverter/build/ diff --git a/clabverter/assets/topology-clab.yaml.template b/clabverter/assets/topology-clab.yaml.template new file mode 100644 index 0000000..5f722d1 --- /dev/null +++ b/clabverter/assets/topology-clab.yaml.template @@ -0,0 +1,3 @@ + definition: + containerlab: |- + {{- .ClabConfig }} diff --git a/clabverter/assets/topology.yaml.template b/clabverter/assets/topology.yaml.template index 1c8d7bc..24bc55b 100644 --- a/clabverter/assets/topology.yaml.template +++ b/clabverter/assets/topology.yaml.template @@ -56,6 +56,3 @@ spec: naming: {{ .Naming }} {{- end }} connectivity: vxlan - definition: - containerlab: |- - {{- .ClabConfig }} diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index e1b9a8c..55a1ac4 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -16,17 +16,20 @@ import ( clabernetesutil "github.com/srl-labs/clabernetes/util" clabernetesutilcontainerlab "github.com/srl-labs/clabernetes/util/containerlab" clabernetesutilkubernetes "github.com/srl-labs/clabernetes/util/kubernetes" + yamlConfig "go.uber.org/config" + "gopkg.in/yaml.v3" ) const ( specIndentSpaces = 4 - specDefinitionIndentSpaces = 8 + specDefinitionIndentSpaces = 10 maxBytesForConfigMap = 950_000 ) // MustNewClabverter returns an instance of Clabverter or panics. func MustNewClabverter( topologyFile, + specsFile, outputDirectory, destinationNamespace, naming, @@ -90,6 +93,7 @@ func MustNewClabverter( return &Clabverter{ logger: clabverterLogger, topologyFile: topologyFile, + specsFile: specsFile, githubToken: githubToken, outputDirectory: outputDirectory, stdout: stdout, @@ -113,6 +117,7 @@ type Clabverter struct { logger claberneteslogging.Instance topologyFile string + specsFile string outputDirectory string stdout bool @@ -126,6 +131,7 @@ type Clabverter struct { topologyPath string topologyPathParent string isRemotePath bool + valuesPath string githubGroup string githubRepo string githubToken string @@ -135,6 +141,8 @@ type Clabverter struct { rawClabConfig string clabConfig *clabernetesutilcontainerlab.Config + rawSpecValues string + // mapping of nodeName -> startup-config info for the templating process; this is its own thing // because configurations may be huge and configmaps have a 1M char limit, so while keeping them // by themselves may not "solve" for ginormous configs, it can certainly give us a little extra @@ -362,6 +370,38 @@ func (c *Clabverter) load() error { c.logger.Debug("loading and validating containerlab topology file complete!") + if c.specsFile != "" { + c.valuesPath, err = filepath.Abs(c.specsFile) + if err != nil { + c.logger.Criticalf("failed determining absolute path of values file, error: %s", err) + + return err + } + + c.logger.Debugf( + "determined fully qualified spec values file path as: %s", c.valuesPath, + ) + + c.logger.Debug("attempting to load spec values....") + + rawSpecValuesBytes, err := os.ReadFile(c.valuesPath) + + if err != nil { + c.logger.Criticalf( + "failed reading spec values file at '%s' from disk, error: %s", + c.valuesPath, err, + ) + + return err + } + + // specs file content is non-indented, need to make it match spec indent + c.rawSpecValues = "spec:\n" + clabernetesutil.Indent( + string(rawSpecValuesBytes), + specIndentSpaces, + ) + } + return nil } @@ -453,13 +493,8 @@ func (c *Clabverter) handleManifest() error { err = t.Execute( &rendered, containerlabTemplateVars{ - Name: c.clabConfig.Name, - Namespace: c.destinationNamespace, - // pad w/ a newline so the template can look prettier :) - ClabConfig: "\n" + clabernetesutil.Indent( - c.rawClabConfig, - specDefinitionIndentSpaces, - ), + Name: c.clabConfig.Name, + Namespace: c.destinationNamespace, Files: files, FilesFromURL: c.extraFilesFromURL, InsecureRegistries: c.insecureRegistries, @@ -470,19 +505,75 @@ func (c *Clabverter) handleManifest() error { }, ) if err != nil { - c.logger.Criticalf("failed executing configmap template: %s", err) + c.logger.Criticalf("failed executing topology template: %s", err) return err } fileName := fmt.Sprintf("%s/%s.yaml", c.outputDirectory, c.clabConfig.Name) + // merge yamls + // spec values override rendered values + rendered_yaml := yamlConfig.Source(strings.NewReader(rendered.String())) + spec_yaml := yamlConfig.Source(strings.NewReader(c.rawSpecValues)) + + merged_yaml, err := yamlConfig.NewYAML(rendered_yaml, spec_yaml) + if err != nil { + c.logger.Criticalf("failed merging topology spec values: %s", err) + + return err + } + + var target interface{} + err = merged_yaml.Get(yamlConfig.Root).Populate(&target) + if err != nil { + c.logger.Criticalf("failed extracting spec values: %s", err) + + return err + } + + rendered_bytes, err := yaml.Marshal(target) + if err != nil { + c.logger.Criticalf("error marshalling topology YAML: %s", err) + + return err + } + + // marshalling removes the yaml start document chars, adding them back + rendered_bytes = append([]byte("---\n"), rendered_bytes...) + + // marshalling uglifies multilne clab topo, appending separate template render to keep it pretty + t_clab, err := template.ParseFS(Assets, "assets/topology-clab.yaml.template") + if err != nil { + c.logger.Criticalf("failed loading containerlab definition manifest from assets: %s", err) + + return err + } + + var rendered_clab bytes.Buffer + + err = t_clab.Execute( + &rendered_clab, + containerlabDefinitionTemplateVars{ + // pad w/ a newline so the template can look prettier :) + ClabConfig: "\n" + clabernetesutil.Indent( + c.rawClabConfig, + specDefinitionIndentSpaces, + ), + }, + ) + if err != nil { + c.logger.Criticalf("failed executing configmap template: %s", err) + + return err + } + c.renderedFiles = append( c.renderedFiles, renderedContent{ friendlyName: "clabernetes manifest", fileName: fileName, - content: rendered.Bytes(), + content: append(rendered_bytes, rendered_clab.Bytes()...), }, ) diff --git a/clabverter/clabverter_test.go b/clabverter/clabverter_test.go index a94b231..5694a6c 100644 --- a/clabverter/clabverter_test.go +++ b/clabverter/clabverter_test.go @@ -22,6 +22,7 @@ func TestClabvert(t *testing.T) { cases := []struct { name string topologyFile string + specsFile string destinationNamespace string insecureRegistries string imagePullSecrets string @@ -32,6 +33,7 @@ func TestClabvert(t *testing.T) { { name: "simple", topologyFile: "test-fixtures/clabversiontest/clab.yaml", + specsFile: "", destinationNamespace: "notclabernetes", insecureRegistries: "1.2.3.4", imagePullSecrets: "", @@ -41,6 +43,7 @@ func TestClabvert(t *testing.T) { { name: "simple-no-explicit-namespace", topologyFile: "test-fixtures/clabversiontest/clab.yaml", + specsFile: "test-fixtures/clabversiontest/specs.yaml", insecureRegistries: "1.2.3.4", imagePullSecrets: "regcred", disableExpose: true, @@ -87,6 +90,7 @@ func TestClabvert(t *testing.T) { clabverter := clabernetesclabverter.MustNewClabverter( testCase.topologyFile, + testCase.specsFile, actualDir, testCase.destinationNamespace, testCase.naming, diff --git a/clabverter/test-fixtures/clabversiontest/specs.yaml b/clabverter/test-fixtures/clabversiontest/specs.yaml new file mode 100644 index 0000000..40fcbae --- /dev/null +++ b/clabverter/test-fixtures/clabversiontest/specs.yaml @@ -0,0 +1,7 @@ +statusProbes: + enabled: true + excludedNodes: + - baguette + probeConfiguration: + tcpProbeConfiguration: + port: 22 diff --git a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml index ce5c686..28248af 100755 --- a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml @@ -96,11 +96,14 @@ spec: - regcred naming: non-prefixed statusProbes: - enabled: false - excludedNodes: null + enabled: true + excludedNodes: + - baguette nodeProbeConfigurations: null probeConfiguration: startupSeconds: 0 + tcpProbeConfiguration: + port: 22 status: conditions: null configs: null diff --git a/clabverter/types.go b/clabverter/types.go index 4811277..f784d14 100644 --- a/clabverter/types.go +++ b/clabverter/types.go @@ -28,7 +28,6 @@ type topologyFileFromURLTemplateVars struct { type containerlabTemplateVars struct { Name string Namespace string - ClabConfig string Files map[string][]topologyConfigMapTemplateVars FilesFromURL map[string][]topologyFileFromURLTemplateVars InsecureRegistries []string @@ -38,6 +37,10 @@ type containerlabTemplateVars struct { ContainerlabVersion string } +type containerlabDefinitionTemplateVars struct { + ClabConfig string +} + type renderedContent struct { friendlyName string fileName string diff --git a/cmd/clabverter/cli/entrypoint.go b/cmd/clabverter/cli/entrypoint.go index eb673c3..45dc705 100644 --- a/cmd/clabverter/cli/entrypoint.go +++ b/cmd/clabverter/cli/entrypoint.go @@ -9,6 +9,7 @@ import ( const ( topologyFile = "topologyFile" + specsFile = "specsFile" outputDirectory = "outputDirectory" destinationNamespace = "destinationNamespace" insecureRegistries = "insecureRegistries" @@ -37,6 +38,12 @@ If not set, clabverter will look for a file named '*.clab.y*ml'`, Required: false, Value: "", }, + &cli.StringFlag{ + Name: specsFile, + Usage: `set the values file to parse that will be included in the topology manifest spec.`, + Required: false, + Value: "", + }, &cli.StringFlag{ Name: outputDirectory, Usage: "set the output directory for the converted manifest(s)", @@ -102,6 +109,7 @@ If not set, clabverter will look for a file named '*.clab.y*ml'`, Action: func(c *cli.Context) error { err := clabernetesclabverter.MustNewClabverter( c.String(topologyFile), + c.String(specsFile), c.String(outputDirectory), c.String(destinationNamespace), c.String(naming), diff --git a/go.mod b/go.mod index 8b8379f..5208561 100644 --- a/go.mod +++ b/go.mod @@ -89,9 +89,11 @@ require ( go.opentelemetry.io/otel/sdk v1.19.0 // indirect go.opentelemetry.io/otel/trace v1.19.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/config v1.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect golang.org/x/sync v0.7.0 // indirect @@ -99,6 +101,7 @@ require ( golang.org/x/term v0.21.0 // indirect golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.20.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect diff --git a/go.sum b/go.sum index 72a10fc..f723e83 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= @@ -78,6 +79,7 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -98,6 +100,7 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr 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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -138,6 +141,7 @@ github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lne github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -152,6 +156,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -189,13 +194,19 @@ go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1 go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/config v1.4.0 h1:upnMPpMm6WlbZtXoasNkK4f0FhxwS+W4Iqz5oNznehQ= +go.uber.org/config v1.4.0/go.mod h1:aCyrMHmUAc/s2h9sv1koP84M9ZF/4K+g2oleyESO/Ig= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -207,9 +218,13 @@ golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -248,6 +263,7 @@ golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= @@ -260,6 +276,11 @@ golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191104232314-dc038396d1f0/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -287,19 +308,23 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= diff --git a/testhelper/helm.go b/testhelper/helm.go index 8c932fd..d976f14 100644 --- a/testhelper/helm.go +++ b/testhelper/helm.go @@ -19,7 +19,7 @@ const ( // HelmTest executes a test against a helm chart -- this is a very simple/dumb test meant only to // ensure that we don't accidentally screw up charts. We do this by storing the "golden" output of // a rendered chart (and subcharts if applicable) with a given values file. -func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, chartsDir string) { +func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chartsDir string) { t.Helper() // we have to make the chartname/templates dir too since thats where helm wants to write things @@ -31,10 +31,10 @@ func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, char ) actualDir := fmt.Sprintf("%s/%s/templates", actualRootDir, chartName) - var valuesFile string + var specsFile string - if valuesFileName != "" { - valuesFile = fmt.Sprintf( + if specsFileName != "" { + specsFile = fmt.Sprintf( "%s/tests/%s/test-fixtures/%s-values.yaml", chartName, testName, @@ -74,8 +74,8 @@ func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, char args = append(args, "--namespace", namespace) } - if valuesFile != "" { - args = append(args, "--values", valuesFile) + if specsFile != "" { + args = append(args, "--values", specsFile) } HelmCommand( From 0e574325b40ababeba8226813aebef45df954c4c Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Thu, 6 Jun 2024 23:27:19 +0200 Subject: [PATCH 08/22] revert helm.go --- testhelper/helm.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/testhelper/helm.go b/testhelper/helm.go index d976f14..8c932fd 100644 --- a/testhelper/helm.go +++ b/testhelper/helm.go @@ -19,7 +19,7 @@ const ( // HelmTest executes a test against a helm chart -- this is a very simple/dumb test meant only to // ensure that we don't accidentally screw up charts. We do this by storing the "golden" output of // a rendered chart (and subcharts if applicable) with a given values file. -func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chartsDir string) { +func HelmTest(t *testing.T, chartName, testName, namespace, valuesFileName, chartsDir string) { t.Helper() // we have to make the chartname/templates dir too since thats where helm wants to write things @@ -31,10 +31,10 @@ func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chart ) actualDir := fmt.Sprintf("%s/%s/templates", actualRootDir, chartName) - var specsFile string + var valuesFile string - if specsFileName != "" { - specsFile = fmt.Sprintf( + if valuesFileName != "" { + valuesFile = fmt.Sprintf( "%s/tests/%s/test-fixtures/%s-values.yaml", chartName, testName, @@ -74,8 +74,8 @@ func HelmTest(t *testing.T, chartName, testName, namespace, specsFileName, chart args = append(args, "--namespace", namespace) } - if specsFile != "" { - args = append(args, "--values", specsFile) + if valuesFile != "" { + args = append(args, "--values", valuesFile) } HelmCommand( From aa2b22195de10beb176b84eae6d48edf7e9b4a40 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Thu, 6 Jun 2024 23:38:50 +0200 Subject: [PATCH 09/22] fix lint --- e2e/clabverter/clabverter_basic_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/clabverter/clabverter_basic_test.go b/e2e/clabverter/clabverter_basic_test.go index 3c3d986..35c5f00 100644 --- a/e2e/clabverter/clabverter_basic_test.go +++ b/e2e/clabverter/clabverter_basic_test.go @@ -25,6 +25,7 @@ func TestClabverterBasic(t *testing.T) { c := clabernetesclabverter.MustNewClabverter( "test-fixtures/basic_clab.yaml", + "", "test-fixtures", namespace, "prefixed", From aca80880283fec70d437374dab9929a95532fc86 Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Fri, 7 Jun 2024 09:13:16 -0700 Subject: [PATCH 10/22] chore: appease lll in clabverter entrypoint --- clabverter/clabverter.go | 1 - cmd/clabverter/cli/entrypoint.go | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 55a1ac4..5d51c0d 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -385,7 +385,6 @@ func (c *Clabverter) load() error { c.logger.Debug("attempting to load spec values....") rawSpecValuesBytes, err := os.ReadFile(c.valuesPath) - if err != nil { c.logger.Criticalf( "failed reading spec values file at '%s' from disk, error: %s", diff --git a/cmd/clabverter/cli/entrypoint.go b/cmd/clabverter/cli/entrypoint.go index 45dc705..7843036 100644 --- a/cmd/clabverter/cli/entrypoint.go +++ b/cmd/clabverter/cli/entrypoint.go @@ -33,14 +33,15 @@ func Entrypoint() *cli.App { Flags: []cli.Flag{ &cli.StringFlag{ Name: topologyFile, - Usage: `set the topology file to parse. -If not set, clabverter will look for a file named '*.clab.y*ml'`, + Usage: "set the topology file to parse. If not set, clabverter will look for" + + " a file named '*.clab.y*ml'", Required: false, Value: "", }, &cli.StringFlag{ - Name: specsFile, - Usage: `set the values file to parse that will be included in the topology manifest spec.`, + Name: specsFile, + Usage: "set the values file to parse that will be included in the topology" + + " manifest spec", Required: false, Value: "", }, From 5116d624d93dc9386db3845922ce1d9b97659b7c Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Fri, 7 Jun 2024 09:16:55 -0700 Subject: [PATCH 11/22] chore: appease wsl cuddle buddy --- clabverter/clabverter.go | 1 + 1 file changed, 1 insertion(+) diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 5d51c0d..be5b173 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -524,6 +524,7 @@ func (c *Clabverter) handleManifest() error { } var target interface{} + err = merged_yaml.Get(yamlConfig.Root).Populate(&target) if err != nil { c.logger.Criticalf("failed extracting spec values: %s", err) From 64d92d0de41bb27d313e96e033cecbb38e7f955f Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Fri, 7 Jun 2024 10:05:50 -0700 Subject: [PATCH 12/22] refactor: do yaml merge nightmare to merge optional base spec setup into rendered topo --- clabverter/assets/topology-clab.yaml.template | 3 - clabverter/assets/topology.yaml.template | 3 + clabverter/clabverter.go | 167 ++++++++---------- .../test-fixtures/clabversiontest/specs.yaml | 3 +- clabverter/types.go | 5 +- go.mod | 45 ----- go.sum | 147 +-------------- 7 files changed, 84 insertions(+), 289 deletions(-) delete mode 100644 clabverter/assets/topology-clab.yaml.template diff --git a/clabverter/assets/topology-clab.yaml.template b/clabverter/assets/topology-clab.yaml.template deleted file mode 100644 index 5f722d1..0000000 --- a/clabverter/assets/topology-clab.yaml.template +++ /dev/null @@ -1,3 +0,0 @@ - definition: - containerlab: |- - {{- .ClabConfig }} diff --git a/clabverter/assets/topology.yaml.template b/clabverter/assets/topology.yaml.template index 24bc55b..86b9618 100644 --- a/clabverter/assets/topology.yaml.template +++ b/clabverter/assets/topology.yaml.template @@ -56,3 +56,6 @@ spec: naming: {{ .Naming }} {{- end }} connectivity: vxlan + definition: + containerlab: |- + {{- .ClabConfig }} \ No newline at end of file diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index be5b173..704ccb5 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -11,13 +11,13 @@ import ( "strings" "text/template" + clabernetesapisv1alpha1 "github.com/srl-labs/clabernetes/apis/v1alpha1" clabernetesconstants "github.com/srl-labs/clabernetes/constants" claberneteslogging "github.com/srl-labs/clabernetes/logging" clabernetesutil "github.com/srl-labs/clabernetes/util" clabernetesutilcontainerlab "github.com/srl-labs/clabernetes/util/containerlab" clabernetesutilkubernetes "github.com/srl-labs/clabernetes/util/kubernetes" - yamlConfig "go.uber.org/config" - "gopkg.in/yaml.v3" + sigsyaml "sigs.k8s.io/yaml" ) const ( @@ -29,7 +29,7 @@ const ( // MustNewClabverter returns an instance of Clabverter or panics. func MustNewClabverter( topologyFile, - specsFile, + topologySpecFile, outputDirectory, destinationNamespace, naming, @@ -93,7 +93,7 @@ func MustNewClabverter( return &Clabverter{ logger: clabverterLogger, topologyFile: topologyFile, - specsFile: specsFile, + topologySpecFile: topologySpecFile, githubToken: githubToken, outputDirectory: outputDirectory, stdout: stdout, @@ -117,7 +117,6 @@ type Clabverter struct { logger claberneteslogging.Instance topologyFile string - specsFile string outputDirectory string stdout bool @@ -128,10 +127,13 @@ type Clabverter struct { disableExpose bool - topologyPath string - topologyPathParent string - isRemotePath bool - valuesPath string + topologyPath string + topologyPathParent string + isRemotePath bool + + topologySpecFile string + topologySpecFilePath string + githubGroup string githubRepo string githubToken string @@ -141,8 +143,6 @@ type Clabverter struct { rawClabConfig string clabConfig *clabernetesutilcontainerlab.Config - rawSpecValues string - // mapping of nodeName -> startup-config info for the templating process; this is its own thing // because configurations may be huge and configmaps have a 1M char limit, so while keeping them // by themselves may not "solve" for ginormous configs, it can certainly give us a little extra @@ -313,6 +313,19 @@ func (c *Clabverter) load() error { c.topologyPathParent = filepath.Dir(c.topologyPath) } + if c.topologySpecFile != "" { + c.topologySpecFilePath, err = filepath.Abs(c.topologySpecFile) + if err != nil { + c.logger.Criticalf("failed determining absolute path of values file, error: %s", err) + + return err + } + } + + c.logger.Debugf( + "determined fully qualified topology spec values file path as: %s", c.topologySpecFilePath, + ) + c.logger.Debug("attempting to load containerlab topology....") var rawClabConfigBytes []byte @@ -370,37 +383,6 @@ func (c *Clabverter) load() error { c.logger.Debug("loading and validating containerlab topology file complete!") - if c.specsFile != "" { - c.valuesPath, err = filepath.Abs(c.specsFile) - if err != nil { - c.logger.Criticalf("failed determining absolute path of values file, error: %s", err) - - return err - } - - c.logger.Debugf( - "determined fully qualified spec values file path as: %s", c.valuesPath, - ) - - c.logger.Debug("attempting to load spec values....") - - rawSpecValuesBytes, err := os.ReadFile(c.valuesPath) - if err != nil { - c.logger.Criticalf( - "failed reading spec values file at '%s' from disk, error: %s", - c.valuesPath, err, - ) - - return err - } - - // specs file content is non-indented, need to make it match spec indent - c.rawSpecValues = "spec:\n" + clabernetesutil.Indent( - string(rawSpecValuesBytes), - specIndentSpaces, - ) - } - return nil } @@ -492,8 +474,13 @@ func (c *Clabverter) handleManifest() error { err = t.Execute( &rendered, containerlabTemplateVars{ - Name: c.clabConfig.Name, - Namespace: c.destinationNamespace, + Name: c.clabConfig.Name, + Namespace: c.destinationNamespace, + // pad w/ a newline so the template can look prettier :) + ClabConfig: "\n" + clabernetesutil.Indent( + c.rawClabConfig, + specDefinitionIndentSpaces, + ), Files: files, FilesFromURL: c.extraFilesFromURL, InsecureRegistries: c.insecureRegistries, @@ -504,80 +491,78 @@ func (c *Clabverter) handleManifest() error { }, ) if err != nil { - c.logger.Criticalf("failed executing topology template: %s", err) + c.logger.Criticalf("failed executing topology template, error: %s", err) return err } - fileName := fmt.Sprintf("%s/%s.yaml", c.outputDirectory, c.clabConfig.Name) - - // merge yamls - // spec values override rendered values - rendered_yaml := yamlConfig.Source(strings.NewReader(rendered.String())) - spec_yaml := yamlConfig.Source(strings.NewReader(c.rawSpecValues)) - - merged_yaml, err := yamlConfig.NewYAML(rendered_yaml, spec_yaml) + finalRendered, err := c.mergeConfigSpecWithRenderedTopology(rendered.Bytes()) if err != nil { - c.logger.Criticalf("failed merging topology spec values: %s", err) + c.logger.Criticalf("failed merging spec config with rendered topology, error: %s", err) return err } - var target interface{} + fileName := fmt.Sprintf("%s/%s.yaml", c.outputDirectory, c.clabConfig.Name) - err = merged_yaml.Get(yamlConfig.Root).Populate(&target) - if err != nil { - c.logger.Criticalf("failed extracting spec values: %s", err) + c.renderedFiles = append( + c.renderedFiles, + renderedContent{ + friendlyName: "clabernetes manifest", + fileName: fileName, + content: finalRendered, + }, + ) - return err + return nil +} + +func (c *Clabverter) mergeConfigSpecWithRenderedTopology( + renderedTopologySpecBytes []byte, +) ([]byte, error) { + finalTopology := &clabernetesapisv1alpha1.Topology{} + + if c.topologySpecFilePath == "" { + return renderedTopologySpecBytes, nil } - rendered_bytes, err := yaml.Marshal(target) + content, err := os.ReadFile(c.topologySpecFilePath) if err != nil { - c.logger.Criticalf("error marshalling topology YAML: %s", err) - - return err + return nil, err } - // marshalling removes the yaml start document chars, adding them back - rendered_bytes = append([]byte("---\n"), rendered_bytes...) + topologySpecFromSpecsFile := &clabernetesapisv1alpha1.TopologySpec{} - // marshalling uglifies multilne clab topo, appending separate template render to keep it pretty - t_clab, err := template.ParseFS(Assets, "assets/topology-clab.yaml.template") + err = sigsyaml.Unmarshal(content, topologySpecFromSpecsFile) if err != nil { - c.logger.Criticalf("failed loading containerlab definition manifest from assets: %s", err) + return nil, err + } - return err + topologyFromSpecsFile := &clabernetesapisv1alpha1.Topology{ + Spec: *topologySpecFromSpecsFile, } - var rendered_clab bytes.Buffer + topologyFromSpecsFileBytes, err := sigsyaml.Marshal(topologyFromSpecsFile) + if err != nil { + return nil, err + } - err = t_clab.Execute( - &rendered_clab, - containerlabDefinitionTemplateVars{ - // pad w/ a newline so the template can look prettier :) - ClabConfig: "\n" + clabernetesutil.Indent( - c.rawClabConfig, - specDefinitionIndentSpaces, - ), - }, - ) + err = sigsyaml.Unmarshal(topologyFromSpecsFileBytes, finalTopology) if err != nil { - c.logger.Criticalf("failed executing configmap template: %s", err) + return nil, err + } - return err + err = sigsyaml.Unmarshal(renderedTopologySpecBytes, finalTopology) + if err != nil { + return nil, err } - c.renderedFiles = append( - c.renderedFiles, - renderedContent{ - friendlyName: "clabernetes manifest", - fileName: fileName, - content: append(rendered_bytes, rendered_clab.Bytes()...), - }, - ) + finalTopologyBytes, err := sigsyaml.Marshal(finalTopology) + if err != nil { + return nil, err + } - return nil + return finalTopologyBytes, nil } func (c *Clabverter) output() error { diff --git a/clabverter/test-fixtures/clabversiontest/specs.yaml b/clabverter/test-fixtures/clabversiontest/specs.yaml index 40fcbae..50713e2 100644 --- a/clabverter/test-fixtures/clabversiontest/specs.yaml +++ b/clabverter/test-fixtures/clabversiontest/specs.yaml @@ -1,7 +1,8 @@ +--- statusProbes: enabled: true excludedNodes: - baguette probeConfiguration: tcpProbeConfiguration: - port: 22 + port: 22 \ No newline at end of file diff --git a/clabverter/types.go b/clabverter/types.go index f784d14..4811277 100644 --- a/clabverter/types.go +++ b/clabverter/types.go @@ -28,6 +28,7 @@ type topologyFileFromURLTemplateVars struct { type containerlabTemplateVars struct { Name string Namespace string + ClabConfig string Files map[string][]topologyConfigMapTemplateVars FilesFromURL map[string][]topologyFileFromURLTemplateVars InsecureRegistries []string @@ -37,10 +38,6 @@ type containerlabTemplateVars struct { ContainerlabVersion string } -type containerlabDefinitionTemplateVars struct { - ClabConfig string -} - type renderedContent struct { friendlyName string fileName string diff --git a/go.mod b/go.mod index 5208561..e80641f 100644 --- a/go.mod +++ b/go.mod @@ -24,98 +24,53 @@ require ( require golang.org/x/crypto v0.24.0 require ( - github.com/NYTimes/gziphandler v1.1.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect - github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/coreos/go-semver v0.3.1 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cel-go v0.17.8 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.4.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/imdario/mergo v0.3.15 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect - github.com/moby/spdystream v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.18.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect - go.etcd.io/etcd/api/v3 v3.5.10 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect - go.etcd.io/etcd/client/v3 v3.5.10 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/config v1.4.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.21.0 // indirect golang.org/x/term v0.21.0 // indirect golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.20.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect - google.golang.org/grpc v1.60.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiserver v0.30.1 // indirect - k8s.io/component-base v0.30.1 // indirect - k8s.io/kms v0.30.1 // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/go.sum b/go.sum index f723e83..685960b 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,11 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/carlmontanari/difflibgo v0.0.0-20240227210139-93685b1c22ae h1:h4sxL/AXg3FRPf+sT2Y4daEQQE/UAkNAM3U0t4Cgha8= github.com/carlmontanari/difflibgo v0.0.0-20240227210139-93685b1c22ae/go.mod h1:+3MuSIeC3qmdSesR12cTLeb47R/Vvo+bHdB6hC5HShk= github.com/carlmontanari/slurpeeth v0.0.0-20240209224827-246fa87e31f3 h1:+XFqJFGVs1EVP5GajTTDB91tTKG+mF0jlN1U1jT90tI= github.com/carlmontanari/slurpeeth v0.0.0-20240209224827-246fa87e31f3/go.mod h1:Qd8tERCTEs3R6Smq0Kjy0aPONCZ/yYXzjiq3bwg3oqk= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= 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= @@ -36,15 +19,10 @@ github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCv github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= @@ -57,7 +35,6 @@ github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ 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/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -66,8 +43,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto= -github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -79,28 +54,16 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -112,8 +75,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 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/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -121,8 +82,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= @@ -141,23 +100,16 @@ github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lne github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -170,61 +122,23 @@ github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQut 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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= -go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= -go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= -go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= -go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= -go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 h1:ZOLJc06r4CB42laIXg/7udr0pbZyuAihN10A/XuiQRY= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/config v1.4.0 h1:upnMPpMm6WlbZtXoasNkK4f0FhxwS+W4Iqz5oNznehQ= -go.uber.org/config v1.4.0/go.mod h1:aCyrMHmUAc/s2h9sv1koP84M9ZF/4K+g2oleyESO/Ig= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -239,8 +153,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ 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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -248,45 +160,27 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191104232314-dc038396d1f0/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -295,72 +189,35 @@ gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= -k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= -k8s.io/apiextensions-apiserver v0.30.0 h1:jcZFKMqnICJfRxTgnC4E+Hpcq8UEhT8B2lhBcQ+6uAs= -k8s.io/apiextensions-apiserver v0.30.0/go.mod h1:N9ogQFGcrbWqAY9p2mUAL5mGxsLqwgtUce127VtRX5Y= k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= -k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= -k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/apiserver v0.30.1 h1:BEWEe8bzS12nMtDKXzCF5Q5ovp6LjjYkSp8qOPk8LZ8= -k8s.io/apiserver v0.30.1/go.mod h1:i87ZnQ+/PGAmSbD/iEKM68bm1D5reX8fO4Ito4B01mo= -k8s.io/client-go v0.30.0 h1:sB1AGGlhY/o7KCyCEQ0bPWzYDL0pwOZO4vAtTSh/gJQ= -k8s.io/client-go v0.30.0/go.mod h1:g7li5O5256qe6TYdAMyX/otJqMhIiGgTapdLchhmOaY= k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= -k8s.io/component-base v0.30.1 h1:bvAtlPh1UrdaZL20D9+sWxsJljMi0QZ3Lmw+kmZAaxQ= -k8s.io/component-base v0.30.1/go.mod h1:e/X9kDiOebwlI41AvBHuWdqFriSRrX50CdwA9TFaHLI= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.30.1 h1:gEIbEeCbFiaN2tNfp/EUhFdGr5/CSj8Eyq6Mkr7cCiY= -k8s.io/kms v0.30.1/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4= -k8s.io/kube-openapi v0.0.0-20240430033511-f0e62f92d13f h1:0LQagt0gDpKqvIkAMPaRGcXawNMouPECM1+F9BVxEaM= -k8s.io/kube-openapi v0.0.0-20240430033511-f0e62f92d13f/go.mod h1:S9tOR0FxgyusSNR+MboCuiDpVWkAifZvaYI1Q2ubgro= k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a h1:zD1uj3Jf+mD4zmA7W+goE5TxDkI7OGJjBNBzq5fJtLA= k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 h1:/U5vjBbQn3RChhv7P11uhYvCSm5G2GaIi5AIGBS6r4c= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0/go.mod h1:z7+wmGM2dfIiLRfrC6jb5kV2Mq/sK1ZP303cxzkV5Y4= -sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q= -sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= -sigs.k8s.io/controller-runtime v0.18.3 h1:B5Wmmo8WMWK7izei+2LlXLVDGzMwAHBNLX68lwtlSR4= -sigs.k8s.io/controller-runtime v0.18.3/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= sigs.k8s.io/controller-runtime v0.18.4 h1:87+guW1zhvuPLh1PHybKdYFLU0YJp4FhJRmiHvm5BZw= sigs.k8s.io/controller-runtime v0.18.4/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= From b1ea797985d6e0fc68b97bdddf7a8e67d53f75b4 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Tue, 11 Jun 2024 17:13:46 +0200 Subject: [PATCH 13/22] first pass at overloading specsFile with cli opt values --- apis/v1alpha1/topology.go | 6 +++--- apis/v1alpha1/topologyspec.go | 6 +++--- clabverter/assets/topology.yaml.template | 1 - clabverter/clabverter.go | 15 +++++++++------ clabverter/clabverter_test.go | 12 ++++++------ .../test-fixtures/clabversiontest/specs.yaml | 6 +++++- .../simple-no-explicit-namespace/topo01.yaml | 2 +- .../test-fixtures/golden/simple/topo01.yaml | 5 ++--- 8 files changed, 29 insertions(+), 24 deletions(-) diff --git a/apis/v1alpha1/topology.go b/apis/v1alpha1/topology.go index ec9f6dd..af90c19 100644 --- a/apis/v1alpha1/topology.go +++ b/apis/v1alpha1/topology.go @@ -44,7 +44,7 @@ type TopologySpec struct { // ImagePull holds configurations relevant to how clabernetes launcher pods handle pulling // images. // +optional - ImagePull ImagePull `json:"imagePull"` + ImagePull ImagePull `json:"imagePull,omitempty"` // Naming tells the clabernetes controller how it should name resources it creates -- that is // whether it should include the containerlab topology name as a prefix on resources spawned // from this Topology or not; this includes the actual (containerlab) node Deployment(s), as @@ -60,14 +60,14 @@ type TopologySpec struct { // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="naming field is immutable, to change this value delete and re-create the Topology" // +kubebuilder:validation:Enum=prefixed;non-prefixed;global // +kubebuilder:default=global - Naming string `json:"naming"` + Naming string `json:"naming,omitempty"` // Connectivity defines the type of connectivity to use between nodes in the topology. The // default behavior is to use vxlan tunnels, alternatively you can enable a more experimental // "slurpeeth" connectivity flavor that stuffs traffic into tcp tunnels to avoid any vxlan mtu // and/or fragmentation challenges. // +kubebuilder:validation:Enum=vxlan;slurpeeth // +kubebuilder:default=vxlan - Connectivity string `json:"connectivity"` + Connectivity string `json:"connectivity,omitempty"` } // TopologyStatus is the status for a Topology resource. diff --git a/apis/v1alpha1/topologyspec.go b/apis/v1alpha1/topologyspec.go index 48fef5d..a2859a9 100644 --- a/apis/v1alpha1/topologyspec.go +++ b/apis/v1alpha1/topologyspec.go @@ -72,7 +72,7 @@ type Expose struct { // DisableExpose indicates if exposing nodes via LoadBalancer service should be disabled, by // default any mapped ports in a containerlab topology will be exposed. // +optional - DisableExpose bool `json:"disableExpose"` + DisableExpose bool `json:"disableExpose,omitempty"` // DisableAutoExpose disables the automagic exposing of ports for a given topology. When this // setting is disabled clabernetes will not auto add ports so if you want to expose (via a // load balancer service) you will need to have ports outlined in your containerlab config @@ -132,7 +132,7 @@ type Deployment struct { // the configmap is mounted in its entirety (like normal k8s things), so you *probably* want // to specify the sub path unless you are sure what you're doing! // +optional - FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap"` + FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap,omitempty"` // FilesFromURL is a mapping of FileFromURL that define a URL at which to fetch a file, and path // on a launcher node that the file should be downloaded to. This is useful for configs that are // larger than the ConfigMap (etcd) 1Mb size limit. @@ -273,7 +273,7 @@ type ImagePull struct { // InsecureRegistries is a slice of strings of insecure registries to configure in the launcher // pods. // +optional - InsecureRegistries InsecureRegistries `json:"insecureRegistries"` + InsecureRegistries InsecureRegistries `json:"insecureRegistries,omitempty"` // PullThroughOverride allows for overriding the image pull through mode for this // particular topology. // +kubebuilder:validation:Enum=auto;always;never diff --git a/clabverter/assets/topology.yaml.template b/clabverter/assets/topology.yaml.template index 86b9618..0916521 100644 --- a/clabverter/assets/topology.yaml.template +++ b/clabverter/assets/topology.yaml.template @@ -55,7 +55,6 @@ spec: {{- if .Naming }} naming: {{ .Naming }} {{- end }} - connectivity: vxlan definition: containerlab: |- {{- .ClabConfig }} \ No newline at end of file diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 704ccb5..01076f2 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -531,23 +531,23 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } - topologySpecFromSpecsFile := &clabernetesapisv1alpha1.TopologySpec{} + topologySpecFromTopoSpecsFile := &clabernetesapisv1alpha1.TopologySpec{} - err = sigsyaml.Unmarshal(content, topologySpecFromSpecsFile) + err = sigsyaml.Unmarshal(content, topologySpecFromTopoSpecsFile) if err != nil { return nil, err } - topologyFromSpecsFile := &clabernetesapisv1alpha1.Topology{ - Spec: *topologySpecFromSpecsFile, + topologyFromTopoSpecsFile := &clabernetesapisv1alpha1.Topology{ + Spec: *topologySpecFromTopoSpecsFile, } - topologyFromSpecsFileBytes, err := sigsyaml.Marshal(topologyFromSpecsFile) + topologyFromTopoSpecsFileBytes, err := sigsyaml.Marshal(topologyFromTopoSpecsFile) if err != nil { return nil, err } - err = sigsyaml.Unmarshal(topologyFromSpecsFileBytes, finalTopology) + err = sigsyaml.Unmarshal(topologyFromTopoSpecsFileBytes, finalTopology) if err != nil { return nil, err } @@ -562,6 +562,9 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } + // add yaml start document chars + finalTopologyBytes = append([]byte("---\n"), finalTopologyBytes...) + return finalTopologyBytes, nil } diff --git a/clabverter/clabverter_test.go b/clabverter/clabverter_test.go index 5694a6c..48522e2 100644 --- a/clabverter/clabverter_test.go +++ b/clabverter/clabverter_test.go @@ -22,7 +22,7 @@ func TestClabvert(t *testing.T) { cases := []struct { name string topologyFile string - specsFile string + topoSpecsFile string destinationNamespace string insecureRegistries string imagePullSecrets string @@ -33,19 +33,19 @@ func TestClabvert(t *testing.T) { { name: "simple", topologyFile: "test-fixtures/clabversiontest/clab.yaml", - specsFile: "", + topoSpecsFile: "", destinationNamespace: "notclabernetes", insecureRegistries: "1.2.3.4", - imagePullSecrets: "", + imagePullSecrets: "regcred", naming: "prefixed", containerlabVersion: "", }, { name: "simple-no-explicit-namespace", topologyFile: "test-fixtures/clabversiontest/clab.yaml", - specsFile: "test-fixtures/clabversiontest/specs.yaml", + topoSpecsFile: "test-fixtures/clabversiontest/specs.yaml", insecureRegistries: "1.2.3.4", - imagePullSecrets: "regcred", + imagePullSecrets: "", disableExpose: true, naming: "non-prefixed", containerlabVersion: "0.51.0", @@ -90,7 +90,7 @@ func TestClabvert(t *testing.T) { clabverter := clabernetesclabverter.MustNewClabverter( testCase.topologyFile, - testCase.specsFile, + testCase.topoSpecsFile, actualDir, testCase.destinationNamespace, testCase.naming, diff --git a/clabverter/test-fixtures/clabversiontest/specs.yaml b/clabverter/test-fixtures/clabversiontest/specs.yaml index 9182165..ba8a088 100644 --- a/clabverter/test-fixtures/clabversiontest/specs.yaml +++ b/clabverter/test-fixtures/clabversiontest/specs.yaml @@ -1,8 +1,12 @@ --- +connectivity: slurpeeth +imagePull: + pullSecrets: + - regcred statusProbes: enabled: true excludedNodes: - baguette probeConfiguration: tcpProbeConfiguration: - port: 22 + port: 22 \ No newline at end of file diff --git a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml index 28248af..8f72af6 100755 --- a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml @@ -5,7 +5,7 @@ metadata: name: topo01 namespace: c9s-topo01 spec: - connectivity: vxlan + connectivity: slurpeeth definition: containerlab: |- name: topo01 diff --git a/clabverter/test-fixtures/golden/simple/topo01.yaml b/clabverter/test-fixtures/golden/simple/topo01.yaml index 0c97667..562929a 100755 --- a/clabverter/test-fixtures/golden/simple/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple/topo01.yaml @@ -5,7 +5,6 @@ metadata: name: topo01 namespace: notclabernetes spec: - connectivity: vxlan definition: containerlab: |- name: topo01 @@ -87,11 +86,11 @@ spec: tolerations: null expose: disableAutoExpose: false - disableExpose: false imagePull: insecureRegistries: - 1.2.3.4 - pullSecrets: null + pullSecrets: + - regcred naming: prefixed statusProbes: enabled: false From f25a8183bbf187b0e1e92320e670a1aaa3f84059 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Fri, 14 Jun 2024 14:21:13 +0200 Subject: [PATCH 14/22] add topology.spec.status pointer for omitempty --- apis/v1alpha1/topology.go | 4 ++-- apis/v1alpha1/zz_generated.deepcopy.go | 4 ++-- clabverter/clabverter.go | 10 ++++---- .../simple-no-explicit-namespace/topo01.yaml | 13 ---------- .../test-fixtures/golden/simple/topo01.yaml | 13 ---------- controllers/topology/connectivity_test.go | 4 ++-- controllers/topology/definition_test.go | 12 +++++----- controllers/topology/deployment_test.go | 24 +++++++++---------- .../topology/persistentvolumeclaim_test.go | 14 +++++------ controllers/topology/reconcile.go | 2 +- controllers/topology/resolve_test.go | 6 ++--- controllers/topology/rolebinding_test.go | 4 ++-- controllers/topology/serviceaccount_test.go | 4 ++-- controllers/topology/serviceexpose_test.go | 12 +++++----- controllers/topology/servicefabric_test.go | 6 ++--- controllers/topology/util_test.go | 4 ++-- 16 files changed, 55 insertions(+), 81 deletions(-) diff --git a/apis/v1alpha1/topology.go b/apis/v1alpha1/topology.go index af90c19..834568e 100644 --- a/apis/v1alpha1/topology.go +++ b/apis/v1alpha1/topology.go @@ -18,8 +18,8 @@ type Topology struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - Spec TopologySpec `json:"spec,omitempty"` - Status TopologyStatus `json:"status,omitempty"` + Spec *TopologySpec `json:"spec,omitempty"` + Status *TopologyStatus `json:"status,omitempty"` } // TopologySpec is the spec for a Topology resource. diff --git a/apis/v1alpha1/zz_generated.deepcopy.go b/apis/v1alpha1/zz_generated.deepcopy.go index bb533a2..4cd09cf 100644 --- a/apis/v1alpha1/zz_generated.deepcopy.go +++ b/apis/v1alpha1/zz_generated.deepcopy.go @@ -821,8 +821,8 @@ func (in *Topology) DeepCopyInto(out *Topology) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + in.Spec.DeepCopyInto(out.Spec) + in.Status.DeepCopyInto(out.Status) return } diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 01076f2..7a36684 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -520,8 +520,6 @@ func (c *Clabverter) handleManifest() error { func (c *Clabverter) mergeConfigSpecWithRenderedTopology( renderedTopologySpecBytes []byte, ) ([]byte, error) { - finalTopology := &clabernetesapisv1alpha1.Topology{} - if c.topologySpecFilePath == "" { return renderedTopologySpecBytes, nil } @@ -539,7 +537,7 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( } topologyFromTopoSpecsFile := &clabernetesapisv1alpha1.Topology{ - Spec: *topologySpecFromTopoSpecsFile, + Spec: topologySpecFromTopoSpecsFile, } topologyFromTopoSpecsFileBytes, err := sigsyaml.Marshal(topologyFromTopoSpecsFile) @@ -547,12 +545,14 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } - err = sigsyaml.Unmarshal(topologyFromTopoSpecsFileBytes, finalTopology) + finalTopology := &clabernetesapisv1alpha1.Topology{} + + err = sigsyaml.UnmarshalStrict(topologyFromTopoSpecsFileBytes, finalTopology) if err != nil { return nil, err } - err = sigsyaml.Unmarshal(renderedTopologySpecBytes, finalTopology) + err = sigsyaml.UnmarshalStrict(renderedTopologySpecBytes, finalTopology) if err != nil { return nil, err } diff --git a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml index 8f72af6..7907b60 100755 --- a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml @@ -104,16 +104,3 @@ spec: startupSeconds: 0 tcpProbeConfiguration: port: 22 -status: - conditions: null - configs: null - exposedPorts: null - kind: "" - nodeReadiness: null - reconcileHashes: - config: "" - exposedPorts: "" - filesFromURL: null - imagePullSecrets: "" - removeTopologyPrefix: null - topologyReady: false diff --git a/clabverter/test-fixtures/golden/simple/topo01.yaml b/clabverter/test-fixtures/golden/simple/topo01.yaml index 562929a..0ddce5d 100755 --- a/clabverter/test-fixtures/golden/simple/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple/topo01.yaml @@ -98,16 +98,3 @@ spec: nodeProbeConfigurations: null probeConfiguration: startupSeconds: 0 -status: - conditions: null - configs: null - exposedPorts: null - kind: "" - nodeReadiness: null - reconcileHashes: - config: "" - exposedPorts: "" - filesFromURL: null - imagePullSecrets: "" - removeTopologyPrefix: null - topologyReady: false diff --git a/controllers/topology/connectivity_test.go b/controllers/topology/connectivity_test.go index bfbca1b..25bed61 100644 --- a/controllers/topology/connectivity_test.go +++ b/controllers/topology/connectivity_test.go @@ -28,7 +28,7 @@ func TestRenderConnectivity(t *testing.T) { Name: "render-rolebinding-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -49,7 +49,7 @@ func TestRenderConnectivity(t *testing.T) { Name: "render-rolebinding-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test diff --git a/controllers/topology/definition_test.go b/controllers/topology/definition_test.go index a806ff0..3703d7f 100644 --- a/controllers/topology/definition_test.go +++ b/controllers/topology/definition_test.go @@ -31,7 +31,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-containerlab-definition-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -70,7 +70,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-containerlab-definition-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -87,7 +87,7 @@ func TestDefinitionProcess(t *testing.T) { `, }, }, - Status: clabernetesapisv1alpha1.TopologyStatus{ + Status: &clabernetesapisv1alpha1.TopologyStatus{ RemoveTopologyPrefix: clabernetesutil.ToPointer(true), }, }, @@ -113,7 +113,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-kne-definition-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Kne: ` name: "2-srl-ixr6" nodes: { @@ -177,7 +177,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-kne-definition-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Kne: ` name: "2-srl-ixr6" nodes: { @@ -219,7 +219,7 @@ func TestDefinitionProcess(t *testing.T) { `, }, }, - Status: clabernetesapisv1alpha1.TopologyStatus{ + Status: &clabernetesapisv1alpha1.TopologyStatus{ RemoveTopologyPrefix: clabernetesutil.ToPointer(true), }, }, diff --git a/controllers/topology/deployment_test.go b/controllers/topology/deployment_test.go index 07b88dd..0b4a362 100644 --- a/controllers/topology/deployment_test.go +++ b/controllers/topology/deployment_test.go @@ -143,7 +143,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- @@ -201,7 +201,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ PrivilegedLauncher: clabernetesutil.ToPointer(false), @@ -262,7 +262,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ ContainerlabDebug: clabernetesutil.ToPointer(true), @@ -323,7 +323,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ LauncherLogLevel: "debug", @@ -384,7 +384,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, ImagePull: clabernetesapisv1alpha1.ImagePull{ InsecureRegistries: []string{"1.2.3.4", "potato.com"}, @@ -445,7 +445,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, ImagePull: clabernetesapisv1alpha1.ImagePull{ DockerDaemonConfig: "sneakydockerdaemonconfig", @@ -506,7 +506,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, ImagePull: clabernetesapisv1alpha1.ImagePull{ DockerConfig: "sneakydockerconfig", @@ -552,7 +552,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ Scheduling: clabernetesapisv1alpha1.Scheduling{ @@ -608,7 +608,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivitySlurpeeth, Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- @@ -621,7 +621,7 @@ func TestRenderDeployment(t *testing.T) { `, }, }, - Status: clabernetesapisv1alpha1.TopologyStatus{ + Status: &clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), @@ -654,7 +654,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ ContainerlabVersion: "0.51.1", }, @@ -669,7 +669,7 @@ func TestRenderDeployment(t *testing.T) { `, }, }, - Status: clabernetesapisv1alpha1.TopologyStatus{ + Status: &clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), diff --git a/controllers/topology/persistentvolumeclaim_test.go b/controllers/topology/persistentvolumeclaim_test.go index 13c0286..584422d 100644 --- a/controllers/topology/persistentvolumeclaim_test.go +++ b/controllers/topology/persistentvolumeclaim_test.go @@ -36,7 +36,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { ownedPVCs: &k8scorev1.PersistentVolumeClaimList{}, clabernetesConfigs: nil, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -65,7 +65,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { }, clabernetesConfigs: nil, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -94,7 +94,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { "node2": nil, }, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -126,7 +126,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { "node2": nil, }, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: false, @@ -203,7 +203,7 @@ func TestRenderPersistentVolumeClaim(t *testing.T) { Name: "pvc-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -223,7 +223,7 @@ func TestRenderPersistentVolumeClaim(t *testing.T) { Name: "pvc-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -244,7 +244,7 @@ func TestRenderPersistentVolumeClaim(t *testing.T) { Name: "pvc-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, diff --git a/controllers/topology/reconcile.go b/controllers/topology/reconcile.go index befad70..1afe176 100644 --- a/controllers/topology/reconcile.go +++ b/controllers/topology/reconcile.go @@ -74,7 +74,7 @@ func (c *Controller) Reconcile( if reconcileData.ShouldUpdateResource { // we should update because config hash or something changed, so snag the updated status // data out of the reconcile data, put it in the resource, and push the update - err = reconcileData.SetStatus(&topology.Status) + err = reconcileData.SetStatus(topology.Status) if err != nil { c.BaseController.Log.Criticalf( "failed setting object '%s/%s' status, error: %s", diff --git a/controllers/topology/resolve_test.go b/controllers/topology/resolve_test.go index 97231b4..477ba6a 100644 --- a/controllers/topology/resolve_test.go +++ b/controllers/topology/resolve_test.go @@ -208,7 +208,7 @@ func TestReconcileResolvePVC(t *testing.T) { Name: owningTopologyName, Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: false, @@ -239,7 +239,7 @@ func TestReconcileResolvePVC(t *testing.T) { Name: owningTopologyName, Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -270,7 +270,7 @@ func TestReconcileResolvePVC(t *testing.T) { Name: owningTopologyName, Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: false, diff --git a/controllers/topology/rolebinding_test.go b/controllers/topology/rolebinding_test.go index 92fe755..c748d7f 100644 --- a/controllers/topology/rolebinding_test.go +++ b/controllers/topology/rolebinding_test.go @@ -30,7 +30,7 @@ func TestRenderRoleBinding(t *testing.T) { Name: "render-rolebinding-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -51,7 +51,7 @@ func TestRenderRoleBinding(t *testing.T) { Name: "render-serviceaccount-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test diff --git a/controllers/topology/serviceaccount_test.go b/controllers/topology/serviceaccount_test.go index 962d5c3..c897f72 100644 --- a/controllers/topology/serviceaccount_test.go +++ b/controllers/topology/serviceaccount_test.go @@ -29,7 +29,7 @@ func TestRenderServiceAccount(t *testing.T) { Name: "render-serviceaccount-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -50,7 +50,7 @@ func TestRenderServiceAccount(t *testing.T) { Name: "render-serviceaccount-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test diff --git a/controllers/topology/serviceexpose_test.go b/controllers/topology/serviceexpose_test.go index bae0797..93f4ffd 100644 --- a/controllers/topology/serviceexpose_test.go +++ b/controllers/topology/serviceexpose_test.go @@ -38,7 +38,7 @@ func TestResolveServiceExpose(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -67,7 +67,7 @@ func TestResolveServiceExpose(t *testing.T) { Name: "resolve-servicefabric-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -108,7 +108,7 @@ func TestResolveServiceExpose(t *testing.T) { Name: "resolve-servicefabric-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -192,7 +192,7 @@ func TestRenderServiceExpose(t *testing.T) { Name: "render-service-expose-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -252,7 +252,7 @@ func TestRenderServiceExpose(t *testing.T) { Name: "render-service-expose-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -264,7 +264,7 @@ func TestRenderServiceExpose(t *testing.T) { `, }, }, - Status: clabernetesapisv1alpha1.TopologyStatus{ + Status: &clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), diff --git a/controllers/topology/servicefabric_test.go b/controllers/topology/servicefabric_test.go index 0bd74cc..03ab381 100644 --- a/controllers/topology/servicefabric_test.go +++ b/controllers/topology/servicefabric_test.go @@ -135,7 +135,7 @@ func TestRenderServiceFabric(t *testing.T) { Name: "render-service-fabric-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -157,7 +157,7 @@ func TestRenderServiceFabric(t *testing.T) { Name: "render-service-fabric-test", Namespace: "clabernetes", }, - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -169,7 +169,7 @@ func TestRenderServiceFabric(t *testing.T) { `, }, }, - Status: clabernetesapisv1alpha1.TopologyStatus{ + Status: &clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), diff --git a/controllers/topology/util_test.go b/controllers/topology/util_test.go index 68679f1..b492f8f 100644 --- a/controllers/topology/util_test.go +++ b/controllers/topology/util_test.go @@ -23,7 +23,7 @@ func TestGetTopologyKind(t *testing.T) { { name: "containerlab", in: &clabernetesapisv1alpha1.Topology{ - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: "something", }, @@ -34,7 +34,7 @@ func TestGetTopologyKind(t *testing.T) { { name: "kne", in: &clabernetesapisv1alpha1.Topology{ - Spec: clabernetesapisv1alpha1.TopologySpec{ + Spec: &clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Kne: "something", }, From ed3b2cd89ee573f048520b76969a5372f9edca81 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Fri, 14 Jun 2024 14:27:19 +0200 Subject: [PATCH 15/22] change specsFile to topoSpecFile --- clabverter/clabverter.go | 18 +++++++++--------- cmd/clabverter/cli/entrypoint.go | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 7a36684..bf1d0f0 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -29,7 +29,7 @@ const ( // MustNewClabverter returns an instance of Clabverter or panics. func MustNewClabverter( topologyFile, - topologySpecFile, + topoSpecFile, outputDirectory, destinationNamespace, naming, @@ -93,7 +93,7 @@ func MustNewClabverter( return &Clabverter{ logger: clabverterLogger, topologyFile: topologyFile, - topologySpecFile: topologySpecFile, + topoSpecFile: topoSpecFile, githubToken: githubToken, outputDirectory: outputDirectory, stdout: stdout, @@ -131,8 +131,8 @@ type Clabverter struct { topologyPathParent string isRemotePath bool - topologySpecFile string - topologySpecFilePath string + topoSpecFile string + topoSpecFilePath string githubGroup string githubRepo string @@ -313,8 +313,8 @@ func (c *Clabverter) load() error { c.topologyPathParent = filepath.Dir(c.topologyPath) } - if c.topologySpecFile != "" { - c.topologySpecFilePath, err = filepath.Abs(c.topologySpecFile) + if c.topoSpecFile != "" { + c.topoSpecFilePath, err = filepath.Abs(c.topoSpecFile) if err != nil { c.logger.Criticalf("failed determining absolute path of values file, error: %s", err) @@ -323,7 +323,7 @@ func (c *Clabverter) load() error { } c.logger.Debugf( - "determined fully qualified topology spec values file path as: %s", c.topologySpecFilePath, + "determined fully qualified topology spec values file path as: %s", c.topoSpecFilePath, ) c.logger.Debug("attempting to load containerlab topology....") @@ -520,11 +520,11 @@ func (c *Clabverter) handleManifest() error { func (c *Clabverter) mergeConfigSpecWithRenderedTopology( renderedTopologySpecBytes []byte, ) ([]byte, error) { - if c.topologySpecFilePath == "" { + if c.topoSpecFilePath == "" { return renderedTopologySpecBytes, nil } - content, err := os.ReadFile(c.topologySpecFilePath) + content, err := os.ReadFile(c.topoSpecFilePath) if err != nil { return nil, err } diff --git a/cmd/clabverter/cli/entrypoint.go b/cmd/clabverter/cli/entrypoint.go index 7843036..d70cb85 100644 --- a/cmd/clabverter/cli/entrypoint.go +++ b/cmd/clabverter/cli/entrypoint.go @@ -9,7 +9,7 @@ import ( const ( topologyFile = "topologyFile" - specsFile = "specsFile" + topoSpecFile = "topoSpecFile" outputDirectory = "outputDirectory" destinationNamespace = "destinationNamespace" insecureRegistries = "insecureRegistries" @@ -39,7 +39,7 @@ func Entrypoint() *cli.App { Value: "", }, &cli.StringFlag{ - Name: specsFile, + Name: topoSpecFile, Usage: "set the values file to parse that will be included in the topology" + " manifest spec", Required: false, @@ -110,7 +110,7 @@ func Entrypoint() *cli.App { Action: func(c *cli.Context) error { err := clabernetesclabverter.MustNewClabverter( c.String(topologyFile), - c.String(specsFile), + c.String(topoSpecFile), c.String(outputDirectory), c.String(destinationNamespace), c.String(naming), From 7f12602e5157587b1bf2d049868045bafc0d19c3 Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Sat, 15 Jun 2024 06:59:14 -0700 Subject: [PATCH 16/22] revert to pre omitempty/status pointer setup This reverts commit b1ea797985d6e0fc68b97bdddf7a8e67d53f75b4. --- apis/v1alpha1/topology.go | 10 ++--- apis/v1alpha1/topologyspec.go | 6 +-- apis/v1alpha1/zz_generated.deepcopy.go | 4 +- clabverter/assets/topology.yaml.template | 1 + clabverter/clabverter.go | 39 +++++++++---------- clabverter/clabverter_test.go | 12 +++--- .../test-fixtures/clabversiontest/specs.yaml | 6 +-- .../simple-no-explicit-namespace/topo01.yaml | 15 ++++++- .../test-fixtures/golden/simple/topo01.yaml | 18 ++++++++- cmd/clabverter/cli/entrypoint.go | 6 +-- controllers/topology/connectivity_test.go | 4 +- controllers/topology/definition_test.go | 12 +++--- controllers/topology/deployment_test.go | 24 ++++++------ .../topology/persistentvolumeclaim_test.go | 14 +++---- controllers/topology/reconcile.go | 2 +- controllers/topology/resolve_test.go | 6 +-- controllers/topology/rolebinding_test.go | 4 +- controllers/topology/serviceaccount_test.go | 4 +- controllers/topology/serviceexpose_test.go | 12 +++--- controllers/topology/servicefabric_test.go | 6 +-- controllers/topology/util_test.go | 4 +- 21 files changed, 115 insertions(+), 94 deletions(-) diff --git a/apis/v1alpha1/topology.go b/apis/v1alpha1/topology.go index 834568e..ec9f6dd 100644 --- a/apis/v1alpha1/topology.go +++ b/apis/v1alpha1/topology.go @@ -18,8 +18,8 @@ type Topology struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - Spec *TopologySpec `json:"spec,omitempty"` - Status *TopologyStatus `json:"status,omitempty"` + Spec TopologySpec `json:"spec,omitempty"` + Status TopologyStatus `json:"status,omitempty"` } // TopologySpec is the spec for a Topology resource. @@ -44,7 +44,7 @@ type TopologySpec struct { // ImagePull holds configurations relevant to how clabernetes launcher pods handle pulling // images. // +optional - ImagePull ImagePull `json:"imagePull,omitempty"` + ImagePull ImagePull `json:"imagePull"` // Naming tells the clabernetes controller how it should name resources it creates -- that is // whether it should include the containerlab topology name as a prefix on resources spawned // from this Topology or not; this includes the actual (containerlab) node Deployment(s), as @@ -60,14 +60,14 @@ type TopologySpec struct { // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="naming field is immutable, to change this value delete and re-create the Topology" // +kubebuilder:validation:Enum=prefixed;non-prefixed;global // +kubebuilder:default=global - Naming string `json:"naming,omitempty"` + Naming string `json:"naming"` // Connectivity defines the type of connectivity to use between nodes in the topology. The // default behavior is to use vxlan tunnels, alternatively you can enable a more experimental // "slurpeeth" connectivity flavor that stuffs traffic into tcp tunnels to avoid any vxlan mtu // and/or fragmentation challenges. // +kubebuilder:validation:Enum=vxlan;slurpeeth // +kubebuilder:default=vxlan - Connectivity string `json:"connectivity,omitempty"` + Connectivity string `json:"connectivity"` } // TopologyStatus is the status for a Topology resource. diff --git a/apis/v1alpha1/topologyspec.go b/apis/v1alpha1/topologyspec.go index a2859a9..48fef5d 100644 --- a/apis/v1alpha1/topologyspec.go +++ b/apis/v1alpha1/topologyspec.go @@ -72,7 +72,7 @@ type Expose struct { // DisableExpose indicates if exposing nodes via LoadBalancer service should be disabled, by // default any mapped ports in a containerlab topology will be exposed. // +optional - DisableExpose bool `json:"disableExpose,omitempty"` + DisableExpose bool `json:"disableExpose"` // DisableAutoExpose disables the automagic exposing of ports for a given topology. When this // setting is disabled clabernetes will not auto add ports so if you want to expose (via a // load balancer service) you will need to have ports outlined in your containerlab config @@ -132,7 +132,7 @@ type Deployment struct { // the configmap is mounted in its entirety (like normal k8s things), so you *probably* want // to specify the sub path unless you are sure what you're doing! // +optional - FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap,omitempty"` + FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap"` // FilesFromURL is a mapping of FileFromURL that define a URL at which to fetch a file, and path // on a launcher node that the file should be downloaded to. This is useful for configs that are // larger than the ConfigMap (etcd) 1Mb size limit. @@ -273,7 +273,7 @@ type ImagePull struct { // InsecureRegistries is a slice of strings of insecure registries to configure in the launcher // pods. // +optional - InsecureRegistries InsecureRegistries `json:"insecureRegistries,omitempty"` + InsecureRegistries InsecureRegistries `json:"insecureRegistries"` // PullThroughOverride allows for overriding the image pull through mode for this // particular topology. // +kubebuilder:validation:Enum=auto;always;never diff --git a/apis/v1alpha1/zz_generated.deepcopy.go b/apis/v1alpha1/zz_generated.deepcopy.go index 4cd09cf..bb533a2 100644 --- a/apis/v1alpha1/zz_generated.deepcopy.go +++ b/apis/v1alpha1/zz_generated.deepcopy.go @@ -821,8 +821,8 @@ func (in *Topology) DeepCopyInto(out *Topology) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(out.Spec) - in.Status.DeepCopyInto(out.Status) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) return } diff --git a/clabverter/assets/topology.yaml.template b/clabverter/assets/topology.yaml.template index 0916521..86b9618 100644 --- a/clabverter/assets/topology.yaml.template +++ b/clabverter/assets/topology.yaml.template @@ -55,6 +55,7 @@ spec: {{- if .Naming }} naming: {{ .Naming }} {{- end }} + connectivity: vxlan definition: containerlab: |- {{- .ClabConfig }} \ No newline at end of file diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index bf1d0f0..704ccb5 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -29,7 +29,7 @@ const ( // MustNewClabverter returns an instance of Clabverter or panics. func MustNewClabverter( topologyFile, - topoSpecFile, + topologySpecFile, outputDirectory, destinationNamespace, naming, @@ -93,7 +93,7 @@ func MustNewClabverter( return &Clabverter{ logger: clabverterLogger, topologyFile: topologyFile, - topoSpecFile: topoSpecFile, + topologySpecFile: topologySpecFile, githubToken: githubToken, outputDirectory: outputDirectory, stdout: stdout, @@ -131,8 +131,8 @@ type Clabverter struct { topologyPathParent string isRemotePath bool - topoSpecFile string - topoSpecFilePath string + topologySpecFile string + topologySpecFilePath string githubGroup string githubRepo string @@ -313,8 +313,8 @@ func (c *Clabverter) load() error { c.topologyPathParent = filepath.Dir(c.topologyPath) } - if c.topoSpecFile != "" { - c.topoSpecFilePath, err = filepath.Abs(c.topoSpecFile) + if c.topologySpecFile != "" { + c.topologySpecFilePath, err = filepath.Abs(c.topologySpecFile) if err != nil { c.logger.Criticalf("failed determining absolute path of values file, error: %s", err) @@ -323,7 +323,7 @@ func (c *Clabverter) load() error { } c.logger.Debugf( - "determined fully qualified topology spec values file path as: %s", c.topoSpecFilePath, + "determined fully qualified topology spec values file path as: %s", c.topologySpecFilePath, ) c.logger.Debug("attempting to load containerlab topology....") @@ -520,39 +520,39 @@ func (c *Clabverter) handleManifest() error { func (c *Clabverter) mergeConfigSpecWithRenderedTopology( renderedTopologySpecBytes []byte, ) ([]byte, error) { - if c.topoSpecFilePath == "" { + finalTopology := &clabernetesapisv1alpha1.Topology{} + + if c.topologySpecFilePath == "" { return renderedTopologySpecBytes, nil } - content, err := os.ReadFile(c.topoSpecFilePath) + content, err := os.ReadFile(c.topologySpecFilePath) if err != nil { return nil, err } - topologySpecFromTopoSpecsFile := &clabernetesapisv1alpha1.TopologySpec{} + topologySpecFromSpecsFile := &clabernetesapisv1alpha1.TopologySpec{} - err = sigsyaml.Unmarshal(content, topologySpecFromTopoSpecsFile) + err = sigsyaml.Unmarshal(content, topologySpecFromSpecsFile) if err != nil { return nil, err } - topologyFromTopoSpecsFile := &clabernetesapisv1alpha1.Topology{ - Spec: topologySpecFromTopoSpecsFile, + topologyFromSpecsFile := &clabernetesapisv1alpha1.Topology{ + Spec: *topologySpecFromSpecsFile, } - topologyFromTopoSpecsFileBytes, err := sigsyaml.Marshal(topologyFromTopoSpecsFile) + topologyFromSpecsFileBytes, err := sigsyaml.Marshal(topologyFromSpecsFile) if err != nil { return nil, err } - finalTopology := &clabernetesapisv1alpha1.Topology{} - - err = sigsyaml.UnmarshalStrict(topologyFromTopoSpecsFileBytes, finalTopology) + err = sigsyaml.Unmarshal(topologyFromSpecsFileBytes, finalTopology) if err != nil { return nil, err } - err = sigsyaml.UnmarshalStrict(renderedTopologySpecBytes, finalTopology) + err = sigsyaml.Unmarshal(renderedTopologySpecBytes, finalTopology) if err != nil { return nil, err } @@ -562,9 +562,6 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } - // add yaml start document chars - finalTopologyBytes = append([]byte("---\n"), finalTopologyBytes...) - return finalTopologyBytes, nil } diff --git a/clabverter/clabverter_test.go b/clabverter/clabverter_test.go index 48522e2..5694a6c 100644 --- a/clabverter/clabverter_test.go +++ b/clabverter/clabverter_test.go @@ -22,7 +22,7 @@ func TestClabvert(t *testing.T) { cases := []struct { name string topologyFile string - topoSpecsFile string + specsFile string destinationNamespace string insecureRegistries string imagePullSecrets string @@ -33,19 +33,19 @@ func TestClabvert(t *testing.T) { { name: "simple", topologyFile: "test-fixtures/clabversiontest/clab.yaml", - topoSpecsFile: "", + specsFile: "", destinationNamespace: "notclabernetes", insecureRegistries: "1.2.3.4", - imagePullSecrets: "regcred", + imagePullSecrets: "", naming: "prefixed", containerlabVersion: "", }, { name: "simple-no-explicit-namespace", topologyFile: "test-fixtures/clabversiontest/clab.yaml", - topoSpecsFile: "test-fixtures/clabversiontest/specs.yaml", + specsFile: "test-fixtures/clabversiontest/specs.yaml", insecureRegistries: "1.2.3.4", - imagePullSecrets: "", + imagePullSecrets: "regcred", disableExpose: true, naming: "non-prefixed", containerlabVersion: "0.51.0", @@ -90,7 +90,7 @@ func TestClabvert(t *testing.T) { clabverter := clabernetesclabverter.MustNewClabverter( testCase.topologyFile, - testCase.topoSpecsFile, + testCase.specsFile, actualDir, testCase.destinationNamespace, testCase.naming, diff --git a/clabverter/test-fixtures/clabversiontest/specs.yaml b/clabverter/test-fixtures/clabversiontest/specs.yaml index ba8a088..9182165 100644 --- a/clabverter/test-fixtures/clabversiontest/specs.yaml +++ b/clabverter/test-fixtures/clabversiontest/specs.yaml @@ -1,12 +1,8 @@ --- -connectivity: slurpeeth -imagePull: - pullSecrets: - - regcred statusProbes: enabled: true excludedNodes: - baguette probeConfiguration: tcpProbeConfiguration: - port: 22 \ No newline at end of file + port: 22 diff --git a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml index 7907b60..28248af 100755 --- a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml @@ -5,7 +5,7 @@ metadata: name: topo01 namespace: c9s-topo01 spec: - connectivity: slurpeeth + connectivity: vxlan definition: containerlab: |- name: topo01 @@ -104,3 +104,16 @@ spec: startupSeconds: 0 tcpProbeConfiguration: port: 22 +status: + conditions: null + configs: null + exposedPorts: null + kind: "" + nodeReadiness: null + reconcileHashes: + config: "" + exposedPorts: "" + filesFromURL: null + imagePullSecrets: "" + removeTopologyPrefix: null + topologyReady: false diff --git a/clabverter/test-fixtures/golden/simple/topo01.yaml b/clabverter/test-fixtures/golden/simple/topo01.yaml index 0ddce5d..0c97667 100755 --- a/clabverter/test-fixtures/golden/simple/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple/topo01.yaml @@ -5,6 +5,7 @@ metadata: name: topo01 namespace: notclabernetes spec: + connectivity: vxlan definition: containerlab: |- name: topo01 @@ -86,11 +87,11 @@ spec: tolerations: null expose: disableAutoExpose: false + disableExpose: false imagePull: insecureRegistries: - 1.2.3.4 - pullSecrets: - - regcred + pullSecrets: null naming: prefixed statusProbes: enabled: false @@ -98,3 +99,16 @@ spec: nodeProbeConfigurations: null probeConfiguration: startupSeconds: 0 +status: + conditions: null + configs: null + exposedPorts: null + kind: "" + nodeReadiness: null + reconcileHashes: + config: "" + exposedPorts: "" + filesFromURL: null + imagePullSecrets: "" + removeTopologyPrefix: null + topologyReady: false diff --git a/cmd/clabverter/cli/entrypoint.go b/cmd/clabverter/cli/entrypoint.go index d70cb85..7843036 100644 --- a/cmd/clabverter/cli/entrypoint.go +++ b/cmd/clabverter/cli/entrypoint.go @@ -9,7 +9,7 @@ import ( const ( topologyFile = "topologyFile" - topoSpecFile = "topoSpecFile" + specsFile = "specsFile" outputDirectory = "outputDirectory" destinationNamespace = "destinationNamespace" insecureRegistries = "insecureRegistries" @@ -39,7 +39,7 @@ func Entrypoint() *cli.App { Value: "", }, &cli.StringFlag{ - Name: topoSpecFile, + Name: specsFile, Usage: "set the values file to parse that will be included in the topology" + " manifest spec", Required: false, @@ -110,7 +110,7 @@ func Entrypoint() *cli.App { Action: func(c *cli.Context) error { err := clabernetesclabverter.MustNewClabverter( c.String(topologyFile), - c.String(topoSpecFile), + c.String(specsFile), c.String(outputDirectory), c.String(destinationNamespace), c.String(naming), diff --git a/controllers/topology/connectivity_test.go b/controllers/topology/connectivity_test.go index 25bed61..bfbca1b 100644 --- a/controllers/topology/connectivity_test.go +++ b/controllers/topology/connectivity_test.go @@ -28,7 +28,7 @@ func TestRenderConnectivity(t *testing.T) { Name: "render-rolebinding-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -49,7 +49,7 @@ func TestRenderConnectivity(t *testing.T) { Name: "render-rolebinding-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test diff --git a/controllers/topology/definition_test.go b/controllers/topology/definition_test.go index 3703d7f..a806ff0 100644 --- a/controllers/topology/definition_test.go +++ b/controllers/topology/definition_test.go @@ -31,7 +31,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-containerlab-definition-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -70,7 +70,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-containerlab-definition-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -87,7 +87,7 @@ func TestDefinitionProcess(t *testing.T) { `, }, }, - Status: &clabernetesapisv1alpha1.TopologyStatus{ + Status: clabernetesapisv1alpha1.TopologyStatus{ RemoveTopologyPrefix: clabernetesutil.ToPointer(true), }, }, @@ -113,7 +113,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-kne-definition-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Kne: ` name: "2-srl-ixr6" nodes: { @@ -177,7 +177,7 @@ func TestDefinitionProcess(t *testing.T) { Name: "process-kne-definition-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Kne: ` name: "2-srl-ixr6" nodes: { @@ -219,7 +219,7 @@ func TestDefinitionProcess(t *testing.T) { `, }, }, - Status: &clabernetesapisv1alpha1.TopologyStatus{ + Status: clabernetesapisv1alpha1.TopologyStatus{ RemoveTopologyPrefix: clabernetesutil.ToPointer(true), }, }, diff --git a/controllers/topology/deployment_test.go b/controllers/topology/deployment_test.go index 0b4a362..07b88dd 100644 --- a/controllers/topology/deployment_test.go +++ b/controllers/topology/deployment_test.go @@ -143,7 +143,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- @@ -201,7 +201,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ PrivilegedLauncher: clabernetesutil.ToPointer(false), @@ -262,7 +262,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ ContainerlabDebug: clabernetesutil.ToPointer(true), @@ -323,7 +323,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ LauncherLogLevel: "debug", @@ -384,7 +384,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, ImagePull: clabernetesapisv1alpha1.ImagePull{ InsecureRegistries: []string{"1.2.3.4", "potato.com"}, @@ -445,7 +445,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, ImagePull: clabernetesapisv1alpha1.ImagePull{ DockerDaemonConfig: "sneakydockerdaemonconfig", @@ -506,7 +506,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, ImagePull: clabernetesapisv1alpha1.ImagePull{ DockerConfig: "sneakydockerconfig", @@ -552,7 +552,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivityVXLAN, Deployment: clabernetesapisv1alpha1.Deployment{ Scheduling: clabernetesapisv1alpha1.Scheduling{ @@ -608,7 +608,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Connectivity: clabernetesconstants.ConnectivitySlurpeeth, Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- @@ -621,7 +621,7 @@ func TestRenderDeployment(t *testing.T) { `, }, }, - Status: &clabernetesapisv1alpha1.TopologyStatus{ + Status: clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), @@ -654,7 +654,7 @@ func TestRenderDeployment(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ ContainerlabVersion: "0.51.1", }, @@ -669,7 +669,7 @@ func TestRenderDeployment(t *testing.T) { `, }, }, - Status: &clabernetesapisv1alpha1.TopologyStatus{ + Status: clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), diff --git a/controllers/topology/persistentvolumeclaim_test.go b/controllers/topology/persistentvolumeclaim_test.go index 584422d..13c0286 100644 --- a/controllers/topology/persistentvolumeclaim_test.go +++ b/controllers/topology/persistentvolumeclaim_test.go @@ -36,7 +36,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { ownedPVCs: &k8scorev1.PersistentVolumeClaimList{}, clabernetesConfigs: nil, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -65,7 +65,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { }, clabernetesConfigs: nil, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -94,7 +94,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { "node2": nil, }, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -126,7 +126,7 @@ func TestResolvePersistentVolumeClaim(t *testing.T) { "node2": nil, }, owningTopology: &clabernetesapisv1alpha1.Topology{ - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: false, @@ -203,7 +203,7 @@ func TestRenderPersistentVolumeClaim(t *testing.T) { Name: "pvc-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -223,7 +223,7 @@ func TestRenderPersistentVolumeClaim(t *testing.T) { Name: "pvc-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -244,7 +244,7 @@ func TestRenderPersistentVolumeClaim(t *testing.T) { Name: "pvc-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, diff --git a/controllers/topology/reconcile.go b/controllers/topology/reconcile.go index 1afe176..befad70 100644 --- a/controllers/topology/reconcile.go +++ b/controllers/topology/reconcile.go @@ -74,7 +74,7 @@ func (c *Controller) Reconcile( if reconcileData.ShouldUpdateResource { // we should update because config hash or something changed, so snag the updated status // data out of the reconcile data, put it in the resource, and push the update - err = reconcileData.SetStatus(topology.Status) + err = reconcileData.SetStatus(&topology.Status) if err != nil { c.BaseController.Log.Criticalf( "failed setting object '%s/%s' status, error: %s", diff --git a/controllers/topology/resolve_test.go b/controllers/topology/resolve_test.go index 477ba6a..97231b4 100644 --- a/controllers/topology/resolve_test.go +++ b/controllers/topology/resolve_test.go @@ -208,7 +208,7 @@ func TestReconcileResolvePVC(t *testing.T) { Name: owningTopologyName, Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: false, @@ -239,7 +239,7 @@ func TestReconcileResolvePVC(t *testing.T) { Name: owningTopologyName, Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: true, @@ -270,7 +270,7 @@ func TestReconcileResolvePVC(t *testing.T) { Name: owningTopologyName, Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Deployment: clabernetesapisv1alpha1.Deployment{ Persistence: clabernetesapisv1alpha1.Persistence{ Enabled: false, diff --git a/controllers/topology/rolebinding_test.go b/controllers/topology/rolebinding_test.go index c748d7f..92fe755 100644 --- a/controllers/topology/rolebinding_test.go +++ b/controllers/topology/rolebinding_test.go @@ -30,7 +30,7 @@ func TestRenderRoleBinding(t *testing.T) { Name: "render-rolebinding-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -51,7 +51,7 @@ func TestRenderRoleBinding(t *testing.T) { Name: "render-serviceaccount-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test diff --git a/controllers/topology/serviceaccount_test.go b/controllers/topology/serviceaccount_test.go index c897f72..962d5c3 100644 --- a/controllers/topology/serviceaccount_test.go +++ b/controllers/topology/serviceaccount_test.go @@ -29,7 +29,7 @@ func TestRenderServiceAccount(t *testing.T) { Name: "render-serviceaccount-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -50,7 +50,7 @@ func TestRenderServiceAccount(t *testing.T) { Name: "render-serviceaccount-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test diff --git a/controllers/topology/serviceexpose_test.go b/controllers/topology/serviceexpose_test.go index 93f4ffd..bae0797 100644 --- a/controllers/topology/serviceexpose_test.go +++ b/controllers/topology/serviceexpose_test.go @@ -38,7 +38,7 @@ func TestResolveServiceExpose(t *testing.T) { Name: "render-deployment-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -67,7 +67,7 @@ func TestResolveServiceExpose(t *testing.T) { Name: "resolve-servicefabric-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -108,7 +108,7 @@ func TestResolveServiceExpose(t *testing.T) { Name: "resolve-servicefabric-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -192,7 +192,7 @@ func TestRenderServiceExpose(t *testing.T) { Name: "render-service-expose-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -252,7 +252,7 @@ func TestRenderServiceExpose(t *testing.T) { Name: "render-service-expose-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -264,7 +264,7 @@ func TestRenderServiceExpose(t *testing.T) { `, }, }, - Status: &clabernetesapisv1alpha1.TopologyStatus{ + Status: clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), diff --git a/controllers/topology/servicefabric_test.go b/controllers/topology/servicefabric_test.go index 03ab381..0bd74cc 100644 --- a/controllers/topology/servicefabric_test.go +++ b/controllers/topology/servicefabric_test.go @@ -135,7 +135,7 @@ func TestRenderServiceFabric(t *testing.T) { Name: "render-service-fabric-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -157,7 +157,7 @@ func TestRenderServiceFabric(t *testing.T) { Name: "render-service-fabric-test", Namespace: "clabernetes", }, - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: `--- name: test @@ -169,7 +169,7 @@ func TestRenderServiceFabric(t *testing.T) { `, }, }, - Status: &clabernetesapisv1alpha1.TopologyStatus{ + Status: clabernetesapisv1alpha1.TopologyStatus{ // to set naming for test purposes we need to update the *status* of the topo // since this is done very early in the rec RemoveTopologyPrefix: clabernetesutil.ToPointer(true), diff --git a/controllers/topology/util_test.go b/controllers/topology/util_test.go index b492f8f..68679f1 100644 --- a/controllers/topology/util_test.go +++ b/controllers/topology/util_test.go @@ -23,7 +23,7 @@ func TestGetTopologyKind(t *testing.T) { { name: "containerlab", in: &clabernetesapisv1alpha1.Topology{ - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Containerlab: "something", }, @@ -34,7 +34,7 @@ func TestGetTopologyKind(t *testing.T) { { name: "kne", in: &clabernetesapisv1alpha1.Topology{ - Spec: &clabernetesapisv1alpha1.TopologySpec{ + Spec: clabernetesapisv1alpha1.TopologySpec{ Definition: clabernetesapisv1alpha1.Definition{ Kne: "something", }, From 9d995586bbf9ab5b163f08adcbdb7ed6820222c4 Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Sat, 15 Jun 2024 08:22:58 -0700 Subject: [PATCH 17/22] refactor: new type for statusless topo for clabversion purposes --- clabverter/assets/topology-clab.yaml.template | 3 --- clabverter/clabverter.go | 14 ++++++++++++-- clabverter/clabverter_test.go | 3 +-- .../simple-no-explicit-namespace/topo01.yaml | 13 ------------- clabverter/test-fixtures/golden/simple/topo01.yaml | 13 ------------- 5 files changed, 13 insertions(+), 33 deletions(-) delete mode 100644 clabverter/assets/topology-clab.yaml.template diff --git a/clabverter/assets/topology-clab.yaml.template b/clabverter/assets/topology-clab.yaml.template deleted file mode 100644 index 5f722d1..0000000 --- a/clabverter/assets/topology-clab.yaml.template +++ /dev/null @@ -1,3 +0,0 @@ - definition: - containerlab: |- - {{- .ClabConfig }} diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 704ccb5..b1e7dc0 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -17,6 +17,7 @@ import ( clabernetesutil "github.com/srl-labs/clabernetes/util" clabernetesutilcontainerlab "github.com/srl-labs/clabernetes/util/containerlab" clabernetesutilkubernetes "github.com/srl-labs/clabernetes/util/kubernetes" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" sigsyaml "sigs.k8s.io/yaml" ) @@ -26,6 +27,15 @@ const ( maxBytesForConfigMap = 950_000 ) +// StatuslessTopology is the same as a "normal" Topology without the status field since this field +// should not be present in clabverter output. +type StatuslessTopology struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec clabernetesapisv1alpha1.TopologySpec `json:"spec,omitempty"` +} + // MustNewClabverter returns an instance of Clabverter or panics. func MustNewClabverter( topologyFile, @@ -520,7 +530,7 @@ func (c *Clabverter) handleManifest() error { func (c *Clabverter) mergeConfigSpecWithRenderedTopology( renderedTopologySpecBytes []byte, ) ([]byte, error) { - finalTopology := &clabernetesapisv1alpha1.Topology{} + finalTopology := &StatuslessTopology{} if c.topologySpecFilePath == "" { return renderedTopologySpecBytes, nil @@ -538,7 +548,7 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } - topologyFromSpecsFile := &clabernetesapisv1alpha1.Topology{ + topologyFromSpecsFile := &StatuslessTopology{ Spec: *topologySpecFromSpecsFile, } diff --git a/clabverter/clabverter_test.go b/clabverter/clabverter_test.go index 5694a6c..b0871c1 100644 --- a/clabverter/clabverter_test.go +++ b/clabverter/clabverter_test.go @@ -10,7 +10,6 @@ import ( "strings" "testing" - clabernetesapisv1alpha1 "github.com/srl-labs/clabernetes/apis/v1alpha1" clabernetesclabverter "github.com/srl-labs/clabernetes/clabverter" clabernetesconstants "github.com/srl-labs/clabernetes/constants" claberneteslogging "github.com/srl-labs/clabernetes/logging" @@ -197,7 +196,7 @@ func normalizeFromFileFilePaths(t *testing.T, b []byte) []byte { t.Fatalf("failed getting working dir, err: %s", err) } - topology := &clabernetesapisv1alpha1.Topology{} + topology := &clabernetesclabverter.StatuslessTopology{} err = yaml.Unmarshal(b, topology) if err != nil { diff --git a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml index 28248af..02f0759 100755 --- a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml @@ -104,16 +104,3 @@ spec: startupSeconds: 0 tcpProbeConfiguration: port: 22 -status: - conditions: null - configs: null - exposedPorts: null - kind: "" - nodeReadiness: null - reconcileHashes: - config: "" - exposedPorts: "" - filesFromURL: null - imagePullSecrets: "" - removeTopologyPrefix: null - topologyReady: false diff --git a/clabverter/test-fixtures/golden/simple/topo01.yaml b/clabverter/test-fixtures/golden/simple/topo01.yaml index 0c97667..395eae8 100755 --- a/clabverter/test-fixtures/golden/simple/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple/topo01.yaml @@ -99,16 +99,3 @@ spec: nodeProbeConfigurations: null probeConfiguration: startupSeconds: 0 -status: - conditions: null - configs: null - exposedPorts: null - kind: "" - nodeReadiness: null - reconcileHashes: - config: "" - exposedPorts: "" - filesFromURL: null - imagePullSecrets: "" - removeTopologyPrefix: null - topologyReady: false From 8d93f66deab096c78cb324a53b44d799db60624c Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Tue, 11 Jun 2024 17:13:46 +0200 Subject: [PATCH 18/22] first pass at overloading specsFile with cli opt values --- apis/v1alpha1/topology.go | 6 +++--- apis/v1alpha1/topologyspec.go | 6 +++--- clabverter/assets/topology.yaml.template | 1 - clabverter/clabverter.go | 15 +++++++++------ clabverter/clabverter_test.go | 12 ++++++------ .../test-fixtures/clabversiontest/specs.yaml | 6 +++++- .../simple-no-explicit-namespace/topo01.yaml | 2 +- .../test-fixtures/golden/simple/topo01.yaml | 5 ++--- 8 files changed, 29 insertions(+), 24 deletions(-) diff --git a/apis/v1alpha1/topology.go b/apis/v1alpha1/topology.go index ec9f6dd..af90c19 100644 --- a/apis/v1alpha1/topology.go +++ b/apis/v1alpha1/topology.go @@ -44,7 +44,7 @@ type TopologySpec struct { // ImagePull holds configurations relevant to how clabernetes launcher pods handle pulling // images. // +optional - ImagePull ImagePull `json:"imagePull"` + ImagePull ImagePull `json:"imagePull,omitempty"` // Naming tells the clabernetes controller how it should name resources it creates -- that is // whether it should include the containerlab topology name as a prefix on resources spawned // from this Topology or not; this includes the actual (containerlab) node Deployment(s), as @@ -60,14 +60,14 @@ type TopologySpec struct { // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="naming field is immutable, to change this value delete and re-create the Topology" // +kubebuilder:validation:Enum=prefixed;non-prefixed;global // +kubebuilder:default=global - Naming string `json:"naming"` + Naming string `json:"naming,omitempty"` // Connectivity defines the type of connectivity to use between nodes in the topology. The // default behavior is to use vxlan tunnels, alternatively you can enable a more experimental // "slurpeeth" connectivity flavor that stuffs traffic into tcp tunnels to avoid any vxlan mtu // and/or fragmentation challenges. // +kubebuilder:validation:Enum=vxlan;slurpeeth // +kubebuilder:default=vxlan - Connectivity string `json:"connectivity"` + Connectivity string `json:"connectivity,omitempty"` } // TopologyStatus is the status for a Topology resource. diff --git a/apis/v1alpha1/topologyspec.go b/apis/v1alpha1/topologyspec.go index 48fef5d..a2859a9 100644 --- a/apis/v1alpha1/topologyspec.go +++ b/apis/v1alpha1/topologyspec.go @@ -72,7 +72,7 @@ type Expose struct { // DisableExpose indicates if exposing nodes via LoadBalancer service should be disabled, by // default any mapped ports in a containerlab topology will be exposed. // +optional - DisableExpose bool `json:"disableExpose"` + DisableExpose bool `json:"disableExpose,omitempty"` // DisableAutoExpose disables the automagic exposing of ports for a given topology. When this // setting is disabled clabernetes will not auto add ports so if you want to expose (via a // load balancer service) you will need to have ports outlined in your containerlab config @@ -132,7 +132,7 @@ type Deployment struct { // the configmap is mounted in its entirety (like normal k8s things), so you *probably* want // to specify the sub path unless you are sure what you're doing! // +optional - FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap"` + FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap,omitempty"` // FilesFromURL is a mapping of FileFromURL that define a URL at which to fetch a file, and path // on a launcher node that the file should be downloaded to. This is useful for configs that are // larger than the ConfigMap (etcd) 1Mb size limit. @@ -273,7 +273,7 @@ type ImagePull struct { // InsecureRegistries is a slice of strings of insecure registries to configure in the launcher // pods. // +optional - InsecureRegistries InsecureRegistries `json:"insecureRegistries"` + InsecureRegistries InsecureRegistries `json:"insecureRegistries,omitempty"` // PullThroughOverride allows for overriding the image pull through mode for this // particular topology. // +kubebuilder:validation:Enum=auto;always;never diff --git a/clabverter/assets/topology.yaml.template b/clabverter/assets/topology.yaml.template index 86b9618..0916521 100644 --- a/clabverter/assets/topology.yaml.template +++ b/clabverter/assets/topology.yaml.template @@ -55,7 +55,6 @@ spec: {{- if .Naming }} naming: {{ .Naming }} {{- end }} - connectivity: vxlan definition: containerlab: |- {{- .ClabConfig }} \ No newline at end of file diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index b1e7dc0..13c6d1a 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -541,23 +541,23 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } - topologySpecFromSpecsFile := &clabernetesapisv1alpha1.TopologySpec{} + topologySpecFromTopoSpecsFile := &clabernetesapisv1alpha1.TopologySpec{} - err = sigsyaml.Unmarshal(content, topologySpecFromSpecsFile) + err = sigsyaml.Unmarshal(content, topologySpecFromTopoSpecsFile) if err != nil { return nil, err } - topologyFromSpecsFile := &StatuslessTopology{ - Spec: *topologySpecFromSpecsFile, + topologyFromTopoSpecsFile := &StatuslessTopology{ + Spec: *topologySpecFromTopoSpecsFile, } - topologyFromSpecsFileBytes, err := sigsyaml.Marshal(topologyFromSpecsFile) + topologyFromTopoSpecsFileBytes, err := sigsyaml.Marshal(topologyFromTopoSpecsFile) if err != nil { return nil, err } - err = sigsyaml.Unmarshal(topologyFromSpecsFileBytes, finalTopology) + err = sigsyaml.Unmarshal(topologyFromTopoSpecsFileBytes, finalTopology) if err != nil { return nil, err } @@ -572,6 +572,9 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } + // add yaml start document chars + finalTopologyBytes = append([]byte("---\n"), finalTopologyBytes...) + return finalTopologyBytes, nil } diff --git a/clabverter/clabverter_test.go b/clabverter/clabverter_test.go index b0871c1..9536a3b 100644 --- a/clabverter/clabverter_test.go +++ b/clabverter/clabverter_test.go @@ -21,7 +21,7 @@ func TestClabvert(t *testing.T) { cases := []struct { name string topologyFile string - specsFile string + topoSpecsFile string destinationNamespace string insecureRegistries string imagePullSecrets string @@ -32,19 +32,19 @@ func TestClabvert(t *testing.T) { { name: "simple", topologyFile: "test-fixtures/clabversiontest/clab.yaml", - specsFile: "", + topoSpecsFile: "", destinationNamespace: "notclabernetes", insecureRegistries: "1.2.3.4", - imagePullSecrets: "", + imagePullSecrets: "regcred", naming: "prefixed", containerlabVersion: "", }, { name: "simple-no-explicit-namespace", topologyFile: "test-fixtures/clabversiontest/clab.yaml", - specsFile: "test-fixtures/clabversiontest/specs.yaml", + topoSpecsFile: "test-fixtures/clabversiontest/specs.yaml", insecureRegistries: "1.2.3.4", - imagePullSecrets: "regcred", + imagePullSecrets: "", disableExpose: true, naming: "non-prefixed", containerlabVersion: "0.51.0", @@ -89,7 +89,7 @@ func TestClabvert(t *testing.T) { clabverter := clabernetesclabverter.MustNewClabverter( testCase.topologyFile, - testCase.specsFile, + testCase.topoSpecsFile, actualDir, testCase.destinationNamespace, testCase.naming, diff --git a/clabverter/test-fixtures/clabversiontest/specs.yaml b/clabverter/test-fixtures/clabversiontest/specs.yaml index 9182165..ba8a088 100644 --- a/clabverter/test-fixtures/clabversiontest/specs.yaml +++ b/clabverter/test-fixtures/clabversiontest/specs.yaml @@ -1,8 +1,12 @@ --- +connectivity: slurpeeth +imagePull: + pullSecrets: + - regcred statusProbes: enabled: true excludedNodes: - baguette probeConfiguration: tcpProbeConfiguration: - port: 22 + port: 22 \ No newline at end of file diff --git a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml index 02f0759..7907b60 100755 --- a/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple-no-explicit-namespace/topo01.yaml @@ -5,7 +5,7 @@ metadata: name: topo01 namespace: c9s-topo01 spec: - connectivity: vxlan + connectivity: slurpeeth definition: containerlab: |- name: topo01 diff --git a/clabverter/test-fixtures/golden/simple/topo01.yaml b/clabverter/test-fixtures/golden/simple/topo01.yaml index 395eae8..0ddce5d 100755 --- a/clabverter/test-fixtures/golden/simple/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple/topo01.yaml @@ -5,7 +5,6 @@ metadata: name: topo01 namespace: notclabernetes spec: - connectivity: vxlan definition: containerlab: |- name: topo01 @@ -87,11 +86,11 @@ spec: tolerations: null expose: disableAutoExpose: false - disableExpose: false imagePull: insecureRegistries: - 1.2.3.4 - pullSecrets: null + pullSecrets: + - regcred naming: prefixed statusProbes: enabled: false From f7aa55cbdfb0e501e1ca225b1505603b6e5850ea Mon Sep 17 00:00:00 2001 From: Carl Montanari Date: Sat, 15 Jun 2024 09:09:14 -0700 Subject: [PATCH 19/22] fix: conditions list type, revert omit empty things --- apis/v1alpha1/topology.go | 7 ++++--- apis/v1alpha1/topologyspec.go | 6 +++--- assets/crd/clabernetes.containerlab.dev_topologies.yaml | 1 + .../crds/clabernetes.containerlab.dev_topologies.yaml | 1 + clabverter/test-fixtures/golden/simple/topo01.yaml | 2 ++ generated/openapi/openapi_generated.go | 5 +++++ 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apis/v1alpha1/topology.go b/apis/v1alpha1/topology.go index af90c19..24a9e62 100644 --- a/apis/v1alpha1/topology.go +++ b/apis/v1alpha1/topology.go @@ -44,7 +44,7 @@ type TopologySpec struct { // ImagePull holds configurations relevant to how clabernetes launcher pods handle pulling // images. // +optional - ImagePull ImagePull `json:"imagePull,omitempty"` + ImagePull ImagePull `json:"imagePull"` // Naming tells the clabernetes controller how it should name resources it creates -- that is // whether it should include the containerlab topology name as a prefix on resources spawned // from this Topology or not; this includes the actual (containerlab) node Deployment(s), as @@ -60,14 +60,14 @@ type TopologySpec struct { // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="naming field is immutable, to change this value delete and re-create the Topology" // +kubebuilder:validation:Enum=prefixed;non-prefixed;global // +kubebuilder:default=global - Naming string `json:"naming,omitempty"` + Naming string `json:"naming"` // Connectivity defines the type of connectivity to use between nodes in the topology. The // default behavior is to use vxlan tunnels, alternatively you can enable a more experimental // "slurpeeth" connectivity flavor that stuffs traffic into tcp tunnels to avoid any vxlan mtu // and/or fragmentation challenges. // +kubebuilder:validation:Enum=vxlan;slurpeeth // +kubebuilder:default=vxlan - Connectivity string `json:"connectivity,omitempty"` + Connectivity string `json:"connectivity"` } // TopologyStatus is the status for a Topology resource. @@ -97,6 +97,7 @@ type TopologyStatus struct { // from the conditions so we can easily snag it for print columns! TopologyReady bool `json:"topologyReady"` // Conditions is a list of conditions for the topology custom resource. + // +listType=atomic Conditions []metav1.Condition `json:"conditions"` } diff --git a/apis/v1alpha1/topologyspec.go b/apis/v1alpha1/topologyspec.go index a2859a9..48fef5d 100644 --- a/apis/v1alpha1/topologyspec.go +++ b/apis/v1alpha1/topologyspec.go @@ -72,7 +72,7 @@ type Expose struct { // DisableExpose indicates if exposing nodes via LoadBalancer service should be disabled, by // default any mapped ports in a containerlab topology will be exposed. // +optional - DisableExpose bool `json:"disableExpose,omitempty"` + DisableExpose bool `json:"disableExpose"` // DisableAutoExpose disables the automagic exposing of ports for a given topology. When this // setting is disabled clabernetes will not auto add ports so if you want to expose (via a // load balancer service) you will need to have ports outlined in your containerlab config @@ -132,7 +132,7 @@ type Deployment struct { // the configmap is mounted in its entirety (like normal k8s things), so you *probably* want // to specify the sub path unless you are sure what you're doing! // +optional - FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap,omitempty"` + FilesFromConfigMap map[string][]FileFromConfigMap `json:"filesFromConfigMap"` // FilesFromURL is a mapping of FileFromURL that define a URL at which to fetch a file, and path // on a launcher node that the file should be downloaded to. This is useful for configs that are // larger than the ConfigMap (etcd) 1Mb size limit. @@ -273,7 +273,7 @@ type ImagePull struct { // InsecureRegistries is a slice of strings of insecure registries to configure in the launcher // pods. // +optional - InsecureRegistries InsecureRegistries `json:"insecureRegistries,omitempty"` + InsecureRegistries InsecureRegistries `json:"insecureRegistries"` // PullThroughOverride allows for overriding the image pull through mode for this // particular topology. // +kubebuilder:validation:Enum=auto;always;never diff --git a/assets/crd/clabernetes.containerlab.dev_topologies.yaml b/assets/crd/clabernetes.containerlab.dev_topologies.yaml index a04c69d..3610bd5 100644 --- a/assets/crd/clabernetes.containerlab.dev_topologies.yaml +++ b/assets/crd/clabernetes.containerlab.dev_topologies.yaml @@ -675,6 +675,7 @@ spec: - type type: object type: array + x-kubernetes-list-type: atomic configs: additionalProperties: type: string diff --git a/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml b/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml index a04c69d..3610bd5 100644 --- a/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml +++ b/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml @@ -675,6 +675,7 @@ spec: - type type: object type: array + x-kubernetes-list-type: atomic configs: additionalProperties: type: string diff --git a/clabverter/test-fixtures/golden/simple/topo01.yaml b/clabverter/test-fixtures/golden/simple/topo01.yaml index 0ddce5d..9f3c6b4 100755 --- a/clabverter/test-fixtures/golden/simple/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple/topo01.yaml @@ -5,6 +5,7 @@ metadata: name: topo01 namespace: notclabernetes spec: + connectivity: "" definition: containerlab: |- name: topo01 @@ -86,6 +87,7 @@ spec: tolerations: null expose: disableAutoExpose: false + disableExpose: false imagePull: insecureRegistries: - 1.2.3.4 diff --git a/generated/openapi/openapi_generated.go b/generated/openapi/openapi_generated.go index 1eab516..a8aef78 100644 --- a/generated/openapi/openapi_generated.go +++ b/generated/openapi/openapi_generated.go @@ -2007,6 +2007,11 @@ func schema_srl_labs_clabernetes_apis_v1alpha1_TopologyStatus( }, }, "conditions": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, SchemaProps: spec.SchemaProps{ Description: "Conditions is a list of conditions for the topology custom resource.", Type: []string{"array"}, From 35a645e246fa675bd716c6ccc5946bde767c8b12 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Sat, 15 Jun 2024 22:52:14 +0200 Subject: [PATCH 20/22] change specsFile to topoSpecFile --- clabverter/clabverter.go | 22 +++++++++++----------- cmd/clabverter/cli/entrypoint.go | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/clabverter/clabverter.go b/clabverter/clabverter.go index 13c6d1a..7ada038 100644 --- a/clabverter/clabverter.go +++ b/clabverter/clabverter.go @@ -39,7 +39,7 @@ type StatuslessTopology struct { // MustNewClabverter returns an instance of Clabverter or panics. func MustNewClabverter( topologyFile, - topologySpecFile, + topoSpecFile, outputDirectory, destinationNamespace, naming, @@ -103,7 +103,7 @@ func MustNewClabverter( return &Clabverter{ logger: clabverterLogger, topologyFile: topologyFile, - topologySpecFile: topologySpecFile, + topoSpecFile: topoSpecFile, githubToken: githubToken, outputDirectory: outputDirectory, stdout: stdout, @@ -141,8 +141,8 @@ type Clabverter struct { topologyPathParent string isRemotePath bool - topologySpecFile string - topologySpecFilePath string + topoSpecFile string + topoSpecFilePath string githubGroup string githubRepo string @@ -323,8 +323,8 @@ func (c *Clabverter) load() error { c.topologyPathParent = filepath.Dir(c.topologyPath) } - if c.topologySpecFile != "" { - c.topologySpecFilePath, err = filepath.Abs(c.topologySpecFile) + if c.topoSpecFile != "" { + c.topoSpecFilePath, err = filepath.Abs(c.topoSpecFile) if err != nil { c.logger.Criticalf("failed determining absolute path of values file, error: %s", err) @@ -333,7 +333,7 @@ func (c *Clabverter) load() error { } c.logger.Debugf( - "determined fully qualified topology spec values file path as: %s", c.topologySpecFilePath, + "determined fully qualified topology spec values file path as: %s", c.topoSpecFilePath, ) c.logger.Debug("attempting to load containerlab topology....") @@ -530,13 +530,11 @@ func (c *Clabverter) handleManifest() error { func (c *Clabverter) mergeConfigSpecWithRenderedTopology( renderedTopologySpecBytes []byte, ) ([]byte, error) { - finalTopology := &StatuslessTopology{} - - if c.topologySpecFilePath == "" { + if c.topoSpecFilePath == "" { return renderedTopologySpecBytes, nil } - content, err := os.ReadFile(c.topologySpecFilePath) + content, err := os.ReadFile(c.topoSpecFilePath) if err != nil { return nil, err } @@ -557,6 +555,8 @@ func (c *Clabverter) mergeConfigSpecWithRenderedTopology( return nil, err } + finalTopology := &StatuslessTopology{} + err = sigsyaml.Unmarshal(topologyFromTopoSpecsFileBytes, finalTopology) if err != nil { return nil, err diff --git a/cmd/clabverter/cli/entrypoint.go b/cmd/clabverter/cli/entrypoint.go index 7843036..d70cb85 100644 --- a/cmd/clabverter/cli/entrypoint.go +++ b/cmd/clabverter/cli/entrypoint.go @@ -9,7 +9,7 @@ import ( const ( topologyFile = "topologyFile" - specsFile = "specsFile" + topoSpecFile = "topoSpecFile" outputDirectory = "outputDirectory" destinationNamespace = "destinationNamespace" insecureRegistries = "insecureRegistries" @@ -39,7 +39,7 @@ func Entrypoint() *cli.App { Value: "", }, &cli.StringFlag{ - Name: specsFile, + Name: topoSpecFile, Usage: "set the values file to parse that will be included in the topology" + " manifest spec", Required: false, @@ -110,7 +110,7 @@ func Entrypoint() *cli.App { Action: func(c *cli.Context) error { err := clabernetesclabverter.MustNewClabverter( c.String(topologyFile), - c.String(specsFile), + c.String(topoSpecFile), c.String(outputDirectory), c.String(destinationNamespace), c.String(naming), From 36c9e330c8fc99bcdb994c0d6a655767bae742ee Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Sun, 16 Jun 2024 00:05:23 +0200 Subject: [PATCH 21/22] add omitempty to topology.spec.connectivity --- Makefile | 2 +- apis/v1alpha1/topology.go | 2 +- assets/crd/clabernetes.containerlab.dev_topologies.yaml | 1 - .../crds/clabernetes.containerlab.dev_topologies.yaml | 1 - generated/openapi/openapi_generated.go | 3 +-- 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index c5e0d68..dc7fa42 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ cov: ## Produce html coverage report; removes all the generated bits for sanity install-tools: ## Install lint/test tools go install mvdan.cc/gofumpt@latest - go install github.com/daixiang0/gci@latest@latest + go install github.com/daixiang0/gci@latest go install github.com/segmentio/golines@latest go install gotest.tools/gotestsum@latest diff --git a/apis/v1alpha1/topology.go b/apis/v1alpha1/topology.go index 24a9e62..c759aa9 100644 --- a/apis/v1alpha1/topology.go +++ b/apis/v1alpha1/topology.go @@ -67,7 +67,7 @@ type TopologySpec struct { // and/or fragmentation challenges. // +kubebuilder:validation:Enum=vxlan;slurpeeth // +kubebuilder:default=vxlan - Connectivity string `json:"connectivity"` + Connectivity string `json:"connectivity,omitempty"` } // TopologyStatus is the status for a Topology resource. diff --git a/assets/crd/clabernetes.containerlab.dev_topologies.yaml b/assets/crd/clabernetes.containerlab.dev_topologies.yaml index 3610bd5..3653fb6 100644 --- a/assets/crd/clabernetes.containerlab.dev_topologies.yaml +++ b/assets/crd/clabernetes.containerlab.dev_topologies.yaml @@ -594,7 +594,6 @@ spec: type: object type: object required: - - connectivity - definition - naming type: object diff --git a/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml b/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml index 3610bd5..3653fb6 100644 --- a/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml +++ b/charts/clabernetes/crds/clabernetes.containerlab.dev_topologies.yaml @@ -594,7 +594,6 @@ spec: type: object type: object required: - - connectivity - definition - naming type: object diff --git a/generated/openapi/openapi_generated.go b/generated/openapi/openapi_generated.go index a8aef78..185668a 100644 --- a/generated/openapi/openapi_generated.go +++ b/generated/openapi/openapi_generated.go @@ -1903,13 +1903,12 @@ func schema_srl_labs_clabernetes_apis_v1alpha1_TopologySpec( "connectivity": { SchemaProps: spec.SchemaProps{ Description: "Connectivity defines the type of connectivity to use between nodes in the topology. The default behavior is to use vxlan tunnels, alternatively you can enable a more experimental \"slurpeeth\" connectivity flavor that stuffs traffic into tcp tunnels to avoid any vxlan mtu and/or fragmentation challenges.", - Default: "", Type: []string{"string"}, Format: "", }, }, }, - Required: []string{"definition", "naming", "connectivity"}, + Required: []string{"definition", "naming"}, }, }, Dependencies: []string{ From 89ffc2dde813895a0df8e059be51c16280660329 Mon Sep 17 00:00:00 2001 From: Simon Peccaud Date: Sun, 16 Jun 2024 00:11:37 +0200 Subject: [PATCH 22/22] remove empty string connectivity test --- clabverter/test-fixtures/golden/simple/topo01.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/clabverter/test-fixtures/golden/simple/topo01.yaml b/clabverter/test-fixtures/golden/simple/topo01.yaml index 9f3c6b4..375f43a 100755 --- a/clabverter/test-fixtures/golden/simple/topo01.yaml +++ b/clabverter/test-fixtures/golden/simple/topo01.yaml @@ -5,7 +5,6 @@ metadata: name: topo01 namespace: notclabernetes spec: - connectivity: "" definition: containerlab: |- name: topo01