Ignore:
Timestamp:
Dec 4, 2008 9:49:39 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:
416292f
Parents:
2ac63f7d
Message:

Snapshot of new state-based allocation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/access.py

    r2ac63f7d rc3dcf48  
    8080        self.projects = { }
    8181        self.keys = { }
     82        self.types = { }
    8283        self.allocation = { }
    8384        self.state = {
    8485            'projects': self.projects,
    8586            'allocation' : self.allocation,
    86             'keys' : self.keys
     87            'keys' : self.keys,
     88            'types': self.types
    8789        }
    8890        self.log = logging.getLogger("fedd.access")
     
    331333                self.projects = self.state['projects']
    332334                self.keys = self.state['keys']
     335                self.types = self.state['types']
    333336
    334337                self.log.debug("[read_state]: Read state from %s" % \
     
    653656            self.state_lock.acquire()
    654657            self.allocation[aid] = { }
     658            try:
     659                pname = ap['project']['name']['localname']
     660            except KeyError:
     661                pname = None
     662
    655663            if dyn[1]:
    656                 try:
    657                     pname = ap['project']['name']['localname']
    658                 except KeyError:
     664                if not pname:
    659665                    self.state_lock.release()
    660666                    raise service_error(service_error.internal,
     
    663669                else: self.projects[pname] = 1
    664670                self.allocation[aid]['project'] = pname
     671
     672            if ap.has_key('resources'):
     673                if not pname:
     674                    self.state_lock.release()
     675                    raise service_error(service_error.internal,
     676                            "Misformed allocation response?")
     677                self.allocation[aid]['types'] = set()
     678                nodes = ap['resources'].get('node', [])
     679                for n in nodes:
     680                    for h in n.get('hardware', []):
     681                        if self.types.has_key((pname, h)):
     682                            self.types[(pname, h)] += 1
     683                        else:
     684                            self.types[(pname, h)] = 1
     685                        self.allocation[aid]['types'].add((pname,h))
     686
    665687
    666688            self.allocation[aid]['keys'] = [ ]
     
    680702                        "Misformed allocation response?")
    681703
     704
    682705            self.allocation[aid]['owners'] = owners
    683706            self.write_state()
     
    741764            del_users = { }
    742765            del_project = None
     766            del_types = set()
     767
    743768            if self.allocation.has_key(aid):
    744769                self.log.debug("Found allocation for %s" %aid)
     
    759784                        del_project = pname
    760785                        del self.projects[pname]
     786
     787                if self.allocation[aid].has_key('types'):
     788                    for t in self.allocation[aid]['types']:
     789                        self.types[t] -= 1
     790                        if self.types[t] == 0:
     791                            if not del_project: del_project = t[0]
     792                            del_types.add(t[1])
     793                            del self.types[t]
    761794
    762795                del self.allocation[aid]
     
    776809                    if users:
    777810                        msg['project']['user'] = users
     811                    if len(del_types) > 0:
     812                        msg['resources'] = { 'node': \
     813                                [ {'hardware': [ h ] } for h in del_types ]\
     814                            }
    778815                    if self.allocate_project.release_project:
    779816                        msg = { 'ReleaseProjectRequestBody' : msg}
Note: See TracChangeset for help on using the changeset viewer.