Browse Source

run baangtDB with mysql

aguryev 3 years ago
parent
commit
2ce252e2b4
8 changed files with 182 additions and 54 deletions
  1. 23 23
      api/DataBaseORM.py
  2. 3 5
      api/Dockerfile
  3. 1 1
      api/requirements.txt
  4. 7 0
      mysql/Dockerfile
  5. 5 0
      mysql/init.sql
  6. 2 0
      mysql/run_mysql.sh
  7. 108 0
      run_services_with_mysql.sh
  8. 33 25
      ui/app/models.py

+ 23 - 23
api/DataBaseORM.py

@@ -1,5 +1,5 @@
 from sqlalchemy import Column, String, Integer, DateTime, Boolean, Table, ForeignKey
-#from sqlalchemy.types import Binary, TypeDecorator
+#from sqlalchemy.types import Binary(16), TypeDecorator
 from sqlalchemy.orm import relationship
 from sqlalchemy import create_engine
 from sqlalchemy.ext.declarative import declarative_base
@@ -38,12 +38,12 @@ class TestrunLog(base):
 	#
 	__tablename__ = "testruns"
 	# columns
-	id = Column(Binary, primary_key=True, default=uuidAsBytes)
-	testrunName = Column(String, nullable=False)
-	logfileName = Column(String, nullable=False)
+	id = Column(Binary(16), primary_key=True, default=uuidAsBytes)
+	testrunName = Column(String(32), nullable=False)
+	logfileName = Column(String(1024), nullable=False)
 	startTime = Column(DateTime, nullable=False)
 	endTime = Column(DateTime, nullable=False)
-	dataFile = Column(String, nullable=True)
+	dataFile = Column(String(1024), nullable=True)
 	statusOk = Column(Integer, nullable=False)
 	statusFailed = Column(Integer, nullable=False)
 	statusPaused = Column(Integer, nullable=False)
@@ -90,9 +90,9 @@ class GlobalAttribute(base):
 	__tablename__ = 'globals'
 	# columns
 	id = Column(Integer, primary_key=True)
-	name = Column(String, nullable=False)
-	value = Column(String, nullable=True)
-	testrun_id = Column(Binary, ForeignKey('testruns.id'), nullable=False)
+	name = Column(String(64), nullable=False)
+	value = Column(String(1024), nullable=True)
+	testrun_id = Column(Binary(16), ForeignKey('testruns.id'), nullable=False)
 	# relationships
 	testrun = relationship('TestrunLog', foreign_keys=[testrun_id])
 
@@ -108,8 +108,8 @@ class TestCaseSequenceLog(base):
 
 	__tablename__ = 'testCaseSequences'
 	# columns
-	id = Column(Binary, primary_key=True, default=uuidAsBytes)
-	testrun_id = Column(Binary, ForeignKey('testruns.id'), nullable=False)
+	id = Column(Binary(16), primary_key=True, default=uuidAsBytes)
+	testrun_id = Column(Binary(16), ForeignKey('testruns.id'), nullable=False)
 	# relationships
 	testrun = relationship('TestrunLog', foreign_keys=[testrun_id])
 	testcases = relationship('TestCaseLog')
@@ -134,8 +134,8 @@ class TestCaseLog(base):
 	#
 	__tablename__ = 'testCases'
 	# columns
-	id = Column(Binary, primary_key=True, default=uuidAsBytes)
-	testcase_sequence_id = Column(Binary, ForeignKey('testCaseSequences.id'), nullable=False)
+	id = Column(Binary(16), primary_key=True, default=uuidAsBytes)
+	testcase_sequence_id = Column(Binary(16), ForeignKey('testCaseSequences.id'), nullable=False)
 	# relationships
 	testcase_sequence = relationship('TestCaseSequenceLog', foreign_keys=[testcase_sequence_id])
 	fields = relationship('TestCaseField')
@@ -159,9 +159,9 @@ class TestCaseField(base):
 	__tablename__ = 'testCaseFields'
 	# columns
 	id = Column(Integer, primary_key=True)
