Changeset 194 for cleverbox/trunk

Show
Ignore:
Timestamp:
08/16/07 19:06:43 (5 years ago)
Author:
trivoallan
Message:
  • Fixed missing directory when creating environment
  • Refactored unit tests
Location:
cleverbox/trunk
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • cleverbox/trunk/cleverbox/client.py

    r193 r194  
    66from cleverbox.utils import filesystem, styles 
    77 
    8 client_dir_layout = ('htdocs', 'logs', 'tmp', 'uploads', 'var/svn', 'var/trac') 
     8client_dir_layout = ('htdocs', 'logs', 'tmp', 'var/svn', 'var/trac') 
    99 
    1010def exists(environment, client_name): 
     
    7373    # -- homedir 
    7474    parent_dir = os.path.normpath(os.path.join(collected_infos['home_dir'], os.pardir)) 
    75     dir_is_ok = os.access(parent_dir, os.W_OK) and not os.access(collected_infos['home_dir'], os.R_OK) 
     75    dir_is_ok = os.access(parent_dir, os.W_OK) and os.access(collected_infos['home_dir'], os.R_OK) 
     76    print parent_dir 
    7677    if not dir_is_ok: 
    7778        raise os.error, "Directory %s is not writable or already exists, aborting." % collected_infos['home_dir'] 
  • cleverbox/trunk/cleverbox/environment.py

    r193 r194  
    2828           parameters['general']['assets_dir'] 
    2929           parameters['general']['apache_group'] 
     30           parameters['general']['clients_root'] 
    3031        except KeyError, e: 
    3132           raise Exception, "Supplied parameters are not complete." 
     
    4748            logging.info("  Creating directory layout") 
    4849            print 
     50 
    4951            env_dirs = [] 
    5052            for dirname in layout: 
    5153                env_dirs.append(self.get_path(dirname)) 
    5254            map(os.makedirs, env_dirs) 
     55             
     56            # Create VERSION file 
     57            try: 
     58                print 
     59                logging.info("  Creating VERSION file") 
     60                print 
    5361 
    54             # Create VERSION file 
    55             try: 
    56                 #print "\n\tCreating VERSION file\n" 
    5762                fd = open(self.get_path('VERSION'), 'w') 
    5863                fd.write(version) 
    5964            finally: 
    6065                fd.close() 
     66 
     67            # Create data directory 
     68            os.makedirs(self.config.get('general', 'clients_root')) 
     69            os.chmod(self.config.get('general', 'clients_root'), 0750) 
     70            os.chown(self.config.get('general', 'clients_root'),  
     71                     filesystem.get_gid_from_name('root'), 
     72                     filesystem.get_gid_from_name(parameters['general']['apache_group'])) 
     73 
     74            print 
     75            logging.info('  Created data directory in "%s"' % self.config.get('general', 'clients_root')) 
     76            print 
    6177 
    6278            # Create default configuration profile 
     
    92108            logging.error(exception) 
    93109            logging.error("  Environment couldn't be initialized in %(env_dir)s" % {'env_dir' : self.path}) 
    94             logging.info("Rolling back changes") 
     110            logging.info("   Rolling back changes") 
    95111             
    96112            for entry in os.listdir(self.path): 
  • cleverbox/trunk/cleverbox/project.py

    r193 r194  
    33""" 
    44 
    5 import os, re, ConfigParser, traceback 
     5import logging, os, re, ConfigParser, traceback 
    66from cleverbox.utils import filesystem, styles 
    77 
     
    5151    Disables project in environment. 
    5252    """ 
    53      
     53 
    5454    if not exists(environment, client_name, project_name): 
    5555        raise Exception, 'Client "%s" has no project "%s".' % (client_name, project_name) 
     
    5757    try: 
    5858        os.unlink(os.path.join(environment.get_path('projects-enabled'), '%s-%s' % (client_name, project_name))) 
    59         print styles.style.SUCCESS("  Project '%s' has been disabled. Apache needs to be reloaded." % project_name) 
     59        print styles.style.SUCCESSNORESET('') 
     60        logging.info("  Project '%s' has been disabled. Apache needs to be reloaded." % project_name) 
     61        print styles.style.RESET('') 
    6062    except (IOError, os.error), exception: 
    6163            raise Exception, 'Project "%s" is already disabled' % project_name 
     
    7577                            '%s-%s' % (client_name, project_name)) 
    7678    os.symlink(target, linkname) 
    77     print "Project '%s' has been enabled. Apache needs to be reloaded." % project_name 
     79     
     80    print styles.style.SUCCESSNORESET('') 
     81    logging.info("  Project '%s' has been enabled. Apache needs to be reloaded." % project_name) 
     82    print styles.style.RESET('') 
    7883 
    7984def add(environment, client_name, project_name): 
  • cleverbox/trunk/cleverbox/scripts/admin.py

    r193 r194  
    11# -*- coding: utf-8 -*- 
    22 
    3 import cmd, logging, os, shlex, sys 
     3import cmd, logging, os, shlex, sys, traceback 
    44from trac import util 
    55from trac.scripts.admin import TracAdmin 
     
    7575            print 
    7676            logging.error('  Command failed: %s' % e) 
     77            logging.debug(traceback.print_exc()) 
    7778            print 
    7879            rv = 2 
     
    303304        # Disable project 
    304305        (client_name, project_name) = args 
    305         project.disable(environment, client_name, project_name) 
     306        project.disable(self.env, client_name, project_name) 
    306307 
    307308 
  • cleverbox/trunk/cleverbox/tests/__init__.py

    r177 r194  
    11import unittest 
    22from cleverbox.tests import client, project, environment, upgrade 
     3 
     4def validate_layout(layout): 
     5 
     6    import grp, os, pwd, stat 
     7 
     8    for (entry, spec) in layout.items(): 
     9        st = os.stat(entry) 
     10        mode = st[stat.ST_MODE] 
     11 
     12        # Validate file type 
     13        func = getattr(stat, spec[0]) 
     14        assert func.__call__(mode), '"%s" type is correct (%s)' % (entry, spec[0]) 
     15 
     16        # Validate file mode 
     17        assert oct(stat.S_IMODE(mode)) == spec[1], '"%s" mode is correct (expected %s, got %s)' % (entry, spec[1], oct(stat.S_IMODE(mode))) 
     18 
     19        # Validate ownership 
     20        uid = st[stat.ST_UID] 
     21        gid = st[stat.ST_GID] 
     22        expected_uid = pwd.getpwnam(spec[2])[2] 
     23        expected_gid = grp.getgrnam(spec[3])[2] 
     24        assert uid == expected_uid, '"%s" owner is correct (expected %s, got %s)' % (entry, spec[2], pwd.getpwuid(uid)[0]) 
     25        assert gid == expected_gid, '"%s" group is correct (expected %s, got %s)' % (entry, spec[3], grp.getgrgid(uid)[0]) 
     26 
     27def create_environment(version): 
     28 
     29    import os, tempfile 
     30    from cleverbox.environment import Environment 
     31 
     32    test_root = os.path.join(tempfile.gettempdir(), 'cleverbox-tempenv') 
     33    env_path = os.path.join(test_root, 'etc', 'cleverbox') 
     34    os.makedirs(env_path) 
     35    env = Environment(env_path) 
     36    parameters = {'general' : 
     37                     {'clients_root' : os.path.join(test_root, 'var', 'cleverbox'), 
     38                      'assets_dir'   : os.path.join('/root/tmp/cleverbox-trunk/assets'), 
     39                      'apache_group' : 'www-data'}} 
     40    env.create(version, parameters) 
     41 
     42    return env 
     43 
    344 
    445def suite(): 
  • cleverbox/trunk/cleverbox/tests/client.py

    r193 r194  
    44from cleverbox.environment import Environment 
    55from cleverbox.scripts.admin import CleverboxAdmin 
     6from cleverbox import client 
     7import cleverbox.tests 
    68 
    79logging.basicConfig(stream=open('/dev/null', 'w+')) 
     
    1416    # Fixtures 
    1517    def setUp(self): 
    16         env_path = os.path.join(tempfile.gettempdir(), 'cleverbox-tempenv') 
    17         os.mkdir(env_path) 
    18         self.env = Environment(env_path) 
    19         parameters = {'general' :  
    20                          {'clients_root' : os.path.join(env_path, 'var', 'cleverbox'),  
    21                           'assets_dir'   : os.path.join('/home/trivoallan/workspace/cleverbox-trunk/assets'),  
    22                           'apache_group' : 'www-data'}} 
    23         self.env.create('0.5test', parameters) 
    24      
     18        self.env = cleverbox.tests.create_environment('0.5test') 
     19 
    2520    def tearDown(self): 
    2621        shutil.rmtree(self.env.path) 
    2722 
    2823    # client add 
     24    def test_client_add_generate_expected_layout(self): 
     25        client_name = 'testclient' 
     26        client.add(self.env, client_name)  
     27        client_root = self.env.config.get('general', 'clients_root') 
     28        expected = {os.path.join(self.env.path, 'clients-available')          : ('S_ISREG', '0640', 'root', 'www-data'), 
     29                    os.path.join(clients_root, client_name)                   : ('S_ISDIR', '0750', 'root', 'www-data'), 
     30                    os.path.join(clients_root, client_name, 'htdocs')         : ('S_ISDIR', '0770', 'root', 'www-data'), 
     31                    os.path.join(clients_root, client_name, 'logs')           : ('S_ISDIR', '0770', 'root', 'www-data'), 
     32                    os.path.join(clients_root, client_name, 'tmp')            : ('S_ISDIR', '0770', 'root', 'www-data'), 
     33                    os.path.join(clients_root, client_name, 'var')            : ('S_ISDIR', '0750', 'root', 'www-data'), 
     34                    os.path.join(clients_root, client_name, 'var', 'svn')     : ('S_ISDIR', '0750', 'root', 'www-data'), 
     35                    os.path.join(clients_root, client_name, 'var', 'trac')    : ('S_ISDIR', '0750', 'root', 'www-data')} 
     36 
     37        cleverbox.tests.validate_layout(expected) 
     38 
    2939    def test_client_add_generates_expected_apache_configuration(self): 
    3040        pass 
  • cleverbox/trunk/cleverbox/tests/environment.py

    r193 r194  
    11import grp, logging, os, pwd, shutil, stat, tempfile, unittest 
    22from cleverbox.environment import Environment 
     3import cleverbox.tests 
    34 
    45# Don't bother with output from scripts 
     
    910    # Fixtures 
    1011    def setUp(self): 
    11         env_path = os.path.join(tempfile.gettempdir(), 'cleverbox-tempenv') 
    12         os.mkdir(env_path) 
    13         self.env = Environment(env_path) 
    14         parameters = {'general' :  
    15                          {'clients_root' : os.path.join(env_path, 'var', 'cleverbox'),  
    16                           'assets_dir'   : os.path.join('/home/trivoallan/workspace/cleverbox-trunk/assets'),  
    17                           'apache_group' : 'www-data'}} 
    18         self.env.create('0.5test', parameters) 
    19   
     12        self.env = cleverbox.tests.create_environment('0.5test') 
     13 
    2014    def tearDown(self): 
    2115        shutil.rmtree(self.env.path) 
     16        shutil.rmtree(self.env.config.get('general', 'clients_root')) 
    2217     
    2318    def test_create(self): 
    2419        """Environment.create() generates a correct directory layout.""" 
    2520 
    26         expected = {'VERSION'                               : ('S_ISREG', '0640', 'root', 'www-data'),  
    27                     'cleverbox.ini'                         : ('S_ISREG', '0640', 'root', 'www-data'),  
    28                     'clients-available'                     : ('S_ISDIR', '0750', 'root', 'www-data'),  
    29                     'clients-enabled'                       : ('S_ISDIR', '0750', 'root', 'www-data'),  
    30                     'projects-available'                    : ('S_ISDIR', '0750', 'root', 'www-data'),  
    31                     'projects-enabled'                      : ('S_ISDIR', '0750', 'root', 'www-data'),  
    32                     'profiles'                              : ('S_ISDIR', '0750', 'root', 'www-data'),  
    33                     'profiles/default'                      : ('S_ISDIR', '0750', 'root', 'www-data'),  
    34                     'profiles/default/trac-defaults.ini'    : ('S_ISREG', '0640', 'root', 'www-data'),  
    35                     'profiles/default/project.apache.conf'  : ('S_ISREG', '0640', 'root', 'www-data'),  
    36                     'profiles/default/permissions.ini'      : ('S_ISREG', '0640', 'root', 'www-data')} 
     21        expected = {self.env.get_path('VERSION')                               : ('S_ISREG', '0640', 'root', 'www-data'),  
     22                    self.env.get_path('cleverbox.ini')                         : ('S_ISREG', '0640', 'root', 'www-data'),  
     23                    self.env.get_path('clients-available')                     : ('S_ISDIR', '0750', 'root', 'www-data'),  
     24                    self.env.get_path('clients-enabled')                       : ('S_ISDIR', '0750', 'root', 'www-data'),  
     25                    self.env.get_path('projects-available')                    : ('S_ISDIR', '0750', 'root', 'www-data'),  
     26                    self.env.get_path('projects-enabled')                      : ('S_ISDIR', '0750', 'root', 'www-data'),  
     27                    self.env.get_path('profiles')                              : ('S_ISDIR', '0750', 'root', 'www-data'),  
     28                    self.env.get_path('profiles/default')                      : ('S_ISDIR', '0750', 'root', 'www-data'),  
     29                    self.env.get_path('profiles/default/trac-defaults.ini')    : ('S_ISREG', '0640', 'root', 'www-data'),  
     30                    self.env.get_path('profiles/default/project.apache.conf')  : ('S_ISREG', '0640', 'root', 'www-data'),  
     31                    self.env.get_path('profiles/default/permissions.ini')      : ('S_ISREG', '0640', 'root', 'www-data'), 
     32                    self.env.config.get('general', 'clients_root')             : ('S_ISDIR', '0750', 'root', 'www-data')} 
    3733 
    38         for (entry, spec) in expected.items(): 
    39             st = os.stat(self.env.get_path(entry)) 
    40             mode = st[stat.ST_MODE] 
    41  
    42             # Validate file type 
    43             func = getattr(stat, spec[0]) 
    44             assert func.__call__(mode), '"%s" type is correct (%s)' % (entry, spec[0]) 
    45  
    46             # Validate file mode 
    47             assert oct(stat.S_IMODE(mode)) == spec[1], '"%s" mode is correct (expected %s, got %s)' % (entry, spec[1], oct(stat.S_IMODE(mode))) 
    48  
    49             # Validate ownership 
    50             uid = st[stat.ST_UID] 
    51             gid = st[stat.ST_GID] 
    52             expected_uid = pwd.getpwnam(spec[2])[2] 
    53             expected_gid = grp.getgrnam(spec[3])[2] 
    54             assert uid == expected_uid, '"%s" owner is correct (expected %s, got %s)' % (entry, spec[2], pwd.getpwuid(uid)[0]) 
    55             assert gid == expected_gid, '"%s" group is correct (expected %s, got %s)' % (entry, spec[3], grp.getgrgid(uid)[0]) 
    56              
     34        cleverbox.tests.validate_layout(expected)             
    5735 
    5836    def test_create_creates_enough_elements(self): 
  • cleverbox/trunk/docs/TODO

    r193 r194  
    1313Misc : 
    1414 * apachectl integration (for configtest + reload) 
     15 * _version should go in cleverbox/__init__.py 
     16 * by default, files should be owned bu current user, not root