'Getting an error when trying to list IdleVM's in GCP using recommender

I have around 200 projects in GCP, where i am trying to list idle VM's using Google Recommender "google.compute.instance.IdleResourceRecommender". I am iterating through all zones, and finding if there any recommendations using python, code is executing fine for some projects, lets say 20 , after which it is just printing 'items', even though the projects have VM's with recommendation. Below is the code

import requests
import json
import re
import sys
import subprocess
import os
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
from google.oauth2 import service_account


credentials = service_account.Credentials.from_service_account_file("")
service = discovery.build('cloudresourcemanager', 'v1', credentials=credentials)
request = service.projects().list()
token1 = subprocess.Popen("gcloud auth print-access-token", stdout=subprocess.PIPE, shell = True)
token, error = token1.communicate()
token = str(token.decode("utf-8"))
token = token.rstrip("\n")
token = token.rstrip("\r")

while request is not None:
    response = request.execute()
    for project in response.get('projects', []):
        projectid = project['projectId']
        projectname = project['name']

        headers = {
        'Authorization': 'Bearer ' + token,
        'x-goog-user-project': projectid
        }
        get_ul = "https://compute.googleapis.com/compute/v1/projects/"+ projectid +"/zones"
        get_ul_data = requests.get(get_ul, headers= headers)
        get_json = json.loads(get_ul_data.text)
        try:
            for zones in get_json["items"]:
                zone = zones['name']
                post_url= "https://recommender.googleapis.com/v1/projects/" + projectid + "/locations/"+ zone +"/recommenders/google.compute.instance.IdleResourceRecommender/recommendations"
                post_url_data = requests.get(post_url, headers = headers)
                get_api_json = json.loads(post_url_data.text)
                try:
                    for rec in get_api_json["recommendations"]:
                        for OG in rec["content"]["operationGroups"]:
                            for OPS in OG["operations"]:
                                print(rec["description"], rec["recommenderSubtype"])
                               
                except Exception as e:
                    print(e)

        except KeyError as e:
            print(e)

               
    request = service.projects().list_next(previous_request=request, previous_response=response)

Not sure what's happening, somehow it isn't iterating through zones and listing recommendations for some projects.



Solution 1:[1]

If I understand your concern correctly that you were getting empty from this part

for zones in get_json["items"]:
  zone = zones['name']

I think you don't need to call Method: zones.list to get all of the zone every time. You could just use the array to store all and get from array.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tim Chiang