cloudstore-developers

Refactoring

3/19/2015 7:46:23 AM

Changes

bin/README.md 7(+7 -0)

bin/run.py 11(+9 -2)

Details

diff --git a/bin/config.openstack.ini b/bin/config.openstack.ini
new file mode 100644
index 0000000..7fa9a38
--- /dev/null
+++ b/bin/config.openstack.ini
@@ -0,0 +1,33 @@
+[OPENSTACK]
+username = <your username>
+password = <your password>
+tenant_name = cloudscale
+auth_url = http://localhost:5000/v2.0
+key_name = key-pair
+key_pair = key_pair
+
+[APPLICATION]
+num_instances = 2
+image_name = Ubuntu 14.04
+image_username = xlab
+instance_type = 2GB-2CPU-10GB
+
+[DATABASE]
+database_type = mysql
+database_name = tpcw
+database_user = root
+database_pass = password
+instance_type = flavor 2
+num_replicas = 5
+connection_pool_size = 200
+
+[MYSQL]
+setup_type = master-slave
+dump_url = http://cloudscale.xlab.si/showcase/dumps/rds-tpcw-dump-latest.sql
+image_name = mysql-master-slave
+showcase_url = http://cloudscale.xlab.si/showcase/builds/showcaseV3-sql.war
+
+[MONGODB]
+dump_url = http://cloudscale.xlab.si/showcase/dumps/mongo-dump-tpcw-latest.tar.gz
+image_name = cloudscale-db-mongo-image
+showcase_url = http://cloudscale.xlab.si/showcase/builds/showcaseV3-nosql.war

bin/README.md 7(+7 -0)

diff --git a/bin/README.md b/bin/README.md
new file mode 100644
index 0000000..0f70731
--- /dev/null
+++ b/bin/README.md
@@ -0,0 +1,7 @@
+Edit config.aws.ini if you want to deploy showcase on AWS and then run:
+
+$ python run.py aws config.aws.ini
+
+Edit config.openstack.ini if you want to deploy showcase on Openstack and then run:
+
+$ python run.py openstack config.openstack.ini
\ No newline at end of file

bin/run.py 11(+9 -2)

diff --git a/bin/run.py b/bin/run.py
index 201e158..d7ac0a2 100644
--- a/bin/run.py
+++ b/bin/run.py
@@ -1,14 +1,21 @@
+import logging
 import os
 import uuid
 import sys
 from cloudscale.deployment_scripts import deploy
 from cloudscale.deployment_scripts.logger import Logger
 
+class MyLogger(Logger):
+
+    def log(self, msg, level=logging.INFO, append_to_last=False, fin=False):
+        print msg
+
 if __name__ == "__main__":
     if len(sys.argv) == 3:
         config_path = sys.argv[2]
         infrastructure = sys.argv[1]
-        logger = Logger()
-        deploy(infrastructure, config_path, os.path.abspath(os.path.dirname(__file__)), logger)
+        logger = MyLogger()
+        url = deploy(infrastructure, config_path, os.path.abspath(os.path.dirname(__file__)), logger)
+        print "Showcase is deployed on %s" % url
     else:
         print """Usage: python run.py <aws|openstack> <path_to_config>"""
\ No newline at end of file
diff --git a/cloudscale/deployment_scripts/__init__.py b/cloudscale/deployment_scripts/__init__.py
index 21c645b..da59192 100644
--- a/cloudscale/deployment_scripts/__init__.py
+++ b/cloudscale/deployment_scripts/__init__.py
@@ -9,7 +9,7 @@ from cloudscale.deployment_scripts.scripts.infrastructure.openstack import opens
 def deploy(infrastructure, config_path, results_dir, logger):
     config = Config(infrastructure, results_dir, config_path)
     _setup_backend(config, logger)
-    _setup_frontend(config, logger)
+    return _setup_frontend(config, logger)
 
 def _setup_backend(config, logger):
     backend = Backend(config, logger)
@@ -33,4 +33,5 @@ def _setup_frontend(config, logger):
     elif config.provider == 'openstack':
         showcase_url = frontend.setup_openstack_frontend()
 
