Changeset 34bc05c


Ignore:
Timestamp:
Nov 24, 2008 11:11:52 AM (15 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-1.30, version-2.00, version-3.01, version-3.02
Children:
d90f0fa
Parents:
bf0a80e
Message:

Add map database and clean up access reading method

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/fedd_experiment_control.py

    rbf0a80e r34bc05c  
    181181        self.exp_stem = "fed-stem"
    182182        self.log = logging.getLogger("fedd.experiment_control")
     183        set_log_level(config, "experiment_control", self.log)
    183184        self.muxmax = 2
    184185        self.nthreads = 2
     
    190191        self.ssh_keygen = "/usr/bin/ssh-keygen"
    191192        self.ssh_identity_file = None
     193
    192194
    193195        self.debug = config.getboolean("experiment_control", "create_debug")
     
    208210        self.tclsh = "/usr/local/bin/otclsh"
    209211        self.tcl_splitter = "/usr/testbed/lib/ns2ir/parse.tcl"
    210         self.tbmap = {
    211                 'deter':'https://users.isi.deterlab.net:23235',
    212                 'emulab':'https://users.isi.deterlab.net:23236',
    213                 'ucb':'https://users.isi.deterlab.net:23237',
    214                 }
     212        mapdb_file = config.get("experiment_control", "mapdb")
    215213        self.trace_file = sys.stderr
    216214
     
    229227        self.def_gwtype = "pc";
    230228
     229        if auth:
     230            self.auth = auth
     231        else:
     232            self.log.error(\
     233                    "[access]: No authorizer initialized, creating local one.")
     234            auth = authorizer()
     235
    231236
    232237        if self.ssh_pubkey_file:
     
    246251                    "No SSH public key file?")
    247252
    248         set_log_level(config, "experiment_control", self.log)
    249 
    250         if auth:
    251             self.auth = auth
     253
     254        if mapdb_file:
     255            self.read_mapdb(mapdb_file)
     256            print self.tbmap
    252257        else:
    253             self.log.error(\
    254                     "[access]: No authorizer initialized, creating local one.")
    255             auth = authorizer()
     258            self.log.warn("[experiment_control] No testbed map, using defaults")
     259            self.tbmap = {
     260                    'deter':'https://users.isi.deterlab.net:23235',
     261                    'emulab':'https://users.isi.deterlab.net:23236',
     262                    'ucb':'https://users.isi.deterlab.net:23237',
     263                    }
    256264
    257265        if accessdb_file:
    258             try:
    259                 self.accessdb = self.read_accessdb(accessdb_file)
    260             except IOError:
    261                 raise service_error(service_error.internal,
    262                         "Error opening %s as experiment control accessdb" % \
    263                                 accessdb_file)
    264             for fid in self.accessdb.keys():
    265                 self.auth.set_attribute(fid, 'create')
     266                self.read_accessdb(accessdb_file)
    266267        else:
    267268            raise service_error(service_error.internal,
     
    391392
    392393    def read_accessdb(self, accessdb_file):
    393         access = {}
     394        """
     395        Read the mapping from fedids that can create experiments to their name
     396        in the 3-level access namespace.  All will be asserted from this
     397        testbed and can include the local username and porject that will be
     398        asserted on their behalf by this fedd.  Each fedid is also added to the
     399        authorization system with the "create" attribute.
     400        """
     401        self.accessdb = {}
     402        # These are the regexps for parsing the db
    394403        name_expr = "[" + string.ascii_letters + string.digits + "\.\-]+"
    395404        project_line = re.compile("^\s*fedid:([" + string.hexdigits + "]+)"+ \
     
    399408        lineno = 0
    400409
    401         f = open(accessdb_file, "r")
    402         for line in f:
    403             lineno += 1
    404             line.strip()
    405             if len(line) == 0 or line.startswith('#'):
    406                 continue
    407             m = project_line.match(line)
    408             if m:
    409                 fid = fedid(hexstr=m.group(1))
    410                 project, user = m.group(2,3)
    411                 if not access.has_key(fid):
    412                     access[fid] = []
    413                 access[fid].append((project, user))
    414                 continue
    415 
    416             m = user_line.match(line)
    417             if m:
    418                 fid = fedid(hexstr=m.group(1))
    419                 project = None
    420                 user = m.group(2)
    421                 if not access.has_key(fid):
    422                     access[fid] = []
    423                 access[fid].append((project, user))
    424                 continue
     410        # Parse the mappings and store in self.authdb, a dict of
     411        # fedid -> (proj, user)
     412        try:
     413            f = open(accessdb_file, "r")
     414            for line in f:
     415                lineno += 1
     416                line = line.strip()
     417                if len(line) == 0 or line.startswith('#'):
     418                    continue
     419                m = project_line.match(line)
     420                if m:
     421                    fid = fedid(hexstr=m.group(1))
     422                    project, user = m.group(2,3)
     423                    if not self.accessdb.has_key(fid):
     424                        self.accessdb[fid] = []
     425                    self.accessdb[fid].append((project, user))
     426                    continue
     427
     428                m = user_line.match(line)
     429                if m:
     430                    fid = fedid(hexstr=m.group(1))
     431                    project = None
     432                    user = m.group(2)
     433                    if not self.accessdb.has_key(fid):
     434                        self.accessdb[fid] = []
     435                    self.accessdb[fid].append((project, user))
     436                    continue
     437                self.log.warn("[experiment_control] Error parsing access " +\
     438                        "db %s at line %d" %  (accessdb_file, lineno))
     439        except IOError:
    425440            raise service_error(service_error.internal,
    426                     "Error parsing access db %s at line %d" % \
    427                         (accessdb_file, lineno))
     441                    "Error opening/reading %s as experiment " +\
     442                            "control accessdb" %  accessdb_file)
    428443        f.close()
    429         return access
    430 
     444
     445        # Initialize the authorization attributes
     446        for fid in self.accessdb.keys():
     447            self.auth.set_attribute(fid, 'create')
     448
     449    def read_mapdb(self, file):
     450        """
     451        Read a simple colon separated list of mappings for the
     452        label-to-testbed-URL mappings.  Clears or creates self.tbmap.
     453        """
     454
     455        self.tbmap = { }
     456        lineno =0
     457        try:
     458            f = open(file, "r")
     459            for line in f:
     460                lineno += 1
     461                line = line.strip()
     462                if line.startswith('#') or len(line) == 0:
     463                    continue
     464                try:
     465                    label, url = line.split(':', 1)
     466                    self.tbmap[label] = url
     467                except ValueError, e:
     468                    self.log.warn("[read_mapdb] Ignored bad line (%d) in " +\
     469                            "map db: %s %s" % (lineno, line, e))
     470        except IOError, e:
     471            self.log.warning("[read_mapdb]: No saved map database: Can't " +\
     472                    "open %s: %s" % (file, e))
     473        f.close()
    431474
    432475    def scp_file(self, file, user, host, dest=""):
Note: See TracChangeset for help on using the changeset viewer.