-	name = Column(String, nullable=False)
-	value = Column(String, nullable=True)
-	testcase_id = Column(Binary, ForeignKey('testCases.id'), nullable=False)
+	name = Column(String(64), nullable=False)
+	value = Column(String(1024), nullable=True)
+	testcase_id = Column(Binary(16), ForeignKey('testCases.id'), nullable=False)
 	# relationships
 	testcase = relationship('TestCaseLog', foreign_keys=[testcase_id])
 
@@ -172,18 +172,18 @@ class TestCaseNetworkInfo(base):
 	__tablename__ = 'networkInfo'
 	# columns
 	id = Column(Integer, primary_key=True)
-	browserName = Column(String, nullable=True)
+	browserName = Column(String(64), nullable=True)
 	status = Column(Integer, nullable=True)
-	method = Column(String, nullable=True)
-	url = Column(String, nullable=True)
-	contentType = Column(String, nullable=True)
+	method = Column(String(16), nullable=True)
+	url = Column(String(256), nullable=True)
+	contentType = Column(String(64), nullable=True)
 	contentSize = Column(Integer, nullable=True)
-	headers = Column(String, nullable=True)
-	params = Column(String, nullable=True)
-	response = Column(String, nullable=True)
+	headers = Column(String(4096), nullable=True)
+	params = Column(String(1024), nullable=True)
+	response = Column(String(4096), nullable=True)
 	startDateTime = Column(DateTime, nullable=True)
 	duration = Column(Integer, nullable=True)
-	testcase_id = Column(Binary, ForeignKey('testCases.id'), nullable=True)
+	testcase_id = Column(Binary(16), ForeignKey('testCases.id'), nullable=True)
 	# relationships
 	testcase = relationship('TestCaseLog', foreign_keys=[testcase_id])
 

+ 3 - 5
api/Dockerfile

@@ -58,13 +58,11 @@ RUN apt-get install -y libpq-dev
 RUN mkdir /baangt
 WORKDIR /baangt
 
-RUN ls
-
-COPY requirements.txt requirements.txt
-
 RUN pip3 install gunicorn
 RUN pip3 install pymysql cryptography psycopg2
 RUN pip3 install pyqt5==5.14
+
+COPY requirements.txt requirements.txt
 RUN pip3 install -r requirements.txt
 
 # set up baangt environment
@@ -76,7 +74,7 @@ RUN mkdir /baangt/browserDrivers && \
 ADD . /baangt
 
 #RUN pip3 install dataclasses dataclasses_json
-#COPY DataBaseORM.py /usr/local/lib/python3.6/dist-packages/baangt/base/DataBaseORM.py
+COPY DataBaseORM.py /usr/local/lib/python3.6/dist-packages/baangt/base/DataBaseORM.py
 
 RUN chmod +x runservice.sh
 

+ 1 - 1
api/requirements.txt

@@ -18,6 +18,6 @@ faker>=4.0.3
 
 
 
-baangt==1.0.0
+baangt==0.9.8
 pymsteams>=0.1.12
 slack_webhook>=1.0.3

+ 7 - 0
mysql/Dockerfile

@@ -0,0 +1,7 @@
+FROM mysql/mysql-server:8.0
+
+ADD init.sql /docker-entrypoint-initdb.d
+
+EXPOSE 3306
+
+ENTRYPOINT ["/entrypoint.sh", "mysqld"]

+ 5 - 0
mysql/init.sql

@@ -0,0 +1,5 @@
+CREATE DATABASE IF NOT EXISTS definition;
+CREATE DATABASE IF NOT EXISTS execution;
+CREATE USER 'baangt'@'%' IDENTIFIED BY '12345';
+GRANT ALL ON definition.* TO 'baangt'@'%';
+GRANT ALL ON execution.* TO 'baangt'@'%';

+ 2 - 0
mysql/run_mysql.sh

@@ -0,0 +1,2 @@
+docker build -t mysql-baangt:latest .
+docker run --name mysql -p 3305:3306 -d -e MYSQL_RANDOM_ROOT_PASSWORD=yes mysql-baangt:latest

+ 108 - 0
run_services_with_mysql.sh

