Using sfa.util.cache to cache result of get_resources
[sfa.git] / sfa / methods / get_resources.py
1 ### $Id$
2 ### $URL$
3
4 from sfa.util.faults import *
5 from sfa.util.namespace import *
6 from sfa.util.method import Method
7 from sfa.util.parameter import Parameter, Mixed
8 from sfa.trust.auth import Auth
9 from sfa.util.config import Config
10 # RSpecManager_pl is not used. This line is a check that ensures that everything is in place for the import to work.
11 import sfa.rspecs.aggregates.rspec_manager_pl
12 from sfa.trust.credential import Credential
13 from sfatables.runtime import SFATablesRules
14
15 class get_resources(Method):
16     """
17     Get an resource specification (rspec). The rspec may describe the resources
18     available at an authority or the resources being used by a slice.      
19
20     @param cred credential string specifying the rights of the caller
21     @param hrn human readable name of the slice we are interesed in or None 
22            for an authority.  
23     """
24
25     interfaces = ['aggregate', 'slicemgr']
26     
27     accepts = [
28         Parameter(str, "Credential string"),
29         Mixed(Parameter(str, "Human readable name (hrn or urn)"),
30               Parameter(None, "hrn not specified")),
31         Mixed(Parameter(str, "Human readable name of the original caller"),
32               Parameter(None, "Origin hrn not specified"))
33         ]
34
35     returns = Parameter(str, "String representatin of an rspec")
36     
37     def call(self, cred, xrn=None, origin_hrn=None):
38         hrn, type = urn_to_hrn(xrn)
39         user_cred = Credential(string=cred)
40
41         #log the call
42         if not origin_hrn:
43             origin_hrn = user_cred.get_gid_caller().get_hrn()
44         self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name))
45
46         # validate the cred    
47         self.api.auth.check(cred, 'listnodes', hrn)
48
49         # send the call to the right manager
50         manager_base = 'sfa.managers'
51         if self.api.interface in ['aggregate']:
52             mgr_type = self.api.config.SFA_AGGREGATE_TYPE
53             manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
54             manager = __import__(manager_module, fromlist=[manager_base])
55             rspec = manager.get_rspec(self.api, xrn, origin_hrn)
56             outgoing_rules = SFATablesRules('OUTGOING')
57         elif self.api.interface in ['slicemgr']:
58             mgr_type = self.api.config.SFA_SM_TYPE
59             manager_module = manager_base + ".slice_manager_%s" % mgr_type
60             manager = __import__(manager_module, fromlist=[manager_base])
61             rspec = manager.get_rspec(self.api, xrn, origin_hrn)
62             outgoing_rules = SFATablesRules('FORWARD-OUTGOING')
63
64         filtered_rspec = rspec
65         if outgoing_rules.sorted_rule_list:
66            request_context = manager.fetch_context(hrn, origin_hrn, outgoing_rules.contexts)
67            outgoing_rules.set_context(request_context)
68            filtered_rspec = outgoing_rules.apply(rspec)
69
70         return filtered_rspec