mirror of
https://github.com/replicatedhq/troubleshoot.git
synced 2026-09-03 00:47:17 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8237ac991c | ||
|
|
73201c0304 | ||
|
|
531edf42e2 | ||
|
|
f69ae77bc3 | ||
|
|
b02d12ff1e | ||
|
|
24822b7f95 | ||
|
|
784918e7ee | ||
|
|
819dd5fc26 | ||
|
|
27e06517bf | ||
|
|
d14e0dd18c | ||
|
|
d7b3dd8abb | ||
|
|
f64d98b5c3 | ||
|
|
f0efbf658a | ||
|
|
ec2d14a7ad | ||
|
|
6385a1247f | ||
|
|
80a946d0c2 | ||
|
|
58c428347e | ||
|
|
2c6b1869e2 | ||
|
|
944da4543a | ||
|
|
e8340d54d4 | ||
|
|
0fc92122d7 | ||
|
|
f7f5604734 | ||
|
|
de44c21efa | ||
|
|
557a1381a9 | ||
|
|
fefe118943 | ||
|
|
5b1e48258f | ||
|
|
03c53cabd6 | ||
|
|
a5628874b0 | ||
|
|
620fa75eb5 | ||
|
|
60d5b686cc | ||
|
|
f9dbccd354 | ||
|
|
08a1075d82 | ||
|
|
0a855f26c2 | ||
|
|
0d1e23651a | ||
|
|
70f0e071dd | ||
|
|
5add5d6f9d | ||
|
|
191e002a9b | ||
|
|
fbacd055cd | ||
|
|
401dfe2c57 | ||
|
|
145bad7e8e | ||
|
|
a3b7975690 | ||
|
|
41cd7c2aa4 | ||
|
|
2b8e3fb6bb | ||
|
|
27c68a7e53 | ||
|
|
8fb417a896 | ||
|
|
88022bb67b | ||
|
|
7304c9f20d | ||
|
|
097d20edcb | ||
|
|
3b61b3025e | ||
|
|
6a9ad7842d | ||
|
|
830e357b48 | ||
|
|
acb1099bda | ||
|
|
091c4dc134 | ||
|
|
1939f5464d | ||
|
|
1aeec3fa74 | ||
|
|
349fa746cc | ||
|
|
380522a5f7 | ||
|
|
51f626b994 | ||
|
|
e22c7d7eca | ||
|
|
af4cc8a08a | ||
|
|
6de79afc35 | ||
|
|
95c83f04c6 | ||
|
|
f7f1504a38 | ||
|
|
3a84d6a894 | ||
|
|
72d41b2a75 | ||
|
|
3c39c51665 | ||
|
|
3548b46cfc | ||
|
|
766469b867 | ||
|
|
7cdcd2afa9 | ||
|
|
ca04a67d29 | ||
|
|
2484b3b1eb | ||
|
|
4d23096657 | ||
|
|
ae0cbc7044 | ||
|
|
6fc75138d9 | ||
|
|
01d322584a |
@@ -112,10 +112,17 @@ jobs:
|
||||
path: bin/
|
||||
- run: chmod +x bin/preflight
|
||||
- run: |
|
||||
set +e
|
||||
./bin/preflight --interactive=false --format=json https://preflight.replicated.com > result.json
|
||||
EXIT_CODE=$?
|
||||
cat result.json
|
||||
|
||||
EXIT_STATUS=0
|
||||
if [ $EXIT_CODE -ne 3 ]; then
|
||||
echo "Expected exit code of 3 (some checks failed), got $EXIT_CODE"
|
||||
EXIT_STATUS=1
|
||||
fi
|
||||
|
||||
if grep -q "was not collected" result.json; then
|
||||
echo "Some files were not collected"
|
||||
EXIT_STATUS=1
|
||||
@@ -155,6 +162,12 @@ jobs:
|
||||
- run: chmod +x bin/preflight
|
||||
- run: make preflight-e2e-test
|
||||
|
||||
run-examples:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- run: make run-examples
|
||||
|
||||
compile-supportbundle:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -278,9 +291,10 @@ jobs:
|
||||
with:
|
||||
go-version: "1.19"
|
||||
|
||||
- uses: sigstore/cosign-installer@main
|
||||
- uses: sigstore/cosign-installer@v3
|
||||
with:
|
||||
cosign-release: "v1.2.1"
|
||||
# DO NOT USE v2 until we decide on whether to use Rekor or not
|
||||
cosign-release: "v1.13.1" # Binary version to install
|
||||
|
||||
- name: Get Cosign Key
|
||||
run: |
|
||||
@@ -298,7 +312,7 @@ jobs:
|
||||
- name: Run GoReleaser
|
||||
uses: goreleaser/goreleaser-action@v4
|
||||
with:
|
||||
version: "v0.183.0"
|
||||
version: "v1.x" # Binary version to install
|
||||
args: release --rm-dist --config deploy/.goreleaser.yaml
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*.dylib
|
||||
bin
|
||||
.DS_Store
|
||||
node_modules/
|
||||
|
||||
# Test binary, build with `go test -c`
|
||||
*.test
|
||||
@@ -26,6 +27,8 @@ vendor
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.envrc
|
||||
|
||||
|
||||
dist
|
||||
try.sh
|
||||
|
||||
@@ -32,6 +32,28 @@ To get started we recommend:
|
||||
|
||||
6. Install [golangci-lint] linter and run `make lint` to execute additional code linters.
|
||||
|
||||
### Syncing to a test cluster with `watchrsync`
|
||||
|
||||
1. Install `npm`
|
||||
2. Export `REMOTES=<user>@<ip>` so that `watchrsync` knows where to sync.
|
||||
3. Maybe run `export GOOS=linux` and `export GOARCH=amd64` so that you build Linux binaries.
|
||||
4. run `make watchrsync` to build and sync binaries automatically on saving.
|
||||
|
||||
```
|
||||
ssh-add --apple-use-keychain ~/.ssh/google_compute_engine
|
||||
export REMOTES=ada@35.229.61.56
|
||||
export GOOS=linux
|
||||
export GOARCH=amd64
|
||||
make watchrsync
|
||||
# bin/watchrsync.js
|
||||
# make support-bundle
|
||||
# go build -tags "netgo containers_image_ostree_stub exclude_graphdriver_devicemapper exclude_graphdriver_btrfs containers_image_openpgp" -installsuffix netgo -ldflags " -s -w -X github.com/replicatedhq/troubleshoot/pkg/version.version=`git describe --tags --dirty` -X github.com/replicatedhq/troubleshoot/pkg/version.gitSHA=`git rev-parse HEAD` -X github.com/replicatedhq/troubleshoot/pkg/version.buildTime=`date -u +"%Y-%m-%dT%H:%M:%SZ"` " -o bin/support-bundle github.com/replicatedhq/troubleshoot/cmd/troubleshoot
|
||||
# rsync bin/support-bundle ada@35.229.61.56:
|
||||
# date
|
||||
# Tue May 16 14:14:13 EDT 2023
|
||||
# synced
|
||||
```
|
||||
|
||||
### Testing
|
||||
|
||||
To run the tests locally run the following:
|
||||
@@ -54,11 +76,13 @@ A running Kubernetes cluster as well as `jq` are required to run e2e tests.
|
||||
You are able to collect CPU & memory runtime properties and store the data for analysis in a file. To do so, pass in the file paths using `--cpuprofile` and `--memprofile` flags in the CLI. Once you have your data collected, you can analyse it using [pprof visualization tool](https://github.com/google/pprof/blob/main/doc/README.md). Here is how
|
||||
|
||||
Run support bundle and with CPU & memory profile flags
|
||||
|
||||
```sh
|
||||
./bin/support-bundle examples/support-bundle/sample-supportbundle.yaml --cpuprofile=cpu.prof --memprofile=mem.prof
|
||||
```
|
||||
|
||||
Visualize using [pprof](https://github.com/google/pprof/blob/main/doc/README.md)
|
||||
|
||||
```sh
|
||||
go tool pprof -http=":8000" cpu.prof
|
||||
|
||||
@@ -76,16 +100,19 @@ This is a rough outline of how to prepare a contribution:
|
||||
- Make commits of logical units.
|
||||
- When your changes are ready to merge, squash your history to 1 commit.
|
||||
- For example, if you want to squash your last 3 commits and write a new commit message:
|
||||
|
||||
```
|
||||
git reset --soft HEAD~3 &&
|
||||
git commit
|
||||
```
|
||||
|
||||
- If you want to keep the previous commit messages and concatenate them all into a new commit, you can do something like this instead:
|
||||
|
||||
```
|
||||
git reset --soft HEAD~3 &&
|
||||
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
|
||||
```
|
||||
|
||||
- Push your changes to a topic branch in your fork of the repository.
|
||||
- Submit a pull request to the original repository. It will be reviewed in a timely manner.
|
||||
|
||||
|
||||
@@ -38,7 +38,8 @@ BUILDFLAGS = -tags "netgo containers_image_ostree_stub exclude_graphdriver_devic
|
||||
BUILDPATHS = ./pkg/... ./cmd/... ./internal/...
|
||||
TESTFLAGS ?= -v -coverprofile cover.out
|
||||
|
||||
all: test support-bundle preflight collect analyze
|
||||
.DEFAULT: all
|
||||
all: test build
|
||||
|
||||
.PHONY: ffi
|
||||
ffi: fmt vet
|
||||
@@ -62,10 +63,19 @@ test-integration:
|
||||
preflight-e2e-test:
|
||||
./test/validate-preflight-e2e.sh
|
||||
|
||||
.PHONY: run-examples
|
||||
run-examples:
|
||||
./test/run-examples.sh
|
||||
|
||||
.PHONY: support-bundle-e2e-test
|
||||
support-bundle-e2e-test:
|
||||
./test/validate-support-bundle-e2e.sh
|
||||
|
||||
# Build all binaries in parallel ( -j )
|
||||
build:
|
||||
@echo "Build cli binaries"
|
||||
$(MAKE) -j support-bundle preflight analyze collect
|
||||
|
||||
.PHONY: support-bundle
|
||||
support-bundle:
|
||||
go build ${BUILDFLAGS} ${LDFLAGS} -o bin/support-bundle github.com/replicatedhq/troubleshoot/cmd/troubleshoot
|
||||
@@ -207,7 +217,7 @@ longhorn:
|
||||
.PHONY: scan
|
||||
scan:
|
||||
trivy fs \
|
||||
--security-checks vuln \
|
||||
--scanners vuln \
|
||||
--exit-code=1 \
|
||||
--severity="HIGH,CRITICAL" \
|
||||
--ignore-unfixed \
|
||||
@@ -220,3 +230,13 @@ lint: fmt vet
|
||||
.PHONY: lint-and-fix
|
||||
lint-and-fix: fmt vet
|
||||
golangci-lint run --new --fix -c .golangci.yaml ${BUILDPATHS}
|
||||
|
||||
## Syncronize the code with a remote server. More info: CONTRIBUTING.md
|
||||
.PHONY: watchrsync
|
||||
watchrsync: npm-install
|
||||
bin/watchrsync.js
|
||||
|
||||
.PHONY: npm-install
|
||||
npm-install:
|
||||
npm --version 2>&1 >/dev/null || ( echo "npm not installed; install npm to set up watchrsync" && exit 1 )
|
||||
npm list gaze-run-interrupt || npm install install gaze-run-interrupt@~2.0.0
|
||||
|
||||
@@ -61,7 +61,14 @@ A signed SBOM that includes Troubleshoot dependencies is included in each relea
|
||||
|
||||
The following example illustrates using [cosign](https://github.com/sigstore/cosign) to verify that **troubleshoot-sbom.tgz** has
|
||||
not been tampered with.
|
||||
```
|
||||
```sh
|
||||
$ cosign verify-blob --key key.pub --signature troubleshoot-sbom.tgz.sig troubleshoot-sbom.tgz
|
||||
Verified OK
|
||||
```
|
||||
|
||||
If you were to get an error similar to the one below, it means you are verifying an SBOM signed using cosign `v1` using a newer `v2` of the binary. This version introduced [breaking changes](https://github.com/sigstore/cosign/blob/main/CHANGELOG.md#breaking-changes) which require an additional flag `--insecure-ignore-tlog=true` to successfully verify SBOMs like so.
|
||||
```sh
|
||||
$ cosign verify-blob --key key.pub --signature troubleshoot-sbom.tgz.sig troubleshoot-sbom.tgz --insecure-ignore-tlog=true
|
||||
WARNING: Skipping tlog verification is an insecure practice that lacks of transparency and auditability verification for the blob.
|
||||
Verified OK
|
||||
```
|
||||
|
||||
Executable
+57
@@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const gri = require('gaze-run-interrupt');
|
||||
|
||||
if (!process.env.REMOTES) {
|
||||
console.log("Usage: `REMOTES='user@h1.1.1.1,user@1.1.1.2' ./watchrsync.js`");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
process.env.GOOS = 'linux';
|
||||
process.env.GOARCH = 'amd64';
|
||||
|
||||
const binList = [
|
||||
// 'bin/analyze',
|
||||
// 'bin/preflight',
|
||||
'bin/support-bundle',
|
||||
// 'bin/collect'
|
||||
]
|
||||
const makeList = [
|
||||
// 'analyze',
|
||||
// 'preflight',
|
||||
'support-bundle',
|
||||
// 'collect'
|
||||
]
|
||||
|
||||
const commands = [
|
||||
// {
|
||||
// command: 'rm',
|
||||
// args: binList,
|
||||
// },
|
||||
{
|
||||
command: 'make',
|
||||
args: makeList,
|
||||
},
|
||||
];
|
||||
|
||||
process.env.REMOTES.split(",").forEach(function (remote) {
|
||||
commands.push({
|
||||
command: 'rsync',
|
||||
args: binList.concat(`${remote}:`),
|
||||
});
|
||||
});
|
||||
|
||||
commands.push({
|
||||
command: "date",
|
||||
args: [],
|
||||
});
|
||||
|
||||
commands.push({
|
||||
command: "echo",
|
||||
args: ["synced"],
|
||||
});
|
||||
|
||||
gri([
|
||||
'cmd/**/*.go',
|
||||
'pkg/**/*.go',
|
||||
], commands);
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"os"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/replicatedhq/troubleshoot/cmd/util"
|
||||
"github.com/replicatedhq/troubleshoot/internal/util"
|
||||
analyzer "github.com/replicatedhq/troubleshoot/pkg/analyze"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
@@ -10,10 +10,9 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/replicatedhq/troubleshoot/cmd/util"
|
||||
"github.com/replicatedhq/troubleshoot/internal/util"
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/scheme"
|
||||
troubleshootclientsetscheme "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/scheme"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/collect"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/docrewrite"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
|
||||
@@ -88,7 +87,6 @@ func runCollect(v *viper.Viper, arg string) error {
|
||||
|
||||
multidocs := strings.Split(string(collectorContent), "\n---\n")
|
||||
|
||||
troubleshootclientsetscheme.AddToScheme(scheme.Scheme)
|
||||
decode := scheme.Codecs.UniversalDeserializer().Decode
|
||||
|
||||
redactors, err := supportbundle.GetRedactorsFromURIs(v.GetStringSlice("redactors"))
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/replicatedhq/troubleshoot/cmd/util"
|
||||
"github.com/replicatedhq/troubleshoot/internal/traces"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/constants"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/logger"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/preflight"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/types"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"k8s.io/klog/v2"
|
||||
@@ -22,7 +25,8 @@ func RootCmd() *cobra.Command {
|
||||
Short: "Run and retrieve preflight checks in a cluster",
|
||||
Long: `A preflight check is a set of validations that can and should be run to ensure
|
||||
that a cluster meets the requirements to run an application.`,
|
||||
SilenceUsage: true,
|
||||
SilenceUsage: true,
|
||||
SilenceErrors: true,
|
||||
PreRun: func(cmd *cobra.Command, args []string) {
|
||||
v := viper.GetViper()
|
||||
v.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
|
||||
@@ -48,6 +52,7 @@ that a cluster meets the requirements to run an application.`,
|
||||
if v.GetBool("debug") || v.IsSet("v") {
|
||||
fmt.Printf("\n%s", traces.GetExporterInstance().GetSummary())
|
||||
}
|
||||
|
||||
return err
|
||||
},
|
||||
PostRun: func(cmd *cobra.Command, args []string) {
|
||||
@@ -75,7 +80,24 @@ that a cluster meets the requirements to run an application.`,
|
||||
}
|
||||
|
||||
func InitAndExecute() {
|
||||
if err := RootCmd().Execute(); err != nil {
|
||||
cmd := RootCmd()
|
||||
err := cmd.Execute()
|
||||
|
||||
if err != nil {
|
||||
var exitErr types.ExitError
|
||||
if errors.As(err, &exitErr) {
|
||||
// We need to do this, there's situations where we need the non-zero exit code (which comes as part of the custom error struct)
|
||||
// but there's no actual error, just an exit code.
|
||||
// If there's also an error to output (eg. invalid format etc) then print it as well
|
||||
if exitErr.ExitStatus() != constants.EXIT_CODE_FAIL && exitErr.ExitStatus() != constants.EXIT_CODE_WARN {
|
||||
cmd.PrintErrln("Error:", err.Error())
|
||||
}
|
||||
|
||||
os.Exit(exitErr.ExitStatus())
|
||||
}
|
||||
|
||||
// Fallback, should almost never be used (the above Exit() should handle almost all situations
|
||||
cmd.PrintErrln("Error:", err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/replicatedhq/troubleshoot/cmd/util"
|
||||
"github.com/replicatedhq/troubleshoot/internal/util"
|
||||
analyzer "github.com/replicatedhq/troubleshoot/pkg/analyze"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/convert"
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
@@ -7,11 +7,13 @@ import (
|
||||
"path"
|
||||
"time"
|
||||
|
||||
"github.com/mitchellh/go-wordwrap"
|
||||
"github.com/pkg/errors"
|
||||
ui "github.com/replicatedhq/termui/v3"
|
||||
"github.com/replicatedhq/termui/v3/widgets"
|
||||
"github.com/replicatedhq/troubleshoot/cmd/util"
|
||||
"github.com/replicatedhq/troubleshoot/internal/util"
|
||||
analyzerunner "github.com/replicatedhq/troubleshoot/pkg/analyze"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/constants"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -178,7 +180,10 @@ func drawDetails(analysisResult *analyzerunner.AnalyzeResult) {
|
||||
|
||||
currentTop := 4
|
||||
title := widgets.NewParagraph()
|
||||
title.Text = analysisResult.Title
|
||||
// WrapText is set to false to prevent internal wordwrap which is not accounting for the padding
|
||||
title.WrapText = false
|
||||
// For long title that lead to wrapping text, the terminal width is divided by 2 and deducted by MESSAGE_TEXT_PADDING to account for the padding
|
||||
title.Text = wordwrap.WrapString(analysisResult.Title, uint(termWidth/2-constants.MESSAGE_TEXT_PADDING))
|
||||
title.Border = false
|
||||
if analysisResult.IsPass {
|
||||
title.TextStyle = ui.NewStyle(ui.ColorGreen, ui.ColorClear, ui.ModifierBold)
|
||||
@@ -187,34 +192,26 @@ func drawDetails(analysisResult *analyzerunner.AnalyzeResult) {
|
||||
} else if analysisResult.IsFail {
|
||||
title.TextStyle = ui.NewStyle(ui.ColorRed, ui.ColorClear, ui.ModifierBold)
|
||||
}
|
||||
height := estimateNumberOfLines(title.Text, termWidth/2)
|
||||
height := util.EstimateNumberOfLines(title.Text)
|
||||
title.SetRect(termWidth/2, currentTop, termWidth, currentTop+height)
|
||||
ui.Render(title)
|
||||
currentTop = currentTop + height + 1
|
||||
|
||||
message := widgets.NewParagraph()
|
||||
message.Text = analysisResult.Message
|
||||
// WrapText is set to false to prevent internal wordwrap which is not accounting for the padding
|
||||
message.WrapText = false
|
||||
// For long text that lead to wrapping text, the terminal width is divided by 2 and deducted by MESSAGE_TEXT_PADDING to account for the padding
|
||||
message.Text = wordwrap.WrapString(analysisResult.Message, uint(termWidth/2-constants.MESSAGE_TEXT_PADDING))
|
||||
if analysisResult.URI != "" {
|
||||
// Add URL to the message with wordwrap
|
||||
// Add emply lines as separator
|
||||
urlText := wordwrap.WrapString(fmt.Sprintf("For more information: %s", analysisResult.URI), uint(termWidth/2-constants.MESSAGE_TEXT_PADDING))
|
||||
message.Text = message.Text + "\n\n" + urlText
|
||||
}
|
||||
height = util.EstimateNumberOfLines(message.Text) + constants.MESSAGE_TEXT_LINES_MARGIN_TO_BOTTOM
|
||||
message.Border = false
|
||||
height = estimateNumberOfLines(message.Text, termWidth/2) + 2
|
||||
message.SetRect(termWidth/2, currentTop, termWidth, currentTop+height)
|
||||
ui.Render(message)
|
||||
currentTop = currentTop + height + 1
|
||||
|
||||
if analysisResult.URI != "" {
|
||||
uri := widgets.NewParagraph()
|
||||
uri.Text = fmt.Sprintf("For more information: %s", analysisResult.URI)
|
||||
uri.Border = false
|
||||
// For long urls that lead to wrapping text, make the rectangle bigger by
|
||||
// increasing the calculated height by 2
|
||||
height = estimateNumberOfLines(uri.Text, termWidth/2) + 2
|
||||
uri.SetRect(termWidth/2, currentTop, termWidth, currentTop+height)
|
||||
ui.Render(uri)
|
||||
}
|
||||
}
|
||||
|
||||
func estimateNumberOfLines(text string, width int) int {
|
||||
lines := len(text)/width + 1
|
||||
return lines
|
||||
}
|
||||
|
||||
func showSaved(filename string) {
|
||||
|
||||
@@ -68,7 +68,7 @@ from a server that can be used to assist when troubleshooting a Kubernetes clust
|
||||
cmd.Flags().Bool("redact", true, "enable/disable default redactions")
|
||||
cmd.Flags().Bool("interactive", true, "enable/disable interactive mode")
|
||||
cmd.Flags().Bool("collect-without-permissions", true, "always generate a support bundle, even if it some require additional permissions")
|
||||
cmd.Flags().StringSliceP("selector", "l", []string{"troubleshoot.io/kind=support-bundle"}, "selector to filter on for loading additional support bundle specs found in secrets within the cluster")
|
||||
cmd.Flags().StringSliceP("selector", "l", []string{"troubleshoot.sh/kind=support-bundle"}, "selector to filter on for loading additional support bundle specs found in secrets within the cluster")
|
||||
cmd.Flags().Bool("load-cluster-specs", false, "enable/disable loading additional troubleshoot specs found within the cluster. required when no specs are provided on the command line")
|
||||
cmd.Flags().String("since-time", "", "force pod logs collectors to return logs after a specific date (RFC3339)")
|
||||
cmd.Flags().String("since", "", "force pod logs collectors to return logs newer than a relative duration like 5s, 2m, or 3h.")
|
||||
|
||||
+63
-46
@@ -9,6 +9,7 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -19,8 +20,7 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
analyzer "github.com/replicatedhq/troubleshoot/pkg/analyze"
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/scheme"
|
||||
troubleshootclientsetscheme "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/scheme"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/constants"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/convert"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/httputil"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
|
||||
@@ -79,7 +79,6 @@ func runTroubleshoot(v *viper.Viper, arg []string) error {
|
||||
|
||||
var mainBundle *troubleshootv1beta2.SupportBundle
|
||||
|
||||
troubleshootclientsetscheme.AddToScheme(scheme.Scheme)
|
||||
additionalRedactors := &troubleshootv1beta2.Redactor{}
|
||||
|
||||
// Defining `v` below will render using `v` in reference to Viper unusable.
|
||||
@@ -260,20 +259,25 @@ the %s Admin Console to begin analysis.`
|
||||
}
|
||||
|
||||
// loadClusterSpecs loads the support bundle and redactor specs from the cluster
|
||||
// based on troubleshoot.io/kind=support-bundle label selector. We search for secrets
|
||||
// based on the provided labels. By default this will be troubleshoot.io/kind=support-bundle and troubleshoot.sh/kind=support-bundle label selectors. We search for secrets
|
||||
// and configmaps with the label selector and parse the data as a support bundle. If the
|
||||
// user does not have sufficient permissions to list & read secrets and configmaps from
|
||||
// all namespaces, we will fallback to trying each namespace individually, and eventually
|
||||
// default to the configured kubeconfig namespace.
|
||||
func loadClusterSpecs() (*troubleshootv1beta2.SupportBundle, *troubleshootv1beta2.Redactor, error) {
|
||||
var parsedBundle *troubleshootv1beta2.SupportBundle
|
||||
redactors := &troubleshootv1beta2.Redactor{}
|
||||
|
||||
v := viper.GetViper() // It's singleton, so we can use it anywhere
|
||||
|
||||
klog.Info("Discover troubleshoot specs from cluster")
|
||||
|
||||
labelSelector := strings.Join(v.GetStringSlice("selector"), ",")
|
||||
selectors := v.GetStringSlice("selector")
|
||||
if reflect.DeepEqual(selectors, []string{"troubleshoot.sh/kind=support-bundle"}) {
|
||||
// Its the default selector so we append troubleshoot.io/kind=support-bundle to it due to backwards compatibility
|
||||
selectors = append(selectors, "troubleshoot.io/kind=support-bundle")
|
||||
}
|
||||
|
||||
labelSelector := strings.Join(selectors, ",")
|
||||
|
||||
parsedSelector, err := labels.Parse(labelSelector)
|
||||
if err != nil {
|
||||
@@ -335,38 +339,49 @@ func loadClusterSpecs() (*troubleshootv1beta2.SupportBundle, *troubleshootv1beta
|
||||
|
||||
var bundlesFromCluster []string
|
||||
|
||||
// Search cluster for support bundle specs
|
||||
klog.V(1).Infof("Search support bundle specs from [%q] namespaces using %q selector", strings.Join(namespaces, ", "), parsedSelector.String())
|
||||
for _, ns := range namespaces {
|
||||
bundlesFromSecrets, err := specs.LoadFromSecretMatchingLabel(client, parsedSelector.String(), ns, specs.SupportBundleKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from secrets: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading secrets from %q namespace forbidden", ns)
|
||||
}
|
||||
}
|
||||
bundlesFromCluster = append(bundlesFromCluster, bundlesFromSecrets...)
|
||||
|
||||
bundlesFromConfigMaps, err := specs.LoadFromConfigMapMatchingLabel(client, parsedSelector.String(), ns, specs.SupportBundleKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from configmap: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading configmaps from %q namespace forbidden", ns)
|
||||
}
|
||||
}
|
||||
bundlesFromCluster = append(bundlesFromCluster, bundlesFromConfigMaps...)
|
||||
parsedSelectorStrings, err := specs.SplitTroubleshootSecretLabelSelector(client, parsedSelector)
|
||||
if err != nil {
|
||||
klog.Errorf("failed to parse troubleshoot labels selector %s", err)
|
||||
}
|
||||
|
||||
// Search cluster for support bundle specs
|
||||
for _, parsedSelectorString := range parsedSelectorStrings {
|
||||
klog.V(1).Infof("Search support bundle specs from [%q] namespace using %q selector", strings.Join(namespaces, ", "), parsedSelectorString)
|
||||
for _, ns := range namespaces {
|
||||
bundlesFromSecrets, err := specs.LoadFromSecretMatchingLabel(client, parsedSelectorString, ns, constants.SupportBundleKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from secrets: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading secrets from %q namespace forbidden", ns)
|
||||
}
|
||||
}
|
||||
bundlesFromCluster = append(bundlesFromCluster, bundlesFromSecrets...)
|
||||
|
||||
bundlesFromConfigMaps, err := specs.LoadFromConfigMapMatchingLabel(client, parsedSelectorString, ns, constants.SupportBundleKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from configmap: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading configmaps from %q namespace forbidden", ns)
|
||||
}
|
||||
}
|
||||
bundlesFromCluster = append(bundlesFromCluster, bundlesFromConfigMaps...)
|
||||
}
|
||||
}
|
||||
|
||||
parsedBundle := &troubleshootv1beta2.SupportBundle{}
|
||||
|
||||
for _, bundle := range bundlesFromCluster {
|
||||
multidocs := strings.Split(string(bundle), "\n---\n")
|
||||
parsedBundle, err = supportbundle.ParseSupportBundleFromDoc([]byte(multidocs[0]))
|
||||
bundleFromDoc, err := supportbundle.ParseSupportBundleFromDoc([]byte(multidocs[0]))
|
||||
if err != nil {
|
||||
klog.Errorf("failed to parse support bundle spec: %s", err)
|
||||
continue
|
||||
}
|
||||
|
||||
parsedBundle = supportbundle.ConcatSpec(parsedBundle, bundleFromDoc)
|
||||
|
||||
parsedRedactors, err := supportbundle.ParseRedactorsFromDocs(multidocs)
|
||||
if err != nil {
|
||||
klog.Errorf("failed to parse redactors from doc: %s", err)
|
||||
@@ -379,27 +394,29 @@ func loadClusterSpecs() (*troubleshootv1beta2.SupportBundle, *troubleshootv1beta
|
||||
var redactorsFromCluster []string
|
||||
|
||||
// Search cluster for redactor specs
|
||||
klog.V(1).Infof("Search redactor specs from [%q] namespaces using %q selector", strings.Join(namespaces, ", "), parsedSelector.String())
|
||||
for _, ns := range namespaces {
|
||||
redactorsFromSecrets, err := specs.LoadFromSecretMatchingLabel(client, parsedSelector.String(), ns, specs.RedactorKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from secrets: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading secrets from %q namespace forbidden", ns)
|
||||
for _, parsedSelectorString := range parsedSelectorStrings {
|
||||
klog.V(1).Infof("Search redactor specs from [%q] namespace using %q selector", strings.Join(namespaces, ", "), parsedSelectorString)
|
||||
for _, ns := range namespaces {
|
||||
redactorsFromSecrets, err := specs.LoadFromSecretMatchingLabel(client, parsedSelectorString, ns, constants.RedactorKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from secrets: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading secrets from %q namespace forbidden", ns)
|
||||
}
|
||||
}
|
||||
}
|
||||
redactorsFromCluster = append(redactorsFromCluster, redactorsFromSecrets...)
|
||||
redactorsFromCluster = append(redactorsFromCluster, redactorsFromSecrets...)
|
||||
|
||||
redactorsFromConfigMaps, err := specs.LoadFromConfigMapMatchingLabel(client, parsedSelector.String(), ns, specs.RedactorKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from configmap: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading configmaps from %q namespace forbidden", ns)
|
||||
redactorsFromConfigMaps, err := specs.LoadFromConfigMapMatchingLabel(client, parsedSelectorString, ns, constants.RedactorKey)
|
||||
if err != nil {
|
||||
if !k8serrors.IsForbidden(err) {
|
||||
klog.Errorf("failed to load support bundle spec from configmap: %s", err)
|
||||
} else {
|
||||
klog.Warningf("Reading configmaps from %q namespace forbidden", ns)
|
||||
}
|
||||
}
|
||||
redactorsFromCluster = append(redactorsFromCluster, redactorsFromConfigMaps...)
|
||||
}
|
||||
redactorsFromCluster = append(redactorsFromCluster, redactorsFromConfigMaps...)
|
||||
}
|
||||
|
||||
for _, redactor := range redactorsFromCluster {
|
||||
|
||||
@@ -90,6 +90,53 @@ spec:
|
||||
- namespace
|
||||
- outcomes
|
||||
type: object
|
||||
certificates:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
clusterPodStatuses:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -195,6 +242,10 @@ spec:
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
regex:
|
||||
type: string
|
||||
regexGroups:
|
||||
type: string
|
||||
strict:
|
||||
type: BoolString
|
||||
yamlPath:
|
||||
@@ -681,6 +732,8 @@ spec:
|
||||
type: BoolString
|
||||
fileName:
|
||||
type: string
|
||||
jsonPath:
|
||||
type: string
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
@@ -1618,6 +1671,55 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
certificatesCollection:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
cpu:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -2353,6 +2455,67 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
textAnalyze:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
excludeFiles:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
fileName:
|
||||
type: string
|
||||
ignoreIfNoFiles:
|
||||
type: boolean
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
regex:
|
||||
type: string
|
||||
regexGroups:
|
||||
type: string
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
time:
|
||||
properties:
|
||||
annotations:
|
||||
|
||||
@@ -87,21 +87,29 @@ spec:
|
||||
collectorName:
|
||||
type: string
|
||||
configMaps:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
items:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespaces:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
type: array
|
||||
exclude:
|
||||
type: BoolString
|
||||
name:
|
||||
type: string
|
||||
secrets:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
items:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespaces:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
clusterInfo:
|
||||
properties:
|
||||
@@ -237,6 +245,36 @@ spec:
|
||||
- image
|
||||
- namespace
|
||||
type: object
|
||||
customMetrics:
|
||||
properties:
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
metricRequests:
|
||||
items:
|
||||
description: MetricRequest the details of the MetricValuesList
|
||||
to be retrieved
|
||||
properties:
|
||||
namespace:
|
||||
description: Namespace for which to collect the metric
|
||||
values, empty for non-namespaces resources.
|
||||
type: string
|
||||
objectName:
|
||||
description: ObjectName for which to collect metric
|
||||
values, all resources when empty. Note that for
|
||||
namespaced resources a Namespace has to be supplied
|
||||
regardless.
|
||||
type: string
|
||||
resourceMetricName:
|
||||
description: ResourceMetricName name of the MetricValueList
|
||||
as per the APIResourceList from custom.metrics.k8s.io/v1beta1
|
||||
type: string
|
||||
required:
|
||||
- resourceMetricName
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
data:
|
||||
properties:
|
||||
collectorName:
|
||||
@@ -1905,7 +1943,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -2020,7 +2061,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -2146,7 +2190,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -2371,7 +2419,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -2828,7 +2880,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -3405,7 +3461,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -3520,7 +3579,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -3645,7 +3707,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -3862,7 +3928,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -4311,7 +4381,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -4925,7 +4999,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -5040,7 +5117,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -5166,7 +5246,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -5391,7 +5475,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -5848,7 +5936,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
|
||||
@@ -143,6 +143,55 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
certificatesCollection:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
cpu:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -878,6 +927,67 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
textAnalyze:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
excludeFiles:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
fileName:
|
||||
type: string
|
||||
ignoreIfNoFiles:
|
||||
type: boolean
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
regex:
|
||||
type: string
|
||||
regexGroups:
|
||||
type: string
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
time:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -1002,6 +1112,19 @@ spec:
|
||||
- certificatePath
|
||||
- keyPath
|
||||
type: object
|
||||
certificatesCollection:
|
||||
properties:
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
paths:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
required:
|
||||
- paths
|
||||
type: object
|
||||
copy:
|
||||
properties:
|
||||
collectorName:
|
||||
|
||||
@@ -143,6 +143,55 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
certificatesCollection:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
cpu:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -878,6 +927,67 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
textAnalyze:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
excludeFiles:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
fileName:
|
||||
type: string
|
||||
ignoreIfNoFiles:
|
||||
type: boolean
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
regex:
|
||||
type: string
|
||||
regexGroups:
|
||||
type: string
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
time:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -1002,6 +1112,19 @@ spec:
|
||||
- certificatePath
|
||||
- keyPath
|
||||
type: object
|
||||
certificatesCollection:
|
||||
properties:
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
paths:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
required:
|
||||
- paths
|
||||
type: object
|
||||
copy:
|
||||
properties:
|
||||
collectorName:
|
||||
|
||||
@@ -90,6 +90,53 @@ spec:
|
||||
- namespace
|
||||
- outcomes
|
||||
type: object
|
||||
certificates:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
clusterPodStatuses:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -195,6 +242,10 @@ spec:
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
regex:
|
||||
type: string
|
||||
regexGroups:
|
||||
type: string
|
||||
strict:
|
||||
type: BoolString
|
||||
yamlPath:
|
||||
@@ -681,6 +732,8 @@ spec:
|
||||
type: BoolString
|
||||
fileName:
|
||||
type: string
|
||||
jsonPath:
|
||||
type: string
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
@@ -1531,21 +1584,29 @@ spec:
|
||||
collectorName:
|
||||
type: string
|
||||
configMaps:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
items:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespaces:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
type: array
|
||||
exclude:
|
||||
type: BoolString
|
||||
name:
|
||||
type: string
|
||||
secrets:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
items:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespaces:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
clusterInfo:
|
||||
properties:
|
||||
@@ -1681,6 +1742,36 @@ spec:
|
||||
- image
|
||||
- namespace
|
||||
type: object
|
||||
customMetrics:
|
||||
properties:
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
metricRequests:
|
||||
items:
|
||||
description: MetricRequest the details of the MetricValuesList
|
||||
to be retrieved
|
||||
properties:
|
||||
namespace:
|
||||
description: Namespace for which to collect the metric
|
||||
values, empty for non-namespaces resources.
|
||||
type: string
|
||||
objectName:
|
||||
description: ObjectName for which to collect metric
|
||||
values, all resources when empty. Note that for
|
||||
namespaced resources a Namespace has to be supplied
|
||||
regardless.
|
||||
type: string
|
||||
resourceMetricName:
|
||||
description: ResourceMetricName name of the MetricValueList
|
||||
as per the APIResourceList from custom.metrics.k8s.io/v1beta1
|
||||
type: string
|
||||
required:
|
||||
- resourceMetricName
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
data:
|
||||
properties:
|
||||
collectorName:
|
||||
@@ -3349,7 +3440,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -3464,7 +3558,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -3590,7 +3687,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -3815,7 +3916,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -4272,7 +4377,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -4849,7 +4958,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -4964,7 +5076,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -5089,7 +5204,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -5306,7 +5425,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -5755,7 +5878,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -6369,7 +6496,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -6484,7 +6614,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -6610,7 +6743,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -6835,7 +6972,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -7292,7 +7433,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
|
||||
@@ -121,6 +121,53 @@ spec:
|
||||
- namespace
|
||||
- outcomes
|
||||
type: object
|
||||
certificates:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
clusterPodStatuses:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -226,6 +273,10 @@ spec:
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
regex:
|
||||
type: string
|
||||
regexGroups:
|
||||
type: string
|
||||
strict:
|
||||
type: BoolString
|
||||
yamlPath:
|
||||
@@ -712,6 +763,8 @@ spec:
|
||||
type: BoolString
|
||||
fileName:
|
||||
type: string
|
||||
jsonPath:
|
||||
type: string
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
@@ -1562,21 +1615,29 @@ spec:
|
||||
collectorName:
|
||||
type: string
|
||||
configMaps:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
items:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespaces:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
type: array
|
||||
exclude:
|
||||
type: BoolString
|
||||
name:
|
||||
type: string
|
||||
secrets:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
items:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespaces:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
clusterInfo:
|
||||
properties:
|
||||
@@ -1712,6 +1773,36 @@ spec:
|
||||
- image
|
||||
- namespace
|
||||
type: object
|
||||
customMetrics:
|
||||
properties:
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
metricRequests:
|
||||
items:
|
||||
description: MetricRequest the details of the MetricValuesList
|
||||
to be retrieved
|
||||
properties:
|
||||
namespace:
|
||||
description: Namespace for which to collect the metric
|
||||
values, empty for non-namespaces resources.
|
||||
type: string
|
||||
objectName:
|
||||
description: ObjectName for which to collect metric
|
||||
values, all resources when empty. Note that for
|
||||
namespaced resources a Namespace has to be supplied
|
||||
regardless.
|
||||
type: string
|
||||
resourceMetricName:
|
||||
description: ResourceMetricName name of the MetricValueList
|
||||
as per the APIResourceList from custom.metrics.k8s.io/v1beta1
|
||||
type: string
|
||||
required:
|
||||
- resourceMetricName
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
data:
|
||||
properties:
|
||||
collectorName:
|
||||
@@ -3380,7 +3471,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -3495,7 +3589,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -3621,7 +3718,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -3846,7 +3947,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -4303,7 +4408,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -4880,7 +4989,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -4995,7 +5107,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -5120,7 +5235,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -5337,7 +5456,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -5786,7 +5909,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -6400,7 +6527,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -6515,7 +6645,10 @@ spec:
|
||||
properties:
|
||||
name:
|
||||
description: The header field
|
||||
name
|
||||
name. This will be canonicalized
|
||||
upon output, so case-variant
|
||||
names will be understood as
|
||||
the same header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field
|
||||
@@ -6641,7 +6774,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -6866,7 +7003,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -7323,7 +7464,11 @@ spec:
|
||||
custom header to be used in HTTP probes
|
||||
properties:
|
||||
name:
|
||||
description: The header field name
|
||||
description: The header field name.
|
||||
This will be canonicalized upon
|
||||
output, so case-variant names
|
||||
will be understood as the same
|
||||
header.
|
||||
type: string
|
||||
value:
|
||||
description: The header field value
|
||||
@@ -10258,6 +10403,55 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
certificatesCollection:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
cpu:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -10993,6 +11187,67 @@ spec:
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
textAnalyze:
|
||||
properties:
|
||||
annotations:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
checkName:
|
||||
type: string
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
excludeFiles:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
fileName:
|
||||
type: string
|
||||
ignoreIfNoFiles:
|
||||
type: boolean
|
||||
outcomes:
|
||||
items:
|
||||
properties:
|
||||
fail:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
pass:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
warn:
|
||||
properties:
|
||||
message:
|
||||
type: string
|
||||
uri:
|
||||
type: string
|
||||
when:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
regex:
|
||||
type: string
|
||||
regexGroups:
|
||||
type: string
|
||||
strict:
|
||||
type: BoolString
|
||||
required:
|
||||
- outcomes
|
||||
type: object
|
||||
time:
|
||||
properties:
|
||||
annotations:
|
||||
@@ -11117,6 +11372,19 @@ spec:
|
||||
- certificatePath
|
||||
- keyPath
|
||||
type: object
|
||||
certificatesCollection:
|
||||
properties:
|
||||
collectorName:
|
||||
type: string
|
||||
exclude:
|
||||
type: BoolString
|
||||
paths:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
required:
|
||||
- paths
|
||||
type: object
|
||||
copy:
|
||||
properties:
|
||||
collectorName:
|
||||
|
||||
+4
-1
@@ -28,6 +28,7 @@ preflight [url] [flags]
|
||||
--context string The name of the kubeconfig context to use
|
||||
--cpuprofile string File path to write cpu profiling data
|
||||
--debug enable debug logging
|
||||
--disable-compression If true, opt-out of response compression for all requests to the server
|
||||
--format string output format, one of human, json, yaml. only used when interactive is set to false (default "human")
|
||||
-h, --help help for preflight
|
||||
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure
|
||||
@@ -44,10 +45,12 @@ preflight [url] [flags]
|
||||
--tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used
|
||||
--token string Bearer token for authentication to the API server
|
||||
--user string The name of the kubeconfig user to use
|
||||
-v, --v Level number for the log level verbosity
|
||||
```
|
||||
|
||||
### SEE ALSO
|
||||
|
||||
* [preflight oci-fetch](preflight_oci-fetch.md) - Fetch a preflight from an OCI registry and print it to standard out
|
||||
* [preflight version](preflight_version.md) - Print the current version and exit
|
||||
|
||||
###### Auto generated by spf13/cobra on 3-Jan-2023
|
||||
###### Auto generated by spf13/cobra on 8-Jun-2023
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
## preflight oci-fetch
|
||||
|
||||
Fetch a preflight from an OCI registry and print it to standard out
|
||||
|
||||
```
|
||||
preflight oci-fetch [URI] [flags]
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
```
|
||||
-h, --help help for oci-fetch
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
||||
```
|
||||
--collect-without-permissions always run preflight checks even if some require permissions that preflight does not have (default true)
|
||||
--collector-image string the full name of the collector image to use
|
||||
--collector-pullpolicy string the pull policy of the collector image
|
||||
--cpuprofile string File path to write cpu profiling data
|
||||
--debug enable debug logging
|
||||
--format string output format, one of human, json, yaml. only used when interactive is set to false (default "human")
|
||||
--interactive interactive preflights (default true)
|
||||
--memprofile string File path to write memory profiling data
|
||||
-o, --output string specify the output file path for the preflight checks
|
||||
--selector string selector (label query) to filter remote collection nodes on.
|
||||
--since string force pod logs collectors to return logs newer than a relative duration like 5s, 2m, or 3h.
|
||||
--since-time string force pod logs collectors to return logs after a specific date (RFC3339)
|
||||
```
|
||||
|
||||
### SEE ALSO
|
||||
|
||||
* [preflight](preflight.md) - Run and retrieve preflight checks in a cluster
|
||||
|
||||
###### Auto generated by spf13/cobra on 8-Jun-2023
|
||||
@@ -25,7 +25,8 @@ support-bundle [urls...] [flags]
|
||||
--collect-without-permissions always generate a support bundle, even if it some require additional permissions (default true)
|
||||
--context string The name of the kubeconfig context to use
|
||||
--cpuprofile string File path to write cpu profiling data
|
||||
--debug enable debug logging
|
||||
--debug enable debug logging. This is equivalent to --v=0
|
||||
--disable-compression If true, opt-out of response compression for all requests to the server
|
||||
-h, --help help for support-bundle
|
||||
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure
|
||||
--interactive enable/disable interactive mode (default true)
|
||||
@@ -38,13 +39,14 @@ support-bundle [urls...] [flags]
|
||||
--redact enable/disable default redactions (default true)
|
||||
--redactors strings names of the additional redactors to use
|
||||
--request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0")
|
||||
-l, --selector strings selector to filter on for loading additional support bundle specs found in secrets within the cluster (default [troubleshoot.io/kind=support-bundle])
|
||||
-l, --selector strings selector to filter on for loading additional support bundle specs found in secrets within the cluster (default [troubleshoot.sh/kind=support-bundle])
|
||||
-s, --server string The address and port of the Kubernetes API server
|
||||
--since string force pod logs collectors to return logs newer than a relative duration like 5s, 2m, or 3h.
|
||||
--since-time string force pod logs collectors to return logs after a specific date (RFC3339)
|
||||
--tls-server-name string Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used
|
||||
--token string Bearer token for authentication to the API server
|
||||
--user string The name of the kubeconfig user to use
|
||||
-v, --v Level number for the log level verbosity
|
||||
```
|
||||
|
||||
### SEE ALSO
|
||||
@@ -53,4 +55,4 @@ support-bundle [urls...] [flags]
|
||||
* [support-bundle redact](support-bundle_redact.md) - Redact information from a generated support bundle archive
|
||||
* [support-bundle version](support-bundle_version.md) - Print the current version and exit
|
||||
|
||||
###### Auto generated by spf13/cobra on 3-Jan-2023
|
||||
###### Auto generated by spf13/cobra on 8-Jun-2023
|
||||
|
||||
@@ -7,10 +7,21 @@ spec:
|
||||
- data:
|
||||
name: config/replicas.txt
|
||||
data: "5"
|
||||
- run:
|
||||
collectorName: "static-hi"
|
||||
image: 'alpine:3'
|
||||
command: ["echo", "hi static!"]
|
||||
- runPod:
|
||||
collectorName: "static-hi-1"
|
||||
podSpec:
|
||||
containers:
|
||||
- name: static-hi
|
||||
image: alpine:3
|
||||
command: ["echo", "hi static!"]
|
||||
## This collector is intentionally duplicated to test same pod should be terminated after success
|
||||
- runPod:
|
||||
collectorName: "static-hi-2"
|
||||
podSpec:
|
||||
containers:
|
||||
- name: static-hi
|
||||
image: alpine:3
|
||||
command: ["echo", "hi static!"]
|
||||
analyzers:
|
||||
- clusterVersion:
|
||||
outcomes:
|
||||
@@ -44,7 +55,16 @@ spec:
|
||||
message: You have at least 5 replicas
|
||||
- textAnalyze:
|
||||
checkName: Said hi!
|
||||
fileName: /static-hi.log
|
||||
fileName: /static-hi-1.log
|
||||
regex: 'hi static'
|
||||
outcomes:
|
||||
- fail:
|
||||
message: Didn't say hi.
|
||||
- pass:
|
||||
message: Said hi!
|
||||
- textAnalyze:
|
||||
checkName: Said hi!
|
||||
fileName: /static-hi-2.log
|
||||
regex: 'hi static'
|
||||
outcomes:
|
||||
- fail:
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
## Parse troubleshoot specs from a helm chart
|
||||
|
||||
This is an example of using troubleshoot's `loader.LoadSpecs` API to load specs from rendered manifests in a helm chart. The chart in this example contains a kubernetes `Secret` & `ConfigMap` with troubleshoot specs, as well as a troubleshoot custom resource. The custom resource is behind a values flag and does not get rendered by default. The code adds this flag to ensure that the manifest is rendered so as to load it.
|
||||
|
||||
The manifests are rendered with the equivalent of `helm template --values values.yaml` where the output is a YAML multidoc. `loader.LoadSpecs` will take the YAML multidoc as an input and extract troubleshoot specs inside kuberenetes `Secrets` and `ConfigMap`s, and any troubleshoot custom resources found.
|
||||
|
||||
This application always uses the local version of troubleshoot so as to build using the latest version of the library. This ensures that the example is kept in sync with new features.
|
||||
|
||||
### Running
|
||||
|
||||
```go
|
||||
go mod tidy # sync go modules
|
||||
go run main.go # run the application. This should print out a YAML multidoc of the loaded troubleshoot specs
|
||||
```
|
||||
@@ -0,0 +1,73 @@
|
||||
module helm-template
|
||||
|
||||
go 1.20
|
||||
|
||||
// Always use the local version of troubleshoot so as to build using
|
||||
// the latest version of the library. This will ensure the example
|
||||
// is kept in sync with new features
|
||||
replace github.com/replicatedhq/troubleshoot v0.0.0 => ../../../
|
||||
|
||||
require (
|
||||
github.com/replicatedhq/troubleshoot v0.0.0
|
||||
helm.sh/helm/v3 v3.12.1
|
||||
sigs.k8s.io/yaml v1.3.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v1.2.1 // indirect
|
||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
||||
github.com/Masterminds/semver/v3 v3.2.1 // indirect
|
||||
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.10.2 // indirect
|
||||
github.com/go-logr/logr v1.2.4 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.19.6 // indirect
|
||||
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
||||
github.com/go-openapi/swag v0.22.3 // indirect
|
||||
github.com/gobwas/glob v0.2.3 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/google/gnostic v0.6.9 // indirect
|
||||
github.com/google/go-cmp v0.5.9 // indirect
|
||||
github.com/google/gofuzz v1.2.0 // indirect
|
||||
github.com/google/uuid v1.3.0 // indirect
|
||||
github.com/huandu/xstrings v1.4.0 // indirect
|
||||
github.com/imdario/mergo v0.3.15 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
||||
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/shopspring/decimal v1.3.1 // indirect
|
||||
github.com/spf13/cast v1.5.1 // indirect
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||
golang.org/x/crypto v0.9.0 // indirect
|
||||
golang.org/x/net v0.10.0 // indirect
|
||||
golang.org/x/oauth2 v0.7.0 // indirect
|
||||
golang.org/x/sys v0.8.0 // indirect
|
||||
golang.org/x/term v0.8.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
golang.org/x/time v0.3.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // 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/api v0.27.3 // indirect
|
||||
k8s.io/apiextensions-apiserver v0.27.2 // indirect
|
||||
k8s.io/apimachinery v0.27.3 // indirect
|
||||
k8s.io/client-go v0.27.3 // indirect
|
||||
k8s.io/klog/v2 v2.100.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect
|
||||
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect
|
||||
sigs.k8s.io/controller-runtime v0.15.0 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
|
||||
)
|
||||
@@ -0,0 +1,323 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
|
||||
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
|
||||
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
|
||||
github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
|
||||
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
|
||||
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
|
||||
github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
|
||||
github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
||||
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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
|
||||
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
||||
github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE=
|
||||
github.com/emicklei/go-restful/v3 v3.10.2/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=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=
|
||||
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
|
||||
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
|
||||
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
|
||||
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
|
||||
github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
|
||||
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0=
|
||||
github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
||||
github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
|
||||
github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
||||
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||
github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM=
|
||||
github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
|
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
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/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
||||
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
||||
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
||||
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
|
||||
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
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.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
|
||||
github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU=
|
||||
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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
|
||||
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
|
||||
github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
|
||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
|
||||
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
|
||||
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
||||
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
|
||||
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
||||
golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/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.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
|
||||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
|
||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
helm.sh/helm/v3 v3.12.1 h1:lzU7etZX24A6BTMXYQF3bFq0ECfD8s+fKlNBBL8AbEc=
|
||||
helm.sh/helm/v3 v3.12.1/go.mod h1:qhmSY9kcX7yH1xebe+FDMZa7E5NAeZ+LvK5j1gSln48=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
k8s.io/api v0.27.3 h1:yR6oQXXnUEBWEWcvPWS0jQL575KoAboQPfJAuKNrw5Y=
|
||||
k8s.io/api v0.27.3/go.mod h1:C4BNvZnQOF7JA/0Xed2S+aUyJSfTGkGFxLXz9MnpIpg=
|
||||
k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo=
|
||||
k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ=
|
||||
k8s.io/apimachinery v0.27.3 h1:Ubye8oBufD04l9QnNtW05idcOe9Z3GQN8+7PqmuVcUM=
|
||||
k8s.io/apimachinery v0.27.3/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E=
|
||||
k8s.io/client-go v0.27.3 h1:7dnEGHZEJld3lYwxvLl7WoehK6lAq7GvgjxpA3nv1E8=
|
||||
k8s.io/client-go v0.27.3/go.mod h1:2MBEKuTo6V1lbKy3z1euEGnhPfGZLKTS9tiJ2xodM48=
|
||||
k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg=
|
||||
k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||
k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg=
|
||||
k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg=
|
||||
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk=
|
||||
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU=
|
||||
sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk=
|
||||
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/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
|
||||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
|
||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
|
||||
@@ -0,0 +1,115 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
tsloader "github.com/replicatedhq/troubleshoot/pkg/loader"
|
||||
"helm.sh/helm/v3/pkg/chart"
|
||||
"helm.sh/helm/v3/pkg/chart/loader"
|
||||
"helm.sh/helm/v3/pkg/chartutil"
|
||||
"helm.sh/helm/v3/pkg/engine"
|
||||
"sigs.k8s.io/yaml"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Load chart from tarball
|
||||
// The helm loader package has a few other ways to load a chart, such as from a directory `loader.LoadDir()`
|
||||
// or from an archive in memory `loader.LoadArchive()` etc.
|
||||
chart, err := loader.LoadFile("mychart-0.1.0.tgz")
|
||||
if err != nil {
|
||||
log.Fatalf("error loading at chart: %v", err)
|
||||
}
|
||||
|
||||
// Render chart to manifests. Equivalent to `helm template --values values.yaml`
|
||||
renderedManifests, err := renderChartToManifests(chart, chartutil.Values{
|
||||
"preflight": true,
|
||||
"includeTroubleshootCRs": true,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("error rendering chart: %v", err)
|
||||
}
|
||||
|
||||
fmt.Println("############# Raw helm manifests #############")
|
||||
fmt.Println(renderedManifests)
|
||||
|
||||
// Load rendered manifests into a slice of troubleshoot specs
|
||||
// 'tsKinds' will contain all the specs. This object will the the
|
||||
// input of other troubleshoot APIs such as ones used to collect
|
||||
// bundles, analyze bundles, redact etc.
|
||||
ctx := context.Background()
|
||||
tsKinds, err := tsloader.LoadSpecs(ctx, tsloader.LoadOptions{
|
||||
RawSpec: renderedManifests,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("error loading troubleshoot specs: %v", err)
|
||||
}
|
||||
|
||||
// Ensure we have the correct number of specs
|
||||
if len(tsKinds.PreflightsV1Beta2) != 1 {
|
||||
log.Fatalf("expected 1 preflight, got %d", len(tsKinds.PreflightsV1Beta2))
|
||||
}
|
||||
if len(tsKinds.SupportBundlesV1Beta2) != 1 {
|
||||
log.Fatalf("expected 1 supportbundle, got %d", len(tsKinds.SupportBundlesV1Beta2))
|
||||
}
|
||||
if len(tsKinds.RedactorsV1Beta2) != 1 {
|
||||
log.Fatalf("expected 1 redactor, got %d", len(tsKinds.RedactorsV1Beta2))
|
||||
}
|
||||
|
||||
// Print the specs as yaml
|
||||
fmt.Println("---\n############# Support bundle #############")
|
||||
printSpecAsYaml(tsKinds.SupportBundlesV1Beta2[0])
|
||||
fmt.Println("---\n############# Preflight #############")
|
||||
printSpecAsYaml(tsKinds.PreflightsV1Beta2[0])
|
||||
fmt.Println("---\n############# Redactor #############")
|
||||
printSpecAsYaml(tsKinds.RedactorsV1Beta2[0])
|
||||
}
|
||||
|
||||
func renderChartToManifests(chart *chart.Chart, inputValues chartutil.Values) (string, error) {
|
||||
options := chartutil.ReleaseOptions{
|
||||
Name: "my-release", // Not mandatory, but this is how helm sets the release name
|
||||
}
|
||||
|
||||
// Pull in imported values from dependencies to the parent chart
|
||||
// https://helm.sh/docs/topics/charts/#importing-child-values-via-dependencies
|
||||
if err := chartutil.ProcessDependencies(chart, chartutil.Values{}); err != nil {
|
||||
return "", fmt.Errorf("failed to process chart %q dependencies: %w", chart.Name(), err)
|
||||
}
|
||||
|
||||
// Gather all values necessary to render the templates
|
||||
// imported values, values from the chart and user provided values
|
||||
rValues, err := chartutil.ToRenderValues(chart, inputValues, options, nil)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to render template values: %w", err)
|
||||
}
|
||||
|
||||
// Render the chart templates. This will include non YAML files as well
|
||||
renderedTemplates, err := engine.Render(chart, rValues)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to render template: %w", err)
|
||||
}
|
||||
|
||||
// Combine all rendered templates into a single yaml multidoc string
|
||||
// Only pick up YAML files, ignore any others. Troubleshoot loader
|
||||
// expects only valid YAML input
|
||||
var out strings.Builder
|
||||
for k, v := range renderedTemplates {
|
||||
if strings.HasSuffix(k, ".yaml") || strings.HasSuffix(k, ".yml") {
|
||||
// Add the multidoc split marker
|
||||
out.WriteString(fmt.Sprintf("---\n# Source: %s\n%s\n", k, v))
|
||||
}
|
||||
}
|
||||
|
||||
return out.String(), nil
|
||||
}
|
||||
|
||||
func printSpecAsYaml(v any) {
|
||||
b, err := yaml.Marshal(v)
|
||||
if err != nil {
|
||||
log.Fatalf("error marshalling troubleshoot specs: %v", err)
|
||||
}
|
||||
|
||||
fmt.Println(string(b))
|
||||
}
|
||||
Binary file not shown.
@@ -11,7 +11,7 @@ require (
|
||||
github.com/fatih/color v1.15.0
|
||||
github.com/go-logr/logr v1.2.4
|
||||
github.com/go-redis/redis/v7 v7.4.1
|
||||
github.com/go-sql-driver/mysql v1.7.0
|
||||
github.com/go-sql-driver/mysql v1.7.1
|
||||
github.com/gobwas/glob v0.2.3
|
||||
github.com/godbus/dbus/v5 v5.1.0
|
||||
github.com/google/gofuzz v1.2.0
|
||||
@@ -19,48 +19,48 @@ require (
|
||||
github.com/gorilla/handlers v1.5.1
|
||||
github.com/hashicorp/go-getter v1.7.1
|
||||
github.com/hashicorp/go-multierror v1.1.1
|
||||
github.com/jackc/pgx/v5 v5.3.1
|
||||
github.com/jackc/pgx/v5 v5.4.1
|
||||
github.com/longhorn/go-iscsi-helper v0.0.0-20210330030558-49a327fb024e
|
||||
github.com/manifoldco/promptui v0.9.0
|
||||
github.com/mattn/go-isatty v0.0.18
|
||||
github.com/mattn/go-isatty v0.0.19
|
||||
github.com/mholt/archiver/v3 v3.5.1
|
||||
github.com/microsoft/go-mssqldb v0.21.0
|
||||
github.com/microsoft/go-mssqldb v1.3.0
|
||||
github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/replicatedhq/termui/v3 v3.1.1-0.20200811145416-f40076d26851
|
||||
github.com/segmentio/ksuid v1.0.4
|
||||
github.com/shirou/gopsutil/v3 v3.23.3
|
||||
github.com/sirupsen/logrus v1.9.0
|
||||
github.com/shirou/gopsutil/v3 v3.23.6
|
||||
github.com/spf13/cobra v1.7.0
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/spf13/viper v1.15.0
|
||||
github.com/stretchr/testify v1.8.2
|
||||
github.com/spf13/viper v1.16.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/tj/go-spin v1.1.0
|
||||
go.opentelemetry.io/otel v1.14.0
|
||||
go.opentelemetry.io/otel/sdk v1.14.0
|
||||
golang.org/x/sync v0.1.0
|
||||
go.opentelemetry.io/otel v1.16.0
|
||||
go.opentelemetry.io/otel/sdk v1.16.0
|
||||
golang.org/x/sync v0.3.0
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
k8s.io/api v0.27.0
|
||||
k8s.io/apiextensions-apiserver v0.27.0
|
||||
k8s.io/apimachinery v0.27.0
|
||||
k8s.io/apiserver v0.27.0
|
||||
k8s.io/cli-runtime v0.27.0
|
||||
k8s.io/client-go v0.27.0
|
||||
k8s.io/klog/v2 v2.90.1
|
||||
k8s.io/api v0.27.3
|
||||
k8s.io/apiextensions-apiserver v0.27.2
|
||||
k8s.io/apimachinery v0.27.3
|
||||
k8s.io/apiserver v0.27.3
|
||||
k8s.io/cli-runtime v0.27.3
|
||||
k8s.io/client-go v0.27.3
|
||||
k8s.io/klog/v2 v2.100.1
|
||||
oras.land/oras-go v1.2.3
|
||||
sigs.k8s.io/controller-runtime v0.14.6
|
||||
sigs.k8s.io/controller-runtime v0.15.0
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
||||
github.com/docker/distribution v2.8.1+incompatible // indirect
|
||||
github.com/docker/distribution v2.8.2+incompatible // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.10.2 // indirect
|
||||
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect
|
||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
||||
github.com/golang-sql/sqlexp v0.1.0 // indirect
|
||||
github.com/google/s2a-go v0.1.3 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
|
||||
@@ -68,15 +68,17 @@ require (
|
||||
github.com/mistifyio/go-zfs/v3 v3.0.0 // indirect
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/shoenig/go-m1cpu v0.1.4 // indirect
|
||||
github.com/shoenig/go-m1cpu v0.1.6 // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
github.com/sylabs/sif/v2 v2.11.1 // indirect
|
||||
github.com/tchap/go-patricia/v2 v2.3.1 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.14.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.16.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.16.0 // indirect
|
||||
go.uber.org/atomic v1.10.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect
|
||||
golang.org/x/mod v0.9.0 // indirect
|
||||
golang.org/x/tools v0.7.0 // indirect
|
||||
golang.org/x/mod v0.10.0 // indirect
|
||||
golang.org/x/tools v0.9.1 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
@@ -127,7 +129,7 @@ require (
|
||||
github.com/google/go-cmp v0.5.9 // indirect
|
||||
github.com/google/go-intervals v0.0.2 // indirect
|
||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.7.1 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.8.0 // indirect
|
||||
github.com/gorilla/mux v1.8.0 // indirect
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
@@ -151,7 +153,7 @@ require (
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
|
||||
github.com/mitchellh/go-wordwrap v1.0.1
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/moby/locker v1.0.1 // indirect
|
||||
github.com/moby/spdystream v0.2.0 // indirect
|
||||
@@ -169,17 +171,17 @@ require (
|
||||
github.com/opencontainers/runtime-spec v1.1.0-rc.1 // indirect
|
||||
github.com/opencontainers/selinux v1.11.0 // indirect
|
||||
github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/pierrec/lz4/v4 v4.1.2 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/prometheus/client_golang v1.14.0 // indirect
|
||||
github.com/prometheus/client_model v0.3.0 // indirect
|
||||
github.com/prometheus/client_golang v1.15.1 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.42.0 // indirect
|
||||
github.com/prometheus/procfs v0.9.0 // indirect
|
||||
github.com/rivo/uniseg v0.4.4 // indirect
|
||||
github.com/spf13/afero v1.9.3 // indirect
|
||||
github.com/spf13/cast v1.5.0 // indirect
|
||||
github.com/spf13/afero v1.9.5 // indirect
|
||||
github.com/spf13/cast v1.5.1 // indirect
|
||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||
github.com/subosito/gotenv v1.4.2 // indirect
|
||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect
|
||||
@@ -189,28 +191,29 @@ require (
|
||||
github.com/vbatts/tar-split v0.11.3 // indirect
|
||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
|
||||
github.com/xlab/treeprint v1.1.0 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
||||
golang.org/x/crypto v0.8.0 // indirect
|
||||
golang.org/x/net v0.9.0 // indirect
|
||||
golang.org/x/crypto v0.9.0 // indirect
|
||||
golang.org/x/net v0.10.0 // indirect
|
||||
golang.org/x/oauth2 v0.7.0 // indirect
|
||||
golang.org/x/sys v0.7.0 // indirect
|
||||
golang.org/x/term v0.7.0 // indirect
|
||||
golang.org/x/text v0.9.0
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/term v0.8.0 // indirect
|
||||
golang.org/x/text v0.11.0
|
||||
golang.org/x/time v0.3.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
|
||||
google.golang.org/api v0.114.0 // indirect
|
||||
google.golang.org/api v0.122.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
|
||||
google.golang.org/grpc v1.54.0 // indirect
|
||||
google.golang.org/grpc v1.55.0 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20230327201221-f5883ff37f0c // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect
|
||||
k8s.io/metrics v0.27.3
|
||||
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2
|
||||
periph.io/x/host/v3 v3.8.0
|
||||
periph.io/x/host/v3 v3.8.2
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||
sigs.k8s.io/kustomize/api v0.13.2 // indirect
|
||||
sigs.k8s.io/kustomize/kyaml v0.14.1 // indirect
|
||||
|
||||
@@ -192,13 +192,12 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
|
||||
github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg=
|
||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic=
|
||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
|
||||
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
@@ -296,8 +295,8 @@ github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/
|
||||
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
|
||||
github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM=
|
||||
github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
|
||||
github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
|
||||
github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v23.0.3+incompatible h1:9GhVsShNWz1hO//9BNg/dpMnZW25KydO4wtVxWAIbho=
|
||||
github.com/docker/docker v23.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A=
|
||||
@@ -339,7 +338,7 @@ github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBd
|
||||
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=
|
||||
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
||||
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
|
||||
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||
@@ -358,7 +357,7 @@ github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
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.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=
|
||||
github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo=
|
||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
|
||||
@@ -369,10 +368,10 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/
|
||||
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
||||
github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI=
|
||||
github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
||||
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
|
||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
|
||||
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
@@ -382,9 +381,10 @@ github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
|
||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
|
||||
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
@@ -476,9 +476,10 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE=
|
||||
github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
|
||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
@@ -497,8 +498,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.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A=
|
||||
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
|
||||
github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc=
|
||||
github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
|
||||
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
|
||||
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
|
||||
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
||||
@@ -523,6 +524,7 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9
|
||||
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-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
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/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
@@ -542,13 +544,13 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
|
||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU=
|
||||
github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8=
|
||||
github.com/jackc/pgx/v5 v5.4.1 h1:oKfB/FhuVtit1bBM3zNRRsZ925ZkMN3HXL+LgLUM9lE=
|
||||
github.com/jackc/pgx/v5 v5.4.1/go.mod h1:q6iHT8uDNXWiFNOlRqJzBTaSH3+2xCXkokxHZC5qWFY=
|
||||
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
|
||||
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
|
||||
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
|
||||
github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
|
||||
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
|
||||
github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
|
||||
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
|
||||
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
@@ -581,7 +583,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
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=
|
||||
@@ -605,8 +607,8 @@ github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxec
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98=
|
||||
github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
|
||||
@@ -618,8 +620,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||
github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo=
|
||||
github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
|
||||
github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8=
|
||||
github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4=
|
||||
github.com/microsoft/go-mssqldb v1.3.0 h1:JcPVl+acL8Z/cQcJc9zP0OkjQ+l20bco/cCDpMbmGJk=
|
||||
github.com/microsoft/go-mssqldb v1.3.0/go.mod h1:lmWsjHD8XX/Txr0f8ZqgbEZSC+BZjmEQy/Ms+rLrvho=
|
||||
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||
github.com/mistifyio/go-zfs/v3 v3.0.0 h1:J5QK618xRcXnQYZ2GE5FdmpS1ufIrWue+lR/mpe6/14=
|
||||
github.com/mistifyio/go-zfs/v3 v3.0.0/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k=
|
||||
@@ -628,8 +630,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk
|
||||
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
|
||||
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
|
||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
|
||||
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
|
||||
@@ -651,7 +653,7 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY
|
||||
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
|
||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
|
||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
|
||||
github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
||||
github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
||||
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
||||
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
|
||||
@@ -666,9 +668,9 @@ github.com/nwaples/rardecode v1.1.2/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
|
||||
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk=
|
||||
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
|
||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
|
||||
github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU=
|
||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||
github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||
@@ -684,14 +686,13 @@ github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaL
|
||||
github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
|
||||
github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f h1:/UDgs8FGMqwnHagNDPGOlts35QkhAZ8by3DR7nMih7M=
|
||||
github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
||||
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
|
||||
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
|
||||
github.com/pierrec/lz4/v4 v4.1.2 h1:qvY3YFXRQE/XB8MlLzJH7mSzBs74eA2gg52YTk6jUPM=
|
||||
github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ=
|
||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
@@ -705,13 +706,13 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
||||
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
|
||||
github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
|
||||
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
||||
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
||||
@@ -737,32 +738,33 @@ github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod
|
||||
github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c=
|
||||
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
|
||||
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
|
||||
github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE=
|
||||
github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU=
|
||||
github.com/shoenig/go-m1cpu v0.1.4 h1:SZPIgRM2sEF9NJy50mRHu9PKGwxyyTTJIWvCtgVbozs=
|
||||
github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
|
||||
github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c=
|
||||
github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/shirou/gopsutil/v3 v3.23.6 h1:5y46WPI9QBKBbK7EEccUPNXpJpNrvPuTD0O2zHEHT08=
|
||||
github.com/shirou/gopsutil/v3 v3.23.6/go.mod h1:j7QX50DrXYggrpN30W0Mo+I4/8U2UUIQrnrhqUeWrAU=
|
||||
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
|
||||
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
|
||||
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
|
||||
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk=
|
||||
github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
|
||||
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
|
||||
github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
|
||||
github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
|
||||
github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
|
||||
github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
|
||||
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
|
||||
github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
|
||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU=
|
||||
github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA=
|
||||
github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc=
|
||||
github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg=
|
||||
github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8=
|
||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
@@ -779,8 +781,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
|
||||
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
|
||||
github.com/sylabs/sif/v2 v2.11.1 h1:d09yPukVa8b74wuy+QTA4Is3w8MH0UjO/xlWQUuFzpY=
|
||||
@@ -819,8 +822,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
|
||||
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
||||
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI=
|
||||
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE=
|
||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY=
|
||||
@@ -834,12 +837,14 @@ 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/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
|
||||
go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
|
||||
go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
|
||||
go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM=
|
||||
go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
|
||||
go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
|
||||
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
|
||||
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
|
||||
go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo=
|
||||
go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
|
||||
go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE=
|
||||
go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4=
|
||||
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
|
||||
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
|
||||
@@ -854,15 +859,15 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
|
||||
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
|
||||
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=
|
||||
@@ -901,8 +906,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
|
||||
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
||||
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -933,7 +939,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
@@ -958,8 +963,11 @@ 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.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
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=
|
||||
@@ -1001,8 +1009,9 @@ 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.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -1074,7 +1083,6 @@ golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
@@ -1093,14 +1101,18 @@ golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
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.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
|
||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
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=
|
||||
@@ -1110,9 +1122,13 @@ 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.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
|
||||
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
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=
|
||||
@@ -1173,8 +1189,9 @@ 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.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
|
||||
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
|
||||
golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
|
||||
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=
|
||||
@@ -1184,7 +1201,7 @@ golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNq
|
||||
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
|
||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||
gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=
|
||||
gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
@@ -1233,8 +1250,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.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE=
|
||||
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
|
||||
google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es=
|
||||
google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
|
||||
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=
|
||||
@@ -1384,8 +1401,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.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag=
|
||||
google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
|
||||
google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
|
||||
google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
|
||||
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=
|
||||
@@ -1419,8 +1436,6 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
|
||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
|
||||
gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
@@ -1433,7 +1448,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
@@ -1446,33 +1460,35 @@ 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.27.0 h1:2owttiA8Oa+J3idFeq8TSnNpm4y6AOGPI3PDbIpp2cE=
|
||||
k8s.io/api v0.27.0/go.mod h1:Wl+QRvQlh+T8SK5f4F6YBhhyH6hrFO08nl74xZb1MUE=
|
||||
k8s.io/apiextensions-apiserver v0.27.0 h1:3ABZ6JFa5WIcjxUfSCTHsiYKFh2I9JJK2FI/CpGkZx4=
|
||||
k8s.io/apiextensions-apiserver v0.27.0/go.mod h1:4FCgGCfQ7JGoDo7fQVwtAGER4rlm9ZD0XUoYZhNJ0BE=
|
||||
k8s.io/apimachinery v0.27.0 h1:vEyy/PVMbPMCPutrssCVHCf0JNZ0Px+YqPi82K2ALlk=
|
||||
k8s.io/apimachinery v0.27.0/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM=
|
||||
k8s.io/apiserver v0.27.0 h1:sXt/2yVMebZef6GqJHs4IYHSdSYwwrJCafBV/KSCwDw=
|
||||
k8s.io/apiserver v0.27.0/go.mod h1:8heEJ5f6EqiKwXC3Ez3ikgOvGtRSEQG/SQZkhO9UzIg=
|
||||
k8s.io/cli-runtime v0.27.0 h1:kYVGqjmBbaj22nJ7je/3tigjiSlB04kVbjW+51zivu8=
|
||||
k8s.io/cli-runtime v0.27.0/go.mod h1:kN+Q+5L37DFCdpNuCLTHO7w+dwlJb0xzn8jveB3bPSw=
|
||||
k8s.io/client-go v0.27.0 h1:DyZS1fJkv73tEy7rWv4VF6NwGeJ7SKvNaLRXZBYLA+4=
|
||||
k8s.io/client-go v0.27.0/go.mod h1:XVEmpNnM+4JYO3EENoFV/ZDv3KxKVJUnzGo70avk+C4=
|
||||
k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
|
||||
k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||
k8s.io/kube-openapi v0.0.0-20230327201221-f5883ff37f0c h1:EFfsozyzZ/pggw5qNx7ftTVZdp7WZl+3ih89GEjYEK8=
|
||||
k8s.io/kube-openapi v0.0.0-20230327201221-f5883ff37f0c/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg=
|
||||
k8s.io/api v0.27.3 h1:yR6oQXXnUEBWEWcvPWS0jQL575KoAboQPfJAuKNrw5Y=
|
||||
k8s.io/api v0.27.3/go.mod h1:C4BNvZnQOF7JA/0Xed2S+aUyJSfTGkGFxLXz9MnpIpg=
|
||||
k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo=
|
||||
k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ=
|
||||
k8s.io/apimachinery v0.27.3 h1:Ubye8oBufD04l9QnNtW05idcOe9Z3GQN8+7PqmuVcUM=
|
||||
k8s.io/apimachinery v0.27.3/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E=
|
||||
k8s.io/apiserver v0.27.3 h1:AxLvq9JYtveYWK+D/Dz/uoPCfz8JC9asR5z7+I/bbQ4=
|
||||
k8s.io/apiserver v0.27.3/go.mod h1:Y61+EaBMVWUBJtxD5//cZ48cHZbQD+yIyV/4iEBhhNA=
|
||||
k8s.io/cli-runtime v0.27.3 h1:h592I+2eJfXj/4jVYM+tu9Rv8FEc/dyCoD80UJlMW2Y=
|
||||
k8s.io/cli-runtime v0.27.3/go.mod h1:LzXud3vFFuDFXn2LIrWnscPgUiEj7gQQcYZE2UPn9Kw=
|
||||
k8s.io/client-go v0.27.3 h1:7dnEGHZEJld3lYwxvLl7WoehK6lAq7GvgjxpA3nv1E8=
|
||||
k8s.io/client-go v0.27.3/go.mod h1:2MBEKuTo6V1lbKy3z1euEGnhPfGZLKTS9tiJ2xodM48=
|
||||
k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg=
|
||||
k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||
k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg=
|
||||
k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg=
|
||||
k8s.io/metrics v0.27.3 h1:pBVKgQjfui8xzfTidIxiOmLHwcCk3KbeuWowo/Oh0t0=
|
||||
k8s.io/metrics v0.27.3/go.mod h1:pXj63OTdOjpYgSc95p+88fB3t4krLybM7MOeqIksI6o=
|
||||
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk=
|
||||
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
oras.land/oras-go v1.2.3 h1:v8PJl+gEAntI1pJ/LCrDgsuk+1PKVavVEPsYIHFE5uY=
|
||||
oras.land/oras-go v1.2.3/go.mod h1:M/uaPdYklze0Vf3AakfarnpoEckvw0ESbRdN8Z1vdJg=
|
||||
periph.io/x/host/v3 v3.8.0 h1:T5ojZ2wvnZHGPS4h95N2ZpcCyHnsvH3YRZ1UUUiv5CQ=
|
||||
periph.io/x/host/v3 v3.8.0/go.mod h1:rzOLH+2g9bhc6pWZrkCrmytD4igwQ2vxFw6Wn6ZOlLY=
|
||||
periph.io/x/host/v3 v3.8.2 h1:ayKUDzgUCN0g8+/xM9GTkWaOBhSLVcVHGTfjAOi8OsQ=
|
||||
periph.io/x/host/v3 v3.8.2/go.mod h1:yFL76AesNHR68PboofSWYaQTKmvPXsQH2Apvp/ls/K4=
|
||||
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/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA=
|
||||
sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0=
|
||||
sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU=
|
||||
sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/kustomize/api v0.13.2 h1:kejWfLeJhUsTGioDoFNJET5LQe/ajzXhJGYoU+pJsiA=
|
||||
|
||||
@@ -40,3 +40,15 @@ func AppName(name string) string {
|
||||
|
||||
return strings.Join(casedWords, " ")
|
||||
}
|
||||
|
||||
func SplitYAML(doc string) []string {
|
||||
return strings.Split(doc, "\n---\n")
|
||||
}
|
||||
|
||||
func EstimateNumberOfLines(text string) int {
|
||||
n := strings.Count(text, "\n")
|
||||
if len(text) > 0 && !strings.HasSuffix(text, "\n") {
|
||||
n++
|
||||
}
|
||||
return n
|
||||
}
|
||||
@@ -79,7 +79,7 @@ func HostAnalyze(
|
||||
return nil
|
||||
}
|
||||
|
||||
result, err := analyzer.Analyze(getFile)
|
||||
result, err := analyzer.Analyze(getFile, findFiles)
|
||||
if err != nil {
|
||||
return NewAnalyzeResultError(analyzer, errors.Wrap(err, "analyze"))
|
||||
}
|
||||
@@ -232,6 +232,8 @@ func getAnalyzer(analyzer *troubleshootv1beta2.Analyze) Analyzer {
|
||||
return &AnalyzeSysctl{analyzer: analyzer.Sysctl}
|
||||
case analyzer.ClusterResource != nil:
|
||||
return &AnalyzeClusterResource{analyzer: analyzer.ClusterResource}
|
||||
case analyzer.Certificates != nil:
|
||||
return &AnalyzeCertificates{analyzer: analyzer.Certificates}
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/collect"
|
||||
)
|
||||
|
||||
type AnalyzeCertificates struct {
|
||||
analyzer *troubleshootv1beta2.CertificatesAnalyze
|
||||
}
|
||||
|
||||
func (a *AnalyzeCertificates) Title() string {
|
||||
title := a.analyzer.CheckName
|
||||
if title == "" {
|
||||
return "Certificates Verification"
|
||||
}
|
||||
|
||||
return title
|
||||
}
|
||||
|
||||
func (a *AnalyzeCertificates) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.analyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeCertificates) Analyze(getFile getCollectedFileContents, findFiles getChildCollectedFileContents) ([]*AnalyzeResult, error) {
|
||||
result, err := a.AnalyzeCertificates(a.analyzer, getFile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (a *AnalyzeCertificates) AnalyzeCertificates(analyzer *troubleshootv1beta2.CertificatesAnalyze, getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
certificatesInfo, err := getCollectedFileContents("certificates/certificates.json")
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to get contents of certificates.json")
|
||||
}
|
||||
|
||||
collectorCertificates := []collect.CertCollection{}
|
||||
if err := json.Unmarshal(certificatesInfo, &collectorCertificates); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse certificates.json")
|
||||
}
|
||||
|
||||
return a.analyzeAnalyzeCertificatesResult(collectorCertificates, analyzer.Outcomes)
|
||||
}
|
||||
|
||||
func (a *AnalyzeCertificates) analyzeAnalyzeCertificatesResult(certificates []collect.CertCollection, outcomes []*troubleshootv1beta2.Outcome) ([]*AnalyzeResult, error) {
|
||||
var results []*AnalyzeResult
|
||||
|
||||
for _, cert := range certificates {
|
||||
var passResults []*AnalyzeResult
|
||||
for _, certChain := range cert.CertificateChain {
|
||||
|
||||
when := ""
|
||||
message := ""
|
||||
source := ""
|
||||
|
||||
if cert.Source.ConfigMapName != "" {
|
||||
source = fmt.Sprintf("obtained from %s configmap within %s namespace", cert.Source.ConfigMapName, cert.Source.Namespace)
|
||||
}
|
||||
|
||||
if cert.Source.SecretName != "" {
|
||||
source = fmt.Sprintf("obtained from %s secret within %s namespace", cert.Source.SecretName, cert.Source.Namespace)
|
||||
}
|
||||
|
||||
for _, outcome := range outcomes {
|
||||
result := AnalyzeResult{
|
||||
Title: a.Title(),
|
||||
}
|
||||
|
||||
if outcome.Fail != nil {
|
||||
result.IsFail = true
|
||||
when = outcome.Fail.When
|
||||
message = outcome.Fail.Message
|
||||
} else if outcome.Warn != nil {
|
||||
result.IsWarn = true
|
||||
when = outcome.Warn.When
|
||||
message = outcome.Warn.Message
|
||||
} else if outcome.Pass != nil {
|
||||
result.IsPass = true
|
||||
when = outcome.Pass.When
|
||||
message = outcome.Pass.Message
|
||||
} else {
|
||||
return nil, errors.New("empty outcome")
|
||||
}
|
||||
|
||||
if result.IsPass && certChain.IsValid {
|
||||
result.Message = fmt.Sprintf("%s %s, %s", certChain.CertName, message, source)
|
||||
// if the certificate is valid, we need to wait for the warning check whether the certificate is going to expire
|
||||
passResults = append(passResults, &result)
|
||||
}
|
||||
|
||||
if result.IsFail && !certChain.IsValid {
|
||||
result.Message = fmt.Sprintf("%s %s, %s", certChain.CertName, message, source)
|
||||
// return the result immediately if the certificate is invalid
|
||||
results = append(results, &result)
|
||||
}
|
||||
|
||||
if result.IsWarn && certChain.IsValid {
|
||||
warnDate, _ := regexp.Compile(`notAfter \< Today \+ (\d+) days`)
|
||||
warnMatch := warnDate.FindStringSubmatch(when)
|
||||
if warnMatch != nil {
|
||||
warnMatchDays, err := strconv.Atoi(warnMatch[1])
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to convert string to integer")
|
||||
}
|
||||
|
||||
targetTime := time.Now().AddDate(0, 0, warnMatchDays)
|
||||
|
||||
if targetTime.After(certChain.NotAfter) {
|
||||
result.Message = fmt.Sprintf("%s %s in %d days, %s", certChain.CertName, message, warnMatchDays, source)
|
||||
// discard passResults if the certificate is going to expire in certain days
|
||||
passResults = []*AnalyzeResult{}
|
||||
results = append(results, &result)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// append passResults if the certificate is valid and not going to expire in certain days
|
||||
results = append(results, passResults...)
|
||||
}
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_certificates(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
analyzer troubleshootv1beta2.CertificatesAnalyze
|
||||
expectResult []*AnalyzeResult
|
||||
getFile getFile
|
||||
filePath, file string
|
||||
}{
|
||||
{
|
||||
name: "pass case",
|
||||
analyzer: troubleshootv1beta2.CertificatesAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "certificate is valid",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "Certificates Verification",
|
||||
Message: "ca.crt certificate is valid, obtained from kube-root-ca.crt configmap within kurl namespace",
|
||||
},
|
||||
},
|
||||
filePath: "certificates/certificates.json",
|
||||
file: `[{
|
||||
"source": {
|
||||
"configMap": "kube-root-ca.crt",
|
||||
"namespace": "kurl"
|
||||
},
|
||||
"certificateChain": [
|
||||
{
|
||||
"certificate": "ca.crt",
|
||||
"subject": "CN=kubernetes",
|
||||
"subjectAlternativeNames": [
|
||||
"kubernetes"
|
||||
],
|
||||
"issuer": "CN=kubernetes",
|
||||
"notAfter": "2033-04-16T00:30:20Z",
|
||||
"notBefore": "2023-04-19T00:30:20Z",
|
||||
"isValid": true,
|
||||
"isCA": true
|
||||
}
|
||||
]
|
||||
}]`,
|
||||
},
|
||||
{
|
||||
name: "failed case",
|
||||
analyzer: troubleshootv1beta2.CertificatesAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "notAfter < Today",
|
||||
Message: "certificate has expired",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: false,
|
||||
IsFail: true,
|
||||
Title: "Certificates Verification",
|
||||
Message: "ca.crt certificate has expired, obtained from kube-root-ca.crt configmap within kurl namespace",
|
||||
},
|
||||
},
|
||||
filePath: "certificates/certificates.json",
|
||||
file: `[{
|
||||
"source": {
|
||||
"configMap": "kube-root-ca.crt",
|
||||
"namespace": "kurl"
|
||||
},
|
||||
"certificateChain": [
|
||||
{
|
||||
"certificate": "ca.crt",
|
||||
"subject": "CN=kubernetes",
|
||||
"subjectAlternativeNames": [
|
||||
"kubernetes"
|
||||
],
|
||||
"issuer": "CN=kubernetes",
|
||||
"notAfter": "2023-04-16T00:30:20Z",
|
||||
"notBefore": "2021-04-19T00:30:20Z",
|
||||
"isValid": false,
|
||||
"isCA": true
|
||||
}
|
||||
]
|
||||
}]`,
|
||||
},
|
||||
{
|
||||
name: "warning case",
|
||||
analyzer: troubleshootv1beta2.CertificatesAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "notAfter < Today + 15 days",
|
||||
Message: "certificate is about to expire",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "Certificates Verification",
|
||||
Message: "ca.crt certificate is about to expire in 15 days, obtained from kube-root-ca.crt configmap within kurl namespace",
|
||||
},
|
||||
},
|
||||
filePath: "certificates/certificates.json",
|
||||
file: fmt.Sprintf(`[{
|
||||
"source": {
|
||||
"configMap": "kube-root-ca.crt",
|
||||
"namespace": "kurl"
|
||||
},
|
||||
"certificateChain": [
|
||||
{
|
||||
"certificate": "ca.crt",
|
||||
"subject": "CN=kubernetes",
|
||||
"subjectAlternativeNames": [
|
||||
"kubernetes"
|
||||
],
|
||||
"issuer": "CN=kubernetes",
|
||||
"notAfter": "%s",
|
||||
"notBefore": "2021-04-16T00:30:20Z",
|
||||
"isValid": true,
|
||||
"isCA": true
|
||||
}
|
||||
]
|
||||
}]`, time.Now().AddDate(0, 0, 5).Format("2006-01-02T15:04:05Z")),
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
req := require.New(t)
|
||||
if test.getFile == nil {
|
||||
test.getFile = func(n string) ([]byte, error) {
|
||||
assert.Equal(t, n, test.filePath)
|
||||
return []byte(test.file), nil
|
||||
}
|
||||
}
|
||||
|
||||
a := AnalyzeCertificates{
|
||||
analyzer: &test.analyzer,
|
||||
}
|
||||
|
||||
actual, err := a.AnalyzeCertificates(&test.analyzer, test.getFile)
|
||||
t.Log(actual)
|
||||
req.NoError(err)
|
||||
|
||||
assert.Equal(t, test.expectResult, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package analyzer
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"text/template"
|
||||
@@ -32,7 +33,8 @@ func (a *AnalyzeClusterPodStatuses) IsExcluded() (bool, error) {
|
||||
}
|
||||
|
||||
func (a *AnalyzeClusterPodStatuses) Analyze(getFile getCollectedFileContents, findFiles getChildCollectedFileContents) ([]*AnalyzeResult, error) {
|
||||
results, err := clusterPodStatuses(a.analyzer, findFiles)
|
||||
// findFiles is used to get the pod status and events files
|
||||
results, err := clusterPodStatuses(a.analyzer, findFiles, findFiles)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -42,7 +44,7 @@ func (a *AnalyzeClusterPodStatuses) Analyze(getFile getCollectedFileContents, fi
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func clusterPodStatuses(analyzer *troubleshootv1beta2.ClusterPodStatuses, getChildCollectedFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) {
|
||||
func clusterPodStatuses(analyzer *troubleshootv1beta2.ClusterPodStatuses, getChildCollectedFileContents getChildCollectedFileContents, getChildCollectedFileContentsEvents getChildCollectedFileContents) ([]*AnalyzeResult, error) {
|
||||
excludeFiles := []string{}
|
||||
collected, err := getChildCollectedFileContents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS, "*.json"), excludeFiles)
|
||||
if err != nil {
|
||||
@@ -77,7 +79,38 @@ func clusterPodStatuses(analyzer *troubleshootv1beta2.ClusterPodStatuses, getChi
|
||||
|
||||
for _, pod := range pods {
|
||||
if pod.Status.Reason == "" {
|
||||
pod.Status.Reason = k8sutil.GetPodStatusReason(&pod)
|
||||
// get pod status reason and message from the pod
|
||||
pod.Status.Reason, pod.Status.Message = k8sutil.GetPodStatusReason(&pod)
|
||||
}
|
||||
|
||||
// if the pod has no last termination message like pending or container creating, then check the pod events and get the warning messages. Errors will be logged and return empty message.
|
||||
if pod.Status.Message == "" {
|
||||
messages := []string{}
|
||||
collectedEvents, err := getChildCollectedFileContentsEvents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, "events", fmt.Sprintf("%s.json", pod.Namespace)), excludeFiles)
|
||||
if err != nil {
|
||||
klog.V(2).Infof("failed to read collected events for namespace %s: %v", pod.Namespace, err)
|
||||
}
|
||||
|
||||
for _, fileContent := range collectedEvents {
|
||||
var nsEvents []corev1.Event
|
||||
if err := json.Unmarshal(fileContent, &nsEvents); err != nil {
|
||||
// try new format
|
||||
var nsEventsList corev1.EventList
|
||||
if err := json.Unmarshal(fileContent, &nsEventsList); err != nil {
|
||||
klog.V(2).Infof("failed to unmarshal events for namespace %s: %v", pod.Namespace, err)
|
||||
}
|
||||
nsEvents = nsEventsList.Items
|
||||
}
|
||||
|
||||
for _, event := range nsEvents {
|
||||
if event.InvolvedObject.Kind == "Pod" && event.InvolvedObject.Name == pod.Name && event.InvolvedObject.Namespace == pod.Namespace {
|
||||
if event.Type == "Warning" && event.Message != "" {
|
||||
messages = append(messages, event.Message)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
pod.Status.Message = strings.Join(messages, ". ")
|
||||
}
|
||||
|
||||
for _, outcome := range analyzer.Outcomes {
|
||||
@@ -149,7 +182,12 @@ func clusterPodStatuses(analyzer *troubleshootv1beta2.ClusterPodStatuses, getChi
|
||||
}
|
||||
|
||||
if r.Message == "" {
|
||||
r.Message = "Pod {{ .Namespace }}/{{ .Name }} status is {{ .Status.Reason }}"
|
||||
r.Message = "Pod {{ .Namespace }}/{{ .Name }} status is {{ .Status.Reason }}. Message is: {{ .Status.Message }}"
|
||||
}
|
||||
|
||||
// if the pod has no status message, set it to None
|
||||
if pod.Status.Message == "" {
|
||||
pod.Status.Message = "None"
|
||||
}
|
||||
|
||||
tmpl := template.New("pod")
|
||||
@@ -176,7 +214,7 @@ func clusterPodStatuses(analyzer *troubleshootv1beta2.ClusterPodStatuses, getChi
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to execute template")
|
||||
}
|
||||
r.Message = m.String()
|
||||
r.Message = strings.TrimSpace(m.String())
|
||||
|
||||
// add to results, break and check the next pod
|
||||
allResults = append(allResults, &r)
|
||||
|
||||
@@ -15,6 +15,7 @@ func Test_ClusterPodStatuses(t *testing.T) {
|
||||
analyzer troubleshootv1beta2.ClusterPodStatuses
|
||||
expectResult []*AnalyzeResult
|
||||
files map[string][]byte
|
||||
eventFiles map[string][]byte
|
||||
}{
|
||||
{
|
||||
name: "pass_when_all_pods_are_healthy_in_specific_namespace",
|
||||
@@ -374,6 +375,295 @@ func Test_ClusterPodStatuses(t *testing.T) {
|
||||
"cluster-resources/pods/other-unhealthy.json": []byte(otherPodsUnhealthy),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_message_of_pending_pods_with_wrong_node_affinity",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_message_of_pending_pods_with_wrong_node_affinity",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-pending-node-affinity"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_message_of_pending_pods_with_wrong_node_affinity",
|
||||
Message: "A Pod, kotsadm-b6cb54c8f-zgzrn, is unhealthy with a status of: Pending. Message is: 0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-pending-node-affinity",
|
||||
Name: "kotsadm-b6cb54c8f-zgzrn",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-pending-node-affinity.json": []byte(messagePendingNodeAffinity),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_message_of_container_creating_pod_with_failed_mount",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_message_of_container_creating_pod_with_failed_mount",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-container-creating-failed-mount"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_message_of_container_creating_pod_with_failed_mount",
|
||||
Message: "A Pod, troubleshoot-copyfromhost-4m79m-psdjm, is unhealthy with a status of: ContainerCreating. Message is: MountVolume.SetUp failed for volume \"host\" : hostPath type check failed: /var/lib/collectd is not a directory. Unable to attach or mount volumes: unmounted volumes=[host], unattached volumes=[host kube-api-access-xddvj]: timed out waiting for the condition",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-container-creating-failed-mount",
|
||||
Name: "troubleshoot-copyfromhost-4m79m-psdjm",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-container-creating-failed-mount.json": []byte(messageContainerCreatingFailedMount),
|
||||
},
|
||||
eventFiles: map[string][]byte{
|
||||
"cluster-resources/events/message-container-creating-failed-mount.json": []byte(messageContainerCreatingFailedMountEvents),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_message_of_pod_crashloop_backoff",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_message_of_pod_crashloop_backoff",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-pod-crashloop-backoff"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_message_of_pod_crashloop_backoff",
|
||||
Message: "A Pod, init-demo, is unhealthy with a status of: CrashLoopBackOff. Message is: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \"wge\": executable file not found in $PATH: unknown",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-pod-crashloop-backoff",
|
||||
Name: "init-demo",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-pod-crashloop-backoff.json": []byte(messagePodCrashLoopBackOff),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_message_of_init_pod_crashloop_backoff",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_message_of_init_pod_crashloop_backoff",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-pod-init-crashloop-backoff"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_message_of_init_pod_crashloop_backoff",
|
||||
Message: "A Pod, init-demo2, is unhealthy with a status of: Init:RunContainerError. Message is: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \"wge\": executable file not found in $PATH: unknown",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-pod-init-crashloop-backoff",
|
||||
Name: "init-demo2",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-pod-init-crashloop-backoff.json": []byte(messagePodInitCrashLoopBackOff),
|
||||
},
|
||||
eventFiles: map[string][]byte{
|
||||
"cluster-resources/events/message-pod-init-crashloop-backoff.json": []byte(messagePodInitCrashLoopBackOffEvents),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_message_of_pending_pod_resource",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_message_of_pending_pod_resource",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-pending-pod-resources"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_message_of_pending_pod_resource",
|
||||
Message: "A Pod, pending-pod-resources-5fddcf7688-djjfc, is unhealthy with a status of: Pending. Message is: 0/1 nodes are available: 1 Insufficient nvidia.com/gpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-pending-pod-resources",
|
||||
Name: "pending-pod-resources-5fddcf7688-djjfc",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-pending-pod-resources.json": []byte(messagePendingPodResources),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_message_of_oom_killed_pod",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_message_of_oom_killed_pod",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-oomkill-pod"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_message_of_oom_killed_pod",
|
||||
Message: "A Pod, oom-kill-job3-gbb89, is unhealthy with a status of: OOMKilled. Message is: ExitCode:137",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-oomkill-pod",
|
||||
Name: "oom-kill-job3-gbb89",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-oomkill-pod.json": []byte(messageOOMKillPod),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_message_of_image_pull_fail",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_message_of_image_pull_fail",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-image-pull-fail"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_message_of_image_pull_fail",
|
||||
Message: "A Pod, no-image-deployment-849c4c4958-rxqmt, is unhealthy with a status of: ErrImagePull. Message is: Failed to pull image \"noimage.com/no-such-image\": rpc error: code = Unknown desc = Error response from daemon: Get \"https://noimage.com/v2/\": x509: certificate is not valid for any names, but wanted to match noimage.com. Error: ErrImagePull. Error: ImagePullBackOff",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-image-pull-fail",
|
||||
Name: "no-image-deployment-849c4c4958-rxqmt",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-image-pull-fail.json": []byte(messageImagePullFail),
|
||||
},
|
||||
eventFiles: map[string][]byte{
|
||||
"cluster-resources/events/message-image-pull-fail.json": []byte(messageImagePullFailEvents),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "show_none_message_of_no_events_pod",
|
||||
analyzer: troubleshootv1beta2.ClusterPodStatuses{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "show_none_message_of_no_events_pod",
|
||||
},
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "!= Healthy",
|
||||
Message: "A Pod, {{ .Name }}, is unhealthy with a status of: {{ .Status.Reason }}. Message is: {{ .Status.Message }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
Namespaces: []string{"message-image-pull-fail"},
|
||||
},
|
||||
expectResult: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "show_none_message_of_no_events_pod",
|
||||
Message: "A Pod, no-image-deployment-849c4c4958-rxqmt, is unhealthy with a status of: ErrImagePull. Message is: None",
|
||||
InvolvedObject: &corev1.ObjectReference{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
Namespace: "message-image-pull-fail",
|
||||
Name: "no-image-deployment-849c4c4958-rxqmt",
|
||||
},
|
||||
},
|
||||
},
|
||||
files: map[string][]byte{
|
||||
"cluster-resources/pods/message-image-pull-fail.json": []byte(messageImagePullFail),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
@@ -387,7 +677,14 @@ func Test_ClusterPodStatuses(t *testing.T) {
|
||||
return test.files, nil
|
||||
}
|
||||
|
||||
actual, err := clusterPodStatuses(&test.analyzer, getFiles)
|
||||
getEventFiles := func(n string, _ []string) (map[string][]byte, error) {
|
||||
if file, ok := test.eventFiles[n]; ok {
|
||||
return map[string][]byte{n: file}, nil
|
||||
}
|
||||
return test.files, nil
|
||||
}
|
||||
|
||||
actual, err := clusterPodStatuses(&test.analyzer, getFiles, getEventFiles)
|
||||
req.NoError(err)
|
||||
req.Equal(len(test.expectResult), len(actual))
|
||||
for _, a := range actual {
|
||||
|
||||
@@ -47,7 +47,7 @@ func commonStatus(outcomes []*troubleshootv1beta2.Outcome, name string, iconKey
|
||||
}
|
||||
}
|
||||
|
||||
match, err := compareActualToWhen(outcome.Fail.When, readyReplicas, exists)
|
||||
match, err := compareActualToWhen(outcome.Fail.When, readyReplicas)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse fail range")
|
||||
}
|
||||
@@ -87,7 +87,7 @@ func commonStatus(outcomes []*troubleshootv1beta2.Outcome, name string, iconKey
|
||||
}
|
||||
}
|
||||
|
||||
match, err := compareActualToWhen(outcome.Warn.When, readyReplicas, exists)
|
||||
match, err := compareActualToWhen(outcome.Warn.When, readyReplicas)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse warn range")
|
||||
}
|
||||
@@ -127,7 +127,7 @@ func commonStatus(outcomes []*troubleshootv1beta2.Outcome, name string, iconKey
|
||||
}
|
||||
}
|
||||
|
||||
match, err := compareActualToWhen(outcome.Pass.When, readyReplicas, exists)
|
||||
match, err := compareActualToWhen(outcome.Pass.When, readyReplicas)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse pass range")
|
||||
}
|
||||
@@ -145,9 +145,8 @@ func commonStatus(outcomes []*troubleshootv1beta2.Outcome, name string, iconKey
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func compareActualToWhen(when string, actual int, exists bool) (bool, error) {
|
||||
func compareActualToWhen(when string, actual int) (bool, error) {
|
||||
parts := strings.Split(strings.TrimSpace(when), " ")
|
||||
|
||||
// we can make this a lot more flexible
|
||||
if len(parts) != 2 {
|
||||
return false, errors.New("unable to parse when range")
|
||||
|
||||
@@ -45,3 +45,33 @@ var defaultPodsUnhealthy string
|
||||
|
||||
//go:embed files/pods/other-unhealthy.json
|
||||
var otherPodsUnhealthy string
|
||||
|
||||
//go:embed files/pods/message-pending-node-affinity.json
|
||||
var messagePendingNodeAffinity string
|
||||
|
||||
//go:embed files/pods/message-container-creating-failed-mount.json
|
||||
var messageContainerCreatingFailedMount string
|
||||
|
||||
//go:embed files/events/message-container-creating-failed-mount.json
|
||||
var messageContainerCreatingFailedMountEvents string
|
||||
|
||||
//go:embed files/pods/message-pod-crashloop-backoff.json
|
||||
var messagePodCrashLoopBackOff string
|
||||
|
||||
//go:embed files/pods/message-pod-init-crashloop-backoff.json
|
||||
var messagePodInitCrashLoopBackOff string
|
||||
|
||||
//go:embed files/events/message-pod-init-crashloop-backoff.json
|
||||
var messagePodInitCrashLoopBackOffEvents string
|
||||
|
||||
//go:embed files/pods/message-pending-pod-resources.json
|
||||
var messagePendingPodResources string
|
||||
|
||||
//go:embed files/pods/message-oomkill-pod.json
|
||||
var messageOOMKillPod string
|
||||
|
||||
//go:embed files/pods/message-image-pull-fail.json
|
||||
var messageImagePullFail string
|
||||
|
||||
//go:embed files/events/message-image-pull-fail.json
|
||||
var messageImagePullFailEvents string
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,913 @@
|
||||
{
|
||||
"kind": "EventList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "986840"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt.1770b96096f009dd",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "3b134296-43f6-4228-9c98-aeb622fb0a9a",
|
||||
"resourceVersion": "986732",
|
||||
"creationTimestamp": "2023-07-11T05:34:44Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-scheduler",
|
||||
"operation": "Update",
|
||||
"apiVersion": "events.k8s.io/v1",
|
||||
"time": "2023-07-11T05:34:44Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:action": {},
|
||||
"f:eventTime": {},
|
||||
"f:note": {},
|
||||
"f:reason": {},
|
||||
"f:regarding": {},
|
||||
"f:reportingController": {},
|
||||
"f:reportingInstance": {},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt",
|
||||
"uid": "209076ce-26d6-4836-981b-8c05cb0081eb",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "986727"
|
||||
},
|
||||
"reason": "Scheduled",
|
||||
"message": "Successfully assigned default/no-image-deployment-849c4c4958-rxqmt to minikube",
|
||||
"source": {},
|
||||
"firstTimestamp": null,
|
||||
"lastTimestamp": null,
|
||||
"type": "Normal",
|
||||
"eventTime": "2023-07-11T05:34:44.764227Z",
|
||||
"action": "Binding",
|
||||
"reportingComponent": "default-scheduler",
|
||||
"reportingInstance": "default-scheduler-minikube"
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt.1770b960b6f1e0ea",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "e5ea1f55-0d14-4443-8f79-d5b6ef692f61",
|
||||
"resourceVersion": "986820",
|
||||
"creationTimestamp": "2023-07-11T05:34:45Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:36:11Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt",
|
||||
"uid": "209076ce-26d6-4836-981b-8c05cb0081eb",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "986730",
|
||||
"fieldPath": "spec.containers{demo-deployment-container}"
|
||||
},
|
||||
"reason": "Pulling",
|
||||
"message": "Pulling image \"noimage.com/no-such-image\"",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T05:34:45Z",
|
||||
"lastTimestamp": "2023-07-11T05:36:11Z",
|
||||
"count": 4,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt.1770b960f12b4918",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "4ed0acd0-b3a2-477c-bb33-0e14512f5dd8",
|
||||
"resourceVersion": "986821",
|
||||
"creationTimestamp": "2023-07-11T05:34:46Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:36:12Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt",
|
||||
"uid": "209076ce-26d6-4836-981b-8c05cb0081eb",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "986730",
|
||||
"fieldPath": "spec.containers{demo-deployment-container}"
|
||||
},
|
||||
"reason": "Failed",
|
||||
"message": "Failed to pull image \"noimage.com/no-such-image\": rpc error: code = Unknown desc = Error response from daemon: Get \"https://noimage.com/v2/\": x509: certificate is not valid for any names, but wanted to match noimage.com",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T05:34:46Z",
|
||||
"lastTimestamp": "2023-07-11T05:36:12Z",
|
||||
"count": 4,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt.1770b960f12bd46b",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "4a66c16a-b2ee-4345-8de6-028936861f03",
|
||||
"resourceVersion": "986822",
|
||||
"creationTimestamp": "2023-07-11T05:34:46Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:36:12Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt",
|
||||
"uid": "209076ce-26d6-4836-981b-8c05cb0081eb",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "986730",
|
||||
"fieldPath": "spec.containers{demo-deployment-container}"
|
||||
},
|
||||
"reason": "Failed",
|
||||
"message": "Error: ErrImagePull",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T05:34:46Z",
|
||||
"lastTimestamp": "2023-07-11T05:36:12Z",
|
||||
"count": 4,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt.1770b960fa64918a",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "0b4b988c-faf5-447a-bb2e-367b627152dc",
|
||||
"resourceVersion": "986833",
|
||||
"creationTimestamp": "2023-07-11T05:34:46Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:36:25Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt",
|
||||
"uid": "209076ce-26d6-4836-981b-8c05cb0081eb",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "986730",
|
||||
"fieldPath": "spec.containers{demo-deployment-container}"
|
||||
},
|
||||
"reason": "BackOff",
|
||||
"message": "Back-off pulling image \"noimage.com/no-such-image\"",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T05:34:46Z",
|
||||
"lastTimestamp": "2023-07-11T05:36:25Z",
|
||||
"count": 5,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt.1770b960fa64bb88",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "eae7cb57-316e-4dc7-8e3a-45c01ca369a5",
|
||||
"resourceVersion": "986835",
|
||||
"creationTimestamp": "2023-07-11T05:34:46Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:36:25Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt",
|
||||
"uid": "209076ce-26d6-4836-981b-8c05cb0081eb",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "986730",
|
||||
"fieldPath": "spec.containers{demo-deployment-container}"
|
||||
},
|
||||
"reason": "Failed",
|
||||
"message": "Error: ImagePullBackOff",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T05:34:46Z",
|
||||
"lastTimestamp": "2023-07-11T05:36:25Z",
|
||||
"count": 5,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958.1770b96096c622fa",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "55bc2a37-2ff2-4a17-a29d-c3eab878e353",
|
||||
"resourceVersion": "986728",
|
||||
"creationTimestamp": "2023-07-11T05:34:44Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:34:44Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "ReplicaSet",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment-849c4c4958",
|
||||
"uid": "d992c1a5-d2c4-4065-ac5b-3bb893f9000a",
|
||||
"apiVersion": "apps/v1",
|
||||
"resourceVersion": "986723"
|
||||
},
|
||||
"reason": "SuccessfulCreate",
|
||||
"message": "Created pod: no-image-deployment-849c4c4958-rxqmt",
|
||||
"source": {
|
||||
"component": "replicaset-controller"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T05:34:44Z",
|
||||
"lastTimestamp": "2023-07-11T05:34:44Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment.1770b96096492cbe",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "3feddf40-caa5-45f9-9d8b-bc24796d508f",
|
||||
"resourceVersion": "986725",
|
||||
"creationTimestamp": "2023-07-11T05:34:44Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:34:44Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Deployment",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "no-image-deployment",
|
||||
"uid": "abe37ef6-38c5-4f29-a956-f79def48c342",
|
||||
"apiVersion": "apps/v1",
|
||||
"resourceVersion": "986722"
|
||||
},
|
||||
"reason": "ScalingReplicaSet",
|
||||
"message": "Scaled up replica set no-image-deployment-849c4c4958 to 1",
|
||||
"source": {
|
||||
"component": "deployment-controller"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T05:34:44Z",
|
||||
"lastTimestamp": "2023-07-11T05:34:44Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3-gbb89.1770b6922c75433d",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "3cfa33ed-cedc-4fa3-a9b7-aa657048784a",
|
||||
"resourceVersion": "984536",
|
||||
"creationTimestamp": "2023-07-11T04:43:19Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-scheduler",
|
||||
"operation": "Update",
|
||||
"apiVersion": "events.k8s.io/v1",
|
||||
"time": "2023-07-11T04:43:19Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:action": {},
|
||||
"f:eventTime": {},
|
||||
"f:note": {},
|
||||
"f:reason": {},
|
||||
"f:regarding": {},
|
||||
"f:reportingController": {},
|
||||
"f:reportingInstance": {},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "oom-kill-job3-gbb89",
|
||||
"uid": "c8d3f094-b80c-4ff8-aff7-f0e624f1bf3a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "984532"
|
||||
},
|
||||
"reason": "Scheduled",
|
||||
"message": "Successfully assigned default/oom-kill-job3-gbb89 to minikube",
|
||||
"source": {},
|
||||
"firstTimestamp": null,
|
||||
"lastTimestamp": null,
|
||||
"type": "Normal",
|
||||
"eventTime": "2023-07-11T04:43:19.191283Z",
|
||||
"action": "Binding",
|
||||
"reportingComponent": "default-scheduler",
|
||||
"reportingInstance": "default-scheduler-minikube"
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3-gbb89.1770b6924d361854",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "695da2fb-7e2f-4c20-b60a-9a4cd3b1b60e",
|
||||
"resourceVersion": "984539",
|
||||
"creationTimestamp": "2023-07-11T04:43:19Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:19Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "oom-kill-job3-gbb89",
|
||||
"uid": "c8d3f094-b80c-4ff8-aff7-f0e624f1bf3a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "984533",
|
||||
"fieldPath": "spec.containers{memory-eater}"
|
||||
},
|
||||
"reason": "Pulling",
|
||||
"message": "Pulling image \"us-central1-docker.pkg.dev/genuine-flight-317411/devel/memory-eater:1.0\"",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:43:19Z",
|
||||
"lastTimestamp": "2023-07-11T04:43:19Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3-gbb89.1770b6939d446433",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "b7ddf622-f531-4822-bdb2-46f6e27218ae",
|
||||
"resourceVersion": "984544",
|
||||
"creationTimestamp": "2023-07-11T04:43:25Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:25Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "oom-kill-job3-gbb89",
|
||||
"uid": "c8d3f094-b80c-4ff8-aff7-f0e624f1bf3a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "984533",
|
||||
"fieldPath": "spec.containers{memory-eater}"
|
||||
},
|
||||
"reason": "Pulled",
|
||||
"message": "Successfully pulled image \"us-central1-docker.pkg.dev/genuine-flight-317411/devel/memory-eater:1.0\" in 5.638046961s",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:43:25Z",
|
||||
"lastTimestamp": "2023-07-11T04:43:25Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3-gbb89.1770b6939f884130",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "84e0a635-a3b8-4cdc-b439-a71454e7d7d5",
|
||||
"resourceVersion": "984545",
|
||||
"creationTimestamp": "2023-07-11T04:43:25Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:25Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "oom-kill-job3-gbb89",
|
||||
"uid": "c8d3f094-b80c-4ff8-aff7-f0e624f1bf3a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "984533",
|
||||
"fieldPath": "spec.containers{memory-eater}"
|
||||
},
|
||||
"reason": "Created",
|
||||
"message": "Created container memory-eater",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:43:25Z",
|
||||
"lastTimestamp": "2023-07-11T04:43:25Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3-gbb89.1770b693a39538e4",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "a15333ad-0390-4325-8880-34ef36508831",
|
||||
"resourceVersion": "984546",
|
||||
"creationTimestamp": "2023-07-11T04:43:25Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:25Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "oom-kill-job3-gbb89",
|
||||
"uid": "c8d3f094-b80c-4ff8-aff7-f0e624f1bf3a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "984533",
|
||||
"fieldPath": "spec.containers{memory-eater}"
|
||||
},
|
||||
"reason": "Started",
|
||||
"message": "Started container memory-eater",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:43:25Z",
|
||||
"lastTimestamp": "2023-07-11T04:43:25Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3.1770b6922c53f55c",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "db095cdc-df52-490d-a308-9b283f99eaa6",
|
||||
"resourceVersion": "984534",
|
||||
"creationTimestamp": "2023-07-11T04:43:19Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:19Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Job",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "oom-kill-job3",
|
||||
"uid": "a85295e8-54e4-40a4-aeb0-b47c19f1a69f",
|
||||
"apiVersion": "batch/v1",
|
||||
"resourceVersion": "984531"
|
||||
},
|
||||
"reason": "SuccessfulCreate",
|
||||
"message": "Created pod: oom-kill-job3-gbb89",
|
||||
"source": {
|
||||
"component": "job-controller"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:43:19Z",
|
||||
"lastTimestamp": "2023-07-11T04:43:19Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3.1770b6944e3d254b",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "fb3ea640-2484-44d5-b65d-698d8e5bd3db",
|
||||
"resourceVersion": "984553",
|
||||
"creationTimestamp": "2023-07-11T04:43:28Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:28Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Job",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "oom-kill-job3",
|
||||
"uid": "a85295e8-54e4-40a4-aeb0-b47c19f1a69f",
|
||||
"apiVersion": "batch/v1",
|
||||
"resourceVersion": "984551"
|
||||
},
|
||||
"reason": "BackoffLimitExceeded",
|
||||
"message": "Job has reached the specified backoff limit",
|
||||
"source": {
|
||||
"component": "job-controller"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:43:28Z",
|
||||
"lastTimestamp": "2023-07-11T04:43:28Z",
|
||||
"count": 1,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "pending-pod-resources-5fddcf7688-djjfc.1770b59c8b866b56",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "64330c31-0f5e-46f3-8fb6-ffdac523bb77",
|
||||
"resourceVersion": "984662",
|
||||
"creationTimestamp": "2023-07-11T04:25:44Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-scheduler",
|
||||
"operation": "Update",
|
||||
"apiVersion": "events.k8s.io/v1",
|
||||
"time": "2023-07-11T04:46:01Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:action": {},
|
||||
"f:eventTime": {},
|
||||
"f:note": {},
|
||||
"f:reason": {},
|
||||
"f:regarding": {},
|
||||
"f:reportingController": {},
|
||||
"f:reportingInstance": {},
|
||||
"f:series": {
|
||||
".": {},
|
||||
"f:count": {},
|
||||
"f:lastObservedTime": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "pending-pod-resources-5fddcf7688-djjfc",
|
||||
"uid": "e4d4c4cc-2c41-4ab7-b41c-9c8b28ded451",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "983556"
|
||||
},
|
||||
"reason": "FailedScheduling",
|
||||
"message": "0/1 nodes are available: 1 Insufficient nvidia.com/gpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.",
|
||||
"source": {},
|
||||
"firstTimestamp": null,
|
||||
"lastTimestamp": null,
|
||||
"type": "Warning",
|
||||
"eventTime": "2023-07-11T04:25:44.224298Z",
|
||||
"series": {
|
||||
"count": 3,
|
||||
"lastObservedTime": "2023-07-11T04:40:44.264058Z"
|
||||
},
|
||||
"action": "Scheduling",
|
||||
"reportingComponent": "default-scheduler",
|
||||
"reportingInstance": "default-scheduler-minikube"
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "pending-pod-resources-5fddcf7688-djjfc.1770b68fb368b5a6",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "369454df-c891-4e76-96b9-ebdaabe2a6a6",
|
||||
"resourceVersion": "984523",
|
||||
"creationTimestamp": "2023-07-11T04:43:08Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-scheduler",
|
||||
"operation": "Update",
|
||||
"apiVersion": "events.k8s.io/v1",
|
||||
"time": "2023-07-11T04:43:08Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:action": {},
|
||||
"f:eventTime": {},
|
||||
"f:note": {},
|
||||
"f:reason": {},
|
||||
"f:regarding": {},
|
||||
"f:reportingController": {},
|
||||
"f:reportingInstance": {},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"name": "pending-pod-resources-5fddcf7688-djjfc",
|
||||
"uid": "e4d4c4cc-2c41-4ab7-b41c-9c8b28ded451",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "984521"
|
||||
},
|
||||
"reason": "FailedScheduling",
|
||||
"message": "skip schedule deleting pod: default/pending-pod-resources-5fddcf7688-djjfc",
|
||||
"source": {},
|
||||
"firstTimestamp": null,
|
||||
"lastTimestamp": null,
|
||||
"type": "Warning",
|
||||
"eventTime": "2023-07-11T04:43:08.570490Z",
|
||||
"action": "Scheduling",
|
||||
"reportingComponent": "default-scheduler",
|
||||
"reportingInstance": "default-scheduler-minikube"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,928 @@
|
||||
{
|
||||
"kind": "EventList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "982712"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2a98cf7b53c",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "cfdfe0af-6dc5-4c6c-a3be-f1532d424ab4",
|
||||
"resourceVersion": "981383",
|
||||
"creationTimestamp": "2023-07-11T03:31:41Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-scheduler",
|
||||
"operation": "Update",
|
||||
"apiVersion": "events.k8s.io/v1",
|
||||
"time": "2023-07-11T03:31:41Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:action": {},
|
||||
"f:eventTime": {},
|
||||
"f:note": {},
|
||||
"f:reason": {},
|
||||
"f:regarding": {},
|
||||
"f:reportingController": {},
|
||||
"f:reportingInstance": {},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981381"
|
||||
},
|
||||
"reason": "Scheduled",
|
||||
"message": "Successfully assigned default/init-demo to minikube",
|
||||
"source": {},
|
||||
"firstTimestamp": null,
|
||||
"lastTimestamp": null,
|
||||
"type": "Normal",
|
||||
"eventTime": "2023-07-11T03:31:41.548190Z",
|
||||
"action": "Binding",
|
||||
"reportingComponent": "default-scheduler",
|
||||
"reportingInstance": "default-scheduler-minikube"
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2a9adf25515",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "091c0f14-75df-47e6-af31-309d8a0b0b86",
|
||||
"resourceVersion": "981479",
|
||||
"creationTimestamp": "2023-07-11T03:31:42Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:33:12Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Pulling",
|
||||
"message": "Pulling image \"nginx\"",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:31:42Z",
|
||||
"lastTimestamp": "2023-07-11T03:33:12Z",
|
||||
"count": 5,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2aa4adc35a4",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "740be04d-5aa8-4bce-ace3-ec61e4d229e0",
|
||||
"resourceVersion": "981389",
|
||||
"creationTimestamp": "2023-07-11T03:31:44Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:31:44Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Pulled",
|
||||
"message": "Successfully pulled image \"nginx\" in 2.633289584s",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:31:44Z",
|
||||
"lastTimestamp": "2023-07-11T03:31:44Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2aa4cbb718f",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "a158f7ff-6b95-45db-ac28-2d02ba1d8ca0",
|
||||
"resourceVersion": "981483",
|
||||
"creationTimestamp": "2023-07-11T03:31:44Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:33:15Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Created",
|
||||
"message": "Created container nginx",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:31:44Z",
|
||||
"lastTimestamp": "2023-07-11T03:33:15Z",
|
||||
"count": 5,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2aa50edfd38",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "0fc24955-49dd-4c16-8c7b-c4a3316b1f9d",
|
||||
"resourceVersion": "981484",
|
||||
"creationTimestamp": "2023-07-11T03:31:44Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:33:15Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Failed",
|
||||
"message": "Error: failed to start container \"nginx\": Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \"wge\": executable file not found in $PATH: unknown",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:31:44Z",
|
||||
"lastTimestamp": "2023-07-11T03:33:15Z",
|
||||
"count": 5,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2aae7fb3f76",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "3c489943-7de7-4a1b-a108-1e9d55a2d6a7",
|
||||
"resourceVersion": "981396",
|
||||
"creationTimestamp": "2023-07-11T03:31:47Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:31:47Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Pulled",
|
||||
"message": "Successfully pulled image \"nginx\" in 1.952280959s",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:31:47Z",
|
||||
"lastTimestamp": "2023-07-11T03:31:47Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2ae5cec9549",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "793ce261-4cb0-4b2a-9c97-fe1924e534e3",
|
||||
"resourceVersion": "981413",
|
||||
"creationTimestamp": "2023-07-11T03:32:02Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:32:02Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Pulled",
|
||||
"message": "Successfully pulled image \"nginx\" in 2.228363585s",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:32:02Z",
|
||||
"lastTimestamp": "2023-07-11T03:32:02Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2b1917b81fa",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "2dbed976-4a5d-42f8-8cd7-8778f2382b7a",
|
||||
"resourceVersion": "982495",
|
||||
"creationTimestamp": "2023-07-11T03:32:15Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:56:47Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "BackOff",
|
||||
"message": "Back-off restarting failed container",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:32:15Z",
|
||||
"lastTimestamp": "2023-07-11T03:56:47Z",
|
||||
"count": 111,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2b3b6fab35b",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "f3d43cf2-f8b7-428a-b834-4826603b414c",
|
||||
"resourceVersion": "981439",
|
||||
"creationTimestamp": "2023-07-11T03:32:25Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:32:25Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Pulled",
|
||||
"message": "Successfully pulled image \"nginx\" in 2.117272501s",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:32:25Z",
|
||||
"lastTimestamp": "2023-07-11T03:32:25Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo.1770b2bf5bb3f082",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "f9f3da46-c519-43b0-9721-07113e30e2e3",
|
||||
"resourceVersion": "981482",
|
||||
"creationTimestamp": "2023-07-11T03:33:15Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:33:15Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "981382",
|
||||
"fieldPath": "spec.containers{nginx}"
|
||||
},
|
||||
"reason": "Pulled",
|
||||
"message": "Successfully pulled image \"nginx\" in 2.219218792s",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T03:33:15Z",
|
||||
"lastTimestamp": "2023-07-11T03:33:15Z",
|
||||
"count": 1,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo2.1770b446b3f016ce",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "12009dc6-123f-488f-9b1f-412930c8d28d",
|
||||
"resourceVersion": "982692",
|
||||
"creationTimestamp": "2023-07-11T04:01:16Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-scheduler",
|
||||
"operation": "Update",
|
||||
"apiVersion": "events.k8s.io/v1",
|
||||
"time": "2023-07-11T04:01:16Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:action": {},
|
||||
"f:eventTime": {},
|
||||
"f:note": {},
|
||||
"f:reason": {},
|
||||
"f:regarding": {},
|
||||
"f:reportingController": {},
|
||||
"f:reportingInstance": {},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo2",
|
||||
"uid": "5a560e83-c634-4c91-b308-510ee692ed6a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "982690"
|
||||
},
|
||||
"reason": "Scheduled",
|
||||
"message": "Successfully assigned default/init-demo2 to minikube",
|
||||
"source": {},
|
||||
"firstTimestamp": null,
|
||||
"lastTimestamp": null,
|
||||
"type": "Normal",
|
||||
"eventTime": "2023-07-11T04:01:16.023486Z",
|
||||
"action": "Binding",
|
||||
"reportingComponent": "default-scheduler",
|
||||
"reportingInstance": "default-scheduler-minikube"
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo2.1770b446d40953ed",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "a5ffd925-1612-4178-b5ce-02e981500ee5",
|
||||
"resourceVersion": "982698",
|
||||
"creationTimestamp": "2023-07-11T04:01:16Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:01:16Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo2",
|
||||
"uid": "5a560e83-c634-4c91-b308-510ee692ed6a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "982691",
|
||||
"fieldPath": "spec.initContainers{install}"
|
||||
},
|
||||
"reason": "Pulled",
|
||||
"message": "Container image \"busybox:1.28\" already present on machine",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:01:16Z",
|
||||
"lastTimestamp": "2023-07-11T04:01:16Z",
|
||||
"count": 2,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo2.1770b446d5539074",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "f431bae6-64fb-47ba-81ee-ab4f32122024",
|
||||
"resourceVersion": "982700",
|
||||
"creationTimestamp": "2023-07-11T04:01:16Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:01:16Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo2",
|
||||
"uid": "5a560e83-c634-4c91-b308-510ee692ed6a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "982691",
|
||||
"fieldPath": "spec.initContainers{install}"
|
||||
},
|
||||
"reason": "Created",
|
||||
"message": "Created container install",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:01:16Z",
|
||||
"lastTimestamp": "2023-07-11T04:01:16Z",
|
||||
"count": 2,
|
||||
"type": "Normal",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo2.1770b446d9b392f2",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "9e237187-eb36-4f2d-a139-3c5c450a75e9",
|
||||
"resourceVersion": "982701",
|
||||
"creationTimestamp": "2023-07-11T04:01:16Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:01:17Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo2",
|
||||
"uid": "5a560e83-c634-4c91-b308-510ee692ed6a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "982691",
|
||||
"fieldPath": "spec.initContainers{install}"
|
||||
},
|
||||
"reason": "Failed",
|
||||
"message": "Error: failed to start container \"install\": Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \"wge\": executable file not found in $PATH: unknown",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:01:16Z",
|
||||
"lastTimestamp": "2023-07-11T04:01:17Z",
|
||||
"count": 2,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo2.1770b448549c898a",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "44c503f2-0bd9-46ad-81be-9c2626d3bdf3",
|
||||
"resourceVersion": "982706",
|
||||
"creationTimestamp": "2023-07-11T04:01:23Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:01:23Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "init-demo2",
|
||||
"uid": "5a560e83-c634-4c91-b308-510ee692ed6a",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "982691",
|
||||
"fieldPath": "spec.initContainers{install}"
|
||||
},
|
||||
"reason": "BackOff",
|
||||
"message": "Back-off restarting failed container",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-11T04:01:23Z",
|
||||
"lastTimestamp": "2023-07-11T04:01:23Z",
|
||||
"count": 1,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "troubleshoot-copyfromhost-4m79m-psdjm.177058280d4c0493",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "380bec72-7cfd-4a00-85ff-8725c9fc28f9",
|
||||
"resourceVersion": "981372",
|
||||
"creationTimestamp": "2023-07-09T23:53:09Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:31:29Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "troubleshoot-copyfromhost-4m79m-psdjm",
|
||||
"uid": "55ca5d14-2541-42a9-9eb1-5eb53133e178",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "938779"
|
||||
},
|
||||
"reason": "FailedMount",
|
||||
"message": "MountVolume.SetUp failed for volume \"host\" : hostPath type check failed: /var/lib/collectd is not a directory",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-09T23:53:09Z",
|
||||
"lastTimestamp": "2023-07-11T03:31:29Z",
|
||||
"count": 490,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
},
|
||||
{
|
||||
"kind": "Event",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "troubleshoot-copyfromhost-4m79m-psdjm.17705863d9fdab48",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "bab0a7d9-61a5-43a1-813c-ed2d050aee34",
|
||||
"resourceVersion": "981185",
|
||||
"creationTimestamp": "2023-07-09T23:57:26Z",
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:27:03Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:count": {},
|
||||
"f:firstTimestamp": {},
|
||||
"f:involvedObject": {},
|
||||
"f:lastTimestamp": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:source": {
|
||||
"f:component": {},
|
||||
"f:host": {}
|
||||
},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"involvedObject": {
|
||||
"kind": "Pod",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"name": "troubleshoot-copyfromhost-4m79m-psdjm",
|
||||
"uid": "55ca5d14-2541-42a9-9eb1-5eb53133e178",
|
||||
"apiVersion": "v1",
|
||||
"resourceVersion": "938779"
|
||||
},
|
||||
"reason": "FailedMount",
|
||||
"message": "Unable to attach or mount volumes: unmounted volumes=[host], unattached volumes=[host kube-api-access-xddvj]: timed out waiting for the condition",
|
||||
"source": {
|
||||
"component": "kubelet",
|
||||
"host": "minikube"
|
||||
},
|
||||
"firstTimestamp": "2023-07-09T23:57:26Z",
|
||||
"lastTimestamp": "2023-07-11T03:27:03Z",
|
||||
"count": 324,
|
||||
"type": "Warning",
|
||||
"eventTime": null,
|
||||
"reportingComponent": "",
|
||||
"reportingInstance": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,355 @@
|
||||
{
|
||||
"kind": "PodList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "954528"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Pod",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "troubleshoot-copyfromhost-4m79m-psdjm",
|
||||
"generateName": "troubleshoot-copyfromhost-4m79m-",
|
||||
"namespace": "message-container-creating-failed-mount",
|
||||
"uid": "55ca5d14-2541-42a9-9eb1-5eb53133e178",
|
||||
"resourceVersion": "938782",
|
||||
"creationTimestamp": "2023-07-09T23:53:09Z",
|
||||
"labels": {
|
||||
"app.kubernetes.io/managed-by": "troubleshoot.sh",
|
||||
"controller-revision-hash": "54b4f4f449",
|
||||
"pod-template-generation": "1",
|
||||
"troubleshoot.sh/collector": "copyfromhost",
|
||||
"troubleshoot.sh/copyfromhost-id": "2SAoFNhXU68STgniojM3fJcNQig"
|
||||
},
|
||||
"ownerReferences": [
|
||||
{
|
||||
"apiVersion": "apps/v1",
|
||||
"kind": "DaemonSet",
|
||||
"name": "troubleshoot-copyfromhost-4m79m",
|
||||
"uid": "ed30f463-4614-41b3-b2b6-52f65e50b1d3",
|
||||
"controller": true,
|
||||
"blockOwnerDeletion": true
|
||||
}
|
||||
],
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-09T23:53:09Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:generateName": {},
|
||||
"f:labels": {
|
||||
".": {},
|
||||
"f:app.kubernetes.io/managed-by": {},
|
||||
"f:controller-revision-hash": {},
|
||||
"f:pod-template-generation": {},
|
||||
"f:troubleshoot.sh/collector": {},
|
||||
"f:troubleshoot.sh/copyfromhost-id": {}
|
||||
},
|
||||
"f:ownerReferences": {
|
||||
".": {},
|
||||
"k:{\"uid\":\"ed30f463-4614-41b3-b2b6-52f65e50b1d3\"}": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:affinity": {
|
||||
".": {},
|
||||
"f:nodeAffinity": {
|
||||
".": {},
|
||||
"f:requiredDuringSchedulingIgnoredDuringExecution": {}
|
||||
}
|
||||
},
|
||||
"f:containers": {
|
||||
"k:{\"name\":\"collector\"}": {
|
||||
".": {},
|
||||
"f:args": {},
|
||||
"f:command": {},
|
||||
"f:image": {},
|
||||
"f:imagePullPolicy": {},
|
||||
"f:name": {},
|
||||
"f:resources": {},
|
||||
"f:terminationMessagePath": {},
|
||||
"f:terminationMessagePolicy": {},
|
||||
"f:volumeMounts": {
|
||||
".": {},
|
||||
"k:{\"mountPath\":\"/host\"}": {
|
||||
".": {},
|
||||
"f:mountPath": {},
|
||||
"f:name": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"f:dnsPolicy": {},
|
||||
"f:enableServiceLinks": {},
|
||||
"f:restartPolicy": {},
|
||||
"f:schedulerName": {},
|
||||
"f:securityContext": {},
|
||||
"f:terminationGracePeriodSeconds": {},
|
||||
"f:tolerations": {},
|
||||
"f:volumes": {
|
||||
".": {},
|
||||
"k:{\"name\":\"host\"}": {
|
||||
".": {},
|
||||
"f:hostPath": {
|
||||
".": {},
|
||||
"f:path": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"f:name": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-09T23:53:09Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:conditions": {
|
||||
"k:{\"type\":\"ContainersReady\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Initialized\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Ready\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
}
|
||||
},
|
||||
"f:containerStatuses": {},
|
||||
"f:hostIP": {},
|
||||
"f:startTime": {}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"volumes": [
|
||||
{
|
||||
"name": "host",
|
||||
"hostPath": {
|
||||
"path": "/var/lib/collectd",
|
||||
"type": "Directory"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "kube-api-access-xddvj",
|
||||
"projected": {
|
||||
"sources": [
|
||||
{
|
||||
"serviceAccountToken": {
|
||||
"expirationSeconds": 3607,
|
||||
"path": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"configMap": {
|
||||
"name": "kube-root-ca.crt",
|
||||
"items": [
|
||||
{
|
||||
"key": "ca.crt",
|
||||
"path": "ca.crt"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"downwardAPI": {
|
||||
"items": [
|
||||
{
|
||||
"path": "namespace",
|
||||
"fieldRef": {
|
||||
"apiVersion": "v1",
|
||||
"fieldPath": "metadata.namespace"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultMode": 420
|
||||
}
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
{
|
||||
"name": "collector",
|
||||
"image": "alpine",
|
||||
"command": [
|
||||
"sleep"
|
||||
],
|
||||
"args": [
|
||||
"1000000"
|
||||
],
|
||||
"resources": {},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "host",
|
||||
"mountPath": "/host"
|
||||
},
|
||||
{
|
||||
"name": "kube-api-access-xddvj",
|
||||
"readOnly": true,
|
||||
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"terminationMessagePolicy": "File",
|
||||
"imagePullPolicy": "IfNotPresent"
|
||||
}
|
||||
],
|
||||
"restartPolicy": "Always",
|
||||
"terminationGracePeriodSeconds": 30,
|
||||
"dnsPolicy": "ClusterFirst",
|
||||
"serviceAccountName": "default",
|
||||
"serviceAccount": "default",
|
||||
"nodeName": "minikube",
|
||||
"securityContext": {},
|
||||
"affinity": {
|
||||
"nodeAffinity": {
|
||||
"requiredDuringSchedulingIgnoredDuringExecution": {
|
||||
"nodeSelectorTerms": [
|
||||
{
|
||||
"matchFields": [
|
||||
{
|
||||
"key": "metadata.name",
|
||||
"operator": "In",
|
||||
"values": [
|
||||
"minikube"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"schedulerName": "default-scheduler",
|
||||
"tolerations": [
|
||||
{
|
||||
"key": "node-role.kubernetes.io/master",
|
||||
"operator": "Exists",
|
||||
"effect": "NoSchedule"
|
||||
},
|
||||
{
|
||||
"key": "node-role.kubernetes.io/control-plane",
|
||||
"operator": "Exists",
|
||||
"effect": "NoSchedule"
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/not-ready",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute"
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/unreachable",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute"
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/disk-pressure",
|
||||
"operator": "Exists",
|
||||
"effect": "NoSchedule"
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/memory-pressure",
|
||||
"operator": "Exists",
|
||||
"effect": "NoSchedule"
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/pid-pressure",
|
||||
"operator": "Exists",
|
||||
"effect": "NoSchedule"
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/unschedulable",
|
||||
"operator": "Exists",
|
||||
"effect": "NoSchedule"
|
||||
}
|
||||
],
|
||||
"priority": 0,
|
||||
"enableServiceLinks": true,
|
||||
"preemptionPolicy": "PreemptLowerPriority"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Pending",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "Initialized",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-09T23:53:09Z"
|
||||
},
|
||||
{
|
||||
"type": "Ready",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-09T23:53:09Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [collector]"
|
||||
},
|
||||
{
|
||||
"type": "ContainersReady",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-09T23:53:09Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [collector]"
|
||||
},
|
||||
{
|
||||
"type": "PodScheduled",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-09T23:53:09Z"
|
||||
}
|
||||
],
|
||||
"hostIP": "192.168.49.2",
|
||||
"startTime": "2023-07-09T23:53:09Z",
|
||||
"containerStatuses": [
|
||||
{
|
||||
"name": "collector",
|
||||
"state": {
|
||||
"waiting": {
|
||||
"reason": "ContainerCreating"
|
||||
}
|
||||
},
|
||||
"lastState": {},
|
||||
"ready": false,
|
||||
"restartCount": 0,
|
||||
"image": "alpine",
|
||||
"imageID": "",
|
||||
"started": false
|
||||
}
|
||||
],
|
||||
"qosClass": "BestEffort"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,272 @@
|
||||
{
|
||||
"kind": "PodList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "986839"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Pod",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "no-image-deployment-849c4c4958-rxqmt",
|
||||
"generateName": "no-image-deployment-849c4c4958-",
|
||||
"namespace": "message-image-pull-fail",
|
||||
"uid": "209076ce-26d6-4836-981b-8c05cb0081eb",
|
||||
"resourceVersion": "986834",
|
||||
"creationTimestamp": "2023-07-11T05:34:44Z",
|
||||
"labels": {
|
||||
"app": "no-image-deployment",
|
||||
"pod-template-hash": "849c4c4958",
|
||||
"visualize": "true"
|
||||
},
|
||||
"ownerReferences": [
|
||||
{
|
||||
"apiVersion": "apps/v1",
|
||||
"kind": "ReplicaSet",
|
||||
"name": "no-image-deployment-849c4c4958",
|
||||
"uid": "d992c1a5-d2c4-4065-ac5b-3bb893f9000a",
|
||||
"controller": true,
|
||||
"blockOwnerDeletion": true
|
||||
}
|
||||
],
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:34:44Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:generateName": {},
|
||||
"f:labels": {
|
||||
".": {},
|
||||
"f:app": {},
|
||||
"f:pod-template-hash": {},
|
||||
"f:visualize": {}
|
||||
},
|
||||
"f:ownerReferences": {
|
||||
".": {},
|
||||
"k:{\"uid\":\"d992c1a5-d2c4-4065-ac5b-3bb893f9000a\"}": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:containers": {
|
||||
"k:{\"name\":\"demo-deployment-container\"}": {
|
||||
".": {},
|
||||
"f:image": {},
|
||||
"f:imagePullPolicy": {},
|
||||
"f:name": {},
|
||||
"f:resources": {},
|
||||
"f:terminationMessagePath": {},
|
||||
"f:terminationMessagePolicy": {}
|
||||
}
|
||||
},
|
||||
"f:dnsPolicy": {},
|
||||
"f:enableServiceLinks": {},
|
||||
"f:restartPolicy": {},
|
||||
"f:schedulerName": {},
|
||||
"f:securityContext": {},
|
||||
"f:terminationGracePeriodSeconds": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T05:36:25Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:conditions": {
|
||||
"k:{\"type\":\"ContainersReady\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Initialized\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Ready\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
}
|
||||
},
|
||||
"f:containerStatuses": {},
|
||||
"f:hostIP": {},
|
||||
"f:podIP": {},
|
||||
"f:podIPs": {
|
||||
".": {},
|
||||
"k:{\"ip\":\"172.17.0.3\"}": {
|
||||
".": {},
|
||||
"f:ip": {}
|
||||
}
|
||||
},
|
||||
"f:startTime": {}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"volumes": [
|
||||
{
|
||||
"name": "kube-api-access-5p7hr",
|
||||
"projected": {
|
||||
"sources": [
|
||||
{
|
||||
"serviceAccountToken": {
|
||||
"expirationSeconds": 3607,
|
||||
"path": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"configMap": {
|
||||
"name": "kube-root-ca.crt",
|
||||
"items": [
|
||||
{
|
||||
"key": "ca.crt",
|
||||
"path": "ca.crt"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"downwardAPI": {
|
||||
"items": [
|
||||
{
|
||||
"path": "namespace",
|
||||
"fieldRef": {
|
||||
"apiVersion": "v1",
|
||||
"fieldPath": "metadata.namespace"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultMode": 420
|
||||
}
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
{
|
||||
"name": "demo-deployment-container",
|
||||
"image": "noimage.com/no-such-image",
|
||||
"resources": {},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "kube-api-access-5p7hr",
|
||||
"readOnly": true,
|
||||
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"terminationMessagePolicy": "File",
|
||||
"imagePullPolicy": "IfNotPresent"
|
||||
}
|
||||
],
|
||||
"restartPolicy": "Always",
|
||||
"terminationGracePeriodSeconds": 30,
|
||||
"dnsPolicy": "ClusterFirst",
|
||||
"serviceAccountName": "default",
|
||||
"serviceAccount": "default",
|
||||
"nodeName": "minikube",
|
||||
"securityContext": {},
|
||||
"schedulerName": "default-scheduler",
|
||||
"tolerations": [
|
||||
{
|
||||
"key": "node.kubernetes.io/not-ready",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/unreachable",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
}
|
||||
],
|
||||
"priority": 0,
|
||||
"enableServiceLinks": true,
|
||||
"preemptionPolicy": "PreemptLowerPriority"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Pending",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "Initialized",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T05:34:44Z"
|
||||
},
|
||||
{
|
||||
"type": "Ready",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T05:34:44Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [demo-deployment-container]"
|
||||
},
|
||||
{
|
||||
"type": "ContainersReady",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T05:34:44Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [demo-deployment-container]"
|
||||
},
|
||||
{
|
||||
"type": "PodScheduled",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T05:34:44Z"
|
||||
}
|
||||
],
|
||||
"hostIP": "192.168.49.2",
|
||||
"podIP": "172.17.0.3",
|
||||
"podIPs": [
|
||||
{
|
||||
"ip": "172.17.0.3"
|
||||
}
|
||||
],
|
||||
"startTime": "2023-07-11T05:34:44Z",
|
||||
"containerStatuses": [
|
||||
{
|
||||
"name": "demo-deployment-container",
|
||||
"state": {
|
||||
"waiting": {
|
||||
"reason": "ErrImagePull",
|
||||
"message": "rpc error: code = Unknown desc = Error response from daemon: Get \"https://noimage.com/v2/\": x509: certificate is not valid for any names, but wanted to match noimage.com"
|
||||
}
|
||||
},
|
||||
"lastState": {},
|
||||
"ready": false,
|
||||
"restartCount": 0,
|
||||
"image": "noimage.com/no-such-image",
|
||||
"imageID": "",
|
||||
"started": false
|
||||
}
|
||||
],
|
||||
"qosClass": "BestEffort"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,296 @@
|
||||
{
|
||||
"kind": "PodList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "985854"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Pod",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "oom-kill-job3-gbb89",
|
||||
"generateName": "oom-kill-job3-",
|
||||
"namespace": "message-oomkill-pod",
|
||||
"uid": "c8d3f094-b80c-4ff8-aff7-f0e624f1bf3a",
|
||||
"resourceVersion": "984552",
|
||||
"creationTimestamp": "2023-07-11T04:43:19Z",
|
||||
"labels": {
|
||||
"controller-uid": "a85295e8-54e4-40a4-aeb0-b47c19f1a69f",
|
||||
"job-name": "oom-kill-job3"
|
||||
},
|
||||
"ownerReferences": [
|
||||
{
|
||||
"apiVersion": "batch/v1",
|
||||
"kind": "Job",
|
||||
"name": "oom-kill-job3",
|
||||
"uid": "a85295e8-54e4-40a4-aeb0-b47c19f1a69f",
|
||||
"controller": true,
|
||||
"blockOwnerDeletion": true
|
||||
}
|
||||
],
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:19Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:generateName": {},
|
||||
"f:labels": {
|
||||
".": {},
|
||||
"f:controller-uid": {},
|
||||
"f:job-name": {}
|
||||
},
|
||||
"f:ownerReferences": {
|
||||
".": {},
|
||||
"k:{\"uid\":\"a85295e8-54e4-40a4-aeb0-b47c19f1a69f\"}": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:containers": {
|
||||
"k:{\"name\":\"memory-eater\"}": {
|
||||
".": {},
|
||||
"f:args": {},
|
||||
"f:image": {},
|
||||
"f:imagePullPolicy": {},
|
||||
"f:name": {},
|
||||
"f:resources": {
|
||||
".": {},
|
||||
"f:limits": {
|
||||
".": {},
|
||||
"f:memory": {}
|
||||
},
|
||||
"f:requests": {
|
||||
".": {},
|
||||
"f:memory": {}
|
||||
}
|
||||
},
|
||||
"f:terminationMessagePath": {},
|
||||
"f:terminationMessagePolicy": {}
|
||||
}
|
||||
},
|
||||
"f:dnsPolicy": {},
|
||||
"f:enableServiceLinks": {},
|
||||
"f:restartPolicy": {},
|
||||
"f:schedulerName": {},
|
||||
"f:securityContext": {},
|
||||
"f:terminationGracePeriodSeconds": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:43:28Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:conditions": {
|
||||
"k:{\"type\":\"ContainersReady\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Initialized\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Ready\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
}
|
||||
},
|
||||
"f:containerStatuses": {},
|
||||
"f:hostIP": {},
|
||||
"f:phase": {},
|
||||
"f:podIP": {},
|
||||
"f:podIPs": {
|
||||
".": {},
|
||||
"k:{\"ip\":\"172.17.0.3\"}": {
|
||||
".": {},
|
||||
"f:ip": {}
|
||||
}
|
||||
},
|
||||
"f:startTime": {}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"volumes": [
|
||||
{
|
||||
"name": "kube-api-access-rbt47",
|
||||
"projected": {
|
||||
"sources": [
|
||||
{
|
||||
"serviceAccountToken": {
|
||||
"expirationSeconds": 3607,
|
||||
"path": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"configMap": {
|
||||
"name": "kube-root-ca.crt",
|
||||
"items": [
|
||||
{
|
||||
"key": "ca.crt",
|
||||
"path": "ca.crt"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"downwardAPI": {
|
||||
"items": [
|
||||
{
|
||||
"path": "namespace",
|
||||
"fieldRef": {
|
||||
"apiVersion": "v1",
|
||||
"fieldPath": "metadata.namespace"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultMode": 420
|
||||
}
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
{
|
||||
"name": "memory-eater",
|
||||
"image": "us-central1-docker.pkg.dev/genuine-flight-317411/devel/memory-eater:1.0",
|
||||
"args": [
|
||||
"75Mi",
|
||||
"0",
|
||||
"30Mi",
|
||||
"80",
|
||||
"1"
|
||||
],
|
||||
"resources": {
|
||||
"limits": {
|
||||
"memory": "100Mi"
|
||||
},
|
||||
"requests": {
|
||||
"memory": "100Mi"
|
||||
}
|
||||
},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "kube-api-access-rbt47",
|
||||
"readOnly": true,
|
||||
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"terminationMessagePolicy": "File",
|
||||
"imagePullPolicy": "Always"
|
||||
}
|
||||
],
|
||||
"restartPolicy": "Never",
|
||||
"terminationGracePeriodSeconds": 30,
|
||||
"dnsPolicy": "ClusterFirst",
|
||||
"serviceAccountName": "default",
|
||||
"serviceAccount": "default",
|
||||
"nodeName": "minikube",
|
||||
"securityContext": {},
|
||||
"schedulerName": "default-scheduler",
|
||||
"tolerations": [
|
||||
{
|
||||
"key": "node.kubernetes.io/not-ready",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/unreachable",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
}
|
||||
],
|
||||
"priority": 0,
|
||||
"enableServiceLinks": true,
|
||||
"preemptionPolicy": "PreemptLowerPriority"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Failed",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "Initialized",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:43:19Z"
|
||||
},
|
||||
{
|
||||
"type": "Ready",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:43:19Z",
|
||||
"reason": "PodFailed"
|
||||
},
|
||||
{
|
||||
"type": "ContainersReady",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:43:19Z",
|
||||
"reason": "PodFailed"
|
||||
},
|
||||
{
|
||||
"type": "PodScheduled",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:43:19Z"
|
||||
}
|
||||
],
|
||||
"hostIP": "192.168.49.2",
|
||||
"podIP": "172.17.0.3",
|
||||
"podIPs": [
|
||||
{
|
||||
"ip": "172.17.0.3"
|
||||
}
|
||||
],
|
||||
"startTime": "2023-07-11T04:43:19Z",
|
||||
"containerStatuses": [
|
||||
{
|
||||
"name": "memory-eater",
|
||||
"state": {
|
||||
"terminated": {
|
||||
"exitCode": 137,
|
||||
"reason": "OOMKilled",
|
||||
"startedAt": "2023-07-11T04:43:25Z",
|
||||
"finishedAt": "2023-07-11T04:43:25Z",
|
||||
"containerID": "docker://84d3d308bb9a5765e637884194e718d297046f156a377cf6145a9397d5e469b7"
|
||||
}
|
||||
},
|
||||
"lastState": {},
|
||||
"ready": false,
|
||||
"restartCount": 0,
|
||||
"image": "us-central1-docker.pkg.dev/genuine-flight-317411/devel/memory-eater:1.0",
|
||||
"imageID": "docker-pullable://us-central1-docker.pkg.dev/genuine-flight-317411/devel/memory-eater@sha256:b99901aacc6c87f86a767b3a0b02cdc926aae62bb4a5e7361d895f26f4773562",
|
||||
"containerID": "docker://84d3d308bb9a5765e637884194e718d297046f156a377cf6145a9397d5e469b7",
|
||||
"started": false
|
||||
}
|
||||
],
|
||||
"qosClass": "Burstable"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,223 @@
|
||||
{
|
||||
"kind": "PodList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "984246"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Pod",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "pending-pod-resources-5fddcf7688-djjfc",
|
||||
"generateName": "pending-pod-resources-5fddcf7688-",
|
||||
"namespace": "message-pending-pod-resources",
|
||||
"uid": "e4d4c4cc-2c41-4ab7-b41c-9c8b28ded451",
|
||||
"resourceVersion": "983556",
|
||||
"creationTimestamp": "2023-07-11T04:20:29Z",
|
||||
"labels": {
|
||||
"app": "pending-pod-resources",
|
||||
"pod-template-hash": "5fddcf7688"
|
||||
},
|
||||
"ownerReferences": [
|
||||
{
|
||||
"apiVersion": "apps/v1",
|
||||
"kind": "ReplicaSet",
|
||||
"name": "pending-pod-resources-5fddcf7688",
|
||||
"uid": "f57de73f-8492-4118-b4da-b0f9d7408c9b",
|
||||
"controller": true,
|
||||
"blockOwnerDeletion": true
|
||||
}
|
||||
],
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kube-controller-manager",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:20:29Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:generateName": {},
|
||||
"f:labels": {
|
||||
".": {},
|
||||
"f:app": {},
|
||||
"f:pod-template-hash": {}
|
||||
},
|
||||
"f:ownerReferences": {
|
||||
".": {},
|
||||
"k:{\"uid\":\"f57de73f-8492-4118-b4da-b0f9d7408c9b\"}": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:containers": {
|
||||
"k:{\"name\":\"nginx\"}": {
|
||||
".": {},
|
||||
"f:image": {},
|
||||
"f:imagePullPolicy": {},
|
||||
"f:name": {},
|
||||
"f:resources": {
|
||||
".": {},
|
||||
"f:limits": {
|
||||
".": {},
|
||||
"f:cpu": {},
|
||||
"f:memory": {},
|
||||
"f:nvidia.com/gpu": {}
|
||||
},
|
||||
"f:requests": {
|
||||
".": {},
|
||||
"f:cpu": {},
|
||||
"f:memory": {},
|
||||
"f:nvidia.com/gpu": {}
|
||||
}
|
||||
},
|
||||
"f:terminationMessagePath": {},
|
||||
"f:terminationMessagePolicy": {}
|
||||
}
|
||||
},
|
||||
"f:dnsPolicy": {},
|
||||
"f:enableServiceLinks": {},
|
||||
"f:restartPolicy": {},
|
||||
"f:schedulerName": {},
|
||||
"f:securityContext": {},
|
||||
"f:terminationGracePeriodSeconds": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "kube-scheduler",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:20:29Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:conditions": {
|
||||
".": {},
|
||||
"k:{\"type\":\"PodScheduled\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"volumes": [
|
||||
{
|
||||
"name": "kube-api-access-sjnlv",
|
||||
"projected": {
|
||||
"sources": [
|
||||
{
|
||||
"serviceAccountToken": {
|
||||
"expirationSeconds": 3607,
|
||||
"path": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"configMap": {
|
||||
"name": "kube-root-ca.crt",
|
||||
"items": [
|
||||
{
|
||||
"key": "ca.crt",
|
||||
"path": "ca.crt"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"downwardAPI": {
|
||||
"items": [
|
||||
{
|
||||
"path": "namespace",
|
||||
"fieldRef": {
|
||||
"apiVersion": "v1",
|
||||
"fieldPath": "metadata.namespace"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultMode": 420
|
||||
}
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
{
|
||||
"name": "nginx",
|
||||
"image": "nginx",
|
||||
"resources": {
|
||||
"limits": {
|
||||
"cpu": "3",
|
||||
"memory": "5Gi",
|
||||
"nvidia.com/gpu": "5"
|
||||
},
|
||||
"requests": {
|
||||
"cpu": "3",
|
||||
"memory": "5Gi",
|
||||
"nvidia.com/gpu": "5"
|
||||
}
|
||||
},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "kube-api-access-sjnlv",
|
||||
"readOnly": true,
|
||||
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"terminationMessagePolicy": "File",
|
||||
"imagePullPolicy": "IfNotPresent"
|
||||
}
|
||||
],
|
||||
"restartPolicy": "Always",
|
||||
"terminationGracePeriodSeconds": 30,
|
||||
"dnsPolicy": "ClusterFirst",
|
||||
"serviceAccountName": "default",
|
||||
"serviceAccount": "default",
|
||||
"securityContext": {},
|
||||
"schedulerName": "default-scheduler",
|
||||
"tolerations": [
|
||||
{
|
||||
"key": "node.kubernetes.io/not-ready",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/unreachable",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
}
|
||||
],
|
||||
"priority": 0,
|
||||
"enableServiceLinks": true,
|
||||
"preemptionPolicy": "PreemptLowerPriority"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Pending",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "PodScheduled",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:20:29Z",
|
||||
"reason": "Unschedulable",
|
||||
"message": "0/1 nodes are available: 1 Insufficient nvidia.com/gpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod."
|
||||
}
|
||||
],
|
||||
"qosClass": "Guaranteed"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,284 @@
|
||||
{
|
||||
"kind": "PodList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "981519"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Pod",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo",
|
||||
"namespace": "message-pod-crashloop-backoff",
|
||||
"uid": "8d27f35a-4b45-4752-a5db-7985ea8b38bf",
|
||||
"resourceVersion": "981491",
|
||||
"creationTimestamp": "2023-07-11T03:31:41Z",
|
||||
"annotations": {
|
||||
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"init-demo\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"command\":[\"wge\",\"-O\",\"/work-dir/index.html\",\"https://home.robusta.dev\"],\"image\":\"nginx\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]}]}}\n"
|
||||
},
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubectl-client-side-apply",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:31:41Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:annotations": {
|
||||
".": {},
|
||||
"f:kubectl.kubernetes.io/last-applied-configuration": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:containers": {
|
||||
"k:{\"name\":\"nginx\"}": {
|
||||
".": {},
|
||||
"f:command": {},
|
||||
"f:image": {},
|
||||
"f:imagePullPolicy": {},
|
||||
"f:name": {},
|
||||
"f:ports": {
|
||||
".": {},
|
||||
"k:{\"containerPort\":80,\"protocol\":\"TCP\"}": {
|
||||
".": {},
|
||||
"f:containerPort": {},
|
||||
"f:protocol": {}
|
||||
}
|
||||
},
|
||||
"f:resources": {},
|
||||
"f:terminationMessagePath": {},
|
||||
"f:terminationMessagePolicy": {}
|
||||
}
|
||||
},
|
||||
"f:dnsPolicy": {},
|
||||
"f:enableServiceLinks": {},
|
||||
"f:restartPolicy": {},
|
||||
"f:schedulerName": {},
|
||||
"f:securityContext": {},
|
||||
"f:terminationGracePeriodSeconds": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T03:33:23Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:conditions": {
|
||||
"k:{\"type\":\"ContainersReady\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Initialized\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Ready\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
}
|
||||
},
|
||||
"f:containerStatuses": {},
|
||||
"f:hostIP": {},
|
||||
"f:phase": {},
|
||||
"f:podIP": {},
|
||||
"f:podIPs": {
|
||||
".": {},
|
||||
"k:{\"ip\":\"172.17.0.3\"}": {
|
||||
".": {},
|
||||
"f:ip": {}
|
||||
}
|
||||
},
|
||||
"f:startTime": {}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"volumes": [
|
||||
{
|
||||
"name": "kube-api-access-htb9q",
|
||||
"projected": {
|
||||
"sources": [
|
||||
{
|
||||
"serviceAccountToken": {
|
||||
"expirationSeconds": 3607,
|
||||
"path": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"configMap": {
|
||||
"name": "kube-root-ca.crt",
|
||||
"items": [
|
||||
{
|
||||
"key": "ca.crt",
|
||||
"path": "ca.crt"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"downwardAPI": {
|
||||
"items": [
|
||||
{
|
||||
"path": "namespace",
|
||||
"fieldRef": {
|
||||
"apiVersion": "v1",
|
||||
"fieldPath": "metadata.namespace"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultMode": 420
|
||||
}
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
{
|
||||
"name": "nginx",
|
||||
"image": "nginx",
|
||||
"command": [
|
||||
"wge",
|
||||
"-O",
|
||||
"/work-dir/index.html",
|
||||
"https://home.robusta.dev"
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"containerPort": 80,
|
||||
"protocol": "TCP"
|
||||
}
|
||||
],
|
||||
"resources": {},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "kube-api-access-htb9q",
|
||||
"readOnly": true,
|
||||
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"terminationMessagePolicy": "File",
|
||||
"imagePullPolicy": "Always"
|
||||
}
|
||||
],
|
||||
"restartPolicy": "Always",
|
||||
"terminationGracePeriodSeconds": 30,
|
||||
"dnsPolicy": "ClusterFirst",
|
||||
"serviceAccountName": "default",
|
||||
"serviceAccount": "default",
|
||||
"nodeName": "minikube",
|
||||
"securityContext": {},
|
||||
"schedulerName": "default-scheduler",
|
||||
"tolerations": [
|
||||
{
|
||||
"key": "node.kubernetes.io/not-ready",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/unreachable",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
}
|
||||
],
|
||||
"priority": 0,
|
||||
"enableServiceLinks": true,
|
||||
"preemptionPolicy": "PreemptLowerPriority"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Running",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "Initialized",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T03:31:41Z"
|
||||
},
|
||||
{
|
||||
"type": "Ready",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T03:31:41Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [nginx]"
|
||||
},
|
||||
{
|
||||
"type": "ContainersReady",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T03:31:41Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [nginx]"
|
||||
},
|
||||
{
|
||||
"type": "PodScheduled",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T03:31:41Z"
|
||||
}
|
||||
],
|
||||
"hostIP": "192.168.49.2",
|
||||
"podIP": "172.17.0.3",
|
||||
"podIPs": [
|
||||
{
|
||||
"ip": "172.17.0.3"
|
||||
}
|
||||
],
|
||||
"startTime": "2023-07-11T03:31:41Z",
|
||||
"containerStatuses": [
|
||||
{
|
||||
"name": "nginx",
|
||||
"state": {
|
||||
"waiting": {
|
||||
"reason": "CrashLoopBackOff",
|
||||
"message": "back-off 1m20s restarting failed container=nginx pod=init-demo_default(8d27f35a-4b45-4752-a5db-7985ea8b38bf)"
|
||||
}
|
||||
},
|
||||
"lastState": {
|
||||
"terminated": {
|
||||
"exitCode": 127,
|
||||
"reason": "ContainerCannotRun",
|
||||
"message": "failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \"wge\": executable file not found in $PATH: unknown",
|
||||
"startedAt": "2023-07-11T03:33:15Z",
|
||||
"finishedAt": "2023-07-11T03:33:15Z",
|
||||
"containerID": "docker://c04bcccbdc5eee8f0fc1b88c85c9b31e79f963dbee75fda97c022938222c8d90"
|
||||
}
|
||||
},
|
||||
"ready": false,
|
||||
"restartCount": 4,
|
||||
"image": "nginx:latest",
|
||||
"imageID": "docker-pullable://nginx@sha256:08bc36ad52474e528cc1ea3426b5e3f4bad8a130318e3140d6cfe29c8892c7ef",
|
||||
"containerID": "docker://c04bcccbdc5eee8f0fc1b88c85c9b31e79f963dbee75fda97c022938222c8d90",
|
||||
"started": false
|
||||
}
|
||||
],
|
||||
"qosClass": "BestEffort"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,368 @@
|
||||
{
|
||||
"kind": "PodList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "982711"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "Pod",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "init-demo2",
|
||||
"namespace": "message-pod-init-crashloop-backoff",
|
||||
"uid": "5a560e83-c634-4c91-b308-510ee692ed6a",
|
||||
"resourceVersion": "982707",
|
||||
"creationTimestamp": "2023-07-11T04:01:16Z",
|
||||
"annotations": {
|
||||
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"init-demo2\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}],\"volumeMounts\":[{\"mountPath\":\"/usr/share/nginx/html\",\"name\":\"workdir\"}]}],\"dnsPolicy\":\"Default\",\"initContainers\":[{\"command\":[\"wge\",\"-O\",\"/work-dir/index.html\",\"https://home.robusta.dev\"],\"image\":\"busybox:1.28\",\"name\":\"install\",\"volumeMounts\":[{\"mountPath\":\"/work-dir\",\"name\":\"workdir\"}]}],\"volumes\":[{\"emptyDir\":{},\"name\":\"workdir\"}]}}\n"
|
||||
},
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "kubectl-client-side-apply",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:01:16Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:annotations": {
|
||||
".": {},
|
||||
"f:kubectl.kubernetes.io/last-applied-configuration": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:containers": {
|
||||
"k:{\"name\":\"nginx\"}": {
|
||||
".": {},
|
||||
"f:image": {},
|
||||
"f:imagePullPolicy": {},
|
||||
"f:name": {},
|
||||
"f:ports": {
|
||||
".": {},
|
||||
"k:{\"containerPort\":80,\"protocol\":\"TCP\"}": {
|
||||
".": {},
|
||||
"f:containerPort": {},
|
||||
"f:protocol": {}
|
||||
}
|
||||
},
|
||||
"f:resources": {},
|
||||
"f:terminationMessagePath": {},
|
||||
"f:terminationMessagePolicy": {},
|
||||
"f:volumeMounts": {
|
||||
".": {},
|
||||
"k:{\"mountPath\":\"/usr/share/nginx/html\"}": {
|
||||
".": {},
|
||||
"f:mountPath": {},
|
||||
"f:name": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"f:dnsPolicy": {},
|
||||
"f:enableServiceLinks": {},
|
||||
"f:initContainers": {
|
||||
".": {},
|
||||
"k:{\"name\":\"install\"}": {
|
||||
".": {},
|
||||
"f:command": {},
|
||||
"f:image": {},
|
||||
"f:imagePullPolicy": {},
|
||||
"f:name": {},
|
||||
"f:resources": {},
|
||||
"f:terminationMessagePath": {},
|
||||
"f:terminationMessagePolicy": {},
|
||||
"f:volumeMounts": {
|
||||
".": {},
|
||||
"k:{\"mountPath\":\"/work-dir\"}": {
|
||||
".": {},
|
||||
"f:mountPath": {},
|
||||
"f:name": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"f:restartPolicy": {},
|
||||
"f:schedulerName": {},
|
||||
"f:securityContext": {},
|
||||
"f:terminationGracePeriodSeconds": {},
|
||||
"f:volumes": {
|
||||
".": {},
|
||||
"k:{\"name\":\"workdir\"}": {
|
||||
".": {},
|
||||
"f:emptyDir": {},
|
||||
"f:name": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "kubelet",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-07-11T04:01:23Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:conditions": {
|
||||
"k:{\"type\":\"ContainersReady\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Initialized\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
},
|
||||
"k:{\"type\":\"Ready\"}": {
|
||||
".": {},
|
||||
"f:lastProbeTime": {},
|
||||
"f:lastTransitionTime": {},
|
||||
"f:message": {},
|
||||
"f:reason": {},
|
||||
"f:status": {},
|
||||
"f:type": {}
|
||||
}
|
||||
},
|
||||
"f:containerStatuses": {},
|
||||
"f:hostIP": {},
|
||||
"f:initContainerStatuses": {},
|
||||
"f:podIP": {},
|
||||
"f:podIPs": {
|
||||
".": {},
|
||||
"k:{\"ip\":\"172.17.0.3\"}": {
|
||||
".": {},
|
||||
"f:ip": {}
|
||||
}
|
||||
},
|
||||
"f:startTime": {}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"volumes": [
|
||||
{
|
||||
"name": "workdir",
|
||||
"emptyDir": {}
|
||||
},
|
||||
{
|
||||
"name": "kube-api-access-w4mrq",
|
||||
"projected": {
|
||||
"sources": [
|
||||
{
|
||||
"serviceAccountToken": {
|
||||
"expirationSeconds": 3607,
|
||||
"path": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"configMap": {
|
||||
"name": "kube-root-ca.crt",
|
||||
"items": [
|
||||
{
|
||||
"key": "ca.crt",
|
||||
"path": "ca.crt"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"downwardAPI": {
|
||||
"items": [
|
||||
{
|
||||
"path": "namespace",
|
||||
"fieldRef": {
|
||||
"apiVersion": "v1",
|
||||
"fieldPath": "metadata.namespace"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultMode": 420
|
||||
}
|
||||
}
|
||||
],
|
||||
"initContainers": [
|
||||
{
|
||||
"name": "install",
|
||||
"image": "busybox:1.28",
|
||||
"command": [
|
||||
"wge",
|
||||
"-O",
|
||||
"/work-dir/index.html",
|
||||
"https://home.robusta.dev"
|
||||
],
|
||||
"resources": {},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "workdir",
|
||||
"mountPath": "/work-dir"
|
||||
},
|
||||
{
|
||||
"name": "kube-api-access-w4mrq",
|
||||
"readOnly": true,
|
||||
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"terminationMessagePolicy": "File",
|
||||
"imagePullPolicy": "IfNotPresent"
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
{
|
||||
"name": "nginx",
|
||||
"image": "nginx",
|
||||
"ports": [
|
||||
{
|
||||
"containerPort": 80,
|
||||
"protocol": "TCP"
|
||||
}
|
||||
],
|
||||
"resources": {},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "workdir",
|
||||
"mountPath": "/usr/share/nginx/html"
|
||||
},
|
||||
{
|
||||
"name": "kube-api-access-w4mrq",
|
||||
"readOnly": true,
|
||||
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"terminationMessagePolicy": "File",
|
||||
"imagePullPolicy": "Always"
|
||||
}
|
||||
],
|
||||
"restartPolicy": "Always",
|
||||
"terminationGracePeriodSeconds": 30,
|
||||
"dnsPolicy": "Default",
|
||||
"serviceAccountName": "default",
|
||||
"serviceAccount": "default",
|
||||
"nodeName": "minikube",
|
||||
"securityContext": {},
|
||||
"schedulerName": "default-scheduler",
|
||||
"tolerations": [
|
||||
{
|
||||
"key": "node.kubernetes.io/not-ready",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
},
|
||||
{
|
||||
"key": "node.kubernetes.io/unreachable",
|
||||
"operator": "Exists",
|
||||
"effect": "NoExecute",
|
||||
"tolerationSeconds": 300
|
||||
}
|
||||
],
|
||||
"priority": 0,
|
||||
"enableServiceLinks": true,
|
||||
"preemptionPolicy": "PreemptLowerPriority"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Pending",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "Initialized",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:01:16Z",
|
||||
"reason": "ContainersNotInitialized",
|
||||
"message": "containers with incomplete status: [install]"
|
||||
},
|
||||
{
|
||||
"type": "Ready",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:01:16Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [nginx]"
|
||||
},
|
||||
{
|
||||
"type": "ContainersReady",
|
||||
"status": "False",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:01:16Z",
|
||||
"reason": "ContainersNotReady",
|
||||
"message": "containers with unready status: [nginx]"
|
||||
},
|
||||
{
|
||||
"type": "PodScheduled",
|
||||
"status": "True",
|
||||
"lastProbeTime": null,
|
||||
"lastTransitionTime": "2023-07-11T04:01:16Z"
|
||||
}
|
||||
],
|
||||
"hostIP": "192.168.49.2",
|
||||
"podIP": "172.17.0.3",
|
||||
"podIPs": [
|
||||
{
|
||||
"ip": "172.17.0.3"
|
||||
}
|
||||
],
|
||||
"startTime": "2023-07-11T04:01:16Z",
|
||||
"initContainerStatuses": [
|
||||
{
|
||||
"name": "install",
|
||||
"state": {
|
||||
"waiting": {
|
||||
"reason": "RunContainerError",
|
||||
"message": "failed to start container \"b201927f10154b9ab9913f65aa13b46e5eeed74b8efff500d11e3f08af09621b\": Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \"wge\": executable file not found in $PATH: unknown"
|
||||
}
|
||||
},
|
||||
"lastState": {
|
||||
"terminated": {
|
||||
"exitCode": 127,
|
||||
"reason": "ContainerCannotRun",
|
||||
"message": "failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \"wge\": executable file not found in $PATH: unknown",
|
||||
"startedAt": "2023-07-11T04:01:16Z",
|
||||
"finishedAt": "2023-07-11T04:01:16Z",
|
||||
"containerID": "docker://b201927f10154b9ab9913f65aa13b46e5eeed74b8efff500d11e3f08af09621b"
|
||||
}
|
||||
},
|
||||
"ready": false,
|
||||
"restartCount": 1,
|
||||
"image": "busybox:1.28",
|
||||
"imageID": "docker-pullable://busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47",
|
||||
"containerID": "docker://b201927f10154b9ab9913f65aa13b46e5eeed74b8efff500d11e3f08af09621b"
|
||||
}
|
||||
],
|
||||
"containerStatuses": [
|
||||
{
|
||||
"name": "nginx",
|
||||
"state": {
|
||||
"waiting": {
|
||||
"reason": "PodInitializing"
|
||||
}
|
||||
},
|
||||
"lastState": {},
|
||||
"ready": false,
|
||||
"restartCount": 0,
|
||||
"image": "nginx",
|
||||
"imageID": "",
|
||||
"started": false
|
||||
}
|
||||
],
|
||||
"qosClass": "BestEffort"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
{
|
||||
"kind": "PersistentVolumeClaimList",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"resourceVersion": "1463098"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"kind": "PersistentVolumeClaim",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "data-postgresql-0",
|
||||
"namespace": "default",
|
||||
"uid": "b733694c-a969-4763-9960-d3465c9fccd5",
|
||||
"resourceVersion": "1364772",
|
||||
"creationTimestamp": "2023-05-15T21:22:00Z",
|
||||
"labels": {
|
||||
"app.kubernetes.io/component": "primary",
|
||||
"app.kubernetes.io/instance": "some-app",
|
||||
"app.kubernetes.io/name": "postgresql"
|
||||
},
|
||||
"annotations": {
|
||||
"pv.kubernetes.io/bind-completed": "yes",
|
||||
"pv.kubernetes.io/bound-by-controller": "yes",
|
||||
"volume.beta.kubernetes.io/storage-provisioner": "rancher.io/local-path",
|
||||
"volume.kubernetes.io/selected-node": "k3d-mycluster-server-0"
|
||||
},
|
||||
"finalizers": [
|
||||
"kubernetes.io/pvc-protection"
|
||||
],
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "k3s",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-05-15T21:22:07Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:annotations": {
|
||||
".": {},
|
||||
"f:pv.kubernetes.io/bind-completed": {},
|
||||
"f:pv.kubernetes.io/bound-by-controller": {},
|
||||
"f:volume.beta.kubernetes.io/storage-provisioner": {},
|
||||
"f:volume.kubernetes.io/selected-node": {}
|
||||
},
|
||||
"f:labels": {
|
||||
".": {},
|
||||
"f:app.kubernetes.io/component": {},
|
||||
"f:app.kubernetes.io/instance": {},
|
||||
"f:app.kubernetes.io/name": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:accessModes": {},
|
||||
"f:resources": {
|
||||
"f:requests": {
|
||||
".": {},
|
||||
"f:storage": {}
|
||||
}
|
||||
},
|
||||
"f:volumeMode": {},
|
||||
"f:volumeName": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "k3s",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-05-15T21:22:07Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:accessModes": {},
|
||||
"f:capacity": {
|
||||
".": {},
|
||||
"f:storage": {}
|
||||
},
|
||||
"f:phase": {}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"accessModes": [
|
||||
"ReadWriteOnce"
|
||||
],
|
||||
"resources": {
|
||||
"requests": {
|
||||
"storage": "8Gi"
|
||||
}
|
||||
},
|
||||
"volumeName": "pvc-b733694c-a969-4763-9960-d3465c9fccd5",
|
||||
"storageClassName": "local-path",
|
||||
"volumeMode": "Filesystem"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Bound",
|
||||
"accessModes": [
|
||||
"ReadWriteOnce"
|
||||
],
|
||||
"capacity": {
|
||||
"storage": "8Gi"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"kind": "PersistentVolumeClaim",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "redis-data-redis-replicas-0",
|
||||
"namespace": "default",
|
||||
"uid": "4e0ec7d1-5ff1-4054-bede-4cbffec0f595",
|
||||
"resourceVersion": "1450618",
|
||||
"creationTimestamp": "2023-05-25T15:45:35Z",
|
||||
"labels": {
|
||||
"app.kubernetes.io/component": "replica",
|
||||
"app.kubernetes.io/instance": "some-app",
|
||||
"app.kubernetes.io/name": "redis"
|
||||
},
|
||||
"annotations": {
|
||||
"pv.kubernetes.io/bind-completed": "yes",
|
||||
"pv.kubernetes.io/bound-by-controller": "yes",
|
||||
"volume.beta.kubernetes.io/storage-provisioner": "rancher.io/local-path",
|
||||
"volume.kubernetes.io/selected-node": "k3d-mycluster-server-0"
|
||||
},
|
||||
"finalizers": [
|
||||
"kubernetes.io/pvc-protection"
|
||||
],
|
||||
"managedFields": [
|
||||
{
|
||||
"manager": "k3s",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-05-25T15:45:41Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:metadata": {
|
||||
"f:annotations": {
|
||||
".": {},
|
||||
"f:pv.kubernetes.io/bind-completed": {},
|
||||
"f:pv.kubernetes.io/bound-by-controller": {},
|
||||
"f:volume.beta.kubernetes.io/storage-provisioner": {},
|
||||
"f:volume.kubernetes.io/selected-node": {}
|
||||
},
|
||||
"f:labels": {
|
||||
".": {},
|
||||
"f:app.kubernetes.io/component": {},
|
||||
"f:app.kubernetes.io/instance": {},
|
||||
"f:app.kubernetes.io/name": {}
|
||||
}
|
||||
},
|
||||
"f:spec": {
|
||||
"f:accessModes": {},
|
||||
"f:resources": {
|
||||
"f:requests": {
|
||||
".": {},
|
||||
"f:storage": {}
|
||||
}
|
||||
},
|
||||
"f:volumeMode": {},
|
||||
"f:volumeName": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"manager": "k3s",
|
||||
"operation": "Update",
|
||||
"apiVersion": "v1",
|
||||
"time": "2023-05-25T15:45:41Z",
|
||||
"fieldsType": "FieldsV1",
|
||||
"fieldsV1": {
|
||||
"f:status": {
|
||||
"f:accessModes": {},
|
||||
"f:capacity": {
|
||||
".": {},
|
||||
"f:storage": {}
|
||||
},
|
||||
"f:phase": {}
|
||||
}
|
||||
},
|
||||
"subresource": "status"
|
||||
}
|
||||
]
|
||||
},
|
||||
"spec": {
|
||||
"accessModes": [
|
||||
"ReadWriteMany"
|
||||
],
|
||||
"resources": {
|
||||
"requests": {
|
||||
"storage": "8Gi"
|
||||
}
|
||||
},
|
||||
"volumeName": "pvc-4e0ec7d1-5ff1-4054-bede-4cbffec0f595",
|
||||
"storageClassName": "local-path",
|
||||
"volumeMode": "Filesystem"
|
||||
},
|
||||
"status": {
|
||||
"phase": "Bound",
|
||||
"accessModes": [
|
||||
"ReadWriteMany"
|
||||
],
|
||||
"capacity": {
|
||||
"storage": "8Gi"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubl
|
||||
type HostAnalyzer interface {
|
||||
Title() string
|
||||
IsExcluded() (bool, error)
|
||||
Analyze(getFile func(string) ([]byte, error)) ([]*AnalyzeResult, error)
|
||||
Analyze(getFile func(string) ([]byte, error), findFiles getChildCollectedFileContents) ([]*AnalyzeResult, error)
|
||||
}
|
||||
|
||||
func GetHostAnalyzer(analyzer *troubleshootv1beta2.HostAnalyze) (HostAnalyzer, bool) {
|
||||
@@ -44,10 +44,14 @@ func GetHostAnalyzer(analyzer *troubleshootv1beta2.HostAnalyze) (HostAnalyzer, b
|
||||
return &AnalyzeHostFilesystemPerformance{analyzer.FilesystemPerformance}, true
|
||||
case analyzer.Certificate != nil:
|
||||
return &AnalyzeHostCertificate{analyzer.Certificate}, true
|
||||
case analyzer.CertificatesCollection != nil:
|
||||
return &AnalyzeHostCertificatesCollection{analyzer.CertificatesCollection}, true
|
||||
case analyzer.HostServices != nil:
|
||||
return &AnalyzeHostServices{analyzer.HostServices}, true
|
||||
case analyzer.HostOS != nil:
|
||||
return &AnalyzeHostOS{analyzer.HostOS}, true
|
||||
case analyzer.TextAnalyze != nil:
|
||||
return &AnalyzeHostTextAnalyze{analyzer.TextAnalyze}, true
|
||||
default:
|
||||
return nil, false
|
||||
}
|
||||
|
||||
@@ -24,7 +24,9 @@ func (a *AnalyzeHostBlockDevices) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostBlockDevices) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostBlockDevices) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
contents, err := getCollectedFileContents(collect.HostBlockDevicesPath)
|
||||
|
||||
@@ -265,7 +265,7 @@ func TestAnalyzeBlockDevices(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostBlockDevices{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostBlockDevices{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -20,7 +20,9 @@ func (a *AnalyzeHostCertificate) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostCertificate) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostCertificate) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
collectorName := hostAnalyzer.CollectorName
|
||||
|
||||
@@ -332,7 +332,7 @@ func TestAnalyzeCertificate(t *testing.T) {
|
||||
return []byte(test.status), nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostCertificate{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostCertificate{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/collect"
|
||||
)
|
||||
|
||||
type AnalyzeHostCertificatesCollection struct {
|
||||
hostAnalyzer *troubleshootv1beta2.HostCertificatesCollectionAnalyze
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostCertificatesCollection) Title() string {
|
||||
return hostAnalyzerTitleOrDefault(a.hostAnalyzer.AnalyzeMeta, "Host Certificates Collection")
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostCertificatesCollection) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostCertificatesCollection) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
collectorName := hostAnalyzer.CollectorName
|
||||
if collectorName == "" {
|
||||
collectorName = "certificatesCollection"
|
||||
}
|
||||
name := filepath.Join("host-collectors/certificatesCollection", collectorName+".json")
|
||||
|
||||
certificatesInfo, err := getCollectedFileContents(name)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to get contents of certificatesCollection.json")
|
||||
}
|
||||
|
||||
collectorCertificates := []collect.HostCertificatesCollection{}
|
||||
if err := json.Unmarshal(certificatesInfo, &collectorCertificates); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse certificatesCollection.json")
|
||||
}
|
||||
|
||||
var coll resultCollector
|
||||
|
||||
for _, cert := range collectorCertificates {
|
||||
|
||||
source := ""
|
||||
|
||||
if cert.CertificatePath != "" {
|
||||
source = fmt.Sprintf("obtained from %s", cert.CertificatePath)
|
||||
}
|
||||
|
||||
if cert.Message == collect.CertMissing {
|
||||
// return the result immediately if the certificate is missing
|
||||
coll.push(&AnalyzeResult{
|
||||
Title: a.Title(),
|
||||
IsFail: true,
|
||||
Message: fmt.Sprintf("Certificate is missing, cannot be %s", source),
|
||||
})
|
||||
} else {
|
||||
results, err := a.analyzeHostAnalyzeCertificatesResult(cert.CertificateChain, hostAnalyzer.Outcomes, source)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, result := range results {
|
||||
coll.push(result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return coll.get(a.Title()), nil
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostCertificatesCollection) analyzeHostAnalyzeCertificatesResult(certificateChains []collect.ParsedCertificate, outcomes []*troubleshootv1beta2.Outcome, source string) ([]*AnalyzeResult, error) {
|
||||
var coll resultCollector
|
||||
var passResults []*AnalyzeResult
|
||||
when := ""
|
||||
message := ""
|
||||
|
||||
for _, certChain := range certificateChains {
|
||||
for _, outcome := range outcomes {
|
||||
result := &AnalyzeResult{
|
||||
Title: a.Title(),
|
||||
}
|
||||
|
||||
if outcome.Fail != nil {
|
||||
result.IsFail = true
|
||||
when = outcome.Fail.When
|
||||
message = outcome.Fail.Message
|
||||
} else if outcome.Warn != nil {
|
||||
result.IsWarn = true
|
||||
when = outcome.Warn.When
|
||||
message = outcome.Warn.Message
|
||||
} else if outcome.Pass != nil {
|
||||
result.IsPass = true
|
||||
when = outcome.Pass.When
|
||||
message = outcome.Pass.Message
|
||||
} else {
|
||||
return nil, errors.New("empty outcome")
|
||||
}
|
||||
|
||||
if result.IsPass && certChain.IsValid {
|
||||
result.Message = fmt.Sprintf("%s, %s", message, source)
|
||||
// if the certificate is valid, we need to wait for the warning check whether the certificate is going to expire
|
||||
passResults = append(passResults, result)
|
||||
}
|
||||
|
||||
if result.IsFail && !certChain.IsValid {
|
||||
result.Message = fmt.Sprintf("%s, %s", message, source)
|
||||
// return the result immediately if the certificate is invalid
|
||||
coll.push(result)
|
||||
}
|
||||
|
||||
if result.IsWarn && certChain.IsValid {
|
||||
warnDate, _ := regexp.Compile(`notAfter \< Today \+ (\d+) days`)
|
||||
warnMatch := warnDate.FindStringSubmatch(when)
|
||||
if warnMatch != nil {
|
||||
warnMatchDays, err := strconv.Atoi(warnMatch[1])
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to convert string to integer")
|
||||
}
|
||||
|
||||
targetTime := time.Now().AddDate(0, 0, warnMatchDays)
|
||||
|
||||
if targetTime.After(certChain.NotAfter) {
|
||||
result.Message = fmt.Sprintf("%s in %d days, %s", message, warnMatchDays, source)
|
||||
// discard passResults if the certificate is going to expire in certain days
|
||||
passResults = []*AnalyzeResult{}
|
||||
coll.push(result)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// append passResults if the certificate is valid and not going to expire in certain days
|
||||
for _, passResult := range passResults {
|
||||
coll.push(passResult)
|
||||
}
|
||||
}
|
||||
return coll.results, nil
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestAnalyzeHostCertificatesCollection(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
file string
|
||||
hostAnalyzer *troubleshootv1beta2.HostCertificatesCollectionAnalyze
|
||||
result []*AnalyzeResult
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
name: "certificate-valid",
|
||||
file: fmt.Sprintf(`[{
|
||||
"certificatePath": "apiserver-kubelet-client.crt",
|
||||
"certificateChain": [
|
||||
{
|
||||
"certificate": "ca.crt",
|
||||
"subject": "CN=kubernetes",
|
||||
"subjectAlternativeNames": [
|
||||
"kubernetes"
|
||||
],
|
||||
"issuer": "CN=kubernetes",
|
||||
"notAfter": "%s",
|
||||
"notBefore": "2023-04-19T00:30:20Z",
|
||||
"isValid": true,
|
||||
"isCA": true
|
||||
}
|
||||
],
|
||||
"message": "cert-valid"
|
||||
}]`, time.Now().AddDate(1, 0, 0).Format("2006-01-02T15:04:05Z")),
|
||||
hostAnalyzer: &troubleshootv1beta2.HostCertificatesCollectionAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "Certificate is valid",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "Host Certificates Collection",
|
||||
Message: "Certificate is valid, obtained from apiserver-kubelet-client.crt",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "certificate-invalid",
|
||||
file: `[{
|
||||
"certificatePath": "apiserver-kubelet-client.crt",
|
||||
"certificateChain": [
|
||||
{
|
||||
"certificate": "ca.crt",
|
||||
"subject": "CN=kubernetes",
|
||||
"subjectAlternativeNames": [
|
||||
"kubernetes"
|
||||
],
|
||||
"issuer": "CN=kubernetes",
|
||||
"notAfter": "2022-04-16T00:30:20Z",
|
||||
"notBefore": "2021-04-19T00:30:20Z",
|
||||
"isValid": false,
|
||||
"isCA": true
|
||||
}
|
||||
],
|
||||
"message": "cert-invalid"
|
||||
}]`,
|
||||
hostAnalyzer: &troubleshootv1beta2.HostCertificatesCollectionAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "notAfter < Today",
|
||||
Message: "Certificate has expired",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: false,
|
||||
IsFail: true,
|
||||
Title: "Host Certificates Collection",
|
||||
Message: "Certificate has expired, obtained from apiserver-kubelet-client.crt",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "certificate-about-to-expire",
|
||||
file: fmt.Sprintf(`[{
|
||||
"certificatePath": "apiserver-kubelet-client.crt",
|
||||
"certificateChain": [
|
||||
{
|
||||
"certificate": "ca.crt",
|
||||
"subject": "CN=kubernetes",
|
||||
"subjectAlternativeNames": [
|
||||
"kubernetes"
|
||||
],
|
||||
"issuer": "CN=kubernetes",
|
||||
"notAfter": "%s",
|
||||
"notBefore": "2021-04-19T00:30:20Z",
|
||||
"isValid": true,
|
||||
"isCA": true
|
||||
}
|
||||
],
|
||||
"message": "cert-valid"
|
||||
}]`, time.Now().AddDate(0, 0, 5).Format("2006-01-02T15:04:05Z")),
|
||||
hostAnalyzer: &troubleshootv1beta2.HostCertificatesCollectionAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "notAfter < Today + 15 days",
|
||||
Message: "Certificate is about to expire",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "Host Certificates Collection",
|
||||
Message: "Certificate is about to expire in 15 days, obtained from apiserver-kubelet-client.crt",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "certificate-missing",
|
||||
file: `[{
|
||||
"certificatePath": "apiserver-kubelet-client.crt",
|
||||
"message": "cert-missing"
|
||||
}]`,
|
||||
hostAnalyzer: &troubleshootv1beta2.HostCertificatesCollectionAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: false,
|
||||
IsFail: true,
|
||||
Title: "Host Certificates Collection",
|
||||
Message: "Certificate is missing, cannot be obtained from apiserver-kubelet-client.crt",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "certificate-valid-and-about-to-expire",
|
||||
file: fmt.Sprintf(`[{
|
||||
"certificatePath": "apiserver-kubelet-client.crt",
|
||||
"certificateChain": [
|
||||
{
|
||||
"certificate": "ca.crt",
|
||||
"subject": "CN=kubernetes",
|
||||
"subjectAlternativeNames": [
|
||||
"kubernetes"
|
||||
],
|
||||
"issuer": "CN=kubernetes",
|
||||
"notAfter": "%s",
|
||||
"notBefore": "2021-04-19T00:30:20Z",
|
||||
"isValid": true,
|
||||
"isCA": true
|
||||
}
|
||||
],
|
||||
"message": "cert-valid"
|
||||
}]`, time.Now().AddDate(0, 0, 5).Format("2006-01-02T15:04:05Z")),
|
||||
hostAnalyzer: &troubleshootv1beta2.HostCertificatesCollectionAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "Certificate is valid",
|
||||
},
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "notAfter < Today + 15 days",
|
||||
Message: "Certificate is about to expire",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
IsPass: false,
|
||||
IsWarn: true,
|
||||
IsFail: false,
|
||||
Title: "Host Certificates Collection",
|
||||
Message: "Certificate is about to expire in 15 days, obtained from apiserver-kubelet-client.crt",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
req := require.New(t)
|
||||
|
||||
getCollectedFileContents := func(filename string) ([]byte, error) {
|
||||
return []byte(test.file), nil
|
||||
}
|
||||
|
||||
a := AnalyzeHostCertificatesCollection{
|
||||
test.hostAnalyzer,
|
||||
}
|
||||
|
||||
result, err := a.Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
req.NoError(err)
|
||||
}
|
||||
|
||||
assert.Equal(t, test.result, result)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,9 @@ func (a *AnalyzeHostCPU) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostCPU) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostCPU) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
contents, err := getCollectedFileContents(collect.HostCPUPath)
|
||||
|
||||
@@ -204,7 +204,7 @@ func TestHostCpuAnalyze(t *testing.T) {
|
||||
Outcomes: tc.outcomes,
|
||||
},
|
||||
}
|
||||
results, err := analyzer.Analyze(fn)
|
||||
results, err := analyzer.Analyze(fn, nil)
|
||||
if tc.wantErr {
|
||||
require.NotNil(t, err)
|
||||
return
|
||||
|
||||
@@ -25,7 +25,9 @@ func (a *AnalyzeHostDiskUsage) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostDiskUsage) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostDiskUsage) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
name := filepath.Join("host-collectors/diskUsage", "diskUsage.json")
|
||||
|
||||
@@ -412,7 +412,7 @@ func TestAnalyzeHostDiskUsage(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostDiskUsage{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostDiskUsage{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -27,7 +27,9 @@ func (a *AnalyzeHostFilesystemPerformance) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostFilesystemPerformance) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostFilesystemPerformance) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
collectorName := hostAnalyzer.CollectorName
|
||||
|
||||
@@ -345,7 +345,7 @@ func TestAnalyzeHostFilesystemPerformance(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostFilesystemPerformance{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostFilesystemPerformance{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -29,7 +29,9 @@ func (a *AnalyzeHostHTTP) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostHTTP) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostHTTP) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
name := filepath.Join("host-collectors/http", "result.json")
|
||||
|
||||
@@ -126,7 +126,7 @@ func TestAnalyzeHostHTTP(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostHTTP{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostHTTP{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -22,7 +22,9 @@ func (a *AnalyzeHostHTTPLoadBalancer) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostHTTPLoadBalancer) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostHTTPLoadBalancer) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
collectorName := hostAnalyzer.CollectorName
|
||||
|
||||
@@ -24,7 +24,9 @@ func (a *AnalyzeHostIPV4Interfaces) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostIPV4Interfaces) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostIPV4Interfaces) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
contents, err := getCollectedFileContents(collect.HostIPV4InterfacesPath)
|
||||
|
||||
@@ -92,7 +92,7 @@ func TestAnalyzeIPV4Interfaces(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostIPV4Interfaces{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostIPV4Interfaces{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -40,7 +40,9 @@ func (a *AnalyzeHostKernelModules) IsExcluded() (bool, error) {
|
||||
// - a default fail will only trigger if there are no matching non-default pass outcomes.
|
||||
// - a default warn will only trigger if there are no matching non-default pass or fail outcomes.
|
||||
// - a default pass will only trigger if there are no matching non-default fail outcomes.
|
||||
func (a *AnalyzeHostKernelModules) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostKernelModules) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
contents, err := getCollectedFileContents(collect.HostKernelModulesPath)
|
||||
if err != nil {
|
||||
|
||||
@@ -470,7 +470,7 @@ func TestAnalyzeKernelModules(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostKernelModules{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostKernelModules{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
require.Error(t, err)
|
||||
return
|
||||
|
||||
@@ -23,7 +23,9 @@ func (a *AnalyzeHostMemory) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostMemory) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostMemory) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
contents, err := getCollectedFileContents(collect.HostMemoryPath)
|
||||
|
||||
@@ -170,7 +170,7 @@ func TestAnalyzeHostMemory(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostMemory{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostMemory{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
@@ -233,7 +233,7 @@ func TestHostMemoryAnalyze(t *testing.T) {
|
||||
Outcomes: tc.outcomes,
|
||||
},
|
||||
}
|
||||
results, err := analyzer.Analyze(fn)
|
||||
results, err := analyzer.Analyze(fn, nil)
|
||||
if tc.wantErr {
|
||||
require.NotNil(t, err)
|
||||
return
|
||||
|
||||
@@ -24,7 +24,9 @@ func (a *AnalyzeHostOS) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostOS) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostOS) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
|
||||
result := AnalyzeResult{}
|
||||
result.Title = a.Title()
|
||||
|
||||
@@ -332,7 +332,7 @@ func TestAnalyzeHostOS(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostOS{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostOS{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -22,7 +22,9 @@ func (a *AnalyzeHostServices) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostServices) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostServices) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
contents, err := getCollectedFileContents(collect.HostServicesPath)
|
||||
|
||||
@@ -93,7 +93,7 @@ func TestAnalyzeHostServices(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostServices{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostServices{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -21,7 +21,9 @@ func (a *AnalyzeHostSubnetAvailable) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostSubnetAvailable) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostSubnetAvailable) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
name := filepath.Join("host-collectors/subnetAvailable", "result.json")
|
||||
|
||||
@@ -28,7 +28,9 @@ func (a *AnalyzeHostSystemPackages) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostSystemPackages) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostSystemPackages) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
packagesFileName := "host-collectors/system/packages.json"
|
||||
|
||||
@@ -102,7 +102,7 @@ func TestAnalyzeSystemPackages(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostSystemPackages{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostSystemPackages{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -21,7 +21,9 @@ func (a *AnalyzeHostTCPConnect) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostTCPConnect) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostTCPConnect) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
collectorName := hostAnalyzer.CollectorName
|
||||
|
||||
@@ -31,6 +31,12 @@ func TestAnalyzeTCPConnect(t *testing.T) {
|
||||
Message: "Connection was refused",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "connected",
|
||||
Message: "Connection was successful",
|
||||
},
|
||||
},
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "Unexpected TCP connection status",
|
||||
@@ -47,7 +53,7 @@ func TestAnalyzeTCPConnect(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "connected, fail",
|
||||
name: "connected, success",
|
||||
info: &collect.NetworkStatusResult{
|
||||
Status: collect.NetworkStatusConnected,
|
||||
},
|
||||
@@ -80,6 +86,40 @@ func TestAnalyzeTCPConnect(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "unknown status",
|
||||
info: &collect.NetworkStatusResult{
|
||||
Status: "test value",
|
||||
},
|
||||
hostAnalyzer: &troubleshootv1beta2.TCPConnectAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "connection-refused",
|
||||
Message: "Connection was refused",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "connected",
|
||||
Message: "Connection was successful",
|
||||
},
|
||||
},
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "Unexpected TCP connection status",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
Title: "TCP Connection Attempt",
|
||||
IsWarn: true,
|
||||
Message: "Unexpected TCP connection status",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
@@ -93,7 +133,7 @@ func TestAnalyzeTCPConnect(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostTCPConnect{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostTCPConnect{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -22,7 +22,9 @@ func (a *AnalyzeHostTCPLoadBalancer) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostTCPLoadBalancer) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
collectorName := hostAnalyzer.CollectorName
|
||||
@@ -42,9 +44,9 @@ func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(strin
|
||||
}
|
||||
|
||||
var coll resultCollector
|
||||
result := &AnalyzeResult{Title: a.Title()}
|
||||
|
||||
for _, outcome := range hostAnalyzer.Outcomes {
|
||||
result := &AnalyzeResult{Title: a.Title()}
|
||||
|
||||
if outcome.Fail != nil {
|
||||
if outcome.Fail.When == "" {
|
||||
@@ -53,6 +55,7 @@ func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(strin
|
||||
result.URI = outcome.Fail.URI
|
||||
|
||||
coll.push(result)
|
||||
break
|
||||
}
|
||||
|
||||
if string(actual.Status) == outcome.Fail.When {
|
||||
@@ -61,6 +64,7 @@ func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(strin
|
||||
result.URI = outcome.Fail.URI
|
||||
|
||||
coll.push(result)
|
||||
break
|
||||
}
|
||||
} else if outcome.Warn != nil {
|
||||
if outcome.Warn.When == "" {
|
||||
@@ -69,6 +73,7 @@ func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(strin
|
||||
result.URI = outcome.Warn.URI
|
||||
|
||||
coll.push(result)
|
||||
break
|
||||
}
|
||||
|
||||
if string(actual.Status) == outcome.Warn.When {
|
||||
@@ -77,6 +82,7 @@ func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(strin
|
||||
result.URI = outcome.Warn.URI
|
||||
|
||||
coll.push(result)
|
||||
break
|
||||
}
|
||||
} else if outcome.Pass != nil {
|
||||
if outcome.Pass.When == "" {
|
||||
@@ -85,6 +91,7 @@ func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(strin
|
||||
result.URI = outcome.Pass.URI
|
||||
|
||||
coll.push(result)
|
||||
break
|
||||
}
|
||||
|
||||
if string(actual.Status) == outcome.Pass.When {
|
||||
@@ -93,6 +100,7 @@ func (a *AnalyzeHostTCPLoadBalancer) Analyze(getCollectedFileContents func(strin
|
||||
result.URI = outcome.Pass.URI
|
||||
|
||||
coll.push(result)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/collect"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestAnalyzeTCPLoadBalancer(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
info *collect.NetworkStatusResult
|
||||
hostAnalyzer *troubleshootv1beta2.TCPLoadBalancerAnalyze
|
||||
result []*AnalyzeResult
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
name: "connection refused, fail",
|
||||
info: &collect.NetworkStatusResult{
|
||||
Status: collect.NetworkStatusConnectionRefused,
|
||||
},
|
||||
hostAnalyzer: &troubleshootv1beta2.TCPLoadBalancerAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "connection-refused",
|
||||
Message: "Connection was refused",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "connected",
|
||||
Message: "Connection was successful",
|
||||
},
|
||||
},
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "Unexpected TCP connection status",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
Title: "TCP Load Balancer",
|
||||
IsFail: true,
|
||||
Message: "Connection was refused",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "connected, success",
|
||||
info: &collect.NetworkStatusResult{
|
||||
Status: collect.NetworkStatusConnected,
|
||||
},
|
||||
hostAnalyzer: &troubleshootv1beta2.TCPLoadBalancerAnalyze{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "connection-refused",
|
||||
Message: "Connection was refused",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "connected",
|
||||
Message: "Connection was successful",
|
||||
},
|
||||
},
|
||||
{
|
||||
Warn: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "Unexpected TCP connection status",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
result: []*AnalyzeResult{
|
||||
{
|
||||
Title: "TCP Load Balancer",
|
||||
IsPass: true,
|
||||
Message: "Connection was successful",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
req := require.New(t)
|
||||
b, err := json.Marshal(test.info)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
getCollectedFileContents := func(filename string) ([]byte, error) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostTCPLoadBalancer{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
req.NoError(err)
|
||||
}
|
||||
|
||||
assert.Equal(t, test.result, result)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,9 @@ func (a *AnalyzeHostTCPPortStatus) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostTCPPortStatus) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostTCPPortStatus) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
fullPath := path.Join("host-collectors/tcpPortStatus", "tcpPortStatus.json")
|
||||
|
||||
@@ -90,7 +90,7 @@ func TestAnalyzeTCPPortStatus(t *testing.T) {
|
||||
analyzer := AnalyzeHostTCPPortStatus{
|
||||
hostAnalyzer: &tc.analyzer,
|
||||
}
|
||||
results, err := analyzer.Analyze(fn)
|
||||
results, err := analyzer.Analyze(fn, nil)
|
||||
if tc.wantErr {
|
||||
require.NotNil(t, err)
|
||||
return
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
)
|
||||
|
||||
// AnalyzeHostTextAnalyze implements HostAnalyzer interface
|
||||
type AnalyzeHostTextAnalyze struct {
|
||||
hostAnalyzer *troubleshootv1beta2.TextAnalyze
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostTextAnalyze) Title() string {
|
||||
return hostAnalyzerTitleOrDefault(a.hostAnalyzer.AnalyzeMeta, "Regular Expression")
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostTextAnalyze) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostTextAnalyze) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
return analyzeTextAnalyze(a.hostAnalyzer, findFiles, a.Title())
|
||||
}
|
||||
@@ -29,7 +29,9 @@ func (a *AnalyzeHostTime) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostTime) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostTime) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
contents, err := getCollectedFileContents(collect.HostTimePath)
|
||||
|
||||
@@ -283,7 +283,7 @@ func TestAnalyzeHostTime(t *testing.T) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
result, err := (&AnalyzeHostTime{test.hostAnalyzer}).Analyze(getCollectedFileContents)
|
||||
result, err := (&AnalyzeHostTime{test.hostAnalyzer}).Analyze(getCollectedFileContents, nil)
|
||||
if test.expectErr {
|
||||
req.Error(err)
|
||||
} else {
|
||||
|
||||
@@ -24,7 +24,9 @@ func (a *AnalyzeHostUDPPortStatus) IsExcluded() (bool, error) {
|
||||
return isExcluded(a.hostAnalyzer.Exclude)
|
||||
}
|
||||
|
||||
func (a *AnalyzeHostUDPPortStatus) Analyze(getCollectedFileContents func(string) ([]byte, error)) ([]*AnalyzeResult, error) {
|
||||
func (a *AnalyzeHostUDPPortStatus) Analyze(
|
||||
getCollectedFileContents func(string) ([]byte, error), findFiles getChildCollectedFileContents,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
hostAnalyzer := a.hostAnalyzer
|
||||
|
||||
fullPath := path.Join("host-collectors/udpPortStatus", "udpPortStatus.json")
|
||||
|
||||
@@ -90,7 +90,7 @@ func TestAnalyzeUDPPortStatus(t *testing.T) {
|
||||
analyzer := AnalyzeHostUDPPortStatus{
|
||||
hostAnalyzer: &tc.analyzer,
|
||||
}
|
||||
results, err := analyzer.Analyze(fn)
|
||||
results, err := analyzer.Analyze(fn, nil)
|
||||
if tc.wantErr {
|
||||
require.NotNil(t, err)
|
||||
return
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
@@ -9,6 +10,7 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
iutils "github.com/replicatedhq/troubleshoot/pkg/interfaceutils"
|
||||
"k8s.io/client-go/util/jsonpath"
|
||||
)
|
||||
|
||||
type AnalyzeJsonCompare struct {
|
||||
@@ -55,6 +57,32 @@ func (a *AnalyzeJsonCompare) analyzeJsonCompare(analyzer *troubleshootv1beta2.Js
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to get object at path: %s", analyzer.Path)
|
||||
}
|
||||
} else if analyzer.JsonPath != "" {
|
||||
jsp := jsonpath.New(analyzer.CheckName)
|
||||
jsp.AllowMissingKeys(true).EnableJSONOutput(true)
|
||||
err = jsp.Parse(analyzer.JsonPath)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to parse jsonpath: %s", analyzer.JsonPath)
|
||||
}
|
||||
|
||||
var data bytes.Buffer
|
||||
err = jsp.Execute(&data, actual)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to execute jsonpath")
|
||||
}
|
||||
|
||||
err = json.NewDecoder(&data).Decode(&actual)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to decode jsonpath result")
|
||||
}
|
||||
|
||||
// If we get back a single result in a slice unwrap it.
|
||||
// Technically this doesn't strictly follow jsonpath, but it makes
|
||||
// things easier downstream. Basically we don't want to require
|
||||
// users to wrap a single result with [].
|
||||
if a, ok := actual.([]interface{}); ok && len(a) == 1 {
|
||||
actual = a[0]
|
||||
}
|
||||
}
|
||||
|
||||
var expected interface{}
|
||||
|
||||
@@ -541,6 +541,144 @@ func Test_jsonCompare(t *testing.T) {
|
||||
},
|
||||
fileContents: []byte(``),
|
||||
},
|
||||
{
|
||||
name: "jsonpath comparison",
|
||||
analyzer: troubleshootv1beta2.JsonCompare{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
},
|
||||
CollectorName: "jsonpath-compare-1",
|
||||
FileName: "jsonpath-compare-1.json",
|
||||
JsonPath: "{$.morestuff[0]}",
|
||||
Value: `{
|
||||
"foo": {
|
||||
"bar": 123
|
||||
}
|
||||
}`,
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "jsonpath-compare-1",
|
||||
Message: "pass",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
},
|
||||
fileContents: []byte(`{
|
||||
"foo": "bar",
|
||||
"stuff": {
|
||||
"foo": "bar",
|
||||
"bar": true
|
||||
},
|
||||
"morestuff": [
|
||||
{
|
||||
"foo": {
|
||||
"bar": 123
|
||||
}
|
||||
}
|
||||
]
|
||||
}`),
|
||||
},
|
||||
{
|
||||
name: "jsonpath comparison, but fail on match",
|
||||
analyzer: troubleshootv1beta2.JsonCompare{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "pass",
|
||||
When: "false",
|
||||
},
|
||||
},
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "fail",
|
||||
When: "true",
|
||||
},
|
||||
},
|
||||
},
|
||||
CollectorName: "jsonpath-compare-1-1",
|
||||
FileName: "jsonpath-compare-1-1.json",
|
||||
JsonPath: "{$.morestuff[0].foo.bar}",
|
||||
Value: `123`,
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: false,
|
||||
IsWarn: false,
|
||||
IsFail: true,
|
||||
Title: "jsonpath-compare-1-1",
|
||||
Message: "fail",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
},
|
||||
fileContents: []byte(`{
|
||||
"foo": "bar",
|
||||
"stuff": {
|
||||
"foo": "bar",
|
||||
"bar": true
|
||||
},
|
||||
"morestuff": [
|
||||
{
|
||||
"foo": {
|
||||
"bar": 123
|
||||
}
|
||||
}
|
||||
]
|
||||
}`),
|
||||
},
|
||||
{
|
||||
name: "jsonpath comparison, multiple values",
|
||||
analyzer: troubleshootv1beta2.JsonCompare{
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
},
|
||||
CollectorName: "jsonpath-compare-2",
|
||||
FileName: "jsonpath-compare-2.json",
|
||||
JsonPath: "{$..bar}",
|
||||
Value: `[true, 123]`,
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "jsonpath-compare-2",
|
||||
Message: "pass",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
},
|
||||
fileContents: []byte(`{
|
||||
"foo": "bar",
|
||||
"stuff": {
|
||||
"foo": "bar",
|
||||
"bar": true
|
||||
},
|
||||
"morestuff": [
|
||||
{
|
||||
"foo": {
|
||||
"bar": 123
|
||||
}
|
||||
}
|
||||
]
|
||||
}`),
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
|
||||
+220
-25
@@ -5,31 +5,34 @@ import (
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/replicatedhq/troubleshoot/pkg/constants"
|
||||
iutils "github.com/replicatedhq/troubleshoot/pkg/interfaceutils"
|
||||
"gopkg.in/yaml.v2"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
var Filemap = map[string]string{
|
||||
"Deployment": constants.CLUSTER_RESOURCES_DEPLOYMENTS,
|
||||
"StatefulSet": constants.CLUSTER_RESOURCES_STATEFULSETS,
|
||||
"NetworkPolicy": constants.CLUSTER_RESOURCES_NETWORK_POLICY,
|
||||
"Pod": constants.CLUSTER_RESOURCES_PODS,
|
||||
"Ingress": constants.CLUSTER_RESOURCES_INGRESS,
|
||||
"Service": constants.CLUSTER_RESOURCES_SERVICES,
|
||||
"ResourceQuota": constants.CLUSTER_RESOURCES_RESOURCE_QUOTA,
|
||||
"Job": constants.CLUSTER_RESOURCES_JOBS,
|
||||
"PersistentVoumeClaim": constants.CLUSTER_RESOURCES_PVCS,
|
||||
"pvc": constants.CLUSTER_RESOURCES_PVCS,
|
||||
"ReplicaSet": constants.CLUSTER_RESOURCES_REPLICASETS,
|
||||
"Namespace": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NAMESPACES),
|
||||
"PersistentVolume": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_PVS),
|
||||
"pv": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_PVS),
|
||||
"Node": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NODES),
|
||||
"StorageClass": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_STORAGE_CLASS),
|
||||
"Deployment": constants.CLUSTER_RESOURCES_DEPLOYMENTS,
|
||||
"StatefulSet": constants.CLUSTER_RESOURCES_STATEFULSETS,
|
||||
"NetworkPolicy": constants.CLUSTER_RESOURCES_NETWORK_POLICY,
|
||||
"Pod": constants.CLUSTER_RESOURCES_PODS,
|
||||
"Ingress": constants.CLUSTER_RESOURCES_INGRESS,
|
||||
"Service": constants.CLUSTER_RESOURCES_SERVICES,
|
||||
"ResourceQuota": constants.CLUSTER_RESOURCES_RESOURCE_QUOTA,
|
||||
"Job": constants.CLUSTER_RESOURCES_JOBS,
|
||||
"PersistentVolumeClaim": constants.CLUSTER_RESOURCES_PVCS,
|
||||
"pvc": constants.CLUSTER_RESOURCES_PVCS,
|
||||
"ReplicaSet": constants.CLUSTER_RESOURCES_REPLICASETS,
|
||||
"Namespace": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NAMESPACES),
|
||||
"PersistentVolume": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_PVS),
|
||||
"pv": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_PVS),
|
||||
"Node": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NODES),
|
||||
"StorageClass": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_STORAGE_CLASS),
|
||||
}
|
||||
|
||||
type AnalyzeClusterResource struct {
|
||||
@@ -94,11 +97,11 @@ func FindResource(kind string, clusterScoped bool, namespace string, name string
|
||||
}
|
||||
itemslice := items.([]interface{})
|
||||
for _, item := range itemslice {
|
||||
name, err := iutils.GetAtPath(item, "metadata.name")
|
||||
resourceName, err := iutils.GetAtPath(item, "metadata.name")
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "Failed to find resource with name: %s", name)
|
||||
}
|
||||
if name == name {
|
||||
if resourceName == name {
|
||||
return item, nil
|
||||
}
|
||||
}
|
||||
@@ -107,16 +110,156 @@ func FindResource(kind string, clusterScoped bool, namespace string, name string
|
||||
|
||||
}
|
||||
|
||||
func (a *AnalyzeClusterResource) analyzeResource(analyzer *troubleshootv1beta2.ClusterResource, getFileContents getCollectedFileContents) (*AnalyzeResult, error) {
|
||||
func compareWhentoResource(w string, actual interface{}) (bool, error) {
|
||||
|
||||
// check our "when" has operators
|
||||
var whenSplit []string
|
||||
if strings.ContainsAny(w, "!=<>") {
|
||||
whenSplit = strings.Split(strings.TrimSpace(w), " ")
|
||||
} else {
|
||||
return false, errors.New("no operators found")
|
||||
}
|
||||
|
||||
// let's first check if we can cast "actual" as an int, that should inform us what comparison we're doing
|
||||
actualAsInt, ok := actual.(int)
|
||||
if ok {
|
||||
// it's an int! we can do integer comparison here
|
||||
// we're going to re-use an ill-fitting bit of code from the deployment analyzer for now
|
||||
return compareActualToWhen(w, actualAsInt)
|
||||
}
|
||||
|
||||
// if we've fallen through here we're going to have to try a bit harder to work out what we're comparing
|
||||
// let's try making it a string
|
||||
actualAsString, ok := actual.(string)
|
||||
if !ok {
|
||||
return false, errors.New("could not cast found value as string")
|
||||
}
|
||||
|
||||
// now we can try checking if it's a "quantity"
|
||||
actualASQuantity, err := resource.ParseQuantity(actualAsString)
|
||||
if err == nil {
|
||||
// it's probably a size, we can do some comparison here
|
||||
// but I'm being lazy here so we'll convert our last argument to an int and throw it back at our existing int comparison function
|
||||
whenAsQuantity, err := resource.ParseQuantity(whenSplit[1])
|
||||
if err != nil {
|
||||
// our when wasn't a size! naughty user
|
||||
return false, errors.New("Cannot compare size with not size")
|
||||
}
|
||||
whenIntAsString := strconv.FormatInt(whenAsQuantity.Value(), 10)
|
||||
// re-use that same compare function from earlier, might as well
|
||||
return compareActualToWhen(whenSplit[0]+" "+whenIntAsString, int(actualASQuantity.Value()))
|
||||
|
||||
}
|
||||
|
||||
return false, errors.New("could not match comparison method for result")
|
||||
}
|
||||
|
||||
func analyzeWhenField(actual interface{}, outcomes []*troubleshootv1beta2.Outcome, checkName string) (*AnalyzeResult, error) {
|
||||
|
||||
result := &AnalyzeResult{
|
||||
Title: checkName,
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg?w=13&h=16",
|
||||
}
|
||||
|
||||
for _, outcome := range outcomes {
|
||||
if outcome.Fail != nil {
|
||||
if outcome.Fail.When != "" {
|
||||
compareResult, err := compareWhentoResource(outcome.Fail.When, actual)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to process when statement: %s", outcome.Fail.When)
|
||||
}
|
||||
if compareResult {
|
||||
result.IsFail = true
|
||||
result.Message = outcome.Fail.Message
|
||||
result.URI = outcome.Fail.URI
|
||||
return result, nil
|
||||
}
|
||||
} else {
|
||||
result.IsFail = true
|
||||
result.Message = outcome.Fail.Message
|
||||
result.URI = outcome.Fail.URI
|
||||
|
||||
return result, nil
|
||||
}
|
||||
}
|
||||
if outcome.Warn != nil {
|
||||
|
||||
if outcome.Warn.When != "" {
|
||||
compareResult, err := compareWhentoResource(outcome.Fail.When, actual)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to process when statement: %s", outcome.Warn.When)
|
||||
}
|
||||
if compareResult {
|
||||
result.IsWarn = true
|
||||
result.Message = outcome.Warn.Message
|
||||
result.URI = outcome.Warn.URI
|
||||
return result, nil
|
||||
}
|
||||
} else {
|
||||
result.IsWarn = true
|
||||
result.Message = outcome.Warn.Message
|
||||
result.URI = outcome.Warn.URI
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
}
|
||||
if outcome.Pass != nil {
|
||||
|
||||
if outcome.Pass.When != "" {
|
||||
compareResult, err := compareWhentoResource(outcome.Pass.When, actual)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to process when statement: %s", outcome.Pass.When)
|
||||
}
|
||||
if compareResult {
|
||||
result.IsPass = true
|
||||
result.Message = outcome.Pass.Message
|
||||
result.URI = outcome.Pass.URI
|
||||
return result, nil
|
||||
}
|
||||
} else {
|
||||
result.IsPass = true
|
||||
result.Message = outcome.Pass.Message
|
||||
result.URI = outcome.Pass.URI
|
||||
|
||||
return result, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return &AnalyzeResult{
|
||||
Title: checkName,
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
IsFail: true,
|
||||
Message: "Invalid analyzer",
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (a *AnalyzeClusterResource) analyzeResource(analyzer *troubleshootv1beta2.ClusterResource, getFileContents getCollectedFileContents) (*AnalyzeResult, error) {
|
||||
selected, err := FindResource(analyzer.Kind, analyzer.ClusterScoped, analyzer.Namespace, analyzer.Name, getFileContents)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to find resource")
|
||||
klog.Errorf("failed to find resource: %v", err)
|
||||
return &AnalyzeResult{
|
||||
Title: a.Title(),
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
IsFail: true,
|
||||
Message: "resource does not exist",
|
||||
}, nil
|
||||
}
|
||||
|
||||
actual, err := iutils.GetAtPath(selected, analyzer.YamlPath)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to get object at path: %s", analyzer.YamlPath)
|
||||
klog.Errorf("invalid yaml path: %s for kind: %s: %v", analyzer.YamlPath, analyzer.Kind, err)
|
||||
return &AnalyzeResult{
|
||||
Title: a.Title(),
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
IsFail: true,
|
||||
Message: "YAML path provided is invalid",
|
||||
}, nil
|
||||
}
|
||||
|
||||
var expected interface{}
|
||||
@@ -125,15 +268,67 @@ func (a *AnalyzeClusterResource) analyzeResource(analyzer *troubleshootv1beta2.C
|
||||
return nil, errors.Wrap(err, "failed to parse expected value as yaml doc")
|
||||
}
|
||||
|
||||
result := &AnalyzeResult{
|
||||
actualYAML, err := yaml.Marshal(actual)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to marshal actual value")
|
||||
}
|
||||
|
||||
if analyzer.ExpectedValue != "" {
|
||||
result, err := analyzeValue(expected, actual, analyzer.Outcomes, a.Title())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if result != nil {
|
||||
return result, nil
|
||||
}
|
||||
} else if analyzer.RegexPattern != "" {
|
||||
result, err := analyzeRegexPattern(analyzer.RegexPattern, actualYAML, analyzer.Outcomes, a.Title())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if result != nil {
|
||||
return result, nil
|
||||
}
|
||||
} else if analyzer.RegexGroups != "" {
|
||||
result, err := analyzeRegexGroups(analyzer.RegexGroups, actualYAML, analyzer.Outcomes, a.Title())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if result != nil {
|
||||
return result, nil
|
||||
}
|
||||
} else {
|
||||
// fall through to comparing from the when key
|
||||
result, err := analyzeWhenField(actual, analyzer.Outcomes, a.Title())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if result != nil {
|
||||
return result, nil
|
||||
}
|
||||
}
|
||||
|
||||
return &AnalyzeResult{
|
||||
Title: a.Title(),
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
}
|
||||
IsFail: true,
|
||||
Message: "Invalid analyzer",
|
||||
}, nil
|
||||
}
|
||||
|
||||
func analyzeValue(expected interface{}, actual interface{}, outcomes []*troubleshootv1beta2.Outcome, checkName string) (*AnalyzeResult, error) {
|
||||
var err error
|
||||
|
||||
equal := reflect.DeepEqual(actual, expected)
|
||||
|
||||
for _, outcome := range analyzer.Outcomes {
|
||||
result := &AnalyzeResult{
|
||||
Title: checkName,
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg?w=13&h=16",
|
||||
}
|
||||
|
||||
for _, outcome := range outcomes {
|
||||
if outcome.Fail != nil {
|
||||
when := false
|
||||
if outcome.Fail.When != "" {
|
||||
@@ -183,7 +378,7 @@ func (a *AnalyzeClusterResource) analyzeResource(analyzer *troubleshootv1beta2.C
|
||||
}
|
||||
|
||||
return &AnalyzeResult{
|
||||
Title: a.Title(),
|
||||
Title: checkName,
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
IsFail: true,
|
||||
|
||||
@@ -6,16 +6,19 @@ import (
|
||||
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_clusterResource(t *testing.T) {
|
||||
func Test_findResource(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
isError bool
|
||||
analyzer troubleshootv1beta2.ClusterResource
|
||||
name string
|
||||
isError bool
|
||||
resourceExists bool
|
||||
analyzer troubleshootv1beta2.ClusterResource
|
||||
}{
|
||||
{
|
||||
name: "namespaced resource",
|
||||
name: "namespaced resource",
|
||||
resourceExists: true,
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
CollectorName: "Check namespaced resource",
|
||||
Kind: "Deployment",
|
||||
@@ -24,7 +27,8 @@ func Test_clusterResource(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "check default fallthrough",
|
||||
name: "check default fallthrough",
|
||||
resourceExists: true,
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
CollectorName: "Check namespaced resource",
|
||||
Kind: "Deployment",
|
||||
@@ -32,7 +36,8 @@ func Test_clusterResource(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "cluster scoped resource",
|
||||
name: "cluster scoped resource",
|
||||
resourceExists: true,
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
CollectorName: "Check namespaced resource",
|
||||
Kind: "Node",
|
||||
@@ -40,6 +45,16 @@ func Test_clusterResource(t *testing.T) {
|
||||
Name: "repldev-marc",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "resource does not exist",
|
||||
resourceExists: false,
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
CollectorName: "Check namespaced resource",
|
||||
Kind: "Node",
|
||||
ClusterScoped: true,
|
||||
Name: "resource-does-not-exist",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
@@ -49,9 +64,289 @@ func Test_clusterResource(t *testing.T) {
|
||||
fcp := fileContentProvider{rootDir: rootDir}
|
||||
|
||||
analyzer := &test.analyzer
|
||||
_, err := FindResource(analyzer.Kind, analyzer.ClusterScoped, analyzer.Namespace, analyzer.Name, fcp.getFileContents)
|
||||
item, err := FindResource(analyzer.Kind, analyzer.ClusterScoped, analyzer.Namespace, analyzer.Name, fcp.getFileContents)
|
||||
assert.Equal(t, test.resourceExists, item != nil)
|
||||
assert.Nil(t, err)
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_analyzeResource(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
isError bool
|
||||
analyzer troubleshootv1beta2.ClusterResource
|
||||
expectResult AnalyzeResult
|
||||
}{
|
||||
{
|
||||
name: "pass-when-pvc-exists-and-is-right-access-mode",
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "check-pvc-is-rwx",
|
||||
},
|
||||
Kind: "PersistentVolumeClaim",
|
||||
Name: "redis-data-redis-replicas-0",
|
||||
Namespace: "default",
|
||||
YamlPath: "spec.accessModes.[0]",
|
||||
ExpectedValue: "ReadWriteMany",
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "false",
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "true",
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "check-pvc-is-rwx",
|
||||
Message: "pass",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg?w=13&h=16",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "fail-when-pvc-exists-but-is-wrong-access-mode",
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "check-pvc-is-rwo",
|
||||
},
|
||||
Kind: "PersistentVolumeClaim",
|
||||
Name: "redis-data-redis-replicas-0",
|
||||
Namespace: "default",
|
||||
YamlPath: "spec.accessModes.[0]",
|
||||
ExpectedValue: "ReadWriteOnce",
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "false",
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "true",
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: false,
|
||||
IsWarn: false,
|
||||
IsFail: true,
|
||||
Title: "check-pvc-is-rwo",
|
||||
Message: "fail",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg?w=13&h=16",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "fail-when-pvc-doesnt-exist",
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "check-pvc-exists",
|
||||
},
|
||||
Kind: "PersistentVolumeClaim",
|
||||
Name: "data-postgresql-00",
|
||||
Namespace: "default",
|
||||
YamlPath: "metadata.name",
|
||||
ExpectedValue: "data-postgresql-00",
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "false",
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "true",
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: false,
|
||||
IsWarn: false,
|
||||
IsFail: true,
|
||||
Title: "check-pvc-exists",
|
||||
Message: "YAML path provided is invalid",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "pass-when-pvc-exists-and-is-right-access-mode-regex",
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "check-pvc-is-rwx",
|
||||
},
|
||||
Kind: "PersistentVolumeClaim",
|
||||
Name: "redis-data-redis-replicas-0",
|
||||
Namespace: "default",
|
||||
YamlPath: "spec.accessModes",
|
||||
RegexPattern: "ReadWriteMany",
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "false",
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "true",
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "check-pvc-is-rwx",
|
||||
Message: "pass",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "pass-when-pvc-exists-and-is-at-least-8Gi-regexGroup",
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "check-pvc-is-at-least-8Gi",
|
||||
},
|
||||
Kind: "PersistentVolumeClaim",
|
||||
Name: "data-postgresql-0",
|
||||
Namespace: "default",
|
||||
YamlPath: "spec.resources.requests.storage",
|
||||
RegexGroups: "(?P<PVCSize>\\d+)Gi",
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: "PVCSize >= 8",
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "check-pvc-is-at-least-8Gi",
|
||||
Message: "pass",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg?w=13&h=16",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "pass-when-pvc-exists-and-is-at-least-4Gi",
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "check-pvc-is-at-least-4Gi",
|
||||
},
|
||||
Kind: "PersistentVolumeClaim",
|
||||
Name: "data-postgresql-0",
|
||||
Namespace: "default",
|
||||
YamlPath: "spec.resources.requests.storage",
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: ">= 4Gi",
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: true,
|
||||
IsWarn: false,
|
||||
IsFail: false,
|
||||
Title: "check-pvc-is-at-least-4Gi",
|
||||
Message: "pass",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg?w=13&h=16",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "fail-when-pvc-exists-and-is-not-at-least-16Gi",
|
||||
analyzer: troubleshootv1beta2.ClusterResource{
|
||||
AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{
|
||||
CheckName: "check-pvc-is-at-least-16Gi",
|
||||
},
|
||||
Kind: "PersistentVolumeClaim",
|
||||
Name: "data-postgresql-0",
|
||||
Namespace: "default",
|
||||
YamlPath: "spec.resources.requests.storage",
|
||||
Outcomes: []*troubleshootv1beta2.Outcome{
|
||||
{
|
||||
Pass: &troubleshootv1beta2.SingleOutcome{
|
||||
When: ">= 16Gi",
|
||||
Message: "pass",
|
||||
},
|
||||
},
|
||||
{
|
||||
Fail: &troubleshootv1beta2.SingleOutcome{
|
||||
Message: "fail",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectResult: AnalyzeResult{
|
||||
IsPass: false,
|
||||
IsWarn: false,
|
||||
IsFail: true,
|
||||
Title: "check-pvc-is-at-least-16Gi",
|
||||
Message: "fail",
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg?w=13&h=16",
|
||||
},
|
||||
},
|
||||
}
|
||||
{
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
req := require.New(t)
|
||||
|
||||
rootDir := filepath.Join("files", "support-bundle")
|
||||
fcp := fileContentProvider{rootDir: rootDir}
|
||||
|
||||
a := AnalyzeClusterResource{
|
||||
analyzer: &test.analyzer,
|
||||
}
|
||||
|
||||
actual, err := a.analyzeResource(&test.analyzer, fcp.getFileContents)
|
||||
if !test.isError {
|
||||
req.NoError(err)
|
||||
req.Equal(test.expectResult, *actual)
|
||||
} else {
|
||||
req.Error(err)
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-13
@@ -31,17 +31,12 @@ func (a *AnalyzeTextAnalyze) IsExcluded() (bool, error) {
|
||||
}
|
||||
|
||||
func (a *AnalyzeTextAnalyze) Analyze(getFile getCollectedFileContents, findFiles getChildCollectedFileContents) ([]*AnalyzeResult, error) {
|
||||
results, err := a.analyzeTextAnalyze(a.analyzer, findFiles)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i := range results {
|
||||
results[i].Strict = a.analyzer.Strict.BoolOrDefaultFalse()
|
||||
}
|
||||
return results, nil
|
||||
return analyzeTextAnalyze(a.analyzer, findFiles, a.Title())
|
||||
}
|
||||
|
||||
func (a *AnalyzeTextAnalyze) analyzeTextAnalyze(analyzer *troubleshootv1beta2.TextAnalyze, getCollectedFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) {
|
||||
func analyzeTextAnalyze(
|
||||
analyzer *troubleshootv1beta2.TextAnalyze, getCollectedFileContents getChildCollectedFileContents, title string,
|
||||
) ([]*AnalyzeResult, error) {
|
||||
fullPath := filepath.Join(analyzer.CollectorName, analyzer.FileName)
|
||||
excludeFiles := []string{}
|
||||
for _, excludeFile := range analyzer.ExcludeFiles {
|
||||
@@ -60,7 +55,7 @@ func (a *AnalyzeTextAnalyze) analyzeTextAnalyze(analyzer *troubleshootv1beta2.Te
|
||||
|
||||
return []*AnalyzeResult{
|
||||
{
|
||||
Title: a.Title(),
|
||||
Title: title,
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
IsWarn: true,
|
||||
@@ -73,7 +68,7 @@ func (a *AnalyzeTextAnalyze) analyzeTextAnalyze(analyzer *troubleshootv1beta2.Te
|
||||
|
||||
if analyzer.RegexPattern != "" {
|
||||
for _, fileContents := range collected {
|
||||
result, err := analyzeRegexPattern(analyzer.RegexPattern, fileContents, analyzer.Outcomes, a.Title())
|
||||
result, err := analyzeRegexPattern(analyzer.RegexPattern, fileContents, analyzer.Outcomes, title)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -85,7 +80,7 @@ func (a *AnalyzeTextAnalyze) analyzeTextAnalyze(analyzer *troubleshootv1beta2.Te
|
||||
|
||||
if analyzer.RegexGroups != "" {
|
||||
for _, fileContents := range collected {
|
||||
result, err := analyzeRegexGroups(analyzer.RegexGroups, fileContents, analyzer.Outcomes, a.Title())
|
||||
result, err := analyzeRegexGroups(analyzer.RegexGroups, fileContents, analyzer.Outcomes, title)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -95,13 +90,17 @@ func (a *AnalyzeTextAnalyze) analyzeTextAnalyze(analyzer *troubleshootv1beta2.Te
|
||||
}
|
||||
}
|
||||
|
||||
for i := range results {
|
||||
results[i].Strict = analyzer.Strict.BoolOrDefaultFalse()
|
||||
}
|
||||
|
||||
if len(results) > 0 {
|
||||
return results, nil
|
||||
}
|
||||
|
||||
return []*AnalyzeResult{
|
||||
{
|
||||
Title: a.Title(),
|
||||
Title: title,
|
||||
IconKey: "kubernetes_text_analyze",
|
||||
IconURI: "https://troubleshoot.sh/images/analyzer-icons/text-analyze.svg",
|
||||
IsFail: true,
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"testing"
|
||||
|
||||
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@@ -731,7 +732,7 @@ func Test_textAnalyze(t *testing.T) {
|
||||
analyzer: &test.analyzer,
|
||||
}
|
||||
|
||||
actual, err := a.analyzeTextAnalyze(&test.analyzer, getFiles)
|
||||
actual, err := analyzeTextAnalyze(&test.analyzer, getFiles, a.Title())
|
||||
req.NoError(err)
|
||||
|
||||
unPointered := []AnalyzeResult{}
|
||||
@@ -796,3 +797,30 @@ func Test_compareRegex(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_NoFilesInBundle(t *testing.T) {
|
||||
getFiles := func(n string, excludeFiles []string) (map[string][]byte, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
a := AnalyzeTextAnalyze{
|
||||
analyzer: &troubleshootv1beta2.TextAnalyze{
|
||||
CollectorName: "text-collector-1",
|
||||
IgnoreIfNoFiles: true,
|
||||
},
|
||||
}
|
||||
|
||||
actual, err := analyzeTextAnalyze(a.analyzer, getFiles, a.Title())
|
||||
require.NoError(t, err)
|
||||
assert.Nil(t, actual)
|
||||
|
||||
aa := AnalyzeTextAnalyze{
|
||||
analyzer: &troubleshootv1beta2.TextAnalyze{},
|
||||
}
|
||||
|
||||
actual, err = analyzeTextAnalyze(aa.analyzer, getFiles, a.Title())
|
||||
require.NoError(t, err)
|
||||
require.Len(t, actual, 1)
|
||||
assert.Equal(t, "No matching files", actual[0].Message)
|
||||
assert.True(t, actual[0].IsWarn)
|
||||
}
|
||||
|
||||
@@ -68,6 +68,8 @@ type ClusterResource struct {
|
||||
Name string `json:"name" yaml:"name"`
|
||||
YamlPath string `json:"yamlPath" yaml:"yamlPath"`
|
||||
ExpectedValue string `json:"expectedValue,omitempty" yaml:"expectedValue,omitempty"`
|
||||
RegexPattern string `json:"regex,omitempty" yaml:"regex,omitempty"`
|
||||
RegexGroups string `json:"regexGroups,omitempty" yaml:"regexGroups,omitempty"`
|
||||
}
|
||||
|
||||
type StatefulsetStatus struct {
|
||||
@@ -159,6 +161,7 @@ type JsonCompare struct {
|
||||
CollectorName string `json:"collectorName,omitempty" yaml:"collectorName,omitempty"`
|
||||
FileName string `json:"fileName,omitempty" yaml:"fileName,omitempty"`
|
||||
Path string `json:"path,omitempty" yaml:"path,omitempty"`
|
||||
JsonPath string `json:"jsonPath,omitempty" yaml:"jsonPath,omitempty"`
|
||||
Value string `json:"value,omitempty" yaml:"value,omitempty"`
|
||||
Outcomes []*Outcome `json:"outcomes" yaml:"outcomes"`
|
||||
}
|
||||
@@ -213,6 +216,11 @@ type AnalyzeMeta struct {
|
||||
Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"`
|
||||
}
|
||||
|
||||
type CertificatesAnalyze struct {
|
||||
AnalyzeMeta `json:",inline" yaml:",inline"`
|
||||
Outcomes []*Outcome `json:"outcomes" yaml:"outcomes"`
|
||||
}
|
||||
|
||||
type Analyze struct {
|
||||
ClusterVersion *ClusterVersion `json:"clusterVersion,omitempty" yaml:"clusterVersion,omitempty"`
|
||||
StorageClass *StorageClass `json:"storageClass,omitempty" yaml:"storageClass,omitempty"`
|
||||
@@ -242,4 +250,5 @@ type Analyze struct {
|
||||
WeaveReport *WeaveReportAnalyze `json:"weaveReport,omitempty" yaml:"weaveReport,omitempty"`
|
||||
Sysctl *SysctlAnalyze `json:"sysctl,omitempty" yaml:"sysctl,omitempty"`
|
||||
ClusterResource *ClusterResource `json:"clusterResource,omitempty" yaml:"clusterResource,omitempty"`
|
||||
Certificates *CertificatesAnalyze `json:"certificates,omitempty" yaml:"certificates,omitempty"`
|
||||
}
|
||||
|
||||
@@ -27,6 +27,23 @@ type ClusterResources struct {
|
||||
IgnoreRBAC bool `json:"ignoreRBAC,omitempty" yaml:"ignoreRBAC"`
|
||||
}
|
||||
|
||||
// MetricRequest the details of the MetricValuesList to be retrieved
|
||||
type MetricRequest struct {
|
||||
// Namespace for which to collect the metric values, empty for non-namespaces resources.
|
||||
Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
|
||||
// ObjectName for which to collect metric values, all resources when empty.
|
||||
// Note that for namespaced resources a Namespace has to be supplied regardless.
|
||||
ObjectName string `json:"objectName,omitempty" yaml:"objectName,omitempty"`
|
||||
// ResourceMetricName name of the MetricValueList as per the APIResourceList from
|
||||
// custom.metrics.k8s.io/v1beta1
|
||||
ResourceMetricName string `json:"resourceMetricName" yaml:"resourceMetricName"`
|
||||
}
|
||||
|
||||
type CustomMetrics struct {
|
||||
CollectorMeta `json:",inline" yaml:",inline"`
|
||||
MetricRequests []MetricRequest `json:"metricRequests,omitempty" yaml:"metricRequests,omitempty"`
|
||||
}
|
||||
|
||||
type Secret struct {
|
||||
CollectorMeta `json:",inline" yaml:",inline"`
|
||||
Name string `json:"name,omitempty" yaml:"name,omitempty"`
|
||||
@@ -218,15 +235,20 @@ type RegistryImages struct {
|
||||
|
||||
type Certificates struct {
|
||||
CollectorMeta `json:",inline" yaml:",inline"`
|
||||
Name string `json:"name,omitempty" yaml:"name,omitempty"`
|
||||
Secrets map[string][]string `json:"secrets,omitempty" yaml:"secrets,omitempty"`
|
||||
ConfigMaps map[string][]string `json:"configMaps,omitempty" yaml:"configMaps,omitempty"`
|
||||
Secrets []CertificateSource `json:"secrets,omitempty" yaml:"secrets,omitempty"`
|
||||
ConfigMaps []CertificateSource `json:"configMaps,omitempty" yaml:"configMaps,omitempty"`
|
||||
}
|
||||
|
||||
type CertificateSource struct {
|
||||
Name string `json:"name,omitempty" yaml:"name,omitempty"`
|
||||
Namespaces []string `json:"namespaces,omitempty" yaml:"namespaces,omitempty"`
|
||||
}
|
||||
|
||||
type Collect struct {
|
||||
ClusterInfo *ClusterInfo `json:"clusterInfo,omitempty" yaml:"clusterInfo,omitempty"`
|
||||
ClusterResources *ClusterResources `json:"clusterResources,omitempty" yaml:"clusterResources,omitempty"`
|
||||
Secret *Secret `json:"secret,omitempty" yaml:"secret,omitempty"`
|
||||
CustomMetrics *CustomMetrics `json:"customMetrics,omitempty" yaml:"customMetrics,omitempty"`
|
||||
ConfigMap *ConfigMap `json:"configMap,omitempty" yaml:"configMap,omitempty"`
|
||||
Logs *Logs `json:"logs,omitempty" yaml:"logs,omitempty"`
|
||||
Run *Run `json:"run,omitempty" yaml:"run,omitempty"`
|
||||
|
||||
@@ -104,6 +104,12 @@ type CertificateAnalyze struct {
|
||||
Outcomes []*Outcome `json:"outcomes" yaml:"outcomes"`
|
||||
}
|
||||
|
||||
type HostCertificatesCollectionAnalyze struct {
|
||||
AnalyzeMeta `json:",inline" yaml:",inline"`
|
||||
CollectorName string `json:"collectorName,omitempty" yaml:"collectorName,omitempty"`
|
||||
Outcomes []*Outcome `json:"outcomes" yaml:"outcomes"`
|
||||
}
|
||||
|
||||
type HostServicesAnalyze struct {
|
||||
AnalyzeMeta `json:",inline" yaml:",inline"`
|
||||
CollectorName string `json:"collectorName,omitempty" yaml:"collectorName,omitempty"`
|
||||
@@ -115,41 +121,27 @@ type HostOSAnalyze struct {
|
||||
CollectorName string `json:"collectorName,omitempty" yaml:"collectorName,omitempty"`
|
||||
Outcomes []*Outcome `json:"outcomes" yaml:"outcomes"`
|
||||
}
|
||||
|
||||
type HostAnalyze struct {
|
||||
CPU *CPUAnalyze `json:"cpu,omitempty" yaml:"cpu,omitempty"`
|
||||
//
|
||||
TCPLoadBalancer *TCPLoadBalancerAnalyze `json:"tcpLoadBalancer,omitempty" yaml:"tcpLoadBalancer,omitempty"`
|
||||
HTTPLoadBalancer *HTTPLoadBalancerAnalyze `json:"httpLoadBalancer,omitempty" yaml:"httpLoadBalancer,omitempty"`
|
||||
|
||||
DiskUsage *DiskUsageAnalyze `json:"diskUsage,omitempty" yaml:"diskUsage,omitempty"`
|
||||
|
||||
Memory *MemoryAnalyze `json:"memory,omitempty" yaml:"memory,omitempty"`
|
||||
|
||||
TCPPortStatus *TCPPortStatusAnalyze `json:"tcpPortStatus,omitempty" yaml:"tcpPortStatus,omitempty"`
|
||||
|
||||
UDPPortStatus *UDPPortStatusAnalyze `json:"udpPortStatus,omitempty" yaml:"udpPortStatus,omitempty"`
|
||||
|
||||
HTTP *HTTPAnalyze `json:"http,omitempty" yaml:"http,omitempty"`
|
||||
|
||||
Time *TimeAnalyze `json:"time,omitempty" yaml:"time,omitempty"`
|
||||
|
||||
BlockDevices *BlockDevicesAnalyze `json:"blockDevices,omitempty" yaml:"blockDevices,omitempty"`
|
||||
|
||||
SystemPackages *SystemPackagesAnalyze `json:"systemPackages,omitempty" yaml:"systemPackages,omitempty"`
|
||||
|
||||
KernelModules *KernelModulesAnalyze `json:"kernelModules,omitempty" yaml:"kernelModules,omitempty"`
|
||||
|
||||
TCPConnect *TCPConnectAnalyze `json:"tcpConnect,omitempty" yaml:"tcpConnect,omitempty"`
|
||||
|
||||
IPV4Interfaces *IPV4InterfacesAnalyze `json:"ipv4Interfaces,omitempty" yaml:"ipv4Interfaces,omitempty"`
|
||||
|
||||
SubnetAvailable *SubnetAvailableAnalyze `json:"subnetAvailable,omitempty" yaml:"subnetAvailable,omitempty"`
|
||||
|
||||
FilesystemPerformance *FilesystemPerformanceAnalyze `json:"filesystemPerformance,omitempty" yaml:"filesystemPerformance,omitempty"`
|
||||
|
||||
Certificate *CertificateAnalyze `json:"certificate,omitempty" yaml:"certificate,omitempty"`
|
||||
|
||||
HostServices *HostServicesAnalyze `json:"hostServices,omitempty" yaml:"hostServices,omitempty"`
|
||||
|
||||
HostOS *HostOSAnalyze `json:"hostOS,omitempty" yaml:"hostOS,omitempty"`
|
||||
CPU *CPUAnalyze `json:"cpu,omitempty" yaml:"cpu,omitempty"`
|
||||
TCPLoadBalancer *TCPLoadBalancerAnalyze `json:"tcpLoadBalancer,omitempty" yaml:"tcpLoadBalancer,omitempty"`
|
||||
HTTPLoadBalancer *HTTPLoadBalancerAnalyze `json:"httpLoadBalancer,omitempty" yaml:"httpLoadBalancer,omitempty"`
|
||||
DiskUsage *DiskUsageAnalyze `json:"diskUsage,omitempty" yaml:"diskUsage,omitempty"`
|
||||
Memory *MemoryAnalyze `json:"memory,omitempty" yaml:"memory,omitempty"`
|
||||
TCPPortStatus *TCPPortStatusAnalyze `json:"tcpPortStatus,omitempty" yaml:"tcpPortStatus,omitempty"`
|
||||
UDPPortStatus *UDPPortStatusAnalyze `json:"udpPortStatus,omitempty" yaml:"udpPortStatus,omitempty"`
|
||||
HTTP *HTTPAnalyze `json:"http,omitempty" yaml:"http,omitempty"`
|
||||
Time *TimeAnalyze `json:"time,omitempty" yaml:"time,omitempty"`
|
||||
BlockDevices *BlockDevicesAnalyze `json:"blockDevices,omitempty" yaml:"blockDevices,omitempty"`
|
||||
SystemPackages *SystemPackagesAnalyze `json:"systemPackages,omitempty" yaml:"systemPackages,omitempty"`
|
||||
KernelModules *KernelModulesAnalyze `json:"kernelModules,omitempty" yaml:"kernelModules,omitempty"`
|
||||
TCPConnect *TCPConnectAnalyze `json:"tcpConnect,omitempty" yaml:"tcpConnect,omitempty"`
|
||||
IPV4Interfaces *IPV4InterfacesAnalyze `json:"ipv4Interfaces,omitempty" yaml:"ipv4Interfaces,omitempty"`
|
||||
SubnetAvailable *SubnetAvailableAnalyze `json:"subnetAvailable,omitempty" yaml:"subnetAvailable,omitempty"`
|
||||
FilesystemPerformance *FilesystemPerformanceAnalyze `json:"filesystemPerformance,omitempty" yaml:"filesystemPerformance,omitempty"`
|
||||
Certificate *CertificateAnalyze `json:"certificate,omitempty" yaml:"certificate,omitempty"`
|
||||
CertificatesCollection *HostCertificatesCollectionAnalyze `json:"certificatesCollection,omitempty" yaml:"certificatesCollection,omitempty"`
|
||||
HostServices *HostServicesAnalyze `json:"hostServices,omitempty" yaml:"hostServices,omitempty"`
|
||||
HostOS *HostOSAnalyze `json:"hostOS,omitempty" yaml:"hostOS,omitempty"`
|
||||
TextAnalyze *TextAnalyze `json:"textAnalyze,omitempty" yaml:"textAnalyze,omitempty"`
|
||||
}
|
||||
|
||||
@@ -169,6 +169,11 @@ type Certificate struct {
|
||||
KeyPath string `json:"keyPath" yaml:"keyPath"`
|
||||
}
|
||||
|
||||
type HostCertificatesCollection struct {
|
||||
HostCollectorMeta `json:",inline" yaml:",inline"`
|
||||
Paths []string `json:"paths" yaml:"paths"`
|
||||
}
|
||||
|
||||
type HostServices struct {
|
||||
HostCollectorMeta `json:",inline" yaml:",inline"`
|
||||
}
|
||||
@@ -180,28 +185,29 @@ type HostRun struct {
|
||||
}
|
||||
|
||||
type HostCollect struct {
|
||||
CPU *CPU `json:"cpu,omitempty" yaml:"cpu,omitempty"`
|
||||
Memory *Memory `json:"memory,omitempty" yaml:"memory,omitempty"`
|
||||
TCPLoadBalancer *TCPLoadBalancer `json:"tcpLoadBalancer,omitempty" yaml:"tcpLoadBalancer,omitempty"`
|
||||
HTTPLoadBalancer *HTTPLoadBalancer `json:"httpLoadBalancer,omitempty" yaml:"httpLoadBalancer,omitempty"`
|
||||
TCPPortStatus *TCPPortStatus `json:"tcpPortStatus,omitempty" yaml:"tcpPortStatus,omitempty"`
|
||||
UDPPortStatus *UDPPortStatus `json:"udpPortStatus,omitempty" yaml:"udpPortStatus,omitempty"`
|
||||
Kubernetes *Kubernetes `json:"kubernetes,omitempty" yaml:"kubernetes,omitempty"`
|
||||
IPV4Interfaces *IPV4Interfaces `json:"ipv4Interfaces,omitempty" yaml:"ipv4Interfaces,omitempty"`
|
||||
SubnetAvailable *SubnetAvailable `json:"subnetAvailable,omitempty" yaml:"subnetAvailable,omitempty"`
|
||||
DiskUsage *DiskUsage `json:"diskUsage,omitempty" yaml:"diskUsage,omitempty"`
|
||||
HTTP *HostHTTP `json:"http,omitempty" yaml:"http,omitempty"`
|
||||
Time *HostTime `json:"time,omitempty" yaml:"time,omitempty"`
|
||||
BlockDevices *HostBlockDevices `json:"blockDevices,omitempty" yaml:"blockDevices,omitempty"`
|
||||
SystemPackages *HostSystemPackages `json:"systemPackages,omitempty" yaml:"systemPackages,omitempty"`
|
||||
KernelModules *HostKernelModules `json:"kernelModules,omitempty" yaml:"kernelModules,omitempty"`
|
||||
TCPConnect *TCPConnect `json:"tcpConnect,omitempty" yaml:"tcpConnect,omitempty"`
|
||||
FilesystemPerformance *FilesystemPerformance `json:"filesystemPerformance,omitempty" yaml:"filesystemPerformance,omitempty"`
|
||||
Certificate *Certificate `json:"certificate,omitempty" yaml:"certificate,omitempty"`
|
||||
HostServices *HostServices `json:"hostServices,omitempty" yaml:"hostServices,omitempty"`
|
||||
HostOS *HostOS `json:"hostOS,omitempty" yaml:"hostOS,omitempty"`
|
||||
HostRun *HostRun `json:"run,omitempty" yaml:"run,omitempty"`
|
||||
HostCopy *HostCopy `json:"copy,omitempty" yaml:"copy,omitempty"`
|
||||
CPU *CPU `json:"cpu,omitempty" yaml:"cpu,omitempty"`
|
||||
Memory *Memory `json:"memory,omitempty" yaml:"memory,omitempty"`
|
||||
TCPLoadBalancer *TCPLoadBalancer `json:"tcpLoadBalancer,omitempty" yaml:"tcpLoadBalancer,omitempty"`
|
||||
HTTPLoadBalancer *HTTPLoadBalancer `json:"httpLoadBalancer,omitempty" yaml:"httpLoadBalancer,omitempty"`
|
||||
TCPPortStatus *TCPPortStatus `json:"tcpPortStatus,omitempty" yaml:"tcpPortStatus,omitempty"`
|
||||
UDPPortStatus *UDPPortStatus `json:"udpPortStatus,omitempty" yaml:"udpPortStatus,omitempty"`
|
||||
Kubernetes *Kubernetes `json:"kubernetes,omitempty" yaml:"kubernetes,omitempty"`
|
||||
IPV4Interfaces *IPV4Interfaces `json:"ipv4Interfaces,omitempty" yaml:"ipv4Interfaces,omitempty"`
|
||||
SubnetAvailable *SubnetAvailable `json:"subnetAvailable,omitempty" yaml:"subnetAvailable,omitempty"`
|
||||
DiskUsage *DiskUsage `json:"diskUsage,omitempty" yaml:"diskUsage,omitempty"`
|
||||
HTTP *HostHTTP `json:"http,omitempty" yaml:"http,omitempty"`
|
||||
Time *HostTime `json:"time,omitempty" yaml:"time,omitempty"`
|
||||
BlockDevices *HostBlockDevices `json:"blockDevices,omitempty" yaml:"blockDevices,omitempty"`
|
||||
SystemPackages *HostSystemPackages `json:"systemPackages,omitempty" yaml:"systemPackages,omitempty"`
|
||||
KernelModules *HostKernelModules `json:"kernelModules,omitempty" yaml:"kernelModules,omitempty"`
|
||||
TCPConnect *TCPConnect `json:"tcpConnect,omitempty" yaml:"tcpConnect,omitempty"`
|
||||
FilesystemPerformance *FilesystemPerformance `json:"filesystemPerformance,omitempty" yaml:"filesystemPerformance,omitempty"`
|
||||
Certificate *Certificate `json:"certificate,omitempty" yaml:"certificate,omitempty"`
|
||||
CertificatesCollection *HostCertificatesCollection `json:"certificatesCollection,omitempty" yaml:"certificatesCollection,omitempty"`
|
||||
HostServices *HostServices `json:"hostServices,omitempty" yaml:"hostServices,omitempty"`
|
||||
HostOS *HostOS `json:"hostOS,omitempty" yaml:"hostOS,omitempty"`
|
||||
HostRun *HostRun `json:"run,omitempty" yaml:"run,omitempty"`
|
||||
HostCopy *HostCopy `json:"copy,omitempty" yaml:"copy,omitempty"`
|
||||
}
|
||||
|
||||
func (c *HostCollect) GetName() string {
|
||||
|
||||
@@ -194,6 +194,11 @@ func (in *Analyze) DeepCopyInto(out *Analyze) {
|
||||
*out = new(ClusterResource)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Certificates != nil {
|
||||
in, out := &in.Certificates, &out.Certificates
|
||||
*out = new(CertificatesAnalyze)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Analyze.
|
||||
@@ -559,38 +564,42 @@ func (in *CertificateAnalyze) DeepCopy() *CertificateAnalyze {
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *CertificateSource) DeepCopyInto(out *CertificateSource) {
|
||||
*out = *in
|
||||
if in.Namespaces != nil {
|
||||
in, out := &in.Namespaces, &out.Namespaces
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertificateSource.
|
||||
func (in *CertificateSource) DeepCopy() *CertificateSource {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(CertificateSource)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Certificates) DeepCopyInto(out *Certificates) {
|
||||
*out = *in
|
||||
in.CollectorMeta.DeepCopyInto(&out.CollectorMeta)
|
||||
if in.Secrets != nil {
|
||||
in, out := &in.Secrets, &out.Secrets
|
||||
*out = make(map[string][]string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal []string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
*out = make([]CertificateSource, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
if in.ConfigMaps != nil {
|
||||
in, out := &in.ConfigMaps, &out.ConfigMaps
|
||||
*out = make(map[string][]string, len(*in))
|
||||
for key, val := range *in {
|
||||
var outVal []string
|
||||
if val == nil {
|
||||
(*out)[key] = nil
|
||||
} else {
|
||||
in, out := &val, &outVal
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
(*out)[key] = outVal
|
||||
*out = make([]CertificateSource, len(*in))
|
||||
for i := range *in {
|
||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -605,6 +614,33 @@ func (in *Certificates) DeepCopy() *Certificates {
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *CertificatesAnalyze) DeepCopyInto(out *CertificatesAnalyze) {
|
||||
*out = *in
|
||||
in.AnalyzeMeta.DeepCopyInto(&out.AnalyzeMeta)
|
||||
if in.Outcomes != nil {
|
||||
in, out := &in.Outcomes, &out.Outcomes
|
||||
*out = make([]*Outcome, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Outcome)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertificatesAnalyze.
|
||||
func (in *CertificatesAnalyze) DeepCopy() *CertificatesAnalyze {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(CertificatesAnalyze)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ClusterInfo) DeepCopyInto(out *ClusterInfo) {
|
||||
*out = *in
|
||||
@@ -746,6 +782,11 @@ func (in *Collect) DeepCopyInto(out *Collect) {
|
||||
*out = new(Secret)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.CustomMetrics != nil {
|
||||
in, out := &in.CustomMetrics, &out.CustomMetrics
|
||||
*out = new(CustomMetrics)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.ConfigMap != nil {
|
||||
in, out := &in.ConfigMap, &out.ConfigMap
|
||||
*out = new(ConfigMap)
|
||||
@@ -1122,6 +1163,27 @@ func (in *CopyFromHost) DeepCopy() *CopyFromHost {
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *CustomMetrics) DeepCopyInto(out *CustomMetrics) {
|
||||
*out = *in
|
||||
in.CollectorMeta.DeepCopyInto(&out.CollectorMeta)
|
||||
if in.MetricRequests != nil {
|
||||
in, out := &in.MetricRequests, &out.MetricRequests
|
||||
*out = make([]MetricRequest, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomMetrics.
|
||||
func (in *CustomMetrics) DeepCopy() *CustomMetrics {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(CustomMetrics)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *CustomResourceDefinition) DeepCopyInto(out *CustomResourceDefinition) {
|
||||
*out = *in
|
||||
@@ -1625,6 +1687,11 @@ func (in *HostAnalyze) DeepCopyInto(out *HostAnalyze) {
|
||||
*out = new(CertificateAnalyze)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.CertificatesCollection != nil {
|
||||
in, out := &in.CertificatesCollection, &out.CertificatesCollection
|
||||
*out = new(HostCertificatesCollectionAnalyze)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.HostServices != nil {
|
||||
in, out := &in.HostServices, &out.HostServices
|
||||
*out = new(HostServicesAnalyze)
|
||||
@@ -1635,6 +1702,11 @@ func (in *HostAnalyze) DeepCopyInto(out *HostAnalyze) {
|
||||
*out = new(HostOSAnalyze)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.TextAnalyze != nil {
|
||||
in, out := &in.TextAnalyze, &out.TextAnalyze
|
||||
*out = new(TextAnalyze)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostAnalyze.
|
||||
@@ -1663,6 +1735,54 @@ func (in *HostBlockDevices) DeepCopy() *HostBlockDevices {
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *HostCertificatesCollection) DeepCopyInto(out *HostCertificatesCollection) {
|
||||
*out = *in
|
||||
in.HostCollectorMeta.DeepCopyInto(&out.HostCollectorMeta)
|
||||
if in.Paths != nil {
|
||||
in, out := &in.Paths, &out.Paths
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostCertificatesCollection.
|
||||
func (in *HostCertificatesCollection) DeepCopy() *HostCertificatesCollection {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(HostCertificatesCollection)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *HostCertificatesCollectionAnalyze) DeepCopyInto(out *HostCertificatesCollectionAnalyze) {
|
||||
*out = *in
|
||||
in.AnalyzeMeta.DeepCopyInto(&out.AnalyzeMeta)
|
||||
if in.Outcomes != nil {
|
||||
in, out := &in.Outcomes, &out.Outcomes
|
||||
*out = make([]*Outcome, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Outcome)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostCertificatesCollectionAnalyze.
|
||||
func (in *HostCertificatesCollectionAnalyze) DeepCopy() *HostCertificatesCollectionAnalyze {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(HostCertificatesCollectionAnalyze)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *HostCollect) DeepCopyInto(out *HostCollect) {
|
||||
*out = *in
|
||||
@@ -1756,6 +1876,11 @@ func (in *HostCollect) DeepCopyInto(out *HostCollect) {
|
||||
*out = new(Certificate)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.CertificatesCollection != nil {
|
||||
in, out := &in.CertificatesCollection, &out.CertificatesCollection
|
||||
*out = new(HostCertificatesCollection)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.HostServices != nil {
|
||||
in, out := &in.HostServices, &out.HostServices
|
||||
*out = new(HostServices)
|
||||
@@ -2702,6 +2827,21 @@ func (in *MemoryAnalyze) DeepCopy() *MemoryAnalyze {
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *MetricRequest) DeepCopyInto(out *MetricRequest) {
|
||||
*out = *in
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricRequest.
|
||||
func (in *MetricRequest) DeepCopy() *MetricRequest {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(MetricRequest)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *NodeResourceFilters) DeepCopyInto(out *NodeResourceFilters) {
|
||||
*out = *in
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user