{"id":13697378,"url":"https://github.com/rewanthtammana/kubectl-fields","last_synced_at":"2026-01-11T23:53:50.210Z","repository":{"id":41511331,"uuid":"210904548","full_name":"rewanthtammana/kubectl-fields","owner":"rewanthtammana","description":"Kubernetes resources hierarchy parsing tool","archived":false,"fork":false,"pushed_at":"2023-05-25T17:31:33.000Z","size":75,"stargazers_count":63,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-13T01:34:07.941Z","etag":null,"topics":["cka-exam","go","golang","kubectl","kubernetes"],"latest_commit_sha":null,"homepage":"https://blog.rewanthtammana.com/kubectl-fields-one-liner-kubernetes-resource-hierarchy-dumper","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rewanthtammana.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-09-25T17:39:41.000Z","updated_at":"2024-08-03T20:42:42.000Z","dependencies_parsed_at":"2023-07-13T19:45:40.432Z","dependency_job_id":null,"html_url":"https://github.com/rewanthtammana/kubectl-fields","commit_stats":null,"previous_names":["rewanth1997/order","rewanth1997/kubectl-fields"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewanthtammana%2Fkubectl-fields","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewanthtammana%2Fkubectl-fields/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewanthtammana%2Fkubectl-fields/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rewanthtammana%2Fkubectl-fields/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rewanthtammana","download_url":"https://codeload.github.com/rewanthtammana/kubectl-fields/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252252479,"owners_count":21718748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cka-exam","go","golang","kubectl","kubernetes"],"created_at":"2024-08-02T18:00:57.202Z","updated_at":"2026-01-11T23:53:50.164Z","avatar_url":"https://github.com/rewanthtammana.png","language":"Go","funding_links":[],"categories":["Kubernetes tooling"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003ekubectl-fields\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003eKubectl resources hierarchy parsing tool\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://cloud.drone.io/rewanthtammana/kubectl-fields\"\u003e\n    \u003cimg src=\"https://cloud.drone.io/api/badges/rewanthtammana/kubectl-fields/status.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/rewanthtammana/kubectl-fields\"\u003e\n    \u003cimg src=\"https://goreportcard.com/badge/github.com/rewanthtammana/kubectl-fields\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/rewanthtammana/kubectl-fields/blob/master/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/rewanthtammana/kubectl-fields/releases\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/downloads/rewanthtammana/kubectl-fields/total.svg?style=for-the-badge\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eKubectl-fields is a cli tool to parse \u003ccode\u003ekubectl explain --recursive\u003c/code\u003e output to match given field and print its parental hierarchy in one-liner format.\u003c/p\u003e\n\n## Installation\n\nInstalling with krew\n```console\nkubectl krew install fields\n```\n\nInstalling with wget\n```console\nwget https://github.com/rewanthtammana/kubectl-fields/releases/download/v1.2.0-beta/kubectl-fields-Linux-x86_64.tar.gz\nsudo tar xvf kubectl-fields-Linux-x86_64.tar.gz -C /usr/bin/\n```\n\n## Developer build\n\nBuild from Makefile\n```console\nmake build\n```\n\nBuild only for Linux\n```console\nmake build-linux\n```\n\nBuild with go\n```console\ngo get ./...\ngo build -o kubectl-fields main.go\nmv kubectl-fields /usr/bin\n```\n\nCross platform builds with go\n```console\ngo get ./...\nGOOS=windows GOARCH=amd64 go build -o kubectl-fields.exe main.go\n```\n\n## Usage\n\n```console\nrewanth@ubuntu:~/go/src/kubectl-fields$ kubectl fields -h\nkubectl-fields parses specified kubectl resources to match given pattern(s).\nIt prints matched fields parental hierarchy in one-liner format.\n\nMore info: https://github.com/rewanthtammana/kubectl-fields\n\nUsage:\n  kubectl-fields [flags]\n\nExamples:\nFind resource field hierarchy:\n$ kubectl fields svc affinity\nspec.sessionAffinity\nspec.sessionAffinityConfig\n\nFind resource field hierarchy (case sensitive match):\n$ kubectl fields po.spec.volumes -I Ver\ndownwardAPI.items.fieldRef.apiVersion\nprojected.sources.downwardAPI.items.fieldRef.apiVersion\n\nFlags:\n  -I, --case-sensitive   Case sensitive pattern match\n  -h, --help             help for kubectl-fields\n      --no-color         Do not print colored output\n      --stdin            Expects input via pipes\n```\n\n## Examples\n\n**Default match**\n\n![default-match](https://user-images.githubusercontent.com/22347290/66461949-b4746900-ea97-11e9-83db-8ad643a31808.PNG)\n\n**Case sensitive match**\n\n![case-sensitive-match](https://user-images.githubusercontent.com/22347290/66461959-bccca400-ea97-11e9-989e-a43d9f52d09f.PNG)\n\n**Multi pattern match**\n\n![combo](https://user-images.githubusercontent.com/22347290/66461990-c81fcf80-ea97-11e9-93a6-7aa9077f5d5d.PNG)\n\n**Output on windows cmd**\n\n![windows-all](https://user-images.githubusercontent.com/22347290/66462021-d8d04580-ea97-11e9-8ac7-51fb5fe79439.PNG)\n\n## Pipeline\n\nThis application uses [drone CI](https://github.com/drone/drone) for building and running all test cases.\n\nAll the test cases are associated with kubectl. But as of now we cannot run `kubectl` inside containers. As a way around, all the kubectl data required for running test cases is pre-saved into text files. All the test cases are executed from pre-saved data against fresh built binary executable to check its robustness.\n\n## Why to use\n\nCKA and CKAD are time-constrained exams. The default kubectl explain recursive command consumes lot of time to find the exact hierarchical order. This tool is built to ease the process of finding hierarchial structure for a given parameter.\n\nIt is difficult to lookup for exact hierarchical structure using kubectl explain recursive command. This tool solves this particular problem by printing the output in a easy readable one-liner format.\n\nThis tool has tremendous advantage over grep for this use case.\n\n### Problem statement\n\nFor ex, in CKA/CKAD exam you are asked to add SYS_ADMIN capabilities to a given pod. Finding the exact hierarchial order using kubectl explain command is time consuming and tiresome.\n\n### Current solution approach\n\nLet's say you know that capabilities exist inside `po.spec`. You can apply recursive loop directly on `po.spec` instead of running it globally on `po`.\n\nYou can try to grep for string, \"capabilities\". The output is as follows:\n\n```console\nrewanth@ubuntu:~/go/src/kubectl-fields$ kubectl explain --recursive po.spec | grep capabilities\n         capabilities   \u003cObject\u003e\n         capabilities   \u003cObject\u003e\n```\n\nIn case if you need to find \"version\" attribute in services, then the below command is executed.\n\n```console\n$ kubectl explain --recursive svc | grep -i version\nVERSION:  v1\n   apiVersion\t\u003cstring\u003e\n            apiVersion\t\u003cstring\u003e\n               resourceVersion\t\u003cstring\u003e\n         apiVersion\t\u003cstring\u003e\n         apiVersion\t\u003cstring\u003e\n      resourceVersion\t\u003cstring\u003e\n```\n\nBut it doesn't show the hierarchial order of attribute. It just shows the matching lines. You can use advanced grep functions and try to find the parent hierarchy of `capabilities` attribute.\n\n```console\nrewanth@ubuntu:~/go/src/kubectl-fields$ kubectl explain --recursive po.spec | grep capabilities -C 5\n      resources \u003cObject\u003e\n         limits \u003cmap[string]string\u003e\n         requests       \u003cmap[string]string\u003e\n      securityContext   \u003cObject\u003e\n         allowPrivilegeEscalation       \u003cboolean\u003e\n         capabilities   \u003cObject\u003e\n            add \u003c[]string\u003e\n            drop        \u003c[]string\u003e\n         privileged     \u003cboolean\u003e\n         procMount      \u003cstring\u003e\n         readOnlyRootFilesystem \u003cboolean\u003e\n--\n      resources \u003cObject\u003e\n         limits \u003cmap[string]string\u003e\n         requests       \u003cmap[string]string\u003e\n      securityContext   \u003cObject\u003e\n         allowPrivilegeEscalation       \u003cboolean\u003e\n         capabilities   \u003cObject\u003e\n            add \u003c[]string\u003e\n            drop        \u003c[]string\u003e\n         privileged     \u003cboolean\u003e\n         procMount      \u003cstring\u003e\n         readOnlyRootFilesystem \u003cboolean\u003e\n\n```\n\nBut still it doesn't show the complete parent hierarchy order. The full list need to be printed, scrolled and analyzed to find the exact hierarchical structure.\n\nNot only it will take so much time to scroll up and down to find parent of an element in terminal, the process is very tedious.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ekubectl explain --recursive po.spec\u003c/strong\u003e (click to expand 624 lines output)\u003c/summary\u003e\n\n```console\nrewanth@ubuntu:~/go/src/kubectl-fields$ kubectl explain --recursive po.spec\nKIND:     Pod\nVERSION:  v1\n\nRESOURCE: spec \u003cObject\u003e\n\nDESCRIPTION:\n     Specification of the desired behavior of the pod. More info:\n     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status\n\n     PodSpec is a description of a pod.\n\nFIELDS:\n   activeDeadlineSeconds\t\u003cinteger\u003e\n   affinity\t\u003cObject\u003e\n      nodeAffinity\t\u003cObject\u003e\n         preferredDuringSchedulingIgnoredDuringExecution\t\u003c[]Object\u003e\n            preference\t\u003cObject\u003e\n               matchExpressions\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  operator\t\u003cstring\u003e\n                  values\t\u003c[]string\u003e\n               matchFields\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  operator\t\u003cstring\u003e\n                  values\t\u003c[]string\u003e\n            weight\t\u003cinteger\u003e\n         requiredDuringSchedulingIgnoredDuringExecution\t\u003cObject\u003e\n            nodeSelectorTerms\t\u003c[]Object\u003e\n               matchExpressions\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  operator\t\u003cstring\u003e\n                  values\t\u003c[]string\u003e\n               matchFields\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  operator\t\u003cstring\u003e\n                  values\t\u003c[]string\u003e\n      podAffinity\t\u003cObject\u003e\n         preferredDuringSchedulingIgnoredDuringExecution\t\u003c[]Object\u003e\n            podAffinityTerm\t\u003cObject\u003e\n               labelSelector\t\u003cObject\u003e\n                  matchExpressions\t\u003c[]Object\u003e\n                     key\t\u003cstring\u003e\n                     operator\t\u003cstring\u003e\n                     values\t\u003c[]string\u003e\n                  matchLabels\t\u003cmap[string]string\u003e\n               namespaces\t\u003c[]string\u003e\n               topologyKey\t\u003cstring\u003e\n            weight\t\u003cinteger\u003e\n         requiredDuringSchedulingIgnoredDuringExecution\t\u003c[]Object\u003e\n            labelSelector\t\u003cObject\u003e\n               matchExpressions\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  operator\t\u003cstring\u003e\n                  values\t\u003c[]string\u003e\n               matchLabels\t\u003cmap[string]string\u003e\n            namespaces\t\u003c[]string\u003e\n            topologyKey\t\u003cstring\u003e\n      podAntiAffinity\t\u003cObject\u003e\n         preferredDuringSchedulingIgnoredDuringExecution\t\u003c[]Object\u003e\n            podAffinityTerm\t\u003cObject\u003e\n               labelSelector\t\u003cObject\u003e\n                  matchExpressions\t\u003c[]Object\u003e\n                     key\t\u003cstring\u003e\n                     operator\t\u003cstring\u003e\n                     values\t\u003c[]string\u003e\n                  matchLabels\t\u003cmap[string]string\u003e\n               namespaces\t\u003c[]string\u003e\n               topologyKey\t\u003cstring\u003e\n            weight\t\u003cinteger\u003e\n         requiredDuringSchedulingIgnoredDuringExecution\t\u003c[]Object\u003e\n            labelSelector\t\u003cObject\u003e\n               matchExpressions\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  operator\t\u003cstring\u003e\n                  values\t\u003c[]string\u003e\n               matchLabels\t\u003cmap[string]string\u003e\n            namespaces\t\u003c[]string\u003e\n            topologyKey\t\u003cstring\u003e\n   automountServiceAccountToken\t\u003cboolean\u003e\n   containers\t\u003c[]Object\u003e\n      args\t\u003c[]string\u003e\n      command\t\u003c[]string\u003e\n      env\t\u003c[]Object\u003e\n         name\t\u003cstring\u003e\n         value\t\u003cstring\u003e\n         valueFrom\t\u003cObject\u003e\n            configMapKeyRef\t\u003cObject\u003e\n               key\t\u003cstring\u003e\n               name\t\u003cstring\u003e\n               optional\t\u003cboolean\u003e\n            fieldRef\t\u003cObject\u003e\n               apiVersion\t\u003cstring\u003e\n               fieldPath\t\u003cstring\u003e\n            resourceFieldRef\t\u003cObject\u003e\n               containerName\t\u003cstring\u003e\n               divisor\t\u003cstring\u003e\n               resource\t\u003cstring\u003e\n            secretKeyRef\t\u003cObject\u003e\n               key\t\u003cstring\u003e\n               name\t\u003cstring\u003e\n               optional\t\u003cboolean\u003e\n      envFrom\t\u003c[]Object\u003e\n         configMapRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n            optional\t\u003cboolean\u003e\n         prefix\t\u003cstring\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n            optional\t\u003cboolean\u003e\n      image\t\u003cstring\u003e\n      imagePullPolicy\t\u003cstring\u003e\n      lifecycle\t\u003cObject\u003e\n         postStart\t\u003cObject\u003e\n            exec\t\u003cObject\u003e\n               command\t\u003c[]string\u003e\n            httpGet\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               httpHeaders\t\u003c[]Object\u003e\n                  name\t\u003cstring\u003e\n                  value\t\u003cstring\u003e\n               path\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n               scheme\t\u003cstring\u003e\n            tcpSocket\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n         preStop\t\u003cObject\u003e\n            exec\t\u003cObject\u003e\n               command\t\u003c[]string\u003e\n            httpGet\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               httpHeaders\t\u003c[]Object\u003e\n                  name\t\u003cstring\u003e\n                  value\t\u003cstring\u003e\n               path\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n               scheme\t\u003cstring\u003e\n            tcpSocket\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n      livenessProbe\t\u003cObject\u003e\n         exec\t\u003cObject\u003e\n            command\t\u003c[]string\u003e\n         failureThreshold\t\u003cinteger\u003e\n         httpGet\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            httpHeaders\t\u003c[]Object\u003e\n               name\t\u003cstring\u003e\n               value\t\u003cstring\u003e\n            path\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n            scheme\t\u003cstring\u003e\n         initialDelaySeconds\t\u003cinteger\u003e\n         periodSeconds\t\u003cinteger\u003e\n         successThreshold\t\u003cinteger\u003e\n         tcpSocket\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n         timeoutSeconds\t\u003cinteger\u003e\n      name\t\u003cstring\u003e\n      ports\t\u003c[]Object\u003e\n         containerPort\t\u003cinteger\u003e\n         hostIP\t\u003cstring\u003e\n         hostPort\t\u003cinteger\u003e\n         name\t\u003cstring\u003e\n         protocol\t\u003cstring\u003e\n      readinessProbe\t\u003cObject\u003e\n         exec\t\u003cObject\u003e\n            command\t\u003c[]string\u003e\n         failureThreshold\t\u003cinteger\u003e\n         httpGet\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            httpHeaders\t\u003c[]Object\u003e\n               name\t\u003cstring\u003e\n               value\t\u003cstring\u003e\n            path\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n            scheme\t\u003cstring\u003e\n         initialDelaySeconds\t\u003cinteger\u003e\n         periodSeconds\t\u003cinteger\u003e\n         successThreshold\t\u003cinteger\u003e\n         tcpSocket\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n         timeoutSeconds\t\u003cinteger\u003e\n      resources\t\u003cObject\u003e\n         limits\t\u003cmap[string]string\u003e\n         requests\t\u003cmap[string]string\u003e\n      securityContext\t\u003cObject\u003e\n         allowPrivilegeEscalation\t\u003cboolean\u003e\n         capabilities\t\u003cObject\u003e\n            add\t\u003c[]string\u003e\n            drop\t\u003c[]string\u003e\n         privileged\t\u003cboolean\u003e\n         procMount\t\u003cstring\u003e\n         readOnlyRootFilesystem\t\u003cboolean\u003e\n         runAsGroup\t\u003cinteger\u003e\n         runAsNonRoot\t\u003cboolean\u003e\n         runAsUser\t\u003cinteger\u003e\n         seLinuxOptions\t\u003cObject\u003e\n            level\t\u003cstring\u003e\n            role\t\u003cstring\u003e\n            type\t\u003cstring\u003e\n            user\t\u003cstring\u003e\n         windowsOptions\t\u003cObject\u003e\n            gmsaCredentialSpec\t\u003cstring\u003e\n            gmsaCredentialSpecName\t\u003cstring\u003e\n      stdin\t\u003cboolean\u003e\n      stdinOnce\t\u003cboolean\u003e\n      terminationMessagePath\t\u003cstring\u003e\n      terminationMessagePolicy\t\u003cstring\u003e\n      tty\t\u003cboolean\u003e\n      volumeDevices\t\u003c[]Object\u003e\n         devicePath\t\u003cstring\u003e\n         name\t\u003cstring\u003e\n      volumeMounts\t\u003c[]Object\u003e\n         mountPath\t\u003cstring\u003e\n         mountPropagation\t\u003cstring\u003e\n         name\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         subPath\t\u003cstring\u003e\n         subPathExpr\t\u003cstring\u003e\n      workingDir\t\u003cstring\u003e\n   dnsConfig\t\u003cObject\u003e\n      nameservers\t\u003c[]string\u003e\n      options\t\u003c[]Object\u003e\n         name\t\u003cstring\u003e\n         value\t\u003cstring\u003e\n      searches\t\u003c[]string\u003e\n   dnsPolicy\t\u003cstring\u003e\n   enableServiceLinks\t\u003cboolean\u003e\n   hostAliases\t\u003c[]Object\u003e\n      hostnames\t\u003c[]string\u003e\n      ip\t\u003cstring\u003e\n   hostIPC\t\u003cboolean\u003e\n   hostNetwork\t\u003cboolean\u003e\n   hostPID\t\u003cboolean\u003e\n   hostname\t\u003cstring\u003e\n   imagePullSecrets\t\u003c[]Object\u003e\n      name\t\u003cstring\u003e\n   initContainers\t\u003c[]Object\u003e\n      args\t\u003c[]string\u003e\n      command\t\u003c[]string\u003e\n      env\t\u003c[]Object\u003e\n         name\t\u003cstring\u003e\n         value\t\u003cstring\u003e\n         valueFrom\t\u003cObject\u003e\n            configMapKeyRef\t\u003cObject\u003e\n               key\t\u003cstring\u003e\n               name\t\u003cstring\u003e\n               optional\t\u003cboolean\u003e\n            fieldRef\t\u003cObject\u003e\n               apiVersion\t\u003cstring\u003e\n               fieldPath\t\u003cstring\u003e\n            resourceFieldRef\t\u003cObject\u003e\n               containerName\t\u003cstring\u003e\n               divisor\t\u003cstring\u003e\n               resource\t\u003cstring\u003e\n            secretKeyRef\t\u003cObject\u003e\n               key\t\u003cstring\u003e\n               name\t\u003cstring\u003e\n               optional\t\u003cboolean\u003e\n      envFrom\t\u003c[]Object\u003e\n         configMapRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n            optional\t\u003cboolean\u003e\n         prefix\t\u003cstring\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n            optional\t\u003cboolean\u003e\n      image\t\u003cstring\u003e\n      imagePullPolicy\t\u003cstring\u003e\n      lifecycle\t\u003cObject\u003e\n         postStart\t\u003cObject\u003e\n            exec\t\u003cObject\u003e\n               command\t\u003c[]string\u003e\n            httpGet\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               httpHeaders\t\u003c[]Object\u003e\n                  name\t\u003cstring\u003e\n                  value\t\u003cstring\u003e\n               path\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n               scheme\t\u003cstring\u003e\n            tcpSocket\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n         preStop\t\u003cObject\u003e\n            exec\t\u003cObject\u003e\n               command\t\u003c[]string\u003e\n            httpGet\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               httpHeaders\t\u003c[]Object\u003e\n                  name\t\u003cstring\u003e\n                  value\t\u003cstring\u003e\n               path\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n               scheme\t\u003cstring\u003e\n            tcpSocket\t\u003cObject\u003e\n               host\t\u003cstring\u003e\n               port\t\u003cstring\u003e\n      livenessProbe\t\u003cObject\u003e\n         exec\t\u003cObject\u003e\n            command\t\u003c[]string\u003e\n         failureThreshold\t\u003cinteger\u003e\n         httpGet\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            httpHeaders\t\u003c[]Object\u003e\n               name\t\u003cstring\u003e\n               value\t\u003cstring\u003e\n            path\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n            scheme\t\u003cstring\u003e\n         initialDelaySeconds\t\u003cinteger\u003e\n         periodSeconds\t\u003cinteger\u003e\n         successThreshold\t\u003cinteger\u003e\n         tcpSocket\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n         timeoutSeconds\t\u003cinteger\u003e\n      name\t\u003cstring\u003e\n      ports\t\u003c[]Object\u003e\n         containerPort\t\u003cinteger\u003e\n         hostIP\t\u003cstring\u003e\n         hostPort\t\u003cinteger\u003e\n         name\t\u003cstring\u003e\n         protocol\t\u003cstring\u003e\n      readinessProbe\t\u003cObject\u003e\n         exec\t\u003cObject\u003e\n            command\t\u003c[]string\u003e\n         failureThreshold\t\u003cinteger\u003e\n         httpGet\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            httpHeaders\t\u003c[]Object\u003e\n               name\t\u003cstring\u003e\n               value\t\u003cstring\u003e\n            path\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n            scheme\t\u003cstring\u003e\n         initialDelaySeconds\t\u003cinteger\u003e\n         periodSeconds\t\u003cinteger\u003e\n         successThreshold\t\u003cinteger\u003e\n         tcpSocket\t\u003cObject\u003e\n            host\t\u003cstring\u003e\n            port\t\u003cstring\u003e\n         timeoutSeconds\t\u003cinteger\u003e\n      resources\t\u003cObject\u003e\n         limits\t\u003cmap[string]string\u003e\n         requests\t\u003cmap[string]string\u003e\n      securityContext\t\u003cObject\u003e\n         allowPrivilegeEscalation\t\u003cboolean\u003e\n         capabilities\t\u003cObject\u003e\n            add\t\u003c[]string\u003e\n            drop\t\u003c[]string\u003e\n         privileged\t\u003cboolean\u003e\n         procMount\t\u003cstring\u003e\n         readOnlyRootFilesystem\t\u003cboolean\u003e\n         runAsGroup\t\u003cinteger\u003e\n         runAsNonRoot\t\u003cboolean\u003e\n         runAsUser\t\u003cinteger\u003e\n         seLinuxOptions\t\u003cObject\u003e\n            level\t\u003cstring\u003e\n            role\t\u003cstring\u003e\n            type\t\u003cstring\u003e\n            user\t\u003cstring\u003e\n         windowsOptions\t\u003cObject\u003e\n            gmsaCredentialSpec\t\u003cstring\u003e\n            gmsaCredentialSpecName\t\u003cstring\u003e\n      stdin\t\u003cboolean\u003e\n      stdinOnce\t\u003cboolean\u003e\n      terminationMessagePath\t\u003cstring\u003e\n      terminationMessagePolicy\t\u003cstring\u003e\n      tty\t\u003cboolean\u003e\n      volumeDevices\t\u003c[]Object\u003e\n         devicePath\t\u003cstring\u003e\n         name\t\u003cstring\u003e\n      volumeMounts\t\u003c[]Object\u003e\n         mountPath\t\u003cstring\u003e\n         mountPropagation\t\u003cstring\u003e\n         name\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         subPath\t\u003cstring\u003e\n         subPathExpr\t\u003cstring\u003e\n      workingDir\t\u003cstring\u003e\n   nodeName\t\u003cstring\u003e\n   nodeSelector\t\u003cmap[string]string\u003e\n   preemptionPolicy\t\u003cstring\u003e\n   priority\t\u003cinteger\u003e\n   priorityClassName\t\u003cstring\u003e\n   readinessGates\t\u003c[]Object\u003e\n      conditionType\t\u003cstring\u003e\n   restartPolicy\t\u003cstring\u003e\n   runtimeClassName\t\u003cstring\u003e\n   schedulerName\t\u003cstring\u003e\n   securityContext\t\u003cObject\u003e\n      fsGroup\t\u003cinteger\u003e\n      runAsGroup\t\u003cinteger\u003e\n      runAsNonRoot\t\u003cboolean\u003e\n      runAsUser\t\u003cinteger\u003e\n      seLinuxOptions\t\u003cObject\u003e\n         level\t\u003cstring\u003e\n         role\t\u003cstring\u003e\n         type\t\u003cstring\u003e\n         user\t\u003cstring\u003e\n      supplementalGroups\t\u003c[]integer\u003e\n      sysctls\t\u003c[]Object\u003e\n         name\t\u003cstring\u003e\n         value\t\u003cstring\u003e\n      windowsOptions\t\u003cObject\u003e\n         gmsaCredentialSpec\t\u003cstring\u003e\n         gmsaCredentialSpecName\t\u003cstring\u003e\n   serviceAccount\t\u003cstring\u003e\n   serviceAccountName\t\u003cstring\u003e\n   shareProcessNamespace\t\u003cboolean\u003e\n   subdomain\t\u003cstring\u003e\n   terminationGracePeriodSeconds\t\u003cinteger\u003e\n   tolerations\t\u003c[]Object\u003e\n      effect\t\u003cstring\u003e\n      key\t\u003cstring\u003e\n      operator\t\u003cstring\u003e\n      tolerationSeconds\t\u003cinteger\u003e\n      value\t\u003cstring\u003e\n   volumes\t\u003c[]Object\u003e\n      awsElasticBlockStore\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         partition\t\u003cinteger\u003e\n         readOnly\t\u003cboolean\u003e\n         volumeID\t\u003cstring\u003e\n      azureDisk\t\u003cObject\u003e\n         cachingMode\t\u003cstring\u003e\n         diskName\t\u003cstring\u003e\n         diskURI\t\u003cstring\u003e\n         fsType\t\u003cstring\u003e\n         kind\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n      azureFile\t\u003cObject\u003e\n         readOnly\t\u003cboolean\u003e\n         secretName\t\u003cstring\u003e\n         shareName\t\u003cstring\u003e\n      cephfs\t\u003cObject\u003e\n         monitors\t\u003c[]string\u003e\n         path\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         secretFile\t\u003cstring\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n         user\t\u003cstring\u003e\n      cinder\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n         volumeID\t\u003cstring\u003e\n      configMap\t\u003cObject\u003e\n         defaultMode\t\u003cinteger\u003e\n         items\t\u003c[]Object\u003e\n            key\t\u003cstring\u003e\n            mode\t\u003cinteger\u003e\n            path\t\u003cstring\u003e\n         name\t\u003cstring\u003e\n         optional\t\u003cboolean\u003e\n      csi\t\u003cObject\u003e\n         driver\t\u003cstring\u003e\n         fsType\t\u003cstring\u003e\n         nodePublishSecretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         volumeAttributes\t\u003cmap[string]string\u003e\n      downwardAPI\t\u003cObject\u003e\n         defaultMode\t\u003cinteger\u003e\n         items\t\u003c[]Object\u003e\n            fieldRef\t\u003cObject\u003e\n               apiVersion\t\u003cstring\u003e\n               fieldPath\t\u003cstring\u003e\n            mode\t\u003cinteger\u003e\n            path\t\u003cstring\u003e\n            resourceFieldRef\t\u003cObject\u003e\n               containerName\t\u003cstring\u003e\n               divisor\t\u003cstring\u003e\n               resource\t\u003cstring\u003e\n      emptyDir\t\u003cObject\u003e\n         medium\t\u003cstring\u003e\n         sizeLimit\t\u003cstring\u003e\n      fc\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         lun\t\u003cinteger\u003e\n         readOnly\t\u003cboolean\u003e\n         targetWWNs\t\u003c[]string\u003e\n         wwids\t\u003c[]string\u003e\n      flexVolume\t\u003cObject\u003e\n         driver\t\u003cstring\u003e\n         fsType\t\u003cstring\u003e\n         options\t\u003cmap[string]string\u003e\n         readOnly\t\u003cboolean\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n      flocker\t\u003cObject\u003e\n         datasetName\t\u003cstring\u003e\n         datasetUUID\t\u003cstring\u003e\n      gcePersistentDisk\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         partition\t\u003cinteger\u003e\n         pdName\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n      gitRepo\t\u003cObject\u003e\n         directory\t\u003cstring\u003e\n         repository\t\u003cstring\u003e\n         revision\t\u003cstring\u003e\n      glusterfs\t\u003cObject\u003e\n         endpoints\t\u003cstring\u003e\n         path\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n      hostPath\t\u003cObject\u003e\n         path\t\u003cstring\u003e\n         type\t\u003cstring\u003e\n      iscsi\t\u003cObject\u003e\n         chapAuthDiscovery\t\u003cboolean\u003e\n         chapAuthSession\t\u003cboolean\u003e\n         fsType\t\u003cstring\u003e\n         initiatorName\t\u003cstring\u003e\n         iqn\t\u003cstring\u003e\n         iscsiInterface\t\u003cstring\u003e\n         lun\t\u003cinteger\u003e\n         portals\t\u003c[]string\u003e\n         readOnly\t\u003cboolean\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n         targetPortal\t\u003cstring\u003e\n      name\t\u003cstring\u003e\n      nfs\t\u003cObject\u003e\n         path\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         server\t\u003cstring\u003e\n      persistentVolumeClaim\t\u003cObject\u003e\n         claimName\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n      photonPersistentDisk\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         pdID\t\u003cstring\u003e\n      portworxVolume\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         volumeID\t\u003cstring\u003e\n      projected\t\u003cObject\u003e\n         defaultMode\t\u003cinteger\u003e\n         sources\t\u003c[]Object\u003e\n            configMap\t\u003cObject\u003e\n               items\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  mode\t\u003cinteger\u003e\n                  path\t\u003cstring\u003e\n               name\t\u003cstring\u003e\n               optional\t\u003cboolean\u003e\n            downwardAPI\t\u003cObject\u003e\n               items\t\u003c[]Object\u003e\n                  fieldRef\t\u003cObject\u003e\n                     apiVersion\t\u003cstring\u003e\n                     fieldPath\t\u003cstring\u003e\n                  mode\t\u003cinteger\u003e\n                  path\t\u003cstring\u003e\n                  resourceFieldRef\t\u003cObject\u003e\n                     containerName\t\u003cstring\u003e\n                     divisor\t\u003cstring\u003e\n                     resource\t\u003cstring\u003e\n            secret\t\u003cObject\u003e\n               items\t\u003c[]Object\u003e\n                  key\t\u003cstring\u003e\n                  mode\t\u003cinteger\u003e\n                  path\t\u003cstring\u003e\n               name\t\u003cstring\u003e\n               optional\t\u003cboolean\u003e\n            serviceAccountToken\t\u003cObject\u003e\n               audience\t\u003cstring\u003e\n               expirationSeconds\t\u003cinteger\u003e\n               path\t\u003cstring\u003e\n      quobyte\t\u003cObject\u003e\n         group\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         registry\t\u003cstring\u003e\n         tenant\t\u003cstring\u003e\n         user\t\u003cstring\u003e\n         volume\t\u003cstring\u003e\n      rbd\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         image\t\u003cstring\u003e\n         keyring\t\u003cstring\u003e\n         monitors\t\u003c[]string\u003e\n         pool\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n         user\t\u003cstring\u003e\n      scaleIO\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         gateway\t\u003cstring\u003e\n         protectionDomain\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n         sslEnabled\t\u003cboolean\u003e\n         storageMode\t\u003cstring\u003e\n         storagePool\t\u003cstring\u003e\n         system\t\u003cstring\u003e\n         volumeName\t\u003cstring\u003e\n      secret\t\u003cObject\u003e\n         defaultMode\t\u003cinteger\u003e\n         items\t\u003c[]Object\u003e\n            key\t\u003cstring\u003e\n            mode\t\u003cinteger\u003e\n            path\t\u003cstring\u003e\n         optional\t\u003cboolean\u003e\n         secretName\t\u003cstring\u003e\n      storageos\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         readOnly\t\u003cboolean\u003e\n         secretRef\t\u003cObject\u003e\n            name\t\u003cstring\u003e\n         volumeName\t\u003cstring\u003e\n         volumeNamespace\t\u003cstring\u003e\n      vsphereVolume\t\u003cObject\u003e\n         fsType\t\u003cstring\u003e\n         storagePolicyID\t\u003cstring\u003e\n         storagePolicyName\t\u003cstring\u003e\n         volumePath\t\u003cstring\u003e\n```\n\u003c/details\u003e\n\n### Proposed solution approach\n\n**`kubectl-fields`** is the solution. This tool fixes the problem by parsing the `kubectl explain --recursive` output and returns a one-liner hierarchial structure instead of tree type hierarchy. This makes it easier for developers/users to analyze the resources hierarchy.\n\nTo find capabilities order in po.spec resources, the following command can be executed.\n\n```console\nrewanth@ubuntu:~/go/src/kubectl-fields$ kubectl fields po.spec capabilities\ncontainers.securityContext.capabilities\ninitContainers.securityContext.capabilities\n```\n\nSimilarly to find \"version\" attribute structure in `services` resource, the below command can be executed.\n\n```console\nrewanth@ubuntu:~/go/src/kubectl-fields$ kubectl fields svc -i version\napiVersion\nmetadata.initializers.result.apiVersion\nmetadata.initializers.result.metadata.resourceVersion\nmetadata.managedFields.apiVersion\nmetadata.ownerReferences.apiVersion\nmetadata.resourceVersion\n```\n\n## Author\n\n[Rewanth Cool](https://www.linkedin.com/in/rewanthcool/)\n\n## Todo\n\n- [x] Document the basic usage for README\n- [x] Build pipeline to run testcases\n- [ ] Release the tool as krew package\n- [ ] Write documentation according to godoc standards\n- [ ] Release the tool as golang package\n- [ ] Release the tool as a debian package\n\n## Contribution and support\n\nWays to contribute\n\n- Suggest a feature\n- Report a bug\n- Fix something and open a pull request\n- Fix documentation\n- Spread the word\n- Like this tool? Star and fork\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frewanthtammana%2Fkubectl-fields","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frewanthtammana%2Fkubectl-fields","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frewanthtammana%2Fkubectl-fields/lists"}