Ignore:
Timestamp:
Jul 28, 2009 3:05:56 PM (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:
886307f
Parents:
93d4442
Message:

allow an owner to overwrite a filed experiment without terminating it

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/experiment_control.py

    r93d4442 r9479343  
    18361836        if req.has_key('experimentID') and \
    18371837                req['experimentID'].has_key('localname'):
     1838            overwrite = False
    18381839            eid = req['experimentID']['localname']
     1840            # If there's an old failed experiment here with the same local name
     1841            # and accessible by this user, we'll overwrite it, otherwise we'll
     1842            # fall through and do the collision avoidance.
     1843            old_expid = self.get_experiment_fedid(eid)
     1844            if old_expid and self.check_experiment_access(fid, old_expid):
     1845                self.state_lock.acquire()
     1846                status = self.state[eid].get('experimentStatus', None)
     1847                if status and status == 'failed':
     1848                    # remove the old access attribute
     1849                    self.auth.unset_attribute(fid, old_expid)
     1850                    overwrite = True
     1851                    del self.state[eid]
     1852                    del self.state[old_expid]
     1853                self.state_lock.release()
    18391854            self.state_lock.acquire()
    1840             while (self.state.has_key(eid)):
     1855            while (self.state.has_key(eid) and not overwrite):
    18411856                eid += random.choice(string.ascii_letters)
    18421857            # Initial state
     
    20682083
    20692084        return rv
     2085   
     2086    def get_experiment_fedid(self, key):
     2087        """
     2088        find the fedid associated with the localname key in the state database.
     2089        """
     2090
     2091        rv = None
     2092        self.state_lock.acquire()
     2093        if self.state.has_key(key):
     2094            if isinstance(self.state[key], dict):
     2095                try:
     2096                    kl = [ f['fedid'] for f in \
     2097                            self.state[key]['experimentID']\
     2098                                if f.has_key('fedid') ]
     2099                except KeyError:
     2100                    self.state_lock.release()
     2101                    raise service_error(service_error.internal,
     2102                            "No fedid for experiment %s when getting "+\
     2103                                    "fedid(!?)" % key)
     2104                if len(kl) == 1:
     2105                    rv = kl[0]
     2106                else:
     2107                    self.state_lock.release()
     2108                    raise service_error(service_error.internal,
     2109                            "multiple fedids for experiment %s when " +\
     2110                                    "getting fedid(!?)" % key)
     2111            else:
     2112                self.state_lock.release()
     2113                raise service_error(service_error.internal,
     2114                        "Unexpected state for %s" % key)
     2115        self.state_lock.release()
     2116        return rv
    20702117
    20712118    def check_experiment_access(self, fid, key):
     
    20762123        """
    20772124        if not isinstance(key, fedid):
    2078             self.state_lock.acquire()
    2079             if self.state.has_key(key):
    2080                 if isinstance(self.state[key], dict):
    2081                     try:
    2082                         kl = [ f['fedid'] for f in \
    2083                                 self.state[key]['experimentID']\
    2084                                     if f.has_key('fedid') ]
    2085                     except KeyError:
    2086                         self.state_lock.release()
    2087                         raise service_error(service_error.internal,
    2088                                 "No fedid for experiment %s when checking " +\
    2089                                         "access(!?)" % key)
    2090                     if len(kl) == 1:
    2091                         key = kl[0]
    2092                     else:
    2093                         self.state_lock.release()
    2094                         raise service_error(service_error.internal,
    2095                                 "multiple fedids for experiment %s when " +\
    2096                                         "checking access(!?)" % key)
    2097                 elif isinstance(self.state[key], str):
    2098                     self.state_lock.release()
    2099                     raise service_error(service_error.internal,
    2100                             ("experiment %s is placeholder.  " +\
    2101                                     "Creation in progress or aborted oddly") \
    2102                                     % key)
    2103                 else:
    2104                     self.state_lock.release()
    2105                     raise service_error(service_error.internal,
    2106                             "Unexpected state for %s" % key)
    2107 
    2108             else:
    2109                 self.state_lock.release()
    2110                 raise service_error(service_error.access, "Access Denied")
    2111             self.state_lock.release()
     2125            key = self.get_experiment_fedid(key)
    21122126
    21132127        if self.auth.check_attribute(fid, key):
     
    23892403                        'aid': aid,\
    23902404                    }
    2391                 print "%s %s" % (tb, tbparams[tb])
    23922405            fed_exp['experimentStatus'] = 'terminating'
    23932406            if self.state_filename: self.write_state()
Note: See TracChangeset for help on using the changeset viewer.