From 93eaf2596c005e1bf7865863b1a632619278a6a4 Mon Sep 17 00:00:00 2001
From: "Igor Zimovets (EPAM)" <igor_zimovets@epam.com>
Date: Fri, 15 Apr 2022 13:24:34 +0000
Subject: [PATCH] GONRG-4695 partition bootstrap job to deployment

---
 .gitlab-ci.yml                                |  37 +++-
 NOTICE                                        |  30 +--
 .../partition-bootstrap-configmap.yml         |  19 ++
 .../templates/partition-variables.yml         |   2 +-
 devops/gcp/configmap/values.yaml              |  13 +-
 .../partition-bootstrap-deployment.yml        |  34 ++++
 .../templates/service-account-bootstrap.yml   |   7 +
 devops/gcp/deploy/values.yaml                 |  11 +
 provider/partition-gcp/bootstrap/Dockerfile   |   9 +
 .../bootstrap/bootstrap_partition.sh          | 192 ++++++++++++++++++
 .../bootstrap/bootstrap_partition.yml         |  18 ++
 11 files changed, 338 insertions(+), 34 deletions(-)
 create mode 100644 devops/gcp/configmap/templates/partition-bootstrap-configmap.yml
 create mode 100644 devops/gcp/deploy/templates/partition-bootstrap-deployment.yml
 create mode 100644 devops/gcp/deploy/templates/service-account-bootstrap.yml
 create mode 100644 provider/partition-gcp/bootstrap/Dockerfile
 create mode 100644 provider/partition-gcp/bootstrap/bootstrap_partition.sh
 create mode 100644 provider/partition-gcp/bootstrap/bootstrap_partition.yml

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 629cd9168..928c61b93 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -21,9 +21,11 @@ variables:
   OSDU_GCP_TEST_SUBDIR: testing/$OSDU_GCP_SERVICE-test-$OSDU_GCP_VENDOR
   OSDU_GCP_HELM_PACKAGE_CHARTS: "devops/gcp/deploy devops/gcp/configmap"
   OSDU_GCP_HELM_NAMESPACE: default
-  OSDU_GCP_HELM_CONFIG_SERVICE_VARS: "--set data.partition_admin_accounts=$OSDU_GCP_PARTITION_ADMIN_ACCOUNTS --set data.google_cloud_project=$OSDU_GCP_PROJECT --set data.google_audiences=$GOOGLE_AUDIENCE --set data.log_level=INFO --set data.key_ring=$OSDU_GCP_PARTITION_KEY_RING --set data.kms_key=$OSDU_GCP_PARTITION_KMS_KEY"
-  OSDU_GCP_HELM_CONFIG_SERVICE_VARS_DEV2: "--set data.partition_admin_accounts=$OSDU_GCP_PARTITION_ADMIN_ACCOUNTS_DEV2 --set data.google_cloud_project=$OSDU_GCP_PROJECT --set data.google_audiences=$GOOGLE_AUDIENCE --set data.log_level=INFO --set data.key_ring=$OSDU_GCP_PARTITION_KEY_RING --set data.kms_key=$OSDU_GCP_PARTITION_KMS_KEY"
-  OSDU_GCP_HELM_DEPLOYMENT_SERVICE_VARS: "--set data.image=$CI_REGISTRY_IMAGE/osdu-gcp:$CI_COMMIT_SHORT_SHA --set data.serviceAccountName=$OSDU_GCP_SERVICE-k8s"
+  OSDU_GCP_HELM_CONFIG_SERVICE_VARS: "--set data.partition_admin_accounts=$OSDU_GCP_PARTITION_ADMIN_ACCOUNTS --set data.project_id=$OSDU_GCP_PROJECT --set data.google_audiences=$GOOGLE_AUDIENCE --set data.log_level=INFO --set data.key_ring=$OSDU_GCP_PARTITION_KEY_RING --set data.kms_key=$OSDU_GCP_PARTITION_KMS_KEY --set data.data_partition_id=$OSDU_GCP_TENANT"
+  OSDU_GCP_HELM_CONFIG_SERVICE_VARS_DEV2: "--set data.partition_admin_accounts=$OSDU_GCP_PARTITION_ADMIN_ACCOUNTS_DEV2 --set data.project_id=$OSDU_GCP_PROJECT --set data.google_audiences=$GOOGLE_AUDIENCE --set data.log_level=INFO --set data.key_ring=$OSDU_GCP_PARTITION_KEY_RING --set data.kms_key=$OSDU_GCP_PARTITION_KMS_KEY --set data.data_partition_id=$OSDU_GCP_TENANT --set conf.bootstrap_namespace=config"
+  OSDU_GCP_HELM_DEPLOYMENT_SERVICE_VARS: "--set data.image=$CI_REGISTRY_IMAGE/osdu-gcp:$CI_COMMIT_SHORT_SHA --set data.bootstrap_image=$CI_REGISTRY_IMAGE/osdu-gcp-bootstrap-partition:$CI_COMMIT_SHORT_SHA --set data.serviceAccountName=$OSDU_GCP_SERVICE-k8s --set data.bootstrapServiceAccountName=$OSDU_GCP_SERVICE-k8s"
+  # FIXME add value below to DEV2 pipeline
+  OSDU_GCP_HELM_DEPLOYMENT_SERVICE_VARS_DEV2: "--set data.bootstrap_image=$CI_REGISTRY_IMAGE/osdu-gcp-bootstrap-partition:$CI_COMMIT_SHORT_SHA --set data.bootstrapServiceAccountName=$OSDU_GCP_BOOTSTRAP_SERVICE_ACCOUNT --set conf.bootstrap_namespace=$OSDU_GCP_BOOTSTRAP_NAMESPACE"
   OSDU_GCP_HELM_CONFIG_SERVICE: partition-config
   OSDU_GCP_HELM_DEPLOYMENT_SERVICE: partition-deploy
 
