chaostoolkit-examples/cloudsql-cloudrun-pbr-fault-injection/app/cloudruncode/main.py (61 lines of code) (raw):
#
# Copyright 2023 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.
#
#
# Important:
#
# When you modify this file, please uncomment #always_run
# in ../terraform/cloudrun.tf file to enable the build.
#
import os
from google.cloud.sql.connector import Connector, IPTypes
from google.cloud import secretmanager
import pg8000
import pymysql
import socket
import sqlalchemy
from flask import Flask
app = Flask(__name__)
def get_secret(name):
print("1------------------")
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
print("3------------------")
# Access the secret version.
response = client.access_secret_version(request={"name": name})
# Print the secret payload.
#
# WARNING: Do not print the secret in a production environment - this
# snippet is showing how to access the secret material.
return response.payload.data.decode("UTF-8")
@app.route("/")
def connect_tcp_socket() -> sqlalchemy.engine.base.Engine:
"""Initializes a TCP connection pool for a Cloud SQL instance of MySQL."""
# Note: Saving credentials in environment variables is convenient, but not
# secure - consider a more secure solution such as
# Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
# keep secrets safe.
db_host = os.environ.get("db_host")
db_name = "mysql"
db_port = 3306
# IP lookup from hostname
print(f'The {db_host} IP Address is {socket.gethostbyname(db_host)}')
print("2------------------")
project_id = os.environ.get("project_id")
# Build the resource name of the secret version.
pool = sqlalchemy.create_engine(
# Equivalent URL:
# mysql+pymysql://<db_user>:<db_pass>@<db_host>:<db_port>/<db_name>
sqlalchemy.engine.url.URL.create(
drivername="mysql+pymysql",
username=get_secret(f"projects/{project_id}/secrets/db-user-pbr/versions/1"),
password=get_secret(f"projects/{project_id}/secrets/db-password-pbr/versions/1"),
host=db_host,
port=db_port
),
# ...
)
res={}
with pool.connect() as db_conn:
# query and fetch ratings table
try:
res= db_conn.execute(sqlalchemy.text("CREATE DATABASE testdb;"))
except:
print("database already created")
try:
res= db_conn.execute(sqlalchemy.text("USE testdb;"))
except:
print("already in database")
try:
res= db_conn.execute(sqlalchemy.text("CREATE TABLE employeetable (name VARCHAR(255), id INT)"))
except:
print("Already table is there")
try:
res= db_conn.execute(sqlalchemy.text("INSERT INTO employeetable (name, id) VALUES ('Peter', 1)"))
except:
print("Already data is present")
try:
res= db_conn.execute(sqlalchemy.text("INSERT INTO employeetable (name, id) VALUES ('John', 2)"))
except:
print("Already data is present")
try:
results = db_conn.execute(sqlalchemy.text("SELECT * FROM employeetable WHERE id=1")).fetchall()
except:
print("Select statement not working")
return str(results)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))