Changeset 7521 for cows_wps


Ignore:
Timestamp:
24/09/10 22:16:15 (9 years ago)
Author:
astephen
Message:

Authorised role handling stuff.

Location:
cows_wps/trunk/cows_wps/utils
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cows_wps/trunk/cows_wps/utils/parse_roles_config.py

    r7520 r7521  
    99# Standard library imports 
    1010import os 
    11 import ConfigParser 
     11import logging 
    1212 
    13 from cows_wps.utils.parse_wps_config import wps_config_dict 
     13# local imports 
     14from cows_wps.utils.case_sensitive_ordered_config_parser import CaseSensitiveConfigParser 
     15#from cows_wps.utils.parse_wps_config import wps_config_dict 
     16wps_config_dict={} 
    1417 
    15 import logging 
    1618log = logging.getLogger(__name__) 
    1719 
     
    2123    Returns a dictionary from a simple config file. 
    2224    """ 
    23     print config_file 
    24     c = ConfigParser.ConfigParser() 
     25    c = CaseSensitiveConfigParser() 
    2526    c.read(config_file) 
    2627 
  • cows_wps/trunk/cows_wps/utils/role_handler.py

    r6869 r7521  
    55Holds RoleHandler class for handling user roles as provided in: 
    66 
    7  user_roles.ini 
     7 roles_info.ini 
    88 
    99configuration file. 
     
    1111""" 
    1212 
    13 import os 
     13# Standard library imports 
    1414import re 
    15 import ConfigParser 
     15 
     16# Local imports 
     17from cows_wps.utils.parse_roles_config import roles_info 
     18 
    1619 
    1720 
    1821class RoleHandler(object): 
     22    """ 
     23    Uses the roles_info dictionary to provide a set of useful methods that allow: 
     24     * mapping of role strings to numeric codes used in download URLs 
     25     * mapping of process IDs to roles 
     26     * mapping of role strings to role patterns used in request arguments 
     27    """ 
     28 
     29    def __init__(self): 
     30        self.roles = roles_info["roles"] 
     31        self.proc_role_map = roles_info["proc_role_map"] 
     32        self.pattern_role_map = roles_info["pattern_role_map"] 
     33 
     34    def getRoleNumber(self, role): 
     35        "Maps a role string to a role number." 
     36        if role not in self.roles.keys(): 
     37            raise KeyError("Role '%s' not known." % role) 
     38 
     39        return self.roles[role] 
     40 
     41    def getRoleFromProcessIDAndArgs(self, proc_id, arg_dict): 
     42        "Maps a process ID and request arguments dict to a role string." 
     43        if proc_id not in self.proc_role_map.keys(): 
     44            raise KeyError("Process '%s' not known in proc_role_map configuration (see: roles_info.ini file)." % proc_id) 
     45 
     46        role_map = self.proc_role_map[proc_id] 
     47 
     48        # Need to analyse the role_map to see if it requires special attention 
     49        if role_map.find("use:") == 0:  
     50            role = self._mapRequestArgsToRole(role_map, arg_dict) 
     51        else: 
     52            role = role_map 
     53 
     54        return role 
     55 
     56    def getRoleNumberFromProcessIDAndArgs(self, proc_id, arg_dict): 
     57        "Maps a process ID and request arguments dict to a role number." 
     58        role = self.getRoleFromProcessIDAndArgs(proc_id, arg_dict) 
     59 
     60        return self.getRoleNumber(role) 
     61 
     62 
     63    def _mapRequestArgsToRole(self, role_map, arg_dict): 
     64        "Maps arg values to a role string." 
     65        arg_required, pattern = role_map.split(":")[-1].split("=") 
     66 
     67        if arg_required not in arg_dict.keys(): 
     68            raise ItemError("Request arguments does not contain the required parameter '%s' to map authorised roles." % arg_required) 
     69 
     70        # Now use the pattern to match to the argument  
     71        match = re.match(pattern, arg_dict[arg_required]) 
     72 
     73        if not match: 
     74            raise Exception("No match for value of argument '%s' to role pattern." % arg_required) 
     75 
     76        role_code = match.groups()[0] 
     77        role = self.getRoleFromRoleCode(role_code) 
     78        return role 
     79         
     80        
     81    def getRoleFromRoleCode(self, role_code): 
     82        """ 
     83        Maps a role code to a role string.   
     84        E.g. maps "ecmwf-e40" to "era". 
     85        """ 
     86        if role_code not in self.pattern_role_map.keys(): 
     87            raise KeyError("Role code '%s' not found in pattern role maps to authorised roles." % role_code) 
     88 
     89        return self.pattern_role_map[role_code] 
     90 
     91 
     92if __name__ == "__main__": 
     93 
     94    rh = RoleHandler() 
     95 
     96    print "Role --> role number..." 
     97    for role in ("surface", "ecmwfop"): 
     98        rn = rh.getRoleNumber(role) 
     99        print "\t%s --> %s" % (role, rn) 
     100 
     101    try: 
     102        rh.getRoleNumber("bizarre") 
     103    except KeyError: 
     104        print "Test 1 fail worked OK" 
     105 
     106    print "Proc Id & Args --> role (and role number)..." 
     107    inputs = [("GetUKWeatherStations", {}),  
     108              ("DoubleIt", {}), 
     109              ("NCDumpIt", {"FilePath": "/badc/ecmwf-op/data/gg/ap/myfile.nc"}), 
     110              ("NCDumpIt", {"FilePath": "/badc/ukmo-um/data/foo/baa"})] 
     111 
     112    for (proc_id, arg_dict) in inputs: 
     113        role = rh.getRoleFromProcessIDAndArgs(proc_id, arg_dict) 
     114        rn = rh.getRoleNumberFromProcessIDAndArgs(proc_id, arg_dict) 
     115        print "\t%s & %s --> %s (%s)" % (proc_id, str(arg_dict), role, rn) 
     116 
     117    try: 
     118        rh.getRoleFromProcessIDAndArgs("UnknownProc", {}) 
     119    except KeyError: 
     120        print "Test 2 fail worked OK" 
     121 
     122    print "Role code --> role..." 
     123    for rc in ("ecmwf-e40", "ecmwf-op", "ukmo-um"): 
     124        r = rh.getRoleFromRoleCode(rc) 
     125        print "\t%s --> %s" % (rc, r) 
     126 
     127    try: 
     128        rh.getRoleFromRoleCode("Scooby") 
     129    except: 
     130        print "Test 3 fail worked OK" 
     131 
     132 
     133""" 
     134class RoleMapper(object): 
     135    " To handle multiple roles.  NOT IMPLEMENTED YET." 
    19136 
    20137    def __init__(self, config = None): 
     
    22139            self._parseConfig() 
    23140 
    24     def _parseConfig(self, conf_file = "../../user_roles.ini"): 
     141    def _parseConfig(self, conf_file = "../../roles.ini"): 
    25142        if not os.path.isfile(conf_file): 
    26143            raise Exception("No such file: %s" % conf_file) 
     
    90207    except: 
    91208        print "Failed to map excess roles which is good!" 
     209""" 
Note: See TracChangeset for help on using the changeset viewer.