@@ -58,6 +60,35 @@ include:
   - project: "osdu/platform/ci-cd-pipelines"
     file: "publishing/pages.yml"
 
+  - local: "/provider/partition-gcp/bootstrap/bootstrap_partition.yml"
+
+osdu-gcp-deploy-deployment:
+  variables:
+    OSDU_GCP_BOOTSTRAP_SERVICE: partition-bootstrap
+  needs: ["osdu-gcp-containerize-gitlab", "osdu-gcp-containerize-bootstrap-partition", "osdu-gcp-deploy-configmap"]
+  after_script:
+    - echo ----- Verify Bootstrap -----
+    - kubectl rollout status deployment.v1.apps/$OSDU_GCP_BOOTSTRAP_SERVICE -n $OSDU_GCP_HELM_NAMESPACE --timeout=900s
+    - POD=$(kubectl get pod --sort-by=.metadata.creationTimestamp -n $OSDU_GCP_HELM_NAMESPACE | grep $OSDU_GCP_BOOTSTRAP_SERVICE | tail -1 | awk '{print $1}')
+    - STATUS=$(kubectl wait -n $OSDU_GCP_HELM_NAMESPACE --for=condition=Ready pod/$POD --timeout=300s)
+    - echo $STATUS
+    - if [[ "$STATUS" != *"met"* ]]; then echo "POD didn't start correctly" ; exit 1 ; fi
+
+osdu-gcp-dev2-deploy-deployment:
+  variables:
+    OSDU_GCP_BOOTSTRAP_SERVICE: partition-bootstrap
+    OSDU_GCP_BOOTSTRAP_NAMESPACE: config
+    OSDU_GCP_BOOTSTRAP_SERVICE_ACCOUNT: workload-gke-bootstrap-sa
+  needs: ["osdu-gcp-containerize-gitlab", "osdu-gcp-containerize-bootstrap-partition", "osdu-gcp-dev2-deploy-configmap"]
+  after_script:
+    - echo ----- Verify Bootstrap -----
+    - kubectl rollout status deployment.v1.apps/$OSDU_GCP_BOOTSTRAP_SERVICE -n $OSDU_GCP_BOOTSTRAP_NAMESPACE --timeout=900s
+    - POD=$(kubectl get pod --sort-by=.metadata.creationTimestamp -n $OSDU_GCP_BOOTSTRAP_NAMESPACE | grep $OSDU_GCP_BOOTSTRAP_SERVICE | tail -1 | awk '{print $1}')
+    - STATUS=$(kubectl wait -n $OSDU_GCP_BOOTSTRAP_NAMESPACE --for=condition=Ready pod/$POD --timeout=300s)
+    - echo $STATUS
+    - if [[ "$STATUS" != *"met"* ]]; then echo "POD didn't start correctly" ; exit 1 ; fi
+
+
 osdu-gcp-test:
   variables:
     CLIENT_TENANT: osdu