-    logger.log('You can view your showcase on <a href="http://%s/showcase-1-a">http://%s/showcase-1-a</a>' % (showcase_url, showcase_url), fin=True)
+    return showcase_url
+
diff --git a/cloudscale/deployment_scripts/config.py b/cloudscale/deployment_scripts/config.py
index 5007668..24ceb86 100644
--- a/cloudscale/deployment_scripts/config.py
+++ b/cloudscale/deployment_scripts/config.py
@@ -1,6 +1,7 @@
+import novaclient
 from cloudscale.deployment_scripts.scripts import read_config, create_user_path
 
-class Setup:
+class AWSConfig:
 
     def __init__(self, config, logger):
         self.logger = logger
@@ -35,6 +36,60 @@ class Setup:
         self.rds_master_identifier  = self.cfg.get('RDS', 'master_identifier')
         self.rds_replica_identifier = self.cfg.get('RDS', 'replica_identifier')
 
+class OpenstackConfig:
+    def __init__(self, config, logger):
+        self.logger = logger
+        self.config = config
+        self.cfg = config.cfg
+
+        self.read_config()
+
+        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+
+    def read_config(self):
+        self.user                       = self.cfg.get('OPENSTACK', 'username')
+        self.pwd                        = self.cfg.get('OPENSTACK', 'password')
+        self.url                        = self.cfg.get('OPENSTACK', 'auth_url')
+        self.tenant                     = self.cfg.get('OPENSTACK', 'tenant_name')
+        self.image_name                 = self.cfg.get('APPLICATION', 'image_name')
+        self.remote_user                = self.cfg.get('APPLICATION', 'image_username')
+
+        self.instance_type              = self.cfg.get('APPLICATION', 'instance_type')
+
+        self.num_instances              = self.cfg.get('APPLICATION', 'num_instances')
+        self.key_name                   = self.cfg.get('OPENSTACK', 'key_name')
+        self.key_pair                   = self.cfg.get('OPENSTACK', 'key_pair')
+
+        self.database_type              = self.cfg.get('DATABASE', 'database_type').lower()
+        self.database_instance_type     = self.cfg.get('DATABASE', 'instance_type')
+        self.database_num_replicas      = self.cfg.get('DATABASE', 'num_replicas')
+        self.database_name              = self.cfg.get('DATABASE', 'database_name')
+        self.database_user              = self.cfg.get('DATABASE', 'database_user')
+        self.database_pass              = self.cfg.get('DATABASE', 'database_pass')
+        self.connection_pool_size       = self.cfg.get('DATABASE', 'connection_pool_size')
+        self.mongo_image_name           = self.cfg.get('MONGODB', 'image_name')
+        self.mysql_setup_type           = self.cfg.get('MYSQL', 'setup_type')
+        self.mysql_image_name           = self.cfg.get('MYSQL', 'image_name')
+        self.showcase_url               = self.get_showcase_url()
+        self.dump_url                   = self.get_dump_url()
+
+
+    def get_dump_url(self):
+        if self.database_type == 'mysql':
+            return self.cfg.get('MYSQL', 'dump_url')
+        elif self.database_type == 'mongodb' or self.database_type == 'mongo':
+            return self.cfg.get('MONGODB', 'dump_url')
+        else:
+            raise Exception("Wrong database type!")
+
+    def get_showcase_url(self):
+        if self.database_type == 'mysql':
+            return self.cfg.get('MYSQL', 'showcase_url')
+        elif self.database_type == 'mongodb' or self.database_type == 'mongo':
+            return self.cfg.get('MONGODB', 'showcase_url')
+        else:
+            raise Exception("Wrong database type!")
+
 
 class Config:
 
diff --git a/cloudscale/deployment_scripts/frontend.py b/cloudscale/deployment_scripts/frontend.py
index 0a93b2d..c0da0a7 100644
--- a/cloudscale/deployment_scripts/frontend.py
+++ b/cloudscale/deployment_scripts/frontend.py
@@ -1,6 +1,6 @@
 import os
 import time
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts.infrastructure.aws import aws_create_keypair
 from cloudscale.deployment_scripts.scripts.infrastructure.aws import aws_create_instance
 from cloudscale.deployment_scripts.scripts.infrastructure.aws import aws_create_loadbalancer
