Skip to content

Commit d132c85

Browse files
committed
Merge branch 'master' of github.com:globocom/database-as-a-service
2 parents 7d47a9d + e6feabf commit d132c85

File tree

11 files changed

+184
-54
lines changed

11 files changed

+184
-54
lines changed

.travis.yml

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
1+
sudo: required
2+
13
language: python
24

35
python:
46
- "2.7"
57

6-
before_install:
7-
- mysql -e 'CREATE DATABASE dbaas;'
8-
9-
install:
10-
- pip install -r requirements_test.txt
11-
12-
cache:
13-
- pip
14-
158
services:
16-
- mysql
17-
- mongodb
18-
- redis-server
9+
- docker
10+
11+
env:
12+
DOCKER_COMPOSE_VERSION: 1.11.2
1913

20-
before_script:
21-
- make create_admin_mongo_user
14+
before_install:
15+
- make docker_build
16+
- sudo rm /usr/local/bin/docker-compose
17+
- curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
18+
- chmod +x docker-compose
19+
- sudo mv docker-compose /usr/local/bin
20+
- docker-compose --version
21+
- docker-compose pull mysqldb56 redisdb mongodb
22+
- docker images
23+
- docker ps
24+
- sudo /etc/init.d/mysql stop
2225

2326
script:
24-
- make test
27+
- docker-compose run test
28+
29+
notifications:
30+
email: false

Dockerfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM python:2.7
2+
3+
ADD . /code
4+
WORKDIR /code
5+
RUN apt-get update
6+
RUN apt-get install -y libsasl2-dev python-dev libldap2-dev libssl-dev mysql-client
7+
RUN easy_install ipython==5.1.0 ipdb==0.10.1
8+
RUN pip install -r requirements_test.txt
9+
ENTRYPOINT /code/tests.sh

Makefile

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,26 @@ reset_data: db_reset # drop and create database and insert sample data
6161
run_migrate: # run all migrations
6262
@cd dbaas && python manage.py syncdb --migrate --noinput --no-initial-data
6363

64-
create_admin_mongo_user:
65-
@mongo admin --eval 'db.addUser({user: "admin", pwd: "123456", roles: ["userAdminAnyDatabase", "clusterAdmin", "readWriteAnyDatabase", "dbAdminAnyDatabase"]});'
66-
6764
test: # run tests
68-
# @echo "create database IF NOT EXISTS dbaas;" | mysql -u root
69-
@mysqladmin -uroot -p$(DBAAS_DATABASE_PASSWORD) -f drop test_dbaas -h$(DBAAS_DATABASE_HOST); true
7065
@cd dbaas && python manage.py test --settings=dbaas.settings_test --traceback $(filter-out $@,$(MAKECMDGOALS))
7166

67+
docker_build:
68+
docker build -t dbaas_test .
69+
70+
test_with_docker:
71+
docker-compose run test
72+
73+
docker_mysql_55:
74+
docker-compose run --publish="3306:3306" mysqldb55
75+
76+
docker_mysql_56:
77+
docker-compose run --publish="3306:3306" mysqldb56
78+
79+
docker_mysql_57:
80+
docker-compose run --publish="3306:3306" mysqldb57
81+
82+
kill_mysql:
83+
@ps aux | grep mysqldb | grep -v 'grep mysqldb' | awk '{print $$2}' | xargs kill
7284

7385
run: # run local server
7486
@cd dbaas && python manage.py runserver 0.0.0.0:8000 $(filter-out $@,$(MAKECMDGOALS))

README.md

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ DBaaS requires the following:
3333
* and all packages in requirements.txt file (there is a shortcut to install them)
3434

3535

