mirror of
https://github.com/holos-run/holos.git
synced 2026-03-20 17:25:01 +00:00
This patch writes a Flux Kustomization to apply the api objects rendered
by a component instance.
❯ holos render --log-format=json --log-level=debug --cluster-name core2 ./docs/examples/platforms/reference/projects/secrets/components/namespaces/ 2> >(./scripts/msgs)
config.go:91 finalized config from flags
builder.go:129 cue export --out yaml -t cluster=core2 ./platforms/reference/projects/secrets/components/namespaces
builder.go:134 configured cue tags: [cluster=core2]
builder.go:94 wrote deploy/clusters/core2/components/prod-secrets-namespaces/prod-secrets-namespaces.gen.yaml
builder.go:94 wrote deploy/clusters/core2/holos/components/prod-secrets-namespaces-kustomization.gen.yaml
render.go:39 rendered prod-secrets-namespaces
```yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: prod-secrets-namespaces
namespace: flux-system
spec:
interval: 30m0s
path: deploy/clusters/core2/components/prod-secrets-namespaces
prune: true
retryInterval: 2m0s
sourceRef:
kind: GitRepository
name: flux-system
timeout: 3m0s
wait: true
```
56 lines
1.8 KiB
Go
56 lines
1.8 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/holos-run/holos/pkg/config"
|
|
"github.com/holos-run/holos/pkg/internal/builder"
|
|
"github.com/holos-run/holos/pkg/logger"
|
|
"github.com/holos-run/holos/pkg/wrapper"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func makeRenderRunFunc(cfg *config.Config) runFunc {
|
|
return func(cmd *cobra.Command, args []string) error {
|
|
if cfg.ClusterName() == "" {
|
|
return wrapper.Wrap(fmt.Errorf("missing cluster name"))
|
|
}
|
|
|
|
ctx := cmd.Context()
|
|
log := logger.FromContext(ctx)
|
|
build := builder.New(builder.Entrypoints(args), builder.Cluster(cfg.ClusterName()))
|
|
results, err := build.Run(cmd.Context())
|
|
if err != nil {
|
|
return wrapper.Wrap(err)
|
|
}
|
|
// TODO: Avoid accidental over-writes if to holos component instances result in
|
|
// the same file path. Write files into a blank temporary directory, error if a
|
|
// file exists, then move the directory into place.
|
|
for _, result := range results {
|
|
// API Objects
|
|
path := result.Filename(cfg.WriteTo(), cfg.ClusterName())
|
|
if err := result.Save(ctx, path, result.Content); err != nil {
|
|
return wrapper.Wrap(err)
|
|
}
|
|
// Kustomization
|
|
path = result.KustomizationFilename(cfg.WriteTo(), cfg.ClusterName())
|
|
if err := result.Save(ctx, path, result.KsContent); err != nil {
|
|
return wrapper.Wrap(err)
|
|
}
|
|
log.InfoContext(ctx, "rendered "+result.Name(), "status", "ok", "action", "save", "path", path, "name", result.Name())
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// newRenderCmd returns the render subcommand for the root command
|
|
func newRenderCmd(cfg *config.Config) *cobra.Command {
|
|
cmd := newCmd("render [directory...]")
|
|
cmd.Args = cobra.MinimumNArgs(1)
|
|
cmd.Short = "write kubernetes api objects to the filesystem"
|
|
cmd.Flags().SortFlags = false
|
|
cmd.Flags().AddGoFlagSet(cfg.WriteFlagSet())
|
|
cmd.Flags().AddGoFlagSet(cfg.ClusterFlagSet())
|
|
cmd.RunE = makeRenderRunFunc(cfg)
|
|
return cmd
|
|
}
|