mirror of https://github.com/kyverno/chainsaw.git
Compare commits
168 Commits
main
...
v0.2.5-rc.
Author | SHA1 | Date |
---|---|---|
|
6d5444a027 | |
|
216cd86837 | |
|
82b2504e93 | |
|
813e10e9fd | |
|
0805301f6a | |
|
99373ca197 | |
|
4b42a99474 | |
|
362749b645 | |
|
f6d484ed83 | |
|
60545e5b54 | |
|
55d5bb8ace | |
|
2c097c4087 | |
|
05ba99f6e6 | |
|
ee6520bf95 | |
|
0fdf5cddd9 | |
|
423692c22d | |
|
013ec08958 | |
|
ee8e1f1825 | |
|
7a241ad029 | |
|
4a82481aab | |
|
b305f4f348 | |
|
f1e9450194 | |
|
aed1f4307b | |
|
56f7b12c31 | |
|
558ab42ade | |
|
60623e67fc | |
|
093c9e37b0 | |
|
18d99b5e9f | |
|
fa19a76cf7 | |
|
9b05a247d5 | |
|
a27c25512a | |
|
a99022371b | |
|
e337ce6c77 | |
|
a215bb2ef4 | |
|
6f81e73441 | |
|
be87640044 | |
|
05aefe91df | |
|
a301cb7c9c | |
|
dc507c2315 | |
|
bac32f71fd | |
|
bcbff46a1e | |
|
94d92efe85 | |
|
ea600f38a7 | |
|
fd4609ddc6 | |
|
b70ab1e301 | |
|
27971133cb | |
|
26589f3206 | |
|
de919e9612 | |
|
07eb449842 | |
|
cf2c77e95c | |
|
20e426e34f | |
|
9ba295143d | |
|
64bd2fe1b7 | |
|
0514dc2d38 | |
|
693c0d9c16 | |
|
5e45e98ab0 | |
|
a5a8d5c53e | |
|
e0abec8381 | |
|
46d6e5e105 | |
|
bd0bba7ef5 | |
|
31c043659a | |
|
8fa8726974 | |
|
b53fbef960 | |
|
79749433c4 | |
|
082e83eb41 | |
|
a26c3f3cea | |
|
f17e00fd68 | |
|
231ea9a79c | |
|
fe176c0000 | |
|
f5eec08361 | |
|
13a0cf9082 | |
|
08787c49df | |
|
6a0605684f | |
|
0c62ea7eb1 | |
|
68c3faaaa7 | |
|
7431f1c37b | |
|
ce155eeae5 | |
|
42ee5aaa77 | |
|
8bd9b98394 | |
|
afcb015385 | |
|
bcfd85a2f0 | |
|
a5732f01bc | |
|
44b22d0e36 | |
|
6773dc8cd3 | |
|
8bed4698ac | |
|
1c5e38e88d | |
|
180ae170ee | |
|
eefb4482df | |
|
384132c04d | |
|
63c0b6a5d7 | |
|
78b71a0eef | |
|
e80ebb20a4 | |
|
feb61e03fa | |
|
38dc40a360 | |
|
1d4741a01c | |
|
35e0abe471 | |
|
56bf5af759 | |
|
fa6ba2e721 | |
|
99f37cadd2 | |
|
3679a1dd43 | |
|
02ec44faf9 | |
|
f3fd620429 | |
|
78a1d00f05 | |
|
f27c7756de | |
|
955eabef77 | |
|
9fabf9c33f | |
|
4fe68214e4 | |
|
f91cb71a43 | |
|
0b235f4851 | |
|
77ae277e86 | |
|
50e5a45b85 | |
|
90176eb538 | |
|
da759b6b2b | |
|
7771f24a27 | |
|
649f593f0a | |
|
119d34696b | |
|
9585468a14 | |
|
e968e662ba | |
|
ed0bdae4bc | |
|
0bae442d66 | |
|
7613418576 | |
|
010db9c13b | |
|
29ebd16a57 | |
|
f9065d761f | |
|
6db661cf41 | |
|
218e978bd4 | |
|
23a5913303 | |
|
efb3eb4ec0 | |
|
5449554481 | |
|
4915642163 | |
|
39adbf6274 | |
|
c8fad0663b | |
|
57d9440577 | |
|
6be49603ec | |
|
534afdaf90 | |
|
b70a6ce0c1 | |
|
fd0339b146 | |
|
584ecf7f7b | |
|
6b8c3bd757 | |
|
661554179e | |
|
6bb2b2e6e1 | |
|
c7a4964904 | |
|
596041226a | |
|
0734d549f5 | |
|
09792c70de | |
|
967bf17146 | |
|
8fb7732137 | |
|
f073726899 | |
|
6c60e5a3d9 | |
|
3c6932648d | |
|
7ff7ea7488 | |
|
ed0cc751fb | |
|
363b246e91 | |
|
48b069b499 | |
|
0ae5dd936f | |
|
dcc6d45e50 | |
|
97a925baf9 | |
|
037f62bdd8 | |
|
a6082dbe7d | |
|
fa8ddf5369 | |
|
1bf3caf7df | |
|
bd765c8fa9 | |
|
a38de0f688 | |
|
c4efea83f1 | |
|
382d7c6beb | |
|
931fd161d9 | |
|
453007813e | |
|
5a17bd4e96 |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -7,25 +7,28 @@ labels: ["bug", "triage"]
|
|||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please tell us about the bug.
|
||||
value: Please tell us about the bug.
|
||||
- type: dropdown
|
||||
id: chainsaw-version
|
||||
attributes:
|
||||
label: chainsaw version Version
|
||||
description: >-
|
||||
What version of the chainsaw are you running?
|
||||
description: What version of chainsaw are you running?
|
||||
options:
|
||||
- v0.1.0
|
||||
- v0.1.1
|
||||
- v0.1.2
|
||||
- v0.1.3
|
||||
- v0.1.4
|
||||
- v0.1.5
|
||||
- v0.1.6
|
||||
- v0.1.7
|
||||
- v0.1.8
|
||||
- v0.1.9
|
||||
- v0.2.4
|
||||
- v0.2.3
|
||||
- v0.2.2
|
||||
- v0.2.1
|
||||
- v0.2.0
|
||||
- v0.1.9
|
||||
- v0.1.8
|
||||
- v0.1.7
|
||||
- v0.1.6
|
||||
- v0.1.5
|
||||
- v0.1.4
|
||||
- v0.1.3
|
||||
- v0.1.2
|
||||
- v0.1.1
|
||||
- v0.1.0
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
|
|
@ -2,48 +2,49 @@
|
|||
|
||||
name: General Question
|
||||
description: Ask a question or need support
|
||||
title: "[Question] "
|
||||
labels: ["question"]
|
||||
|
||||
title: '[Question] '
|
||||
labels:
|
||||
- question
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: "Please answer these questions before submitting your issue. Thanks!"
|
||||
|
||||
value: Please answer these questions before submitting your issue. Thanks!
|
||||
- type: textarea
|
||||
id: describe-your-question
|
||||
attributes:
|
||||
label: Describe your question
|
||||
description: "Provide details about your question or the support needed."
|
||||
placeholder: "Type your question here..."
|
||||
description: Provide details about your question or the support needed.
|
||||
placeholder: Type your question here...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: chainsaw-version
|
||||
attributes:
|
||||
label: chainsaw version Version
|
||||
description: >-
|
||||
What version of the chainsaw are you running?
|
||||
description: What version of chainsaw are you running?
|
||||
options:
|
||||
- v0.1.0
|
||||
- v0.1.1
|
||||
- v0.1.2
|
||||
- v0.1.3
|
||||
- v0.1.4
|
||||
- v0.1.5
|
||||
- v0.1.6
|
||||
- v0.1.7
|
||||
- v0.1.8
|
||||
- v0.1.9
|
||||
- v0.2.4
|
||||
- v0.2.3
|
||||
- v0.2.2
|
||||
- v0.2.1
|
||||
- v0.2.0
|
||||
- v0.1.9
|
||||
- v0.1.8
|
||||
- v0.1.7
|
||||
- v0.1.6
|
||||
- v0.1.5
|
||||
- v0.1.4
|
||||
- v0.1.3
|
||||
- v0.1.2
|
||||
- v0.1.1
|
||||
- v0.1.0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional context
|
||||
description: "Add any other context or screenshots about the question here."
|
||||
placeholder: "Additional details..."
|
||||
description: Add any other context or screenshots about the question here.
|
||||
placeholder: Additional details...
|
||||
validations:
|
||||
required: false
|
||||
|
|
|
@ -8,22 +8,24 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
required:
|
||||
check-actions:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Ensure SHA pinned actions
|
||||
uses: zgosalvez/github-actions-ensure-sha-pinned-actions@19ebcb0babbd282ae1822a0b9c28f3f1f25cea45 # v3.0.4
|
||||
uses: zgosalvez/github-actions-ensure-sha-pinned-actions@74606c30450304eee8660aae751818321754feb1 # v3.0.9
|
||||
with:
|
||||
# slsa-github-generator requires using a semver tag for reusable workflows.
|
||||
# See: https://github.com/slsa-framework/slsa-github-generator#referencing-slsa-builders-and-generators
|
||||
|
|
|
@ -7,7 +7,14 @@ permissions: {}
|
|||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- 'main'
|
||||
- main
|
||||
- release-*
|
||||
types:
|
||||
- opened
|
||||
- demilestoned
|
||||
- milestoned
|
||||
- edited
|
||||
- synchronize
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
|
|
|
@ -8,22 +8,24 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
required:
|
||||
codegen-verify:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
cache-dependency-path: go.sum
|
||||
|
|
|
@ -8,26 +8,28 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
required:
|
||||
scan-trivy:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
security-events: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Run Trivy vulnerability scanner in repo mode
|
||||
uses: aquasecurity/trivy-action@d710430a6722f083d3b36b8339ff66b32f22ee55 # v0.19.0
|
||||
uses: aquasecurity/trivy-action@7c2007bcb556501da015201bcba5aa14069b74e2 # v0.23.0
|
||||
with:
|
||||
scan-type: fs
|
||||
ignore-unfixed: false
|
||||
|
@ -38,7 +40,7 @@ jobs:
|
|||
exit-code: '0'
|
||||
vuln-type: os,library
|
||||
- name: Upload Trivy scan results to GitHub Security tab
|
||||
uses: github/codeql-action/upload-sarif@cdcdbb579706841c47f7063dda365e292e5cad7a # v2.13.4
|
||||
uses: github/codeql-action/upload-sarif@23acc5c183826b7a8a97bce3cecc52db901f8251 # v3.25.10
|
||||
with:
|
||||
sarif_file: trivy-results.sarif
|
||||
category: code
|
|
@ -14,15 +14,15 @@ concurrency:
|
|||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
docs:
|
||||
docs-main:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
cache-dependency-path: go.sum
|
||||
|
|
|
@ -7,10 +7,10 @@ permissions: {}
|
|||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'docs-v*'
|
||||
- docs-v*
|
||||
|
||||
jobs:
|
||||
docs:
|
||||
docs-release:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
|
@ -23,9 +23,9 @@ jobs:
|
|||
version_extractor_regex: '^docs-v(.*)$'
|
||||
- name: Checkout
|
||||
if: ${{ steps.semver.outputs.prerelease == '' }}
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
if: ${{ steps.semver.outputs.prerelease == '' }}
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
|
|
|
@ -8,26 +8,28 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
required:
|
||||
golangci-lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
cache-dependency-path: go.sum
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@3cfe3a4abbb849e10058ce4af15d205b6da42804 # v3.7.1
|
||||
uses: golangci/golangci-lint-action@a4f60bb28d35aeee14e6880718e0c85ff1882e64 # v3.7.1
|
||||
with:
|
||||
skip-cache: true
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
|
||||
|
||||
# feat: (new feature for the user, not a new feature for build script)
|
||||
# fix: (bug fix for the user, not a fix to a build script)
|
||||
# build: (changes that affect the build system or external dependencies)
|
||||
|
@ -18,73 +20,85 @@
|
|||
# | |_______ Scope
|
||||
# |____________ Type
|
||||
|
||||
name: Semantic PR Validation
|
||||
name: Semantic pull request
|
||||
|
||||
permissions: {}
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
types:
|
||||
- opened
|
||||
- edited
|
||||
- synchronize
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
- opened
|
||||
- reopened
|
||||
- labeled
|
||||
- unlabeled
|
||||
- edited
|
||||
- synchronize
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
check-semantic-pr:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.actor != 'gcp-cherry-pick-bot' }}
|
||||
steps:
|
||||
- name: Validate Pull Request
|
||||
uses: amannn/action-semantic-pull-request@e9fabac35e210fea40ca5b14c0da95a099eff26f
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
# Configure which types are allowed.
|
||||
# Default: https://github.com/commitizen/conventional-commit-types
|
||||
types: |
|
||||
feat
|
||||
fix
|
||||
build
|
||||
chore
|
||||
ci
|
||||
docs
|
||||
perf
|
||||
refactor
|
||||
revert
|
||||
style
|
||||
test
|
||||
revert
|
||||
release
|
||||
# Configure which scopes are allowed.
|
||||
scopes: |
|
||||
api
|
||||
client
|
||||
commands
|
||||
config
|
||||
data
|
||||
deps
|
||||
discovery
|
||||
internal
|
||||
report
|
||||
resource
|
||||
runner
|
||||
operations
|
||||
processors
|
||||
test
|
||||
utils
|
||||
validation
|
||||
version
|
||||
docs
|
||||
release
|
||||
testdata
|
||||
ignoreLabels: |
|
||||
bot
|
||||
ignore-semantic-pull-request
|
||||
# Configure that a scope must always be provided.
|
||||
requireScope: false
|
||||
# When using "Squash and merge" on a PR with only one commit, GitHub
|
||||
# will suggest using that commit message instead of the PR title for the
|
||||
# merge commit, and it's easy to commit this by mistake. Enable this option
|
||||
# to also validate the commit message for one commit PRs.
|
||||
validateSingleCommit: true
|
||||
# Related to `validateSingleCommit` you can opt-in to validate that the PR
|
||||
# title matches a single commit to avoid confusion.
|
||||
validateSingleCommitMatchesPrTitle: true
|
||||
- name: Validate Pull Request
|
||||
uses: amannn/action-semantic-pull-request@cfb60706e18bc85e8aec535e3c577abe8f70378e
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
# Configure which types are allowed.
|
||||
# Default: https://github.com/commitizen/conventional-commit-types
|
||||
types: |
|
||||
feat
|
||||
fix
|
||||
build
|
||||
chore
|
||||
ci
|
||||
docs
|
||||
perf
|
||||
refactor
|
||||
revert
|
||||
style
|
||||
test
|
||||
revert
|
||||
release
|
||||
# Configure which scopes are allowed.
|
||||
scopes: |
|
||||
api
|
||||
client
|
||||
commands
|
||||
config
|
||||
data
|
||||
deps
|
||||
discovery
|
||||
internal
|
||||
report
|
||||
resource
|
||||
runner
|
||||
operations
|
||||
processors
|
||||
test
|
||||
utils
|
||||
validation
|
||||
version
|
||||
docs
|
||||
release
|
||||
testdata
|
||||
ignoreLabels: |
|
||||
bot
|
||||
ignore-semantic-pull-request
|
||||
# Configure that a scope must always be provided.
|
||||
requireScope: false
|
||||
# When using "Squash and merge" on a PR with only one commit, GitHub
|
||||
# will suggest using that commit message instead of the PR title for the
|
||||
# merge commit, and it's easy to commit this by mistake. Enable this option
|
||||
# to also validate the commit message for one commit PRs.
|
||||
validateSingleCommit: true
|
||||
# Related to `validateSingleCommit` you can opt-in to validate that the PR
|
||||
# title matches a single commit to avoid confusion.
|
||||
validateSingleCommitMatchesPrTitle: true
|
||||
|
|
|
@ -7,7 +7,7 @@ permissions: {}
|
|||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
- v*
|
||||
|
||||
jobs:
|
||||
goreleaser:
|
||||
|
@ -33,7 +33,7 @@ jobs:
|
|||
docker-images: true
|
||||
swap-storage: false
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Fetch all tags
|
||||
|
@ -41,19 +41,19 @@ jobs:
|
|||
set -e
|
||||
git fetch --force --tags
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
cache-dependency-path: go.sum
|
||||
- name: Install Cosign
|
||||
uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 # v3.5.0
|
||||
- name: Install Syft
|
||||
uses: anchore/sbom-action/download-syft@ab5d7b5f48981941c4c5d6bf33aeb98fe3bae38c # v0.15.10
|
||||
uses: anchore/sbom-action/download-syft@e8d2a6937ecead383dfe75190d104edd1f9c5751 # v0.16.0
|
||||
- name: Install Ko
|
||||
uses: ko-build/setup-ko@ace48d793556083a76f1e3e6068850c1f4a369aa # v0.6
|
||||
uses: ko-build/setup-ko@3aebd0597dc1e9d1a26bcfdb7cbeb19c131d3037 # v0.7
|
||||
- name: Run GoReleaser
|
||||
id: goreleaser
|
||||
uses: goreleaser/goreleaser-action@7ec5c2b0c6cdda6e8bbb49444bc797dd33d74dd8 # v5.0.0
|
||||
uses: goreleaser/goreleaser-action@286f3b13b1b49da4ac219696163fb8c1c93e1200 # v6.0.0
|
||||
with:
|
||||
distribution: goreleaser
|
||||
version: latest
|
||||
|
@ -102,7 +102,7 @@ jobs:
|
|||
actions: read
|
||||
id-token: write
|
||||
contents: write
|
||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.10.0
|
||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0
|
||||
with:
|
||||
base64-subjects: "${{ needs.goreleaser.outputs.hashes }}"
|
||||
upload-assets: true
|
||||
|
@ -114,7 +114,7 @@ jobs:
|
|||
actions: read
|
||||
id-token: write
|
||||
packages: write
|
||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.10.0
|
||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v2.0.0
|
||||
with:
|
||||
image: ${{ needs.goreleaser.outputs.image }}
|
||||
digest: ${{ needs.goreleaser.outputs.digest }}
|
||||
|
|
|
@ -8,9 +8,11 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
|
@ -21,9 +23,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
cache-dependency-path: go.sum
|
||||
|
@ -36,7 +38,7 @@ jobs:
|
|||
set -e
|
||||
make tests
|
||||
- name: Upload coverage
|
||||
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
|
||||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
|
||||
with:
|
||||
name: coverage.out
|
||||
path: coverage.out
|
||||
|
@ -49,13 +51,13 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Download coverage
|
||||
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
|
||||
with:
|
||||
name: coverage.out
|
||||
- name: Upload Report to Codecov
|
||||
uses: codecov/codecov-action@84508663e988701840491b86de86b666e8a86bed # v4.3.0
|
||||
uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0
|
||||
with:
|
||||
files: ./coverage.out
|
||||
fail_ci_if_error: true
|
||||
|
@ -67,9 +69,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
cache-dependency-path: go.sum
|
||||
|
@ -86,14 +88,14 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
|
||||
uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
cache-dependency-path: go.sum
|
||||
- name: Install ko
|
||||
uses: ko-build/setup-ko@ace48d793556083a76f1e3e6068850c1f4a369aa #v0.6
|
||||
uses: ko-build/setup-ko@3aebd0597dc1e9d1a26bcfdb7cbeb19c131d3037 #v0.7
|
||||
- name: Create test cluster
|
||||
run: |
|
||||
set -e
|
||||
|
@ -102,12 +104,3 @@ jobs:
|
|||
run: |
|
||||
set -e
|
||||
make e2e-tests-ko
|
||||
|
||||
required:
|
||||
needs:
|
||||
- unit-tests
|
||||
- e2e-tests
|
||||
- e2e-test-ko
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "Required jobs success!"
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
.cache/
|
||||
.gopath/
|
||||
.temp/
|
||||
.tools/
|
||||
.venv/
|
||||
chainsaw
|
||||
coverage.out
|
||||
website/site
|
||||
|
|
|
@ -41,8 +41,10 @@ linters:
|
|||
|
||||
run:
|
||||
timeout: 15m
|
||||
skip-files:
|
||||
|
||||
output:
|
||||
sort-results: true
|
||||
|
||||
issues:
|
||||
exclude-files:
|
||||
- ".+\\.generated.go"
|
||||
output:
|
||||
format: colored-line-number
|
||||
sort-results: true
|
|
@ -3,30 +3,27 @@
|
|||
Release notes for `TODO`.
|
||||
|
||||
<!--
|
||||
## ‼️ Breaking changes ‼️
|
||||
|
||||
|
||||
## ✨ UI changes ✨
|
||||
|
||||
## ⭐ Examples ⭐
|
||||
|
||||
## ⛵ Tutorials ⛵
|
||||
|
||||
## 🎸 Misc 🎸
|
||||
## 📚 Docs 📚
|
||||
|
||||
-->
|
||||
|
||||
## ‼️ Breaking changes ‼️
|
||||
|
||||
- Deprecated `TestStep` resource support was removed as well as the related command `chainsaw migrate tests`
|
||||
|
||||
## 💫 New features 💫
|
||||
|
||||
- Added support to wait with `jsonpath` conditions
|
||||
- Add test scenarios support
|
||||
|
||||
## 🔧 Fixes 🔧
|
||||
|
||||
- Fixed issue with `update` operation failing because resource version not set correctly
|
||||
- Fixed `wait` operation timeout passing the timeout value to the underlying `kubectl` command
|
||||
- Fixed `wait` operation condition incorrectly formatted with quotes
|
||||
- Fixed issue reading files from embedded file systems on windows
|
||||
- Fixed a potential issue with configuration defaults and marshaling
|
||||
|
||||
## 📚 Docs 📚
|
||||
## 🎸 Misc 🎸
|
||||
|
||||
- Added missing cluster doc
|
||||
- Improved all Python-based build operations
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
# Release notes
|
||||
|
||||
Release notes for `v0.2.0`.
|
||||
|
||||
## ‼️ Breaking changes ‼️
|
||||
|
||||
- Deprecated `TestStep` resource support was removed as well as the related command `chainsaw migrate tests`
|
||||
|
||||
## 💫 New features 💫
|
||||
|
||||
- Added support to wait with `jsonpath` conditions
|
||||
- Introduced `v1alpha2` version for configuration, both `v1alpha1` and `v1alpha2` are supported with a conversion system
|
||||
- Rewrote quick-start guide leveraging chainsaw capabilities using relevant usecases
|
||||
|
||||
## 🔧 Fixes 🔧
|
||||
|
||||
- Fixed issue with `update` operation failing because resource version not set correctly
|
||||
- Fixed `wait` operation timeout passing the timeout value to the underlying `kubectl` command
|
||||
- Fixed `wait` operation condition incorrectly formatted with quotes
|
||||
- Fixed issue reading files from embedded file systems on Windows
|
||||
- Fixed incorrect JUnit report format
|
||||
|
||||
## 🎸 Misc 🎸
|
||||
|
||||
- Switched a release branch worflow
|
||||
|
||||
## 📚 Docs 📚
|
||||
|
||||
- Added missing cluster doc
|
|
@ -0,0 +1,18 @@
|
|||
# Release notes
|
||||
|
||||
Release notes for `v0.2.1`.
|
||||
|
||||
## ‼️ Breaking changes ‼️
|
||||
|
||||
- Resource templating is now enabled by default
|
||||
|
||||
## 💫 New features 💫
|
||||
|
||||
- Added `--pause-on-failure` flag to pause when a test failure happens (to ease troubleshooting)
|
||||
- Improved cleanup management logic, alternating `catch`, `finally` and `@cleanup` per step
|
||||
- Added support for registering clusters dynamically, useful when a cluster is created in a test step
|
||||
|
||||
## 🔧 Fixes 🔧
|
||||
|
||||
- Fixed issue with cluster incorrectly registered
|
||||
- Force background deletion propagation policy (useful when testing unmanaged `Job`)
|
|
@ -0,0 +1,25 @@
|
|||
# Release notes
|
||||
|
||||
Release notes for `v0.2.2`.
|
||||
|
||||
## ‼️ Breaking changes ‼️
|
||||
|
||||
- `finally` block now executes when the step terminates. It was supposed to work like this from the beginning but was not properly working. The `cleanup` block was introduced to execute operations when a test terminates instead.
|
||||
|
||||
## 💫 New features 💫
|
||||
|
||||
- Added cleanup handlers support to register custom cleanup operations to run when a test terminates
|
||||
|
||||
## 🔧 Fixes 🔧
|
||||
|
||||
- Use `namespaceTemplate` from configuration if provided
|
||||
|
||||
## 📚 Docs 📚
|
||||
|
||||
- Improved home page
|
||||
- Added scroll to top button
|
||||
- Improved navigation bar
|
||||
- Fixed dark/light color schemes and added system preference support
|
||||
- Added links to Slack and X/Twitter links in the footer
|
||||
- Removed the blog
|
||||
- Rewrote most of the Getting Started pages
|
|
@ -0,0 +1,28 @@
|
|||
# Release notes
|
||||
|
||||
Release notes for `v0.2.3`.
|
||||
|
||||
## ‼️ Breaking changes ‼️
|
||||
|
||||
- `catch` block in v1alpha2 configuration was moved in `error.catch`
|
||||
|
||||
## 💫 New features 💫
|
||||
|
||||
- Added `cleanup` validation logic
|
||||
- Added deletion propagation policy support at the configuration, test and step levels
|
||||
|
||||
## 🔧 Fixes 🔧
|
||||
|
||||
- Added `cleanup` support to generated test catalog
|
||||
|
||||
## 📚 Docs 📚
|
||||
|
||||
- Documentation sections have been completely restructured for better clarity and maintenance
|
||||
- Tons of documentation improvements
|
||||
- Configuration examples in the documentation were updated to `v1alpha2`
|
||||
- Added built-in bindings reference documentation
|
||||
- Links to easily navigate from one section to another were added to the home page
|
||||
|
||||
## 🎸 Misc 🎸
|
||||
|
||||
- Social cards are now enabled and configured for all social networks/apps
|
|
@ -0,0 +1,27 @@
|
|||
# Release notes
|
||||
|
||||
Release notes for `v0.2.4`.
|
||||
|
||||
## ‼️ Breaking changes ‼️
|
||||
|
||||
- Directly specifying resource name was dropped, only `apiVersion` / `kind` is supported now
|
||||
|
||||
## 💫 New features 💫
|
||||
|
||||
- Added test metadata built-in binding
|
||||
- Added file support to `delete` operation
|
||||
- Added `--remarshal` flag to improve anchors support in test resources
|
||||
- Added support for `describe`, `events`, `get` and `podLogs` operations in try blocks
|
||||
|
||||
## 🔧 Fixes 🔧
|
||||
|
||||
- Fixed incorrect path reported when validation failed for a patch operation
|
||||
- Improved the way default values for configuration options are managed in configuration v1alpha2
|
||||
|
||||
## 📚 Docs 📚
|
||||
|
||||
- Removed code markers on titles in API reference documentation
|
||||
|
||||
## 🎸 Misc 🎸
|
||||
|
||||
- Bumped kyverno-json to v0.0.3
|
|
@ -277,13 +277,13 @@
|
|||
],
|
||||
"properties": {
|
||||
"catch": {
|
||||
"description": "Catch defines what the tests steps will execute when an error happens. This will be combined with catch handlers defined at the test and step levels.",
|
||||
"description": "Catch defines what the tests steps will execute when an error happens.\nThis will be combined with catch handlers defined at the test and step levels.",
|
||||
"type": [
|
||||
"array",
|
||||
"null"
|
||||
],
|
||||
"items": {
|
||||
"description": "Catch defines actions to be executed on failure.",
|
||||
"description": "CatchFinally defines actions to be executed in catch, finally and cleanup blocks.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
|
@ -352,6 +352,36 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"entrypoint": {
|
||||
"description": "Entrypoint is the command entry point to run.",
|
||||
"type": "string"
|
||||
|
@ -440,9 +470,6 @@
|
|||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"ref"
|
||||
],
|
||||
"properties": {
|
||||
"bindings": {
|
||||
"description": "Bindings defines additional binding key/values.",
|
||||
|
@ -480,6 +507,48 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"deletionPropagationPolicy": {
|
||||
"description": "DeletionPropagationPolicy decides if a deletion will propagate to the dependents of\nthe object, and how the garbage collector will handle the propagation.\nOverrides the deletion propagation policy set in the Configuration, the Test and the TestStep.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"enum": [
|
||||
"Orphan",
|
||||
"Background",
|
||||
"Foreground"
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"description": "Expect defines a list of matched checks to validate the operation outcome.",
|
||||
"type": [
|
||||
|
@ -487,7 +556,7 @@
|
|||
"null"
|
||||
],
|
||||
"items": {
|
||||
"description": "Expectation represents a check to be applied on the result of an operation with a match filter to determine if the verification should be considered.",
|
||||
"description": "Expectation represents a check to be applied on the result of an operation\nwith a match filter to determine if the verification should be considered.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
|
@ -507,9 +576,19 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"file": {
|
||||
"description": "File is the path to the referenced file. This can be a direct path to a file\nor an expression that matches multiple files, such as \"manifest/*.yaml\" for all YAML\nfiles within the \"manifest\" directory.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"ref": {
|
||||
"description": "ObjectReference determines objects to be deleted.",
|
||||
"type": "object",
|
||||
"description": "Ref determines objects to be deleted.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"apiVersion",
|
||||
"kind"
|
||||
|
@ -520,7 +599,7 @@
|
|||
"type": "string"
|
||||
},
|
||||
"kind": {
|
||||
"description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"description": "Kind of the referent.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"type": "string"
|
||||
},
|
||||
"labels": {
|
||||
|
@ -537,14 +616,14 @@
|
|||
}
|
||||
},
|
||||
"name": {
|
||||
"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"description": "Name of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"description": "Namespace of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -574,13 +653,14 @@
|
|||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"apiVersion",
|
||||
"kind"
|
||||
],
|
||||
"properties": {
|
||||
"apiVersion": {
|
||||
"description": "API version of the referent.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
"type": "string"
|
||||
},
|
||||
"cluster": {
|
||||
"description": "Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).",
|
||||
|
@ -589,29 +669,49 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"kind": {
|
||||
"description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"string",
|
||||
"object",
|
||||
"null"
|
||||
]
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"kind": {
|
||||
"description": "Kind of the referent.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"description": "Name of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"resource": {
|
||||
"description": "Resource name of the referent.",
|
||||
"description": "Namespace of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -661,6 +761,36 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"format": {
|
||||
"description": "Format determines the output format (json or yaml).",
|
||||
"type": [
|
||||
|
@ -670,14 +800,14 @@
|
|||
"pattern": "^(?:json|yaml|\\(.+\\))$"
|
||||
},
|
||||
"name": {
|
||||
"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"description": "Name of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"description": "Namespace of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -705,13 +835,14 @@
|
|||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"apiVersion",
|
||||
"kind"
|
||||
],
|
||||
"properties": {
|
||||
"apiVersion": {
|
||||
"description": "API version of the referent.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
"type": "string"
|
||||
},
|
||||
"cluster": {
|
||||
"description": "Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).",
|
||||
|
@ -720,6 +851,36 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"format": {
|
||||
"description": "Format determines the output format (json or yaml).",
|
||||
"type": [
|
||||
|
@ -729,28 +890,18 @@
|
|||
"pattern": "^(?:json|yaml|\\(.+\\))$"
|
||||
},
|
||||
"kind": {
|
||||
"description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
"description": "Kind of the referent.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"description": "Name of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"resource": {
|
||||
"description": "Resource name of the referent.",
|
||||
"description": "Namespace of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -786,6 +937,36 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"container": {
|
||||
"description": "Container in pod to get logs from else --all-containers is used.",
|
||||
"type": [
|
||||
|
@ -794,14 +975,14 @@
|
|||
]
|
||||
},
|
||||
"name": {
|
||||
"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"description": "Name of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"description": "Namespace of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -815,7 +996,7 @@
|
|||
]
|
||||
},
|
||||
"tail": {
|
||||
"description": "Tail is the number of last lines to collect from pods. If omitted or zero, then the default is 10 if you use a selector, or -1 (all) if you use a pod name. This matches default behavior of `kubectl logs`.",
|
||||
"description": "Tail is the number of last lines to collect from pods. If omitted or zero,\nthen the default is 10 if you use a selector, or -1 (all) if you use a pod name.\nThis matches default behavior of `kubectl logs`.",
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
|
@ -877,6 +1058,36 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"description": "Content defines a shell script (run with \"sh -c ...\").",
|
||||
"type": [
|
||||
|
@ -985,25 +1196,54 @@
|
|||
"null"
|
||||
],
|
||||
"required": [
|
||||
"for"
|
||||
"apiVersion",
|
||||
"for",
|
||||
"kind"
|
||||
],
|
||||
"properties": {
|
||||
"apiVersion": {
|
||||
"description": "API version of the referent.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
"type": "string"
|
||||
},
|
||||
"cluster": {
|
||||
"description": "Cluster defines the target cluster where the wait operation will be performed (default cluster will be used if not specified).",
|
||||
"description": "Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"clusters": {
|
||||
"description": "Clusters holds a registry to clusters to support multi-cluster tests.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"description": "Cluster defines cluster config and context.",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"required": [
|
||||
"kubeconfig"
|
||||
],
|
||||
"properties": {
|
||||
"context": {
|
||||
"description": "Context is the name of the context to use.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"kubeconfig": {
|
||||
"description": "Kubeconfig is the path to the referenced file.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"for": {
|
||||
"description": "For specifies the condition to wait for.",
|
||||
"description": "WaitFor specifies the condition to wait for.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"condition": {
|
||||
|
@ -1068,28 +1308,18 @@
|
|||
"pattern": "^(?:json|yaml|\\(.+\\))$"
|
||||
},
|
||||
"kind": {
|
||||
"description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
"description": "Kind of the referent.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"description": "Name of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"resource": {
|
||||
"description": "Resource name of the referent.",
|
||||
"description": "Namespace of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -1103,7 +1333,7 @@
|
|||
]
|
||||
},
|
||||
"timeout": {
|
||||
"description": "Timeout for the operation. Specifies how long to wait for the condition to be met before timing out.",
|
||||
"description": "Timeout for the operation. Overrides the global timeout set in the Configuration.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -1151,6 +1381,18 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"deletionPropagationPolicy": {
|
||||
"description": "DeletionPropagationPolicy decides if a deletion will propagate to the dependents of\nthe object, and how the garbage collector will handle the propagation.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"enum": [
|
||||
"Orphan",
|
||||
"Background",
|
||||
"Foreground"
|
||||
]
|
||||
},
|
||||
"excludeTestRegex": {
|
||||
"description": "ExcludeTestRegex is used to exclude tests based on a regular expression.",
|
||||
"type": [
|
||||
|
@ -1187,7 +1429,7 @@
|
|||
]
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace defines the namespace to use for tests. If not specified, every test will execute in a random ephemeral namespace unless the namespace is overridden in a the test spec.",
|
||||
"description": "Namespace defines the namespace to use for tests.\nIf not specified, every test will execute in a random ephemeral namespace\nunless the namespace is overridden in a the test spec.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -1216,7 +1458,7 @@
|
|||
"minimum": 1
|
||||
},
|
||||
"reportFormat": {
|
||||
"description": "ReportFormat determines test report format (JSON|XML|nil) nil == no report. maps to report.Type, however we don't want generated.deepcopy to have reference to it.",
|
||||
"description": "ReportFormat determines test report format (JSON|XML|nil) nil == no report.\nmaps to report.Type, however we don't want generated.deepcopy to have reference to it.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
@ -1255,7 +1497,7 @@
|
|||
]
|
||||
},
|
||||
"testFile": {
|
||||
"description": "TestFile is the name of the file containing the test to run. If no extension is provided, chainsaw will try with .yaml first and .yml if needed.",
|
||||
"description": "TestFile is the name of the file containing the test to run.\nIf no extension is provided, chainsaw will try with .yaml first and .yml if needed.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -17,8 +17,9 @@ The list of organizations that have publicly shared the usage of Chainsaw:
|
|||
| [Grafana-operator](https://github.com/grafana/grafana-operator) | Chainsaw enabled easier e2e testing and CI debugging after replacing kuttl |
|
||||
| [Opentelemetry-operator](https://github.com/open-telemetry/opentelemetry-operator) | Chainsaw cut down on hacks, improved code-reuse and enhanced test debugging |
|
||||
| [Tempo-operator](https://github.com/grafana/tempo-operator) | Chainsaw cranked up the tempo, making our e2e tests dance to a rhythm of reliability and efficiency |
|
||||
| [Provider-ceph](https://github.com/linode/provider-ceph) | Chainsaw replaced Kuttl and made our e2e tests much more readable and easier to debug. |
|
||||
| [Provider-ceph](https://github.com/linode/provider-ceph) | Chainsaw replaced Kuttl and made our e2e tests much more readable and easier to debug |
|
||||
| [Linode CAPI provider](https://github.com/linode/cluster-api-provider-linode) | Chainsaw replaced Kuttl and made our e2e tests much more readable and easier to debug. 🙏 @eddycharly |
|
||||
| [Linode COSI driver](https://github.com/linode/linode-cosi-driver) | Running all end to end tests for object store driver |
|
||||
|
||||
|
||||
<!-- append the line below to the table
|
||||
|
|
34
Makefile
34
Makefile
|
@ -29,7 +29,7 @@ KIND_IMAGE ?= kindest/node:v1.29.2
|
|||
|
||||
TOOLS_DIR := $(PWD)/.tools
|
||||
CONTROLLER_GEN := $(TOOLS_DIR)/controller-gen
|
||||
CONTROLLER_GEN_VERSION := v0.12.0
|
||||
CONTROLLER_GEN_VERSION := v0.15.0
|
||||
REGISTER_GEN := $(TOOLS_DIR)/register-gen
|
||||
DEEPCOPY_GEN := $(TOOLS_DIR)/deepcopy-gen
|
||||
CONVERSION_GEN := $(TOOLS_DIR)/conversion-gen
|
||||
|
@ -131,9 +131,12 @@ codegen-conversion: $(CONVERSION_GEN)
|
|||
.PHONY: codegen-crds
|
||||
codegen-crds: ## Generate CRDs
|
||||
codegen-crds: $(CONTROLLER_GEN)
|
||||
codegen-crds: codegen-deepcopy
|
||||
codegen-crds: codegen-register
|
||||
codegen-crds: codegen-conversion
|
||||
@echo Generate crds... >&2
|
||||
@rm -rf $(CRDS_PATH)
|
||||
@$(CONTROLLER_GEN) crd paths=./pkg/apis/... crd:crdVersions=v1 output:dir=$(CRDS_PATH)
|
||||
@$(CONTROLLER_GEN) paths=./pkg/apis/... crd:crdVersions=v1 output:dir=$(CRDS_PATH)
|
||||
@echo Copy generated CRDs to embed in the CLI... >&2
|
||||
@rm -rf pkg/data/crds && mkdir -p pkg/data/crds
|
||||
@cp $(CRDS_PATH)/* pkg/data/crds
|
||||
|
@ -142,24 +145,25 @@ codegen-crds: $(CONTROLLER_GEN)
|
|||
codegen-cli-docs: ## Generate CLI docs
|
||||
codegen-cli-docs: build
|
||||
@echo Generate cli docs... >&2
|
||||
@rm -rf website/docs/commands && mkdir -p website/docs/commands
|
||||
@rm -rf website/docs/reference/commands && mkdir -p website/reference/docs/commands
|
||||
@rm -rf docs/user/commands && mkdir -p docs/user/commands
|
||||
@./$(CLI_BIN) docs -o website/docs/commands --autogenTag=false
|
||||
@./$(CLI_BIN) docs -o website/docs/reference/commands --autogenTag=false
|
||||
|
||||
.PHONY: codegen-api-docs
|
||||
codegen-api-docs: ## Generate markdown API docs
|
||||
codegen-api-docs: $(REFERENCE_DOCS)
|
||||
codegen-api-docs: codegen-deepcopy
|
||||
codegen-api-docs: codegen-register
|
||||
codegen-api-docs: codegen-conversion
|
||||
@echo Generate api docs... >&2
|
||||
@rm -rf ./website/docs/apis
|
||||
@cd ./website/apis && $(REFERENCE_DOCS) -c config.yaml -f markdown -o ../docs/apis
|
||||
@rm -rf ./website/docs/reference/apis
|
||||
@cd ./website/apis && $(REFERENCE_DOCS) -c config.yaml -f markdown -o ../docs/reference/apis
|
||||
|
||||
.PHONY: codegen-jp-docs
|
||||
codegen-jp-docs: ## Generate JP docs
|
||||
@echo Generate jp docs... >&2
|
||||
@rm -rf ./website/docs/jp && mkdir -p ./website/docs/jp
|
||||
@go run ./website/jp/main.go > ./website/docs/jp/functions.md
|
||||
@rm -rf ./website/docs/reference/jp && mkdir -p ./website/docs/reference/jp
|
||||
@go run ./website/jp/main.go > ./website/docs/reference/jp/functions.md
|
||||
|
||||
.PHONY: codegen-mkdocs
|
||||
codegen-mkdocs: ## Generate mkdocs website
|
||||
|
@ -167,9 +171,7 @@ codegen-mkdocs: codegen-cli-docs
|
|||
codegen-mkdocs: codegen-api-docs
|
||||
codegen-mkdocs: codegen-jp-docs
|
||||
@echo Generate mkdocs website... >&2
|
||||
@$(PIP) install mkdocs
|
||||
@$(PIP) install --upgrade pip
|
||||
@$(PIP) install -U mkdocs-material mkdocs-redirects mkdocs-minify-plugin mkdocs-include-markdown-plugin lunr mkdocs-rss-plugin mike
|
||||
@$(PIP) install -r requirements.txt
|
||||
@mkdocs build -f ./website/mkdocs.yaml
|
||||
|
||||
.PHONY: codegen-schemas-openapi
|
||||
|
@ -194,7 +196,7 @@ codegen-schemas-openapi: $(KIND)
|
|||
codegen-schemas-json: ## Generate json schemas
|
||||
codegen-schemas-json: codegen-schemas-openapi
|
||||
@echo Generate json schema... >&2
|
||||
@$(PIP) install openapi2jsonschema --no-build-isolation
|
||||
@$(PIP) install -r requirements.txt
|
||||
@rm -rf ./.temp/.schemas/json
|
||||
@rm -rf ./.schemas/json
|
||||
@openapi2jsonschema ./.temp/.schemas/openapi/v2/schema.json --kubernetes --stand-alone --expanded -o ./.temp/.schemas/json
|
||||
|
@ -239,9 +241,7 @@ verify-codegen: codegen
|
|||
.PHONY: mkdocs-serve
|
||||
mkdocs-serve: ## Generate and serve mkdocs website
|
||||
@echo Generate and servemkdocs website... >&2
|
||||
@$(PIP) install mkdocs
|
||||
@$(PIP) install --upgrade pip
|
||||
@$(PIP) install -U mkdocs-material mkdocs-redirects mkdocs-minify-plugin mkdocs-include-markdown-plugin lunr mkdocs-rss-plugin mike
|
||||
@$(PIP) install -r requirements.txt
|
||||
@mkdocs serve -f ./website/mkdocs.yaml
|
||||
|
||||
#########
|
||||
|
@ -297,7 +297,7 @@ tests: $(CLI_BIN)
|
|||
e2e-tests: ## Run e2e tests
|
||||
e2e-tests: $(CLI_BIN)
|
||||
@echo Running e2e tests... >&2
|
||||
@./$(CLI_BIN) test --test-dir ./testdata/e2e --config ./testdata/e2e/config-v1alpha2.yaml --values ./testdata/e2e/values.yaml
|
||||
@./$(CLI_BIN) test --test-dir ./testdata/e2e --remarshal --config ./testdata/e2e/config.yaml --values ./testdata/e2e/values.yaml
|
||||
|
||||
.PHONY: e2e-tests-ko
|
||||
e2e-tests-ko: ## Run e2e tests from a docker container
|
||||
|
@ -311,7 +311,7 @@ e2e-tests-ko: build-ko
|
|||
--user $(id -u):$(id -g) \
|
||||
--name chainsaw \
|
||||
--rm \
|
||||
ko.local/github.com/kyverno/chainsaw:$(KO_TAGS) test /chainsaw --config /chainsaw/config-v1alpha2.yaml --values /chainsaw/values.yaml
|
||||
ko.local/github.com/kyverno/chainsaw:$(KO_TAGS) test /chainsaw --remarshal --config /chainsaw/config.yaml --values /chainsaw/values.yaml --selector !no-ko-test
|
||||
|
||||
########
|
||||
# KIND #
|
||||
|
|
|
@ -39,7 +39,7 @@ Built under the Kyverno umbrella, you can use the Kyverno Chainsaw **Slack chann
|
|||
|
||||
## Getting Started
|
||||
|
||||
Please refer to the [Getting Started](https://kyverno.github.io/chainsaw/latest/intro/) documentation.
|
||||
Please refer to the [Getting Started](https://kyverno.github.io/chainsaw/latest/quick-start/) documentation.
|
||||
|
||||
## RoadMap
|
||||
|
||||
|
|
124
go.mod
124
go.mod
|
@ -1,40 +1,42 @@
|
|||
module github.com/kyverno/chainsaw
|
||||
|
||||
go 1.21.4
|
||||
go 1.22.2
|
||||
|
||||
require (
|
||||
github.com/Masterminds/sprig v2.22.0+incompatible
|
||||
github.com/dustinkirkland/golang-petname v0.0.0-20231002161417-6a283f1aaaf2
|
||||
github.com/fatih/color v1.16.0
|
||||
github.com/go-logr/logr v1.4.1
|
||||
github.com/dustinkirkland/golang-petname v0.0.0-20240428194347-eebcea082ee0
|
||||
github.com/fatih/color v1.17.0
|
||||
github.com/go-logr/logr v1.4.2
|
||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
|
||||
github.com/hashicorp/go-getter v1.7.4
|
||||
github.com/jmespath-community/go-jmespath v1.1.2-0.20240117150817-e430401a2172
|
||||
github.com/kudobuilder/kuttl v0.15.0
|
||||
github.com/kyverno/kyverno-json v0.0.3-alpha.2.0.20240418134117-384bc5db5ad7
|
||||
github.com/kudobuilder/kuttl v0.17.0
|
||||
github.com/kyverno/kyverno-json v0.0.3
|
||||
github.com/kyverno/pkg/ext v0.0.0-20240418121121-df8add26c55c
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
|
||||
github.com/spf13/cobra v1.8.0
|
||||
github.com/spf13/cobra v1.8.1
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/stretchr/testify v1.9.0
|
||||
github.com/xeipuuv/gojsonschema v1.2.0
|
||||
go.uber.org/multierr v1.11.0
|
||||
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225
|
||||
k8s.io/api v0.29.4
|
||||
k8s.io/apimachinery v0.29.4
|
||||
k8s.io/client-go v0.29.4
|
||||
k8s.io/utils v0.0.0-20240102154912-e7106e64919e
|
||||
sigs.k8s.io/controller-runtime v0.17.3
|
||||
sigs.k8s.io/kubectl-validate v0.0.3
|
||||
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
k8s.io/api v0.30.2
|
||||
k8s.io/apimachinery v0.30.2
|
||||
k8s.io/client-go v0.30.2
|
||||
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0
|
||||
sigs.k8s.io/controller-runtime v0.18.4
|
||||
sigs.k8s.io/kubectl-validate v0.0.4
|
||||
sigs.k8s.io/yaml v1.4.0
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go v0.112.0 // indirect
|
||||
cloud.google.com/go/compute v1.24.0 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
cloud.google.com/go/iam v1.1.6 // indirect
|
||||
cloud.google.com/go/storage v1.38.0 // indirect
|
||||
cloud.google.com/go v0.114.0 // indirect
|
||||
cloud.google.com/go/auth v0.5.1 // indirect
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.3.0 // indirect
|
||||
cloud.google.com/go/iam v1.1.8 // indirect
|
||||
cloud.google.com/go/storage v1.41.0 // indirect
|
||||
github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect
|
||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
||||
github.com/Masterminds/semver v1.5.0 // indirect
|
||||
|
@ -42,42 +44,42 @@ require (
|
|||
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
|
||||
github.com/aquilax/truncate v1.0.0 // indirect
|
||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
||||
github.com/aws/aws-sdk-go v1.50.20 // indirect
|
||||
github.com/aws/aws-sdk-go v1.53.14 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
|
||||
github.com/blang/semver/v4 v4.0.0 // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/coreos/go-semver v0.3.1 // indirect
|
||||
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.11.2 // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
|
||||
github.com/evanphx/json-patch v5.9.0+incompatible // indirect
|
||||
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
|
||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.20.2 // indirect
|
||||
github.com/go-openapi/jsonreference v0.20.4 // indirect
|
||||
github.com/go-openapi/swag v0.22.9 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
||||
github.com/go-openapi/swag v0.23.0 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/protobuf v1.5.4 // indirect
|
||||
github.com/google/cel-go v0.17.7 // indirect
|
||||
github.com/google/cel-go v0.17.8 // 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/s2a-go v0.1.7 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.12.1 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.12.4 // indirect
|
||||
github.com/gopherjs/gopherjs v1.17.2 // indirect
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||
github.com/hashicorp/go-safetemp v1.0.0 // indirect
|
||||
github.com/hashicorp/go-version v1.6.0 // indirect
|
||||
github.com/hashicorp/go-version v1.7.0 // indirect
|
||||
github.com/huandu/xstrings v1.4.0 // indirect
|
||||
github.com/imdario/mergo v0.3.16 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
|
@ -86,7 +88,7 @@ require (
|
|||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/jtolds/gls v4.20.0+incompatible // indirect
|
||||
github.com/klauspost/compress v1.17.6 // indirect
|
||||
github.com/klauspost/compress v1.17.8 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
|
@ -104,48 +106,46 @@ require (
|
|||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/stoewer/go-strcase v1.3.0 // indirect
|
||||
github.com/ulikunitz/xz v0.5.11 // indirect
|
||||
github.com/ulikunitz/xz v0.5.12 // indirect
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||
github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea // indirect
|
||||
go.etcd.io/etcd/api/v3 v3.5.11 // indirect
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.11 // indirect
|
||||
go.etcd.io/etcd/client/v3 v3.5.11 // indirect
|
||||
go.etcd.io/etcd/api/v3 v3.5.14 // indirect
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect
|
||||
go.etcd.io/etcd/client/v3 v3.5.14 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 // indirect
|
||||
go.opentelemetry.io/otel v1.23.1 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
|
||||
go.opentelemetry.io/otel v1.24.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.23.1 // indirect
|
||||
go.opentelemetry.io/otel/sdk v1.23.1 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.23.1 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.24.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk v1.24.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.24.0 // indirect
|
||||
go.opentelemetry.io/proto/otlp v1.1.0 // indirect
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
golang.org/x/crypto v0.21.0 // indirect
|
||||
golang.org/x/net v0.23.0 // indirect
|
||||
golang.org/x/oauth2 v0.17.0 // indirect
|
||||
golang.org/x/sync v0.6.0 // indirect
|
||||
golang.org/x/sys v0.18.0 // indirect
|
||||
golang.org/x/term v0.18.0 // indirect
|
||||
golang.org/x/text v0.14.0 // indirect
|
||||
golang.org/x/crypto v0.23.0 // indirect
|
||||
golang.org/x/net v0.25.0 // indirect
|
||||
golang.org/x/oauth2 v0.20.0 // indirect
|
||||
golang.org/x/sync v0.7.0 // indirect
|
||||
golang.org/x/sys v0.20.0 // indirect
|
||||
golang.org/x/term v0.20.0 // indirect
|
||||
golang.org/x/text v0.15.0 // indirect
|
||||
golang.org/x/time v0.5.0 // indirect
|
||||
google.golang.org/api v0.165.0 // indirect
|
||||
google.golang.org/appengine v1.6.8 // indirect
|
||||
google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9 // indirect
|
||||
google.golang.org/grpc v1.61.1 // indirect
|
||||
google.golang.org/protobuf v1.33.0 // indirect
|
||||
google.golang.org/api v0.182.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20240528184218-531527333157 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect
|
||||
google.golang.org/grpc v1.64.0 // indirect
|
||||
google.golang.org/protobuf v1.34.1 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
k8s.io/apiextensions-apiserver v0.29.2 // indirect
|
||||
k8s.io/apiserver v0.29.2 // indirect
|
||||
k8s.io/component-base v0.29.2 // indirect
|
||||
k8s.io/apiextensions-apiserver v0.30.1 // indirect
|
||||
k8s.io/apiserver v0.30.1 // indirect
|
||||
k8s.io/component-base v0.30.1 // indirect
|
||||
k8s.io/klog/v2 v2.120.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20240221221325-2ac9dc51f3f1 // indirect
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a // indirect
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
||||
)
|
||||
|
|
271
go.sum
271
go.sum
|
@ -30,8 +30,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9
|
|||
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
|
||||
cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
|
||||
cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
|
||||
cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM=
|
||||
cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4=
|
||||
cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY=
|
||||
cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E=
|
||||
cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
|
||||
cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
|
||||
cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
|
||||
|
@ -46,6 +46,10 @@ cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjby
|
|||
cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=
|
||||
cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=
|
||||
cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=
|
||||
cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw=
|
||||
cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q=
|
||||
cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
|
||||
cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
|
@ -68,10 +72,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz
|
|||
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
|
||||
cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
|
||||
cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
|
||||
cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
|
||||
cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40=
|
||||
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
|
||||
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
|
||||
cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
|
||||
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
|
||||
cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
|
||||
cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
|
||||
cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
|
||||
|
@ -109,8 +111,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97
|
|||
cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
|
||||
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
|
||||
cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
|
||||
cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
|
||||
cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
|
||||
cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0=
|
||||
cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE=
|
||||
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
|
||||
cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
|
||||
cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
|
||||
|
@ -171,8 +173,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
|
|||
cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
|
||||
cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
|
||||
cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
|
||||
cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg=
|
||||
cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY=
|
||||
cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0=
|
||||
cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80=
|
||||
cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
|
||||
cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
|
||||
cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
|
||||
|
@ -206,8 +208,8 @@ github.com/aquilax/truncate v1.0.0/go.mod h1:BeMESIDMlvlS3bmg4BVvBbbZUNwWtS8uzYP
|
|||
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/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
|
||||
github.com/aws/aws-sdk-go v1.50.20 h1:xfAnSDVf/azIWTVQXQODp89bubvCS85r70O3nuQ4dnE=
|
||||
github.com/aws/aws-sdk-go v1.50.20/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
|
||||
github.com/aws/aws-sdk-go v1.53.14 h1:SzhkC2Pzag0iRW8WBb80RzKdGXDydJR9LAMs2GyKJ2M=
|
||||
github.com/aws/aws-sdk-go v1.53.14/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
|
@ -215,13 +217,13 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1U
|
|||
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
|
||||
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/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
|
||||
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||
github.com/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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
|
@ -236,24 +238,22 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH
|
|||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY=
|
||||
github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
|
||||
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
|
||||
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
|
||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/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/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/dustinkirkland/golang-petname v0.0.0-20231002161417-6a283f1aaaf2 h1:S6Dco8FtAhEI/qkg/00H6RdEGC+MCy5GPiQ+xweNRFE=
|
||||
github.com/dustinkirkland/golang-petname v0.0.0-20231002161417-6a283f1aaaf2/go.mod h1:8AuBTZBRSFqEYBPYULd+NN474/zZBLP+6WeT5S9xlAc=
|
||||
github.com/emicklei/go-restful/v3 v3.11.2 h1:1onLa9DcsMYO9P+CXaL0dStDqQ2EHHXLiz+BtnqkLAU=
|
||||
github.com/emicklei/go-restful/v3 v3.11.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/dustinkirkland/golang-petname v0.0.0-20240428194347-eebcea082ee0 h1:aYo8nnk3ojoQkP5iErif5Xxv0Mo0Ga/FR5+ffl/7+Nk=
|
||||
github.com/dustinkirkland/golang-petname v0.0.0-20240428194347-eebcea082ee0/go.mod h1:8AuBTZBRSFqEYBPYULd+NN474/zZBLP+6WeT5S9xlAc=
|
||||
github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
|
||||
github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
|
@ -264,15 +264,13 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m
|
|||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
|
||||
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/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=
|
||||
github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
|
||||
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
|
||||
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
|
||||
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
|
||||
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
||||
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||
|
@ -282,20 +280,21 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9
|
|||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
|
||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/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-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
|
||||
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
|
||||
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
|
||||
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
|
||||
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/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.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
|
||||
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
|
||||
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-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
|
@ -340,8 +339,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
|
|||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
|
||||
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
||||
github.com/google/cel-go v0.17.7 h1:6ebJFzu1xO2n7TLtN+UBqShGBhlD85bhvglh5DpcfqQ=
|
||||
github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY=
|
||||
github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto=
|
||||
github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY=
|
||||
github.com/google/gnostic-models v0.6.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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
|
@ -371,8 +370,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
|
|||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
|
||||
github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw=
|
||||
github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
|
||||
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
|
||||
github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
|
@ -387,8 +386,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe
|
|||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo=
|
||||
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg=
|
||||
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
|
||||
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
|
||||
|
@ -412,8 +411,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99
|
|||
github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
|
||||
github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=
|
||||
github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
|
||||
github.com/googleapis/gax-go/v2 v2.12.1 h1:9F8GV9r9ztXyAi00gsMQHNoF51xPZm8uj1dpYt2ZETM=
|
||||
github.com/googleapis/gax-go/v2 v2.12.1/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc=
|
||||
github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg=
|
||||
github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI=
|
||||
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
|
||||
github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
|
||||
github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
|
||||
|
@ -425,16 +424,17 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c9
|
|||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
|
||||
github.com/hashicorp/go-getter v1.7.4 h1:3yQjWuxICvSpYwqSayAdKRFcvBl1y/vogCxczWSmix0=
|
||||
github.com/hashicorp/go-getter v1.7.4/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744=
|
||||
github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
|
||||
github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
|
||||
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
|
||||
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
|
||||
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
|
||||
|
@ -466,8 +466,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
|
|||
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.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
|
||||
github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
|
||||
github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
|
||||
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
|
||||
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
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=
|
||||
|
@ -475,10 +475,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/kudobuilder/kuttl v0.15.0 h1:OmCbpY3ebn+myJaatD+IT1AL1OTz34+Cv6ettiXd/hI=
|
||||
github.com/kudobuilder/kuttl v0.15.0/go.mod h1:UtAOt+GE8HQZFveEN8p1fk3j+H1Cp5Fk1eMdQkXPqH0=
|
||||
github.com/kyverno/kyverno-json v0.0.3-alpha.2.0.20240418134117-384bc5db5ad7 h1:09UL+pBN0LHYrv22dBmRKAQ0xBKCdkFMTJc0enyTj1o=
|
||||
github.com/kyverno/kyverno-json v0.0.3-alpha.2.0.20240418134117-384bc5db5ad7/go.mod h1:RwCdE0qkkKmMTgcci23U0Ffntfdbo5tOS7Ht6YLtxlY=
|
||||
github.com/kudobuilder/kuttl v0.17.0 h1:KkY5xs4RAiEI7XT1kj6XI3OYKVoAMu3PCVT/H/HZnnI=
|
||||
github.com/kudobuilder/kuttl v0.17.0/go.mod h1:2vrehDY2g27qKmV2hAxIsxcm7ZXkesVnNP43gWj2pQg=
|
||||
github.com/kyverno/kyverno-json v0.0.3 h1:EImI/YV41dG4hDQer/W0qMZHfxqul1yiHrBEXxFrkGM=
|
||||
github.com/kyverno/kyverno-json v0.0.3/go.mod h1:KUgXPXwUh0Sm/UgtHPomZAfEX8v79I3B5RZbUlzNihg=
|
||||
github.com/kyverno/pkg/ext v0.0.0-20240418121121-df8add26c55c h1:lAolpR9H8BwM5lRRvgCQ8JowswyxZRH+fgtIQzHFVCk=
|
||||
github.com/kyverno/pkg/ext v0.0.0-20240418121121-df8add26c55c/go.mod h1:02vxM0GNXz9+B/i6+rMfWAIwibUuAH+qFsd73IFskgQ=
|
||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||
|
@ -507,10 +507,10 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
|
|||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY=
|
||||
github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM=
|
||||
github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo=
|
||||
github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0=
|
||||
github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g=
|
||||
github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc=
|
||||
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
|
||||
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
|
||||
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=
|
||||
|
@ -545,8 +545,8 @@ github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9
|
|||
github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
|
||||
github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
|
||||
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
|
||||
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/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
|
||||
|
@ -567,8 +567,8 @@ github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8
|
|||
github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk=
|
||||
github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=
|
||||
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
||||
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
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=
|
||||
|
@ -588,14 +588,14 @@ github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea h1:Cyhwe
|
|||
github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea/go.mod h1:eNr558nEUjP8acGw8FFjTeWvSgU1stO7FAO6eknhHe4=
|
||||
go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=
|
||||
go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
|
||||
go.etcd.io/etcd/api/v3 v3.5.11 h1:B54KwXbWDHyD3XYAwprxNzTe7vlhR69LuBgZnMVvS7E=
|
||||
go.etcd.io/etcd/api/v3 v3.5.11/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.11 h1:bT2xVspdiCj2910T0V+/KHcVKjkUrCZVtk8J2JF2z1A=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.11/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=
|
||||
go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0=
|
||||
go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI=
|
||||
go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2QE4=
|
||||
go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA=
|
||||
go.etcd.io/etcd/client/v3 v3.5.11 h1:ajWtgoNSZJ1gmS8k+icvPtqsqEav+iUorF7b0qozgUU=
|
||||
go.etcd.io/etcd/client/v3 v3.5.11/go.mod h1:a6xQUEqFJ8vztO1agJh/KQKOMfFI8og52ZconzcDJwE=
|
||||
go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg=
|
||||
go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk=
|
||||
go.etcd.io/etcd/pkg/v3 v3.5.10 h1:WPR8K0e9kWl1gAhB5A7gEa5ZBTNkT9NdNWrR8Qpo1CM=
|
||||
go.etcd.io/etcd/pkg/v3 v3.5.10/go.mod h1:TKTuCKKcF1zxmfKWDkfz5qqYaE3JncKKZPFf8c1nFUs=
|
||||
go.etcd.io/etcd/raft/v3 v3.5.10 h1:cgNAYe7xrsrn/5kXMSaH8kM/Ky8mAdMqGOxyYwpP0LA=
|
||||
|
@ -611,22 +611,22 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
|||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
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/google.golang.org/grpc/otelgrpc v0.48.0 h1:P+/g8GpuJGYbOp2tAdKrIPUX9JO02q8Q0YNlHolpibA=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 h1:doUP+ExOpH3spVTLS0FcWGLnQrPct/hD/bCPbDRUEAU=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA=
|
||||
go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY=
|
||||
go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
|
||||
go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
|
||||
go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 h1:o8iWeVFa1BcLtVEV0LzrCxV2/55tB3xLxADr6Kyoey4=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1/go.mod h1:SEVfdK4IoBnbT2FXNM/k8yC08MrfbhWk3U4ljM8B3HE=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1 h1:p3A5+f5l9e/kuEBwLOrnpkIDHQFlHmbiVxMURWRK6gQ=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1/go.mod h1:OClrnXUjBqQbInvjJFjYSnMxBSCXBF8r3b34WqjiIrQ=
|
||||
go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo=
|
||||
go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI=
|
||||
go.opentelemetry.io/otel/sdk v1.23.1 h1:O7JmZw0h76if63LQdsBMKQDWNb5oEcOThG9IrxscV+E=
|
||||
go.opentelemetry.io/otel/sdk v1.23.1/go.mod h1:LzdEVR5am1uKOOwfBWFef2DCi1nu3SA8XQxx2IerWFk=
|
||||
go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8=
|
||||
go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI=
|
||||
go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
|
||||
go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
|
||||
go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
|
||||
go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
|
||||
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
|
||||
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=
|
||||
go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=
|
||||
|
@ -642,8 +642,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
|
|||
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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
|
||||
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
||||
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
|
@ -654,8 +654,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ=
|
||||
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
|
||||
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg=
|
||||
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
|
@ -730,8 +730,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
|
|||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
|
||||
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
|
@ -757,8 +757,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri
|
|||
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
|
||||
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
|
||||
golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A=
|
||||
golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
|
||||
golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
|
||||
golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
|
||||
golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
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=
|
||||
|
@ -773,8 +773,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
|
|||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
|
||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
|
||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -840,13 +840,13 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
|
||||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
|
||||
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
||||
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
@ -856,10 +856,9 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|||
golang.org/x/text v0.3.5/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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
|
||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
|
@ -920,8 +919,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|||
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
|
||||
golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
|
||||
golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw=
|
||||
golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
@ -980,8 +979,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ
|
|||
google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
|
||||
google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
|
||||
google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
|
||||
google.golang.org/api v0.165.0 h1:zd5d4JIIIaYYsfVy1HzoXYZ9rWCSBxxAglbczzo7Bgc=
|
||||
google.golang.org/api v0.165.0/go.mod h1:2OatzO7ZDQsoS7IFf3rvsE17/TldiU3F/zxFHeqUB5o=
|
||||
google.golang.org/api v0.182.0 h1:if5fPvudRQ78GeRx3RayIoiuV7modtErPIZC/T2bIvE=
|
||||
google.golang.org/api v0.182.0/go.mod h1:cGhjy4caqA5yXRzEhkHI8Y9mfyC2VLTlER2l08xaqtM=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
|
@ -989,8 +988,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww
|
|||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
|
||||
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
|
@ -1092,12 +1089,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw
|
|||
google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
|
||||
google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
|
||||
google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
|
||||
google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
|
||||
google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9 h1:4++qSzdWBUy9/2x8L5KZgwZw+mjJZ2yDSCGMVM0YzRs=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:PVreiBMirk8ypES6aw9d4p6iiBNSIfZEBqr3UGoAi2E=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9 h1:hZB7eLIaYlW9qXRfCq/qDaPdbeY3757uARz5Vvfv+cY=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk=
|
||||
google.golang.org/genproto v0.0.0-20240528184218-531527333157 h1:u7WMYrIrVvs0TF5yaKwKNbcJyySYf+HAIFXxWltJOXE=
|
||||
google.golang.org/genproto v0.0.0-20240528184218-531527333157/go.mod h1:ubQlAQnzejB8uZzszhrTCU2Fyp6Vi7ZE5nn0c3W8+qQ=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
|
||||
google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
|
@ -1134,8 +1131,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu
|
|||
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||
google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||
google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY=
|
||||
google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
|
||||
google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
|
||||
google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
|
||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||
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=
|
||||
|
@ -1152,8 +1149,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
|
|||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
|
||||
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
|
@ -1182,37 +1179,37 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
|
|||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
k8s.io/api v0.29.4 h1:WEnF/XdxuCxdG3ayHNRR8yH3cI1B/llkWBma6bq4R3w=
|
||||
k8s.io/api v0.29.4/go.mod h1:DetSv0t4FBTcEpfA84NJV3g9a7+rSzlUHk5ADAYHUv0=
|
||||
k8s.io/apiextensions-apiserver v0.29.2 h1:UK3xB5lOWSnhaCk0RFZ0LUacPZz9RY4wi/yt2Iu+btg=
|
||||
k8s.io/apiextensions-apiserver v0.29.2/go.mod h1:aLfYjpA5p3OwtqNXQFkhJ56TB+spV8Gc4wfMhUA3/b8=
|
||||
k8s.io/apimachinery v0.29.4 h1:RaFdJiDmuKs/8cm1M6Dh1Kvyh59YQFDcFuFTSmXes6Q=
|
||||
k8s.io/apimachinery v0.29.4/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
|
||||
k8s.io/apiserver v0.29.2 h1:+Z9S0dSNr+CjnVXQePG8TcBWHr3Q7BmAr7NraHvsMiQ=
|
||||
k8s.io/apiserver v0.29.2/go.mod h1:B0LieKVoyU7ykQvPFm7XSdIHaCHSzCzQWPFa5bqbeMQ=
|
||||
k8s.io/client-go v0.29.4 h1:79ytIedxVfyXV8rpH3jCBW0u+un0fxHDwX5F9K8dPR8=
|
||||
k8s.io/client-go v0.29.4/go.mod h1:kC1thZQ4zQWYwldsfI088BbK6RkxK+aF5ebV8y9Q4tk=
|
||||
k8s.io/component-base v0.29.2 h1:lpiLyuvPA9yV1aQwGLENYyK7n/8t6l3nn3zAtFTJYe8=
|
||||
k8s.io/component-base v0.29.2/go.mod h1:BfB3SLrefbZXiBfbM+2H1dlat21Uewg/5qtKOl8degM=
|
||||
k8s.io/api v0.30.2 h1:+ZhRj+28QT4UOH+BKznu4CBgPWgkXO7XAvMcMl0qKvI=
|
||||
k8s.io/api v0.30.2/go.mod h1:ULg5g9JvOev2dG0u2hig4Z7tQ2hHIuS+m8MNZ+X6EmI=
|
||||
k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws=
|
||||
k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4=
|
||||
k8s.io/apimachinery v0.30.2 h1:fEMcnBj6qkzzPGSVsAZtQThU62SmQ4ZymlXRC5yFSCg=
|
||||
k8s.io/apimachinery v0.30.2/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
|
||||
k8s.io/apiserver v0.30.1 h1:BEWEe8bzS12nMtDKXzCF5Q5ovp6LjjYkSp8qOPk8LZ8=
|
||||
k8s.io/apiserver v0.30.1/go.mod h1:i87ZnQ+/PGAmSbD/iEKM68bm1D5reX8fO4Ito4B01mo=
|
||||
k8s.io/client-go v0.30.2 h1:sBIVJdojUNPDU/jObC+18tXWcTJVcwyqS9diGdWHk50=
|
||||
k8s.io/client-go v0.30.2/go.mod h1:JglKSWULm9xlJLx4KCkfLLQ7XwtlbflV6uFFSHTMgVs=
|
||||
k8s.io/component-base v0.30.1 h1:bvAtlPh1UrdaZL20D9+sWxsJljMi0QZ3Lmw+kmZAaxQ=
|
||||
k8s.io/component-base v0.30.1/go.mod h1:e/X9kDiOebwlI41AvBHuWdqFriSRrX50CdwA9TFaHLI=
|
||||
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
|
||||
k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||
k8s.io/kms v0.29.2 h1:MDsbp98gSlEQs7K7dqLKNNTwKFQRYYvO4UOlBOjNy6Y=
|
||||
k8s.io/kms v0.29.2/go.mod h1:s/9RC4sYRZ/6Tn6yhNjbfJuZdb8LzlXhdlBnKizeFDo=
|
||||
k8s.io/kube-openapi v0.0.0-20240221221325-2ac9dc51f3f1 h1:rtdnaWfP40MTKv7izH81gkWpZB45pZrwIxyZdPSn1mI=
|
||||
k8s.io/kube-openapi v0.0.0-20240221221325-2ac9dc51f3f1/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw=
|
||||
k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ=
|
||||
k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
k8s.io/kms v0.30.1 h1:gEIbEeCbFiaN2tNfp/EUhFdGr5/CSj8Eyq6Mkr7cCiY=
|
||||
k8s.io/kms v0.30.1/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4=
|
||||
k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a h1:zD1uj3Jf+mD4zmA7W+goE5TxDkI7OGJjBNBzq5fJtLA=
|
||||
k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc=
|
||||
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak=
|
||||
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 h1:/U5vjBbQn3RChhv7P11uhYvCSm5G2GaIi5AIGBS6r4c=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0/go.mod h1:z7+wmGM2dfIiLRfrC6jb5kV2Mq/sK1ZP303cxzkV5Y4=
|
||||
sigs.k8s.io/controller-runtime v0.17.3 h1:65QmN7r3FWgTxDMz9fvGnO1kbf2nu+acg9p2R9oYYYk=
|
||||
sigs.k8s.io/controller-runtime v0.17.3/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY=
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
|
||||
sigs.k8s.io/controller-runtime v0.18.4 h1:87+guW1zhvuPLh1PHybKdYFLU0YJp4FhJRmiHvm5BZw=
|
||||
sigs.k8s.io/controller-runtime v0.18.4/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/kubectl-validate v0.0.3 h1:wcbx6dPXF7BWoWSyih295mEOLBbzZA6CaEHoCufutUo=
|
||||
sigs.k8s.io/kubectl-validate v0.0.3/go.mod h1:Y67xSi06L5XSl+jSGFamNoa117yq6SnN4yXIzWHWxU8=
|
||||
sigs.k8s.io/kubectl-validate v0.0.4 h1:tGKuv0awYHn11Cb6KPsZKxUmHgavF46K3NvVH0Nse9U=
|
||||
sigs.k8s.io/kubectl-validate v0.0.4/go.mod h1:JTm3G+JZLPISqABh73uV7s/sW28q2zZqnTghOzahEKA=
|
||||
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=
|
||||
|
|
|
@ -0,0 +1,360 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
)
|
||||
|
||||
// ActionBindings contains bindings options for an action.
|
||||
type ActionBindings struct {
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
}
|
||||
|
||||
// ActionCheck contains check for an action.
|
||||
type ActionCheck struct {
|
||||
// Check is an assertion tree to validate the operation outcome.
|
||||
// +optional
|
||||
Check *Check `json:"check,omitempty"`
|
||||
}
|
||||
|
||||
// ActionCheckRef contains check reference options for an action.
|
||||
type ActionCheckRef struct {
|
||||
FileRef `json:",inline"`
|
||||
|
||||
// Check provides a check used in assertions.
|
||||
// +optional
|
||||
Check *Check `json:"resource,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
}
|
||||
|
||||
// ActionClusters contains clusters options for an action.
|
||||
type ActionClusters struct {
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
}
|
||||
|
||||
// ActionDryRun contains dry run options for an action.
|
||||
type ActionDryRun struct {
|
||||
// DryRun determines whether the file should be applied in dry run mode.
|
||||
// +optional
|
||||
DryRun *bool `json:"dryRun,omitempty"`
|
||||
}
|
||||
|
||||
// ActionEnv contains environment options for an action.
|
||||
type ActionEnv struct {
|
||||
// Env defines additional environment variables.
|
||||
// +optional
|
||||
Env []Binding `json:"env,omitempty"`
|
||||
|
||||
// SkipLogOutput removes the output from the command. Useful for sensitive logs or to reduce noise.
|
||||
// +optional
|
||||
SkipLogOutput bool `json:"skipLogOutput,omitempty"`
|
||||
}
|
||||
|
||||
// ActionExpectations contains expectations for an action.
|
||||
type ActionExpectations struct {
|
||||
// Expect defines a list of matched checks to validate the operation outcome.
|
||||
// +optional
|
||||
Expect []Expectation `json:"expect,omitempty"`
|
||||
}
|
||||
|
||||
// ActionFormat contains format for an action.
|
||||
type ActionFormat struct {
|
||||
// Format determines the output format (json or yaml).
|
||||
// +optional
|
||||
Format Format `json:"format,omitempty"`
|
||||
}
|
||||
|
||||
type ActionInlineResource struct {
|
||||
// Resource provides a resource to be applied.
|
||||
// +kubebuilder:validation:XEmbeddedResource
|
||||
// +kubebuilder:pruning:PreserveUnknownFields
|
||||
// +optional
|
||||
Resource *unstructured.Unstructured `json:"resource,omitempty"`
|
||||
}
|
||||
|
||||
// ActionObject contains object selector options for an action.
|
||||
type ActionObject struct {
|
||||
ObjectType `json:",inline"`
|
||||
ActionObjectSelector `json:",inline"`
|
||||
}
|
||||
|
||||
// ActionObjectSelector contains object selector options for an action.
|
||||
type ActionObjectSelector struct {
|
||||
ObjectName `json:",inline"`
|
||||
|
||||
// Selector defines labels selector.
|
||||
// +optional
|
||||
Selector string `json:"selector,omitempty"`
|
||||
}
|
||||
|
||||
// ActionOutputs contains outputs options for an action.
|
||||
type ActionOutputs struct {
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
}
|
||||
|
||||
// FileRef represents a file reference.
|
||||
type FileRef struct {
|
||||
// File is the path to the referenced file. This can be a direct path to a file
|
||||
// or an expression that matches multiple files, such as "manifest/*.yaml" for all YAML
|
||||
// files within the "manifest" directory.
|
||||
File string `json:"file,omitempty"`
|
||||
}
|
||||
|
||||
// ActionResourceRef contains resource reference options for an action.
|
||||
type ActionResourceRef struct {
|
||||
FileRef `json:",inline"`
|
||||
// Resource provides a resource to be applied.
|
||||
// +kubebuilder:validation:XEmbeddedResource
|
||||
// +kubebuilder:pruning:PreserveUnknownFields
|
||||
// +optional
|
||||
Resource *unstructured.Unstructured `json:"resource,omitempty"`
|
||||
// ActionInlineResource `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
}
|
||||
|
||||
// ActionTimeout contains timeout options for an action.
|
||||
type ActionTimeout struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
}
|
||||
|
||||
// Apply represents a set of configurations or resources that
|
||||
// should be applied during testing.
|
||||
type Apply struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionOutputs `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Assert represents a test condition that is expected to hold true
|
||||
// during the testing process.
|
||||
type Assert struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionCheckRef `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Command describes a command to run as a part of a test step.
|
||||
type Command struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionCheck `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionEnv `json:",inline"`
|
||||
ActionOutputs `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Entrypoint is the command entry point to run.
|
||||
Entrypoint string `json:"entrypoint"`
|
||||
|
||||
// Args is the command arguments.
|
||||
// +optional
|
||||
Args []string `json:"args,omitempty"`
|
||||
}
|
||||
|
||||
// Create represents a set of resources that should be created.
|
||||
// If a resource already exists in the cluster it will fail.
|
||||
type Create struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionOutputs `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Delete is a reference to an object that should be deleted
|
||||
type Delete struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// File is the path to the referenced file. This can be a direct path to a file
|
||||
// or an expression that matches multiple files, such as "manifest/*.yaml" for all YAML
|
||||
// files within the "manifest" directory.
|
||||
// +optional
|
||||
File string `json:"file,omitempty"`
|
||||
|
||||
// Ref determines objects to be deleted.
|
||||
// +optional
|
||||
Ref *ObjectReference `json:"ref,omitempty"`
|
||||
|
||||
// DeletionPropagationPolicy decides if a deletion will propagate to the dependents of
|
||||
// the object, and how the garbage collector will handle the propagation.
|
||||
// Overrides the deletion propagation policy set in the Configuration, the Test and the TestStep.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=Orphan;Background;Foreground
|
||||
DeletionPropagationPolicy *metav1.DeletionPropagation `json:"deletionPropagationPolicy,omitempty"`
|
||||
}
|
||||
|
||||
// Describe defines how to describe resources.
|
||||
type Describe struct {
|
||||
ActionClusters `json:",inline"`
|
||||
ActionObject `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Show Events indicates whether to include related events.
|
||||
// +optional
|
||||
ShowEvents *bool `json:"showEvents,omitempty"`
|
||||
}
|
||||
|
||||
// Error represents an anticipated error condition that may arise during testing.
|
||||
// Instead of treating such an error as a test failure, it acknowledges it as expected.
|
||||
type Error struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionCheckRef `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Events defines how to collect events.
|
||||
type Events struct {
|
||||
ActionClusters `json:",inline"`
|
||||
ActionFormat `json:",inline"`
|
||||
ActionObjectSelector `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Get defines how to get resources.
|
||||
type Get struct {
|
||||
ActionClusters `json:",inline"`
|
||||
ActionFormat `json:",inline"`
|
||||
ActionObject `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Patch represents a set of resources that should be patched.
|
||||
// If a resource doesn't exist yet in the cluster it will fail.
|
||||
type Patch struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionOutputs `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// PodLogs defines how to collect pod logs.
|
||||
type PodLogs struct {
|
||||
ActionClusters `json:",inline"`
|
||||
ActionObjectSelector `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Container in pod to get logs from else --all-containers is used.
|
||||
// +optional
|
||||
Container string `json:"container,omitempty"`
|
||||
|
||||
// Tail is the number of last lines to collect from pods. If omitted or zero,
|
||||
// then the default is 10 if you use a selector, or -1 (all) if you use a pod name.
|
||||
// This matches default behavior of `kubectl logs`.
|
||||
// +optional
|
||||
Tail *int `json:"tail,omitempty"`
|
||||
}
|
||||
|
||||
// Script describes a script to run as a part of a test step.
|
||||
type Script struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionCheck `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionEnv `json:",inline"`
|
||||
ActionOutputs `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Content defines a shell script (run with "sh -c ...").
|
||||
// +optional
|
||||
Content string `json:"content,omitempty"`
|
||||
}
|
||||
|
||||
// Sleep represents a duration while nothing happens.
|
||||
type Sleep struct {
|
||||
// Duration is the delay used for sleeping.
|
||||
Duration metav1.Duration `json:"duration"`
|
||||
}
|
||||
|
||||
// Update represents a set of resources that should be updated.
|
||||
// If a resource does not exist in the cluster it will fail.
|
||||
type Update struct {
|
||||
ActionBindings `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionOutputs `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Wait specifies how to perform wait operations on resources.
|
||||
type Wait struct {
|
||||
ActionTimeout `json:",inline"`
|
||||
ActionFormat `json:",inline"`
|
||||
ActionClusters `json:",inline"`
|
||||
ActionObject `json:",inline"`
|
||||
|
||||
// WaitFor specifies the condition to wait for.
|
||||
WaitFor `json:"for"`
|
||||
}
|
||||
|
||||
// WaitFor specifies the condition to wait for.
|
||||
type WaitFor struct {
|
||||
// Deletion specifies parameters for waiting on a resource's deletion.
|
||||
// +optional
|
||||
Deletion *WaitForDeletion `json:"deletion,omitempty"`
|
||||
|
||||
// Condition specifies the condition to wait for.
|
||||
// +optional
|
||||
Condition *WaitForCondition `json:"condition,omitempty"`
|
||||
|
||||
// JsonPath specifies the json path condition to wait for.
|
||||
// +optional
|
||||
JsonPath *WaitForJsonPath `json:"jsonPath,omitempty"`
|
||||
}
|
||||
|
||||
// WaitForCondition represents parameters for waiting on a specific condition of a resource.
|
||||
type WaitForCondition struct {
|
||||
// Name defines the specific condition to wait for, e.g., "Available", "Ready".
|
||||
Name string `json:"name"`
|
||||
|
||||
// Value defines the specific condition status to wait for, e.g., "True", "False".
|
||||
// +optional
|
||||
Value *string `json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// WaitForDeletion represents parameters for waiting on a resource's deletion.
|
||||
type WaitForDeletion struct{}
|
||||
|
||||
// WaitForJsonPath represents parameters for waiting on a json path of a resource.
|
||||
type WaitForJsonPath struct {
|
||||
// Path defines the json path to wait for, e.g. '{.status.phase}'.
|
||||
Path string `json:"path"`
|
||||
|
||||
// Value defines the expected value to wait for, e.g., "Running".
|
||||
Value string `json:"value"`
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"github.com/kyverno/kyverno-json/pkg/apis/policy/v1alpha1"
|
||||
)
|
||||
|
||||
// Any represents any type.
|
||||
type Any = v1alpha1.Any
|
|
@ -1,40 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Apply represents a set of configurations or resources that
|
||||
// should be applied during testing.
|
||||
type Apply struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// FileRefOrResource provides a reference to the resources to be applied.
|
||||
FileRefOrResource `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// DryRun determines whether the file should be applied in dry run mode.
|
||||
// +optional
|
||||
DryRun *bool `json:"dryRun,omitempty"`
|
||||
|
||||
// Expect defines a list of matched checks to validate the operation outcome.
|
||||
// +optional
|
||||
Expect []Expectation `json:"expect,omitempty"`
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Assert represents a test condition that is expected to hold true
|
||||
// during the testing process.
|
||||
type Assert struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// FileRefOrAssert provides a reference to the assertion.
|
||||
FileRefOrCheck `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
var identifier = regexp.MustCompile(`^(?:\w+|\(.+\))$`)
|
||||
|
||||
// Binding represents a key/value set as a binding in an executing test.
|
||||
type Binding struct {
|
||||
// Name the name of the binding.
|
||||
// +kubebuilder:validation:Pattern=`^(?:\w+|\(.+\))$`
|
||||
Name string `json:"name"`
|
||||
|
||||
// Value value of the binding.
|
||||
// +kubebuilder:validation:Schemaless
|
||||
// +kubebuilder:pruning:PreserveUnknownFields
|
||||
Value Any `json:"value"`
|
||||
}
|
||||
|
||||
func (b Binding) CheckName() error {
|
||||
if !identifier.MatchString(b.Name) {
|
||||
return fmt.Errorf("invalid name %s", b.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestBinding_CheckName(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
bindingName string
|
||||
bindingValue Any
|
||||
wantErr bool
|
||||
}{{
|
||||
name: "empty",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "simple",
|
||||
bindingName: "simple",
|
||||
wantErr: false,
|
||||
}, {
|
||||
name: "with dollar",
|
||||
bindingName: "$simple",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "with space",
|
||||
bindingName: "simple one",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "with dot",
|
||||
bindingName: "simple.one",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "good expression",
|
||||
bindingName: "('test')",
|
||||
wantErr: false,
|
||||
}, {
|
||||
name: "bad expression",
|
||||
bindingName: "('test'",
|
||||
wantErr: true,
|
||||
}}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
b := Binding{
|
||||
Name: tt.bindingName,
|
||||
Value: tt.bindingValue,
|
||||
}
|
||||
err := b.CheckName()
|
||||
if tt.wantErr {
|
||||
assert.Error(t, err)
|
||||
} else {
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Catch defines actions to be executed on failure.
|
||||
type Catch struct {
|
||||
// Description contains a description of the operation.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
|
||||
// PodLogs determines the pod logs collector to execute.
|
||||
// +optional
|
||||
PodLogs *PodLogs `json:"podLogs,omitempty"`
|
||||
|
||||
// Events determines the events collector to execute.
|
||||
// +optional
|
||||
Events *Events `json:"events,omitempty"`
|
||||
|
||||
// Describe determines the resource describe collector to execute.
|
||||
// +optional
|
||||
Describe *Describe `json:"describe,omitempty"`
|
||||
|
||||
// Wait determines the resource wait collector to execute.
|
||||
// +optional
|
||||
Wait *Wait `json:"wait,omitempty"`
|
||||
|
||||
// Get determines the resource get collector to execute.
|
||||
// +optional
|
||||
Get *Get `json:"get,omitempty"`
|
||||
|
||||
// Delete represents a deletion operation.
|
||||
// +optional
|
||||
Delete *Delete `json:"delete,omitempty"`
|
||||
|
||||
// Command defines a command to run.
|
||||
// +optional
|
||||
Command *Command `json:"command,omitempty"`
|
||||
|
||||
// Script defines a script to run.
|
||||
// +optional
|
||||
Script *Script `json:"script,omitempty"`
|
||||
|
||||
// Sleep defines zzzz.
|
||||
// +optional
|
||||
Sleep *Sleep `json:"sleep,omitempty"`
|
||||
}
|
||||
|
||||
func (c *Catch) Bindings() []Binding {
|
||||
switch {
|
||||
case c.Command != nil:
|
||||
return c.Command.Bindings
|
||||
case c.Delete != nil:
|
||||
return c.Delete.Bindings
|
||||
case c.Describe != nil:
|
||||
return nil
|
||||
case c.Events != nil:
|
||||
return nil
|
||||
case c.Get != nil:
|
||||
return nil
|
||||
case c.PodLogs != nil:
|
||||
return nil
|
||||
case c.Script != nil:
|
||||
return c.Script.Bindings
|
||||
case c.Sleep != nil:
|
||||
return nil
|
||||
case c.Wait != nil:
|
||||
return nil
|
||||
}
|
||||
panic("missing binding operation type handler")
|
||||
}
|
||||
|
||||
func (c *Catch) Outputs() []Output {
|
||||
switch {
|
||||
case c.Command != nil:
|
||||
return c.Command.Outputs
|
||||
case c.Delete != nil:
|
||||
return nil
|
||||
case c.Describe != nil:
|
||||
return nil
|
||||
case c.Events != nil:
|
||||
return nil
|
||||
case c.Get != nil:
|
||||
return nil
|
||||
case c.PodLogs != nil:
|
||||
return nil
|
||||
case c.Script != nil:
|
||||
return c.Script.Outputs
|
||||
case c.Sleep != nil:
|
||||
return nil
|
||||
case c.Wait != nil:
|
||||
return nil
|
||||
}
|
||||
panic("missing output operation type handler")
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
package v1alpha1
|
||||
|
||||
// Finally defines actions to be executed at the end of a test.
|
||||
type Finally struct {
|
||||
// CatchFinally defines actions to be executed in catch, finally and cleanup blocks.
|
||||
type CatchFinally struct {
|
||||
// Description contains a description of the operation.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
|
@ -43,7 +43,7 @@ type Finally struct {
|
|||
Sleep *Sleep `json:"sleep,omitempty"`
|
||||
}
|
||||
|
||||
func (f *Finally) Bindings() []Binding {
|
||||
func (f *CatchFinally) Bindings() []Binding {
|
||||
switch {
|
||||
case f.Command != nil:
|
||||
return f.Command.Bindings
|
||||
|
@ -67,7 +67,7 @@ func (f *Finally) Bindings() []Binding {
|
|||
panic("missing binding operation type handler")
|
||||
}
|
||||
|
||||
func (f *Finally) Outputs() []Output {
|
||||
func (f *CatchFinally) Outputs() []Output {
|
||||
switch {
|
||||
case f.Command != nil:
|
||||
return f.Command.Outputs
|
|
@ -25,14 +25,14 @@ func TestFinally_Bindings(t *testing.T) {
|
|||
}{{
|
||||
fields: fields{
|
||||
Command: &Command{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Delete: &Delete{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -55,7 +55,7 @@ func TestFinally_Bindings(t *testing.T) {
|
|||
}, {
|
||||
fields: fields{
|
||||
Script: &Script{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -70,7 +70,7 @@ func TestFinally_Bindings(t *testing.T) {
|
|||
}}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := &Finally{
|
||||
c := &CatchFinally{
|
||||
PodLogs: tt.fields.PodLogs,
|
||||
Events: tt.fields.Events,
|
||||
Describe: tt.fields.Describe,
|
||||
|
@ -85,7 +85,7 @@ func TestFinally_Bindings(t *testing.T) {
|
|||
assert.Equal(t, tt.want, len(got))
|
||||
})
|
||||
}
|
||||
assert.Panics(t, func() { (&Finally{}).Bindings() })
|
||||
assert.Panics(t, func() { (&CatchFinally{}).Bindings() })
|
||||
}
|
||||
|
||||
func TestFinally_Outputs(t *testing.T) {
|
||||
|
@ -107,7 +107,7 @@ func TestFinally_Outputs(t *testing.T) {
|
|||
}{{
|
||||
fields: fields{
|
||||
Command: &Command{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -134,7 +134,7 @@ func TestFinally_Outputs(t *testing.T) {
|
|||
}, {
|
||||
fields: fields{
|
||||
Script: &Script{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -149,7 +149,7 @@ func TestFinally_Outputs(t *testing.T) {
|
|||
}}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := &Finally{
|
||||
c := &CatchFinally{
|
||||
PodLogs: tt.fields.PodLogs,
|
||||
Events: tt.fields.Events,
|
||||
Describe: tt.fields.Describe,
|
||||
|
@ -164,5 +164,5 @@ func TestFinally_Outputs(t *testing.T) {
|
|||
assert.Equal(t, tt.want, len(got))
|
||||
})
|
||||
}
|
||||
assert.Panics(t, func() { (&Finally{}).Outputs() })
|
||||
assert.Panics(t, func() { (&CatchFinally{}).Outputs() })
|
||||
}
|
|
@ -1,168 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestCatch_Bindings(t *testing.T) {
|
||||
type fields struct {
|
||||
PodLogs *PodLogs
|
||||
Events *Events
|
||||
Describe *Describe
|
||||
Wait *Wait
|
||||
Get *Get
|
||||
Delete *Delete
|
||||
Command *Command
|
||||
Script *Script
|
||||
Sleep *Sleep
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
want int
|
||||
}{{
|
||||
fields: fields{
|
||||
Command: &Command{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Delete: &Delete{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Describe: &Describe{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Events: &Events{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Get: &Get{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
PodLogs: &PodLogs{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Script: &Script{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Sleep: &Sleep{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Wait: &Wait{},
|
||||
},
|
||||
}}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := &Catch{
|
||||
PodLogs: tt.fields.PodLogs,
|
||||
Events: tt.fields.Events,
|
||||
Describe: tt.fields.Describe,
|
||||
Wait: tt.fields.Wait,
|
||||
Get: tt.fields.Get,
|
||||
Delete: tt.fields.Delete,
|
||||
Command: tt.fields.Command,
|
||||
Script: tt.fields.Script,
|
||||
Sleep: tt.fields.Sleep,
|
||||
}
|
||||
got := c.Bindings()
|
||||
assert.Equal(t, tt.want, len(got))
|
||||
})
|
||||
}
|
||||
assert.Panics(t, func() { (&Catch{}).Bindings() })
|
||||
}
|
||||
|
||||
func TestCatch_Outputs(t *testing.T) {
|
||||
type fields struct {
|
||||
PodLogs *PodLogs
|
||||
Events *Events
|
||||
Describe *Describe
|
||||
Wait *Wait
|
||||
Get *Get
|
||||
Delete *Delete
|
||||
Command *Command
|
||||
Script *Script
|
||||
Sleep *Sleep
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
want int
|
||||
}{{
|
||||
fields: fields{
|
||||
Command: &Command{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Delete: &Delete{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Describe: &Describe{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Events: &Events{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Get: &Get{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
PodLogs: &PodLogs{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Script: &Script{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Sleep: &Sleep{},
|
||||
},
|
||||
}, {
|
||||
fields: fields{
|
||||
Wait: &Wait{},
|
||||
},
|
||||
}}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := &Catch{
|
||||
PodLogs: tt.fields.PodLogs,
|
||||
Events: tt.fields.Events,
|
||||
Describe: tt.fields.Describe,
|
||||
Wait: tt.fields.Wait,
|
||||
Get: tt.fields.Get,
|
||||
Delete: tt.fields.Delete,
|
||||
Command: tt.fields.Command,
|
||||
Script: tt.fields.Script,
|
||||
Sleep: tt.fields.Sleep,
|
||||
}
|
||||
got := c.Outputs()
|
||||
assert.Equal(t, tt.want, len(got))
|
||||
})
|
||||
}
|
||||
assert.Panics(t, func() { (&Catch{}).Outputs() })
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Check represents a check to be applied on the result of an operation.
|
||||
type Check = Any
|
|
@ -1,11 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Cluster defines cluster config and context.
|
||||
type Cluster struct {
|
||||
// Kubeconfig is the path to the referenced file.
|
||||
Kubeconfig string `json:"kubeconfig"`
|
||||
|
||||
// Context is the name of the context to use.
|
||||
// +optional
|
||||
Context string `json:"context,omitempty"`
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Command describes a command to run as a part of a test step.
|
||||
type Command struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
|
||||
// Env defines additional environment variables.
|
||||
// +optional
|
||||
Env []Binding `json:"env,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Entrypoint is the command entry point to run.
|
||||
Entrypoint string `json:"entrypoint"`
|
||||
|
||||
// Args is the command arguments.
|
||||
// +optional
|
||||
Args []string `json:"args,omitempty"`
|
||||
|
||||
// SkipLogOutput removes the output from the command. Useful for sensitive logs or to reduce noise.
|
||||
// +optional
|
||||
SkipLogOutput bool `json:"skipLogOutput,omitempty"`
|
||||
|
||||
// Check is an assertion tree to validate the operation outcome.
|
||||
// +optional
|
||||
Check *Check `json:"check,omitempty"`
|
||||
}
|
|
@ -21,3 +21,109 @@ type Configuration struct {
|
|||
// Configuration spec.
|
||||
Spec ConfigurationSpec `json:"spec"`
|
||||
}
|
||||
|
||||
// ConfigurationSpec contains the configuration used to run tests.
|
||||
type ConfigurationSpec struct {
|
||||
// Global timeouts configuration. Applies to all tests/test steps if not overridden.
|
||||
// +optional
|
||||
Timeouts Timeouts `json:"timeouts"`
|
||||
|
||||
// If set, do not delete the resources after running the tests (implies SkipClusterDelete).
|
||||
// +optional
|
||||
SkipDelete bool `json:"skipDelete,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// FailFast determines whether the test should stop upon encountering the first failure.
|
||||
// +optional
|
||||
FailFast bool `json:"failFast,omitempty"`
|
||||
|
||||
// The maximum number of tests to run at once.
|
||||
// +kubebuilder:validation:Format:=int
|
||||
// +kubebuilder:validation:Minimum:=1
|
||||
// +optional
|
||||
Parallel *int `json:"parallel,omitempty"`
|
||||
|
||||
// DeletionPropagationPolicy decides if a deletion will propagate to the dependents of
|
||||
// the object, and how the garbage collector will handle the propagation.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=Orphan;Background;Foreground
|
||||
// +kubebuilder:default:=Background
|
||||
DeletionPropagationPolicy metav1.DeletionPropagation `json:"deletionPropagationPolicy,omitempty"`
|
||||
|
||||
// ReportFormat determines test report format (JSON|XML|nil) nil == no report.
|
||||
// maps to report.Type, however we don't want generated.deepcopy to have reference to it.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=JSON;XML;
|
||||
ReportFormat ReportFormatType `json:"reportFormat,omitempty"`
|
||||
|
||||
// ReportPath defines the path.
|
||||
// +optional
|
||||
ReportPath string `json:"reportPath,omitempty"`
|
||||
|
||||
// ReportName defines the name of report to create. It defaults to "chainsaw-report".
|
||||
// +optional
|
||||
// +kubebuilder:default:="chainsaw-report"
|
||||
ReportName string `json:"reportName,omitempty"`
|
||||
|
||||
// Namespace defines the namespace to use for tests.
|
||||
// If not specified, every test will execute in a random ephemeral namespace
|
||||
// unless the namespace is overridden in a the test spec.
|
||||
// +optional
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
// NamespaceTemplate defines a template to create the test namespace.
|
||||
// +optional
|
||||
NamespaceTemplate *Any `json:"namespaceTemplate,omitempty"`
|
||||
|
||||
// FullName makes use of the full test case folder path instead of the folder name.
|
||||
// +optional
|
||||
FullName bool `json:"fullName,omitempty"`
|
||||
|
||||
// ExcludeTestRegex is used to exclude tests based on a regular expression.
|
||||
// +optional
|
||||
ExcludeTestRegex string `json:"excludeTestRegex,omitempty"`
|
||||
|
||||
// IncludeTestRegex is used to include tests based on a regular expression.
|
||||
// +optional
|
||||
IncludeTestRegex string `json:"includeTestRegex,omitempty"`
|
||||
|
||||
// RepeatCount indicates how many times the tests should be executed.
|
||||
// +kubebuilder:validation:Format:=int
|
||||
// +kubebuilder:validation:Minimum:=1
|
||||
// +optional
|
||||
RepeatCount *int `json:"repeatCount,omitempty"`
|
||||
|
||||
// TestFile is the name of the file containing the test to run.
|
||||
// If no extension is provided, chainsaw will try with .yaml first and .yml if needed.
|
||||
// +kubebuilder:default:="chainsaw-test"
|
||||
// +optional
|
||||
TestFile string `json:"testFile,omitempty"`
|
||||
|
||||
// ForceTerminationGracePeriod forces the termination grace period on pods, statefulsets, daemonsets and deployments.
|
||||
// +optional
|
||||
ForceTerminationGracePeriod *metav1.Duration `json:"forceTerminationGracePeriod,omitempty"`
|
||||
|
||||
// DelayBeforeCleanup adds a delay between the time a test ends and the time cleanup starts.
|
||||
// +optional
|
||||
DelayBeforeCleanup *metav1.Duration `json:"delayBeforeCleanup,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
|
||||
// Catch defines what the tests steps will execute when an error happens.
|
||||
// This will be combined with catch handlers defined at the test and step levels.
|
||||
// +optional
|
||||
Catch []CatchFinally `json:"catch,omitempty"`
|
||||
}
|
||||
|
||||
type ReportFormatType string
|
||||
|
||||
const (
|
||||
JSONFormat ReportFormatType = "JSON"
|
||||
XMLFormat ReportFormatType = "XML"
|
||||
NoReport ReportFormatType = ""
|
||||
)
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Create represents a set of resources that should be created.
|
||||
// If a resource already exists in the cluster it will fail.
|
||||
type Create struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// FileRefOrResource provides a reference to the file containing the resources to be created.
|
||||
FileRefOrResource `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// DryRun determines whether the file should be applied in dry run mode.
|
||||
// +optional
|
||||
DryRun *bool `json:"dryRun,omitempty"`
|
||||
|
||||
// Expect defines a list of matched checks to validate the operation outcome.
|
||||
// +optional
|
||||
Expect []Expectation `json:"expect,omitempty"`
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Delete is a reference to an object that should be deleted
|
||||
type Delete struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// ObjectReference determines objects to be deleted.
|
||||
ObjectReference `json:"ref"`
|
||||
|
||||
// Expect defines a list of matched checks to validate the operation outcome.
|
||||
// +optional
|
||||
Expect []Expectation `json:"expect,omitempty"`
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Describe defines how to describe resources.
|
||||
type Describe struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// ResourceReference referenced resource type.
|
||||
ResourceReference `json:",inline"`
|
||||
|
||||
// ObjectLabelsSelector determines the selection process of referenced objects.
|
||||
ObjectLabelsSelector `json:",inline"`
|
||||
|
||||
// Show Events indicates whether to include related events.
|
||||
// +optional
|
||||
ShowEvents *bool `json:"showEvents,omitempty"`
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Error represents an anticipated error condition that may arise during testing.
|
||||
// Instead of treating such an error as a test failure, it acknowledges it as expected.
|
||||
type Error struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// FileRefOrAssert provides a reference to the expected error.
|
||||
FileRefOrCheck `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Events defines how to collect events.
|
||||
type Events struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// ObjectLabelsSelector determines the selection process of referenced objects.
|
||||
ObjectLabelsSelector `json:",inline"`
|
||||
|
||||
// Format determines the output format (json or yaml).
|
||||
// +optional
|
||||
Format Format `json:"format,omitempty"`
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Expectation represents a check to be applied on the result of an operation
|
||||
// with a match filter to determine if the verification should be considered.
|
||||
type Expectation struct {
|
||||
// Match defines the matching statement.
|
||||
// +optional
|
||||
Match *Match `json:"match,omitempty"`
|
||||
|
||||
// Check defines the verification statement.
|
||||
Check Check `json:"check"`
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// FileRef represents a file reference.
|
||||
type FileRef struct {
|
||||
// File is the path to the referenced file. This can be a direct path to a file
|
||||
// or an expression that matches multiple files, such as "manifest/*.yaml" for all YAML
|
||||
// files within the "manifest" directory.
|
||||
File string `json:"file,omitempty"`
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// FileRefOrCheck represents a file reference or resource.
|
||||
type FileRefOrCheck struct {
|
||||
// FileRef provides a reference to the file containing the resources to be applied.
|
||||
// +optional
|
||||
FileRef `json:",inline"`
|
||||
|
||||
// Check provides a check used in assertions.
|
||||
// +optional
|
||||
Check *Check `json:"resource,omitempty"`
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
)
|
||||
|
||||
// FileRefOrResource represents a file reference or resource.
|
||||
type FileRefOrResource struct {
|
||||
// FileRef provides a reference to the file containing the resources to be applied.
|
||||
// +optional
|
||||
FileRef `json:",inline"`
|
||||
|
||||
// Resource provides a resource to be applied.
|
||||
// +kubebuilder:validation:XEmbeddedResource
|
||||
// +kubebuilder:pruning:PreserveUnknownFields
|
||||
// +optional
|
||||
Resource *unstructured.Unstructured `json:"resource,omitempty"`
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Format determines the output format (json or yaml).
|
||||
// +kubebuilder:validation:Pattern=`^(?:json|yaml|\(.+\))$`
|
||||
type Format string
|
|
@ -1,26 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Get defines how to get resources.
|
||||
type Get struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// ResourceReference referenced resource type.
|
||||
ResourceReference `json:",inline"`
|
||||
|
||||
// ObjectLabelsSelector determines the selection process of referenced objects.
|
||||
ObjectLabelsSelector `json:",inline"`
|
||||
|
||||
// Format determines the output format (json or yaml).
|
||||
// +optional
|
||||
Format Format `json:"format,omitempty"`
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Match represents a match condition against an evaluated object.
|
||||
type Match = Any
|
|
@ -1,20 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// ObjectLabelsSelector represents a strategy to select objects.
|
||||
// For a single object name and namespace are used to identify the object.
|
||||
// For multiple objects use selector.
|
||||
type ObjectLabelsSelector struct {
|
||||
// Namespace of the referent.
|
||||
// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
|
||||
// +optional
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
// Name of the referent.
|
||||
// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// Selector defines labels selector.
|
||||
// +optional
|
||||
Selector string `json:"selector,omitempty"`
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// ObjectReference represents one or more objects with a specific apiVersion and kind.
|
||||
// For a single object name and namespace are used to identify the object.
|
||||
// For multiple objects use labels.
|
||||
type ObjectReference struct {
|
||||
// ObjectType determines the type of referenced objects.
|
||||
ObjectType `json:",inline"`
|
||||
|
||||
// ObjectSelector determines the selection process of referenced objects.
|
||||
ObjectSelector `json:",inline"`
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// ObjectSelector represents a strategy to select objects.
|
||||
// For a single object name and namespace are used to identify the object.
|
||||
// For multiple objects use labels.
|
||||
type ObjectSelector struct {
|
||||
// Namespace of the referent.
|
||||
// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
|
||||
// +optional
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
// Name of the referent.
|
||||
// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// Label selector to match objects to delete
|
||||
// +optional
|
||||
Labels map[string]string `json:"labels,omitempty"`
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// ObjectType represents a specific apiVersion and kind.
|
||||
type ObjectType struct {
|
||||
// API version of the referent.
|
||||
APIVersion string `json:"apiVersion"`
|
||||
|
||||
// Kind of the referent.
|
||||
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||
Kind string `json:"kind"`
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
package v1alpha1
|
||||
|
||||
// Operation defines a single operation, only one action is permitted for a given operation.
|
||||
type Operation struct {
|
||||
// OperationBase defines common elements to all operations.
|
||||
type OperationBase struct {
|
||||
// Description contains a description of the operation.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
|
@ -10,6 +10,13 @@ type Operation struct {
|
|||
// Even if the test continues executing, it will still be reported as failed.
|
||||
// +optional
|
||||
ContinueOnError *bool `json:"continueOnError,omitempty"`
|
||||
}
|
||||
|
||||
// Operation defines a single operation, only one action is permitted for a given operation.
|
||||
type Operation struct {
|
||||
// OperationBase defines common elements to all operations.
|
||||
// +optional
|
||||
OperationBase `json:",inline"`
|
||||
|
||||
// Apply represents resources that should be applied for this test step. This can include things
|
||||
// like configuration settings or any other resources that need to be available during the test.
|
||||
|
@ -32,15 +39,31 @@ type Operation struct {
|
|||
// +optional
|
||||
Delete *Delete `json:"delete,omitempty"`
|
||||
|
||||
// Describe determines the resource describe collector to execute.
|
||||
// +optional
|
||||
Describe *Describe `json:"describe,omitempty"`
|
||||
|
||||
// Error represents the expected errors for this test step. If any of these errors occur, the test
|
||||
// will consider them as expected; otherwise, they will be treated as test failures.
|
||||
// +optional
|
||||
Error *Error `json:"error,omitempty"`
|
||||
|
||||
// Events determines the events collector to execute.
|
||||
// +optional
|
||||
Events *Events `json:"events,omitempty"`
|
||||
|
||||
// Get determines the resource get collector to execute.
|
||||
// +optional
|
||||
Get *Get `json:"get,omitempty"`
|
||||
|
||||
// Patch represents a patch operation.
|
||||
// +optional
|
||||
Patch *Patch `json:"patch,omitempty"`
|
||||
|
||||
// PodLogs determines the pod logs collector to execute.
|
||||
// +optional
|
||||
PodLogs *PodLogs `json:"podLogs,omitempty"`
|
||||
|
||||
// Script defines a script to run.
|
||||
// +optional
|
||||
Script *Script `json:"script,omitempty"`
|
||||
|
@ -70,10 +93,18 @@ func (o *Operation) Bindings() []Binding {
|
|||
return o.Create.Bindings
|
||||
case o.Delete != nil:
|
||||
return o.Delete.Bindings
|
||||
case o.Describe != nil:
|
||||
return nil
|
||||
case o.Error != nil:
|
||||
return o.Error.Bindings
|
||||
case o.Events != nil:
|
||||
return nil
|
||||
case o.Get != nil:
|
||||
return nil
|
||||
case o.Patch != nil:
|
||||
return o.Patch.Bindings
|
||||
case o.PodLogs != nil:
|
||||
return nil
|
||||
case o.Script != nil:
|
||||
return o.Script.Bindings
|
||||
case o.Sleep != nil:
|
||||
|
@ -98,10 +129,18 @@ func (o *Operation) Outputs() []Output {
|
|||
return o.Create.Outputs
|
||||
case o.Delete != nil:
|
||||
return nil
|
||||
case o.Describe != nil:
|
||||
return nil
|
||||
case o.Error != nil:
|
||||
return nil
|
||||
case o.Events != nil:
|
||||
return nil
|
||||
case o.Get != nil:
|
||||
return nil
|
||||
case o.Patch != nil:
|
||||
return o.Patch.Outputs
|
||||
case o.PodLogs != nil:
|
||||
return nil
|
||||
case o.Script != nil:
|
||||
return o.Script.Outputs
|
||||
case o.Sleep != nil:
|
||||
|
|
|
@ -27,56 +27,56 @@ func TestOperation_Bindings(t *testing.T) {
|
|||
}{{
|
||||
fields: fields{
|
||||
Apply: &Apply{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Assert: &Assert{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Command: &Command{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Create: &Create{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Delete: &Delete{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Error: &Error{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Patch: &Patch{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Script: &Script{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -87,7 +87,7 @@ func TestOperation_Bindings(t *testing.T) {
|
|||
}, {
|
||||
fields: fields{
|
||||
Update: &Update{
|
||||
Bindings: []Binding{{"foo", Any{Value: "bar"}}},
|
||||
ActionBindings: ActionBindings{Bindings: []Binding{{"foo", Any{Value: "bar"}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -139,7 +139,7 @@ func TestOperation_Outputs(t *testing.T) {
|
|||
}{{
|
||||
fields: fields{
|
||||
Apply: &Apply{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -150,14 +150,14 @@ func TestOperation_Outputs(t *testing.T) {
|
|||
}, {
|
||||
fields: fields{
|
||||
Command: &Command{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Create: &Create{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -172,14 +172,14 @@ func TestOperation_Outputs(t *testing.T) {
|
|||
}, {
|
||||
fields: fields{
|
||||
Patch: &Patch{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
}, {
|
||||
fields: fields{
|
||||
Script: &Script{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
@ -190,7 +190,7 @@ func TestOperation_Outputs(t *testing.T) {
|
|||
}, {
|
||||
fields: fields{
|
||||
Update: &Update{
|
||||
Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}},
|
||||
ActionOutputs: ActionOutputs{Outputs: []Output{{Binding: Binding{"foo", Any{Value: "bar"}}}}},
|
||||
},
|
||||
},
|
||||
want: 1,
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Output represents an output binding with a match to determine if the binding must be considered or not.
|
||||
type Output struct {
|
||||
// Binding determines the binding to create when the match succeeds.
|
||||
Binding `json:",inline"`
|
||||
|
||||
// Match defines the matching statement.
|
||||
// +optional
|
||||
Match *Match `json:"match,omitempty"`
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Patch represents a set of resources that should be patched.
|
||||
// If a resource doesn't exist yet in the cluster it will fail.
|
||||
type Patch struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// FileRefOrResource provides a reference to the file containing the resources to be patched.
|
||||
FileRefOrResource `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// DryRun determines whether the file should be applied in dry run mode.
|
||||
// +optional
|
||||
DryRun *bool `json:"dryRun,omitempty"`
|
||||
|
||||
// Expect defines a list of matched checks to validate the operation outcome.
|
||||
// +optional
|
||||
Expect []Expectation `json:"expect,omitempty"`
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// PodLogs defines how to collect pod logs.
|
||||
type PodLogs struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// ObjectLabelsSelector determines the selection process of referenced objects.
|
||||
ObjectLabelsSelector `json:",inline"`
|
||||
|
||||
// Container in pod to get logs from else --all-containers is used.
|
||||
// +optional
|
||||
Container string `json:"container,omitempty"`
|
||||
|
||||
// Tail is the number of last lines to collect from pods. If omitted or zero,
|
||||
// then the default is 10 if you use a selector, or -1 (all) if you use a pod name.
|
||||
// This matches default behavior of `kubectl logs`.
|
||||
// +optional
|
||||
Tail *int `json:"tail,omitempty"`
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// ResourceReference represents a resource (API), it can be represented with a resource or a kind.
|
||||
// Optionally an apiVersion can be specified.
|
||||
type ResourceReference struct {
|
||||
// API version of the referent.
|
||||
// +optional
|
||||
APIVersion string `json:"apiVersion,omitempty"`
|
||||
|
||||
// Kind of the referent.
|
||||
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||
// +optional
|
||||
Kind string `json:"kind,omitempty"`
|
||||
|
||||
// Resource name of the referent.
|
||||
// +optional
|
||||
Resource string `json:"resource,omitempty"`
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Script describes a script to run as a part of a test step.
|
||||
type Script struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
|
||||
// Env defines additional environment variables.
|
||||
// +optional
|
||||
Env []Binding `json:"env,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Content defines a shell script (run with "sh -c ...").
|
||||
// +optional
|
||||
Content string `json:"content,omitempty"`
|
||||
|
||||
// SkipLogOutput removes the output from the command. Useful for sensitive logs or to reduce noise.
|
||||
// +optional
|
||||
SkipLogOutput bool `json:"skipLogOutput,omitempty"`
|
||||
|
||||
// Check is an assertion tree to validate the operation outcome.
|
||||
// +optional
|
||||
Check *Check `json:"check,omitempty"`
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Sleep represents a duration while nothing happens.
|
||||
type Sleep struct {
|
||||
// Duration is the delay used for sleeping.
|
||||
Duration metav1.Duration `json:"duration"`
|
||||
}
|
|
@ -1,5 +1,19 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// TestStep contains the test step definition used in a test spec.
|
||||
type TestStep struct {
|
||||
// Name of the step.
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// TestStepSpec of the step.
|
||||
TestStepSpec `json:",inline"`
|
||||
}
|
||||
|
||||
// TestStepSpec defines the desired state and behavior for each test step.
|
||||
type TestStepSpec struct {
|
||||
// Description contains a description of the test step.
|
||||
|
@ -10,10 +24,21 @@ type TestStepSpec struct {
|
|||
// +optional
|
||||
Timeouts *Timeouts `json:"timeouts,omitempty"`
|
||||
|
||||
// DeletionPropagationPolicy decides if a deletion will propagate to the dependents of
|
||||
// the object, and how the garbage collector will handle the propagation.
|
||||
// Overrides the deletion propagation policy set in both the Configuration and the Test.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=Orphan;Background;Foreground
|
||||
DeletionPropagationPolicy *metav1.DeletionPropagation `json:"deletionPropagationPolicy,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
|
||||
// SkipDelete determines whether the resources created by the step should be deleted after the test step is executed.
|
||||
// +optional
|
||||
SkipDelete *bool `json:"skipDelete,omitempty"`
|
||||
|
@ -32,9 +57,13 @@ type TestStepSpec struct {
|
|||
|
||||
// Catch defines what the step will execute when an error happens.
|
||||
// +optional
|
||||
Catch []Catch `json:"catch,omitempty"`
|
||||
Catch []CatchFinally `json:"catch,omitempty"`
|
||||
|
||||
// Finally defines what the step will execute after the step is terminated.
|
||||
// +optional
|
||||
Finally []Finally `json:"finally,omitempty"`
|
||||
Finally []CatchFinally `json:"finally,omitempty"`
|
||||
|
||||
// Cleanup defines what will be executed after the test is terminated.
|
||||
// +optional
|
||||
Cleanup []CatchFinally `json:"cleanup,omitempty"`
|
||||
}
|
|
@ -8,6 +8,7 @@ import (
|
|||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||
// +kubebuilder:object:root=true
|
||||
// +kubebuilder:resource:scope=Cluster
|
||||
// +kubebuilder:storageversion
|
||||
|
||||
// Test is the resource that contains a test definition.
|
||||
type Test struct {
|
||||
|
@ -20,3 +21,84 @@ type Test struct {
|
|||
// Test spec.
|
||||
Spec TestSpec `json:"spec"`
|
||||
}
|
||||
|
||||
// TestSpec contains the test spec.
|
||||
type TestSpec struct {
|
||||
// Description contains a description of the test.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
|
||||
// Timeouts for the test. Overrides the global timeouts set in the Configuration on a per operation basis.
|
||||
// +optional
|
||||
Timeouts *Timeouts `json:"timeouts,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
|
||||
// Skip determines whether the test should skipped.
|
||||
// +optional
|
||||
Skip *bool `json:"skip,omitempty"`
|
||||
|
||||
// Concurrent determines whether the test should run concurrently with other tests.
|
||||
// +optional
|
||||
Concurrent *bool `json:"concurrent,omitempty"`
|
||||
|
||||
// SkipDelete determines whether the resources created by the test should be deleted after the test is executed.
|
||||
// +optional
|
||||
SkipDelete *bool `json:"skipDelete,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// Namespace determines whether the test should run in a random ephemeral namespace or not.
|
||||
// +optional
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
// NamespaceTemplate defines a template to create the test namespace.
|
||||
// +optional
|
||||
NamespaceTemplate *Any `json:"namespaceTemplate,omitempty"`
|
||||
|
||||
// Scenarios defines test scenarios.
|
||||
// +optional
|
||||
Scenarios []Scenario `json:"scenarios,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Steps defining the test.
|
||||
Steps []TestStep `json:"steps"`
|
||||
|
||||
// Catch defines what the steps will execute when an error happens.
|
||||
// This will be combined with catch handlers defined at the step level.
|
||||
// +optional
|
||||
Catch []CatchFinally `json:"catch,omitempty"`
|
||||
|
||||
// ForceTerminationGracePeriod forces the termination grace period on pods, statefulsets, daemonsets and deployments.
|
||||
// +optional
|
||||
ForceTerminationGracePeriod *metav1.Duration `json:"forceTerminationGracePeriod,omitempty"`
|
||||
|
||||
// DelayBeforeCleanup adds a delay between the time a test ends and the time cleanup starts.
|
||||
// +optional
|
||||
DelayBeforeCleanup *metav1.Duration `json:"delayBeforeCleanup,omitempty"`
|
||||
|
||||
// DeletionPropagationPolicy decides if a deletion will propagate to the dependents of
|
||||
// the object, and how the garbage collector will handle the propagation.
|
||||
// Overrides the deletion propagation policy set in the Configuration.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=Orphan;Background;Foreground
|
||||
DeletionPropagationPolicy *metav1.DeletionPropagation `json:"deletionPropagationPolicy,omitempty"`
|
||||
}
|
||||
|
||||
// Scenario defines per scenario bindings.
|
||||
type Scenario struct {
|
||||
// Bindings defines binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
}
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// TestSpec contains the test spec.
|
||||
type TestSpec struct {
|
||||
// Description contains a description of the test.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
|
||||
// Timeouts for the test. Overrides the global timeouts set in the Configuration on a per operation basis.
|
||||
// +optional
|
||||
Timeouts *Timeouts `json:"timeouts,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Skip determines whether the test should skipped.
|
||||
// +optional
|
||||
Skip *bool `json:"skip,omitempty"`
|
||||
|
||||
// Concurrent determines whether the test should run concurrently with other tests.
|
||||
// +optional
|
||||
Concurrent *bool `json:"concurrent,omitempty"`
|
||||
|
||||
// SkipDelete determines whether the resources created by the test should be deleted after the test is executed.
|
||||
// +optional
|
||||
SkipDelete *bool `json:"skipDelete,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// Namespace determines whether the test should run in a random ephemeral namespace or not.
|
||||
// +optional
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
// NamespaceTemplate defines a template to create the test namespace.
|
||||
// +optional
|
||||
NamespaceTemplate *Any `json:"namespaceTemplate,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Steps defining the test.
|
||||
Steps []TestStep `json:"steps"`
|
||||
|
||||
// Catch defines what the steps will execute when an error happens.
|
||||
// This will be combined with catch handlers defined at the step level.
|
||||
// +optional
|
||||
Catch []Catch `json:"catch,omitempty"`
|
||||
|
||||
// ForceTerminationGracePeriod forces the termination grace period on pods, statefulsets, daemonsets and deployments.
|
||||
// +optional
|
||||
ForceTerminationGracePeriod *metav1.Duration `json:"forceTerminationGracePeriod,omitempty"`
|
||||
|
||||
// DelayBeforeCleanup adds a delay between the time a test ends and the time cleanup starts.
|
||||
// +optional
|
||||
DelayBeforeCleanup *metav1.Duration `json:"delayBeforeCleanup,omitempty"`
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// TestStep contains the test step definition used in a test spec.
|
||||
type TestStep struct {
|
||||
// Name of the step.
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// TestStepSpec of the step.
|
||||
TestStepSpec `json:",inline"`
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
const (
|
||||
DefaultApplyTimeout = 5 * time.Second
|
||||
DefaultAssertTimeout = 30 * time.Second
|
||||
DefaultCleanupTimeout = 30 * time.Second
|
||||
DefaultDeleteTimeout = 15 * time.Second
|
||||
DefaultErrorTimeout = 30 * time.Second
|
||||
DefaultExecTimeout = 5 * time.Second
|
||||
)
|
||||
|
||||
// Timeouts contains timeouts per operation.
|
||||
type Timeouts struct {
|
||||
// Apply defines the timeout for the apply operation
|
||||
Apply *metav1.Duration `json:"apply,omitempty"`
|
||||
|
||||
// Assert defines the timeout for the assert operation
|
||||
Assert *metav1.Duration `json:"assert,omitempty"`
|
||||
|
||||
// Cleanup defines the timeout for the cleanup operation
|
||||
Cleanup *metav1.Duration `json:"cleanup,omitempty"`
|
||||
|
||||
// Delete defines the timeout for the delete operation
|
||||
Delete *metav1.Duration `json:"delete,omitempty"`
|
||||
|
||||
// Error defines the timeout for the error operation
|
||||
Error *metav1.Duration `json:"error,omitempty"`
|
||||
|
||||
// Exec defines the timeout for exec operations
|
||||
Exec *metav1.Duration `json:"exec,omitempty"`
|
||||
}
|
||||
|
||||
func durationOrDefault(to *metav1.Duration, def time.Duration) time.Duration {
|
||||
if to != nil {
|
||||
return to.Duration
|
||||
}
|
||||
return def
|
||||
}
|
||||
|
||||
func (t Timeouts) ApplyDuration() time.Duration {
|
||||
return durationOrDefault(t.Apply, DefaultApplyTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) AssertDuration() time.Duration {
|
||||
return durationOrDefault(t.Assert, DefaultAssertTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) CleanupDuration() time.Duration {
|
||||
return durationOrDefault(t.Cleanup, DefaultCleanupTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) DeleteDuration() time.Duration {
|
||||
return durationOrDefault(t.Delete, DefaultDeleteTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) ErrorDuration() time.Duration {
|
||||
return durationOrDefault(t.Error, DefaultErrorTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) ExecDuration() time.Duration {
|
||||
return durationOrDefault(t.Exec, DefaultExecTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) Combine(override *Timeouts) Timeouts {
|
||||
if override == nil {
|
||||
return t
|
||||
}
|
||||
if override.Apply != nil {
|
||||
t.Apply = override.Apply
|
||||
}
|
||||
if override.Assert != nil {
|
||||
t.Assert = override.Assert
|
||||
}
|
||||
if override.Error != nil {
|
||||
t.Error = override.Error
|
||||
}
|
||||
if override.Delete != nil {
|
||||
t.Delete = override.Delete
|
||||
}
|
||||
if override.Cleanup != nil {
|
||||
t.Cleanup = override.Cleanup
|
||||
}
|
||||
if override.Exec != nil {
|
||||
t.Exec = override.Exec
|
||||
}
|
||||
return t
|
||||
}
|
|
@ -0,0 +1,199 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"github.com/kyverno/kyverno-json/pkg/apis/policy/v1alpha1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
var identifier = regexp.MustCompile(`^(?:\w+|\(.+\))$`)
|
||||
|
||||
// Any represents any type.
|
||||
type Any = v1alpha1.Any
|
||||
|
||||
// Binding represents a key/value set as a binding in an executing test.
|
||||
type Binding struct {
|
||||
// Name the name of the binding.
|
||||
// +kubebuilder:validation:Pattern=`^(?:\w+|\(.+\))$`
|
||||
Name string `json:"name"`
|
||||
|
||||
// Value value of the binding.
|
||||
// +kubebuilder:validation:Schemaless
|
||||
// +kubebuilder:pruning:PreserveUnknownFields
|
||||
Value Any `json:"value"`
|
||||
}
|
||||
|
||||
func (b Binding) CheckName() error {
|
||||
if !identifier.MatchString(b.Name) {
|
||||
return fmt.Errorf("invalid name %s", b.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Check represents a check to be applied on the result of an operation.
|
||||
type Check = Any
|
||||
|
||||
// Cluster defines cluster config and context.
|
||||
type Cluster struct {
|
||||
// Kubeconfig is the path to the referenced file.
|
||||
Kubeconfig string `json:"kubeconfig"`
|
||||
|
||||
// Context is the name of the context to use.
|
||||
// +optional
|
||||
Context string `json:"context,omitempty"`
|
||||
}
|
||||
|
||||
// Clusters defines a cluster map.
|
||||
type Clusters map[string]Cluster
|
||||
|
||||
// Expectation represents a check to be applied on the result of an operation
|
||||
// with a match filter to determine if the verification should be considered.
|
||||
type Expectation struct {
|
||||
// Match defines the matching statement.
|
||||
// +optional
|
||||
Match *Match `json:"match,omitempty"`
|
||||
|
||||
// Check defines the verification statement.
|
||||
Check Check `json:"check"`
|
||||
}
|
||||
|
||||
// Format determines the output format (json or yaml).
|
||||
// +kubebuilder:validation:Pattern=`^(?:json|yaml|\(.+\))$`
|
||||
type Format string
|
||||
|
||||
// Match represents a match condition against an evaluated object.
|
||||
type Match = Any
|
||||
|
||||
// ObjectName represents an object namespace and name.
|
||||
type ObjectName struct {
|
||||
// Namespace of the referent.
|
||||
// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
|
||||
// +optional
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
// Name of the referent.
|
||||
// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
}
|
||||
|
||||
// ObjectReference represents one or more objects with a specific apiVersion and kind.
|
||||
// For a single object name and namespace are used to identify the object.
|
||||
// For multiple objects use labels.
|
||||
type ObjectReference struct {
|
||||
ObjectType `json:",inline"`
|
||||
ObjectName `json:",inline"`
|
||||
|
||||
// Label selector to match objects to delete
|
||||
// +optional
|
||||
Labels map[string]string `json:"labels,omitempty"`
|
||||
}
|
||||
|
||||
// ObjectType represents a specific apiVersion and kind.
|
||||
type ObjectType struct {
|
||||
// API version of the referent.
|
||||
APIVersion string `json:"apiVersion"`
|
||||
|
||||
// Kind of the referent.
|
||||
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||
Kind string `json:"kind"`
|
||||
}
|
||||
|
||||
// Output represents an output binding with a match to determine if the binding must be considered or not.
|
||||
type Output struct {
|
||||
// Binding determines the binding to create when the match succeeds.
|
||||
Binding `json:",inline"`
|
||||
|
||||
// Match defines the matching statement.
|
||||
// +optional
|
||||
Match *Match `json:"match,omitempty"`
|
||||
}
|
||||
|
||||
const (
|
||||
DefaultApplyTimeout = 5 * time.Second
|
||||
DefaultAssertTimeout = 30 * time.Second
|
||||
DefaultCleanupTimeout = 30 * time.Second
|
||||
DefaultDeleteTimeout = 15 * time.Second
|
||||
DefaultErrorTimeout = 30 * time.Second
|
||||
DefaultExecTimeout = 5 * time.Second
|
||||
)
|
||||
|
||||
// Timeouts contains timeouts per operation.
|
||||
type Timeouts struct {
|
||||
// Apply defines the timeout for the apply operation
|
||||
Apply *metav1.Duration `json:"apply,omitempty"`
|
||||
|
||||
// Assert defines the timeout for the assert operation
|
||||
Assert *metav1.Duration `json:"assert,omitempty"`
|
||||
|
||||
// Cleanup defines the timeout for the cleanup operation
|
||||
Cleanup *metav1.Duration `json:"cleanup,omitempty"`
|
||||
|
||||
// Delete defines the timeout for the delete operation
|
||||
Delete *metav1.Duration `json:"delete,omitempty"`
|
||||
|
||||
// Error defines the timeout for the error operation
|
||||
Error *metav1.Duration `json:"error,omitempty"`
|
||||
|
||||
// Exec defines the timeout for exec operations
|
||||
Exec *metav1.Duration `json:"exec,omitempty"`
|
||||
}
|
||||
|
||||
func durationOrDefault(to *metav1.Duration, def time.Duration) time.Duration {
|
||||
if to != nil {
|
||||
return to.Duration
|
||||
}
|
||||
return def
|
||||
}
|
||||
|
||||
func (t Timeouts) ApplyDuration() time.Duration {
|
||||
return durationOrDefault(t.Apply, DefaultApplyTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) AssertDuration() time.Duration {
|
||||
return durationOrDefault(t.Assert, DefaultAssertTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) CleanupDuration() time.Duration {
|
||||
return durationOrDefault(t.Cleanup, DefaultCleanupTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) DeleteDuration() time.Duration {
|
||||
return durationOrDefault(t.Delete, DefaultDeleteTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) ErrorDuration() time.Duration {
|
||||
return durationOrDefault(t.Error, DefaultErrorTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) ExecDuration() time.Duration {
|
||||
return durationOrDefault(t.Exec, DefaultExecTimeout)
|
||||
}
|
||||
|
||||
func (t Timeouts) Combine(override *Timeouts) Timeouts {
|
||||
if override == nil {
|
||||
return t
|
||||
}
|
||||
if override.Apply != nil {
|
||||
t.Apply = override.Apply
|
||||
}
|
||||
if override.Assert != nil {
|
||||
t.Assert = override.Assert
|
||||
}
|
||||
if override.Error != nil {
|
||||
t.Error = override.Error
|
||||
}
|
||||
if override.Delete != nil {
|
||||
t.Delete = override.Delete
|
||||
}
|
||||
if override.Cleanup != nil {
|
||||
t.Cleanup = override.Cleanup
|
||||
}
|
||||
if override.Exec != nil {
|
||||
t.Exec = override.Exec
|
||||
}
|
||||
return t
|
||||
}
|
|
@ -8,6 +8,56 @@ import (
|
|||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
func TestBinding_CheckName(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
bindingName string
|
||||
bindingValue Any
|
||||
wantErr bool
|
||||
}{{
|
||||
name: "empty",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "simple",
|
||||
bindingName: "simple",
|
||||
wantErr: false,
|
||||
}, {
|
||||
name: "with dollar",
|
||||
bindingName: "$simple",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "with space",
|
||||
bindingName: "simple one",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "with dot",
|
||||
bindingName: "simple.one",
|
||||
wantErr: true,
|
||||
}, {
|
||||
name: "good expression",
|
||||
bindingName: "('test')",
|
||||
wantErr: false,
|
||||
}, {
|
||||
name: "bad expression",
|
||||
bindingName: "('test'",
|
||||
wantErr: true,
|
||||
}}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
b := Binding{
|
||||
Name: tt.bindingName,
|
||||
Value: tt.bindingValue,
|
||||
}
|
||||
err := b.CheckName()
|
||||
if tt.wantErr {
|
||||
assert.Error(t, err)
|
||||
} else {
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_durationOrDefault(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
|
@ -1,40 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Update represents a set of resources that should be updated.
|
||||
// If a resource does not exist in the cluster it will fail.
|
||||
type Update struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// FileRefOrResource provides a reference to the file containing the resources to be created.
|
||||
FileRefOrResource `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// DryRun determines whether the file should be applied in dry run mode.
|
||||
// +optional
|
||||
DryRun *bool `json:"dryRun,omitempty"`
|
||||
|
||||
// Expect defines a list of matched checks to validate the operation outcome.
|
||||
// +optional
|
||||
Expect []Expectation `json:"expect,omitempty"`
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// Wait specifies how to perform wait operations on resources.
|
||||
type Wait struct {
|
||||
// Timeout for the operation. Specifies how long to wait for the condition to be met before timing out.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster where the wait operation will be performed (default cluster will be used if not specified).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// ResourceReference referenced resource type.
|
||||
ResourceReference `json:",inline"`
|
||||
|
||||
// ObjectLabelsSelector determines the selection process of referenced objects.
|
||||
ObjectLabelsSelector `json:",inline"`
|
||||
|
||||
// For specifies the condition to wait for.
|
||||
For `json:"for"`
|
||||
|
||||
// Format determines the output format (json or yaml).
|
||||
// +optional
|
||||
Format Format `json:"format,omitempty"`
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Condition represents parameters for waiting on a specific condition of a resource.
|
||||
type Condition struct {
|
||||
// Name defines the specific condition to wait for, e.g., "Available", "Ready".
|
||||
Name string `json:"name"`
|
||||
|
||||
// Value defines the specific condition status to wait for, e.g., "True", "False".
|
||||
// +optional
|
||||
Value *string `json:"value,omitempty"`
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// Deletion represents parameters for waiting on a resource's deletion.
|
||||
type Deletion struct{}
|
|
@ -1,16 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// For specifies the condition to wait for.
|
||||
type For struct {
|
||||
// Deletion specifies parameters for waiting on a resource's deletion.
|
||||
// +optional
|
||||
Deletion *Deletion `json:"deletion,omitempty"`
|
||||
|
||||
// Condition specifies the condition to wait for.
|
||||
// +optional
|
||||
Condition *Condition `json:"condition,omitempty"`
|
||||
|
||||
// JsonPath specifies the json path condition to wait for.
|
||||
// +optional
|
||||
JsonPath *JsonPath `json:"jsonPath,omitempty"`
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
package v1alpha1
|
||||
|
||||
// JsonPath represents parameters for waiting on a json path of a resource.
|
||||
type JsonPath struct {
|
||||
// Path defines the json path to wait for, e.g. '{.status.phase}'.
|
||||
Path string `json:"path"`
|
||||
|
||||
// Value defines the expected value to wait for, e.g., "Running".
|
||||
Value string `json:"value"`
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,325 @@
|
|||
package v1alpha2
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
)
|
||||
|
||||
// ActionCheck contains check for an action.
|
||||
type ActionCheck struct {
|
||||
// Check is an assertion tree to validate the operation outcome.
|
||||
// +optional
|
||||
Check *Check `json:"check,omitempty"`
|
||||
}
|
||||
|
||||
// ActionCheckRef contains check reference options for an action.
|
||||
type ActionCheckRef struct {
|
||||
FileRef `json:",inline"`
|
||||
|
||||
// Check provides a check used in assertions.
|
||||
// +optional
|
||||
Check *Check `json:"resource,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
}
|
||||
|
||||
// ActionDryRun contains dry run options for an action.
|
||||
type ActionDryRun struct {
|
||||
// DryRun determines whether the file should be applied in dry run mode.
|
||||
// +optional
|
||||
DryRun *bool `json:"dryRun,omitempty"`
|
||||
}
|
||||
|
||||
// ActionEnv contains environment options for an action.
|
||||
type ActionEnv struct {
|
||||
// Env defines additional environment variables.
|
||||
// +optional
|
||||
Env []Binding `json:"env,omitempty"`
|
||||
|
||||
// SkipLogOutput removes the output from the command. Useful for sensitive logs or to reduce noise.
|
||||
// +optional
|
||||
SkipLogOutput bool `json:"skipLogOutput,omitempty"`
|
||||
}
|
||||
|
||||
// ActionExpectations contains expectations for an action.
|
||||
type ActionExpectations struct {
|
||||
// Expect defines a list of matched checks to validate the operation outcome.
|
||||
// +optional
|
||||
Expect []Expectation `json:"expect,omitempty"`
|
||||
}
|
||||
|
||||
// ActionFormat contains format for an action.
|
||||
type ActionFormat struct {
|
||||
// Format determines the output format (json or yaml).
|
||||
// +optional
|
||||
Format Format `json:"format,omitempty"`
|
||||
}
|
||||
|
||||
type ActionInlineResource struct {
|
||||
// Resource provides a resource to be applied.
|
||||
// +kubebuilder:validation:XEmbeddedResource
|
||||
// +kubebuilder:pruning:PreserveUnknownFields
|
||||
// +optional
|
||||
Resource *unstructured.Unstructured `json:"resource,omitempty"`
|
||||
}
|
||||
|
||||
// ActionObject contains object selector options for an action.
|
||||
type ActionObject struct {
|
||||
ObjectType `json:",inline"`
|
||||
ActionObjectSelector `json:",inline"`
|
||||
}
|
||||
|
||||
// ActionObjectSelector contains object selector options for an action.
|
||||
type ActionObjectSelector struct {
|
||||
ObjectName `json:",inline"`
|
||||
|
||||
// Selector defines labels selector.
|
||||
// +optional
|
||||
Selector string `json:"selector,omitempty"`
|
||||
}
|
||||
|
||||
// FileRef represents a file reference.
|
||||
type FileRef struct {
|
||||
// File is the path to the referenced file. This can be a direct path to a file
|
||||
// or an expression that matches multiple files, such as "manifest/*.yaml" for all YAML
|
||||
// files within the "manifest" directory.
|
||||
File string `json:"file,omitempty"`
|
||||
}
|
||||
|
||||
// ActionResourceRef contains resource reference options for an action.
|
||||
type ActionResourceRef struct {
|
||||
FileRef `json:",inline"`
|
||||
// Resource provides a resource to be applied.
|
||||
// +kubebuilder:validation:XEmbeddedResource
|
||||
// +kubebuilder:pruning:PreserveUnknownFields
|
||||
// +optional
|
||||
Resource *unstructured.Unstructured `json:"resource,omitempty"`
|
||||
// ActionInlineResource `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
}
|
||||
|
||||
// ActionTimeout contains timeout options for an action.
|
||||
type ActionTimeout struct {
|
||||
// Timeout for the operation. Overrides the global timeout set in the Configuration.
|
||||
// +optional
|
||||
Timeout *metav1.Duration `json:"timeout,omitempty"`
|
||||
}
|
||||
|
||||
// Apply represents a set of configurations or resources that
|
||||
// should be applied during testing.
|
||||
// +k8s:conversion-gen=false
|
||||
type Apply struct {
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Assert represents a test condition that is expected to hold true
|
||||
// during the testing process.
|
||||
// +k8s:conversion-gen=false
|
||||
type Assert struct {
|
||||
ActionCheckRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Command describes a command to run as a part of a test step.
|
||||
// +k8s:conversion-gen=false
|
||||
type Command struct {
|
||||
ActionCheck `json:",inline"`
|
||||
ActionEnv `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Entrypoint is the command entry point to run.
|
||||
Entrypoint string `json:"entrypoint"`
|
||||
|
||||
// Args is the command arguments.
|
||||
// +optional
|
||||
Args []string `json:"args,omitempty"`
|
||||
}
|
||||
|
||||
// Create represents a set of resources that should be created.
|
||||
// If a resource already exists in the cluster it will fail.
|
||||
// +k8s:conversion-gen=false
|
||||
type Create struct {
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Delete is a reference to an object that should be deleted
|
||||
// +k8s:conversion-gen=false
|
||||
type Delete struct {
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// File is the path to the referenced file. This can be a direct path to a file
|
||||
// or an expression that matches multiple files, such as "manifest/*.yaml" for all YAML
|
||||
// files within the "manifest" directory.
|
||||
// +optional
|
||||
File string `json:"file,omitempty"`
|
||||
|
||||
// Ref determines objects to be deleted.
|
||||
// +optional
|
||||
Ref *ObjectReference `json:"ref,omitempty"`
|
||||
|
||||
// DeletionPropagationPolicy decides if a deletion will propagate to the dependents of
|
||||
// the object, and how the garbage collector will handle the propagation.
|
||||
// Overrides the deletion propagation policy set in the Configuration, the Test and the TestStep.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=Orphan;Background;Foreground
|
||||
DeletionPropagationPolicy *metav1.DeletionPropagation `json:"deletionPropagationPolicy,omitempty"`
|
||||
}
|
||||
|
||||
// Describe defines how to describe resources.
|
||||
// +k8s:conversion-gen=false
|
||||
type Describe struct {
|
||||
ActionObject `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Show Events indicates whether to include related events.
|
||||
// +optional
|
||||
ShowEvents *bool `json:"showEvents,omitempty"`
|
||||
}
|
||||
|
||||
// Error represents an anticipated error condition that may arise during testing.
|
||||
// Instead of treating such an error as a test failure, it acknowledges it as expected.
|
||||
// +k8s:conversion-gen=false
|
||||
type Error struct {
|
||||
ActionCheckRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Events defines how to collect events.
|
||||
// +k8s:conversion-gen=false
|
||||
type Events struct {
|
||||
ActionFormat `json:",inline"`
|
||||
ActionObjectSelector `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Get defines how to get resources.
|
||||
// +k8s:conversion-gen=false
|
||||
type Get struct {
|
||||
ActionFormat `json:",inline"`
|
||||
ActionObject `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Patch represents a set of resources that should be patched.
|
||||
// If a resource doesn't exist yet in the cluster it will fail.
|
||||
// +k8s:conversion-gen=false
|
||||
type Patch struct {
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// PodLogs defines how to collect pod logs.
|
||||
// +k8s:conversion-gen=false
|
||||
type PodLogs struct {
|
||||
ActionObjectSelector `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Container in pod to get logs from else --all-containers is used.
|
||||
// +optional
|
||||
Container string `json:"container,omitempty"`
|
||||
|
||||
// Tail is the number of last lines to collect from pods. If omitted or zero,
|
||||
// then the default is 10 if you use a selector, or -1 (all) if you use a pod name.
|
||||
// This matches default behavior of `kubectl logs`.
|
||||
// +optional
|
||||
Tail *int `json:"tail,omitempty"`
|
||||
}
|
||||
|
||||
// Script describes a script to run as a part of a test step.
|
||||
// +k8s:conversion-gen=false
|
||||
type Script struct {
|
||||
ActionCheck `json:",inline"`
|
||||
ActionEnv `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
|
||||
// Content defines a shell script (run with "sh -c ...").
|
||||
// +optional
|
||||
Content string `json:"content,omitempty"`
|
||||
}
|
||||
|
||||
// Sleep represents a duration while nothing happens.
|
||||
// +k8s:conversion-gen=false
|
||||
type Sleep struct {
|
||||
// Duration is the delay used for sleeping.
|
||||
Duration metav1.Duration `json:"duration"`
|
||||
}
|
||||
|
||||
// Update represents a set of resources that should be updated.
|
||||
// If a resource does not exist in the cluster it will fail.
|
||||
// +k8s:conversion-gen=false
|
||||
type Update struct {
|
||||
ActionDryRun `json:",inline"`
|
||||
ActionExpectations `json:",inline"`
|
||||
ActionResourceRef `json:",inline"`
|
||||
ActionTimeout `json:",inline"`
|
||||
}
|
||||
|
||||
// Wait specifies how to perform wait operations on resources.
|
||||
// +k8s:conversion-gen=false
|
||||
type Wait struct {
|
||||
ActionTimeout `json:",inline"`
|
||||
ActionFormat `json:",inline"`
|
||||
ActionObject `json:",inline"`
|
||||
|
||||
// WaitFor specifies the condition to wait for.
|
||||
WaitFor `json:"for"`
|
||||
}
|
||||
|
||||
// WaitFor specifies the condition to wait for.
|
||||
// +k8s:conversion-gen=false
|
||||
type WaitFor struct {
|
||||
// Deletion specifies parameters for waiting on a resource's deletion.
|
||||
// +optional
|
||||
Deletion *WaitForDeletion `json:"deletion,omitempty"`
|
||||
|
||||
// Condition specifies the condition to wait for.
|
||||
// +optional
|
||||
Condition *WaitForCondition `json:"condition,omitempty"`
|
||||
|
||||
// JsonPath specifies the json path condition to wait for.
|
||||
// +optional
|
||||
JsonPath *WaitForJsonPath `json:"jsonPath,omitempty"`
|
||||
}
|
||||
|
||||
// WaitForCondition represents parameters for waiting on a specific condition of a resource.
|
||||
// +k8s:conversion-gen=false
|
||||
type WaitForCondition struct {
|
||||
// Name defines the specific condition to wait for, e.g., "Available", "Ready".
|
||||
Name string `json:"name"`
|
||||
|
||||
// Value defines the specific condition status to wait for, e.g., "True", "False".
|
||||
// +optional
|
||||
Value *string `json:"value,omitempty"`
|
||||
}
|
||||
|
||||
// WaitForDeletion represents parameters for waiting on a resource's deletion.
|
||||
// +k8s:conversion-gen=false
|
||||
type WaitForDeletion struct{}
|
||||
|
||||
// WaitForJsonPath represents parameters for waiting on a json path of a resource.
|
||||
// +k8s:conversion-gen=false
|
||||
type WaitForJsonPath struct {
|
||||
// Path defines the json path to wait for, e.g. '{.status.phase}'.
|
||||
Path string `json:"path"`
|
||||
|
||||
// Value defines the expected value to wait for, e.g., "Running".
|
||||
Value string `json:"value"`
|
||||
}
|
|
@ -24,40 +24,47 @@ type Configuration struct {
|
|||
// ConfigurationSpec contains the configuration used to run tests.
|
||||
// +k8s:conversion-gen=false
|
||||
type ConfigurationSpec struct {
|
||||
// Catch defines what the tests steps will execute when an error happens.
|
||||
// This will be combined with catch handlers defined at the test and step levels.
|
||||
// +optional
|
||||
Catch []Catch `json:"catch,omitempty"`
|
||||
|
||||
// Cleanup contains cleanup configuration.
|
||||
// +optional
|
||||
Cleanup *Cleanup `json:"cleanup,omitempty"`
|
||||
Cleanup *CleanupOptions `json:"cleanup,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters map[string]Cluster `json:"clusters,omitempty"`
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
|
||||
// Deletion contains the global deletion configuration.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Deletion DeletionOptions `json:"deletion"`
|
||||
|
||||
// Discovery contains tests discovery configuration.
|
||||
// +optional
|
||||
Discovery *Discovery `json:"discovery,omitempty"`
|
||||
// +kubebuilder:default:={}
|
||||
Discovery DiscoveryOptions `json:"discovery"`
|
||||
|
||||
// Error contains the global error configuration.
|
||||
// +optional
|
||||
Error *ErrorOptions `json:"error,omitempty"`
|
||||
|
||||
// Execution contains tests execution configuration.
|
||||
// +optional
|
||||
Execution *Execution `json:"execution,omitempty"`
|
||||
Execution *ExecutionOptions `json:"execution,omitempty"`
|
||||
|
||||
// Namespace contains properties for the namespace to use for tests.
|
||||
// +optional
|
||||
Namespace *Namespace `json:"namespace,omitempty"`
|
||||
Namespace *NamespaceOptions `json:"namespace,omitempty"`
|
||||
|
||||
// Report contains properties for the report.
|
||||
// +optional
|
||||
Report *Report `json:"report,omitempty"`
|
||||
Report *ReportOptions `json:"report,omitempty"`
|
||||
|
||||
// Templating contains the templating config.
|
||||
// +optional
|
||||
Templating *Templating `json:"templating,omitempty"`
|
||||
// +kubebuilder:default:={}
|
||||
Templating TemplatingOptions `json:"templating"`
|
||||
|
||||
// Global timeouts configuration. Applies to all tests/test steps if not overridden.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Timeouts Timeouts `json:"timeouts"`
|
||||
}
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
package v1alpha2
|
||||
|
||||
// Operation defines operation elements.
|
||||
// +k8s:conversion-gen=false
|
||||
type Operation struct {
|
||||
OperationAction `json:",inline"`
|
||||
OperationBindings `json:",inline"`
|
||||
OperationClusters `json:",inline"`
|
||||
OperationOutputs `json:",inline"`
|
||||
|
||||
// Description contains a description of the operation.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
}
|
||||
|
||||
// OperationAction defines an operation action, only one action should be specified per operation.
|
||||
type OperationAction struct {
|
||||
// Apply represents resources that should be applied for this test step. This can include things
|
||||
// like configuration settings or any other resources that need to be available during the test.
|
||||
// +optional
|
||||
Apply *Apply `json:"apply,omitempty"`
|
||||
|
||||
// Assert represents an assertion to be made. It checks whether the conditions specified in the assertion hold true.
|
||||
// +optional
|
||||
Assert *Assert `json:"assert,omitempty"`
|
||||
|
||||
// Command defines a command to run.
|
||||
// +optional
|
||||
Command *Command `json:"command,omitempty"`
|
||||
|
||||
// Create represents a creation operation.
|
||||
// +optional
|
||||
Create *Create `json:"create,omitempty"`
|
||||
|
||||
// Delete represents a deletion operation.
|
||||
// +optional
|
||||
Delete *Delete `json:"delete,omitempty"`
|
||||
|
||||
// Describe determines the resource describe collector to execute.
|
||||
// +optional
|
||||
Describe *Describe `json:"describe,omitempty"`
|
||||
|
||||
// Error represents the expected errors for this test step. If any of these errors occur, the test
|
||||
// will consider them as expected; otherwise, they will be treated as test failures.
|
||||
// +optional
|
||||
Error *Error `json:"error,omitempty"`
|
||||
|
||||
// Events determines the events collector to execute.
|
||||
// +optional
|
||||
Events *Events `json:"events,omitempty"`
|
||||
|
||||
// Get determines the resource get collector to execute.
|
||||
// +optional
|
||||
Get *Get `json:"get,omitempty"`
|
||||
|
||||
// Patch represents a patch operation.
|
||||
// +optional
|
||||
Patch *Patch `json:"patch,omitempty"`
|
||||
|
||||
// PodLogs determines the pod logs collector to execute.
|
||||
// +optional
|
||||
PodLogs *PodLogs `json:"podLogs,omitempty"`
|
||||
|
||||
// Script defines a script to run.
|
||||
// +optional
|
||||
Script *Script `json:"script,omitempty"`
|
||||
|
||||
// Sleep defines zzzz.
|
||||
// +optional
|
||||
Sleep *Sleep `json:"sleep,omitempty"`
|
||||
|
||||
// Update represents an update operation.
|
||||
// +optional
|
||||
Update *Update `json:"update,omitempty"`
|
||||
|
||||
// Wait determines the resource wait collector to execute.
|
||||
// +optional
|
||||
Wait *Wait `json:"wait,omitempty"`
|
||||
}
|
||||
|
||||
// OperationBindings contains bindings options for an operation.
|
||||
type OperationBindings struct {
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
}
|
||||
|
||||
// OperationClusters contains clusters options for an operation.
|
||||
type OperationClusters struct {
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
}
|
||||
|
||||
// OperationOutputs contains outputs options for an operation.
|
||||
type OperationOutputs struct {
|
||||
// Outputs defines output bindings.
|
||||
// +optional
|
||||
Outputs []Output `json:"outputs,omitempty"`
|
||||
}
|
||||
|
||||
// TryOperation defines operation elements.
|
||||
// +k8s:conversion-gen=false
|
||||
type TryOperation struct {
|
||||
Operation `json:",inline"`
|
||||
|
||||
// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
|
||||
// Even if the test continues executing, it will still be reported as failed.
|
||||
// +optional
|
||||
ContinueOnError *bool `json:"continueOnError,omitempty"`
|
||||
}
|
|
@ -1,31 +1,62 @@
|
|||
package v1alpha1
|
||||
package v1alpha2
|
||||
|
||||
import (
|
||||
_ "github.com/kyverno/kyverno-json/pkg/apis/policy/v1alpha1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
type ReportFormatType string
|
||||
|
||||
const (
|
||||
JSONFormat ReportFormatType = "JSON"
|
||||
XMLFormat ReportFormatType = "XML"
|
||||
NoReport ReportFormatType = ""
|
||||
)
|
||||
|
||||
// ConfigurationSpec contains the configuration used to run tests.
|
||||
type ConfigurationSpec struct {
|
||||
// Global timeouts configuration. Applies to all tests/test steps if not overridden.
|
||||
// +optional
|
||||
Timeouts Timeouts `json:"timeouts"`
|
||||
|
||||
// If set, do not delete the resources after running the tests (implies SkipClusterDelete).
|
||||
// CleanupOptions contains the configuration used for cleaning up resources.
|
||||
type CleanupOptions struct {
|
||||
// If set, do not delete the resources after running a test.
|
||||
// +optional
|
||||
SkipDelete bool `json:"skipDelete,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// DelayBeforeCleanup adds a delay between the time a test ends and the time cleanup starts.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
DelayBeforeCleanup *metav1.Duration `json:"delayBeforeCleanup,omitempty"`
|
||||
}
|
||||
|
||||
// DeletionOptions contains the configuration used for deleting resources.
|
||||
type DeletionOptions struct {
|
||||
// Propagation decides if a deletion will propagate to the dependents of
|
||||
// the object, and how the garbage collector will handle the propagation.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=Orphan;Background;Foreground
|
||||
// +kubebuilder:default:=Background
|
||||
Propagation metav1.DeletionPropagation `json:"propagation,omitempty"`
|
||||
}
|
||||
|
||||
// DiscoveryOptions contains the discovery configuration used when discovering tests in folders.
|
||||
type DiscoveryOptions struct {
|
||||
// ExcludeTestRegex is used to exclude tests based on a regular expression.
|
||||
// +optional
|
||||
ExcludeTestRegex string `json:"excludeTestRegex,omitempty"`
|
||||
|
||||
// IncludeTestRegex is used to include tests based on a regular expression.
|
||||
// +optional
|
||||
IncludeTestRegex string `json:"includeTestRegex,omitempty"`
|
||||
|
||||
// TestFile is the name of the file containing the test to run.
|
||||
// If no extension is provided, chainsaw will try with .yaml first and .yml if needed.
|
||||
// +optional
|
||||
// +kubebuilder:default:="chainsaw-test"
|
||||
TestFile string `json:"testFile,omitempty"`
|
||||
|
||||
// FullName makes use of the full test case folder path instead of the folder name.
|
||||
// +optional
|
||||
FullName bool `json:"fullName,omitempty"`
|
||||
}
|
||||
|
||||
// ErrorOptions contains the global error configuration.
|
||||
type ErrorOptions struct {
|
||||
// Catch defines what the tests steps will execute when an error happens.
|
||||
// This will be combined with catch handlers defined at the test and step levels.
|
||||
// +optional
|
||||
Catch []Operation `json:"catch,omitempty"`
|
||||
}
|
||||
|
||||
// ExecutionOptions determines how tests are run.
|
||||
type ExecutionOptions struct {
|
||||
// FailFast determines whether the test should stop upon encountering the first failure.
|
||||
// +optional
|
||||
FailFast bool `json:"failFast,omitempty"`
|
||||
|
@ -36,69 +67,59 @@ type ConfigurationSpec struct {
|
|||
// +optional
|
||||
Parallel *int `json:"parallel,omitempty"`
|
||||
|
||||
// ReportFormat determines test report format (JSON|XML|nil) nil == no report.
|
||||
// maps to report.Type, however we don't want generated.deepcopy to have reference to it.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=JSON;XML;
|
||||
ReportFormat ReportFormatType `json:"reportFormat,omitempty"`
|
||||
|
||||
// ReportPath defines the path.
|
||||
// +optional
|
||||
ReportPath string `json:"reportPath,omitempty"`
|
||||
|
||||
// ReportName defines the name of report to create. It defaults to "chainsaw-report".
|
||||
// +optional
|
||||
// +kubebuilder:default:="chainsaw-report"
|
||||
ReportName string `json:"reportName,omitempty"`
|
||||
|
||||
// Namespace defines the namespace to use for tests.
|
||||
// If not specified, every test will execute in a random ephemeral namespace
|
||||
// unless the namespace is overridden in a the test spec.
|
||||
// +optional
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
// NamespaceTemplate defines a template to create the test namespace.
|
||||
// +optional
|
||||
NamespaceTemplate *Any `json:"namespaceTemplate,omitempty"`
|
||||
|
||||
// FullName makes use of the full test case folder path instead of the folder name.
|
||||
// +optional
|
||||
FullName bool `json:"fullName,omitempty"`
|
||||
|
||||
// ExcludeTestRegex is used to exclude tests based on a regular expression.
|
||||
// +optional
|
||||
ExcludeTestRegex string `json:"excludeTestRegex,omitempty"`
|
||||
|
||||
// IncludeTestRegex is used to include tests based on a regular expression.
|
||||
// +optional
|
||||
IncludeTestRegex string `json:"includeTestRegex,omitempty"`
|
||||
|
||||
// RepeatCount indicates how many times the tests should be executed.
|
||||
// +kubebuilder:validation:Format:=int
|
||||
// +kubebuilder:validation:Minimum:=1
|
||||
// +optional
|
||||
RepeatCount *int `json:"repeatCount,omitempty"`
|
||||
|
||||
// TestFile is the name of the file containing the test to run.
|
||||
// If no extension is provided, chainsaw will try with .yaml first and .yml if needed.
|
||||
// +kubebuilder:default:="chainsaw-test"
|
||||
// +optional
|
||||
TestFile string `json:"testFile,omitempty"`
|
||||
|
||||
// ForceTerminationGracePeriod forces the termination grace period on pods, statefulsets, daemonsets and deployments.
|
||||
// +optional
|
||||
ForceTerminationGracePeriod *metav1.Duration `json:"forceTerminationGracePeriod,omitempty"`
|
||||
|
||||
// DelayBeforeCleanup adds a delay between the time a test ends and the time cleanup starts.
|
||||
// +optional
|
||||
DelayBeforeCleanup *metav1.Duration `json:"delayBeforeCleanup,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters map[string]Cluster `json:"clusters,omitempty"`
|
||||
|
||||
// Catch defines what the tests steps will execute when an error happens.
|
||||
// This will be combined with catch handlers defined at the test and step levels.
|
||||
// +optional
|
||||
Catch []Catch `json:"catch,omitempty"`
|
||||
}
|
||||
|
||||
// NamespaceOptions contains the configuration used to allocate a namespace for each test.
|
||||
type NamespaceOptions struct {
|
||||
// Name defines the namespace to use for tests.
|
||||
// If not specified, every test will execute in a random ephemeral namespace
|
||||
// unless the namespace is overridden in a the test spec.
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// Template defines a template to create the test namespace.
|
||||
// +optional
|
||||
Template *Any `json:"template,omitempty"`
|
||||
}
|
||||
|
||||
type ReportFormatType string
|
||||
|
||||
const (
|
||||
JSONFormat ReportFormatType = "JSON"
|
||||
XMLFormat ReportFormatType = "XML"
|
||||
)
|
||||
|
||||
// ReportOptions contains the configuration used for reporting.
|
||||
type ReportOptions struct {
|
||||
// ReportFormat determines test report format (JSON|XML).
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=JSON;XML
|
||||
// +kubebuilder:default:="JSON"
|
||||
Format ReportFormatType `json:"format,omitempty"`
|
||||
|
||||
// ReportPath defines the path.
|
||||
// +optional
|
||||
Path string `json:"path,omitempty"`
|
||||
|
||||
// ReportName defines the name of report to create. It defaults to "chainsaw-report".
|
||||
// +optional
|
||||
// +kubebuilder:default:="chainsaw-report"
|
||||
Name string `json:"name,omitempty"`
|
||||
}
|
||||
|
||||
// TemplatingOptions contains the templating configuration.
|
||||
type TemplatingOptions struct {
|
||||
// Enabled determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
// +kubebuilder:default:=true
|
||||
Enabled bool `json:"enabled"`
|
||||
}
|
|
@ -6,19 +6,20 @@ import (
|
|||
)
|
||||
|
||||
func Convert_v1alpha2_ConfigurationSpec_To_v1alpha1_ConfigurationSpec(in *ConfigurationSpec, out *v1alpha1.ConfigurationSpec, _ conversion.Scope) error {
|
||||
out.Catch = in.Catch
|
||||
out.Clusters = in.Clusters
|
||||
out.Timeouts = in.Timeouts
|
||||
if in := in.Cleanup; in != nil {
|
||||
out.SkipDelete = in.SkipDelete
|
||||
out.DelayBeforeCleanup = in.DelayBeforeCleanup
|
||||
}
|
||||
if in := in.Discovery; in != nil {
|
||||
out.ExcludeTestRegex = in.ExcludeTestRegex
|
||||
out.IncludeTestRegex = in.IncludeTestRegex
|
||||
out.TestFile = in.TestFile
|
||||
out.FullName = in.FullName
|
||||
}
|
||||
out.Clusters = in.Clusters
|
||||
out.DeletionPropagationPolicy = in.Deletion.Propagation
|
||||
out.ExcludeTestRegex = in.Discovery.ExcludeTestRegex
|
||||
out.IncludeTestRegex = in.Discovery.IncludeTestRegex
|
||||
out.TestFile = in.Discovery.TestFile
|
||||
out.FullName = in.Discovery.FullName
|
||||
// TODO
|
||||
// if in := in.Error; in != nil {
|
||||
// out.Catch = in.Catch
|
||||
// }
|
||||
if in := in.Execution; in != nil {
|
||||
out.FailFast = in.FailFast
|
||||
out.Parallel = in.Parallel
|
||||
|
@ -34,43 +35,54 @@ func Convert_v1alpha2_ConfigurationSpec_To_v1alpha1_ConfigurationSpec(in *Config
|
|||
out.ReportPath = in.Path
|
||||
out.ReportName = in.Name
|
||||
}
|
||||
if in := in.Templating; in != nil {
|
||||
out.Template = in.Enabled
|
||||
}
|
||||
out.Template = &in.Templating.Enabled
|
||||
out.Timeouts = in.Timeouts
|
||||
return nil
|
||||
}
|
||||
|
||||
func Convert_v1alpha1_ConfigurationSpec_To_v1alpha2_ConfigurationSpec(in *v1alpha1.ConfigurationSpec, out *ConfigurationSpec, _ conversion.Scope) error {
|
||||
out.Catch = in.Catch
|
||||
out.Clusters = in.Clusters
|
||||
out.Timeouts = in.Timeouts
|
||||
out.Cleanup = &Cleanup{
|
||||
out.Cleanup = &CleanupOptions{
|
||||
SkipDelete: in.SkipDelete,
|
||||
DelayBeforeCleanup: in.DelayBeforeCleanup,
|
||||
}
|
||||
out.Discovery = &Discovery{
|
||||
out.Clusters = in.Clusters
|
||||
out.Deletion = DeletionOptions{
|
||||
Propagation: in.DeletionPropagationPolicy,
|
||||
}
|
||||
out.Discovery = DiscoveryOptions{
|
||||
ExcludeTestRegex: in.ExcludeTestRegex,
|
||||
IncludeTestRegex: in.IncludeTestRegex,
|
||||
TestFile: in.TestFile,
|
||||
FullName: in.FullName,
|
||||
}
|
||||
out.Execution = &Execution{
|
||||
// TODO
|
||||
// out.Error = &ErrorOptions{
|
||||
// Catch: in.Catch,
|
||||
// }
|
||||
out.Execution = &ExecutionOptions{
|
||||
FailFast: in.FailFast,
|
||||
Parallel: in.Parallel,
|
||||
RepeatCount: in.RepeatCount,
|
||||
ForceTerminationGracePeriod: in.ForceTerminationGracePeriod,
|
||||
}
|
||||
out.Namespace = &Namespace{
|
||||
out.Namespace = &NamespaceOptions{
|
||||
Name: in.Namespace,
|
||||
Template: in.NamespaceTemplate,
|
||||
}
|
||||
out.Report = &Report{
|
||||
out.Report = &ReportOptions{
|
||||
Format: ReportFormatType(in.ReportFormat),
|
||||
Path: in.ReportPath,
|
||||
Name: in.ReportName,
|
||||
}
|
||||
out.Templating = &Templating{
|
||||
Enabled: in.Template,
|
||||
if in.Template == nil {
|
||||
out.Templating = TemplatingOptions{
|
||||
Enabled: true,
|
||||
}
|
||||
} else {
|
||||
out.Templating = TemplatingOptions{
|
||||
Enabled: *in.Template,
|
||||
}
|
||||
}
|
||||
out.Timeouts = in.Timeouts
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package v1alpha2
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// TestStep contains the test step definition used in a test spec.
|
||||
// +k8s:conversion-gen=false
|
||||
type TestStep struct {
|
||||
// Name of the step.
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// TestStepSpec of the step.
|
||||
TestStepSpec `json:",inline"`
|
||||
}
|
||||
|
||||
// TestStepSpec defines the desired state and behavior for each test step.
|
||||
// +k8s:conversion-gen=false
|
||||
type TestStepSpec struct {
|
||||
// Description contains a description of the test step.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
|
||||
// Timeouts for the test step. Overrides the global timeouts set in the Configuration and the timeouts eventually set in the Test.
|
||||
// +optional
|
||||
Timeouts *Timeouts `json:"timeouts,omitempty"`
|
||||
|
||||
// DeletionPropagationPolicy decides if a deletion will propagate to the dependents of
|
||||
// the object, and how the garbage collector will handle the propagation.
|
||||
// Overrides the deletion propagation policy set in both the Configuration and the Test.
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=Orphan;Background;Foreground
|
||||
DeletionPropagationPolicy *metav1.DeletionPropagation `json:"deletionPropagationPolicy,omitempty"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
|
||||
// SkipDelete determines whether the resources created by the step should be deleted after the test step is executed.
|
||||
// +optional
|
||||
SkipDelete *bool `json:"skipDelete,omitempty"`
|
||||
|
||||
// Template determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Template *bool `json:"template,omitempty"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Try defines what the step will try to execute.
|
||||
// +kubebuilder:validation:MinItems:=1
|
||||
Try []TryOperation `json:"try"`
|
||||
|
||||
// Catch defines what the step will execute when an error happens.
|
||||
// +optional
|
||||
Catch []Operation `json:"catch,omitempty"`
|
||||
|
||||
// Finally defines what the step will execute after the step is terminated.
|
||||
// +optional
|
||||
Finally []Operation `json:"finally,omitempty"`
|
||||
|
||||
// Cleanup defines what will be executed after the test is terminated.
|
||||
// +optional
|
||||
Cleanup []Operation `json:"cleanup,omitempty"`
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
package v1alpha2
|
||||
|
||||
import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// +genclient
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||
// +kubebuilder:object:root=true
|
||||
// +kubebuilder:resource:scope=Cluster
|
||||
|
||||
// Test is the resource that contains a test definition.
|
||||
type Test struct {
|
||||
metav1.TypeMeta `json:",inline"`
|
||||
|
||||
// Standard object's metadata.
|
||||
// +optional
|
||||
metav1.ObjectMeta `json:"metadata,omitempty"`
|
||||
|
||||
// Test spec.
|
||||
Spec TestSpec `json:"spec"`
|
||||
}
|
||||
|
||||
// TestSpec contains the test spec.
|
||||
// +k8s:conversion-gen=false
|
||||
type TestSpec struct {
|
||||
// Cleanup contains cleanup configuration.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Cleanup CleanupOptions `json:"cleanup"`
|
||||
|
||||
// Cluster defines the target cluster (default cluster will be used if not specified and/or overridden).
|
||||
// +optional
|
||||
Cluster string `json:"cluster,omitempty"`
|
||||
|
||||
// Clusters holds a registry to clusters to support multi-cluster tests.
|
||||
// +optional
|
||||
Clusters Clusters `json:"clusters,omitempty"`
|
||||
|
||||
// Execution contains tests execution configuration.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Execution TestExecutionOptions `json:"execution"`
|
||||
|
||||
// Bindings defines additional binding key/values.
|
||||
// +optional
|
||||
Bindings []Binding `json:"bindings,omitempty"`
|
||||
|
||||
// Deletion contains the global deletion configuration.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Deletion DeletionOptions `json:"deletion"`
|
||||
|
||||
// Description contains a description of the test.
|
||||
// +optional
|
||||
Description string `json:"description,omitempty"`
|
||||
|
||||
// Error contains the global error configuration.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Error ErrorOptions `json:"error"`
|
||||
|
||||
// Namespace contains properties for the namespace to use for tests.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Namespace NamespaceOptions `json:"namespace"`
|
||||
|
||||
// Steps defining the test.
|
||||
Steps []TestStep `json:"steps"`
|
||||
|
||||
// Templating contains the templating config.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Templating TemplatingOptions `json:"templating"`
|
||||
|
||||
// Timeouts for the test. Overrides the global timeouts set in the Configuration on a per operation basis.
|
||||
// +optional
|
||||
// +kubebuilder:default:={}
|
||||
Timeouts Timeouts `json:"timeouts"`
|
||||
}
|
||||
|
||||
// TestExecutionOptions determines how tests are run.
|
||||
type TestExecutionOptions struct {
|
||||
// Concurrent determines whether the test should run concurrently with other tests.
|
||||
// +optional
|
||||
// +kubebuilder:default:=true
|
||||
Concurrent bool `json:"concurrent"`
|
||||
|
||||
// Skip determines whether the test should skipped.
|
||||
// +optional
|
||||
Skip bool `json:"skip,omitempty"`
|
||||
|
||||
// TerminationGracePeriod forces the termination grace period on pods, statefulsets, daemonsets and deployments.
|
||||
// +optional
|
||||
TerminationGracePeriod *metav1.Duration `json:"terminationGracePeriod,omitempty"`
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package v1alpha2
|
||||
|
||||
import (
|
||||
"github.com/kyverno/chainsaw/pkg/apis/v1alpha1"
|
||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||
)
|
||||
|
||||
func Convert_v1alpha2_TestSpec_To_v1alpha1_TestSpec(in *TestSpec, out *v1alpha1.TestSpec, s conversion.Scope) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func Convert_v1alpha1_TestSpec_To_v1alpha2_TestSpec(in *v1alpha1.TestSpec, out *TestSpec, s conversion.Scope) error {
|
||||
return nil
|
||||
}
|
|
@ -7,108 +7,28 @@ import (
|
|||
)
|
||||
|
||||
type (
|
||||
Any = v1alpha1.Any
|
||||
Catch = v1alpha1.Catch
|
||||
Cluster = v1alpha1.Cluster
|
||||
Timeouts = v1alpha1.Timeouts
|
||||
Any = v1alpha1.Any
|
||||
Binding = v1alpha1.Binding
|
||||
Check = v1alpha1.Check
|
||||
Cluster = v1alpha1.Cluster
|
||||
Clusters = v1alpha1.Clusters
|
||||
Expectation = v1alpha1.Expectation
|
||||
Format = v1alpha1.Format
|
||||
ObjectName = v1alpha1.ObjectName
|
||||
ObjectType = v1alpha1.ObjectType
|
||||
Output = v1alpha1.Output
|
||||
Timeouts = v1alpha1.Timeouts
|
||||
)
|
||||
|
||||
// Cleanup contains the cleanup configuration.
|
||||
type Cleanup struct {
|
||||
// If set, do not delete the resources after running a test.
|
||||
// +optional
|
||||
SkipDelete bool `json:"skipDelete,omitempty"`
|
||||
// ObjectReference represents one or more objects with a specific apiVersion and kind.
|
||||
// For a single object name and namespace are used to identify the object.
|
||||
// For multiple objects use labels.
|
||||
// +k8s:conversion-gen=false
|
||||
type ObjectReference struct {
|
||||
ObjectType `json:",inline"`
|
||||
ObjectName `json:",inline"`
|
||||
|
||||
// DelayBeforeCleanup adds a delay between the time a test ends and the time cleanup starts.
|
||||
// Label selector to match objects to delete
|
||||
// +optional
|
||||
DelayBeforeCleanup *metav1.Duration `json:"delayBeforeCleanup,omitempty"`
|
||||
}
|
||||
|
||||
// Discovery contains the tests discovery configuration.
|
||||
type Discovery struct {
|
||||
// ExcludeTestRegex is used to exclude tests based on a regular expression.
|
||||
// +optional
|
||||
ExcludeTestRegex string `json:"excludeTestRegex,omitempty"`
|
||||
|
||||
// IncludeTestRegex is used to include tests based on a regular expression.
|
||||
// +optional
|
||||
IncludeTestRegex string `json:"includeTestRegex,omitempty"`
|
||||
|
||||
// TestFile is the name of the file containing the test to run.
|
||||
// If no extension is provided, chainsaw will try with .yaml first and .yml if needed.
|
||||
// +kubebuilder:default:="chainsaw-test"
|
||||
// +optional
|
||||
TestFile string `json:"testFile,omitempty"`
|
||||
|
||||
// FullName makes use of the full test case folder path instead of the folder name.
|
||||
// +optional
|
||||
FullName bool `json:"fullName,omitempty"`
|
||||
}
|
||||
|
||||
// Execution contains the runner configuration.
|
||||
type Execution struct {
|
||||
// FailFast determines whether the test should stop upon encountering the first failure.
|
||||
// +optional
|
||||
FailFast bool `json:"failFast,omitempty"`
|
||||
|
||||
// The maximum number of tests to run at once.
|
||||
// +kubebuilder:validation:Format:=int
|
||||
// +kubebuilder:validation:Minimum:=1
|
||||
// +optional
|
||||
Parallel *int `json:"parallel,omitempty"`
|
||||
|
||||
// RepeatCount indicates how many times the tests should be executed.
|
||||
// +kubebuilder:validation:Format:=int
|
||||
// +kubebuilder:validation:Minimum:=1
|
||||
// +optional
|
||||
RepeatCount *int `json:"repeatCount,omitempty"`
|
||||
|
||||
// ForceTerminationGracePeriod forces the termination grace period on pods, statefulsets, daemonsets and deployments.
|
||||
// +optional
|
||||
ForceTerminationGracePeriod *metav1.Duration `json:"forceTerminationGracePeriod,omitempty"`
|
||||
}
|
||||
|
||||
// Namespace contains info about the namespace used for testing.
|
||||
type Namespace struct {
|
||||
// Name defines the namespace to use for tests.
|
||||
// If not specified, every test will execute in a random ephemeral namespace
|
||||
// unless the namespace is overridden in a the test spec.
|
||||
// +optional
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// Template defines a template to create the test namespace.
|
||||
// +optional
|
||||
Template *Any `json:"template,omitempty"`
|
||||
}
|
||||
|
||||
type ReportFormatType string
|
||||
|
||||
const (
|
||||
JSONFormat ReportFormatType = "JSON"
|
||||
XMLFormat ReportFormatType = "XML"
|
||||
)
|
||||
|
||||
// Report contains info about the report.
|
||||
type Report struct {
|
||||
// ReportFormat determines test report format (JSON|XML).
|
||||
// +optional
|
||||
// +kubebuilder:validation:Enum:=JSON;XML
|
||||
// +kubebuilder:default:="JSON"
|
||||
Format ReportFormatType `json:"format,omitempty"`
|
||||
|
||||
// ReportPath defines the path.
|
||||
// +optional
|
||||
Path string `json:"path,omitempty"`
|
||||
|
||||
// ReportName defines the name of report to create. It defaults to "chainsaw-report".
|
||||
// +optional
|
||||
// +kubebuilder:default:="chainsaw-report"
|
||||
Name string `json:"name,omitempty"`
|
||||
}
|
||||
|
||||
// Templating contains the templating configuration.
|
||||
type Templating struct {
|
||||
// Enabled determines whether resources should be considered for templating.
|
||||
// +optional
|
||||
Enabled *bool `json:"enabled,omitempty"`
|
||||
Labels *metav1.LabelSelector `json:"labelSelector,omitempty"`
|
||||
}
|
||||
|
|
|
@ -22,7 +22,12 @@ limitations under the License.
|
|||
package v1alpha2
|
||||
|
||||
import (
|
||||
unsafe "unsafe"
|
||||
|
||||
v1alpha1 "github.com/kyverno/chainsaw/pkg/apis/v1alpha1"
|
||||
policyv1alpha1 "github.com/kyverno/kyverno-json/pkg/apis/policy/v1alpha1"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
unstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||
)
|
||||
|
@ -34,6 +39,116 @@ func init() {
|
|||
// RegisterConversions adds conversion functions to the given scheme.
|
||||
// Public to allow building arbitrary schemes.
|
||||
func RegisterConversions(s *runtime.Scheme) error {
|
||||
if err := s.AddGeneratedConversionFunc((*ActionCheck)(nil), (*v1alpha1.ActionCheck)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionCheck_To_v1alpha1_ActionCheck(a.(*ActionCheck), b.(*v1alpha1.ActionCheck), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionCheck)(nil), (*ActionCheck)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionCheck_To_v1alpha2_ActionCheck(a.(*v1alpha1.ActionCheck), b.(*ActionCheck), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionCheckRef)(nil), (*v1alpha1.ActionCheckRef)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionCheckRef_To_v1alpha1_ActionCheckRef(a.(*ActionCheckRef), b.(*v1alpha1.ActionCheckRef), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionCheckRef)(nil), (*ActionCheckRef)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionCheckRef_To_v1alpha2_ActionCheckRef(a.(*v1alpha1.ActionCheckRef), b.(*ActionCheckRef), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionDryRun)(nil), (*v1alpha1.ActionDryRun)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionDryRun_To_v1alpha1_ActionDryRun(a.(*ActionDryRun), b.(*v1alpha1.ActionDryRun), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionDryRun)(nil), (*ActionDryRun)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionDryRun_To_v1alpha2_ActionDryRun(a.(*v1alpha1.ActionDryRun), b.(*ActionDryRun), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionEnv)(nil), (*v1alpha1.ActionEnv)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionEnv_To_v1alpha1_ActionEnv(a.(*ActionEnv), b.(*v1alpha1.ActionEnv), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionEnv)(nil), (*ActionEnv)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionEnv_To_v1alpha2_ActionEnv(a.(*v1alpha1.ActionEnv), b.(*ActionEnv), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionExpectations)(nil), (*v1alpha1.ActionExpectations)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionExpectations_To_v1alpha1_ActionExpectations(a.(*ActionExpectations), b.(*v1alpha1.ActionExpectations), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionExpectations)(nil), (*ActionExpectations)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionExpectations_To_v1alpha2_ActionExpectations(a.(*v1alpha1.ActionExpectations), b.(*ActionExpectations), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionFormat)(nil), (*v1alpha1.ActionFormat)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionFormat_To_v1alpha1_ActionFormat(a.(*ActionFormat), b.(*v1alpha1.ActionFormat), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionFormat)(nil), (*ActionFormat)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionFormat_To_v1alpha2_ActionFormat(a.(*v1alpha1.ActionFormat), b.(*ActionFormat), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionInlineResource)(nil), (*v1alpha1.ActionInlineResource)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionInlineResource_To_v1alpha1_ActionInlineResource(a.(*ActionInlineResource), b.(*v1alpha1.ActionInlineResource), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionInlineResource)(nil), (*ActionInlineResource)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionInlineResource_To_v1alpha2_ActionInlineResource(a.(*v1alpha1.ActionInlineResource), b.(*ActionInlineResource), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionObject)(nil), (*v1alpha1.ActionObject)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionObject_To_v1alpha1_ActionObject(a.(*ActionObject), b.(*v1alpha1.ActionObject), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionObject)(nil), (*ActionObject)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionObject_To_v1alpha2_ActionObject(a.(*v1alpha1.ActionObject), b.(*ActionObject), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionObjectSelector)(nil), (*v1alpha1.ActionObjectSelector)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionObjectSelector_To_v1alpha1_ActionObjectSelector(a.(*ActionObjectSelector), b.(*v1alpha1.ActionObjectSelector), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionObjectSelector)(nil), (*ActionObjectSelector)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionObjectSelector_To_v1alpha2_ActionObjectSelector(a.(*v1alpha1.ActionObjectSelector), b.(*ActionObjectSelector), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionResourceRef)(nil), (*v1alpha1.ActionResourceRef)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionResourceRef_To_v1alpha1_ActionResourceRef(a.(*ActionResourceRef), b.(*v1alpha1.ActionResourceRef), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionResourceRef)(nil), (*ActionResourceRef)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionResourceRef_To_v1alpha2_ActionResourceRef(a.(*v1alpha1.ActionResourceRef), b.(*ActionResourceRef), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*ActionTimeout)(nil), (*v1alpha1.ActionTimeout)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ActionTimeout_To_v1alpha1_ActionTimeout(a.(*ActionTimeout), b.(*v1alpha1.ActionTimeout), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.ActionTimeout)(nil), (*ActionTimeout)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ActionTimeout_To_v1alpha2_ActionTimeout(a.(*v1alpha1.ActionTimeout), b.(*ActionTimeout), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*Configuration)(nil), (*v1alpha1.Configuration)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_Configuration_To_v1alpha1_Configuration(a.(*Configuration), b.(*v1alpha1.Configuration), scope)
|
||||
}); err != nil {
|
||||
|
@ -44,19 +159,295 @@ func RegisterConversions(s *runtime.Scheme) error {
|
|||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*FileRef)(nil), (*v1alpha1.FileRef)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_FileRef_To_v1alpha1_FileRef(a.(*FileRef), b.(*v1alpha1.FileRef), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.FileRef)(nil), (*FileRef)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_FileRef_To_v1alpha2_FileRef(a.(*v1alpha1.FileRef), b.(*FileRef), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*Test)(nil), (*v1alpha1.Test)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_Test_To_v1alpha1_Test(a.(*Test), b.(*v1alpha1.Test), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddGeneratedConversionFunc((*v1alpha1.Test)(nil), (*Test)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_Test_To_v1alpha2_Test(a.(*v1alpha1.Test), b.(*Test), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddConversionFunc((*v1alpha1.ConfigurationSpec)(nil), (*ConfigurationSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_ConfigurationSpec_To_v1alpha2_ConfigurationSpec(a.(*v1alpha1.ConfigurationSpec), b.(*ConfigurationSpec), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddConversionFunc((*v1alpha1.TestSpec)(nil), (*TestSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha1_TestSpec_To_v1alpha2_TestSpec(a.(*v1alpha1.TestSpec), b.(*TestSpec), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddConversionFunc((*ConfigurationSpec)(nil), (*v1alpha1.ConfigurationSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_ConfigurationSpec_To_v1alpha1_ConfigurationSpec(a.(*ConfigurationSpec), b.(*v1alpha1.ConfigurationSpec), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.AddConversionFunc((*TestSpec)(nil), (*v1alpha1.TestSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||
return Convert_v1alpha2_TestSpec_To_v1alpha1_TestSpec(a.(*TestSpec), b.(*v1alpha1.TestSpec), scope)
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionCheck_To_v1alpha1_ActionCheck(in *ActionCheck, out *v1alpha1.ActionCheck, s conversion.Scope) error {
|
||||
out.Check = (*policyv1alpha1.Any)(unsafe.Pointer(in.Check))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionCheck_To_v1alpha1_ActionCheck is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionCheck_To_v1alpha1_ActionCheck(in *ActionCheck, out *v1alpha1.ActionCheck, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionCheck_To_v1alpha1_ActionCheck(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionCheck_To_v1alpha2_ActionCheck(in *v1alpha1.ActionCheck, out *ActionCheck, s conversion.Scope) error {
|
||||
out.Check = (*policyv1alpha1.Any)(unsafe.Pointer(in.Check))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionCheck_To_v1alpha2_ActionCheck is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionCheck_To_v1alpha2_ActionCheck(in *v1alpha1.ActionCheck, out *ActionCheck, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionCheck_To_v1alpha2_ActionCheck(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionCheckRef_To_v1alpha1_ActionCheckRef(in *ActionCheckRef, out *v1alpha1.ActionCheckRef, s conversion.Scope) error {
|
||||
if err := Convert_v1alpha2_FileRef_To_v1alpha1_FileRef(&in.FileRef, &out.FileRef, s); err != nil {
|
||||
return err
|
||||
}
|
||||
out.Check = (*policyv1alpha1.Any)(unsafe.Pointer(in.Check))
|
||||
out.Template = (*bool)(unsafe.Pointer(in.Template))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionCheckRef_To_v1alpha1_ActionCheckRef is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionCheckRef_To_v1alpha1_ActionCheckRef(in *ActionCheckRef, out *v1alpha1.ActionCheckRef, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionCheckRef_To_v1alpha1_ActionCheckRef(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionCheckRef_To_v1alpha2_ActionCheckRef(in *v1alpha1.ActionCheckRef, out *ActionCheckRef, s conversion.Scope) error {
|
||||
if err := Convert_v1alpha1_FileRef_To_v1alpha2_FileRef(&in.FileRef, &out.FileRef, s); err != nil {
|
||||
return err
|
||||
}
|
||||
out.Check = (*policyv1alpha1.Any)(unsafe.Pointer(in.Check))
|
||||
out.Template = (*bool)(unsafe.Pointer(in.Template))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionCheckRef_To_v1alpha2_ActionCheckRef is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionCheckRef_To_v1alpha2_ActionCheckRef(in *v1alpha1.ActionCheckRef, out *ActionCheckRef, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionCheckRef_To_v1alpha2_ActionCheckRef(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionDryRun_To_v1alpha1_ActionDryRun(in *ActionDryRun, out *v1alpha1.ActionDryRun, s conversion.Scope) error {
|
||||
out.DryRun = (*bool)(unsafe.Pointer(in.DryRun))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionDryRun_To_v1alpha1_ActionDryRun is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionDryRun_To_v1alpha1_ActionDryRun(in *ActionDryRun, out *v1alpha1.ActionDryRun, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionDryRun_To_v1alpha1_ActionDryRun(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionDryRun_To_v1alpha2_ActionDryRun(in *v1alpha1.ActionDryRun, out *ActionDryRun, s conversion.Scope) error {
|
||||
out.DryRun = (*bool)(unsafe.Pointer(in.DryRun))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionDryRun_To_v1alpha2_ActionDryRun is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionDryRun_To_v1alpha2_ActionDryRun(in *v1alpha1.ActionDryRun, out *ActionDryRun, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionDryRun_To_v1alpha2_ActionDryRun(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionEnv_To_v1alpha1_ActionEnv(in *ActionEnv, out *v1alpha1.ActionEnv, s conversion.Scope) error {
|
||||
out.Env = *(*[]v1alpha1.Binding)(unsafe.Pointer(&in.Env))
|
||||
out.SkipLogOutput = in.SkipLogOutput
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionEnv_To_v1alpha1_ActionEnv is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionEnv_To_v1alpha1_ActionEnv(in *ActionEnv, out *v1alpha1.ActionEnv, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionEnv_To_v1alpha1_ActionEnv(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionEnv_To_v1alpha2_ActionEnv(in *v1alpha1.ActionEnv, out *ActionEnv, s conversion.Scope) error {
|
||||
out.Env = *(*[]v1alpha1.Binding)(unsafe.Pointer(&in.Env))
|
||||
out.SkipLogOutput = in.SkipLogOutput
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionEnv_To_v1alpha2_ActionEnv is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionEnv_To_v1alpha2_ActionEnv(in *v1alpha1.ActionEnv, out *ActionEnv, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionEnv_To_v1alpha2_ActionEnv(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionExpectations_To_v1alpha1_ActionExpectations(in *ActionExpectations, out *v1alpha1.ActionExpectations, s conversion.Scope) error {
|
||||
out.Expect = *(*[]v1alpha1.Expectation)(unsafe.Pointer(&in.Expect))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionExpectations_To_v1alpha1_ActionExpectations is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionExpectations_To_v1alpha1_ActionExpectations(in *ActionExpectations, out *v1alpha1.ActionExpectations, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionExpectations_To_v1alpha1_ActionExpectations(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionExpectations_To_v1alpha2_ActionExpectations(in *v1alpha1.ActionExpectations, out *ActionExpectations, s conversion.Scope) error {
|
||||
out.Expect = *(*[]v1alpha1.Expectation)(unsafe.Pointer(&in.Expect))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionExpectations_To_v1alpha2_ActionExpectations is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionExpectations_To_v1alpha2_ActionExpectations(in *v1alpha1.ActionExpectations, out *ActionExpectations, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionExpectations_To_v1alpha2_ActionExpectations(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionFormat_To_v1alpha1_ActionFormat(in *ActionFormat, out *v1alpha1.ActionFormat, s conversion.Scope) error {
|
||||
out.Format = v1alpha1.Format(in.Format)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionFormat_To_v1alpha1_ActionFormat is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionFormat_To_v1alpha1_ActionFormat(in *ActionFormat, out *v1alpha1.ActionFormat, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionFormat_To_v1alpha1_ActionFormat(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionFormat_To_v1alpha2_ActionFormat(in *v1alpha1.ActionFormat, out *ActionFormat, s conversion.Scope) error {
|
||||
out.Format = v1alpha1.Format(in.Format)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionFormat_To_v1alpha2_ActionFormat is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionFormat_To_v1alpha2_ActionFormat(in *v1alpha1.ActionFormat, out *ActionFormat, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionFormat_To_v1alpha2_ActionFormat(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionInlineResource_To_v1alpha1_ActionInlineResource(in *ActionInlineResource, out *v1alpha1.ActionInlineResource, s conversion.Scope) error {
|
||||
out.Resource = (*unstructured.Unstructured)(unsafe.Pointer(in.Resource))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionInlineResource_To_v1alpha1_ActionInlineResource is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionInlineResource_To_v1alpha1_ActionInlineResource(in *ActionInlineResource, out *v1alpha1.ActionInlineResource, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionInlineResource_To_v1alpha1_ActionInlineResource(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionInlineResource_To_v1alpha2_ActionInlineResource(in *v1alpha1.ActionInlineResource, out *ActionInlineResource, s conversion.Scope) error {
|
||||
out.Resource = (*unstructured.Unstructured)(unsafe.Pointer(in.Resource))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionInlineResource_To_v1alpha2_ActionInlineResource is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionInlineResource_To_v1alpha2_ActionInlineResource(in *v1alpha1.ActionInlineResource, out *ActionInlineResource, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionInlineResource_To_v1alpha2_ActionInlineResource(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionObject_To_v1alpha1_ActionObject(in *ActionObject, out *v1alpha1.ActionObject, s conversion.Scope) error {
|
||||
out.ObjectType = in.ObjectType
|
||||
if err := Convert_v1alpha2_ActionObjectSelector_To_v1alpha1_ActionObjectSelector(&in.ActionObjectSelector, &out.ActionObjectSelector, s); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionObject_To_v1alpha1_ActionObject is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionObject_To_v1alpha1_ActionObject(in *ActionObject, out *v1alpha1.ActionObject, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionObject_To_v1alpha1_ActionObject(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionObject_To_v1alpha2_ActionObject(in *v1alpha1.ActionObject, out *ActionObject, s conversion.Scope) error {
|
||||
out.ObjectType = in.ObjectType
|
||||
if err := Convert_v1alpha1_ActionObjectSelector_To_v1alpha2_ActionObjectSelector(&in.ActionObjectSelector, &out.ActionObjectSelector, s); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionObject_To_v1alpha2_ActionObject is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionObject_To_v1alpha2_ActionObject(in *v1alpha1.ActionObject, out *ActionObject, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionObject_To_v1alpha2_ActionObject(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionObjectSelector_To_v1alpha1_ActionObjectSelector(in *ActionObjectSelector, out *v1alpha1.ActionObjectSelector, s conversion.Scope) error {
|
||||
out.ObjectName = in.ObjectName
|
||||
out.Selector = in.Selector
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionObjectSelector_To_v1alpha1_ActionObjectSelector is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionObjectSelector_To_v1alpha1_ActionObjectSelector(in *ActionObjectSelector, out *v1alpha1.ActionObjectSelector, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionObjectSelector_To_v1alpha1_ActionObjectSelector(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionObjectSelector_To_v1alpha2_ActionObjectSelector(in *v1alpha1.ActionObjectSelector, out *ActionObjectSelector, s conversion.Scope) error {
|
||||
out.ObjectName = in.ObjectName
|
||||
out.Selector = in.Selector
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionObjectSelector_To_v1alpha2_ActionObjectSelector is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionObjectSelector_To_v1alpha2_ActionObjectSelector(in *v1alpha1.ActionObjectSelector, out *ActionObjectSelector, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionObjectSelector_To_v1alpha2_ActionObjectSelector(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionResourceRef_To_v1alpha1_ActionResourceRef(in *ActionResourceRef, out *v1alpha1.ActionResourceRef, s conversion.Scope) error {
|
||||
if err := Convert_v1alpha2_FileRef_To_v1alpha1_FileRef(&in.FileRef, &out.FileRef, s); err != nil {
|
||||
return err
|
||||
}
|
||||
out.Resource = (*unstructured.Unstructured)(unsafe.Pointer(in.Resource))
|
||||
out.Template = (*bool)(unsafe.Pointer(in.Template))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionResourceRef_To_v1alpha1_ActionResourceRef is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionResourceRef_To_v1alpha1_ActionResourceRef(in *ActionResourceRef, out *v1alpha1.ActionResourceRef, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionResourceRef_To_v1alpha1_ActionResourceRef(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionResourceRef_To_v1alpha2_ActionResourceRef(in *v1alpha1.ActionResourceRef, out *ActionResourceRef, s conversion.Scope) error {
|
||||
if err := Convert_v1alpha1_FileRef_To_v1alpha2_FileRef(&in.FileRef, &out.FileRef, s); err != nil {
|
||||
return err
|
||||
}
|
||||
out.Resource = (*unstructured.Unstructured)(unsafe.Pointer(in.Resource))
|
||||
out.Template = (*bool)(unsafe.Pointer(in.Template))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionResourceRef_To_v1alpha2_ActionResourceRef is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionResourceRef_To_v1alpha2_ActionResourceRef(in *v1alpha1.ActionResourceRef, out *ActionResourceRef, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionResourceRef_To_v1alpha2_ActionResourceRef(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_ActionTimeout_To_v1alpha1_ActionTimeout(in *ActionTimeout, out *v1alpha1.ActionTimeout, s conversion.Scope) error {
|
||||
out.Timeout = (*v1.Duration)(unsafe.Pointer(in.Timeout))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_ActionTimeout_To_v1alpha1_ActionTimeout is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_ActionTimeout_To_v1alpha1_ActionTimeout(in *ActionTimeout, out *v1alpha1.ActionTimeout, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_ActionTimeout_To_v1alpha1_ActionTimeout(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_ActionTimeout_To_v1alpha2_ActionTimeout(in *v1alpha1.ActionTimeout, out *ActionTimeout, s conversion.Scope) error {
|
||||
out.Timeout = (*v1.Duration)(unsafe.Pointer(in.Timeout))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_ActionTimeout_To_v1alpha2_ActionTimeout is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_ActionTimeout_To_v1alpha2_ActionTimeout(in *v1alpha1.ActionTimeout, out *ActionTimeout, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_ActionTimeout_To_v1alpha2_ActionTimeout(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_Configuration_To_v1alpha1_Configuration(in *Configuration, out *v1alpha1.Configuration, s conversion.Scope) error {
|
||||
out.ObjectMeta = in.ObjectMeta
|
||||
if err := Convert_v1alpha2_ConfigurationSpec_To_v1alpha1_ConfigurationSpec(&in.Spec, &out.Spec, s); err != nil {
|
||||
|
@ -82,3 +473,49 @@ func autoConvert_v1alpha1_Configuration_To_v1alpha2_Configuration(in *v1alpha1.C
|
|||
func Convert_v1alpha1_Configuration_To_v1alpha2_Configuration(in *v1alpha1.Configuration, out *Configuration, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_Configuration_To_v1alpha2_Configuration(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_FileRef_To_v1alpha1_FileRef(in *FileRef, out *v1alpha1.FileRef, s conversion.Scope) error {
|
||||
out.File = in.File
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_FileRef_To_v1alpha1_FileRef is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_FileRef_To_v1alpha1_FileRef(in *FileRef, out *v1alpha1.FileRef, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_FileRef_To_v1alpha1_FileRef(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_FileRef_To_v1alpha2_FileRef(in *v1alpha1.FileRef, out *FileRef, s conversion.Scope) error {
|
||||
out.File = in.File
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_FileRef_To_v1alpha2_FileRef is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_FileRef_To_v1alpha2_FileRef(in *v1alpha1.FileRef, out *FileRef, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_FileRef_To_v1alpha2_FileRef(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha2_Test_To_v1alpha1_Test(in *Test, out *v1alpha1.Test, s conversion.Scope) error {
|
||||
out.ObjectMeta = in.ObjectMeta
|
||||
if err := Convert_v1alpha2_TestSpec_To_v1alpha1_TestSpec(&in.Spec, &out.Spec, s); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha2_Test_To_v1alpha1_Test is an autogenerated conversion function.
|
||||
func Convert_v1alpha2_Test_To_v1alpha1_Test(in *Test, out *v1alpha1.Test, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha2_Test_To_v1alpha1_Test(in, out, s)
|
||||
}
|
||||
|
||||
func autoConvert_v1alpha1_Test_To_v1alpha2_Test(in *v1alpha1.Test, out *Test, s conversion.Scope) error {
|
||||
out.ObjectMeta = in.ObjectMeta
|
||||
if err := Convert_v1alpha1_TestSpec_To_v1alpha2_TestSpec(&in.Spec, &out.Spec, s); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Convert_v1alpha1_Test_To_v1alpha2_Test is an autogenerated conversion function.
|
||||
func Convert_v1alpha1_Test_To_v1alpha2_Test(in *v1alpha1.Test, out *Test, s conversion.Scope) error {
|
||||
return autoConvert_v1alpha1_Test_To_v1alpha2_Test(in, out, s)
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -59,6 +59,7 @@ func init() {
|
|||
func addKnownTypes(scheme *runtime.Scheme) error {
|
||||
scheme.AddKnownTypes(SchemeGroupVersion,
|
||||
&Configuration{},
|
||||
&Test{},
|
||||
)
|
||||
// AddToGroupVersion allows the serialization of client types like ListOptions.
|
||||
v1.AddToGroupVersion(scheme, SchemeGroupVersion)
|
||||
|
|
|
@ -40,7 +40,7 @@ func Command() *cobra.Command {
|
|||
Args: cobra.NoArgs,
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, _ []string) error {
|
||||
tests, err := discovery.DiscoverTests(options.testFile, nil, options.testDirs...)
|
||||
tests, err := discovery.DiscoverTests(options.testFile, nil, true, options.testDirs...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -97,11 +97,11 @@ wait
|
|||
|
||||
{{- with .Spec.Steps }}
|
||||
|
||||
| # | Name | Bindings | Try | Catch | Finally |
|
||||
| # | Name | Bindings | Try | Catch | Finally | Cleanup |
|
||||
|:-:|---|:-:|:-:|:-:|:-:|
|
||||
{{- range $i, $step := . }}
|
||||
{{- $name := default (print "step-" (add $i 1)) $step.Name }}
|
||||
| {{ add $i 1 }} | [{{ $name }}](#step-{{ $name }}) | {{ len $step.Bindings }} | {{ len $step.Try }} | {{ add (len $step.Catch) (len $test.Spec.Catch) }} | {{ len $step.Finally }} |
|
||||
| {{ add $i 1 }} | [{{ $name }}](#step-{{ $name }}) | {{ len $step.Bindings }} | {{ len $step.Try }} | {{ add (len $step.Catch) (len $test.Spec.Catch) }} | {{ len $step.Finally }} | {{ len $step.Cleanup }} |
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
|
@ -160,6 +160,17 @@ wait
|
|||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- with $step.Cleanup }}
|
||||
|
||||
#### Cleanup
|
||||
|
||||
| # | Operation | Bindings | Outputs | Description |
|
||||
|:-:|---|:-:|:-:|---|
|
||||
{{- range $i, $op := . }}
|
||||
| {{ add $i 1 }} | `{{ template "FinallyType" $op }}` | {{ len $op.Bindings }} | {{ len $op.Outputs }} | {{ default "*No description*" $op.Description }} |
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- end }}
|
||||
|
||||
---
|
||||
|
|
|
@ -48,7 +48,7 @@ func Command() *cobra.Command {
|
|||
if save {
|
||||
path := filepath.Join(path, "chainsaw-test.yaml")
|
||||
fmt.Fprintf(out, "Saving file %s ...\n", path)
|
||||
if err := os.WriteFile(path, data, os.ModePerm); err != nil {
|
||||
if err := os.WriteFile(path, data, 0o600); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
|
@ -70,67 +70,79 @@ func sampleSteps(description bool) []v1alpha1.TestStep {
|
|||
TestStepSpec: v1alpha1.TestStepSpec{
|
||||
Description: getDescription(description, "sample step 1"),
|
||||
Try: []v1alpha1.Operation{{
|
||||
Description: getDescription(description, "sample apply operation"),
|
||||
OperationBase: v1alpha1.OperationBase{
|
||||
Description: getDescription(description, "sample apply operation"),
|
||||
},
|
||||
Apply: &v1alpha1.Apply{
|
||||
FileRefOrResource: v1alpha1.FileRefOrResource{
|
||||
ActionResourceRef: v1alpha1.ActionResourceRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: "resources.yaml",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, {
|
||||
Description: getDescription(description, "sample assert operation"),
|
||||
OperationBase: v1alpha1.OperationBase{
|
||||
Description: getDescription(description, "sample assert operation"),
|
||||
},
|
||||
Assert: &v1alpha1.Assert{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: "assert.yaml",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, {
|
||||
Description: getDescription(description, "sample error operation"),
|
||||
OperationBase: v1alpha1.OperationBase{
|
||||
Description: getDescription(description, "sample error operation"),
|
||||
},
|
||||
Error: &v1alpha1.Error{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: "error.yaml",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, {
|
||||
Description: getDescription(description, "sample delete operation"),
|
||||
OperationBase: v1alpha1.OperationBase{
|
||||
Description: getDescription(description, "sample delete operation"),
|
||||
},
|
||||
Delete: &v1alpha1.Delete{
|
||||
ObjectReference: v1alpha1.ObjectReference{
|
||||
ObjectSelector: v1alpha1.ObjectSelector{
|
||||
Name: "foo",
|
||||
},
|
||||
Ref: &v1alpha1.ObjectReference{
|
||||
ObjectType: v1alpha1.ObjectType{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
},
|
||||
ObjectName: v1alpha1.ObjectName{
|
||||
Name: "foo",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, {
|
||||
Description: getDescription(description, "sample script operation"),
|
||||
OperationBase: v1alpha1.OperationBase{
|
||||
Description: getDescription(description, "sample script operation"),
|
||||
},
|
||||
Script: &v1alpha1.Script{
|
||||
Content: `echo "test namespace = $NAMESPACE"`,
|
||||
},
|
||||
}},
|
||||
Catch: []v1alpha1.Catch{{
|
||||
Catch: []v1alpha1.CatchFinally{{
|
||||
Description: getDescription(description, "sample events collector"),
|
||||
Events: &v1alpha1.Events{
|
||||
ObjectLabelsSelector: v1alpha1.ObjectLabelsSelector{
|
||||
Name: "foo",
|
||||
ActionObjectSelector: v1alpha1.ActionObjectSelector{
|
||||
ObjectName: v1alpha1.ObjectName{
|
||||
Name: "foo",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, {
|
||||
Description: getDescription(description, "sample pod logs collector"),
|
||||
PodLogs: &v1alpha1.PodLogs{
|
||||
ObjectLabelsSelector: v1alpha1.ObjectLabelsSelector{
|
||||
ActionObjectSelector: v1alpha1.ActionObjectSelector{
|
||||
Selector: "app=foo",
|
||||
},
|
||||
},
|
||||
}},
|
||||
Finally: []v1alpha1.Finally{{
|
||||
Finally: []v1alpha1.CatchFinally{{
|
||||
Description: getDescription(description, "sample sleep operation"),
|
||||
Sleep: &v1alpha1.Sleep{
|
||||
Duration: metav1.Duration{Duration: 5 * time.Second},
|
||||
|
|
|
@ -37,7 +37,7 @@ func Command() *cobra.Command {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(outPath, entry.Name()), input, os.ModePerm); err != nil {
|
||||
if err := os.WriteFile(filepath.Join(outPath, entry.Name()), input, 0o600); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -155,7 +155,7 @@ func processStep(stderr io.Writer, step *v1alpha1.TestStep, s discovery.Step, fo
|
|||
if !containsKuttlResources {
|
||||
step.TestStepSpec.Try = append(step.TestStepSpec.Try, v1alpha1.Operation{
|
||||
Apply: &v1alpha1.Apply{
|
||||
FileRefOrResource: v1alpha1.FileRefOrResource{
|
||||
ActionResourceRef: v1alpha1.ActionResourceRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: file,
|
||||
},
|
||||
|
@ -197,7 +197,7 @@ func processStep(stderr io.Writer, step *v1alpha1.TestStep, s discovery.Step, fo
|
|||
}
|
||||
step.TestStepSpec.Try = append(step.TestStepSpec.Try, v1alpha1.Operation{
|
||||
Apply: &v1alpha1.Apply{
|
||||
FileRefOrResource: v1alpha1.FileRefOrResource{
|
||||
ActionResourceRef: v1alpha1.ActionResourceRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: file,
|
||||
},
|
||||
|
@ -222,7 +222,7 @@ func processStep(stderr io.Writer, step *v1alpha1.TestStep, s discovery.Step, fo
|
|||
if !containsKuttlResources {
|
||||
step.TestStepSpec.Try = append(step.TestStepSpec.Try, v1alpha1.Operation{
|
||||
Assert: &v1alpha1.Assert{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: file,
|
||||
},
|
||||
|
@ -258,7 +258,7 @@ func processStep(stderr io.Writer, step *v1alpha1.TestStep, s discovery.Step, fo
|
|||
}
|
||||
step.TestStepSpec.Try = append(step.TestStepSpec.Try, v1alpha1.Operation{
|
||||
Assert: &v1alpha1.Assert{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: file,
|
||||
},
|
||||
|
@ -283,7 +283,7 @@ func processStep(stderr io.Writer, step *v1alpha1.TestStep, s discovery.Step, fo
|
|||
if !containsKuttlResources {
|
||||
step.TestStepSpec.Try = append(step.TestStepSpec.Try, v1alpha1.Operation{
|
||||
Error: &v1alpha1.Error{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: file,
|
||||
},
|
||||
|
@ -319,7 +319,7 @@ func processStep(stderr io.Writer, step *v1alpha1.TestStep, s discovery.Step, fo
|
|||
}
|
||||
step.TestStepSpec.Try = append(step.TestStepSpec.Try, v1alpha1.Operation{
|
||||
Error: &v1alpha1.Error{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: file,
|
||||
},
|
||||
|
@ -392,9 +392,9 @@ func testStep(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
if operation.Script != "" {
|
||||
operations = append(operations, v1alpha1.Operation{
|
||||
Script: &v1alpha1.Script{
|
||||
Timeout: timeout,
|
||||
ActionTimeout: v1alpha1.ActionTimeout{Timeout: timeout},
|
||||
Content: operation.Script,
|
||||
SkipLogOutput: operation.SkipLogOutput,
|
||||
ActionEnv: v1alpha1.ActionEnv{SkipLogOutput: operation.SkipLogOutput},
|
||||
},
|
||||
})
|
||||
} else if operation.Command != "" {
|
||||
|
@ -409,10 +409,10 @@ func testStep(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
}
|
||||
operations = append(operations, v1alpha1.Operation{
|
||||
Command: &v1alpha1.Command{
|
||||
Timeout: timeout,
|
||||
ActionTimeout: v1alpha1.ActionTimeout{Timeout: timeout},
|
||||
Entrypoint: entrypoint,
|
||||
Args: args,
|
||||
SkipLogOutput: operation.SkipLogOutput,
|
||||
ActionEnv: v1alpha1.ActionEnv{SkipLogOutput: operation.SkipLogOutput},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
@ -420,7 +420,7 @@ func testStep(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
for _, operation := range from.Apply {
|
||||
operations = append(operations, v1alpha1.Operation{
|
||||
Apply: &v1alpha1.Apply{
|
||||
FileRefOrResource: v1alpha1.FileRefOrResource{
|
||||
ActionResourceRef: v1alpha1.ActionResourceRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: operation,
|
||||
},
|
||||
|
@ -431,7 +431,7 @@ func testStep(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
for _, operation := range from.Assert {
|
||||
operations = append(operations, v1alpha1.Operation{
|
||||
Assert: &v1alpha1.Assert{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: operation,
|
||||
},
|
||||
|
@ -442,7 +442,7 @@ func testStep(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
for _, operation := range from.Error {
|
||||
operations = append(operations, v1alpha1.Operation{
|
||||
Error: &v1alpha1.Error{
|
||||
FileRefOrCheck: v1alpha1.FileRefOrCheck{
|
||||
ActionCheckRef: v1alpha1.ActionCheckRef{
|
||||
FileRef: v1alpha1.FileRef{
|
||||
File: operation,
|
||||
},
|
||||
|
@ -453,16 +453,16 @@ func testStep(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
for _, operation := range from.Delete {
|
||||
operations = append(operations, v1alpha1.Operation{
|
||||
Delete: &v1alpha1.Delete{
|
||||
ObjectReference: v1alpha1.ObjectReference{
|
||||
Ref: &v1alpha1.ObjectReference{
|
||||
ObjectType: v1alpha1.ObjectType{
|
||||
APIVersion: operation.APIVersion,
|
||||
Kind: operation.Kind,
|
||||
},
|
||||
ObjectSelector: v1alpha1.ObjectSelector{
|
||||
ObjectName: v1alpha1.ObjectName{
|
||||
Namespace: operation.Namespace,
|
||||
Name: operation.Name,
|
||||
Labels: operation.Labels,
|
||||
},
|
||||
Labels: operation.Labels,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
@ -481,15 +481,15 @@ func testAssert(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
if cmd.Script != "" {
|
||||
to.Try = append(to.Try, v1alpha1.Operation{
|
||||
Script: &v1alpha1.Script{
|
||||
Content: cmd.Script,
|
||||
SkipLogOutput: cmd.SkipLogOutput,
|
||||
Content: cmd.Script,
|
||||
ActionEnv: v1alpha1.ActionEnv{SkipLogOutput: cmd.SkipLogOutput},
|
||||
},
|
||||
})
|
||||
} else if cmd.Command != "" {
|
||||
to.Try = append(to.Try, v1alpha1.Operation{
|
||||
Script: &v1alpha1.Script{
|
||||
Content: cmd.Command,
|
||||
SkipLogOutput: cmd.SkipLogOutput,
|
||||
Content: cmd.Command,
|
||||
ActionEnv: v1alpha1.ActionEnv{SkipLogOutput: cmd.SkipLogOutput},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
@ -504,33 +504,37 @@ func testAssert(to *v1alpha1.TestStepSpec, in unstructured.Unstructured) error {
|
|||
switch collector.Type {
|
||||
case "pod":
|
||||
op := &v1alpha1.PodLogs{
|
||||
ObjectLabelsSelector: v1alpha1.ObjectLabelsSelector{
|
||||
Name: collector.Pod,
|
||||
Namespace: collector.Namespace,
|
||||
Selector: collector.Selector,
|
||||
ActionObjectSelector: v1alpha1.ActionObjectSelector{
|
||||
ObjectName: v1alpha1.ObjectName{
|
||||
Name: collector.Pod,
|
||||
Namespace: collector.Namespace,
|
||||
},
|
||||
Selector: collector.Selector,
|
||||
},
|
||||
Container: collector.Container,
|
||||
}
|
||||
if collector.Tail != 0 {
|
||||
op.Tail = ptr.To(collector.Tail)
|
||||
}
|
||||
to.Catch = append(to.Catch, v1alpha1.Catch{PodLogs: op})
|
||||
to.Catch = append(to.Catch, v1alpha1.CatchFinally{PodLogs: op})
|
||||
case "command":
|
||||
if collector.Cmd == "" {
|
||||
return fmt.Errorf("cmd must be set when tyme is command")
|
||||
}
|
||||
to.Catch = append(to.Catch, v1alpha1.Catch{
|
||||
to.Catch = append(to.Catch, v1alpha1.CatchFinally{
|
||||
Script: &v1alpha1.Script{
|
||||
Content: collector.Cmd,
|
||||
},
|
||||
})
|
||||
case "events":
|
||||
to.Catch = append(to.Catch, v1alpha1.Catch{
|
||||
to.Catch = append(to.Catch, v1alpha1.CatchFinally{
|
||||
Events: &v1alpha1.Events{
|
||||
ObjectLabelsSelector: v1alpha1.ObjectLabelsSelector{
|
||||
Name: collector.Pod,
|
||||
Namespace: collector.Namespace,
|
||||
Selector: collector.Selector,
|
||||
ActionObjectSelector: v1alpha1.ActionObjectSelector{
|
||||
ObjectName: v1alpha1.ObjectName{
|
||||
Name: collector.Pod,
|
||||
Namespace: collector.Namespace,
|
||||
},
|
||||
Selector: collector.Selector,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue