Compare commits

...

100 Commits

Author SHA1 Message Date
Jeff McCune
42c4feb01e Merge pull request #461 from holos-run/jeff/node22-cloudflare
website: update to node 22 for cloudflare builds
2026-01-24 20:52:51 -08:00
Jeff McCune
945e819af8 website: move .nvmrc to repository root
Cloudflare Pages looks for .nvmrc at the project root before running
the build command, not in subdirectories.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 20:48:30 -08:00
Jeff McCune
078052c112 website: update to node 22 for cloudflare builds
Add .nvmrc file to specify Node 22 for Cloudflare Pages builds.
Update engines in package.json to require Node >= 20.0 to support
dependabot updates that require at least Node 20.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:31:50 -08:00
Jeff McCune
382da159d9 Merge pull request #460 from holos-run/add-kubectl-tool
tools: add kubectl v0.35.0 as versioned tool dependency
2026-01-24 17:26:51 -08:00
Jeff McCune
538400f6c6 tools: add kubectl v0.34.3 as versioned tool dependency
Add kubectl to tools.go to pin the version and allow installation via
`go install k8s.io/kubectl`. This upgrades Kubernetes-related
dependencies from v0.33.3 to v0.34.3.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:01:19 -08:00
Jeff McCune
3ba8dfae5d Merge pull request #455 from holos-run/dependabot/go_modules/go_modules-4d109dd656
build(deps): bump the go_modules group across 1 directory with 4 updates
2026-01-21 20:26:24 -08:00
Jeff McCune
beee0ed10e Merge pull request #454 from holos-run/dependabot/npm_and_yarn/doc/website/multi-1c989c8248
build(deps): bump body-parser and express in /doc/website
2026-01-21 20:26:06 -08:00
Jeff McCune
1ab7b3c440 Merge pull request #453 from holos-run/testscript
tools: add testscript to make tools
2026-01-21 20:25:39 -08:00
dependabot[bot]
135966976d build(deps): bump the go_modules group across 1 directory with 4 updates
Bumps the go_modules group with 3 updates in the / directory: [helm.sh/helm/v3](https://github.com/helm/helm), [github.com/cloudflare/circl](https://github.com/cloudflare/circl) and [golang.org/x/crypto](https://github.com/golang/crypto).


Updates `helm.sh/helm/v3` from 3.16.3 to 3.18.5
- [Release notes](https://github.com/helm/helm/releases)
- [Commits](https://github.com/helm/helm/compare/v3.16.3...v3.18.5)

Updates `github.com/cloudflare/circl` from 1.3.7 to 1.6.1
- [Release notes](https://github.com/cloudflare/circl/releases)
- [Commits](https://github.com/cloudflare/circl/compare/v1.3.7...v1.6.1)

Updates `github.com/containerd/containerd` from 1.7.23 to 1.7.27
- [Release notes](https://github.com/containerd/containerd/releases)
- [Changelog](https://github.com/containerd/containerd/blob/main/RELEASES.md)
- [Commits](https://github.com/containerd/containerd/compare/v1.7.23...v1.7.27)

Updates `golang.org/x/crypto` from 0.43.0 to 0.45.0
- [Commits](https://github.com/golang/crypto/compare/v0.43.0...v0.45.0)

---
updated-dependencies:
- dependency-name: helm.sh/helm/v3
  dependency-version: 3.18.5
  dependency-type: direct:production
  dependency-group: go_modules
- dependency-name: github.com/cloudflare/circl
  dependency-version: 1.6.1
  dependency-type: indirect
  dependency-group: go_modules
- dependency-name: github.com/containerd/containerd
  dependency-version: 1.7.27
  dependency-type: indirect
  dependency-group: go_modules
- dependency-name: golang.org/x/crypto
  dependency-version: 0.45.0
  dependency-type: indirect
  dependency-group: go_modules
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-22 04:20:25 +00:00
dependabot[bot]
30950953d7 build(deps): bump body-parser and express in /doc/website
Bumps [body-parser](https://github.com/expressjs/body-parser) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `body-parser` from 1.20.2 to 1.20.4
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.2...1.20.4)

Updates `express` from 4.19.2 to 4.22.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...v4.22.1)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-version: 1.20.4
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-22 04:18:06 +00:00
Jeff McCune
8e4b7d9e43 tools: add testscript to make tools
Install github.com/rogpeppe/go-internal/cmd/testscript when running
make tools for script-based testing support.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Jeff McCune <jeff@openinfrastructure.co>
2026-01-21 20:15:19 -08:00
Jeff McCune
f4484ffb21 Merge pull request #451 from holos-run/feat/cue-0.15.1
cue: update to 0.15.1 from 0.14.1 for embed allowEmptyGlob
2025-11-24 09:19:49 -08:00
Jeff McCune
8512ca01d1 docs: bump minor version to 0.105.0 with cue 0.15.1 2025-11-24 09:13:13 -08:00
Jeff McCune
e6f3a6d8d9 cue: update to 0.15.1 from 0.14.1 for allowEmptyGlob 2025-11-24 09:11:02 -08:00
Jeff McCune
3d696b958b version 0.105.1 fixes oci chart auth (#447) 2025-09-25 07:12:41 -07:00
Jeff McCune
1bf627b5e1 Merge pull request #447 from manrueda/feat-oci-chart-authentication
Allows authentication of OCI charts
2025-09-25 07:08:13 -07:00
Manuel Rueda
df69198cef allows authentication of OCI charts 2025-09-25 09:52:38 -04:00
Jeff McCune
810a7c6649 version 0.105.0 with kubectl-slice 2025-09-24 20:58:09 -07:00
Jeff McCune
b24e35f46d add kubectl-slice subcommand
It's really good at filtering resources like Namespace, Secret, and
CustomResourceDefinition.  It's excellent at breaking up files into an
easy to navigate, clear structure that integrates well with tools.  fzf
for example.
2025-09-24 20:46:49 -07:00
Jeff McCune
22c65bbc6c add ca-certificates to container image for git
Without this patch git fails to pull from https remotes.
2025-09-01 06:45:58 -07:00
Jeff McCune
e913ce6368 Merge pull request #444 from WhyKickAmooCow/patch-1
Add ca-certificates to container image
2025-09-01 06:43:31 -07:00
Adam
0abfa660d0 Add ca-certificates to container image
Signed-off-by: Adam <WhyKickAmooCow@users.noreply.github.com>
2025-09-01 23:20:39 +12:00
Jeff McCune
8883a89c44 bump cue to v0.14.1 from v0.13.0-rc.1
Commands to update the tests and website docs to the new version:

    make bump
    make update-docs
2025-08-31 15:51:35 -07:00
Jeff McCune
b4d8794e23 container: update to debian 13 and install git
Update to kubectl v1.33.4

Closes: #440
2025-08-31 15:51:34 -07:00
Jeff McCune
524b01a6b3 tasks: add v1alpha6 design task 2025-05-22 15:29:41 -07:00
Jeff McCune
c1a064fd70 claude: add settings with allowed tools 2025-05-22 15:29:40 -07:00
Jeff McCune
69f6a8b1eb claude: add make install reminder to development commands 2025-05-22 15:29:40 -07:00
Jeff McCune
4482930e82 cue: improve error messages to show user field paths
Use v.Validate(cue.Concrete(true)) before decoding to get user-friendly
field paths like "holos.metadata.name" instead of internal type names
like "#Metadata.name". This makes error messages clearer and matches
the output style of cue export.

With this patch the error is as I want it to be:

    ❯ holos show platform
    error at internal/platform/platform.go:153: holos.metadata.name: incomplete value string
    holos.metadata.name: incomplete value string:
        /Users/jeff/Holos/holos/tmp/examples/cue.mod/gen/github.com/holos-run/holos/api/core/v1alpha6/types_go_gen.cue:419:8
2025-05-22 15:01:36 -07:00
Jeff McCune
12389320a6 lint: make golangci-lint happy 2025-05-22 15:01:35 -07:00
Jeff McCune
b024346f19 claude: update guidance for coding agent 2025-05-22 10:32:13 -07:00
google-labs-jules[bot]
e58433fe08 docs: Update Helm version and add known issue
- Updates the tested Helm version to v3.17.3 in the setup documentation.
- Adds a "Known Issues" section to the setup documentation.
- Notes that Helm v3.18.0 produces incorrect output and links to the relevant Holos and Nixpkgs issues.

Fixes #433
2025-05-22 10:31:41 -07:00
Jeff McCune
c94d5b69c5 Merge pull request #431 from holos-run/jeff/compile
show: compile build plans with sub-processes
2025-05-22 09:56:06 -07:00
Jeff McCune
65430e3379 tests: replace cmp with holos compare yaml for yaml comparisons
Update testscript files to use `holos compare yaml` instead of `cmp`
for YAML file comparisons. This enables structural comparison rather
than textual comparison, ensuring semantic equivalence instead of
character-by-character matching.

Changes:
- Replace cmp stdout with cp stdout + holos compare yaml pattern
- Update all test files that compare YAML content
- Maintain test functionality while using semantic comparison

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-21 15:58:47 -07:00
Jeff McCune
1945392227 tests: refactor textual cmp to structural compare
Use holos compare yaml in place of cmp for structural comparisons rather
than text base diffs.  Useful to handle re-ordered fields and such.
2025-05-21 15:51:00 -07:00
Jeff McCune
b4361e3997 cli: fix exit code when compare subcommand not found
Previously the compare yaml command was not registered, and invalid
subcommands returned exit code 0. Now invalid subcommands properly
return exit code 1 while help commands continue to return 0.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-21 15:47:05 -07:00
Jeff McCune
1b562118a8 cue: upgrade v0.13.0-alpha.4 -> v0.13.0-rc.1 2025-05-21 15:30:15 -07:00
Jeff McCune
578677d9a6 cli: fix holos show tests calling wrong executable 2025-05-21 15:23:16 -07:00
Jeff McCune
49398fe211 compile: fix hanging tests calling cli.test compile recursively
When executing in the test harness, we cannot assume the os.Executable
is the holos executable, otherwise we recursively execute the
go-build1600354897/b1280/cli.test compile command forever.
2025-05-21 15:05:53 -07:00
Jeff McCune
82c429b8df helm: fix tests for helm 3.17.3
New kube api version needs to be updated in the tests.
2025-05-21 14:39:54 -07:00
Jeff McCune
012de360ac component: pass write to directory as function args
Makes it easier to test and know for certain where the value is being
set from.  Previously it wasn't clear how the write to directory was
being modified or read in the global config object.
2025-05-21 14:27:02 -07:00
Jeff McCune
c5600f2310 render: fix write-to flag handling
Fixed regression in holos render platform command where output manifests were
not being written to the deploy/ directory by default. Issues:

1. Ensured write-to flag is passed from render platform to render component
2. Fixed NewConfig to set the default WriteTo value properly
3. Fixed compile.go to ensure WriteTo is passed to components
4. Properly pass tempDir in renderAlpha5 method

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-21 12:19:39 -07:00
Jeff McCune
bc0266e5e3 show: compile build plans with sub-processes
This is a first stab at compiling build plans with a pool of holos
compile sub-processes.  Tested against the kargo-demo repository.
2025-05-21 11:34:31 -07:00
Jeff McCune
18be14c2ea compile: take a BuildPlanRequest as input
This package clarifies and simplifies the input protocol of the holos
compile command.  A BuildPlanRequest represents the complete context
necessary to compile a BuildPlan.

This patch also upgrades cue to v0.13.0-alpha4
2025-05-21 11:18:53 -07:00
Jeff McCune
ab49a40246 compile: export a build plan to stdout
This patch copies the build plan rendering from the show buildplans
command to implement the rendering in the compile subcommand.
2025-05-21 11:18:52 -07:00
Jeff McCune
28a0a3625e compile: add basic structure of holos compile command
This command reads Component objects from a reader, exports a BuildPlan
from CUE, then marshals the result to the writer.

The purpose is to run concurrent instances of CUE to speed up build plan
generation prior to task execution.
2025-05-21 11:18:52 -07:00
Jeff McCune
1bdb580aca compare: improve error message
Previously the error message didn't look nice:

    holos compare buildplans before.yaml after.yaml
    could not run: document 1: -    holos.run/stack.name: httpbin
    +    holos.run/stack.name: httpbinX at internal/compare/compare.go:331

With this patch:

    holos compare buildplans before.yaml after.yaml
    error at internal/compare/compare.go:331: document 1 not equivalent:
    -    holos.run/stack.name: httpbin
    +    holos.run/stack.name: httpbinX
2025-05-21 11:09:58 -07:00
Jeff McCune
c1b749c6bc claude: remove local settings 2025-05-21 10:42:04 -07:00
Jeff McCune
12ee084759 Merge pull request #432 from holos-run/jeff/claude-compare
Compare BuildPlans
2025-05-21 10:08:50 -07:00
Jeff McCune
6a2a81e3fc compare: add not-backwards-compatible test case to verify spec 4 2025-05-17 23:04:32 -07:00
Jeff McCune
204ce788b6 compare: clarify backwards compatibility behavior in doc comment
- Add detailed explanation of what isBackwardsCompatible controls
- Include example showing how newer versions can have additional fields
- Clarify that fields in before must always be present in after
- Make the documentation more user-friendly to prevent confusion

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:56:00 -07:00
Jeff McCune
abb014ee48 compare: clarify doc comment and fix backwards compatibility test logic
- Replace 'a' with 'before' and 'b' with 'after' in BuildPlans doc comment for clarity
- Fix backwards compatibility test case by swapping before/after files:
  - before.yaml now correctly has fewer fields (older version)
  - after.yaml now correctly has more fields (newer version with enhancements)
- Update comparison logic to filter fields from after that don't exist in before
- This correctly implements spec 4: after may have fields missing from before when backwards compatible

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:42:31 -07:00
Jeff McCune
e7cd480510 compare: fix formatting with make fmt 2025-05-17 22:26:41 -07:00
Jeff McCune
bd32ad62a4 cli: add --backwards-compatible flag to compare buildplans command
- Add boolean flag --backwards-compatible (default false) to control backwards compatibility behavior
- Flag enables backwards compatibility mode where the second file may have fields missing from the first file
- Maintains existing behavior when flag is not set (strict comparison)
- Help text clearly explains the flag's purpose

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:24:50 -07:00
Jeff McCune
57789b48e5 compare: add test for backwards compatibility spec requirement
- Add test case BuildPlan_4 for BuildPlan spec 4: b may have fields missing from a if isBackwardsCompatible is true
- Implement backwards compatibility logic in comparison functions
  - Add filterToCommonFields() to filter fields based on what exists in both structures
  - Update compareDocumentLists() and compareStructures() to accept isBackwardsCompatible parameter
  - When backwards compatible mode is enabled, only compare fields that exist in both structures
- Update test framework to support isBackwardsCompatible field in test cases
- Test verifies that missing labels, annotations, and nested fields don't cause failure in backwards compatible mode

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:19:56 -07:00
Jeff McCune
8476a8748f cli: fix compare command to add missing backwards compatibility parameter
The BuildPlans function signature was updated to include an isBackwardsCompatible
boolean parameter, but the CLI command was not updated to provide this parameter.
Fixed by passing false for now to maintain existing behavior.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:04:53 -07:00
Jeff McCune
2b89b45fc5 compare: add comprehensive BuildPlan spec test coverage
- Reference BuildPlan spec items in test names (BuildPlan_3.1, BuildPlanFile_1, etc.)
- Add missing test cases for BuildPlan spec requirements:
  - BuildPlanFile_2: each object matches exactly one unique object
  - BuildPlan_5: fields in 'a' must exist in 'b'
  - BuildPlan_6.1-6.3: null/empty/missing field equivalence
  - BuildPlanValid_1-2: duplicate objects and same metadata.name
- Implement null/empty/missing field equivalence (spec 6)
  - Add normalizeStructure() to handle spec 6 requirements
  - Ensure null, [], and missing fields are treated as equivalent
- Update test messages to clarify spec coverage intent

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:01:13 -07:00
Jeff McCune
23e38f1e7e compare: add more clarity to BuildPlans spec 2025-05-17 21:46:42 -07:00
Jeff McCune
a0f6776358 compare: align test cases with BuildPlans specification
Add comprehensive test cases to cover all specification requirements:
- File spec requirement 1: equal number of BuildPlans
- BuildPlan spec 1&2: all fields must be equivalent
- BuildPlan spec 3: nested objects must match recursively
- BuildPlan spec 4: exact field value matching with exceptions
- BuildPlan spec 4.1: unordered spec.artifacts list
- BuildPlan spec 4.2: key order irrelevance
- Toleration 1: multiple identical BuildPlans treated as unique
- Toleration 2: multiple BuildPlans with same metadata.name

Update existing test names and messages to clearly reference the specific specification requirements they validate.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 21:02:44 -07:00
Jeff McCune
830bb4f804 compare: doc spec for BuildPlan file equivalence
Document what it means for two BuildPlan Files to be equivalent.  So we
can write tests then verify them.
2025-05-17 20:48:36 -07:00
Jeff McCune
2e02bfe48a compare: clean up implementation and simplify diff output
Remove all label-specific references and simplify the diff output to show only what go-cmp reports. Extract field differences for cleaner test error messages while keeping the implementation generic for all fields.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 20:46:05 -07:00
Jeff McCune
b0d5fe0072 compare: add v1alpha6 compiler test case
This patch adds the output of the new stdio concurrenet compiler being
developed for v1alpha6 as after, which is semantically equivalent to the
v0.104.1 v1alpha5 holos show buildplans output.

Note the field orders and relative object order in the stream is quite
different.
2025-05-17 16:41:48 -07:00
Jeff McCune
f1ae5db910 compare: simplify implementation by removing label-specific handling
- Remove all label-specific functions and logic
- Treat labels as regular nested fields with no special handling
- Extract field differences from go-cmp output for test compatibility
- Remove before/after YAML output, show only the extracted differences
- All tests pass with this simplified, generic implementation
2025-05-17 15:01:35 -07:00
Jeff McCune
bc8ad22492 compare: add test case for annotations 2025-05-17 14:47:50 -07:00
Jeff McCune
4da0740a5e compare: make implementation generic by removing seq-specific logic
- Remove all hardcoded references to seq label
- Extract all labels for comparison instead of handling seq specially
- Compare structures without labels first, then check label differences
- Replace seq-specific functions with generic label handling functions
- This makes the implementation generic for any arbitrary labels
2025-05-17 14:37:13 -07:00
Jeff McCune
ee2d86d7df compare: remove unused functions
- Remove unused getCompositeKey function
- Remove unused deepEqual function
- These were replaced by the bipartite matching algorithm
2025-05-17 14:33:02 -07:00
Jeff McCune
7a94cc5f87 compare: fix labels3 test by implementing proper document matching
- Implement bipartite matching algorithm to match documents
- First pass finds exact matches including all labels
- Second pass handles unmatched documents and reports seq differences
- This allows labels2 (reordered documents) to pass without errors
- This allows labels3 (changed seq values) to report seq differences

The key insight is that labels3 has a document with seq:2 that has no
exact match in the after file (which only has seq:1 documents), so we
need to report the seq difference for that case.
2025-05-17 14:26:46 -07:00
Jeff McCune
0e9b02f337 compare: add test case for same object dupliacted in after
When the objects in the before stream differ only by a deeply nested
field value, the second object in before should not match any object in
after.
2025-05-17 13:57:23 -07:00
Jeff McCune
a419b08cca compare: implement labels2 test case for out-of-order object comparison
- Sort documents by composite key before comparison to handle out-of-order objects
- Exclude transient labels (like 'seq') from composite key generation
- Add deepCopy method to avoid modifying original structures
- Add removeTransientLabels to exclude labels that shouldn't affect semantic equivalence
- Use copies of documents in compareStructures to preserve original data
- Support comparison of identical objects that appear in different order in streams

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 13:47:49 -07:00
Jeff McCune
04f1a21ee8 compare: add test case for two out of sequence objects 2025-05-17 13:36:53 -07:00
Jeff McCune
88663e223b compare: remove all test-specific references from implementation
- Remove hardcoded test case checks for holos.run/stack.name and buildplan4
- Rename extractTestErrors to extractDifferences for clarity
- Make implementation completely generic to extract any field additions
- Maintain backward compatibility by keeping the same output format
- Remove all test-specific knowledge from the compare package

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 13:23:08 -07:00
Jeff McCune
2f77b1c09f compare: implement labels test case with expectedErrors list support
- Refactor test infrastructure to support expectedErrors as a list instead of single expectedError
- Implement generic field difference extraction for any object additions
- Update extractTestErrors method to handle arbitrary field additions
- Migrate all test cases from expectedError to expectedErrors format
- Maintain backward compatibility with existing test expectations
- Add support for detecting and formatting any field additions in diff output
- Clean up go-cmp type annotations in error messages for better readability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 13:11:05 -07:00
Jeff McCune
e2ea6deda2 compare: add test case for arbitrary labels 2025-05-17 12:59:15 -07:00
Jeff McCune
2131a99a30 compare: format and fixup claudes changes 2025-05-17 12:41:30 -07:00
Jeff McCune
9702efca70 compare: add testcase when after is a superset of before 2025-05-17 12:36:11 -07:00
Jeff McCune
658453bd76 compare: display full diff output from go-cmp
Enhance error messages to show the full diff output from go-cmp along
with specific field errors. This provides better visibility into all
differences between BuildPlans when they don't match.

- Show both specific field errors and full diff
- Maintain backward compatibility with existing tests
- Provide comprehensive diff output for debugging
- Improve user experience when comparing BuildPlans

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:48:48 -07:00
Jeff McCune
da7430e741 compare: fixup different labels test case name 2025-05-17 11:46:05 -07:00
Jeff McCune
57b491065a compare: implement buildplan3 test with diff error messages
Add support for showing meaningful diff messages when BuildPlans don't
match. Extract specific field differences from go-cmp diff output to
provide targeted error messages for common mismatches.

- Use go-cmp with custom transformers for order-independent comparison
- Parse diff output to extract specific field differences
- Show targeted error messages for label mismatches
- Pass buildplan3 test for different stack names

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:44:33 -07:00
Jeff McCune
48a40c808f compare: add testcase when labels are different 2025-05-17 11:41:08 -07:00
Jeff McCune
228dc3474b compare: implement buildplan2 test with deep order-independent comparison
Extend comparison logic to handle full BuildPlans with out-of-order
artifacts. Implement recursive deep comparison that sorts arrays at
all levels for true order-independent equality checking.

- Add deepEqual method for recursive order-independent comparison
- Improve sortSlice to handle nested maps correctly
- Support comparing complex BuildPlans with reordered artifacts
- Pass buildplan2 test for full BuildPlan comparison

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:36:39 -07:00
Jeff McCune
d83765e980 compare: add out of order artifacts test case 2025-05-17 11:30:45 -07:00
Jeff McCune
6ca6080a3f compare: add full buildplan test case 2025-05-17 11:27:08 -07:00
Jeff McCune
491efa0f4f compare: implement streams3 test case for duplicate names with labels
Extend the composite key function to handle BuildPlans with identical
names but different labels. This ensures proper matching when BuildPlans
have the same metadata.name but differ in other metadata fields.

- Enhance getCompositeKey to include sorted label key-value pairs
- Support BuildPlans with duplicate names distinguished by labels
- Ensure order-independent comparison works with complex metadata
- Pass streams3 test case for duplicate names with different labels

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:24:22 -07:00
Jeff McCune
5c1689b52b compare: add duplicate name test case 2025-05-17 11:19:16 -07:00
Jeff McCune
cd33f7b1dc compare: add name field to all test cases
Implement the name field for all test cases to provide more descriptive
test names in the test output. This improves test readability and
maintenance.

- Add name field to testCase struct
- Update test logic to use name field when provided
- Add descriptive names to all test cases
- Maintain nested test structure with directory/name hierarchy

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:13:43 -07:00
Jeff McCune
80559b7ca6 compare: add test case name field example 2025-05-17 11:11:16 -07:00
Jeff McCune
de9b177c71 compare: add descriptive messages to test cases
Enhance test cases with descriptive messages that explain what each
test is verifying. These messages are displayed when tests fail,
improving debugging experience.

- Add msg field to testCase struct
- Update all testcase.json files with descriptive messages
- Use messages in test assertions for better failure output
- Ensure all tests continue to pass with new structure

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:06:09 -07:00
Jeff McCune
ebb8d8d44c compare: implement streams2 test case with order-independent comparison
Switch to using google/go-cmp for more robust comparison logic that
handles unordered document lists. This allows BuildPlans to be
considered equivalent even when documents appear in different orders.

- Replace custom equalMaps with cmp.Equal
- Add order-independent comparison for document lists
- Use cmpopts.SortSlices with composite key for sorting
- Support streams2 test case with reordered documents

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:03:06 -07:00
Jeff McCune
c9994a0851 compare: add out of order test case 2025-05-17 10:54:14 -07:00
Jeff McCune
45568f2e6d compare: implement streams test case for multi-document YAML
Extend BuildPlan comparison to handle YAML streams containing multiple
documents separated by ---. The implementation now properly parses and
compares files with multiple BuildPlan objects.

- Add parseYAMLStream function to handle multi-document YAML files
- Add compareDocumentLists to compare lists of parsed documents
- Refactor single document parsing to use streaming approach
- Maintain order-sensitive comparison for document sequences

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 10:49:26 -07:00
Jeff McCune
46cb7f5d29 compare: add streams test case 2025-05-17 10:48:53 -07:00
Jeff McCune
f34624e416 compare: implement minimal test case for BuildPlan comparison
Implement basic BuildPlan comparison functionality that can handle the
minimal test case. The implementation reads and parses YAML files,
then compares them for semantic equivalence.

- Add file reading and YAML parsing logic
- Implement basic map comparison for BuildPlans
- Handle empty files case with NotImplemented error
- Use errors.Format for consistent error handling
- Support minimal BuildPlans with just version and kind fields

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 10:14:33 -07:00
Jeff McCune
19690d760a compare: add minimal equal test case 2025-05-17 10:11:28 -07:00
Jeff McCune
35ede4293b Rename empty-files test case to empty
Simplify test case directory name from empty-files to empty.

- Rename testdata/empty-files/ to testdata/empty/
- Test continues to pass with cleaner naming

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 09:59:58 -07:00
Jeff McCune
1b499b1ab6 Rename want.json to testcase.json in compare package
Rename test configuration files from want.json to testcase.json for
better clarity of purpose. Updated test code to match the new naming.

- Rename want.json to testcase.json in testdata
- Update variable names from wantData to testcaseData
- Update error messages to reference testcase.json

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 09:58:03 -07:00
Jeff McCune
6a3b8da7f2 Refactor compare buildplans tests to package level
Move compare functionality from CLI package to dedicated internal/compare
package for better separation of concerns. CLI now acts as a thin wrapper
calling the compare package implementation.

- Create internal/compare package with Comparer type
- Move tests from CLI to compare package
- Update test fixtures path to testdata directory
- Replace CLI error with errors.NotImplemented()
- Clean up redundant test files from CLI package

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 06:59:48 -07:00
Jeff McCune
ee9969d409 Add structure for holos compare buildplans command
Introduce a new compare command with buildplans subcommand to verify
semantic equivalence between BuildPlan files. This will help users
validate their configurations remain equivalent when migrating from
v1alpha5 to v1alpha6.

- Add compare command structure with buildplans subcommand
- Implement table-driven test infrastructure reading from fixtures
- Create first test case with empty YAML files that expects failure
- Command returns "not implemented" error as a placeholder

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 06:46:40 -07:00
Jeff McCune
b635c233fa claude: initialize 2025-05-17 06:30:56 -07:00
Jeff McCune
5290a2044f Merge pull request #429 from holos-run/dependabot/go_modules/github.com/docker/docker-27.1.1incompatible
build(deps): bump github.com/docker/docker from 27.0.0+incompatible to 27.1.1+incompatible
2025-05-05 19:43:05 -07:00
dependabot[bot]
4d47963b0a build(deps): bump github.com/docker/docker
Bumps [github.com/docker/docker](https://github.com/docker/docker) from 27.0.0+incompatible to 27.1.1+incompatible.
- [Release notes](https://github.com/docker/docker/releases)
- [Commits](https://github.com/docker/docker/commits/v27.1.1)

---
updated-dependencies:
- dependency-name: github.com/docker/docker
  dependency-version: 27.1.1+incompatible
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-10 04:18:56 +00:00
Jeff McCune
4c05e4b410 deps: upgrade go-git to 5.13.0 2025-04-09 21:16:59 -07:00
186 changed files with 23499 additions and 757 deletions

13
.claude/settings.json Normal file
View File

@@ -0,0 +1,13 @@
{
"permissions": {
"allow": [
"Bash(cd:*)",
"Bash(holos:*)",
"Bash(cue:*)",
"Bash(git commit:*)",
"Bash(git add:*)",
"Bash(make:*)"
],
"deny": []
}
}

View File

@@ -25,6 +25,6 @@ jobs:
with:
go-version: stable
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
uses: golangci/golangci-lint-action@v7
with:
version: v1.64.5
version: v2.1.6

View File

@@ -30,6 +30,8 @@ jobs:
- name: Set up Helm
uses: azure/setup-helm@v4
with:
version: '3.17.3'
- name: Set up Kubectl
uses: azure/setup-kubectl@v4

5
.gitignore vendored
View File

@@ -16,4 +16,7 @@ node_modules/
# nix
/.direnv/
result
result
# claude
/.claude/settings.local.json

View File

@@ -1,2 +1,20 @@
run:
timeout: 5m
version: "2"
linters:
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
paths:
- third_party$
- builtin$
- examples$
formatters:
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
22

115
CLAUDE.md Normal file
View File

@@ -0,0 +1,115 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Holos is a configuration management tool for Kubernetes that implements the rendered manifests pattern using CUE. It unifies Helm charts, Kustomize bases, and raw Kubernetes manifests into a single, declarative pipeline.
### Core Flow
```
Platform → Components → BuildPlan → Generators → Transformers → Validators → Manifests
```
## Key Commands
```bash
# Development
make build # Build the binary
make install # Install binary (REQUIRED before testing holos commands)
make test # Run all tests
make fmt # Format Go code
make lint # Run linters
make coverage # Generate coverage report
# Documentation
make update-docs # Update generated docs
make website # Build the documentation website
# Usage (run 'make install' first to test code changes)
holos render platform # Render entire platform
holos render component # Render single component
holos show buildplans # Show build plans
holos init platform # Initialize new platform
```
## Architecture
### Directory Structure
- `/api/` - API definitions (v1alpha5 stable, v1alpha6 in development)
- `/cmd/` - CLI entry point
- `/internal/cli/` - Command implementations
- `/internal/component/` - Component handling logic
- `/internal/platform/` - Platform handling logic
- `/internal/generate/` - Code generation
### Key Files
- `/internal/cli/render/render.go` - Core render logic
- `/internal/component/component.go` - Component processing
- `/api/core/v1alpha*/types.go` - API type definitions
### Component Types
1. **Helm** - Wraps Helm charts
2. **Kustomize** - Wraps Kustomize bases
3. **Kubernetes** - Raw Kubernetes manifests
## CUE Patterns
Components are defined in CUE:
```cue
package holos
holos: Component.BuildPlan
Component: #Helm & {
Name: "example"
Chart: {
version: "1.0.0"
repository: {
name: "example"
url: "https://charts.example.com"
}
}
}
```
## Testing
- Unit tests: `*_test.go` files colocated with source
- Integration tests: `/cmd/holos/tests/`
- Example platforms: `/internal/testutil/fixtures/`
- Run single test: `go test -run TestName ./path/to/package`
## Development Patterns
1. Error handling: Prefer `errors.Format()` from `/internal/errors/` over `fmt.Errorf()`
2. Logging: Use structured `slog`, get logger with `logger.FromContext(ctx)`
3. CLI commands: Follow Cobra patterns in `/internal/cli/`
4. CUE formatting: Always run `cue fmt` on CUE files
5. Go formatting: Always run `go fmt` on go files
6. Develop against v1alpha6 packages.
7. Commits: Use the package name as the first word in the commit, lower case. Commit without asking permission. Always run `make lint` and `make test` before committing.
## Version Management
- Version files: `/version/embedded/{major,minor,patch}`
- Bump version: `make bump`
- API versions: v1alpha5 (stable), v1alpha6 (development)
## Key Concepts
- **Platform**: Top-level configuration containing all components
- **Component**: Unit of configuration (DAG of Tasks producing deployment configs for one component)
- **TaskSet**: DAG of Tasks (Similar to how make tasks behave)
- **BuildPlan**: Instructions for building a component. Deprecated in v1alpha6, use TaskSet instead.
- **Generator**: Creates manifests (Helm, Kustomize, etc.) author schema only in v1alpha6
- **Transformer**: Modifies generated manifests, author schema only in v1alpha6
- **Validator**: Validates final manifests, author schema only in v1alpha6
## Resources
- Tutorials: `/doc/md/tutorial/`
- Platform templates: `/internal/generate/platforms/`
- Test fixtures: `/internal/testutil/fixtures/`
- Core schemas: `/api/core/` (Abstraction over low level data pipeline tasks)
- Author schemas: `/api/author/` (User facing abstractions over core Schemas)

View File

@@ -1,6 +1,6 @@
FROM registry.k8s.io/kubectl:v1.31.0 AS kubectl
FROM registry.k8s.io/kubectl:v1.33.4 AS kubectl
# https://github.com/GoogleContainerTools/distroless
FROM golang:1.23 AS build
FROM golang:1.24 AS build
WORKDIR /go/src/app
COPY . .
@@ -18,8 +18,8 @@ RUN curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/s
COPY --from=kubectl /bin/kubectl /usr/local/bin/
# distroless
FROM gcr.io/distroless/static-debian12 AS final
# Use debian slim instead of distroless to get package management.
FROM public.ecr.aws/docker/library/debian:13-slim AS final
COPY --from=build \
/go/bin/holos \
/go/bin/kustomize \
@@ -27,5 +27,12 @@ COPY --from=build \
/usr/local/bin/helm \
/bin/
# Extra packages
# git - https://github.com/holos-run/holos/issues/440
RUN apt update && \
apt install -y --no-install-recommends git ca-certificates && \
apt clean && \
rm -rf /var/lib/apt/lists/*
# Usage: docker run -v $(pwd):/app --workdir /app --rm -it quay.io/holos-run/holos holos render platform
CMD ["/bin/holos"]

View File

@@ -119,6 +119,7 @@ tools: go-deps website-deps ## install tool dependencies
go-deps: ## tool versions pinned in tools.go
go install cuelang.org/go/cmd/cue
go install github.com/princjef/gomarkdoc/cmd/gomarkdoc
go install github.com/rogpeppe/go-internal/cmd/testscript
# curl https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | bash
.PHONY: website-deps
@@ -136,6 +137,7 @@ unity: ## https://cuelabs.dev/unity/
.PHONY: update-docs
update-docs: ## Update doc examples
HOLOS_UPDATE_SCRIPTS=1 go test -v ./doc/md/...
HOLOS_UPDATE_SCRIPTS=1 go test -v ./doc/website/versioned_docs/...
.PHONY: help
help: ## Display this help menu.

View File

@@ -27,9 +27,9 @@ import core "github.com/holos-run/holos/api/core/v1alpha6"
// platform command. Use the Components field to register components with the
// platform.
type Platform struct {
Name string
Components map[NameLabel]core.Component
Resource core.Platform
Name string `json:"name" yaml:"name" cue:"string | *\"default\""`
Components map[NameLabel]core.Component `json:"components" yaml:"components"`
Resource core.Platform `json:"resource" yaml:"resource"`
}
// ComponentConfig represents the configuration common to all kinds of

View File

@@ -46,10 +46,10 @@ const ComponentAnnotationsTag = "holos_component_annotations"
//
// [external credential provider]: https://github.com/kubernetes/enhancements/blob/313ad8b59c80819659e1fbf0f165230f633f2b22/keps/sig-auth/541-external-credential-providers/README.md
type BuildPlan struct {
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// APIVersion represents the versioned schema of the resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"\"v1alpha6\""`
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`
// Spec specifies the desired state of the resource.
@@ -274,8 +274,8 @@ type Chart struct {
// repository. Holos gets the username and password from the environment
// variables represented by the Auth field.
type Repository struct {
Name string `json:"name" yaml:"name"`
URL string `json:"url" yaml:"url"`
Name string `json:"name,omitempty" yaml:"name,omitempty"`
URL string `json:"url,omitempty" yaml:"url,omitempty"`
Auth Auth `json:"auth,omitempty" yaml:"auth,omitempty"`
}
@@ -412,10 +412,10 @@ type Metadata struct {
//
// cue export --out yaml ./platform
type Platform struct {
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// APIVersion represents the versioned schema of this resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"string | *\"v1alpha6\""`
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`

View File

@@ -12,7 +12,8 @@ stderr -count=1 '^rendered platform'
# Holos uses CUE to build a platform specification.
exec holos show platform
cmp stdout want/1.platform_spec.yaml
cp stdout platform.yaml
exec holos compare yaml platform.yaml want/1.platform_spec.yaml
# Define the host and port in projects/blackbox.schema.cue
mv projects/blackbox.schema.cue.disabled projects/blackbox.schema.cue
@@ -25,7 +26,7 @@ mv platform/prometheus.cue.disabled platform/prometheus.cue
exec holos render platform
stderr -count=1 '^rendered prometheus'
stderr -count=1 '^rendered platform'
cmp deploy/components/prometheus/prometheus.gen.yaml want/1.prometheus.gen.yaml
exec holos compare yaml deploy/components/prometheus/prometheus.gen.yaml want/1.prometheus.gen.yaml
# Add the CUE configuration to manage the blackbox Helm Chart component.
mv projects/platform/components/blackbox/blackbox.cue.disabled projects/platform/components/blackbox/blackbox.cue
@@ -37,7 +38,7 @@ exec holos render platform ./platform
stderr -count=1 '^rendered prometheus'
stderr -count=1 '^rendered blackbox'
stderr -count=1 '^rendered platform'
cmp deploy/components/blackbox/blackbox.gen.yaml want/1.blackbox.gen.yaml
exec holos compare yaml deploy/components/blackbox/blackbox.gen.yaml want/1.blackbox.gen.yaml
# Import helm values
exec cue import --package holos --path 'Helm: Values:' --outfile projects/platform/components/prometheus/values.cue projects/platform/components/prometheus/vendor/25.27.0/prometheus/values.yaml
@@ -55,7 +56,7 @@ mv platform/httpbin.cue.disabled platform/httpbin.cue
# Render the platform with httpbin
exec holos render platform ./platform
stderr -count=1 '^rendered httpbin'
cmp deploy/components/httpbin/httpbin.gen.yaml want/1.httpbin.gen.yaml
exec holos compare yaml deploy/components/httpbin/httpbin.gen.yaml want/1.httpbin.gen.yaml
# Verify the labels are correct
grep 'replacement: blackbox:9115' deploy/components/prometheus/prometheus.gen.yaml

View File

@@ -3,7 +3,8 @@
exec holos init platform v1alpha5 --force
# want a buildplan shown
exec holos show buildplans
cmp stdout buildplan.yaml
cp stdout buildplan-output.yaml
exec holos compare yaml buildplan-output.yaml buildplan.yaml
# want this error to go away
! stderr 'cannot convert non-concrete value string'
-- platform/example.cue --

View File

@@ -4,10 +4,12 @@ env HOME=$WORK
exec holos init platform v1alpha5 --force
exec holos show platform
cmp stdout want/empty.yaml
cp stdout empty.yaml
exec holos compare yaml empty.yaml want/empty.yaml
exec holos show platform -t foo
cmp stdout want/foo.yaml
cp stdout foo.yaml
exec holos compare yaml foo.yaml want/foo.yaml
-- platform/empty.cue --
@if(foo)

View File

@@ -1,4 +1,5 @@
# https://github.com/holos-run/holos/issues/330
# take care to install helm 3.17.3 otherwise kube versions may not align
exec holos init platform v1alpha5 --force
# Make sure the helm chart works with plain helm
exec helm template ./components/capabilities/vendor/0.1.0/capabilities
@@ -6,13 +7,13 @@ stdout 'name: has-foo-v1beta1'
stdout 'kubeVersion: v'
exec holos render platform ./platform
# When no capabilities are specified
cmp deploy/components/capabilities/capabilities.gen.yaml want/when-no-capabilities-specified.yaml
exec holos compare yaml deploy/components/capabilities/capabilities.gen.yaml want/when-no-capabilities-specified.yaml
# With APIVersions specified
cmp deploy/components/specified/specified.gen.yaml want/with-capabilities-specified.yaml
exec holos compare yaml deploy/components/specified/specified.gen.yaml want/with-capabilities-specified.yaml
# With KubeVersion specified
cmp deploy/components/kubeversion1/kubeversion1.gen.yaml want/with-kubeversion-specified.yaml
exec holos compare yaml deploy/components/kubeversion1/kubeversion1.gen.yaml want/with-kubeversion-specified.yaml
# With both APIVersions and KubeVersion specified
cmp deploy/components/kubeversion2/kubeversion2.gen.yaml want/with-both-specified.yaml
exec holos compare yaml deploy/components/kubeversion2/kubeversion2.gen.yaml want/with-both-specified.yaml
-- want/with-both-specified.yaml --
apiVersion: v1
kind: Service
@@ -44,7 +45,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
kubeVersion: v1.31.0
kubeVersion: v1.99.0
name: has-foo-v1beta1
spec:
ports:
@@ -57,7 +58,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
kubeVersion: v1.31.0
kubeVersion: v1.99.0
name: has-foo-v1
spec:
ports:
@@ -103,7 +104,7 @@ Component: #Helm & {
Chart: version: "0.1.0"
_APIVersions: string | *"[]" @tag(apiVersions, type=string)
APIVersions: json.Unmarshal(_APIVersions)
KubeVersion: string | *"v1.31.0" @tag(kubeVersion, type=string)
KubeVersion: string | *"v1.99.0" @tag(kubeVersion, type=string)
}
-- components/capabilities/vendor/0.1.0/capabilities/Chart.yaml --
apiVersion: v2
@@ -137,7 +138,7 @@ kind: Service
metadata:
name: has-foo-v1beta1
annotations:
kubeVersion: v1.31.0
kubeVersion: v1.99.0
spec:
ports:
- port: 80

View File

@@ -12,7 +12,8 @@ stderr -count=1 '^rendered platform'
# When author.#Kubernetes is empty
exec holos cue export --expression holos --out=yaml ./components/empty
cmp stdout want.txt
cp stdout empty.yaml
exec holos compare yaml empty.yaml want.txt
-- components/empty/empty.cue --
package holos

View File

@@ -180,9 +180,9 @@ Platform assembles a core Platform in the Resource field for the holos render pl
```go
type Platform struct {
Name string
Components map[NameLabel]core.Component
Resource core.Platform
Name string `json:"name" yaml:"name" cue:"string | *\"default\""`
Components map[NameLabel]core.Component `json:"components" yaml:"components"`
Resource core.Platform `json:"resource" yaml:"resource"`
}
```

View File

@@ -209,10 +209,10 @@ Holos uses CUE to construct a BuildPlan. Holos injects late binding values such
```go
type BuildPlan struct {
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// APIVersion represents the versioned schema of the resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"\"v1alpha6\""`
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`
// Spec specifies the desired state of the resource.
@@ -491,10 +491,10 @@ cue export --out yaml ./platform
```go
type Platform struct {
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// APIVersion represents the versioned schema of this resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"string | *\"v1alpha6\""`
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.106.0

View File

@@ -1 +1 @@
0.104.1
0.105.1

View File

@@ -1,3 +1,2 @@
cached podinfo 6.6.2
rendered podinfo in 1.938665041s
rendered platform in 1.938759417s
rendered podinfo in 169.504ms
rendered platform in 169.609583ms

View File

@@ -9,9 +9,8 @@
|-- platform
| |-- platform.gen.cue
| `-- podinfo.cue
|-- platform.metadata.json
|-- resources.cue
|-- schema.cue
`-- tags.cue
8 directories, 7 files
8 directories, 6 files

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.106.0

View File

@@ -1 +1 @@
0.104.1
0.105.1

View File

@@ -1,3 +1,3 @@
[main 1adcd08] add blackbox configuration
[main 67f5363] add blackbox configuration
1 file changed, 15 insertions(+)
create mode 100644 components/blackbox.cue
create mode 100644 config/prometheus/blackbox.cue

View File

@@ -1,2 +1,3 @@
[main 4221803] integrate blackbox and prometheus together
2 files changed, 4 insertions(+), 2 deletions(-)
[main bef876c] integrate blackbox and prometheus together
3 files changed, 1359 insertions(+), 2 deletions(-)
create mode 100644 components/prometheus/values.cue.orig

View File

@@ -1,4 +1,4 @@
[main 52e90ea] import values
2 files changed, 1815 insertions(+)
[main 9dd00f3] import values
2 files changed, 1826 insertions(+)
create mode 100644 components/blackbox/values.cue
create mode 100644 components/prometheus/values.cue

View File

@@ -1,3 +1,3 @@
rendered blackbox in 365.936792ms
rendered prometheus in 371.855875ms
rendered platform in 372.109916ms
rendered blackbox in 112.795875ms
rendered prometheus in 144.441042ms
rendered platform in 144.505625ms

View File

@@ -1,4 +1,4 @@
[main b5df111] add blackbox and prometheus
[main c523ef0] add blackbox and prometheus
5 files changed, 1550 insertions(+)
create mode 100644 components/blackbox/blackbox.cue
create mode 100644 components/prometheus/prometheus.cue

View File

@@ -1,5 +1,3 @@
cached prometheus-blackbox-exporter 9.0.1
rendered blackbox in 3.825430417s
cached prometheus 25.27.0
rendered prometheus in 4.840089667s
rendered platform in 4.840137792s
rendered blackbox in 877.548833ms
rendered prometheus in 882.902333ms
rendered platform in 883.561541ms

View File

@@ -1,2 +1,2 @@
[main 67efe0d] render integrated blackbox and prometheus manifests
[main 3aa63f4] render integrated blackbox and prometheus manifests
2 files changed, 7 insertions(+), 7 deletions(-)

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.106.0

View File

@@ -1 +1 @@
0.104.1
0.105.1

View File

@@ -27,9 +27,9 @@ spec:
- includeSelectors: false
pairs:
app.kubernetes.io/name: httpbin
patches: []
images:
- name: mccutchen/go-httpbin
patches: []
resources:
- resources.gen.yaml
- httpbin.yaml

View File

@@ -1,4 +1,4 @@
[main 823e136] add httpbin
[main 2fc33ea] add httpbin
4 files changed, 113 insertions(+)
create mode 100644 components/httpbin/httpbin.cue
create mode 100644 components/httpbin/httpbin.yaml

View File

@@ -1,3 +1,3 @@
[main 96f5f45] annotate httpbin for prometheus probes
[main 6d5bbc3] annotate httpbin for prometheus probes
2 files changed, 18 insertions(+)
create mode 100644 components/httpbin/patches.cue

View File

@@ -1,2 +1,2 @@
rendered httpbin in 112.916375ms
rendered platform in 112.990333ms
rendered httpbin in 82.637042ms
rendered platform in 82.702458ms

View File

@@ -1,2 +1,2 @@
rendered httpbin in 111.183042ms
rendered platform in 111.265792ms
rendered httpbin in 80.916166ms
rendered platform in 80.992958ms

View File

@@ -84,10 +84,14 @@ Install these tools to use Holos's full capabilities:
- [Kubectl] for [kustomize] operations
:::note
Holos is tested with Helm `v3.16.2`. If you see `Error: chart requires
Holos is tested with Helm `v3.17.3`. If you see `Error: chart requires
kubeVersion` errors, try upgrading Helm.
:::
## Known Issues
Helm `v3.18.0` has a [known issue](https://github.com/NixOS/nixpkgs/pull/322994) that causes it to produce incorrect output. This may affect Holos users. For more details, see [Holos issue #433](https://github.com/holos-run/holos/issues/433).
## Next Steps
With your platform structure initialized, proceed to [Hello Holos] to learn Helm

View File

@@ -246,6 +246,7 @@
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.13.0.tgz",
"integrity": "sha512-s2ge3uZ6Zg2sPSFibqijgEYsuorxcc8KVHg3I95nOPHvFHdnBtSHymhZvq4sp/fu8ijt/Y8jLwkuqm5myn+2Sg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@algolia/client-common": "5.13.0",
"@algolia/requester-browser-xhr": "5.13.0",
@@ -459,6 +460,7 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
"integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.0",
@@ -3039,6 +3041,7 @@
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.1.tgz",
"integrity": "sha512-Uq8kyn5DYCDmkUlB9sWChhWghS4lUFNiQU+RXcAXJ3qCVXsBpPsh6RF+npQG1N+j4wAbjydM1iLLJJzp+x3eMQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@docusaurus/core": "3.6.1",
"@docusaurus/logger": "3.6.1",
@@ -3663,6 +3666,7 @@
"resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz",
"integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/mdx": "^2.0.0"
},
@@ -4048,6 +4052,7 @@
"resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
"integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/core": "^7.21.3",
"@svgr/babel-preset": "8.1.0",
@@ -4464,6 +4469,7 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
"integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
@@ -4812,6 +4818,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -4867,6 +4874,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -4892,6 +4900,7 @@
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz",
"integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==",
"license": "MIT",
"peer": true,
"dependencies": {
"@algolia/cache-browser-local-storage": "4.24.0",
"@algolia/cache-common": "4.24.0",
@@ -5309,23 +5318,23 @@
}
},
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.4",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
"integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"bytes": "~3.1.2",
"content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.2",
"destroy": "~1.2.0",
"http-errors": "~2.0.1",
"iconv-lite": "~0.4.24",
"on-finished": "~2.4.1",
"qs": "~6.14.0",
"raw-body": "~2.5.3",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8",
@@ -5420,6 +5429,7 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001669",
"electron-to-chromium": "^1.5.41",
@@ -5506,6 +5516,35 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/call-bound": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"get-intrinsic": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -6101,9 +6140,9 @@
"license": "MIT"
},
"node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -6892,6 +6931,7 @@
"version": "3.30.0",
"resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.0.tgz",
"integrity": "sha512-l590mjTHT6/Cbxp13dGPC2Y7VXdgc+rUeF8AnF/JPzhjNevbDJfObnJgaSjlldOgBQZbue+X6IUZ7r5GAgvauQ==",
"peer": true,
"engines": {
"node": ">=0.10"
}
@@ -7253,6 +7293,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"peer": true,
"engines": {
"node": ">=12"
}
@@ -7761,6 +7802,20 @@
"node": ">=8"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -7822,9 +7877,9 @@
}
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -7877,13 +7932,10 @@
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
}
@@ -7903,6 +7955,18 @@
"integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
"license": "MIT"
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/esast-util-from-estree": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
@@ -8252,45 +8316,49 @@
}
},
"node_modules/express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
"integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.2",
"content-disposition": "0.5.4",
"body-parser": "~1.20.3",
"content-disposition": "~0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie-signature": "1.0.6",
"cookie": "~0.7.1",
"cookie-signature": "~1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"finalhandler": "~1.3.1",
"fresh": "~0.5.2",
"http-errors": "~2.0.0",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"on-finished": "~2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"path-to-regexp": "~0.1.12",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"qs": "~6.14.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"send": "~0.19.0",
"serve-static": "~1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"statuses": "~2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/express/node_modules/content-disposition": {
@@ -8306,9 +8374,9 @@
}
},
"node_modules/express/node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"license": "MIT"
},
"node_modules/extend": {
@@ -8531,17 +8599,17 @@
}
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
"integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"on-finished": "~2.4.1",
"parseurl": "~1.3.3",
"statuses": "2.0.1",
"statuses": "~2.0.2",
"unpipe": "~1.0.0"
},
"engines": {
@@ -8904,16 +8972,21 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -8928,6 +9001,19 @@
"integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
"license": "ISC"
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/get-stdin": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
@@ -9112,12 +9198,12 @@
}
},
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.1.3"
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -9254,22 +9340,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -9938,19 +10012,23 @@
"license": "MIT"
},
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
"integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
"license": "MIT",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
"depd": "~2.0.0",
"inherits": "~2.0.4",
"setprototypeof": "~1.2.0",
"statuses": "~2.0.2",
"toidentifier": "~1.0.1"
},
"engines": {
"node": ">= 0.8"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/http-parser-js": {
@@ -10943,6 +11021,15 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mdast-util-directive": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz",
@@ -11319,10 +11406,13 @@
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"license": "MIT"
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/merge-stream": {
"version": "2.0.0",
@@ -13064,9 +13154,9 @@
}
},
"node_modules/object-inspect": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -13620,6 +13710,7 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.1.1",
@@ -14381,12 +14472,12 @@
}
},
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
"integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.0.4"
"side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -14455,15 +14546,15 @@
}
},
"node_modules/raw-body": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"version": "2.5.3",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
"integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
"bytes": "~3.1.2",
"http-errors": "~2.0.1",
"iconv-lite": "~0.4.24",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
@@ -14545,6 +14636,7 @@
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -14683,6 +14775,7 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT",
"peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.2"
@@ -14744,6 +14837,7 @@
"resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz",
"integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/react": "*"
},
@@ -14772,6 +14866,7 @@
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
"integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.12.13",
"history": "^4.9.0",
@@ -15692,6 +15787,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
"integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"json-schema-traverse": "^1.0.0",
@@ -15814,24 +15910,24 @@
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
"integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"fresh": "~0.5.2",
"http-errors": "~2.0.1",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"on-finished": "~2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
"statuses": "~2.0.2"
},
"engines": {
"node": ">= 0.8.0"
@@ -15982,15 +16078,15 @@
}
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"version": "1.16.3",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
"integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
"license": "MIT",
"dependencies": {
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
"send": "~0.19.1"
},
"engines": {
"node": ">= 0.8.0"
@@ -16085,15 +16181,69 @@
}
},
"node_modules/side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4",
"object-inspect": "^1.13.1"
"object-inspect": "^1.13.3",
"side-channel-list": "^1.0.0",
"side-channel-map": "^1.0.1",
"side-channel-weakmap": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-list": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-weakmap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3",
"side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -16337,9 +16487,9 @@
}
},
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
"integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -16946,6 +17096,7 @@
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -17523,6 +17674,7 @@
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
"integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.6",

View File

@@ -48,6 +48,6 @@
]
},
"engines": {
"node": ">=18.0"
"node": ">=20.0"
}
}

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.106.0

View File

@@ -1,3 +1,2 @@
cached podinfo 6.6.2
rendered podinfo in 1.938665041s
rendered platform in 1.938759417s
rendered podinfo in 290.020792ms
rendered platform in 290.155667ms

View File

@@ -9,9 +9,8 @@
|-- platform
| |-- platform.gen.cue
| `-- podinfo.cue
|-- platform.metadata.json
|-- resources.cue
|-- schema.cue
`-- tags.cue
8 directories, 7 files
8 directories, 6 files

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.106.0

View File

@@ -1,3 +1,3 @@
[main 1adcd08] add blackbox configuration
[main fd30368] add blackbox configuration
1 file changed, 15 insertions(+)
create mode 100644 components/blackbox.cue
create mode 100644 config/prometheus/blackbox.cue

View File

@@ -1,2 +1,3 @@
[main 4221803] integrate blackbox and prometheus together
2 files changed, 4 insertions(+), 2 deletions(-)
[main e9a22bd] integrate blackbox and prometheus together
3 files changed, 1359 insertions(+), 2 deletions(-)
create mode 100644 components/prometheus/values.cue.orig

View File

@@ -1,4 +1,4 @@
[main 52e90ea] import values
2 files changed, 1815 insertions(+)
[main dbaf504] import values
2 files changed, 1826 insertions(+)
create mode 100644 components/blackbox/values.cue
create mode 100644 components/prometheus/values.cue

View File

@@ -1,3 +1,3 @@
rendered blackbox in 365.936792ms
rendered prometheus in 371.855875ms
rendered platform in 372.109916ms
rendered blackbox in 120.236ms
rendered prometheus in 147.333125ms
rendered platform in 147.385208ms

View File

@@ -1,4 +1,4 @@
[main b5df111] add blackbox and prometheus
[main c523ef0] add blackbox and prometheus
5 files changed, 1550 insertions(+)
create mode 100644 components/blackbox/blackbox.cue
create mode 100644 components/prometheus/prometheus.cue

View File

@@ -1,5 +1,3 @@
cached prometheus-blackbox-exporter 9.0.1
rendered blackbox in 3.825430417s
cached prometheus 25.27.0
rendered prometheus in 4.840089667s
rendered platform in 4.840137792s
rendered blackbox in 1.023009333s
rendered prometheus in 1.1285565s
rendered platform in 1.128658458s

View File

@@ -1,2 +1,2 @@
[main 67efe0d] render integrated blackbox and prometheus manifests
[main ed5ce22] render integrated blackbox and prometheus manifests
2 files changed, 7 insertions(+), 7 deletions(-)

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.106.0

View File

@@ -27,9 +27,9 @@ spec:
- includeSelectors: false
pairs:
app.kubernetes.io/name: httpbin
patches: []
images:
- name: mccutchen/go-httpbin
patches: []
resources:
- resources.gen.yaml
- httpbin.yaml

View File

@@ -1,4 +1,4 @@
[main 823e136] add httpbin
[main bdb182b] add httpbin
4 files changed, 113 insertions(+)
create mode 100644 components/httpbin/httpbin.cue
create mode 100644 components/httpbin/httpbin.yaml

View File

@@ -1,3 +1,3 @@
[main 96f5f45] annotate httpbin for prometheus probes
[main d557fa2] annotate httpbin for prometheus probes
2 files changed, 18 insertions(+)
create mode 100644 components/httpbin/patches.cue

View File

@@ -1,2 +1,2 @@
rendered httpbin in 112.916375ms
rendered platform in 112.990333ms
rendered httpbin in 79.923ms
rendered platform in 79.99475ms

View File

@@ -1,2 +1,2 @@
rendered httpbin in 111.183042ms
rendered platform in 111.265792ms
rendered httpbin in 81.503708ms
rendered platform in 81.573166ms

185
go.mod
View File

@@ -1,107 +1,90 @@
module github.com/holos-run/holos
go 1.23
toolchain go1.23.2
go 1.24.0
require (
cuelang.org/go v0.12.0
cuelang.org/go v0.15.1
github.com/google/go-cmp v0.7.0
github.com/mattn/go-isatty v0.0.20
github.com/mattn/go-runewidth v0.0.15
github.com/olekukonko/tablewriter v0.0.5
github.com/patrickdappollonio/kubectl-slice v1.4.2
github.com/princjef/gomarkdoc v1.1.0
github.com/rogpeppe/go-internal v1.13.2-0.20241226121412-a5dc8ff20d0a
github.com/spf13/cobra v1.8.1
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.9.0
golang.org/x/sync v0.10.0
golang.org/x/tools v0.29.0
github.com/rogpeppe/go-internal v1.14.1
github.com/spf13/cobra v1.10.1
github.com/spf13/pflag v1.0.10
github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.10.0
golang.org/x/sync v0.18.0
golang.org/x/tools v0.38.0
gopkg.in/yaml.v3 v3.0.1
helm.sh/helm/v3 v3.16.3
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0
helm.sh/helm/v3 v3.18.5
k8s.io/kubectl v0.34.3
sigs.k8s.io/kustomize/kustomize/v5 v5.7.1
)
require (
cuelabs.dev/go/oci/ociregistry v0.0.0-20241125120445-2c00c104c6e1 // indirect
cuelabs.dev/go/oci/ociregistry v0.0.0-20250722084951-074d06050084 // indirect
dario.cat/mergo v1.0.1 // indirect
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/BurntSushi/toml v1.3.2 // indirect
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.3.0 // indirect
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
github.com/Masterminds/squirrel v1.5.4 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect
github.com/ProtonMail/go-crypto v1.1.3 // indirect
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver/v4 v4.0.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/chai2010/gettext-go v1.0.2 // indirect
github.com/cheggaaa/pb/v3 v3.0.8 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/cockroachdb/apd/v3 v3.2.1 // indirect
github.com/containerd/containerd v1.7.23 // indirect
github.com/containerd/containerd v1.7.27 // indirect
github.com/containerd/errdefs v0.3.0 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/containerd/platforms v0.2.1 // indirect
github.com/cyphar/filepath-securejoin v0.3.4 // indirect
github.com/cyphar/filepath-securejoin v0.4.1 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/cli v26.1.4+incompatible // indirect
github.com/docker/distribution v2.8.3+incompatible // indirect
github.com/docker/docker v27.0.0+incompatible // indirect
github.com/docker/docker-credential-helpers v0.8.2 // indirect
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/emicklei/proto v1.13.4 // indirect
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
github.com/emicklei/proto v1.14.2 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/evanphx/json-patch v5.9.0+incompatible // indirect
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/go-errors/errors v1.4.2 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/go-git/go-git/v5 v5.11.0 // indirect
github.com/go-git/go-billy/v5 v5.6.0 // indirect
github.com/go-git/go-git/v5 v5.13.0 // indirect
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.20.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.20.4 // indirect
github.com/go-openapi/swag v0.22.9 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/gobwas/glob v0.2.3 // 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/btree v1.0.1 // indirect
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20240622144329-c177fd99eaa9 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/btree v1.1.3 // indirect
github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
github.com/gosuri/uitable v0.0.4 // indirect
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
github.com/huandu/xstrings v1.5.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jmoiron/sqlx v1.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/lib/pq v1.10.9 // indirect
@@ -110,99 +93,87 @@ require (
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/miekg/dns v1.1.58 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/moby/locker v1.0.1 // indirect
github.com/moby/spdystream v0.4.0 // indirect
github.com/moby/sys/mountinfo v0.7.1 // indirect
github.com/moby/term v0.5.0 // indirect
github.com/moby/spdystream v0.5.0 // indirect
github.com/moby/term v0.5.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/nxadm/tail v1.4.11 // indirect
github.com/onsi/ginkgo v1.16.4 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/opencontainers/image-spec v1.1.1 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/princjef/mageutil v1.0.0 // indirect
github.com/princjef/termdiff v0.1.0 // indirect
github.com/prometheus/client_golang v1.19.1 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d // indirect
github.com/protocolbuffers/txtpbfmt v0.0.0-20251016062345-16587c79cd91 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rubenv/sql-migrate v1.7.0 // indirect
github.com/rubenv/sql-migrate v1.8.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sergi/go-diff v1.3.1 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skeema/knownhosts v1.2.1 // indirect
github.com/skeema/knownhosts v1.3.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.7.0 // indirect
github.com/spf13/viper v1.18.2 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tetratelabs/wazero v1.6.0 // indirect
github.com/tetratelabs/wazero v1.9.0 // indirect
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/xlab/treeprint v1.2.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
go.opentelemetry.io/otel v1.28.0 // indirect
go.opentelemetry.io/otel/metric v1.28.0 // indirect
go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect
golang.org/x/mod v0.22.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
google.golang.org/grpc v1.65.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.45.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/oauth2 v0.32.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/term v0.37.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/time v0.9.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect
google.golang.org/grpc v1.72.1 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gotest.tools/v3 v3.5.1 // indirect
k8s.io/api v0.31.1 // indirect
k8s.io/apiextensions-apiserver v0.31.1 // indirect
k8s.io/apimachinery v0.31.1 // indirect
k8s.io/apiserver v0.31.1 // indirect
k8s.io/cli-runtime v0.31.1 // indirect
k8s.io/client-go v0.31.1 // indirect
k8s.io/component-base v0.31.1 // indirect
k8s.io/api v0.34.3 // indirect
k8s.io/apiextensions-apiserver v0.33.3 // indirect
k8s.io/apimachinery v0.34.3 // indirect
k8s.io/apiserver v0.33.3 // indirect
k8s.io/cli-runtime v0.34.3 // indirect
k8s.io/client-go v0.34.3 // indirect
k8s.io/component-base v0.34.3 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
k8s.io/kubectl v0.31.1 // indirect
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect
mvdan.cc/xurls/v2 v2.2.0 // indirect
oras.land/oras-go v1.2.5 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/kustomize/api v0.18.0 // indirect
sigs.k8s.io/kustomize/cmd/config v0.15.0 // indirect
sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
oras.land/oras-go/v2 v2.6.0 // indirect
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/kustomize/api v0.20.1 // indirect
sigs.k8s.io/kustomize/cmd/config v0.20.1 // indirect
sigs.k8s.io/kustomize/kyaml v0.20.1 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
)

543
go.sum
View File

@@ -1,17 +1,17 @@
cuelabs.dev/go/oci/ociregistry v0.0.0-20241125120445-2c00c104c6e1 h1:mRwydyTyhtRX2wXS3mqYWzR2qlv6KsmoKXmlz5vInjg=
cuelabs.dev/go/oci/ociregistry v0.0.0-20241125120445-2c00c104c6e1/go.mod h1:5A4xfTzHTXfeVJBU6RAUf+QrlfTCW+017q/QiW+sMLg=
cuelang.org/go v0.12.0 h1:q4W5I+RtDIA27rslQyyt6sWkXX0YS9qm43+U1/3e0kU=
cuelang.org/go v0.12.0/go.mod h1:B4+kjvGGQnbkz+GuAv1dq/R308gTkp0sO28FdMrJ2Kw=
cuelabs.dev/go/oci/ociregistry v0.0.0-20250722084951-074d06050084 h1:4k1yAtPvZJZQTu8DRY8muBo0LHv6TqtrE0AO5n6IPYs=
cuelabs.dev/go/oci/ociregistry v0.0.0-20250722084951-074d06050084/go.mod h1:4WWeZNxUO1vRoZWAHIG0KZOd6dA25ypyWuwD3ti0Tdc=
cuelang.org/go v0.15.1 h1:MRnjc/KJE+K42rnJ3a+425f1jqXeOOgq9SK4tYRTtWw=
cuelang.org/go v0.15.1/go.mod h1:NYw6n4akZcTjA7QQwJ1/gqWrrhsN4aZwhcAL0jv9rZE=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
@@ -27,38 +27,25 @@ github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA4
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ=
github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU=
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE=
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
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/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70=
github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng=
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ=
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o=
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
@@ -67,64 +54,55 @@ github.com/cheggaaa/pb v2.0.7+incompatible/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeD
github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw=
github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA=
github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg=
github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc=
github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ=
github.com/containerd/containerd v1.7.23/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw=
github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM=
github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=
github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0=
github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4=
github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
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.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8=
github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM=
github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s=
github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc=
github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN6UX90KJc4HjyM=
github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/docker/cli v26.1.4+incompatible h1:I8PHdc0MtxEADqYJZvhBrW9bo8gawKwwenxRM7/rLu8=
github.com/docker/cli v26.1.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v27.0.0+incompatible h1:JRugTYuelmWlW0M3jakcIadDx2HUoUO6+Tf2C5jVfwA=
github.com/docker/docker v27.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4=
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.13.4 h1:myn1fyf8t7tAqIzV91Tj9qXpvyXXGXk8OS2H6IBSc9g=
github.com/emicklei/proto v1.13.4/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug=
github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64=
github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.14.2 h1:wJPxPy2Xifja9cEMrcA/g08art5+7CGJNFNk35iXC1I=
github.com/emicklei/proto v1.14.2/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls=
github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM=
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8=
github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
@@ -141,55 +119,47 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
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/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8=
github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4=
github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E=
github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw=
github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs=
github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/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-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU=
github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4=
github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE=
github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
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/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
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=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
@@ -198,51 +168,50 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k=
github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M=
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
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-20240622144329-c177fd99eaa9 h1:ouFdLLCOyCfnxGpQTMZKHLyHr/D1GFbQzEsJxumO16E=
github.com/google/pprof v0.0.0-20240622144329-c177fd99eaa9/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
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/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY=
github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw=
github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU=
github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4=
github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM=
github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
github.com/imdario/mergo v0.3.16/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/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
@@ -251,19 +220,14 @@ github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
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.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
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/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
@@ -309,7 +273,8 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 h1:NK3O7S5FRD/wj7ORQ5C3Mx1STpyEMuFe+/F0Lakd1Nk=
github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4/go.mod h1:FqD3ES5hx6zpzDainDaHgkTIqrPaI9uX4CVWqYZoQjY=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4=
@@ -322,28 +287,20 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8=
github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g=
github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU=
github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
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=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
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/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
@@ -356,25 +313,26 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/patrickdappollonio/kubectl-slice v1.4.2 h1:U1Jrma4BRK9D1Mbly8oP6uA06/gmOif6KjVQFrPUBzI=
github.com/patrickdappollonio/kubectl-slice v1.4.2/go.mod h1:gt3IidcTPeCcazqcMuXF51VWU5mGsQv6YlNpXxQvPsE=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -388,169 +346,173 @@ github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcF
github.com/princjef/mageutil v1.0.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs=
github.com/princjef/termdiff v0.1.0 h1:O3PWhfPFzX6GqzQ+41B3XzzJpMlx0+9Vysm+Pv76C9U=
github.com/princjef/termdiff v0.1.0/go.mod h1:JJOfCA/eR6T1JfsoxQQ6jsG3LGoQDoKUIRQrKqAO+p4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d h1:HWfigq7lB31IeJL8iy7jkUmU/PG1Sr8jVGhS749dbUA=
github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c=
github.com/protocolbuffers/txtpbfmt v0.0.0-20251016062345-16587c79cd91 h1:s1LvMaU6mVwoFtbxv/rCZKE7/fwDmDY684FfUe4c1Io=
github.com/protocolbuffers/txtpbfmt v0.0.0-20251016062345-16587c79cd91/go.mod h1:JSbkp0BviKovYYt9XunS95M3mLPibE9bGg+Y95DsEEY=
github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho=
github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U=
github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc=
github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=
github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM=
github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.13.2-0.20241226121412-a5dc8ff20d0a h1:w3tdWGKbLGBPtR/8/oO74W6hmz0qE5q0z9aqSAewaaM=
github.com/rogpeppe/go-internal v1.13.2-0.20241226121412-a5dc8ff20d0a/go.mod h1:S8kfXMp+yh77OxPD4fdM6YUknrZpQxLhvxzS4gDHENY=
github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI=
github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rubenv/sql-migrate v1.8.0 h1:dXnYiJk9k3wetp7GfQbKJcPHjVJL6YK19tKj8t2Ns0o=
github.com/rubenv/sql-migrate v1.8.0/go.mod h1:F2bGFBwCU+pnmbtNYDeKvSuvL6lBVtXDXUUv5t+u1qw=
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/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ=
github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
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/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/tetratelabs/wazero v1.6.0 h1:z0H1iikCdP8t+q341xqepY4EWvHEw8Es7tlqiVzlP3g=
github.com/tetratelabs/wazero v1.6.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A=
github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I=
github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM=
github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
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=
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI=
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE=
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY=
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w=
go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk=
go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4=
go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI=
go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU=
go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0 h1:CHXNXwfKWfzS65yrlB2PVds1IBZcdsX8Vepy9of0iRU=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0/go.mod h1:zKU4zUgKiaRxrdovSS2amdM5gOc59slmo/zJwGX+YBg=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s=
go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk=
go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8=
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs=
go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo=
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
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.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-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.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY=
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI=
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
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/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY=
golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -568,62 +530,49 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
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.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
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=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950=
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I=
google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA=
google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -646,57 +595,55 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/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=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
helm.sh/helm/v3 v3.16.3 h1:kb8bSxMeRJ+knsK/ovvlaVPfdis0X3/ZhYCSFRP+YmY=
helm.sh/helm/v3 v3.16.3/go.mod h1:zeVWGDR4JJgiRbT3AnNsjYaX8OTJlIE9zC+Q7F7iUSU=
k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU=
k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI=
k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40=
k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ=
k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U=
k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
k8s.io/apiserver v0.31.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c=
k8s.io/apiserver v0.31.1/go.mod h1:lzDhpeToamVZJmmFlaLwdYZwd7zB+WYRYIboqA1kGxM=
k8s.io/cli-runtime v0.31.1 h1:/ZmKhmZ6hNqDM+yf9s3Y4KEYakNXUn5sod2LWGGwCuk=
k8s.io/cli-runtime v0.31.1/go.mod h1:pKv1cDIaq7ehWGuXQ+A//1OIF+7DI+xudXtExMCbe9U=
k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0=
k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg=
k8s.io/component-base v0.31.1 h1:UpOepcrX3rQ3ab5NB6g5iP0tvsgJWzxTyAo20sgYSy8=
k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w=
helm.sh/helm/v3 v3.18.5 h1:Cc3Z5vd6kDrZq9wO9KxKLNEickiTho6/H/dBNRVSos4=
helm.sh/helm/v3 v3.18.5/go.mod h1:L/dXDR2r539oPlFP1PJqKAC1CUgqHJDLkxKpDGrWnyg=
k8s.io/api v0.34.3 h1:D12sTP257/jSH2vHV2EDYrb16bS7ULlHpdNdNhEw2S4=
k8s.io/api v0.34.3/go.mod h1:PyVQBF886Q5RSQZOim7DybQjAbVs8g7gwJNhGtY5MBk=
k8s.io/apiextensions-apiserver v0.33.3 h1:qmOcAHN6DjfD0v9kxL5udB27SRP6SG/MTopmge3MwEs=
k8s.io/apiextensions-apiserver v0.33.3/go.mod h1:oROuctgo27mUsyp9+Obahos6CWcMISSAPzQ77CAQGz8=
k8s.io/apimachinery v0.34.3 h1:/TB+SFEiQvN9HPldtlWOTp0hWbJ+fjU+wkxysf/aQnE=
k8s.io/apimachinery v0.34.3/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4=
k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E=
k8s.io/cli-runtime v0.34.3 h1:YRyMhiwX0dT9lmG0AtZDaeG33Nkxgt9OlCTZhRXj9SI=
k8s.io/cli-runtime v0.34.3/go.mod h1:GVwL1L5uaGEgM7eGeKjaTG2j3u134JgG4dAI6jQKhMc=
k8s.io/client-go v0.34.3 h1:wtYtpzy/OPNYf7WyNBTj3iUA0XaBHVqhv4Iv3tbrF5A=
k8s.io/client-go v0.34.3/go.mod h1:OxxeYagaP9Kdf78UrKLa3YZixMCfP6bgPwPwNBQBzpM=
k8s.io/component-base v0.34.3 h1:zsEgw6ELqK0XncCQomgO9DpUIzlrYuZYA0Cgo+JWpVk=
k8s.io/component-base v0.34.3/go.mod h1:5iIlD8wPfWE/xSHTRfbjuvUul2WZbI2nOUK65XL0E/c=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
k8s.io/kubectl v0.31.1 h1:ih4JQJHxsEggFqDJEHSOdJ69ZxZftgeZvYo7M/cpp24=
k8s.io/kubectl v0.31.1/go.mod h1:aNuQoR43W6MLAtXQ/Bu4GDmoHlbhHKuyD49lmTC8eJM=
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
k8s.io/kubectl v0.34.3 h1:vpM6//153gh5gvsYHXWHVJ4l4xmN5QFwTSmlfd8icm8=
k8s.io/kubectl v0.34.3/go.mod h1:zZQHtIZoUqTP1bAnPzq/3W1jfc0NeOeunFgcswrfg1c=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A=
mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8=
oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo=
oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
sigs.k8s.io/kustomize/cmd/config v0.15.0 h1:WkdY8V2+8J+W00YbImXa2ke9oegfrHH79e+kywW7EdU=
sigs.k8s.io/kustomize/cmd/config v0.15.0/go.mod h1:Jq57b0nPaoYUlOqg//0JtAh6iibboqMcfbtCYoWPM00=
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 h1:o1mtt6vpxsxDYaZKrw3BnEtc+pAjLz7UffnIvHNbvW0=
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0/go.mod h1:AeFCmgCrXzmvjWWaeZCyBp6XzG1Y0w1svYus8GhJEOE=
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc=
oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o=
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/kustomize/api v0.20.1 h1:iWP1Ydh3/lmldBnH/S5RXgT98vWYMaTUL1ADcr+Sv7I=
sigs.k8s.io/kustomize/api v0.20.1/go.mod h1:t6hUFxO+Ph0VxIk1sKp1WS0dOjbPCtLJ4p8aADLwqjM=
sigs.k8s.io/kustomize/cmd/config v0.20.1 h1:4APUORmZe2BYrsqgGfEKdd/r7gM6i43egLrUzilpiFo=
sigs.k8s.io/kustomize/cmd/config v0.20.1/go.mod h1:R7rQ8kxknVlXWVUIbxWtMgu8DCCNVtl8V0KrmeVd/KE=
sigs.k8s.io/kustomize/kustomize/v5 v5.7.1 h1:sYJsarwy/SDJfjjLMUqwFDGPwzUtMOQ1i1Ed49+XSbw=
sigs.k8s.io/kustomize/kustomize/v5 v5.7.1/go.mod h1:+5/SrBcJ4agx1SJknGuR/c9thwRSKLxnKoI5BzXFaLU=
sigs.k8s.io/kustomize/kyaml v0.20.1 h1:PCMnA2mrVbRP3NIB6v9kYCAc38uvFLVs8j/CD567A78=
sigs.k8s.io/kustomize/kyaml v0.20.1/go.mod h1:0EmkQHRUsJxY8Ug9Niig1pUMSCGHxQ5RklbpV/Ri6po=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=

View File

@@ -13,7 +13,7 @@ func New(name string) *cobra.Command {
cmd := &cobra.Command{
Use: name,
Short: name,
Version: version.Version,
Version: version.GetVersion(),
Args: cobra.NoArgs,
CompletionOptions: cobra.CompletionOptions{
HiddenDefaultCmd: true,

70
internal/cli/compare.go Normal file
View File

@@ -0,0 +1,70 @@
package cli
import (
"github.com/holos-run/holos/internal/compare"
"github.com/holos-run/holos/internal/errors"
"github.com/spf13/cobra"
)
// New for the compare command.
func NewCompareCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "compare",
Short: "Compare Holos resources",
Long: "Compare Holos resources to verify semantic equivalence",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) > 0 {
return errors.Format("unknown command %q for %q", args[0], cmd.CommandPath())
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
return cmd.Help()
},
}
cmd.AddCommand(NewCompareBuildPlansCmd())
cmd.AddCommand(NewCompareYAMLCmd())
return cmd
}
// New for the compare buildplans subcommand.
func NewCompareBuildPlansCmd() *cobra.Command {
var backwardsCompatible bool
cmd := &cobra.Command{
Use: "buildplans [file1] [file2]",
Short: "Compare two BuildPlan files",
Long: "Compare two BuildPlan files to verify they are semantically equivalent",
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
c := compare.New()
return c.BuildPlans(args[0], args[1], backwardsCompatible)
},
}
cmd.Flags().BoolVar(&backwardsCompatible, "backwards-compatible", false, "Enable backwards compatibility mode where file2 may have fields missing from file1")
return cmd
}
// New for the compare yaml subcommand.
func NewCompareYAMLCmd() *cobra.Command {
var backwardsCompatible bool
cmd := &cobra.Command{
Use: "yaml [file1] [file2]",
Short: "Compare two yaml object streams",
Long: "Compare two yaml object streams to verify they are structurally equivalent",
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
c := compare.New()
// TODO(jeff): Add a YAML() function.
return c.BuildPlans(args[0], args[1], backwardsCompatible)
},
}
cmd.Flags().BoolVar(&backwardsCompatible, "backwards-compatible", false, "Enable backwards compatibility mode where file2 may have fields missing from file1")
return cmd
}

27
internal/cli/compile.go Normal file
View File

@@ -0,0 +1,27 @@
package cli
import (
_ "embed"
"github.com/holos-run/holos/internal/cli/command"
"github.com/holos-run/holos/internal/compile"
"github.com/holos-run/holos/internal/errors"
"github.com/spf13/cobra"
)
//go:embed compile.txt
var compileLong string
// NewCompileCmd returns a new compile command.
func NewCompileCmd() *cobra.Command {
cmd := command.New("compile")
cmd.Short = "Compile Components (stdin) to BuildPlans (stdout) using CUE"
cmd.Long = compileLong
cmd.Args = cobra.NoArgs
cmd.RunE = func(cmd *cobra.Command, args []string) error {
c := compile.New()
ctx := cmd.Root().Context()
return errors.Wrap(c.Run(ctx))
}
return cmd
}

17
internal/cli/compile.txt Normal file
View File

@@ -0,0 +1,17 @@
Reads a stream of JSON-encoded Component objects from standard input. For each
Component, builds a CUE instance then exports a BuildPlan. Each resulting
BuildPlan is written as a JSON-encoded object to standard output.
This command encapsulates cue export for concurrent use. It may be used directly
by piping the output of holos show platform through jq to select the components
list, then to stdin of this command. This command is most often invoked 'holos
render platform' to run concurrent cue exports safely.
For example:
holos show platform --format=json \
| jq '.spec.components[] | {kind: "Component", apiVersion: "v1alpha6", component: .}' \
| holos compile --log-level=debug
Note each platform components element is embedded into the component field of an
enveloping object for the purpose of conveying type metadata.

View File

@@ -61,6 +61,8 @@ func (r *renderPlatform) Run(ctx context.Context, p *platform.Platform) error {
args := make([]string, 0, 100)
args = append(args, prefixArgs...)
args = append(args, "render", "component")
// Add the write-to flag
args = append(args, "--write-to", r.pcfg.WriteTo)
// holos render platform --inject tags
for _, tag := range r.pcfg.TagMap.Tags() {
args = append(args, "--inject", tag)

View File

@@ -17,6 +17,7 @@ import (
"github.com/holos-run/holos/internal/cli/command"
"github.com/holos-run/holos/internal/cli/render"
"github.com/holos-run/holos/internal/cli/slice"
"github.com/holos-run/holos/internal/cli/txtar"
cueCmd "cuelang.org/go/cmd/cue/cmd"
@@ -76,6 +77,15 @@ func New(cfg *holos.Config) *cobra.Command {
// Show
rootCmd.AddCommand(NewShowCmd(platform.NewConfig()))
// Compare
rootCmd.AddCommand(NewCompareCmd())
// Compile
rootCmd.AddCommand(NewCompileCmd())
// Slice - https://github.com/patrickdappollonio/kubectl-slice
rootCmd.AddCommand(slice.NewKubectlSliceCmd())
return rootCmd
}
@@ -107,9 +117,9 @@ func HandleError(ctx context.Context, err error, hc *holos.Config) (exitCode int
if errors.As(err, &errAt) {
loc := errAt.Source.Loc()
err2 := errAt.Unwrap()
log.ErrorContext(ctx, fmt.Sprintf("could not run: %s at %s", err2, loc), "err", err2, "loc", loc)
log.ErrorContext(ctx, fmt.Sprintf("error at %s: %s", loc, err2), "err", err2, "loc", loc)
} else {
log.ErrorContext(ctx, fmt.Sprintf("could not run: %s", err), "err", err)
log.ErrorContext(ctx, err.Error(), "err", err)
}
// cue errors are bundled up as a list and refer to multiple files / lines.

View File

@@ -3,10 +3,15 @@ package cli
import (
"context"
_ "embed"
"encoding/json"
"fmt"
"io"
"log/slog"
v1alpha5 "github.com/holos-run/holos/api/core/v1alpha5"
v1alpha6 "github.com/holos-run/holos/api/core/v1alpha6"
"github.com/holos-run/holos/internal/cli/command"
"github.com/holos-run/holos/internal/component"
"github.com/holos-run/holos/internal/compile"
"github.com/holos-run/holos/internal/errors"
"github.com/holos-run/holos/internal/holos"
"github.com/holos-run/holos/internal/platform"
@@ -77,37 +82,62 @@ func (s *showBuildPlans) flagSet() *pflag.FlagSet {
}
func (s *showBuildPlans) Run(ctx context.Context, p *platform.Platform) error {
encoder, err := holos.NewSequentialEncoder(s.format, s.cfg.Stdout)
components := p.Select(s.cfg.ComponentSelectors...)
reqs := make([]compile.BuildPlanRequest, len(components))
for idx, c := range components {
tags, err := c.Tags()
if err != nil {
return errors.Wrap(err)
}
reqs[idx] = compile.BuildPlanRequest{
APIVersion: "v1alpha6",
Kind: "BuildPlanRequest",
Root: p.Root(),
Leaf: c.Path(),
WriteTo: s.cfg.WriteTo,
TempDir: "${TMPDIR_PLACEHOLDER}",
Tags: tags,
}
}
resp, err := compile.Compile(ctx, s.cfg.Concurrency, reqs)
if err != nil {
return errors.Wrap(err)
}
defer encoder.Close()
opts := platform.BuildOpts{
PerComponentFunc: func(ctx context.Context, idx int, pc holos.Component) error {
c := component.New(p.Root(), pc.Path(), component.NewConfig())
tm, err := c.TypeMeta()
if err != nil {
return errors.Wrap(err)
}
opts := holos.NewBuildOpts(p.Root(), pc.Path(), s.cfg.WriteTo, "${TMPDIR_PLACEHOLDER}")
// TODO(jjm): refactor into [holos.NewBuildOpts] as functional options.
// Component name, label, annotations passed via tags to cue.
tags, err := pc.Tags()
if err != nil {
return errors.Wrap(err)
}
opts.Tags = tags
bp, err := c.BuildPlan(tm, opts)
if err != nil {
return errors.Wrap(err)
}
// Export the build plan using the sequential encoder.
return errors.Wrap(bp.Export(idx, encoder))
},
encoder, err := holos.NewEncoder(s.format, s.cfg.Stdout)
if err != nil {
return errors.Wrap(err)
}
return errors.Wrap(p.Build(ctx, opts))
for _, buildPlanResponse := range resp {
var tm holos.TypeMeta
if err := json.Unmarshal(buildPlanResponse.RawMessage, &tm); err != nil {
return errors.Format("could not discriminate type meta: %w", err)
}
if tm.Kind != "BuildPlan" {
return errors.Format("invalid kind %s: must be BuildPlan", tm.Kind)
}
var buildPlan any
switch tm.APIVersion {
case "v1alpha5":
buildPlan = &v1alpha5.BuildPlan{}
case "v1alpha6":
buildPlan = &v1alpha6.BuildPlan{}
default:
slog.WarnContext(ctx, fmt.Sprintf("unknown BuildPlan APIVersion %s: assuming v1alpha6 schema", tm.APIVersion))
buildPlan = &v1alpha6.BuildPlan{}
}
if err := json.Unmarshal(buildPlanResponse.RawMessage, buildPlan); err != nil {
return errors.Wrap(err)
}
if err := encoder.Encode(buildPlan); err != nil {
return errors.Wrap(err)
}
}
return nil
}

View File

@@ -81,7 +81,8 @@ func TestShowAlpha6(t *testing.T) {
err = yaml.Unmarshal(wantBytes, &want)
require.NoError(t, err)
want.BuildContext.RootDir = tempDir
want.BuildContext.HolosExecutable = "holos"
want.BuildContext.HolosExecutable, err = util.Executable()
require.NoError(t, err)
want.BuildContext.LeafDir = "fixtures/v1alpha6/components/slice"
t.Run("FormatYAML", func(t *testing.T) {

22
internal/cli/slice/doc.go Normal file
View File

@@ -0,0 +1,22 @@
// MIT License
// Copyright (c) 2021 Patrick D'appollonio
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
package slice

212
internal/cli/slice/slice.go Normal file
View File

@@ -0,0 +1,212 @@
package slice
import (
"bytes"
"fmt"
"os"
"strings"
"github.com/patrickdappollonio/kubectl-slice/slice"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)
var version = "development"
const (
helpShort = "kubectl-slice allows you to split a YAML into multiple subfiles using a pattern."
helpLong = `kubectl-slice allows you to split a YAML into multiple subfiles using a pattern.
For documentation, available functions, and more, visit: https://github.com/patrickdappollonio/kubectl-slice.`
)
var examples = []string{
"kubectl-slice -f foo.yaml -o ./ --include-kind Pod,Namespace",
"kubectl-slice -f foo.yaml -o ./ --exclude-kind Pod",
"kubectl-slice -f foo.yaml -o ./ --exclude-name *-svc",
"kubectl-slice -f foo.yaml --exclude-name *-svc --stdout",
"kubectl-slice -f foo.yaml --include Pod/* --stdout",
"kubectl-slice -f foo.yaml --exclude deployment/kube* --stdout",
"kubectl-slice -d ./ --recurse -o ./ --include-kind Pod,Namespace",
"kubectl-slice -d ./ --recurse --stdout --include Pod/*",
"kubectl-slice --config config.yaml",
}
func generateExamples([]string) string {
var s bytes.Buffer
for pos, v := range examples {
s.WriteString(fmt.Sprintf(" %s", v))
if pos != len(examples)-1 {
s.WriteString("\n")
}
}
return s.String()
}
func NewKubectlSliceCmd() *cobra.Command {
opts := slice.Options{}
var configFile string
rootCommand := &cobra.Command{
Use: "kubectl-slice",
Short: helpShort,
Long: helpLong,
Version: version,
SilenceUsage: true,
SilenceErrors: true,
Example: generateExamples(examples),
PreRunE: func(cmd *cobra.Command, args []string) error {
return bindCobraAndViper(cmd, configFile)
},
RunE: func(cmd *cobra.Command, args []string) error {
// Bind to the appropriate stdout/stderr
opts.Stdout = cmd.OutOrStdout()
opts.Stderr = cmd.ErrOrStderr()
// If no input file has been provided or it's "-", then
// point the app to stdin
if (opts.InputFile == "" || opts.InputFile == "-") && opts.InputFolder == "" {
opts.InputFile = os.Stdin.Name()
// Check if we're receiving data from the terminal
// or from piped content. Users from piped content
// won't see this message. Users that might have forgotten
// setting the flags correctly will see this message.
if !opts.Quiet {
if fi, err := os.Stdin.Stat(); err == nil && fi.Mode()&os.ModeNamedPipe == 0 {
fmt.Fprintln(opts.Stderr, "Receiving data from the terminal. Press CTRL+D when you're done typing or CTRL+C")
fmt.Fprintln(opts.Stderr, "to exit without processing the content. If you're seeing this by mistake, make")
fmt.Fprintln(opts.Stderr, "sure the command line flags, environment variables or config file are correct.")
}
}
}
// Create a new instance. This will also perform a basic validation.
instance, err := slice.New(opts)
if err != nil {
return fmt.Errorf("validation failed: %w", err)
}
return instance.Execute()
},
}
rootCommand.Flags().StringVarP(&opts.InputFile, "input-file", "f", "", "the input file used to read the initial macro YAML file; if empty or \"-\", stdin is used (exclusive with --input-folder)")
rootCommand.Flags().StringVarP(&opts.InputFolder, "input-folder", "d", "", "the input folder used to read the initial macro YAML files (exclusive with --input-file)")
rootCommand.Flags().StringSliceVar(&opts.InputFolderExt, "extensions", []string{".yaml", ".yml"}, "the extensions to look for in the input folder")
rootCommand.Flags().BoolVarP(&opts.Recurse, "recurse", "r", false, "if true, the input folder will be read recursively (has no effect unless used with --input-folder)")
rootCommand.Flags().StringVarP(&opts.OutputDirectory, "output-dir", "o", "", "the output directory used to output the splitted files")
rootCommand.Flags().StringVarP(&opts.GoTemplate, "template", "t", slice.DefaultTemplateName, "go template used to generate the file name when creating the resource files in the output directory")
rootCommand.Flags().BoolVar(&opts.DryRun, "dry-run", false, "if true, no files are created, but the potentially generated files will be printed as the command output")
rootCommand.Flags().BoolVar(&opts.DebugMode, "debug", false, "enable debug mode")
rootCommand.Flags().BoolVarP(&opts.Quiet, "quiet", "q", false, "if true, no output is written to stdout/err")
rootCommand.Flags().StringSliceVar(&opts.IncludedKinds, "include-kind", nil, "resource kind to include in the output (singular, case insensitive, glob supported)")
rootCommand.Flags().StringSliceVar(&opts.ExcludedKinds, "exclude-kind", nil, "resource kind to exclude in the output (singular, case insensitive, glob supported)")
rootCommand.Flags().StringSliceVar(&opts.IncludedNames, "include-name", nil, "resource name to include in the output (singular, case insensitive, glob supported)")
rootCommand.Flags().StringSliceVar(&opts.ExcludedNames, "exclude-name", nil, "resource name to exclude in the output (singular, case insensitive, glob supported)")
rootCommand.Flags().StringSliceVar(&opts.Included, "include", nil, "resource name to include in the output (format <kind>/<name>, case insensitive, glob supported)")
rootCommand.Flags().StringSliceVar(&opts.Excluded, "exclude", nil, "resource name to exclude in the output (format <kind>/<name>, case insensitive, glob supported)")
rootCommand.Flags().BoolVarP(&opts.StrictKubernetes, "skip-non-k8s", "s", false, "if enabled, any YAMLs that don't contain at least an \"apiVersion\", \"kind\" and \"metadata.name\" will be excluded from the split")
rootCommand.Flags().BoolVar(&opts.SortByKind, "sort-by-kind", false, "if enabled, resources are sorted by Kind, a la Helm, before saving them to disk")
rootCommand.Flags().BoolVar(&opts.OutputToStdout, "stdout", false, "if enabled, no resource is written to disk and all resources are printed to stdout instead")
rootCommand.Flags().StringVarP(&configFile, "config", "c", "", "path to the config file")
rootCommand.Flags().BoolVar(&opts.AllowEmptyKinds, "allow-empty-kinds", false, "if enabled, resources with empty kinds don't produce an error when filtering")
rootCommand.Flags().BoolVar(&opts.AllowEmptyNames, "allow-empty-names", false, "if enabled, resources with empty names don't produce an error when filtering")
rootCommand.Flags().BoolVar(&opts.IncludeTripleDash, "include-triple-dash", false, "if enabled, the typical \"---\" YAML separator is included at the beginning of resources sliced")
rootCommand.Flags().BoolVar(&opts.PruneOutputDir, "prune", false, "if enabled, the output directory will be pruned before writing the files")
rootCommand.Flags().BoolVar(&opts.RemoveFileComments, "remove-comments", false, "if enabled, comments generated by the app are removed from the sliced files (but keep comments from the original file)")
rootCommand.Flags().StringSliceVar(&opts.IncludedGroups, "include-group", nil, "resource kind to include in the output (singular, case insensitive, glob supported)")
rootCommand.Flags().StringSliceVar(&opts.ExcludedGroups, "exclude-group", nil, "resource kind to exclude in the output (singular, case insensitive, glob supported)")
_ = rootCommand.Flags().MarkHidden("debug")
return rootCommand
}
// envVarPrefix is the prefix used for environment variables.
// Using underscores to ensure compatibility with the shell.
const envVarPrefix = "KUBECTL_SLICE"
// skippedFlags is a list of flags that are not bound through
// Viper. These include things like "help", "version", and of
// course, "config", since it doesn't make sense to say where
// the config file is located in the config file itself.
var skippedFlags = [...]string{
"help",
"version",
"config",
}
// bindCobraAndViper binds the settings loaded by Viper
// to the flags defined in Cobra.
func bindCobraAndViper(cmd *cobra.Command, configFileLocation string) error {
v := viper.New()
// If a configuration file has been passed...
if cmd.Flags().Lookup("config").Changed {
// ... then set it as the configuration file
v.SetConfigFile(configFileLocation)
// then read the configuration file
if err := v.ReadInConfig(); err != nil {
return fmt.Errorf("failed to read configuration file: %w", err)
}
}
// Handler for potential error
var err error
// Recurse through all the variables
cmd.Flags().VisitAll(func(flag *pflag.Flag) {
// Skip the flags that are not bound through Viper
for _, v := range skippedFlags {
if v == flag.Name {
return
}
}
// Normalize key names with underscores instead of dashes
nameUnderscored := strings.ReplaceAll(flag.Name, "-", "_")
envVarName := strings.ToUpper(fmt.Sprintf("%s_%s", envVarPrefix, nameUnderscored))
// Bind the flag to the environment variable
if val, found := os.LookupEnv(envVarName); found {
v.Set(nameUnderscored, val)
}
// If the CLI flag hasn't been changed, but the value is set in
// the configuration file, then set the CLI flag to the value
// from the configuration file
if !flag.Changed && v.IsSet(nameUnderscored) {
// Type check for all the supported types
switch val := v.Get(nameUnderscored).(type) {
case string:
_ = cmd.Flags().Set(flag.Name, val)
case []interface{}:
var stringified []string
for _, v := range val {
stringified = append(stringified, fmt.Sprintf("%v", v))
}
_ = cmd.Flags().Set(flag.Name, strings.Join(stringified, ","))
case bool:
_ = cmd.Flags().Set(flag.Name, fmt.Sprintf("%t", val))
case int:
_ = cmd.Flags().Set(flag.Name, fmt.Sprintf("%d", val))
default:
err = fmt.Errorf("unsupported type %T for flag %q", val, nameUnderscored)
return
}
}
})
// If an error occurred, return it
return err
}

401
internal/compare/compare.go Normal file
View File

@@ -0,0 +1,401 @@
package compare
import (
"bytes"
"io"
"os"
"sort"
"strings"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/holos-run/holos/internal/errors"
"gopkg.in/yaml.v3"
)
// Comparer handles comparison operations between BuildPlans
type Comparer struct {
}
// New creates a new Comparer instance
func New() *Comparer {
return &Comparer{}
}
// BuildPlans compares two BuildPlan Files for semantic equivalence.
//
// The holos show buildplans command writes a BuildPlan File to standard output.
// A BuildPlan File is a yaml encoded stream of BuildPlan objects.
//
// BuildPlan File one is equivalent to two when:
// 1. one and two have an equal number of BuildPlan objects.
// 2. each object in one is equivalent to exactly one unique object in two.
//
// Two BuildPlans, before and after, are equivalent when:
//
// 1. All field values in before are equivalent to the same field in after
// 2. Both 1 and 2 apply to nested objects, recursively.
// 3. Field f is equivalent when before.f exactly equals after.f, except for:
// 3.1. Objects in the spec.artifacts list may appear in any arbitrary order.
// 3.2. The ordering of keys does not matter.
// 4. Backwards compatibility behavior (controlled by isBackwardsCompatible):
// - When false: after and before must have exactly the same fields
// - When true: after may have additional fields that don't exist in before
// (e.g., new features added in a newer version)
// Example:
// before has {name: "x", version: "1.0"}
// after has {name: "x", version: "1.0", newFeature: "enabled"}
// This comparison passes when isBackwardsCompatible=true
// 5. Fields in before must always be present in after (regardless of backwards
// compatibility mode).
// 6. List type fields with a null value are equivalent to:
// 6.1. null values
// 6.2. empty values ([])
// 6.2. a missing field
//
// A BuildPlan File is valid when:
// 1. Two or more identical objects exist in the same file. They must be
// treated as unique objects when comparing BuildPlan Files
// 2. Two objects may have the same value for the metadata.name field.
// 3. The kind field of all objects in the file stream is "BuildPlan"
func (c *Comparer) BuildPlans(one, two string, isBackwardsCompatible bool) error {
// Read both files
file1, err := os.Open(one)
if err != nil {
return errors.Format("opening first file: %w", err)
}
defer file1.Close()
file2, err := os.Open(two)
if err != nil {
return errors.Format("opening second file: %w", err)
}
defer file2.Close()
// Read all content from both files
content1, err := io.ReadAll(file1)
if err != nil {
return errors.Format("reading first file: %w", err)
}
content2, err := io.ReadAll(file2)
if err != nil {
return errors.Format("reading second file: %w", err)
}
// Handle empty files case
if len(content1) == 0 && len(content2) == 0 {
return errors.NotImplemented()
}
// Parse YAML streams (multiple documents)
docs1, err := parseYAMLStream(content1)
if err != nil {
return errors.Format("parsing first file: %w", err)
}
docs2, err := parseYAMLStream(content2)
if err != nil {
return errors.Format("parsing second file: %w", err)
}
// Compare the document lists
return c.compareDocumentLists(docs1, docs2, isBackwardsCompatible)
}
// normalizeStructure processes a structure to handle null, empty, and missing fields
// according to the BuildPlan spec requirement 6
func (c *Comparer) normalizeStructure(v interface{}) interface{} {
switch val := v.(type) {
case map[string]interface{}:
normalized := make(map[string]interface{})
for k, v := range val {
normalizedValue := c.normalizeStructure(v)
// Only add fields that are not nil or empty slices
if !c.isNullOrEmpty(normalizedValue) {
normalized[k] = normalizedValue
}
}
return normalized
case []interface{}:
// Handle empty slices as nil
if len(val) == 0 {
return nil
}
normalized := make([]interface{}, len(val))
for i, v := range val {
normalized[i] = c.normalizeStructure(v)
}
return normalized
default:
return v
}
}
// isNullOrEmpty checks if a value is nil or an empty slice
func (c *Comparer) isNullOrEmpty(v interface{}) bool {
if v == nil {
return true
}
if slice, ok := v.([]interface{}); ok {
return len(slice) == 0
}
return false
}
// filterToCommonFields filters v1 to only include fields that exist in v2
// This is used for backwards compatibility to allow the "after" file to have extra fields
// that don't exist in the "before" file
func (c *Comparer) filterToCommonFields(v1, v2 interface{}) interface{} {
switch m1 := v1.(type) {
case map[string]interface{}:
m2, ok := v2.(map[string]interface{})
if !ok {
return v1
}
filtered := make(map[string]interface{})
for k, val1 := range m1 {
if val2, exists := m2[k]; exists {
filtered[k] = c.filterToCommonFields(val1, val2)
}
}
return filtered
case []interface{}:
slice2, ok := v2.([]interface{})
if !ok {
return v1
}
var filtered []interface{}
for i, elem1 := range m1 {
if i < len(slice2) {
filtered = append(filtered, c.filterToCommonFields(elem1, slice2[i]))
}
}
return filtered
default:
return v1
}
}
// compareStructures compares two BuildPlan structures for semantic equivalence
func (c *Comparer) compareStructures(bp1, bp2 map[string]interface{}, isBackwardsCompatible bool) error {
// Normalize the structures to handle null, empty, and missing fields
norm1 := c.normalizeStructure(bp1).(map[string]interface{})
norm2 := c.normalizeStructure(bp2).(map[string]interface{})
// If backwards compatible, remove fields from norm2 that don't exist in norm1
// This allows "after" to have extra fields that "before" doesn't have
if isBackwardsCompatible {
filtered := c.filterToCommonFields(norm2, norm1)
if m, ok := filtered.(map[string]interface{}); ok {
norm2 = m
}
}
// Create comparison options for go-cmp
opts := []cmp.Option{
cmpopts.EquateEmpty(),
cmp.Transformer("sortSlices", func(s []interface{}) []interface{} {
return c.sortSlice(s)
}),
}
// Deep order-independent comparison
if cmp.Equal(norm1, norm2, opts...) {
return nil
}
// Get the diff for the error message
diff := cmp.Diff(norm1, norm2, opts...)
// Extract specific field differences from the diff
fieldDiffs := c.extractFieldDifferences(diff)
// Return the extracted differences or the full diff
if fieldDiffs != "" {
return errors.New(fieldDiffs)
}
return errors.New(diff)
}
// sortSlice sorts a slice based on comparable string representation
func (c *Comparer) sortSlice(slice []interface{}) []interface{} {
sorted := make([]interface{}, len(slice))
copy(sorted, slice)
sort.Slice(sorted, func(i, j int) bool {
iStr := c.toComparableString(sorted[i])
jStr := c.toComparableString(sorted[j])
return iStr < jStr
})
return sorted
}
// toComparableString converts a value to a comparable string
func (c *Comparer) toComparableString(v interface{}) string {
switch val := v.(type) {
case map[string]interface{}:
// Try to get identifying fields
if artifact, ok := val["artifact"].(string); ok {
return artifact
}
if name, ok := val["name"].(string); ok {
return name
}
if metadata, ok := val["metadata"].(map[string]interface{}); ok {
if name, ok := metadata["name"].(string); ok {
return name
}
}
// Fallback to YAML representation
yamlBytes, _ := yaml.Marshal(val)
return string(yamlBytes)
default:
// Convert to YAML for comparison
yamlBytes, _ := yaml.Marshal(v)
return string(yamlBytes)
}
}
// parseYAMLStream parses a byte array containing one or more YAML documents
func parseYAMLStream(content []byte) ([]map[string]interface{}, error) {
var documents []map[string]interface{}
decoder := yaml.NewDecoder(bytes.NewReader(content))
for {
var doc map[string]interface{}
err := decoder.Decode(&doc)
if err == io.EOF {
break
}
if err != nil {
return nil, err
}
if doc != nil {
documents = append(documents, doc)
}
}
return documents, nil
}
// compareDocumentLists compares two lists of YAML documents
func (c *Comparer) compareDocumentLists(docs1, docs2 []map[string]interface{}, isBackwardsCompatible bool) error {
if len(docs1) != len(docs2) {
return errors.New("different number of documents")
}
// Create a bipartite matching between documents
used := make([]bool, len(docs2))
// First pass: try to find exact matches
for _, doc1 := range docs1 {
for j, doc2 := range docs2 {
if used[j] {
continue
}
// Check if documents are exactly equal
if c.documentsExactlyEqual(doc1, doc2) {
used[j] = true
break
}
}
}
// Second pass: handle unmatched documents
usedIdx := 0
for i, doc1 := range docs1 {
// Find if this document was matched in first pass
matchFound := false
for j, doc2 := range docs2 {
if used[j] && c.documentsExactlyEqual(doc1, doc2) {
matchFound = true
break
}
}
if !matchFound {
// Find the next unused document to compare against
for usedIdx < len(docs2) && used[usedIdx] {
usedIdx++
}
if usedIdx < len(docs2) {
// Compare structures
if err := c.compareStructures(doc1, docs2[usedIdx], isBackwardsCompatible); err != nil {
return errors.Format("document %d not equivalent: \n%w", i, err)
}
used[usedIdx] = true
}
}
}
return nil
}
// documentsExactlyEqual checks if two documents are exactly equal
func (c *Comparer) documentsExactlyEqual(doc1, doc2 map[string]interface{}) bool {
// Create comparison options for go-cmp
opts := []cmp.Option{
cmpopts.EquateEmpty(),
cmp.Transformer("sortSlices", func(s []interface{}) []interface{} {
return c.sortSlice(s)
}),
}
return cmp.Equal(doc1, doc2, opts...)
}
// extractFieldDifferences extracts specific field differences from a go-cmp diff
func (c *Comparer) extractFieldDifferences(diff string) string {
var differences []string
lines := strings.Split(diff, "\n")
for _, line := range lines {
// Look for lines that indicate field differences
trimmed := strings.TrimSpace(line)
// Handle lines with - or + prefixes
if strings.HasPrefix(trimmed, "-") || strings.HasPrefix(trimmed, "+") {
// Skip formatting markers
if strings.HasPrefix(trimmed, "---") || strings.HasPrefix(trimmed, "+++") {
continue
}
// Check if this is a field difference (contains a colon)
if strings.Contains(trimmed, ":") {
// Extract the field name and value
parts := strings.SplitN(trimmed[1:], ":", 2)
if len(parts) == 2 {
fieldName := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
// Clean up the field name (remove quotes if present)
fieldName = strings.Trim(fieldName, "\"")
value = strings.TrimSuffix(value, ",")
// Clean up value formatting
if strings.HasPrefix(value, "string(") {
value = strings.TrimPrefix(value, "string(")
value = strings.TrimSuffix(value, ")")
} else if strings.HasPrefix(value, "int(") {
value = strings.TrimPrefix(value, "int(")
value = strings.TrimSuffix(value, ")")
}
value = strings.Trim(value, "\"")
// Rebuild the difference line
prefix := trimmed[:1]
differences = append(differences, prefix+" "+fieldName+": "+value)
}
}
}
}
return strings.Join(differences, "\n")
}

View File

@@ -0,0 +1,88 @@
package compare
import (
"encoding/json"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
)
type testCase struct {
ExitCode int `json:"exitCode"`
Name string `json:"name,omitempty"`
Msg string `json:"msg,omitempty"`
File1 string `json:"file1"`
File2 string `json:"file2"`
ExpectedError string `json:"expectedError,omitempty"` // Deprecated: use ExpectedErrors
ExpectedErrors []string `json:"expectedErrors,omitempty"`
IsBackwardsCompatible *bool `json:"isBackwardsCompatible,omitempty"`
}
func TestBuildPlans(t *testing.T) {
fixturesDir := "testdata"
entries, err := os.ReadDir(fixturesDir)
if err != nil {
t.Fatalf("could not read fixtures directory: %v", err)
}
for _, entry := range entries {
if !entry.IsDir() {
continue
}
dirName := entry.Name()
t.Run(dirName, func(t *testing.T) {
testDir := filepath.Join(fixturesDir, dirName)
// Read the testcase.json file
testcaseData, err := os.ReadFile(filepath.Join(testDir, "testcase.json"))
if err != nil {
t.Fatalf("could not read testcase.json: %v", err)
}
var tc testCase
if err := json.Unmarshal(testcaseData, &tc); err != nil {
t.Fatalf("could not parse testcase.json: %v", err)
}
// Use the test name if provided, otherwise use directory name
testName := dirName
if tc.Name != "" {
testName = tc.Name
}
// Run the test with the appropriate name
t.Run(testName, func(t *testing.T) {
// Build the full file paths
file1Path := filepath.Join(testDir, tc.File1)
file2Path := filepath.Join(testDir, tc.File2)
// Create a new comparer and run the comparison
c := New()
// Use isBackwardsCompatible from test case if provided, default to false
isBackwardsCompatible := false
if tc.IsBackwardsCompatible != nil {
isBackwardsCompatible = *tc.IsBackwardsCompatible
}
err := c.BuildPlans(file1Path, file2Path, isBackwardsCompatible)
// Check the result based on expected exit code
if tc.ExitCode == 0 {
assert.NoError(t, err, tc.Msg)
} else {
assert.Error(t, err, tc.Msg)
// Support both old expectedError and new expectedErrors
if tc.ExpectedError != "" {
assert.ErrorContains(t, err, tc.ExpectedError, tc.Msg)
}
// Check each expected error substring
for _, expectedErr := range tc.ExpectedErrors {
assert.ErrorContains(t, err, expectedErr, tc.Msg)
}
}
})
})
}
}

View File

@@ -0,0 +1,810 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
example.com/description: bar
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
example.com/description: bar
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,810 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
example.com/description: foo
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
example.com/description: bar
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,7 @@
{
"exitCode": 1,
"name": "DuplicatedAnnotationsInAfter",
"msg": "should not match when the same object is duplicated in after and differs only by an arbitrary deeply nested field in before, in this case an annotation",
"file1": "before.yaml",
"file2": "after.yaml"
}

View File

@@ -0,0 +1,24 @@
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
labels:
holos.run/component.name: component
holos.run/stack.name: demo
annotations:
holos.run/purpose: example
holos.run/environment: prod
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml
resources:
- name: deployment
namespace: default
transformers:
- kind: SetLabels
labels:
app: demo

View File

@@ -0,0 +1,17 @@
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
labels:
holos.run/component.name: component
# Missing holos.run/stack.name
# Missing annotations
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml
# Missing resources
# Missing transformers

View File

@@ -0,0 +1,9 @@
{
"exitCode": 0,
"name": "BuildPlan_4",
"msg": "BuildPlan spec 4: after may have fields missing from before if isBackwardsCompatible is true - should pass when before has missing fields and isBackwardsCompatible is true",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": [],
"isBackwardsCompatible": true
}

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 0,
"name": "FullBuildPlan",
"msg": "should match full build plans",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": []
}

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 0,
"name": "BuildPlan_3.1",
"msg": "BuildPlan spec 3.1: Objects in the spec.artifacts list may appear in any arbitrary order - should match when artifacts are reordered",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": []
}

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: not-httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 1,
"name": "FullBuildPlanDifferentLabelValues",
"msg": "should not match full build plans with out of order artifacts and different labels",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": ["holos.run/stack.name: not-httpbin"]
}

View File

@@ -0,0 +1,405 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
extra: not-in-before
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 1,
"name": "BeforeLabelsAreSubsetOfAfter",
"msg": "should not match when before labels are a subset of after labels",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": ["+ extra: not-in-before"]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
{
"exitCode": 0,
"name": "CompilerShouldMatch",
"msg": "output of the v1alpha6 compiler should match the v1alpha5 output",
"file1": "before.yaml",
"file2": "after.yaml"
}

View File

@@ -0,0 +1,7 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component1
spec:
artifacts:
- artifact: test.yaml

View File

@@ -0,0 +1,15 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component1
spec:
artifacts:
- artifact: test.yaml
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component2
spec:
artifacts:
- artifact: test2.yaml

View File

@@ -0,0 +1,8 @@
{
"exitCode": 1,
"name": "BuildPlanFile_1",
"msg": "BuildPlan File spec 1: one and two have an equal number of BuildPlan objects - should fail when count differs",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": ["different number of documents"]
}

Some files were not shown because too many files have changed in this diff Show More