36+
Setup docker and docker-compose(optional)
37+
=========================================
38+
39+
* Install [Docker](https://docs.docker.com/engine/installation/)
40+
3641
Setup your local environment
3742
============================
3843

@@ -58,23 +63,13 @@ some minimum operational data on DB.
5863

5964
make reset_data
6065

61-
## Running all tests
62-
63-
Before running the test, makes sure that you have mongod running and a user admin created with password 123456.
64-
65-
db = db.getSiblingDB('admin')
66+
## Running all tests on local enviroment
6667

67-
db.createUser( { user: "admin",
68-
pwd: "123456",
69-
roles: [ "userAdminAnyDatabase", "clusterAdmin", "readWriteAnyDatabase", "dbAdminAnyDatabase" ] } )
70-
71-
Then install all the required packages
72-
73-
make pip
68+
make pip && make test
7469

75-
Run it!
70+
## Running all test with docker( To run this the and docker-compose must be avaliable)
7671

77-
make test
72+
make docker_build && make test_with_docker
7873

7974
## Running the project
8075

add_user_admin_on_mongo.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from pymongo import MongoClient
2+
3+
client = MongoClient("mongodb://mongodb:27017")
4+
5+
db = client.admin
6+
7+
db.add_user('admin', '123456', roles=["userAdminAnyDatabase", "clusterAdmin", "readWriteAnyDatabase", "dbAdminAnyDatabase"])

dbaas/dbaas/celeryconfig.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import os
22

3+
34
REDIS_PORT = os.getenv('DBAAS_NOTIFICATION_BROKER_PORT', '6379')
5+
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost')
46
BROKER_URL = os.getenv(
5-
'DBAAS_NOTIFICATION_BROKER_URL', 'redis://localhost:%s/0' % REDIS_PORT)
7+
'DBAAS_NOTIFICATION_BROKER_URL', 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT))
68
CELERYD_TASK_TIME_LIMIT = 10800
79
CELERY_TRACK_STARTED = True
810
CELERY_IGNORE_RESULT = False

dbaas/drivers/tests/test_driver_mysql.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import, unicode_literals
3-
import mock
43
import logging
54
from django.test import TestCase
65
from drivers import DriverFactory
@@ -16,10 +15,15 @@
1615
class AbstractTestDriverMysql(TestCase):
1716

1817
def setUp(self):
18+
mysql_host = settings.DB_HOST
19+
mysql_port = settings.DB_PORT or 3306
20+
self.mysql_endpoint = '{}:{}'.format(mysql_host, mysql_port)
1921
self.databaseinfra = factory_physical.DatabaseInfraFactory(
20-
user="root", password=settings.DB_PASSWORD, endpoint="127.0.0.1:3306")
22+
user="root", password=settings.DB_PASSWORD,
23+
endpoint=self.mysql_endpoint)
2124
self.instance = factory_physical.InstanceFactory(
22-
databaseinfra=self.databaseinfra, port=3306)
25+
databaseinfra=self.databaseinfra, address=mysql_host,
26+
port=mysql_port)
2327
self.driver = MySQL(databaseinfra=self.databaseinfra)
2428
self._mysql_client = None
2529

@@ -53,7 +57,7 @@ def test_instantiate_mysqldb_using_engine_factory(self):
5357

5458
def test_connection_string(self):
5559
self.assertEqual(
56-
"mysql://<user>:<password>@127.0.0.1:3306", self.driver.get_connection())
60+
"mysql://<user>:<password>@{}".format(self.mysql_endpoint), self.driver.get_connection())
5761

5862
def test_get_user(self):
5963
self.assertEqual(self.databaseinfra.user, self.driver.get_user())
@@ -68,7 +72,7 @@ def test_get_default_port(self):
6872
def test_connection_with_database(self):
6973
self.database = factory_logical.DatabaseFactory(
7074
name="my_db_url_name", databaseinfra=self.databaseinfra)
71-
self.assertEqual("mysql://<user>:<password>@127.0.0.1:3306/my_db_url_name",
75+
self.assertEqual("mysql://<user>:<password>@{}/my_db_url_name".format(self.mysql_endpoint),
7276
self.driver.get_connection(database=self.database))
7377

7478

dbaas/drivers/tests/test_driver_pymongo.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import, unicode_literals
3+
import os
34
import mock
45
from django.test import TestCase
56
from drivers import DriverFactory
@@ -12,9 +13,12 @@
1213
class AbstractTestDriverMongo(TestCase):
1314

1415
def setUp(self):
16+
mongo_host = os.getenv('TESTS_MONGODB_HOST', '127.0.0.1')
17+
mongo_port = os.getenv('TESTS_MONGODB_PORT', '27017')
18+
self.mongo_endpoint = '{}:{}'.format(mongo_host, mongo_port)
1519
self.databaseinfra = factory_physical.DatabaseInfraFactory()
1620
self.instance = factory_physical.InstanceFactory(
17-
databaseinfra=self.databaseinfra)
21+
databaseinfra=self.databaseinfra, address=mongo_host)
1822
self.driver = MongoDB(databaseinfra=self.databaseinfra)
1923
self._mongo_client = None
2024

