4 from sfa.util.faults import *
5 from sfa.util.misc 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.plc.slices import Slices
10 from sfa.util.config import Config
11 # RSpecManager_pl is not used. It's used to make sure the module is in place.
12 import sfa.rspecs.aggregates.rspec_manager_pl
13 from sfa.trust.credential import Credential
14 from sfatables.runtime import SFATablesRules
17 class create_slice(Method):
19 Instantiate the specified slice according to whats defined in the specified rspec
21 @param cred credential string specifying the rights of the caller
22 @param hrn human readable name of slice to instantiate
23 @param rspec resource specification
24 @return 1 is successful, faults otherwise
27 interfaces = ['aggregate', 'slicemgr']
30 Parameter(str, "Credential string"),
31 Parameter(str, "Human readable name of slice to instantiate"),
32 Parameter(str, "Resource specification"),
33 Mixed(Parameter(str, "Human readable name of the original caller"),
34 Paramater(None, "Origin hrn not specified"))
37 returns = Parameter(int, "1 if successful")
39 def call(self, cred, hrn, requested_rspec, origin_hrn=None):
40 user_cred = Credential(string=cred)
44 origin_hrn = user_cred.get_gid_caller().get_hrn()
45 self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name))
47 # validate the credential
48 self.api.auth.check(cred, 'createslice')
50 sfa_aggregate_type = Config().get_aggregate_rspec_type()
51 rspec_manager = __import__("sfa.rspecs.aggregates.rspec_manager_"+sfa_aggregate_type, fromlist = ["sfa.rspecs.aggregates"])
52 #Filter the incoming rspec using sfatables
53 if self.api.interface in ['slicemgr']:
54 incoming_rules = SFATablesRules('FORWARD-INCOMING')
55 elif self.api.interface in ['aggregate']:
56 incoming_rules = SFATablesRules('INCOMING')
58 if incoming_rules.sorted_rule_list:
59 #incoming_rules.set_slice(hrn) # This is a temporary kludge. Eventually, we'd like to fetch the context requested by the match/target
61 contexts = incoming_rules.contexts
62 request_context = rspec_manager.fetch_context(hrn, origin_hrn, contexts)
63 incoming_rules.set_context(request_context)
64 rspec = incoming_rules.apply(requested_rspec)
66 rspec = requested_rspec
68 # send the call to the right manager
69 if sfa_aggregate_type not in ['pl']:
70 # To clean up after July 21 - SB
71 rspec = rspec_manager.create_slice(self.api, hrn, rspec)
74 manager_base = 'sfa.managers'
75 if self.api.interface in ['aggregate']:
76 mgr_type = self.api.config.SFA_AGGREGATE_TYPE
77 manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
78 manager = __import__(manager_module, fromlist=[manager_base])
79 manager.create_slice(self.api, hrn, rspec)
80 elif self.api.interface in ['slicemgr']:
81 mgr_type = self.api.config.SFA_SM_TYPE
82 manager_module = manager_base + ".slice_manager_%s" % mgr_type
83 manager = __import__(manager_module, fromlist=[manager_base])
84 manager.create_slice(self.api, hrn, rspec, origin_hrn)