Here is my input:
{"apiVersion": "apps/v1","kind": "Deployment","spec": {"template": {"spec": {"containers": [ {"volumeMounts": [ {"mountPath": "/var/www/html","name": "shared" }, {"mountPath": "/var/www/html/LocalSettings.d/LocalSettings.override.php","name": "movies-wikibase-claim1" }, {"mountPath": "/var/www/html/img/wikibase_logo.png","name": "movies-wikibase-claim2" } ] } ],"volumes": [ {"name": "shared","persistentVolumeClaim": {"claimName": "shared" } }, {"name": "movies-wikibase-claim1","persistentVolumeClaim": {"claimName": "movies-wikibase-claim1" } }, {"name": "movies-wikibase-claim2","persistentVolumeClaim": {"claimName": "movies-wikibase-claim2" } } ] } } }}
I'd like to transform any mountpath ending with an extension into a mountPath pointing to a corresponding 'configMaps' object that itself replaces the pre-existing associated 'persistentVolumeClaim'.
With this result:
{ ..."volumeMounts": [ {"mountPath": "/var/www/html","name": "shared" }, {"mountPath": "/var/www/html/LocalSettings.d/LocalSettings.override.php","name": "movies-wikibase-localsettings-override-php","subPath": "LocalSettings.override.php" }, {"mountPath": "/var/www/html/img/wikibase_logo.png","name": "movies-wikibase-wikibase-logo-png","subPath": "wikibase_logo.png" } ] } ],"volumes": [ {"name": "shared","persistentVolumeClaim": {"claimName": "shared" } }, {"configMap": {"defaultMode": 420,"name": "movies-wikibase-localsettings-override-php" },"name": "movies-wikibase-localsettings-override-php" } {"configMap": {"defaultMode": 420,"name": "movies-wikibase-wikibase-logo-png" },"name": "movies-wikibase-wikibase-logo-png" }
I've begun some stuff, but I didn't manage to achieve it:
cat movies-wikibase-deployment.json| jq -r '((.spec.template.spec.containers[].volumeMounts[]?|select(.mountPath|test("(\\.[^.]+)$")))|={mountPath: .mountPath, name: ((.name|split("-claim")|.[0]) +"-" + (.mountPath|split("/")|last|gsub("_";"-")|gsub("\\.";"-")|ascii_downcase)), subPath: (.mountPath|split("/")|last)})|(((.spec.template.spec.containers[].volumeMounts[]?|select(.mountPath|test("(\\.[^.]+)$")).name) ) as $toto|.spec.template.spec.volumes+=[{configMap: {defaultMode: 420, name: $toto}, name: $toto}])'
EDIT: In stead of one long line of code, you could have written a slightly more readable version like:
jq -r '( (.spec.template.spec.containers[].volumeMounts[]?| select(.mountPath|test("(\\.[^.]+)$")))|= {mountPath: .mountPath, name: ((.name|split("-claim")|.[0]) +"-" + (.mountPath|split("/")|last|gsub("_";"-")|gsub("\\.";"-")|ascii_downcase)), subPath: (.mountPath|split("/")|last)} )| ( ((.spec.template.spec.containers[].volumeMounts[]?|select(.mountPath|test("(\\.[^.]+)$")).name) ) as $toto| .spec.template.spec.volumes+=[{configMap: {defaultMode: 420, name: $toto}, name: $toto}])' movies-wikibase-deployment.json