Search code examples
javascriptnode.jsjsonkubectl

Using Nodejs to parse kubectl output "TypeError: item.spec.map is not a function"


Using nodejs trying to parse attribute value(number of replicas) by running child_process kubectl deployment json output Can you please suggest what I am doing wrong??

** Error: var deploymentInfo = item.spec.map((c) => { return { replicas: c.replicas} }); ^ TypeError: item.spec.map is not a function **

` {

"apiVersion": "v1",
"items": [
    {
        "apiVersion": "extensions/v1beta1",
        "kind": "Deployment",
        "metadata": {
            "labels": {
                "env": "stage"
            },
            "name": "sl-deployment"
        },
        "spec": {
            "progressDeadlineSeconds": 2147483647,
            "replicas": 3,
            "revisionHistoryLimit": 3,
            "selector": {
                "matchLabels": {
                    "env": "nonprod",
                    "microservice": "svc-microservice",
                    "name": "sl-deployment"
                }
            },
            "strategy": {
                "rollingUpdate": {
                    "maxSurge": 1,
                    "maxUnavailable": 1
                },
                "type": "RollingUpdate"
            },
            "template": {
                "metadata": {
                    "labels": {
                        "env": "stage",
                        "microservice": "svc-microservice",
                        "name": "sl-deployment"
                    }
                },
                "spec": {
                    "containers": [
                        {
                            "image": "myregistry/svc-microservice/sl-deployment:stage.4.30",
                            "name": "sl-deployment",
                            "resources": {
                                "limits": {
                                    "cpu": "6",
                                    "memory": "16Gi"
                                },
                                "requests": {
                                    "cpu": "2",
                                    "memory": "6Gi"
                                }
                            }
                
                        }
                    ]
                   
                }
            }
        }
    } ]`

Tried the code pasted below

exec(`kubectl get deployment -n svc-microservice -o json`, (error, stdout, stderr) => {
        if (error) {
          console.log(`error: ${error.message}`);
          return;
        }
        if (stderr) {
          console.log(`stderr: ${stderr}`);
          return;
        }
        var deployjson = JSON.parse(stdout);
        
        for (let item of deployjson.items) {
          
          var  deploymentInfo = item.spec.map((c) => { return { replicas: c.replicas} });
          for (let info of deploymentInfo) {
            metadata[name][info.name] = { deployment:info.replicas}
          }
        }
        })

** Error: var deploymentInfo = item.spec.map((c) => { return { replicas: c.replicas} }); ^ TypeError: item.spec.map is not a function **


Solution

  • It looks like the spec property is an object, so you can't use the map function on it. The map function is only for arrays.

    If you just want to grab the replicas property, you don't need to do anything special, just access the property on the spec object:

    item.spec.replicas