From 6a1098989fb5495360b8c6177b94d798ad669f98 Mon Sep 17 00:00:00 2001 From: Devin Ford Date: Tue, 4 Apr 2023 17:10:31 -0400 Subject: [PATCH 1/2] feat: backend setup for DBM --- .env.template | 5 +- docker-compose.yml | 26 +++++++++ .../n8/aa/n8aao8d8v8ene7vn4d14zdqxntna | Bin 0 -> 41613 bytes services/dbm/.dockerignore | 37 +++++++++++++ services/dbm/Dockerfile | 27 ++++++++++ services/dbm/bootstrap.py | 40 ++++++++++++++ services/dbm/build.sh | 14 +++++ services/dbm/dbm.py | 51 ++++++++++++++++++ services/dbm/models.py | 27 ++++++++++ services/dbm/requirements.txt | 25 +++++++++ 10 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 services/backend/storage/n8/aa/n8aao8d8v8ene7vn4d14zdqxntna create mode 100644 services/dbm/.dockerignore create mode 100644 services/dbm/Dockerfile create mode 100644 services/dbm/bootstrap.py create mode 100755 services/dbm/build.sh create mode 100644 services/dbm/dbm.py create mode 100644 services/dbm/models.py create mode 100644 services/dbm/requirements.txt diff --git a/.env.template b/.env.template index aa202871..3729f4e8 100644 --- a/.env.template +++ b/.env.template @@ -1,6 +1,7 @@ ADS_PORT=7676 DISCOUNTS_PORT=2814 AUTH_PORT=7578 +DBM_PORT=7595 POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres DD_API_KEY= @@ -48,4 +49,6 @@ NEXT_PUBLIC_DD_SERVICE="frontend" NEXT_PUBLIC_DD_VERSION="1.0.0" NEXT_PUBLIC_DD_ENV="development" NEXT_PUBLIC_AUTH_ROUTE="http://localhost" -NEXT_PUBLIC_AUTH_PORT="7578" \ No newline at end of file +NEXT_PUBLIC_AUTH_PORT="7578" +NEXT_PUBLIC_DBM_ROUTE="http://localhost" +NEXT_PUBLIC_DBM_PORT="7595" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 06d15bbe..c86a5bad 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -160,6 +160,32 @@ services: - "${AUTH_PORT}:${AUTH_PORT}" networks: - storedog-net + dbm: + depends_on: + - postgres + profiles: + - dbm + environment: + - FLASK_APP=dbm.py + - FLASK_DEBUG=1 + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_HOST=postgres + - DD_SERVICE=storedog-dbm + - DD_AGENT_HOST=dd-agent + - DD_LOGS_INJECTION=true + - DD_TRACE_ANALYTICS_ENABLED=true + - DD_PROFILING_ENABLED=true + - DD_APPSEC_ENABLED=true + build: + context: ./services/dbm + command: gunicorn --bind 0.0.0.0:${DBM_PORT} dbm:app # If using any other port besides the default 8282, overriding the CMD is required + volumes: + - "./services/dbm:/app" + ports: + - "${DBM_PORT}:${DBM_PORT}" + networks: + - storedog-net dd-agent: image: gcr.io/datadoghq/agent:latest environment: diff --git a/services/backend/storage/n8/aa/n8aao8d8v8ene7vn4d14zdqxntna b/services/backend/storage/n8/aa/n8aao8d8v8ene7vn4d14zdqxntna new file mode 100644 index 0000000000000000000000000000000000000000..5b763cbaf5144544775e9ed82da79384c973c5cd GIT binary patch literal 41613 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 {random.randint(1, 7000)};') + app.logger.info(engine) + try: + app.logger.info('Connecting to db') + with engine.begin() as conn: + results = conn.execute(query).fetchall() + if results: + app.logger.info('Results found, parsing single item') + result = random.choice(results) + item_response = { + 'id': result.id, + 'description': result.description, + 'last_hour': result.last_hour, + 'order_count': result.order_count, + 'image_url': result.image_url + } + return jsonify(item_response) + except: + app.logger.error("An error occurred while getting items.") + err = jsonify({'error': 'Internal Server Error'}) + err.status_code = 500 + return err + +if __name__ == "__main__": + app.run(debug=True) diff --git a/services/dbm/models.py b/services/dbm/models.py new file mode 100644 index 00000000..58797d19 --- /dev/null +++ b/services/dbm/models.py @@ -0,0 +1,27 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() + + +class Items(db.Model): + __tablename__ = 'items' + id = db.Column(db.Integer, primary_key=True) + description = db.Column(db.String(128)) + order_count = db.Column(db.String(64)) + last_hour = db.Column(db.String(64)) + image_url = db.Column(db.String(64)) + + def __init__(self, description, order_count, image_url, last_hour): + self.description = description + self.order_count = order_count + self.last_hour = last_hour + self.image_url = image_url + + def serialize(self): + return { + 'id': self.id, + 'description': self.description, + 'order_count': self.order_count, + 'last_hour': self.last_hour, + 'image_url': self.image_url + } diff --git a/services/dbm/requirements.txt b/services/dbm/requirements.txt new file mode 100644 index 00000000..1c66c1ac --- /dev/null +++ b/services/dbm/requirements.txt @@ -0,0 +1,25 @@ +certifi==2020.11.8 +chardet==3.0.4 +click==8.0 +ddtrace==1.7.2 +Flask==2.2.2 +Flask-Login==0.6.2 +Flask-WTF==1.0.1 +Flask-Cors==3.0.10 +Flask-SQLAlchemy==3.0.2 +idna==2.10 +intervaltree==3.1.0 +itsdangerous==2.0 +Jinja2==3.0 +MarkupSafe==2.1.1 +nose==1.3.7 +protobuf==3.14.0 +requests==2.25.1 +six==1.15.0 +sortedcontainers==2.3.0 +SQLAlchemy==1.4.42 +psycopg2-binary +tenacity==6.2.0 +urllib3==1.26.5 +gunicorn==20.1.0 +Faker==18.3.2 \ No newline at end of file From b45e883aea854d5685863ab2370af0c2c87d9a09 Mon Sep 17 00:00:00 2001 From: Devin Ford Date: Wed, 5 Apr 2023 09:57:40 -0400 Subject: [PATCH 2/2] chore: remove legacy sh file --- services/dbm/build.sh | 14 -------------- services/dbm/dbm.py | 1 - 2 files changed, 15 deletions(-) delete mode 100755 services/dbm/build.sh diff --git a/services/dbm/build.sh b/services/dbm/build.sh deleted file mode 100755 index d4c010e2..00000000 --- a/services/dbm/build.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Set bash strict mode so we insta-fail on any errors -# -e: Exit immediately if a command has non-zero exit code, i.e. fails somehow. -# Otherwise bash is like a Python program that just swallows exceptions. -# -u: Exit with error message if code uses an undefined environment variable, -# instead of silently continuing with an empty string. -# -o pipefail: Like -e, except for piped commands. -set -euo pipefail - -# Enable Docker Buildkit -export DOCKER_BUILDKIT=1 - -# Build and tag image -docker image build --progress=plain --tag ddtraining/dbm:latest . diff --git a/services/dbm/dbm.py b/services/dbm/dbm.py index aa42b816..413c9ff9 100644 --- a/services/dbm/dbm.py +++ b/services/dbm/dbm.py @@ -16,7 +16,6 @@ app.config.update( DEBUG=True, SECRET_KEY="secret_sauce", - ) CORS(app)