@@ -0,0 +1,108 @@
+#!/bin/bash
+
+# default ports
+#       UI    API    DF     RD     SQL
+ports=("80" "5000" "5050" "6380" "3305")
+# default flag for bulding docker images 
+b=true
+
+# parse arguments
+args=("$@")
+
+i=0
+while [ $i -lt $# ]
+do
+	case ${args[$i]} in
+		"-ui")
+			ports[0]=${args[$i+1]}
+			;;
+		"-api")
+			ports[1]=${args[$i+1]}
+			;;
+		"-df")
+			ports[2]=${args[$i+1]}
+			;;
+		"-rd")
+			ports[3]=${args[$i+1]}
+			;;
+		"-sql")
+			ports[4]=${args[$i+1]}
+			;;
+		"-b")
+			b=false
+			let i--
+			;;
+		"stop")
+			echo
+			echo Stopping containers...
+			docker stop baangt-ui baangt-api baangt-file rq-worker redis mysql
+			exit 1
+			;;
+	esac
+	let i=$i+2
+done
+
+# building docker images
+if [ $b = true ]
+then
+	# UI Service
+	echo
+	echo Building UI Service...
+	cd ui
+	docker build -t baangt-ui:latest .
+	cd ..
+	# File Servise
+	echo
+	echo Building DataFile Service...
+	cd files
+	docker build -t baangt-file:latest .
+	cd ..
+	# API Service
+	echo
+	echo Building Execution API Service...
+	cd api
+	docker build -t baangt-api:latest .
+	cd ..
+fi
+
+# running containers
+echo
+echo Starting MySQL...
+cd mysql
+docker build -t mysql-baangt:latest .
+cd ..
+docker run --name mysql -p ${ports[4]}:3306 -d -e MYSQL_RANDOM_ROOT_PASSWORD=yes mysql-baangt:latest
+# Redis
+echo
+echo Starting Redis...
+docker run -d -p ${ports[3]}:6379 --name redis --rm redis:5-alpine
+
+# RQ Worker
+echo
+echo Starting Redis Worker...
+docker run -d --name rq-worker  \
+    -e BAANGT_DATAFILE_HOST=172.17.0.1:${ports[2]} --rm \
+    -e DATABASE_URL=mysql+pymysql://baangt:12345@172.17.0.1:${ports[4]}/execution \
+    -e REDIS_URL=redis://172.17.0.1:${ports[3]}/0 --entrypoint rq \
+    baangt-api:latest worker -u redis://172.17.0.1:${ports[3]}/0 baangt-tasks 
+
+# Data Files
+echo
+echo Starting Data File Service...
+docker run -d -p ${ports[2]}:5000 --name baangt-file --rm baangt-file:latest
+
+# UI Service
+echo
+echo Starting UI Service...
+docker run -d -p ${ports[0]}:5000 --name baangt-ui  \
+    -e DATABASE_URL=mysql+pymysql://baangt:12345@172.17.0.1:${ports[4]}/definition \
+    -e BAANGT_DATAFILE_HOST=172.17.0.1:${ports[2]} \
+    -e BAANGT_API_HOST=172.17.0.1:${ports[1]}  baangt-ui:latest
+
+# API Service
+echo
+echo Starting Execution API Service...
+docker run -d -p ${ports[1]}:5000 --name baangt-api  \
+    -e BAANGT_DATAFILE_HOST=172.17.0.1:${ports[2]}  \
+    -e DATABASE_URL=mysql+pymysql://baangt:12345@172.17.0.1:${ports[4]}/execution \
+    -e REDIS_URL=redis://172.17.0.1:${ports[3]}/0 baangt-api:latest

+ 33 - 25
ui/app/models.py

@@ -8,12 +8,20 @@ import json
 from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION
 
 #
-# Handling dialects
+# Handling sclalchemy dialects
 #
-double_field = db.Float
-dialect = re.search(r'\((\w+)', str(db.get_engine()).lower())
-if dialect and dialect.group(1) == 'postgresql':
-	double_field = DOUBLE_PRECISION
+dialect = re.search(r'(?<=\()\w+', str(db.get_engine()).lower())
+# bynary fields
+if dialect.group() == 'mysql':
+	from sqlalchemy.dialects.mysql import BINARY
+else:
+	BINARY = db.LargeBinary
+# double precision
+if dialect and dialect.group() == 'postgresql':
+	from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION
+else:
+	DOUBLE_PRECISION = db.Float
+
 
 #
 # UUID as bytes
