Hello les amis, J’étais tranquillement en train de m’occuper de mes affaires quand mon collègue préféré est venu me voir pour m’exprimer un besoin.

Je vais donc tâcher de vous retranscrire cette conversation le plus fidèlement possible, sans aucune forme d’exagération ni de déformation de la réalité.

Mon collègue : Hey mon ami, tu aimes ça, les scripts Bash ?

Moi-même : Qu’ouïs-je ? Aurais-tu une idée saugrenue à me communiquer ? Quel est donc ton besoin ? Je le transforme en script ce matin ?

Mon collègue : J’admire ton enthousiasme, peux-être peux-tu me sortir de ce marasme ! J’aimerais la liste des dépendances des APIs quand on les active, avant ce midi ! Je te fournis ici, de mes recherches, le fruit !

Moi-même : Il est de mon grand regret de t’annoncer que cette feature est dépréciée. Je vais donc, sans vergogne, faire un gros script qui cogne !
Une par une, sans pitié, les APIs je vais activer et collecter dans un CSV le résultat de cette activité !

J’aime bien GCP, mais là, pour le coup, je ne comprends pas la disparition de cette feature. Quand on active des API, c’est intéressant de savoir la cascade d’API qui vont être activées en plus.

Mon client cherche à limiter la liste des API activables dans son organisation, et c’est quand même bien stupide d’avoir à activer les API une à une pour cartographier les dépendances.

Alors c’est parti, mon ami Google, je t’envoie mon script de débile avec mes gros sabots de punk à chien.

squid game, le carousel, danse de thanos, j’vais casser ton projet, j’vais casser ton projet

Le postulat de départ

Donc, mon collègue me transmet un bout de script qui semble déjà faire le boulot avec une commande gcloud et du jq saupoudré par-dessus pour formater l’info qu’on recherche.

TL;DR : L’info qui nous intéresse est ici.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
gcloud services list \
   --available --format json | \
jq --arg service cloudfunctions.googleapis.com \
    'map(select(.config.name == $service)| 
        { 
          name:      .config.name, 
          dependsOn: .dependencyConfig.dependsOn
        }
    )'

and the result is:

{
  "name": "cloudfunctions.googleapis.com",
  "dependsOn": [
    "cloudfunctions.googleapis.com",
    "logging.googleapis.com",
    "pubsub.googleapis.com",
    "source.googleapis.com",
    "storage-api.googleapis.com",
    "storage-component.googleapis.com"
  ]
}

Donc, on balance ça dans un shell pour tester, et c’est là que l’énervement commence.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
gcloud services list \                                
   --available --format json | \
jq --arg service cloudfunctions.googleapis.com \
    'map(select(.config.name == $service)|
        {
          name:      .config.name,
          dependsOn: .dependencyConfig.dependsOn
        }
    )'

[
  {
    "name": "cloudfunctions.googleapis.com",
    "dependsOn": null
  }
]

meme Sardoche, mais c’était sur en fait

Donc, c’était là, mais c’est plus là. Google a décidé de supprimer l’information, tranquillement, sans rien dire.

Et a tranquillement mis un petit vu mais s’en tape depuis 2023 sur l’issue tracker de Google.

vu et s’en tape, avec une signature

https://issuetracker.google.com/issues/241456145?pli=1

Bon bah, script bash, avec des frites et un supplément cheddar it is

Et bah tu sais quoi ? Je vais activer et désactiver tes APIs une par une et cartographier moi-même les dépendances des APIs.

Je liste les APIs, je filtre que les APIs principales de GCP (pour virer les API des vendors et les APIs custom).

1
gcloud services list --available|grep ".googleapis.com"|awk '{print $1}' > apis_list

Et voilà le script de la honte :

  • On désactive toutes les APIs.
  • On boucle sur la liste d’APIs une par une.
  • On active, liste et enregistre les APIs et dépendances.
  • On désactive toutes les APIs à chaque tour de boucle."
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

set -x

project="my_gcp_project"

echo "disable all apis"

for api in $(echo Y|gcloud services list --enabled --project=$project |grep -v NAME|awk -F ' ' '{print $1}'|grep -v 'TITLE');do
echo Y |gcloud services disable $api --project=$project --force
done


for api_to_enable in $(cat api_list);do
echo set api "$api_to_enable"
csv_line="$api_to_enable,"
echo Y|gcloud services enable $api_to_enable --project=$project

for api in $(gcloud services list --enabled --project=$project|grep -v 'TITLE'|awk '{print $1}'|grep -v $api_to_enable);do
csv_line+="$api,"
done

echo $csv_line >> result.csv

echo "disable all apis"

for api in $(echo Y|gcloud services list --enabled --project=$project |grep -v NAME|awk -F ' ' '{print $1}'|grep -v 'TITLE');do
echo Y |gcloud services disable $api --project=$project --force
done

done

Sérieusement, Google, pourquoi tu m’obliges à faire des trucs pareils ?

Dumb and Dumber, un coup de bash, awk , grep, trois boucle , un echo dans un fichier et c’est bon.

le fichier de résultat