使用 jq 将 pvclaim 转换为 configmap

问题描述 投票:0回答:1

这是我的输入:

{
  "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"
            }
          }
        ]
      }
    }
  }
}

我想将以扩展名结尾的任何挂载路径转换为指向相应“configMaps”对象的挂载路径,该对象本身会替换预先存在的关联“persistentVolumeClaim”。

结果如下:


    {
    ...
                "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"
              }
    

我已经开始了一些事情,但我没能实现它:

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}])'

编辑:您可以编写一个稍微更具可读性的版本,而不是一长行代码,例如:

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
json kubernetes deployment jq
1个回答
0
投票

由于您想在两个不同的位置以两种不同的方式修改数组项,但所有这些都基于转换相同源的相同值,因此我建议设置一个查找表(例如使用

INDEX
),然后在这两种情况下查询它(而不是重复到相同的源并一遍又一遍地重复相同的转换):

.spec.template.spec |= (

  INDEX(
    .containers[].volumeMounts[] | {id: .name, subPath: (.mountPath / "/")[-1]}
    | .name = (.id|.[:index("claim")]) + (.subPath|gsub("[_.]";"-")|ascii_downcase);
    select(.subPath | test("[.][^.]+$")).id
  ) as $lookup
  
  # With the sample input, $lookup would contain:
  # 
  # {
  #   "movies-wikibase-claim1": {
  #     "id": "movies-wikibase-claim1",
  #     "subPath": "LocalSettings.override.php",
  #     "name": "movies-wikibase-localsettings-override-php"
  #   },
  #   "movies-wikibase-claim2": {
  #     "id": "movies-wikibase-claim2",
  #     "subPath": "wikibase_logo.png",
  #     "name": "movies-wikibase-wikibase-logo-png"
  #   }
  # }

  | .containers[].volumeMounts[] |= last(., {mountPath} + (
      $lookup[.name] | values | {name, subPath}
    ))

  | .volumes[] |= last(., (
      $lookup[.name] | values | {configMap: {defaultMode: 420, name}, name}
    ))

)
{
  "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-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"
          }
        ]
      }
    }
  }
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.