diff --git a/NOTICE b/NOTICE
index 219064651..e4aab100b 100644
--- a/NOTICE
+++ b/NOTICE
@@ -13,8 +13,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 Apache-1.1
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Apache Commons CLI (from https://commons.apache.org/proper/commons-cli/, https://repo1.maven.org/maven2/commons-cli/commons-cli)
 - Cobertura (from http://cobertura.sourceforge.net)
 - Default Plexus Container (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default)
@@ -291,7 +289,7 @@ The following software have components provided under the terms of this license:
 - Adapter: RxJava (from https://repo1.maven.org/maven2/com/squareup/retrofit2/adapter-rxjava)
 - Apache Ant + JUnit (from http://ant.apache.org/, https://ant.apache.org/)
 - Apache Ant Core
-- Apache Ant Launcher (from http://ant.apache.org/)
+- Apache Ant Launcher (from http://ant.apache.org/, https://ant.apache.org/)
 - Apache Commons BeanUtils (from http://commons.apache.org/proper/commons-beanutils/, https://repo1.maven.org/maven2/commons-beanutils/commons-beanutils)
 - Apache Commons CLI (from https://commons.apache.org/proper/commons-cli/, https://repo1.maven.org/maven2/commons-cli/commons-cli)
 - Apache Commons Codec (from http://commons.apache.org/proper/commons-codec/, https://commons.apache.org/proper/commons-codec/)
@@ -671,8 +669,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 CC-BY-2.5
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - FindBugs-jsr305 (from http://findbugs.sourceforge.net/)
 - MongoDB Java Driver (from http://mongodb.org/, http://www.mongodb.org)
 
@@ -686,15 +682,11 @@ CC-BY-4.0
 ========================================================================
 CC0-1.0
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - reactive-streams (from http://www.reactive-streams.org/)
 
 ========================================================================
 CDDL-1.0
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Servlet Specification 2.5 API (from http://jetty.mortbay.org, https://repo1.maven.org/maven2/org/mortbay/jetty/servlet-api-2.5)
 
 ========================================================================
@@ -741,8 +733,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 EPL-2.0
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Expression Language 3.0 (from http://el-spec.java.net, http://uel.java.net, https://projects.eclipse.org/projects/ee4j.el)
 - JUnit Jupiter (Aggregator) (from https://junit.org/junit5/)
 - JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/)
@@ -768,8 +758,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 GPL-2.0-or-later
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org)
 
 ========================================================================
@@ -788,8 +776,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 GPL-3.0-only
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Expression Language 3.0 (from http://el-spec.java.net, http://uel.java.net, https://projects.eclipse.org/projects/ee4j.el)
 - Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca)
 - Project Lombok (from http://projectlombok.org, https://projectlombok.org)
@@ -797,8 +783,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 JSON
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - JSON in Java (from https://github.com/douglascrockford/JSON-java)
 
 ========================================================================
@@ -823,8 +807,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 LGPL-2.1-or-later
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Javassist (from http://www.javassist.org/)
 - SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org)
 
@@ -894,24 +876,18 @@ The following software have components provided under the terms of this license:
 ========================================================================
 MPL-1.1
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Cobertura (from http://cobertura.sourceforge.net)
 - Javassist (from http://www.javassist.org/)
 
 ========================================================================
 MPL-2.0
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Javassist (from http://www.javassist.org/)
 - OkHttp (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp, https://square.github.io/okhttp/)
 
 ========================================================================
 PHP-3.01
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf, https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api)
 - Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec)
 
@@ -931,8 +907,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 SPL-1.0
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Servlet Specification 2.5 API (from http://jetty.mortbay.org, https://repo1.maven.org/maven2/org/mortbay/jetty/servlet-api-2.5)
 
 ========================================================================
@@ -948,8 +922,6 @@ The following software have components provided under the terms of this license:
 ========================================================================
 WTFPL
 ========================================================================
-The following software have components provided under the terms of this license:
-
 - Reflections (from http://code.google.com/p/reflections/, http://github.com/ronmamo/reflections)
 
 ========================================================================
diff --git a/devops/gcp/configmap/templates/partition-bootstrap-configmap.yml b/devops/gcp/configmap/templates/partition-bootstrap-configmap.yml
new file mode 100644
index 000000000..957078c67
--- /dev/null
+++ b/devops/gcp/configmap/templates/partition-bootstrap-configmap.yml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  labels:
+    app: "{{ .Values.conf.bootstrap_name }}"
+  name: "{{ .Values.conf.bootstrap_configmap }}"
+  namespace: "{{ .Values.conf.bootstrap_namespace }}"
+data:
+  PARTITION_NAME: "{{ .Values.conf.app_name }}"
+  PROJECT_ID: "{{ .Values.data.project_id }}"
+  DATA_PARTITION_ID: "{{ .Values.data.data_partition_id }}"
+  {{- if .Values.conf.on_prem_enabled }}
+  DOMAIN: "{{ .Values.data.domain }}"
+  ENVIRONMENT: "{{ .Values.data.environment }}"
+  CLIENT_ID: "{{ .Values.data.client_id }}"
+  {{- else }}
+  AUDIENCES: "{{ .Values.data.google_audiences }}"
+  DATAFIER_SA: "{{ .Values.data.datafier_sa }}"
+  {{- end }}
diff --git a/devops/gcp/configmap/templates/partition-variables.yml b/devops/gcp/configmap/templates/partition-variables.yml
index 3d2d9ee6a..0904a5919 100644
--- a/devops/gcp/configmap/templates/partition-variables.yml
+++ b/devops/gcp/configmap/templates/partition-variables.yml
@@ -12,7 +12,7 @@ data:
   PARTITION_PROPERTY_KIND: "{{ .Values.data.partition_property_kind }}"
   PARTITION_NAMESPACE: "{{ .Values.data.partition_namespace }}"
   {{- else }}
-  GOOGLE_CLOUD_PROJECT: "{{ .Values.data.google_cloud_project }}"
+  GOOGLE_CLOUD_PROJECT: "{{ .Values.data.project_id }}"
   PARTITION_ADMIN_ACCOUNTS: "{{ .Values.data.partition_admin_accounts }}"
   GOOGLE_AUDIENCES: "{{ .Values.data.google_audiences }}"
   SERVICE_ACCOUNT_TAIL: "{{ .Values.data.service_account_tail }}"
diff --git a/devops/gcp/configmap/values.yaml b/devops/gcp/configmap/values.yaml
index 37d60cdb6..645a7f949 100644
--- a/devops/gcp/configmap/values.yaml
+++ b/devops/gcp/configmap/values.yaml
@@ -1,5 +1,5 @@
 data:
-  google_cloud_project: ""
+  project_id: ""
   partition_admin_accounts: ""
   google_audiences: ""
   log_level: "INFO"
@@ -7,8 +7,19 @@ data:
   partition_property_kind: ""
   partition_namespace: ""
   spring_profiles_active: "gcp"
+  # bootstrap common
+  data_partition_id: ""
+  datafier_sa: "datafier"
+  # bootstrap variables onprem
+  domain: ""
+  environment: ""
+  client_id: ""
 
 conf:
   configmap: "partition-config"
   app_name: "partition"
+  # bootstrap common
+  bootstrap_name: "partition-bootstrap"
+  bootstrap_configmap: "partition-bootstrap-configmap"
+  bootstrap_namespace: "default"
   on_prem_enabled: false
diff --git a/devops/gcp/deploy/templates/partition-bootstrap-deployment.yml b/devops/gcp/deploy/templates/partition-bootstrap-deployment.yml
new file mode 100644
index 000000000..ed08574a6
--- /dev/null
+++ b/devops/gcp/deploy/templates/partition-bootstrap-deployment.yml
@@ -0,0 +1,34 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: "{{ .Values.conf.bootstrap_name }}"
+  namespace: "{{ .Values.conf.bootstrap_namespace }}"
+  annotations:
+    rollme: {{ randAlphaNum 5 | quote }}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: "{{ .Values.conf.bootstrap_name }}"
+  template:
+    metadata:
+      labels:
+        app: "{{ .Values.conf.bootstrap_name }}"
+      annotations:
+        rollme: {{ randAlphaNum 5 | quote }}
+    spec:
+      containers:
+        - image: "{{ .Values.data.bootstrap_image }}"
+          name: "{{ .Values.conf.bootstrap_name }}"
+          envFrom:
+            - configMapRef:
+                name: "{{ .Values.conf.bootstrap_configmap }}"
+          resources:
+            requests:
+              cpu: "{{ .Values.data.bootstrap_requests_cpu }}"
+              memory: "{{ .Values.data.bootstrap_requests_memory }}"
+            limits:
+              cpu: "{{ .Values.data.bootstrap_limits_cpu }}"
+              memory: "{{ .Values.data.bootstrap_limits_memory }}"
+      restartPolicy: Always
+      serviceAccountName: "{{ .Values.data.bootstrapServiceAccountName }}"
diff --git a/devops/gcp/deploy/templates/service-account-bootstrap.yml b/devops/gcp/deploy/templates/service-account-bootstrap.yml
new file mode 100644
index 000000000..ca7afb515
--- /dev/null
+++ b/devops/gcp/deploy/templates/service-account-bootstrap.yml
@@ -0,0 +1,7 @@
+{{- if .Values.conf.on_prem_enabled }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: "{{ .Values.data.bootstrapServiceAccountName }}"
+  namespace: "{{ .Values.conf.bootstrap_namespace }}"
+{{- end }}
diff --git a/devops/gcp/deploy/values.yaml b/devops/gcp/deploy/values.yaml
index 1891b1454..b12ca22c3 100644
--- a/devops/gcp/deploy/values.yaml
+++ b/devops/gcp/deploy/values.yaml
@@ -10,11 +10,22 @@ data:
   serviceAccountName: ""
   imagePullPolicy: "IfNotPresent"
   image: ""
+  # bootstrap common
+  bootstrap_requests_cpu: "0.03"
+  bootstrap_requests_memory: "120M"
+  bootstrap_limits_cpu: "0.1"
+  bootstrap_limits_memory: "200M"
+  bootstrap_image: ""
+  bootstrapServiceAccountName: "partition-bootstrap"
 
 conf:
   configmap: "partition-config"
   secret: "partition-postgres-secret"
   app_name: "partition"
+  # bootstrap common
+  bootstrap_name: "partition-bootstrap"
+  bootstrap_configmap: "partition-bootstrap-configmap"
+  bootstrap_namespace: "default"
   on_prem_enabled: false
 
 namespacePolicy:
diff --git a/provider/partition-gcp/bootstrap/Dockerfile b/provider/partition-gcp/bootstrap/Dockerfile
new file mode 100644
index 000000000..8cc1b8cb3
--- /dev/null
+++ b/provider/partition-gcp/bootstrap/Dockerfile
@@ -0,0 +1,9 @@
+FROM google/cloud-sdk:slim
+
+COPY ./provider/partition-gcp/bootstrap/bootstrap_partition.sh ./opt
+
+ENV PREFIX=$(pwd)
+
+RUN chmod 775 /opt/bootstrap_partition.sh
+
+CMD ["/bin/bash", "-c", "source /opt/bootstrap_partition.sh && sleep 365d"]
diff --git a/provider/partition-gcp/bootstrap/bootstrap_partition.sh b/provider/partition-gcp/bootstrap/bootstrap_partition.sh
new file mode 100644
index 000000000..9e446af02
--- /dev/null
+++ b/provider/partition-gcp/bootstrap/bootstrap_partition.sh
@@ -0,0 +1,192 @@
+#!/usr/bin/env bash
+
+set -ex
+
+DATA_PARTITION_ID_UPPER=${DATA_PARTITION_ID^^}
+
+generate_post_data()
+{
+  cat <<EOF
+{
+  "properties": {
+    "projectId": {
+        "sensitive": false,
+        "value": "${PROJECT_ID}"
+    },
+    "serviceAccount": {
+        "sensitive": false,
+        "value": "${SERVICEACCOUNT}"
+    },
+    "complianceRuleSet": {
+        "sensitive": false,
+        "value": "shared"
+    },
+    "dataPartitionId": {
+        "sensitive": false,
+        "value": "${DATA_PARTITION_ID}"
+    },
+    "name": {
+        "sensitive": false,
+        "value": "${DATA_PARTITION_ID}"
+    },
+    "policy-service-enabled": {
+        "sensitive": false,
+        "value": "false"
+    },
+    "bucket": {
+        "sensitive": false,
+        "value": "${PROJECT_ID}-records"
+    },
+    "crmAccountID": {
+        "sensitive": false,
+        "value": "[${DATA_PARTITION_ID},${DATA_PARTITION_ID}]"
+    },
+    "osm.postgres.datasource.url": {
+      "sensitive": true,
+      "value": "POSTGRES_DATASOURCE_URL_${DATA_PARTITION_ID_UPPER}"
+    },
+    "osm.postgres.datasource.username": {
+      "sensitive": true,
+      "value": "POSTGRES_DB_USERNAME_${DATA_PARTITION_ID_UPPER}"
+    },
+    "osm.postgres.datasource.password": {
+      "sensitive": true,
+      "value": "POSTGRES_DB_PASSWORD_${DATA_PARTITION_ID_UPPER}"
+    },
+    "obm.minio.endpoint": {
+      "sensitive": false,
+      "value": "http://minio:9000"
+    },
+    "file.minio.endpoint": {
+      "sensitive": false,
+      "value": "https://s3.${DOMAIN}"
+    },
+    "obm.minio.accessKey": {
+      "sensitive": true,
+      "value": "MINIO_ACCESS_KEY"
+    },
+    "obm.minio.secretKey": {
+      "sensitive": true,
+      "value": "MINIO_SECRET_KEY"
+    },
+    "oqm.rabbitmq.amqp.host": {
+      "sensitive": false,
+      "value": "rabbitmq"
+    },
+    "oqm.rabbitmq.amqp.port": {
+      "sensitive": false,
+      "value": "5672"
+    },
+    "oqm.rabbitmq.amqp.path": {
+      "sensitive": false,
+      "value": ""
+    },
+    "oqm.rabbitmq.amqp.username": {
+      "sensitive": true,
+      "value": "RABBITMQ_ADMIN_USERNAME"
+    },
+    "oqm.rabbitmq.amqp.password": {
+      "sensitive": true,
+      "value": "RABBITMQ_ADMIN_PASSWORD"
+    },
+
+     "oqm.rabbitmq.admin.schema": {
+      "sensitive": false,
+      "value": "http"
+    },
+     "oqm.rabbitmq.admin.host": {
+      "sensitive": false,
+      "value": "rabbitmq"
+    },
+    "oqm.rabbitmq.admin.port": {
+      "sensitive": false,
+      "value": "15672"
+    },
+    "oqm.rabbitmq.admin.path": {
+      "sensitive": false,
+      "value": "/api"
+    },
+    "oqm.rabbitmq.admin.username": {
+      "sensitive": true,
+      "value": "RABBITMQ_ADMIN_USERNAME"
+    },
+    "oqm.rabbitmq.admin.password": {
+      "sensitive": true,
+      "value": "RABBITMQ_ADMIN_PASSWORD"
+    },
+    "elasticsearch.host": {
+      "sensitive": true,
+      "value": "ELASTIC_HOST_${DATA_PARTITION_ID_UPPER}"
+    },
+    "elasticsearch.port": {
+      "sensitive": true,
+      "value": "ELASTIC_PORT_${DATA_PARTITION_ID_UPPER}"
+    },
+    "elasticsearch.user": {
+      "sensitive": true,
+      "value": "ELASTIC_USER_${DATA_PARTITION_ID_UPPER}"
+    },
+    "elasticsearch.password": {
+      "sensitive": true,
+      "value": "ELASTIC_PASS_${DATA_PARTITION_ID_UPPER}"
+    }
+  }
+}
+EOF
+}
+
+echo "sleep to prevent 500 response from the partition service, due to timeout of creation for Workload Identity"
+sleep 20
+
+if [ "$ENVIRONMENT" == "anthos" ]
+then
+
+  SERVICEACCOUNT=$CLIENT_ID@service.local
+
+  status_code=$(curl -X POST \
+    --url "http://${PARTITION_NAME}/api/partition/v1/partitions/${DATA_PARTITION_ID}" --write-out "%{http_code}" --silent --output "/dev/null" \
+    -H "Content-Type: application/json" \
+    --data-raw "$(generate_post_data)")
+
+  if [ "$status_code" == 201 ]
+  then
+    echo "partition bootstrap was OK!"
+  elif [ "$status_code" == 409 ]
+  then
+    curl -X PATCH \
+    --url "http://${PARTITION_NAME}/api/partition/v1/partitions/${DATA_PARTITION_ID}" --write-out "%{http_code}" --silent --output "/dev/null" \
+    -H "Content-Type: application/json" \
+    --data-raw "$(generate_post_data)"
+    echo "partition was patched because datastore has already had some entities!"
+  else
+    exit 1
+  fi
+
+elif [ "$ENVIRONMENT" == "" ]
+then
+
+  IDENTITY_TOKEN=$(gcloud auth print-identity-token --audiences="${AUDIENCES}")
+
+  SERVICEACCOUNT=${DATAFIER_SA}@${PROJECT_ID}.iam.gserviceaccount.com
+
+  status_code=$(curl -X POST \
+     --url "http://${PARTITION_NAME}/api/partition/v1/partitions/${DATA_PARTITION_ID}" --write-out "%{http_code}" --silent --output "/dev/null" \
+     -H "Authorization: Bearer ${IDENTITY_TOKEN}" \
+     -H "Content-Type: application/json" \
+     --data-raw "$(generate_post_data)")
+
+  if [ "$status_code" == 201 ]
+  then
+    echo "partition bootstrap was OK!"
+  elif [ "$status_code" == 409 ]
+  then
+    curl -X PATCH \
+    --url "http://${PARTITION_NAME}/api/partition/v1/partitions/${DATA_PARTITION_ID}" --write-out "%{http_code}" --silent --output "/dev/null" \
+    -H "Authorization: Bearer ${IDENTITY_TOKEN}" \
+    -H "Content-Type: application/json" \
+    --data-raw "$(generate_post_data)"
+    echo "partition was patched because datastore has already had some entities!"
+  else
+    exit 1
+  fi
+fi
diff --git a/provider/partition-gcp/bootstrap/bootstrap_partition.yml b/provider/partition-gcp/bootstrap/bootstrap_partition.yml
new file mode 100644
index 000000000..fae6866ee
--- /dev/null
+++ b/provider/partition-gcp/bootstrap/bootstrap_partition.yml
@@ -0,0 +1,18 @@
+osdu-gcp-containerize-bootstrap-partition:
+  stage: containerize
+  needs: ["compile-and-unit-test"]
+  image: docker:19.03.15
+  tags: ["osdu-small"]
+  services:
+    - docker:20.10.7-dind
+  variables:
+    IMAGE_NAME: osdu-gcp-bootstrap-partition
+  script:
+    # Gitlab Container Registry
+    - export EXTRA_DOCKER_TAG=""; if [ "$CI_COMMIT_TAG" != "" ] ; then EXTRA_DOCKER_TAG="-t $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_TAG" ; elif [ "$CI_COMMIT_REF_NAME" = "master" ] ; then EXTRA_DOCKER_TAG="-t $CI_REGISTRY_IMAGE/$IMAGE_NAME:latest" ; fi
+    - docker build -t $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA $EXTRA_DOCKER_TAG --file provider/partition-gcp/bootstrap/Dockerfile .
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+    - docker push $CI_REGISTRY_IMAGE/$IMAGE_NAME
+  rules:
+    - if: "$OSDU_GCP == 'true'"
+      when: on_success
-- 
GitLab