import accounts
import database
import logger
+import ticket
import tools
API_SERVER_PORT = 812
UNIX_ADDR = '/tmp/sliver_mgr.api'
+deliver_ticket = None # set in sm.py:start()
api_method_dict = {}
nargs_dict = {}
"""Help(): get help"""
return ''.join([method.__doc__ + '\n' for method in api_method_dict.itervalues()])
+@export_to_api(1)
+def Ticket(tkt):
+ """Ticket(tkt): deliver a ticket"""
+ succeeded = False
+ if type(tkt) == str:
+ data = ticket.verify(tkt)
+ if data != None:
+ deliver_ticket(data)
+ succeeded = True
+ if not succeeded: raise xmlrpclib.Fault(102, 'Invalid argument: the sole argument must be a valid ticket as returned from GetTicket().')
+
@export_to_api(1)
def Create(rec):
"""Create(sliver_name): create a non-PLC-instantiated sliver"""
ucred = self.request.getsockopt(socket.SOL_SOCKET, SO_PEERCRED, sizeof_struct_ucred)
xid = struct.unpack('3i', ucred)[2]
caller_name = pwd.getpwuid(xid)[0]
- if expected_nargs >= 1:
+ if method_name not in ('Help', 'Ticket'):
target_name = args[0]
target_rec = database.db.get(target_name)
if not (target_rec and target_rec['type'].startswith('sliver.')): raise xmlrpclib.Fault(102, 'Invalid argument: the first argument must be a sliver name.')
if not (caller_name in (args[0], 'root') or (caller_name, method_name) in target_rec['delegations']): raise xmlrpclib.Fault(108, 'Permission denied.')
result = method(target_rec, *args[1:])
- else: result = method()
+ else: result = method(*args)
if result == None: result = 1
return result
import api
import database
import delegate
+import logger
import sliver_vs
@database.synchronized
-def GetSlivers_callback(data):
+def GetSlivers_callback(data, fullupdate=True):
"""This function has two purposes. One, convert GetSlivers() data into a more convenient format. Two, even if no updates are coming in, use the GetSlivers() heartbeat as a cue to scan for expired slivers."""
+
+ node_id = None
+ try:
+ f = open('/etc/planetlab/node_id')
+ try: node_id = int(f.read())
+ finally: f.close()
+ except: logger.log_exc()
+
for d in data:
+ if d['node_id'] != node_id: continue
for sliver in d['slivers']:
rec = sliver.copy()
rec.setdefault('timestamp', d['timestamp'])
except (KeyError, ValueError): amt = default_amt
rspec[resname] = amt
database.db.deliver_record(rec)
- database.db.set_min_timestamp(d['timestamp'])
+ if fullupdate: database.db.set_min_timestamp(d['timestamp'])
database.db.sync()
# handle requested startup
accounts.get(name).start(delay=cumulative_delay)
cumulative_delay += 3
+def deliver_ticket(data): return GetSlivers_callback(data, fullupdate=False)
+
def start(options):
accounts.register_class(sliver_vs.Sliver_VS)
global start_requested
start_requested = options.startup
database.start()
+ api.deliver_ticket = deliver_ticket
api.start()