@@ -12,10 +12,10 @@ from cloudscale.deployment_scripts.scripts.infrastructure.openstack import opens
 
 
 
-class Frontend(Setup):
+class Frontend(AWSConfig):
 
     def __init__(self, config, logger):
-        Setup.__init__(self, config, logger)
+        AWSConfig.__init__(self, config, logger)
         self.instance_ids = []
         self.ip_addresses = []
 
diff --git a/cloudscale/deployment_scripts/logger.py b/cloudscale/deployment_scripts/logger.py
index 020fbc7..a31453e 100644
--- a/cloudscale/deployment_scripts/logger.py
+++ b/cloudscale/deployment_scripts/logger.py
@@ -5,17 +5,5 @@ class Logger:
     def __init__(self):
         pass
 
-    def info(self, msg):
-        logging.info(msg)
-
     def log(self, msg, level=logging.INFO, append_to_last=False, fin=False):
         logging.log(level, msg)
-
-    def debug(self, msg):
-        logging.debug(msg)
-
-    def error(self, msg):
-        logging.error(msg)
-
-    def warning(self, msg):
-        logging.warning(msg)
\ No newline at end of file
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_ami.py b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_ami.py
index 3c7828d..f1e9da4 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_ami.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_ami.py
@@ -2,13 +2,13 @@
 import boto.ec2
 import time
 import sys
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
-class EC2CreateAMI(Setup):
+class EC2CreateAMI(AWSConfig):
 
     def __init__(self, config, logger):
