6

I need to find all sts whose replicas are still booting. For this I need to filter sts items based on 2 conditions:

  • each item must have a .status.readyReplicas attribute
  • each readyReplicas attribute must be different than the value in replicas

What I tried results in error:

$ kubectl get sts -o=jsonpath='{range .items[?(@.status.readyReplicas && @.status.readyReplicas!=@.status.replicas)]}{.}{.metadata.name}{"\t"}{.status.readyReplicas}{"/"}{.status.replicas}{"\n"}{end}'
error: error parsing jsonpath {range .items[?(@.status.readyReplicas && @.status.readyReplicas!=@.status.replicas)]}{.}{.metadata.name}{"\t"}{.status.readyReplicas}{"/"}{.status.replicas}{"\n"}{end}, unrecognized character in action: U+0026 '&'

$ kubectl get sts -o=jsonpath='{range .items[?(@.status.readyReplicas AND @.status.readyReplicas!=@.status.replicas)]}{.}{.metadata.name}{"\t"}{.status.readyReplicas}{"/"}{.status.replicas}{"\n"}{end}'
error: error executing jsonpath "{range .items[?(@.status.readyReplicas AND @.status.readyReplicas!=@.status.replicas)]}{.}{.metadata.name}{\"\\t\"}{.status.readyReplicas}{\"/\"}{.status.replicas}{\"\\n\"}{end}": Error executing template: unrecognized identifier AND. Printing more information for debugging the template: ...

The suggested solution on JsonPath AND Operator on Array using comma doesn't work either:

$ k get sts -o=jsonpath='{range .items[?(@.status.readyReplicas), ?(@.status.readyReplicas!=@.status.replicas)]}{.}{.metadata.name}{"\t"}{.status.readyReplicas}{"/"}{.status.replicas}{"\n"}{end}'
error: error parsing jsonpath {range .items[?(@.status.readyReplicas), ?(@.status.readyReplicas!=@.status.replicas)]}{.}{.metadata.name}{"\t"}{.status.readyReplicas}{"/"}{.status.replicas}{"\n"}{end}, unclosed array expect ]

I'm looking for a k8s' jsonpath native solution, not workarounds with jq, etc. Thanks for helping.

Alex
  • 1,313
  • 14
  • 28

0 Answers0