@@ -52,26 +60,26 @@ def load_user(id):
 
 testrun_casesequence = db.Table(
 	'testrun_casesequence',
-	db.Column('testrun_id', db.LargeBinary(16), db.ForeignKey('testruns.id'), primary_key=True),
-	db.Column('testcase_sequence_id', db.LargeBinary(16), db.ForeignKey('testcase_sequences.id'), primary_key=True)
+	db.Column('testrun_id', BINARY(16), db.ForeignKey('testruns.id'), primary_key=True),
+	db.Column('testcase_sequence_id', BINARY(16), db.ForeignKey('testcase_sequences.id'), primary_key=True)
 )
 
 testcase_sequence_datafile = db.Table(
 	'testcase_sequence_datafile',
-	db.Column('testcase_sequence_id', db.LargeBinary(16), db.ForeignKey('testcase_sequences.id'), primary_key=True),
-	db.Column('datafile_id', db.LargeBinary(16), db.ForeignKey('datafiles.id'), primary_key=True)
+	db.Column('testcase_sequence_id', BINARY(16), db.ForeignKey('testcase_sequences.id'), primary_key=True),
+	db.Column('datafile_id', BINARY(16), db.ForeignKey('datafiles.id'), primary_key=True)
 )
 
 testcase_sequence_case = db.Table(
 	'testcase_sequence_case',
-	db.Column('testcase_sequence_id', db.LargeBinary(16), db.ForeignKey('testcase_sequences.id'), primary_key=True),
-	db.Column('testcase_id', db.LargeBinary(16), db.ForeignKey('testcases.id'), primary_key=True)
+	db.Column('testcase_sequence_id', BINARY(16), db.ForeignKey('testcase_sequences.id'), primary_key=True),
+	db.Column('testcase_id', BINARY(16), db.ForeignKey('testcases.id'), primary_key=True)
 )
 
 testcase_stepsequence = db.Table(
 	'testcase_stepsequence',
-	db.Column('testcase_id', db.LargeBinary(16), db.ForeignKey('testcases.id'), primary_key=True),
-	db.Column('teststep_sequence_id', db.LargeBinary(16), db.ForeignKey('teststep_sequences.id'), primary_key=True)
+	db.Column('testcase_id', BINARY(16), db.ForeignKey('testcases.id'), primary_key=True),
+	db.Column('teststep_sequence_id', BINARY(16), db.ForeignKey('teststep_sequences.id'), primary_key=True)
 )
 
 
@@ -86,7 +94,7 @@ class Testrun(db.Model):
 	__tablename__ = 'testruns'
 	
 	# fields
-	id = db.Column(db.LargeBinary(16), primary_key=True, default=uuidAsBytes)
+	id = db.Column(BINARY(16), primary_key=True, default=uuidAsBytes)
 	name = db.Column(db.String(64), nullable=False)
 	description = db.Column(db.String(512), nullable=False)
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@@ -170,7 +178,7 @@ class TestCaseSequence(db.Model):
 	__tablename__ = 'testcase_sequences'
 
 	# fields
-	id = db.Column(db.LargeBinary(16), primary_key=True, default=uuidAsBytes)
+	id = db.Column(BINARY(16), primary_key=True, default=uuidAsBytes)
 	name = db.Column(db.String(64), nullable=False)
 	description = db.Column(db.String(512), nullable=False)
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@@ -257,7 +265,7 @@ class DataFile(db.Model):
 	__tablename__ = 'datafiles'
 
 	# fields
-	id = db.Column(db.LargeBinary(16), primary_key=True, default=uuidAsBytes)
+	id = db.Column(BINARY(16), primary_key=True, default=uuidAsBytes)
 	filename = db.Column(db.String(64), nullable=False)
 	sheet = db.Column(db.String(32), nullable=False, default='data')
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@@ -288,7 +296,7 @@ class TestCase(db.Model):
 	__tablename__ = 'testcases'
 	
 	# fields