@@ -48,7 +52,7 @@ def test_instantiate_mongodb_using_engine_factory(self):
4852

4953
def test_connection_string(self):
5054
self.assertEqual(
51-
"mongodb://<user>:<password>@127.0.0.1:27017", self.driver.get_connection())
55+
"mongodb://<user>:<password>@{}".format(self.mongo_endpoint), self.driver.get_connection())
5256

5357
def test_get_user(self):
5458
self.assertEqual(self.databaseinfra.user, self.driver.get_user())
@@ -65,14 +69,21 @@ def test_connection_string_when_in_replica_set(self, get_replica_name):
6569
self.instance = factory_physical.InstanceFactory(
6670
databaseinfra=self.databaseinfra, address='127.0.0.2', port=27018)
6771
get_replica_name.return_value = 'my_repl'
68-
self.assertEqual(
69-
"mongodb://<user>:<password>@127.0.0.1:27017,127.0.0.2:27018?replicaSet=my_repl", self.driver.get_connection())
72+
73+
expected_conn = ("mongodb://<user>:<password>"
74+
"@{},127.0.0.2:27018"
75+
"?replicaSet=my_repl").format(self.mongo_endpoint)
76+
77+
self.assertEqual(expected_conn, self.driver.get_connection())
7078

7179
def test_connection_with_database(self):
7280
self.database = factory_logical.DatabaseFactory(
7381
name="my_db_url_name", databaseinfra=self.databaseinfra)
74-
self.assertEqual("mongodb://<user>:<password>@127.0.0.1:27017/my_db_url_name",
75-
self.driver.get_connection(database=self.database))
82+
83+
expected_conn = ("mongodb://<user>:<password>"
84+
"@{}/my_db_url_name").format(self.mongo_endpoint)
85+
86+
self.assertEqual(expected_conn, self.driver.get_connection(database=self.database))
7687

7788
@mock.patch.object(MongoDB, 'get_replica_name')
7889
def test_connection_with_database_and_replica(self, get_replica_name):
@@ -81,8 +92,12 @@ def test_connection_with_database_and_replica(self, get_replica_name):
8192
get_replica_name.return_value = 'my_repl'
8293
self.database = factory_logical.DatabaseFactory(
8394
name="my_db_url_name", databaseinfra=self.databaseinfra)
84-
self.assertEqual("mongodb://<user>:<password>@127.0.0.1:27017,127.0.0.2:27018/my_db_url_name?replicaSet=my_repl",
85-
self.driver.get_connection(database=self.database))
95+
96+
expected_conn = ("mongodb://<user>:<password>"
97+
"@{},127.0.0.2:27018/my_db_url_name"
98+
"?replicaSet=my_repl").format(self.mongo_endpoint)
99+
100+
self.assertEqual(expected_conn, self.driver.get_connection(database=self.database))
86101

87102

88103
class ManageDatabaseMongoDBTestCase(AbstractTestDriverMongo):

dbaas/drivers/tests/test_driver_redis.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import, unicode_literals
3-
import mock
43
import logging
54
from django.test import TestCase
5+
from django.conf import settings
66
from drivers import DriverFactory
77
from physical.tests import factory as factory_physical
88
from logical.tests import factory as factory_logical
@@ -15,10 +15,13 @@
1515
class AbstractTestDriverRedis(TestCase):
1616

1717
def setUp(self):
18+
redis_host = settings.REDIS_HOST
19+
redis_port = settings.REDIS_PORT
20+
self.endpoint = "{}:{}".format(redis_host, redis_port)
1821
self.databaseinfra = factory_physical.DatabaseInfraFactory(
19-
password="OPlpplpooi", endpoint="127.0.0.1:6379")
22+
password="OPlpplpooi", endpoint=self.endpoint)
2023
self.instance = factory_physical.InstanceFactory(
21-
databaseinfra=self.databaseinfra, port=6379, instance_type=4)
24+
databaseinfra=self.databaseinfra, port=redis_port, instance_type=4, address=redis_host)
2225
self.driver = Redis(databaseinfra=self.databaseinfra)
2326
self._redis_client = None
2427