-        Setup.__init__(self, config, logger)
+        AWSConfig.__init__(self, config, logger)
 
         self.conn = boto.ec2.connect_to_region(self.region,
                                                aws_access_key_id=self.access_key,
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_autoscalability.py b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_autoscalability.py
index 7cf91f3..c318332 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_autoscalability.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_autoscalability.py
@@ -7,14 +7,14 @@ import boto.ec2.cloudwatch
 from boto.ec2.cloudwatch import MetricAlarm
 import sys
 from boto.ec2.autoscale.tag import Tag
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class Autoscalability(Setup):
+class Autoscalability(AWSConfig):
 
     def __init__(self, config, logger):
-        Setup.__init__(self, config, logger)
+        AWSConfig.__init__(self, config, logger)
         self.as_ami_id = self.cfg.get('infrastructure', 'ami_id')
 
     def create(self):
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_instance.py b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_instance.py
index d69a5cc..10776f1 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_instance.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_instance.py
@@ -5,14 +5,14 @@ import time
 import paramiko
 
 import sys, os
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class CreateEC2Instance(Setup):
+class CreateEC2Instance(AWSConfig):
 
     def __init__(self, config, logger):
-        Setup.__init__(self, config, logger)
+        AWSConfig.__init__(self, config, logger)
 
         self.conn = boto.ec2.connect_to_region(
             self.region,
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_keypair.py b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_keypair.py
index a296b64..1fae129 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_keypair.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_keypair.py
@@ -2,14 +2,14 @@ from boto import ec2
 import os
 from boto.exception import EC2ResponseError
 import sys
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class CreateKeyPair(Setup):
+class CreateKeyPair(AWSConfig):
 
     def __init__(self, user_path, config, logger):
-        Setup.__init__(self, config, logger)
+        AWSConfig.__init__(self, config, logger)
         self.user_path = user_path
 
     def create(self):
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_loadbalancer.py b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_loadbalancer.py
index f144fc7..f2fe01b 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_loadbalancer.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_create_loadbalancer.py
@@ -2,14 +2,14 @@ from boto import ec2
 from boto.exception import BotoServerError
 import sys
 import time
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class CreateLoadbalancer(Setup):
+class CreateLoadbalancer(AWSConfig):
 
     def __init__(self, config, logger):
-        Setup.__init__(self, config, logger)
+        AWSConfig.__init__(self, config, logger)
 
     def create(self, instances):
         self.instances = instances
@@ -36,7 +36,6 @@ class CreateLoadbalancer(Setup):
                 lb = []
             i+=1
 
-        time.sleep(10)
         lb = conn.create_load_balancer(lb_name, zones, ports)
 
         self.attach_instances(lb)
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_remove_all.py b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_remove_all.py
index efc5d5c..ba03057 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_remove_all.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/aws/aws_remove_all.py
@@ -9,13 +9,13 @@ from boto.exception import BotoServerError
 from boto.ec2.cloudwatch import MetricAlarm
 import time
 import sys
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class RemoveAll(Setup):
+class RemoveAll(AWSConfig):
     def __init__(self, cfg, logger):
-        Setup.__init__(self, cfg, logger)
+        AWSConfig.__init__(self, cfg, logger)
 
         self.conn_ec2 = boto.ec2.connect_to_region(self.region,
                                                aws_access_key_id=self.access_key,
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_balancer_instance.py b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_balancer_instance.py
index c4fa133..ccc6791 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_balancer_instance.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_balancer_instance.py
@@ -3,30 +3,15 @@ import os
 from novaclient.v2 import client as novaclient
 import time
 import sys
+from cloudscale.deployment_scripts.config import OpenstackConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class CreateInstance:
+class CreateInstance(OpenstackConfig):
 
     def __init__(self, config, logger):
-        self.cfg = config.cfg
-        self.config = config
-        self.logger = logger
-
-        self.user = self.cfg.get('OPENSTACK', 'username')
-        self.pwd = self.cfg.get('OPENSTACK', 'password')
-        self.url = self.cfg.get('OPENSTACK', 'auth_url')
-        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
-
-        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
-
-        self.instance_type = self.cfg.get('OPENSTACK', 'instance_type')
+        OpenstackConfig.__init__(self, config, logger)
         self.instance_name = 'cloudscale-lb'
-        self.num_instances = self.config.fr.get('num_instances')
-        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
-        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
-
-        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
 
         self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
 
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mongodb_instances.py b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mongodb_instances.py
index 274b968..34c2916 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mongodb_instances.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mongodb_instances.py
@@ -2,46 +2,19 @@ import os
 from novaclient.v2 import client as novaclient
 import time
 import paramiko
+from cloudscale.deployment_scripts.config import OpenstackConfig
 
-class ConfigureMongodb:
 
-    def __init__(self, config, logger):
-        self.cfg = config.cfg
-        self.config = config
-        self.logger = logger
-
-        self.user = self.cfg.get('OPENSTACK', 'username')
-        self.pwd = self.cfg.get('OPENSTACK', 'password')
-        self.url = self.cfg.get('OPENSTACK', 'auth_url')
-        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
-
-        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
+class ConfigureMongodb(OpenstackConfig):
 
-        self.instance_type = self.cfg.get('MONGODB', 'instance_type')
+    def __init__(self, config, logger):
+        OpenstackConfig.__init__(self, config, logger)
         self.instance_name = 'cloudscale-db-mongo'
-        self.num_replicas = self.cfg.get('MONGODB', 'num_replicas')
-
-        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
-        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
-
-        self.mongodb_image_name = "cloudscale-db-mongo-image"
-
-        self.database_name = self.cfg.get('MONGODB', 'database_name')
-        self.database_user = self.cfg.get('MONGODB', 'database_user')
-        self.database_pass = self.cfg.get('MONGODB', 'database_pass')
-
-        self.generate_dump_path =  self.cfg.get('MONGODB', 'generate_dump_path')
-
-        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
-
-        self.remote_user = self.cfg.get('OPENSTACK', 'image_username')
-
-        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
 
         self.logger.log("Creating database instances:")
         images = self.nc.images.list()
         for image in images:
-            if image.name == self.mongodb_image_name:
+            if image.name == self.mongo_image_name:
                 self.logger.log('Image already exists.')
                 break
         else:
@@ -51,9 +24,9 @@ class ConfigureMongodb:
 USERNAME=%s
 """ % self.remote_user + open(self.file_path + '/install-mongodb.sh', 'r').read()
 
-            server_id = self.create_instance(userdata=userdata)
+            server_id = self.create_instance(image_name=self.mongo_image_name, userdata=userdata)
             self.wait_powered_off(server_id)
-            self.create_image(server_id, self.mongodb_image_name)
+            self.create_image(server_id, self.mongo_image_name)
             self.delete_instance(server_id)
 
             self.logger.log("Done creating database image")
@@ -69,16 +42,13 @@ USERNAME=%s
         server = self.nc.servers.get(server_id)
         server.delete()
 
-    def create_instance(self, image_name=None, userdata=None, wait_on_active_status=True):
-        if image_name is None:
-            image_name = self.image_name
-
+    def create_instance(self, image_name, userdata=None, wait_on_active_status=True):
         for f in self.nc.flavors.list():
-            if f.name == self.instance_type:
+            if f.name == self.database_instance_type:
                 flavor = f
                 break
         else:
-            self.logger.log("Instance flavor '%s' not found!" % self.instance_type)
+            self.logger.log("Instance flavor '%s' not found!" % self.database_instance_type)
             return False
 
         for img in self.nc.images.list():
@@ -89,7 +59,7 @@ USERNAME=%s
             self.logger.log("Image '%s' not found!" % image_name)
             return False
 
-        server_id = self.nc.servers.create(self.instance_name, image, flavor, key_name=self.key_name, userdata=userdata).id
+        server_id = self.nc.servers.create(self.database_instance_type, image, flavor, key_name=self.key_name, userdata=userdata).id
 
         if wait_on_active_status and not self.wait_active(server_id):
             return False
@@ -160,10 +130,10 @@ USERNAME=%s
     def create_database_instances(self):
         database_server_ids = []
 
-        for i in range(int(self.num_replicas)):
+        for i in range(int(self.database_num_replicas)):
             self.logger.log("Creating database instance %s ..." % (i + 1))
             database_server_ids.append(
-                self.create_instance(image_name=self.mongodb_image_name, wait_on_active_status=False)
+                self.create_instance(image_name=self.mongo_image_name, wait_on_active_status=False)
             )
 
         self.wait_all_instances_active(database_server_ids)
@@ -182,7 +152,8 @@ USERNAME=%s
 
         scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
         self.logger.log("Uploading mysql dump")
-        scp.put(self.generate_dump_path, 'dump.sql')
+        cmd = "wget -T90 -q %s -O dump.sql" % self.dump_url
+        ssh.exec_command(cmd)
 
         ssh.exec_command("sudo mv dump.sql /root/dump.sql")
 
@@ -264,7 +235,8 @@ sudo mongod --configsvr --dbpath /data/configdb --port 27019 --syslog --fork""")
 
         scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
         self.logger.log("Uploading mongo dump")
-        scp.put(self.generate_dump_path, 'dump.tar.gz')
+        cmd = "wget -T90 -q %s -O dump.tar.gz" % self.dump_url
+        self.ssh_execute_command(ssh, cmd)
 
         self.logger.log("Extracting mongo dump")
         self.ssh_execute_command(ssh, "mkdir dump; tar xf dump.tar.gz -C dump")
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mysql_instances.py b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mysql_instances.py
index 3232e67..5096781 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mysql_instances.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_mysql_instances.py
@@ -4,58 +4,27 @@ import time
 import paramiko
 import select
 import sys
+from cloudscale.deployment_scripts.config import OpenstackConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class ConfigureMySQL:
+class ConfigureMySQL(OpenstackConfig):
 
     def __init__(self, config, logger):
-        self.cfg = config.cfg
-        self.config = config
-        self.logger = logger
-
-        self.user = self.cfg.get('OPENSTACK', 'username')
-        self.pwd = self.cfg.get('OPENSTACK', 'password')
-        self.url = self.cfg.get('OPENSTACK', 'auth_url')
-        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
-
-
-
-        self.instance_type = self.cfg.get('MYSQL', 'instance_type')
-        self.instance_name = 'cloudscale-db'
+        OpenstackConfig.__init__(config, logger)
         self.master_instance_name = 'cloudscale-db-master'
-        self.num_replicas = self.cfg.get('MYSQL', 'num_replicas')
-
-        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
-        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
 
         self.galera_image_name = "cloudscale-db-image"
 
-        self.database_name = self.cfg.get('MYSQL', 'database_name')
-        self.database_user = self.cfg.get('MYSQL', 'database_user')
-        self.database_pass = self.cfg.get('MYSQL', 'database_pass')
-
-        self.generate_dump_path = self.cfg.get('MYSQL', 'generate_dump_path')
-
-        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
-
-
-
-        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
-
-
-
         self.logger.log("Creating database instances:")
         self.file_path = os.path.dirname(__file__) + "/../../software"
 
-        if self.config.db.get('setup_type') == 'master-slave':
-            self.image_name = self.cfg.get('MYSQL', 'image_name')
-            self.remote_user = self.cfg.get('MYSQL', 'image_username')
+        if self.mysql_setup_type == 'master-slave':
             self.create_master_slave()
-        elif self.config.db.get('setup_type') == 'master-master':
-            self.image_name = self.cfg.get('OPENSTACK', 'image_name')
-            self.remote_user = self.cfg.get('OPENSTACK', 'image_username')
+        elif self.mysql_setup_type == 'master-master':
             self.create_master_master()
+        else:
+            raise Exception("Wrong MYSQL setup type!")
 
 
     def create_master_master(self):
@@ -95,7 +64,7 @@ echo '
 
     def create_master_slave(self):
         master_ip, master_private_ip = self.create_master()
-        slaves = self.create_slave(master_private_ip, int(self.num_replicas)-1)
+        slaves = self.create_slave(master_private_ip, int(self.database_num_replicas)-1)
         self.upload_mysql_dump(master_ip)
         ssh = self.ssh_to_instance(master_ip)
         _ ,stdout, _ = ssh.exec_command("mysql -u root -ppassword -D tpcw < ~/dump.sql")
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_showcase_instances.py b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_showcase_instances.py
index 8c8c4e9..f7773e9 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_showcase_instances.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_create_showcase_instances.py
@@ -4,63 +4,30 @@ from novaclient.v2 import client as novaclient
 import time
 import paramiko
 import select
+from cloudscale.deployment_scripts.config import OpenstackConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 from cloudscale.deployment_scripts.scripts.software import deploy_showcase
 
 
-class CreateInstance:
+class CreateInstance(OpenstackConfig):
 
     def __init__(self, config, logger):
+        OpenstackConfig.__init__(self, config, logger)
         self.mvn_path = '/usr/bin/mvn'
-        self.cfg = config.cfg
-        self.config = config
-        self.logger = logger
-
         self.file_path = "/".join(os.path.abspath(__file__).split('/')[:-1])
-        self.remote_user = self.cfg.get('OPENSTACK', 'remote_user')
-        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
-        self.remote_deploy_path = self.cfg.get('software', 'remote_deploy_path')
-
-        self.user = self.cfg.get('OPENSTACK', 'username')
-        self.pwd = self.cfg.get('OPENSTACK', 'password')
-        self.url = self.cfg.get('OPENSTACK', 'auth_url')
-        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
-        self.db_num_instances = self.cfg.get('MYSQL', 'num_replicas')
 
-        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
+        self.remote_deploy_path = self.cfg.get('software', 'remote_deploy_path')
 
-        self.instance_type = self.cfg.get('OPENSTACK', 'instance_type')
         self.instance_name = 'cloudscale-sc'
 
-        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
-        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
-
         self.showcase_image_name = "cloudscale-sc-image"
 
-        self.database_name = self.cfg.get('MYSQL', 'database_name')
-        self.database_user = self.cfg.get('MYSQL', 'database_user')
-        self.database_pass = self.cfg.get('MYSQL', 'database_pass')
-
-        self.connection_pool_size = self.cfg.get('MYSQL', 'connection_pool_size')
-
-        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
-        self.showcase_location = self.cfg.get('MYSQL', 'showcase_war_url')
+        self.showcase_location = self.showcase_url
         self.deploy_name = "showcase-1-a"
         if self.database_type != 'mysql':
             self.deploy_name="showcase-1-b"
-            self.showcase_location = self.cfg.get('MONGODB', 'showcase_war_url')
             self.showcase_image_name = "cloudscale-sc-mongo-image"
 
-            self.database_name = self.cfg.get('MONGODB', 'database_name')
-            self.database_user = self.cfg.get('MONGODB', 'database_user')
-            self.database_pass = self.cfg.get('MONGODB', 'database_pass')
-
-
-        self.remote_user = self.cfg.get('OPENSTACK', 'image_username')
-
-        self.num_instances = self.config.fr.get('num_instances')
-
-        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
         self.delete_image(self.showcase_image_name)
         self.logger.log("Creating showcase instance image:")
         images = self.nc.images.list()
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_remove_all.py b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_remove_all.py
index ed91150..4edecb0 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_remove_all.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack_remove_all.py
@@ -4,28 +4,13 @@ import time
 
 from novaclient.v2 import client as novaclient
 import sys
+from cloudscale.deployment_scripts.config import OpenstackConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class RemoveAll:
+class RemoveAll(OpenstackConfig):
     def __init__(self, config, logger):
-        self.cfg = config.cfg
-        self.config = config
-        self.logger = logger
-
-        self.user = self.cfg.get('OPENSTACK', 'username')
-        self.pwd = self.cfg.get('OPENSTACK', 'password')
-        self.url = self.cfg.get('OPENSTACK', 'auth_url')
-        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
-
-        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
-        self.instance_type = self.cfg.get('OPENSTACK', 'instance_type')
-        self.instance_name = 'cloudscale'
-        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
-        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
-
-        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
-
+        OpenstackConfig.__init__(self, config, logger)
         self.logger.log("Cleaning:")
         self.remove_openstack_instances()
         # TODO: remove images
diff --git a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack-create-instance.py b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack-create-instance.py
index 8260b90..8b53320 100644
--- a/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack-create-instance.py
+++ b/cloudscale/deployment_scripts/scripts/infrastructure/openstack/openstack-create-instance.py
@@ -1,17 +1,14 @@
 from novaclient.v2 import client as novaclient
 import sys
+from cloudscale.deployment_scripts.config import OpenstackConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class CreateInstance:
+class CreateInstance(OpenstackConfig):
+
+    def __init__(self, config, logger):
+        OpenstackConfig.__init__(self, config, logger)
 
-    def __init__(self, cfg):
-        self.cfg = cfg
-        self.user = cfg.get('OPENSTACK', 'username')
-        self.pwd = cfg.get('OPENSTACK', 'password')
-        self.url = cfg.get('OPENSTACK', 'auth_url')
-        self.tenant = cfg.get('OPENSTACK', 'tenant_name')
-        self.image_name = cfg.get('OPENSTACK', 'image_name')
         server = self.create_instance()
         print [s['addr'] for s in server.addresses[self.tenant] if s['OS-EXT-IPS:type'] == 'floating'][0]
 
@@ -27,4 +24,4 @@ class CreateInstance:
 if __name__ == '__main__':
     check_args(2, "<output_dir> <config_path>")
     path, cfg, logger = get_cfg_logger(sys.argv[1], sys.argv[2])
-    CreateInstance(cfg)
\ No newline at end of file
+    CreateInstance(cfg, logger)
\ No newline at end of file
diff --git a/cloudscale/deployment_scripts/scripts/platform/aws/configure_rds.py b/cloudscale/deployment_scripts/scripts/platform/aws/configure_rds.py
index 2354323..a01e546 100644
--- a/cloudscale/deployment_scripts/scripts/platform/aws/configure_rds.py
+++ b/cloudscale/deployment_scripts/scripts/platform/aws/configure_rds.py
@@ -6,14 +6,14 @@ import time
 import subprocess
 import os
 import sys
-from cloudscale.deployment_scripts.config import Setup
+from cloudscale.deployment_scripts.config import AWSConfig
 from cloudscale.deployment_scripts.scripts import check_args, get_cfg_logger
 
 
-class ConfigureRDS(Setup):
+class ConfigureRDS(AWSConfig):
 
     def __init__(self, config, logger):
-        Setup.__init__(self, config, logger)
+        AWSConfig.__init__(self, config, logger)
 
         self.conn = boto.rds.connect_to_region(self.region,
                                                aws_access_key_id=self.access_key,