-	id = db.Column(db.LargeBinary(16), primary_key=True, default=uuidAsBytes)
+	id = db.Column(BINARY(16), primary_key=True, default=uuidAsBytes)
 	name = db.Column(db.String(64), nullable=False)
 	description = db.Column(db.String(512), nullable=False)
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@@ -369,7 +377,7 @@ class TestStepSequence(db.Model):
 	__tablename__ = 'teststep_sequences'
 
 	# fields
-	id = db.Column(db.LargeBinary(16), primary_key=True, default=uuidAsBytes)
+	id = db.Column(BINARY(16), primary_key=True, default=uuidAsBytes)
 	name = db.Column(db.String(64), nullable=False)
 	description = db.Column(db.String(512), nullable=False)
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@@ -437,7 +445,7 @@ class TestStepExecution(db.Model):
 	__tablename__ = 'teststep_executions'
 
 	# fields
-	id = db.Column(db.LargeBinary(16), primary_key=True, default=uuidAsBytes)
+	id = db.Column(BINARY(16), primary_key=True, default=uuidAsBytes)
 	name = db.Column(db.String(64), nullable=False)
 	description = db.Column(db.String(512), nullable=False)
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@@ -446,7 +454,7 @@ class TestStepExecution(db.Model):
 	locator = db.Column(db.String(512), nullable=True)
 	optional = db.Column(db.Boolean, nullable=False, default=False)
 	# sa dialect
-	timeout = db.Column(double_field(precision='5,2'), nullable=True)
+	timeout = db.Column(DOUBLE_PRECISION(precision='5,2'), nullable=True)
 	release = db.Column(db.String(64), nullable=True)
 	value = db.Column(db.String(1024), nullable=True)
 	value2 = db.Column(db.String(1024), nullable=True)
@@ -454,7 +462,7 @@ class TestStepExecution(db.Model):
 	editor_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
 	activity_type_id = db.Column(db.Integer, db.ForeignKey('activity_types.id'), nullable=False)
 	locator_type_id = db.Column(db.Integer, db.ForeignKey('locator_types.id'), nullable=True)
-	teststep_sequence_id = db.Column(db.LargeBinary(16), db.ForeignKey('teststep_sequences.id'), nullable=True)
+	teststep_sequence_id = db.Column(BINARY(16), db.ForeignKey('teststep_sequences.id'), nullable=True)
 	
 	# relashionships
 	creator = db.relationship('User', backref='created_teststeps', lazy='immediate', foreign_keys=[creator_id])
@@ -502,7 +510,7 @@ class TestStepExecution(db.Model):
 #
 class GlobalTestStepExecution(db.Model):
 	__tablename__ = 'global_teststep_executions'
-	id = db.Column(db.LargeBinary(16), primary_key=True, default=uuidAsBytes)
+	id = db.Column(BINARY(16), primary_key=True, default=uuidAsBytes)
 	name = db.Column(db.String(64), nullable=False)
 	description = db.Column(db.String(512), nullable=False)
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
@@ -511,7 +519,7 @@ class GlobalTestStepExecution(db.Model):
 	editor_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
 	activity_type_id = db.Column(db.Integer, db.ForeignKey('activity_types.id'), nullable=False)
 	locator_type_id = db.Column(db.Integer, db.ForeignKey('locator_types.id'), nullable=False)
-	teststep_sequence_id = db.Column(db.LargeBinary(16), db.ForeignKey('teststep_sequences.id'), nullable=True)
+	teststep_sequence_id = db.Column(BINARY(16), db.ForeignKey('teststep_sequences.id'), nullable=True)
 
 	# relationships
 	creator = db.relationship('User', backref='created_global_teststeps', lazy='immediate', foreign_keys=[creator_id])
@@ -580,10 +588,10 @@ class LocatorType(db.Model):
 
 class TestRunCall(db.Model):
 	__tablename__ = 'testrun_calls'
-	id = db.Column(db.LargeBinary(16), primary_key=True)
+	id = db.Column(BINARY(16), primary_key=True)
 	created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
 	creator_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
-	testrun_id = db.Column(db.LargeBinary(16), db.ForeignKey('testruns.id'), nullable=False)
+	testrun_id = db.Column(BINARY(16), db.ForeignKey('testruns.id'), nullable=False)
 
 	# relationships
 	creator = db.relationship('User', backref='testruns_called', lazy='immediate', foreign_keys=[creator_id])