Цикл файла в Groovy для создания шаблона JSON - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь создать шаблон JSON для службы в Openshift.Мне нужно установить скрипт Groovy, который будет циклически проходить по текстовому файлу, содержащему несколько портов, для создания раздела портов шаблона JSON.

Вот как выглядит файл, содержащий порты.

cat ports.txt
  9000
  8090
  7010
  6012

Вот мой отличный скрипт для создания шаблона.Сценарий содержит жестко закодированный текст для порта 9000.

def builder = new groovy.json.JsonBuilder()
builder.apiVersion {
  apiVersion 'v1'
  kind 'Service'
  metadata {
    name 'apache'
    labels {
     app "apache"
     name "apache"
 }
}
spec {
selector {
  app 'apache'
 }
  ports {
  name "9000-tcp"
  protocol "TCP"
  port "9000"
  targetPort "9000"
  }
}
}
println builder.toPrettyString()

При запуске сценария отображается следующее:

{
"apiVersion": {
    "apiVersion": "v1",
    "kind": "Service",
    "metadata": {
        "name": "apache",
        "labels": {
            "app": "apache",
            "name": "apache"
        }
    },
    "spec": {
        "selector": {
            "app": "apache"
        },
        "ports": {
            "name": "80-tcp",
            "protocol": "TCP",
            "port": "8081"
        }
    }
}

}

Я бы хотел, чтобы конечный продукт выгляделкак это

{
    "apiVersion": "v1",
    "kind": "Service",
    "metadata": {
        "name": "apache",
        "labels": {
            "app": "apache",
            "name": "apache"
        }
    },
    "spec": {
        "selector": {
            "app": "apache"
        },
        "ports": {
            "name": "80-tcp",
            "protocol": "TCP",
            "port": "8081"
        }
        "ports": {
            "name": "8090-tcp",
            "protocol": "TCP",
            "port": "8090",
            "targetPort": "8090"
        }
        "ports": {
            "name": "7010-tcp",
            "protocol": "TCP",
            "port": "7010",
            "targetPort": "7010"
        }
        "ports": {
            "name": "6012-tcp",
            "protocol": "TCP",
            "port": "6012",
            "targetPort": "6012"
        }
    }
}
}

Как я могу встроить цикл в этот шаблон, чтобы добавить создать столько портов, сколько есть в файле file.txt.

1 Ответ

0 голосов
/ 27 января 2019

Предложение, которое вы предлагаете, не является допустимым JSON ... У вас не может быть нескольких ports объектов на том же уровне, что и вы показываете ... Однако вы можете сделать ports в списке объектов примерно так:

def builder = new groovy.json.JsonBuilder()
builder {
    apiVersion 'v1'
    kind 'Service'
    metadata {
        name 'apache'
        labels {
            app "apache"
            name "apache"
        }
    }
    spec {
        selector {
            app 'apache'
        }
        ports new File('ports.txt').readLines()*.trim().collect { p ->
            [name: "$p-tcp", protocol: "TCP", port: "$p", targetPort: "$p"]
        }
    }
}

println builder.toPrettyString()

Выход из этого:

    {
        "apiVersion": "v1",
        "kind": "Service",
        "metadata": {
            "name": "apache",
            "labels": {
                "app": "apache",
                "name": "apache"
            }
        },
        "spec": {
            "selector": {
                "app": "apache"
            },
            "ports": [
                {
                    "name": "9000-tcp",
                    "protocol": "TCP",
                    "port": "9000",
                    "targetPort": "9000"
                },
                {
                    "name": "8090-tcp",
                    "protocol": "TCP",
                    "port": "8090",
                    "targetPort": "8090"
                },
                {
                    "name": "7010-tcp",
                    "protocol": "TCP",
                    "port": "7010",
                    "targetPort": "7010"
                },
                {
                    "name": "6012-tcp",
                    "protocol": "TCP",
                    "port": "6012",
                    "targetPort": "6012"
                }
            ]
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...