What modifications do I need to make to my gcloud command to get the list of enabled services in all GCP projects in the below tabular format? - google-cloud-platform

I have the following code block to enumerate the enabled services in all GCP projects:
for project in $(gcloud projects list --format="value(projectId)"); \
do gcloud services list --project $project --format="table[box]($project,config.name,config.title)"; \
done;
It gives me the output in this format:
But I would like the output to be in this format:
How do I accomplish that? Please advise. Thanks.

You can't using gcloud because you need to assemble values from multiple commands: Projects.List and Services.List. gcloud --format applies only to the output from a single command.
You're grabbing all the data you need (Project, Name and Title). I recommend you use bash and the characters output by gcloud to form the table, and synthesize the table output for yourself.
Update
Here's a script that'll get you CSV output that matches your rows:
PROJECTS=$(\
gcloud projects list \
--format="value(projectId)")
for PROJECT in ${PROJECTS}
do
CONFIGS=$(gcloud services list \
--project=${PROJECT} \
--format="csv[no-heading](config.name,config.title.encode(base64))")
for CONFIG in ${CONFIGS}
do
IFS=, read NAME TITLE <<< ${CONFIG}
TITLE=$(echo ${TITLE} | base64 --decode)
echo "${PROJECT},${NAME},\"${TITLE}\""
done
done
NOTE encode(base64) to avoid the unquote title values from being split. base64 --decode reverses this at output. It should be possible to use format but I don't understand the syntax. --format='csv[no-heading](config.name,format("\"{0}\"",config.title))' didn't work.
Then, in the best *nix tradition, you can pipe that output into awk or columns or some other script that formats the CSV as a pretty-printed table. This is the more difficult challenge because you'll want to determine the longest value in each field in order to layout correctly. I'll leave that to you.

Related

Trying to reverse the sequence of values returned by my gcloud query

I have a gcloud query that performs a certain task and returns a table of values exported to a CSV file.
There is one particular field that returns multiple values within each cell of its column. For example: Item1,Item2,Item3,...,ItemN
I would like to reverse this sequence.
Desired output: ItemN,...,Item3,Item2,Item1
Now I know that I can use Bash to do this. But I think that there's a sort() option in gcloud as well, something like --format="csv(FieldName.sort())".
Can someone please help me here? Thanks.
Please include more details in your question to help us answer it.
There's a projection function sort that may help.
Compute Engine instances are a good exemplar as they contain repeating properties (labels, scopes) and these values can be sorted using sort():
PROJECT=...
ZONE=...
# sort: labels (keys)
gcloud compute instances describe ${INSTANCE} \
--project=${PROJECT} \
--zone=${ZONE} \
--format="value(labels.sort())"
# sort: 1st associated Service Account's scopes
gcloud compute instances describe ${INSTANCE} \
--project=${PROJECT} \
--zone=${ZONE} \
--format="value(serviceAccounts[0].scopes.sort())"

Gcloud List Output Format Not Columnar

Any list command in gcloud shell is returning in an unexpected, harder to read format.
Example: From doc: https://cloud.google.com/blog/products/it-ops/filtering-and-formatting-fun-with
Let's start off by formatting a simple command that you are already
familiar with that lists the projects to which you have access:
gcloud projects list
PROJECT_ID NAME PROJECT_NUMBER
canvas-syntax-130823 scesproject2 346904393285
windy-bearing-129522 scesproject1 222844913538
When I try this I always get format:
PROJECT_ID: anvas-syntax-130823
NAME: scesproject2
PROJECT_NUMBER: 346904393285
PROJECT_ID: windy-bearing-129522
NAME: scesproject1
PROJECT_NUMBER: 222844913538
This format is harder to read and navigate especially for longer outputs.
Any idea why I am getting output in this format?
I tried with different instances, different accounts, it is not tied to any config I would have.
I know about the --format options, I would just like to understand why and where is the "tabular" default view gone?
The CLI has an option to make output easier for screen readers to process.
To disable that feature:
gcloud config set accessibility/screen_reader false
To enable that feature:
gcloud config set accessibility/screen_reader true
This link provides more information:
gcloud config set

gcloud command output formatting to use results in another gcloud command

I'm trying to automate the deletion of SSL certificates that end with a certain text pattern on GCP projects.
For this I use the command:
gcloud compute ssl-certificates list --filter="name~'819$'" --format="(name)"
Which output displays exactly this format:
NAME
certname1-1602160819
certname2-1602160819
certname3-1602160819
...and so on
The thing is that if I want to use the results from this command to then use it to input another gcloud command that deletes each certificate, I get the first variable as NAME which is the field title and obviously not a certificate.
Here is my script:
#!/bin/bash
for oldcert in $( gcloud compute ssl-certificates list --filter="name~'819$'" --format="(NAME)")
do
gcloud compute ssl-certificates delete $oldcert
done
Do you know how I could get the field name NAME out of my output so I could treat each result in another command directly.
Thanks for your precious advices
#Hitobat thanks very much for your comment
I used the csv[no-heading] option even though the tails -n +2 otion also does the job
the following commands did the job great:
#!/bin/bash
for oldcert in $( gcloud compute ssl-certificates list --filter="name~'819$'" --format="csv[no-heading](name)")
do
gcloud compute ssl-certificates delete $oldcert --quiet
done
The right format to use is --format=value[](name).
According to the docs:
value
CSV with no heading and <TAB> separator instead of <COMMA>. Used
to retrieve individual resource values.
So it's equivalent to the --format="csv[no-heading](name) that you used, but "more correct" (and a little more legible).

Is there any command to list all the GCP project quota in a single excel file with only top headers

Is there any command to list all the GCP project quota in a single excel file with only top headers. I tried to apply FOR loop on quota management however it gives me output with header included every time with new projects when appended.
gcloud compute project-info describe --flatten=quotas -- format='csv(quotas.metric,quotas.limit,quotas.usage)' will provide for one project. However require for all project on Org level and folder level in a single excel file.
I crafted this bash code that can help you in order to iterate all projects related with the account used with GCloud feel free to modify this code according your use case
#!/bin/bash
#unique header
echo "ProjectId,Metric,Quota,Usage"
gcloud projects list --format="csv[no-heading](projectId,name)" |\
while IFS="," read -r ID NAME
do
RESULT=$(\
gcloud compute project-info describe --project ${ID} \
--flatten=quotas \
--format="csv[no-heading](quotas.metric,quotas.limit,quotas.usage)")
# Prefix ${ID} to each line in the result
for LINE in ${RESULT}
do
echo ${ID},${LINE}
done
done
it is important that the account authenticated has the role project/viewer over all projects associated, also Compute Engine API must be enabled in the projects.
Having said that, you can create a service account associated per organization or by folder in order to get all necessary information.

GCLOUD: Getting the name of a snapshot list

Question:
How do i get a Value from a list into a Variable (String) in Gcloud?
Wanted:
I need to get the name of the Snapshot. With a Powershell list i would just do:
$os_disk_snapshot= (gcloud compute snapshots list --limit=1 --filter="creationTimestamp.date('%Y-%m-%d', Z)='$date'" --filter="sourceDisk=$source_disk"").name
But this doesn't work.
The following just gives me a list with the parameters name,disk_size_gb, sourcedisk and status. But i only need the name.
gcloud compute snapshots list --limit=1 --filter="creationTimestamp.date('%Y-%m-%d', Z)='$date'" --filter="sourceDisk=$source_disk""
Greetings and thanks in advance :)
you can use --format "value(name)" in the command to get only name.
--format "value(name)"
Read more about gcloud Global Flags here