Skip to content

Commit f4c4871

Browse files
authored
feat: adds helm deployment type (#137)
1 parent 0aa52e8 commit f4c4871

File tree

16 files changed

+1045
-98
lines changed

16 files changed

+1045
-98
lines changed

cli/cmd/cmds/module/template.go

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,21 @@ package module
33
import (
44
"fmt"
55
"os"
6+
"path/filepath"
67
"strings"
78

9+
"github.com/input-output-hk/catalyst-forge/cli/internal/utils"
810
"github.com/input-output-hk/catalyst-forge/cli/pkg/run"
911
"github.com/input-output-hk/catalyst-forge/lib/project/deployment"
1012
"github.com/input-output-hk/catalyst-forge/lib/project/deployment/generator"
1113
"github.com/input-output-hk/catalyst-forge/lib/project/schema"
1214
)
1315

1416
type TemplateCmd struct {
15-
Path string `arg:"" help:"The path to the module (or project)." kong:"arg,predictor=path"`
17+
Module string `short:"m" help:"The specific module to template."`
18+
Out string `short:"o" help:"The output directory to write manifests to."`
19+
Path string `arg:"" help:"The path to the module (or project)." kong:"arg,predictor=path"`
20+
SetPath map[string]string `help:"Overrides the path for a given module (format: module=path)."`
1621
}
1722

1823
func (c *TemplateCmd) Run(ctx run.RunContext) error {
@@ -41,18 +46,72 @@ func (c *TemplateCmd) Run(ctx run.RunContext) error {
4146
}
4247
}
4348

49+
manifests := make(map[string][]byte)
4450
gen := generator.NewGenerator(ctx.ManifestGeneratorStore, ctx.Logger)
45-
result, err := gen.GenerateBundle(bundle)
46-
if err != nil {
47-
return fmt.Errorf("failed to generate manifests: %w", err)
51+
if c.Module != "" {
52+
mod, ok := bundle[c.Module]
53+
if !ok {
54+
return fmt.Errorf("module %q not found", c.Module)
55+
}
56+
57+
if path, ok := c.SetPath[c.Module]; ok {
58+
ctx.Logger.Info("overriding path for module", "module", c.Module, "path", path)
59+
mod.Path = utils.StringPtr(path)
60+
}
61+
62+
out, err := gen.Generate(mod)
63+
if err != nil {
64+
return fmt.Errorf("failed to generate manifest: %w", err)
65+
}
66+
67+
filename := fmt.Sprintf("%s.yaml", c.Module)
68+
manifests[filename] = out
69+
} else {
70+
if c.SetPath != nil {
71+
for name, path := range c.SetPath {
72+
mod, ok := bundle[name]
73+
if !ok {
74+
return fmt.Errorf("module %q not found", name)
75+
}
76+
77+
mod.Path = utils.StringPtr(path)
78+
bundle[name] = mod
79+
}
80+
}
81+
82+
out, err := gen.GenerateBundle(bundle)
83+
if err != nil {
84+
return fmt.Errorf("failed to generate manifests: %w", err)
85+
}
86+
87+
for name, manifest := range out.Manifests {
88+
filename := fmt.Sprintf("%s.yaml", name)
89+
manifests[filename] = manifest
90+
}
4891
}
4992

50-
var out string
51-
for _, manifest := range result.Manifests {
52-
out += fmt.Sprintf("%s---\n", manifest)
93+
if c.Out != "" {
94+
if err := writeManifests(c.Out, manifests); err != nil {
95+
return fmt.Errorf("could not write manifests: %w", err)
96+
}
97+
} else {
98+
var output string
99+
for _, manifest := range manifests {
100+
output += fmt.Sprintf("%s\n---\n", strings.TrimSuffix(string(manifest), "---\n"))
101+
}
102+
103+
fmt.Print(strings.TrimSuffix(output, "---\n"))
53104
}
54105

55-
fmt.Print(strings.TrimSuffix(out, "---\n"))
106+
return nil
107+
}
108+
109+
func writeManifests(path string, manifests map[string][]byte) error {
110+
for name, manifest := range manifests {
111+
if err := os.WriteFile(filepath.Join(path, name), manifest, 0644); err != nil {
112+
return fmt.Errorf("could not write manifest: %w", err)
113+
}
114+
}
56115

57116
return nil
58117
}

cli/go.mod

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,15 @@ require (
3535
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
3636
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
3737
github.com/BurntSushi/toml v1.4.0 // indirect
38-
github.com/Masterminds/semver/v3 v3.2.1 // indirect
38+
github.com/MakeNowJust/heredoc v1.0.0 // indirect
39+
github.com/Masterminds/goutils v1.1.1 // indirect
40+
github.com/Masterminds/semver/v3 v3.3.0 // indirect
41+
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
42+
github.com/Masterminds/squirrel v1.5.4 // indirect
3943
github.com/Microsoft/go-winio v0.6.2 // indirect
4044
github.com/ProtonMail/go-crypto v1.0.0 // indirect
4145
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230219212500-1f9a474cc2dc // indirect
46+
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
4247
github.com/aws/aws-sdk-go-v2/credentials v1.17.38 // indirect
4348
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect
4449
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect
@@ -54,23 +59,25 @@ require (
5459
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
5560
github.com/beorn7/perks v1.0.1 // indirect
5661
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
62+
github.com/blang/semver/v4 v4.0.0 // indirect
5763
github.com/cespare/xxhash/v2 v2.3.0 // indirect
64+
github.com/chai2010/gettext-go v1.0.2 // indirect
5865
github.com/chai2010/jsonv v1.1.3 // indirect
5966
github.com/chai2010/protorpc v1.1.4 // indirect
6067
github.com/chainguard-dev/git-urls v1.0.2 // indirect
6168
github.com/charmbracelet/x/ansi v0.2.3 // indirect
6269
github.com/charmbracelet/x/term v0.2.0 // indirect
6370
github.com/cloudflare/circl v1.3.7 // indirect
6471
github.com/cockroachdb/apd/v3 v3.2.1 // indirect
65-
github.com/containerd/containerd v1.7.20 // indirect
72+
github.com/containerd/containerd v1.7.24 // indirect
6673
github.com/containerd/errdefs v0.3.0 // indirect
6774
github.com/containerd/log v0.1.0 // indirect
6875
github.com/containerd/platforms v0.2.1 // indirect
6976
github.com/containers/image/v5 v5.33.0 // indirect
7077
github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect
7178
github.com/containers/ocicrypt v1.2.0 // indirect
7279
github.com/containers/storage v1.56.0 // indirect
73-
github.com/cyphar/filepath-securejoin v0.3.4 // indirect
80+
github.com/cyphar/filepath-securejoin v0.3.6 // indirect
7481
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
7582
github.com/dchest/siphash v1.2.3 // indirect
7683
github.com/distribution/reference v0.6.0 // indirect
@@ -85,60 +92,100 @@ require (
8592
github.com/earthly/earthly/ast v0.0.2-0.20240228223838-42e8ca204e8a // indirect
8693
github.com/ebitengine/purego v0.7.1 // indirect
8794
github.com/elliotchance/orderedmap/v2 v2.6.0 // indirect
95+
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
8896
github.com/emirpasic/gods v1.18.1 // indirect
8997
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
98+
github.com/evanphx/json-patch v5.9.0+incompatible // indirect
99+
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
100+
github.com/fatih/color v1.13.0 // indirect
90101
github.com/felixge/httpsnoop v1.0.4 // indirect
102+
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
103+
github.com/go-errors/errors v1.4.2 // indirect
91104
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
92105
github.com/go-git/go-billy/v5 v5.5.0 // indirect
93106
github.com/go-git/go-git/v5 v5.12.0 // indirect
107+
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
94108
github.com/go-logfmt/logfmt v0.6.0 // indirect
95109
github.com/go-logr/logr v1.4.2 // indirect
96110
github.com/go-logr/stdr v1.2.2 // indirect
111+
github.com/go-openapi/jsonpointer v0.21.0 // indirect
112+
github.com/go-openapi/jsonreference v0.21.0 // indirect
113+
github.com/go-openapi/swag v0.23.0 // indirect
114+
github.com/gobwas/glob v0.2.3 // indirect
97115
github.com/goccy/go-yaml v1.15.10 // indirect
98116
github.com/gofrs/flock v0.12.1 // indirect
117+
github.com/gogo/protobuf v1.3.2 // indirect
99118
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 // indirect
100119
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
101120
github.com/golang/protobuf v1.5.4 // indirect
102121
github.com/golang/snappy v0.0.4 // indirect
122+
github.com/google/btree v1.0.1 // indirect
123+
github.com/google/gnostic-models v0.6.8 // indirect
124+
github.com/google/go-cmp v0.6.0 // indirect
103125
github.com/google/go-github/v64 v64.0.0 // indirect
104126
github.com/google/go-querystring v1.1.0 // indirect
127+
github.com/google/gofuzz v1.2.0 // indirect
105128
github.com/google/s2a-go v0.1.7 // indirect
129+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
106130
github.com/google/uuid v1.6.0 // indirect
107131
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
108132
github.com/googleapis/gax-go/v2 v2.12.2 // indirect
109133
github.com/gorilla/mux v1.8.1 // indirect
134+
github.com/gorilla/websocket v1.5.0 // indirect
135+
github.com/gosuri/uitable v0.0.4 // indirect
136+
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
110137
github.com/hashicorp/errwrap v1.1.0 // indirect
111138
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
112139
github.com/hashicorp/go-getter v1.7.6 // indirect
113140
github.com/hashicorp/go-multierror v1.1.1 // indirect
114141
github.com/hashicorp/go-safetemp v1.0.0 // indirect
115142
github.com/hashicorp/go-version v1.7.0 // indirect
143+
github.com/huandu/xstrings v1.5.0 // indirect
144+
github.com/inconshreveable/mousetrap v1.1.0 // indirect
116145
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
117146
github.com/jinzhu/copier v0.4.0 // indirect
118147
github.com/jmespath/go-jmespath v0.4.0 // indirect
148+
github.com/jmoiron/sqlx v1.4.0 // indirect
149+
github.com/josharian/intern v1.0.0 // indirect
150+
github.com/json-iterator/go v1.1.12 // indirect
119151
github.com/kevinburke/ssh_config v1.2.0 // indirect
120152
github.com/klauspost/compress v1.17.11 // indirect
121153
github.com/kubescape/go-git-url v0.0.30 // indirect
154+
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
155+
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
156+
github.com/lib/pq v1.10.9 // indirect
157+
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
122158
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
159+
github.com/mailru/easyjson v0.7.7 // indirect
160+
github.com/mattn/go-colorable v0.1.13 // indirect
123161
github.com/mattn/go-isatty v0.0.20 // indirect
124162
github.com/mattn/go-localereader v0.0.1 // indirect
125163
github.com/mattn/go-runewidth v0.0.16 // indirect
164+
github.com/mitchellh/copystructure v1.2.0 // indirect
126165
github.com/mitchellh/go-homedir v1.1.0 // indirect
127166
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
167+
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
128168
github.com/mitchellh/mapstructure v1.5.0 // indirect
169+
github.com/mitchellh/reflectwalk v1.0.2 // indirect
129170
github.com/moby/locker v1.0.1 // indirect
171+
github.com/moby/spdystream v0.5.0 // indirect
130172
github.com/moby/sys/capability v0.3.0 // indirect
131173
github.com/moby/sys/mountinfo v0.7.2 // indirect
132174
github.com/moby/sys/user v0.3.0 // indirect
133175
github.com/moby/term v0.5.0 // indirect
176+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
177+
github.com/modern-go/reflect2 v1.0.2 // indirect
178+
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
134179
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
135180
github.com/muesli/cancelreader v0.2.2 // indirect
136181
github.com/muesli/termenv v0.15.2 // indirect
137182
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
183+
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
138184
github.com/opencontainers/go-digest v1.0.0 // indirect
139185
github.com/opencontainers/image-spec v1.1.0 // indirect
140186
github.com/opencontainers/runtime-spec v1.2.0 // indirect
141187
github.com/otiai10/copy v1.14.0 // indirect
188+
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
142189
github.com/pjbgf/sha1cd v0.3.0 // indirect
143190
github.com/pkg/errors v0.9.1 // indirect
144191
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
@@ -148,41 +195,71 @@ require (
148195
github.com/prometheus/procfs v0.15.1 // indirect
149196
github.com/rivo/uniseg v0.4.7 // indirect
150197
github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab // indirect
198+
github.com/rubenv/sql-migrate v1.7.1 // indirect
199+
github.com/russross/blackfriday/v2 v2.1.0 // indirect
151200
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
201+
github.com/shopspring/decimal v1.4.0 // indirect
152202
github.com/sirupsen/logrus v1.9.3 // indirect
153203
github.com/skeema/knownhosts v1.2.2 // indirect
204+
github.com/spf13/cast v1.7.0 // indirect
205+
github.com/spf13/cobra v1.8.1 // indirect
206+
github.com/spf13/pflag v1.0.5 // indirect
154207
github.com/thoas/go-funk v0.9.3 // indirect
155208
github.com/ulikunitz/xz v0.5.12 // indirect
209+
github.com/x448/float16 v0.8.4 // indirect
156210
github.com/xanzy/ssh-agent v0.3.3 // indirect
211+
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
212+
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
213+
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
214+
github.com/xlab/treeprint v1.2.0 // indirect
157215
go.opencensus.io v0.24.0 // indirect
158-
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
216+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
159217
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
160218
go.opentelemetry.io/otel v1.31.0 // indirect
161219
go.opentelemetry.io/otel/metric v1.31.0 // indirect
162220
go.opentelemetry.io/otel/trace v1.31.0 // indirect
163-
golang.org/x/crypto v0.29.0 // indirect
221+
golang.org/x/crypto v0.31.0 // indirect
164222
golang.org/x/mod v0.22.0 // indirect
165-
golang.org/x/net v0.31.0 // indirect
223+
golang.org/x/net v0.33.0 // indirect
166224
golang.org/x/oauth2 v0.23.0 // indirect
167-
golang.org/x/sync v0.9.0 // indirect
168-
golang.org/x/sys v0.27.0 // indirect
169-
golang.org/x/text v0.20.0 // indirect
170-
golang.org/x/time v0.6.0 // indirect
225+
golang.org/x/sync v0.10.0 // indirect
226+
golang.org/x/sys v0.28.0 // indirect
227+
golang.org/x/term v0.27.0 // indirect
228+
golang.org/x/text v0.21.0 // indirect
229+
golang.org/x/time v0.7.0 // indirect
171230
golang.org/x/tools v0.27.0 // indirect
172231
google.golang.org/api v0.169.0 // indirect
173232
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
174233
google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect
175234
google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect
176235
google.golang.org/grpc v1.69.0 // indirect
177236
google.golang.org/protobuf v1.35.2 // indirect
237+
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
238+
gopkg.in/inf.v0 v0.9.1 // indirect
178239
gopkg.in/jfontan/go-billy-desfacer.v0 v0.0.0-20210209210102-b43512b1cad0 // indirect
179240
gopkg.in/warnings.v0 v0.1.2 // indirect
180241
gopkg.in/yaml.v3 v3.0.1 // indirect
181-
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
242+
helm.sh/helm/v3 v3.17.0 // indirect
243+
k8s.io/api v0.32.0 // indirect
244+
k8s.io/apiextensions-apiserver v0.32.0 // indirect
245+
k8s.io/apimachinery v0.32.0 // indirect
246+
k8s.io/apiserver v0.32.0 // indirect
247+
k8s.io/cli-runtime v0.32.0 // indirect
248+
k8s.io/client-go v0.32.0 // indirect
249+
k8s.io/component-base v0.32.0 // indirect
250+
k8s.io/klog/v2 v2.130.1 // indirect
251+
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
252+
k8s.io/kubectl v0.32.0 // indirect
253+
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
182254
kcl-lang.io/kcl-go v0.11.0 // indirect
183255
kcl-lang.io/lib v0.11.0 // indirect
184256
oras.land/oras-go v1.2.6 // indirect
185257
oras.land/oras-go/v2 v2.5.0 // indirect
258+
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
259+
sigs.k8s.io/kustomize/api v0.18.0 // indirect
260+
sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
261+
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
262+
sigs.k8s.io/yaml v1.4.0 // indirect
186263
)
187264

188265
replace github.com/input-output-hk/catalyst-forge/lib/project => ../lib/project

0 commit comments

Comments
 (0)