@@ -50,7 +53,7 @@ def test_instantiate_redis_using_engine_factory(self):
5053

5154
def test_connection_string(self):
5255
self.assertEqual(
53-
"redis://:<password>@127.0.0.1:6379/0", self.driver.get_connection())
56+
"redis://:<password>@{}/0".format(self.endpoint), self.driver.get_connection())
5457

5558
def test_get_password(self):
5659
self.assertEqual(
@@ -62,7 +65,7 @@ def test_get_default_port(self):
6265
def test_connection_with_database(self):
6366
self.database = factory_logical.DatabaseFactory(
6467
name="my_db_url_name", databaseinfra=self.databaseinfra)
65-
self.assertEqual("redis://:<password>@127.0.0.1:6379/0",
68+
self.assertEqual("redis://:<password>@{}/0".format(self.endpoint),
6669
self.driver.get_connection(database=self.database))
6770

6871

@@ -73,7 +76,7 @@ class ManageDatabaseRedisTestCase(AbstractTestDriverRedis):
7376
def setUp(self):
7477
super(ManageDatabaseRedisTestCase, self).setUp()
7578
self.database = factory_logical.DatabaseFactory(
76-
databaseinfra=self.databaseinfra)
79+
databaseinfra=self.databaseinfra, address=settings.REDIS_HOST)
7780
# ensure database is dropped
7881
# get fake driver
7982
driver = self.databaseinfra.get_driver()

docker-compose.yml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
version: '2.1'
2+
3+
services:
4+
5+
mysqldb55:
6+
image: mysql:5.5
7+
environment:
8+
- MYSQL_ROOT_PASSWORD=123
9+
- MYSQL_USER=rute
10+
- MYSQL_PASSWORD=123
11+
- MYSQL_DATABASE=dbaas
12+
ports:
13+
- "3306:3306"
14+
15+
mysqldb56:
16+
image: mysql:5.6
17+
environment:
18+
- MYSQL_ROOT_PASSWORD=123
19+
- MYSQL_USER=rute
20+
- MYSQL_PASSWORD=123
21+
- MYSQL_DATABASE=dbaas
22+
ports:
23+
- "3306:3306"
24+
25+
mysqldb57:
26+
image: mysql:5.7
27+
environment:
28+
- MYSQL_ROOT_PASSWORD=123
29+
- MYSQL_USER=rute
30+
- MYSQL_PASSWORD=123
31+
- MYSQL_DATABASE=dbaas
32+
ports:
33+
- "3306:3306"
34+
35+
mongodb:
36+
image: mongo:3.4
37+
38+
redisdb:
39+
image: redis:3.2
40+
41+
test:
42+
image: dbaas_test
43+
volumes:
44+
- .:/code
45+
depends_on:
46+
- mysqldb56
47+
- mongodb
48+
- redisdb
49+
links:
50+
- mysqldb56
51+
- mongodb
52+
- redisdb
53+
54+
environment:
55+
- REDIS_HOST=redisdb
56+
- DBAAS_DATABASE_HOST=mysqldb56
57+
- DBAAS_DATABASE_PASSWORD=123
58+
- TESTS_MONGODB_HOST=mongodb

tests.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/bash
2+
echo -n 'waiting mysql start'
3+
while ! mysql -h $DBAAS_DATABASE_HOST -uroot -p$DBAAS_DATABASE_PASSWORD -e "SHOW DATABASES"
4+
do
5+
echo -n .
6+
sleep 1
7+
done
8+
9+
echo 'MYSQL STARTED!!!!'
10+
11+
# Create DATABASE
12+
echo "create database IF NOT EXISTS dbaas;" | mysql -h $DBAAS_DATABASE_HOST -uroot -p$DBAAS_DATABASE_PASSWORD
13+
14+
# Create user on mongo
15+
python add_user_admin_on_mongo.py
16+
17+
# Run tests
18+
make test
19+
# bash

0 commit comments

Comments
 (0)