6-anthos-install/acm-repos/root-config-repo/namespaces/boa/transactions/populate-ledger-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-ledger-db
# spec:
# template:
# spec:
# shareProcessNamespace: true # Important to stop all processes
# serviceAccountName: transactions
# containers:
# - name: sidecar-controller
# image: bash
# command: ['bash', '-c', '. /scripts/wait-to-complete-sidecar.sh "initialize-database.sh" "cloud_sql_proxy"']
# requests:
# cpu: 200m
# memory: 100Mi
# volumeMounts:
# - name: scripts
# mountPath: "/scripts"
# readOnly: true
# resources:
# limits:
# cpu: "200m"
# memory: "100Mi"
# - name: populate-ledger-db
# image: postgres:13.0
# command: ['bash', '-c','. /scripts/initialize-database.sh 127.0.0.1 5432 ledger-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: "ledger-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"]
# volumes:
# - name: scripts
# configMap:
# name: ledger-schema-config
# restartPolicy: Never
# backoffLimit: 4
# ---
# # kubectl create configmap ledger-schema-config --from-file=src/ledger-db/initdb/0-ledger-schema.sql --dry-run -o yaml (copy and add below)
# # kubectl create configmap ledger-schema-config --from-file=src/ledger-db/initdb/1-load-testdata.sh --dry-run -o yaml (copy and add below)
# apiVersion: v1
# kind: ConfigMap
# metadata:
# name: ledger-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-ledger-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-ledger-schema.sql: |
# /*
# * Copyright 2020, 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
# *
# * http://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.
# */
# CREATE TABLE TRANSACTIONS (
# TRANSACTION_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
# FROM_ACCT CHAR(10) NOT NULL,
# TO_ACCT CHAR(10) NOT NULL,
# FROM_ROUTE CHAR(9) NOT NULL,
# TO_ROUTE CHAR(9) NOT NULL,
# AMOUNT INT NOT NULL,
# TIMESTAMP TIMESTAMP NOT NULL
# );
# -- index account number/routing number pairs
# CREATE INDEX ON TRANSACTIONS (FROM_ACCT, FROM_ROUTE, TIMESTAMP);
# CREATE INDEX ON TRANSACTIONS (TO_ACCT, TO_ROUTE, TIMESTAMP);
# -- append only ledger; prevent updates or deletes
# CREATE RULE PREVENT_UPDATE AS
# ON UPDATE TO TRANSACTIONS
# DO INSTEAD NOTHING;
# CREATE RULE PREVENT_DELETE AS
# ON DELETE TO TRANSACTIONS
# DO INSTEAD NOTHING;
# 1-load-testdata.sh: |
# #!/bin/bash
# # Copyright 2020 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
# #
# # http://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.
# # Create demo transactions in the ledger for the demo user accounts.
# #
# # Gerenated transactions follow a pattern of biweekly large deposits with
# # periodic small payments to randomly choosen accounts.
# #
# # To run, set environment variable USE_DEMO_DATA="True"
# set -u
# # skip adding transactions if not enabled
# if [ -z "$USE_DEMO_DATA" ] && [ "$USE_DEMO_DATA" != "True" ]; then
# echo "\$USE_DEMO_DATA not \"True\"; no demo transactions added"
# exit 0
# fi
# # Expected environment variables
# readonly ENV_VARS=(
# "POSTGRES_DB"
# "POSTGRES_USER"
# "LOCAL_ROUTING_NUM"
# )
# add_transaction() {
# DATE=$(date -u +"%Y-%m-%d %H:%M:%S.%3N%z" --date="@$(($6))")
# echo "adding demo transaction: $1 -> $2"
# psql -X -v ON_ERROR_STOP=1 -v fromacct="$1" -v toacct="$2" -v fromroute="$3" -v toroute="$4" -v amount="$5" --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
# INSERT INTO TRANSACTIONS (FROM_ACCT, TO_ACCT, FROM_ROUTE, TO_ROUTE, AMOUNT, TIMESTAMP)
# VALUES (:'fromacct', :'toacct', :'fromroute', :'toroute', :'amount', '$DATE');
# EOSQL
# }
# create_transactions() {
# PAY_PERIODS=3
# DAYS_BETWEEN_PAY=14
# SECONDS_IN_PAY_PERIOD=$(( 86400 * $DAYS_BETWEEN_PAY ))
# DEPOSIT_AMOUNT=250000
# # create a UNIX timestamp in seconds since the Epoch
# START_TIMESTAMP=$(( $(date +%s) - $(( $(($PAY_PERIODS+1)) * $SECONDS_IN_PAY_PERIOD )) ))
# for i in $(seq 1 $PAY_PERIODS); do
# # create deposit transaction for each user
# for account in ${USER_ACCOUNTS[@]}; do
# add_transaction "$EXTERNAL_ACCOUNT" "$account" "$EXTERNAL_ROUTING" "$LOCAL_ROUTING_NUM" $DEPOSIT_AMOUNT $START_TIMESTAMP
# done
# # create 15-20 payments between users
# TRANSACTIONS_PER_PERIOD=$(shuf -i 15-20 -n1)
# for p in $(seq 1 $TRANSACTIONS_PER_PERIOD); do
# # randomly generate an amount between $10-$100
# AMOUNT=$(shuf -i 1000-10000 -n1)
# # randomly select a sender and receiver
# SENDER_ACCOUNT=${USER_ACCOUNTS[$RANDOM % ${#USER_ACCOUNTS[@]}]}
# RECIPIENT_ACCOUNT=${USER_ACCOUNTS[$RANDOM % ${#USER_ACCOUNTS[@]}]}
# # if sender equals receiver, send to a random anonymous account
# if [[ "$SENDER_ACCOUNT" == "$RECIPIENT_ACCOUNT" ]]; then
# RECIPIENT_ACCOUNT=$(shuf -i 1000000000-9999999999 -n1)
# fi
# TIMESTAMP=$(( $START_TIMESTAMP + $(( $SECONDS_IN_PAY_PERIOD * $p / $(($TRANSACTIONS_PER_PERIOD + 1 )) )) ))
# add_transaction "$SENDER_ACCOUNT" "$RECIPIENT_ACCOUNT" "$LOCAL_ROUTING_NUM" "$LOCAL_ROUTING_NUM" $AMOUNT $TIMESTAMP
# done
# START_TIMESTAMP=$(( $START_TIMESTAMP + $(( $i * $SECONDS_IN_PAY_PERIOD )) ))
# done
# }
# create_ledger() {
# # Account numbers for users 'testuser', 'alice', 'bob', and 'eve'.
# USER_ACCOUNTS=("1011226111" "1033623433" "1055757655" "1077441377")
# # Numbers for external account 'External Bank'
# EXTERNAL_ACCOUNT="9099791699"
# EXTERNAL_ROUTING="808889588"
# create_transactions
# }
# 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
# create_ledger
# }