Changeset f3898f7


Ignore:
Timestamp:
Oct 5, 2011 5:11:01 PM (13 years ago)
Author:
Ted Faber <faber@…>
Branches:
compt_changes, info-ops, master
Children:
b6a6206
Parents:
53b5c18
git-author:
Ted Faber <faber@…> (10/05/11 17:10:01)
git-committer:
Ted Faber <faber@…> (10/05/11 17:11:01)
Message:

Simple support for experiments in groups. Closes #32

Location:
fedd
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • fedd/access_to_abac.py

    r53b5c18 rf3898f7  
    8282    '''
    8383    right_side_str = '\s*,\s*\(\s*%s\s*,\s*%s\s*,\s*%s\s*\)' % \
    84             (id_same_str, id_same_str,id_same_str)
     84            (proj_same_str, id_same_str,id_same_str)
    8585
    8686    m = re.match(right_side_str, l)
     
    319319fedid_str = 'fedid:([0-9a-fA-F]{40})'
    320320id_str = '[a-zA-Z][\w_-]*'
     321proj_str = '[a-zA-Z][\w_/-]*'
    321322path_str = '[a-zA-Z_/\.-]+'
    322323id_any_str = '(%s|<any>)' % id_str
     324proj_any_str = '(%s|<any>)' % proj_str
    323325id_same_str = '(%s|<same>)' % id_str
     326proj_same_str = '(%s|<same>)' % proj_str
    324327left_side_str = '\(\s*%s\s*,\s*%s\s*,\s*%s\s*\)' % \
    325         (fedid_str, id_any_str, id_any_str)
     328        (fedid_str, proj_any_str, id_any_str)
    326329right_side_str = '(%s)(\s*,\s*\(.*\))?' % (id_str)
    327330line_re = re.compile('%s\s*->\s*%s' % (left_side_str, right_side_str))
  • fedd/exp_access_db.py

    r53b5c18 rf3898f7  
    5252q_start = """
    5353SELECT
    54     g.uid, g.pid,
     54    g.uid,
     55    CASE g.gid
     56        WHEN g.pid THEN g.pid
     57        ELSE CONCAT(g.pid, '/', g.gid)
     58    END,
    5559    CONCAT('-----BEGIN CERTIFICATE-----\\n',
    5660        s.cert,
     
    5963FROM group_membership g INNER JOIN user_sslcerts s
    6064    ON g.uid = s.uid
    61 WHERE revoked is NULL AND g.pid = g.gid
     65WHERE revoked is NULL
    6266"""
    6367q_end ="""
  • fedd/fedd_to_abac.py

    r53b5c18 rf3898f7  
    6565    comment_re = re.compile('^\s*#|^$')
    6666    fedid_str = 'fedid:([0-9a-fA-F]{40})'
    67     id_str = '[a-zA-Z][\w_-]*'
     67    id_str = '[a-zA-Z][\w/_-]*'
    6868    single_re = re.compile('\s*%s\s*->\s*(%s)' % (fedid_str, id_str))
    6969    double_re = re.compile('\s*%s\s*->\s*\((%s)\s*,\s*(%s)\)' % \
     
    109109                    (creds_dir or 'new_cert_dir', id.name, i)
    110110
    111             cid = Creddy.ID(cert)
    112             cid.load_privkey(key)
    113             cattr = Creddy.Attribute(cid, r, 3600 * 24 * 365 * 10)
    114             cattr.principal(k)
    115111
    116112            if debug:
     
    118114                        (cert, key, r, k, cf)
    119115            else:
     116                cid = Creddy.ID(cert)
     117                cid.load_privkey(key)
     118                cattr = Creddy.Attribute(cid, r, 3600 * 24 * 365 * 10)
     119                cattr.principal(k)
    120120                cattr.bake()
    121121                cattr.write_name(cf)
  • fedd/federation/emulab_access.py

    r53b5c18 rf3898f7  
    937937        vchars_re = '[^' + string.ascii_letters + string.digits  + '-]'
    938938
     939        self.state_lock.acquire()
     940        if aid in self.allocation:
     941            proj = self.allocation[aid].get('project', None)
     942            if not proj:
     943                proj = self.allocation[aid].get('sproject', None)
     944        self.state_lock.release()
     945
     946        if not proj:
     947            raise service_error(service_error.internal,
     948                    "Can't find project for %s" %aid)
     949
    939950        for a in attrs:
    940951            if a['attribute'] in configs:
     
    954965                ename = a['value']
    955966
    956         # Names longer than the emulab max are discarder
    957         if ename and len(ename) <= self.max_name_len:
     967        # Names longer than the emulab max are discarded
     968        # Projects with a group require nonce experiment names as well
     969        if ename and len(ename) <= self.max_name_len and '/' not in proj:
    958970            # Clean up the experiment name so that emulab will accept it.
    959971            ename = re.sub(vchars_re, '-', ename)
     
    976988        self.state_lock.acquire()
    977989        if aid in self.allocation:
    978             proj = self.allocation[aid].get('project', None)
    979             if not proj:
    980                 proj = self.allocation[aid].get('sproject', None)
    981990            user = self.allocation[aid].get('user', None)
    982991            self.allocation[aid]['experiment'] = ename
     
    9951004            self.write_state()
    9961005        self.state_lock.release()
    997 
    998         if not proj:
    999             raise service_error(service_error.internal,
    1000                     "Can't find project for %s" %aid)
    10011006
    10021007        if not user:
     
    10951100                            certfile, tmpdir)
    10961101
     1102            if '/' in proj: proj, gid = proj.split('/')
     1103            else: gid = None
     1104
     1105
    10971106            # Set up userconf and seer if needed
    10981107            self.configure_userconf(services, tmpdir)
     
    11121121                    debug=self.create_debug, log=alloc_log, boss=self.boss,
    11131122                    cert=self.xmlrpc_cert)
    1114             rv = starter(self, ename, proj, user, expfile, tmpdir)
     1123            rv = starter(self, ename, proj, user, expfile, tmpdir, gid=gid)
    11151124        except service_error, e:
    11161125            err = e
     
    11641173            raise service_error(service_error.internal,
    11651174                    "Can't find project for %s" % aid)
     1175        else:
     1176            if '/' in proj: proj, gid = proj.split('/')
     1177            else: gid = None
    11661178
    11671179        if not user:
     
    11731185        stopper = self.stop_segment(keyfile=self.ssh_privkey_file,
    11741186                debug=self.create_debug, boss=self.boss, cert=self.xmlrpc_cert)
    1175         stopper(self, user, proj, ename)
     1187        stopper(self, user, proj, ename, gid)
    11761188        return { 'allocID': req['allocID'], 'proof': proof.to_dict() }
  • fedd/federation/emulab_segment.py

    r53b5c18 rf3898f7  
    9393        return state
    9494
    95     def make_null_experiment(self, pid, eid, tmpdir):
     95    def make_null_experiment(self, pid, eid, tmpdir, gid=None):
    9696        """
    9797        Create a null copy of the experiment so that we capture any logs there
     
    115115                    'wait': True
    116116                    }
     117            if gid is not None:
     118                params['group'] = gid
    117119            if self.log:
    118120                self.log.info("[make_null_experiment]: Creating experiment")
  • fedd/federation/local_emulab_segment.py

    r53b5c18 rf3898f7  
    5858        return True
    5959
    60     def __call__(self, parent, eid, pid, user, tclfile, tmpdir, timeout=0):
     60    def __call__(self, parent, eid, pid, user, tclfile, tmpdir, timeout=0,
     61            gid=None):
    6162        """
    6263        Start a sub-experiment on a federant.
     
    7071
    7172        if state == 'none':
    72             if not self.make_null_experiment(pid, eid, tmpdir):
     73            if not self.make_null_experiment(pid, eid, tmpdir, gid):
    7374                return False
    7475
     
    102103        emulab_segment.__init__(self, boss=boss, cert=cert)
    103104
    104     def __call__(self, parent, user, pid, eid):
     105    def __call__(self, parent, user, pid, eid, gid=None):
    105106        """
    106107        Stop a sub experiment by calling swapexp on the federant
    107108        """
     109
    108110        self.log.info("[stop_segment]: Stopping %s" % eid)
    109111        rv = False
  • fedd/federation/proxy_emulab_segment.py

    r53b5c18 rf3898f7  
    158158
    159159
    160     def make_null_experiment(self, user, host, pid, eid, tmpdir):
     160    def make_null_experiment(self, user, host, pid, eid, tmpdir, gid=None):
    161161        """
    162162        Create a null copy of the experiment so that we capture any logs there
     
    164164        startexp
    165165        """
     166
     167        if gid is not None: gparam = '-g %s' % gid
     168        else: gparam = ''
     169
    166170        try:
    167171            f = open("%s/null.tcl" % tmpdir, "w")
     
    179183            if not self.ssh_cmd(user, host,
    180184                    ("/usr/testbed/bin/startexp -i -f -w -p %s " +
    181                     "-e %s null.tcl") % (pid, eid), "startexp",
     185                    "-e %s %s null.tcl") % (pid, eid, gparam), "startexp",
    182186                    timeout=60 * 10):
    183187                return False
     
    276280
    277281
    278     def __call__(self, parent, eid, pid, user, tclfile, tmpdir, timeout=0):
     282    def __call__(self, parent, eid, pid, user, tclfile, tmpdir, timeout=0,
     283            gid=None):
    279284        """
    280285        Start a sub-experiment on a federant.
     
    294299            # Put a dummy in place to capture logs, and establish an experiment
    295300            # directory.
    296             if not self.make_null_experiment(user, host, pid, eid, tmpdir):
     301            if not self.make_null_experiment(user, host, pid, eid, tmpdir, gid):
    297302                return False
    298303
     
    325330        proxy_segment.__init__(self, log=log, keyfile=keyfile, debug=debug)
    326331
    327     def __call__(self, parent, user, pid, eid):
     332    def __call__(self, parent, user, pid, eid, gid=None):
    328333        """
    329334        Stop a sub experiment by calling swapexp on the federant
Note: See TracChangeset for help on using the changeset viewer.