From a86a90b592c5fb8ca343f7e36a297cfab672b305 Mon Sep 17 00:00:00 2001 From: keisku Date: Sat, 27 Apr 2024 23:19:26 +0000 Subject: [PATCH] fix: Cannot explain if a filed contains uppercase letters --- .github/workflows/go_test.yaml | 24 --------------------- .github/workflows/test.yaml | 38 ++++++++++++++++++++++++++++++++++ options.go | 35 ++++++++++++++++++------------- 3 files changed, 59 insertions(+), 38 deletions(-) delete mode 100644 .github/workflows/go_test.yaml create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/go_test.yaml b/.github/workflows/go_test.yaml deleted file mode 100644 index 43f7f4e..0000000 --- a/.github/workflows/go_test.yaml +++ /dev/null @@ -1,24 +0,0 @@ -on: - pull_request: - push: - branches: - - main -name: go test -jobs: - test: - strategy: - matrix: - go-version: [1.22.2] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} - steps: - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: ${{ matrix.go-version }} - - name: Checkout code - uses: actions/checkout@v4 - - name: go vet - run: go vet ./... - - name: go test - run: go test -v ./... diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..42f6a13 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,38 @@ +on: + pull_request: + push: + branches: + - main +name: test +jobs: + test: + strategy: + matrix: + microk8s: [1.29/stable, 1.30/stable] + os: [ubuntu-latest] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Install microk8s + run: | + sudo snap install microk8s --classic --channel=${{ matrix.microk8s }} + - name: Install Go + uses: actions/setup-go@v5 + - name: go vet + run: go vet ./... + - name: go test + run: go test -v ./... + - name: Build kubectl-explore + run: | + go build + chmod +x kubectl-explore + sudo install kubectl-explore /usr/local/bin + - name: Run kubectl-explore + run: | + sudo microk8s kubectl explore hpa.*own.*id > /dev/null + sudo microk8s kubectl explore provider > /dev/null + sudo microk8s kubectl explore statefulset.spec.template.spec.volumes.projected.sources.serviceAccountToken.expirationSeconds > /dev/null + sudo microk8s kubectl explore sts.spec.template.spec.volumes.projected.sources.serviceAccountToken.expirationSeconds > /dev/null + sudo microk8s kubectl explore sts.spec.template.spec.volumes.projected.sources.serviceAccountToken.expir > /dev/null diff --git a/options.go b/options.go index 74a5448..651847c 100644 --- a/options.go +++ b/options.go @@ -30,9 +30,9 @@ type Options struct { Discovery discovery.CachedDiscoveryInterface Schema openapi.Resources - inputFieldPath *regexp.Regexp - resource string - gvks []schema.GroupVersionKind + inputFieldPathRegex *regexp.Regexp + inputFieldPath string + gvks []schema.GroupVersionKind } func NewCmd() *cobra.Command { @@ -93,13 +93,13 @@ func NewOptions(streams genericclioptions.IOStreams) *Options { func (o *Options) Complete(f cmdutil.Factory, args []string) error { var err error if len(args) == 0 { - o.inputFieldPath = regexp.MustCompile(".*") + o.inputFieldPathRegex = regexp.MustCompile(".*") } else { - o.inputFieldPath, err = regexp.Compile(args[0]) + o.inputFieldPathRegex, err = regexp.Compile(args[0]) if err != nil { return err } - o.resource = args[0] + o.inputFieldPath = args[0] } o.Discovery, err = f.ToDiscoveryClient() if err != nil { @@ -113,7 +113,7 @@ func (o *Options) Complete(f cmdutil.Factory, args []string) error { if err != nil { return err } - if o.resource == "" { + if o.inputFieldPath == "" { gvk, err := o.findGVK() if err != nil { return err @@ -123,8 +123,8 @@ func (o *Options) Complete(f cmdutil.Factory, args []string) error { var gvk schema.GroupVersionKind var err error var idx int - for i := 1; i <= len(o.resource); i++ { - gvk, err = o.getGVK(o.resource[:i]) + for i := 1; i <= len(o.inputFieldPath); i++ { + gvk, err = o.getGVK(o.inputFieldPath[:i]) if err != nil { continue } @@ -137,10 +137,17 @@ func (o *Options) Complete(f cmdutil.Factory, args []string) error { return err } } else { - // The left part of the input should be the resource name. E.g., "hpa", "sts", etc - // The right part of the input should be the field name or regex. E.g., "spec.replicas", "spec.*containers", etc - right := strings.TrimLeft(o.resource, o.resource[:idx]) - o.inputFieldPath, err = regexp.Compile(strings.ToLower(right)) + // In this case, the input includes the resource name. + + // The left part of the input should be the resource name. + // E.g., "hpa", "statefulset", "node", etc. + left := o.inputFieldPath[:idx] + + // The right part of the input should be the field or regex. + // E.g., "spec.template.spec.volumes.projected.sources.serviceAcc ", "spec.*containers", "spec.providerID", etc. + right := strings.TrimLeft(o.inputFieldPath, left) + + o.inputFieldPathRegex, err = regexp.Compile(right) if err != nil { return err } @@ -168,7 +175,7 @@ func (o *Options) Run() error { return visitor.err } filteredPaths := visitor.listPaths(func(s string) bool { - return o.inputFieldPath.MatchString(s) + return o.inputFieldPathRegex.MatchString(s) }) for _, p := range filteredPaths { pathExplainers[p] = explainer{