6-anthos-install/acm-repos/root-config-repo/namespaces/boa/accounts/populate-accounts-db.yaml (1 lines of code) (raw):

# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #apiVersion: batch/v1 # kind: Job # metadata: # name: populate-accounts-db # spec: # template: # spec: # shareProcessNamespace: true # Important to stop all processes # serviceAccountName: accounts # containers: # - name: sidecar-controller # image: bash # command: ['bash', '-c', '. /scripts/wait-to-complete-sidecar.sh "initialize-database.sh" "cloud_sql_proxy"'] # volumeMounts: # - name: scripts # mountPath: "/scripts" # readOnly: true # resources: # limits: # cpu: "200m" # memory: "100Mi" # - name: populate-accounts-db # image: postgres:13.0 # command: ['bash', '-c','. /scripts/initialize-database.sh 127.0.0.1 5432 accounts-db'] # volumeMounts: # - name: scripts # mountPath: "/scripts" # readOnly: true # env: # - name: PGUSER # valueFrom: # secretKeyRef: # name: cloud-sql-admin # key: username # - name: PGPASSWORD # valueFrom: # secretKeyRef: # name: cloud-sql-admin # key: password # # /start: Required for testing data # - name: LOCAL_ROUTING_NUM # valueFrom: # configMapKeyRef: # name: environment-config # key: LOCAL_ROUTING_NUM # - name: USE_DEMO_DATA # valueFrom: # configMapKeyRef: # name: demo-data-config # key: USE_DEMO_DATA # - name: POSTGRES_DB # value: "accounts-db" # - name: PGHOSTADDR # value: "127.0.0.1" # - name: POSTGRES_USER # valueFrom: # secretKeyRef: # name: cloud-sql-admin # key: username # - name: POSTGRES_PASSWORD # valueFrom: # secretKeyRef: # name: cloud-sql-admin # key: password # # /end: Required for testing data # # CloudSQL Proxy # - name: cloudsql-proxy # resources: # limits: # cpu: "200m" # memory: "100Mi" # image: gcr.io/cloudsql-docker/gce-proxy:1.19.0-alpine # env: # - name: CONNECTION_NAME # valueFrom: # secretKeyRef: # name: cloud-sql-admin # key: connectionName # command: ["/cloud_sql_proxy", # "-instances=$(CONNECTION_NAME)=tcp:5432"] # securityContext: # runAsNonRoot: true # volumes: # - name: scripts # configMap: # name: accounts-schema-config # restartPolicy: Never # backoffLimit: 4 # --- # # kubectl create configmap accounts-schema-config --from-file=src/accounts-db/initdb/0-accounts-schema.sql --dry-run -o yaml (copy and add below) # # kubectl create configmap accounts-schema-config --from-file=src/accounts-db/initdb/1-load-testdata.sh --dry-run -o yaml (copy and add below) # apiVersion: v1 # kind: ConfigMap # metadata: # name: accounts-schema-config # data: # wait-to-complete-sidecar.sh: | # #!/bin/bash # COUNTER=0 # TARGET=$1 # PROCESS=$2 # echo "Looking for $TARGET" # sleep 10s # Give 10s to allow processes to start # # 20 minutes (60 x 10s increments) # while [ $COUNTER -lt 120 ]; do # let COUNTER=$COUNTER+1 # IS_RUNNING=$(ps -A | grep "scripts/$TARGET" | grep -v grep) # if [ "$IS_RUNNING" != "" ]; then # echo "Attempt # ${COUNTER}: Process not completed, trying again in 10 seconds -- ${IS_RUNNING}" # sleep 10s # else # echo "'${TARGET}' Process Finished, Stopping '${PROCESS}'" # killall ${PROCESS} # exit 0 # fi # done # echo "Could not determine if the import finished, killing the proxy" # killall ${PROCESS} # exit 0 # initialize-database.sh: | # #!/bin/bash # COUNTER=0 # SLEEP_TIME=60 # 1 minute # DB_READY=0 # false # INIT_SQL_SCRIPT="/scripts/0-accounts-schema.sql" # TEST_SQL_SCRIPT="/scripts/1-load-testdata.sh" # HOST=${1:-'127.0.0.1'} # PORT=${2:-'5432'} # DB_NAME=${3:-'default'} # # Initial wait for sql-proxy to catch up # sleep 20 # while [ $COUNTER -lt 10 ]; do # let COUNTER=$COUNTER+1 # pg_isready --host=${HOST} --port=${PORT} --dbname=${DB_NAME} # if [ $? -gt 0 ]; then # echo "Attempt # ${COUNTER}: Database is not ready, trying again in 1 minute" # sleep $SLEEP_TIME # else # echo "Database is ready to connect" # let DB_READY=1 # break # fi # done # if [ "${DB_READY}" -eq 1 ]; then # echo "Running initialization script" # psql --host=${HOST} --port=${PORT} --dbname=${DB_NAME} -f ${INIT_SQL_SCRIPT} # if [ $? -gt 0 ]; then # echo "Problems running the initialization script" # else # echo "Run Test Data" # . ${TEST_SQL_SCRIPT} # fi # fi # 0-accounts-schema.sql: | # CREATE TABLE IF NOT EXISTS users ( # accountid CHAR(10) PRIMARY KEY, # username VARCHAR(64) UNIQUE NOT NULL, # passhash BYTEA NOT NULL, # firstname VARCHAR(64) NOT NULL, # lastname VARCHAR(64) NOT NULL, # birthday DATE NOT NULL, # timezone VARCHAR(8) NOT NULL, # address VARCHAR(64) NOT NULL, # state CHAR(2) NOT NULL, # zip VARCHAR(5) NOT NULL, # ssn CHAR(11) NOT NULL # ); # CREATE INDEX IF NOT EXISTS idx_users_accountid ON users (accountid); # CREATE INDEX IF NOT EXISTS idx_users_username ON users (username); # CREATE TABLE IF NOT EXISTS contacts ( # username VARCHAR(64) NOT NULL, # label VARCHAR(128) NOT NULL, # account_num CHAR(10) NOT NULL, # routing_num CHAR(9) NOT NULL, # is_external BOOLEAN NOT NULL, # FOREIGN KEY (username) REFERENCES users(username) # ); # CREATE INDEX IF NOT EXISTS idx_contacts_username ON contacts (username); # 1-load-testdata.sh: | # #!/bin/bash # # Immediately exit if any error occurs during script execution. # set -o errexit # # Skip adding data if not enabled # if [ "$USE_DEMO_DATA" != "True" ]; then # echo "no demo users added" # exit 0 # fi # # Expected environment variables # readonly ENV_VARS=( # "POSTGRES_DB" # "POSTGRES_USER" # "LOCAL_ROUTING_NUM" # ) # add_user() { # # Usage: add_user "ACCOUNTID" "USERNAME" "FIRST_NAME" # echo "adding user: $2" # psql -X -v ON_ERROR_STOP=1 -v account="$1" -v username="$2" -v firstname="$3" -v passhash="$DEFAULT_PASSHASH" --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL # INSERT INTO users VALUES (:'account', :'username', :'passhash', :'firstname', 'User', '2000-01-01', '-5', 'Bowling Green, New York City', 'NY', '10004', '111-22-3333') ON CONFLICT DO NOTHING; # EOSQL # } # add_external_account() { # # Usage: add_external_account "OWNER_USERNAME" "LABEL" "ACCOUNT" "ROUTING" # echo "user $1 adding contact: $2" # psql -X -v ON_ERROR_STOP=1 -v username="$1" -v label="$2" -v account="$3" -v routing="$4" --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL # INSERT INTO contacts VALUES (:'username', :'label', :'account', :'routing', 'true') ON CONFLICT DO NOTHING; # EOSQL # } # add_contact() { # # Usage: add_contact "OWNER_USERNAME" "CONTACT_LABEL" "CONTACT_ACCOUNT" # echo "user $1 adding external account: $2" # psql -X -v ON_ERROR_STOP=1 -v username="$1" -v label="$2" -v account="$3" -v routing="$LOCAL_ROUTING_NUM" --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL # INSERT INTO contacts VALUES (:'username', :'label', :'account', :'routing', 'false') ON CONFLICT DO NOTHING; # EOSQL # } # # Load test data into the database # create_accounts() { # # Add demo users. # add_user "1011226111" "testuser" "Test" # add_user "1033623433" "alice" "Alice" # add_user "1055757655" "bob" "Bob" # add_user "1077441377" "eve" "Eve" # # Make everyone contacts of each other # add_contact "testuser" "Alice" "1033623433" # add_contact "testuser" "Bob" "1055757655" # add_contact "testuser" "Eve" "1077441377" # add_contact "alice" "Testuser" "1011226111" # add_contact "alice" "Bob" "1055757655" # add_contact "alice" "Eve" "1077441377" # add_contact "bob" "Testuser" "1011226111" # add_contact "bob" "Alice" "1033623433" # add_contact "bob" "Eve" "1077441377" # add_contact "eve" "Testuser" "1011226111" # add_contact "eve" "Alice" "1033623433" # add_contact "eve" "Bob" "1055757655" # # Add external accounts # add_external_account "testuser" "External Bank" "9099791699" "808889588" # add_external_account "alice" "External Bank" "9099791699" "808889588" # add_external_account "bob" "External Bank" "9099791699" "808889588" # add_external_account "eve" "External Bank" "9099791699" "808889588" # } # main() { # # Check environment variables are set # for env_var in ${ENV_VARS[@]}; do # if [[ -z "${!env_var}" ]]; then # echo "Error: environment variable '$env_var' not set. Aborting." # exit 1 # fi # done # # A password hash + salt for the demo password 'password' # # Via Python3: bycrypt.hashpw('password'.encode('utf-8'), bcrypt.gensalt()) # DEFAULT_PASSHASH='\x243262243132245273764737474f39777562452f4a786a79444a7263756f386568466b762e634e5262356e6867746b474752584c6634437969346643' # create_accounts # }