- def getSlices(self):
- """
- Return a list of instnatiated managed by this slice manager.
- """
-
- slices = self.shell.GetSlices(self.auth, {}, ['name'])
- slice_hrns = [self.slicename_to_hrn(slice['name']) for slice in slices]
-
- return slice_hrns
-
- def get_rspec(self, hrn, type):
- """
- Get resource information from PLC
- """
-
- # Get the required nodes
- if type in ['aggregate']:
- nodes = self.shell.GetNodes(self.auth)
- elif type in ['slice']:
- slicename = hrn_to_pl_slicename(hrn)
- slices = self.shell.GetSlices(self.auth, [slicename])
- node_ids = slices[0]['node_ids']
- nodes = self.shell.GetNodes(self.auth, node_ids)
-
- # Filter out whitelisted nodes
- public_nodes = lambda n: n.has_key('slice_ids_whitelist') and not n['slice_ids_whitelist']
- nodes = filter(public_nodes, nodes)
-
- # Get all network interfaces
- interface_ids = []
- for node in nodes:
- interface_ids.extend(node['nodenetwork_ids'])
- interfaces = self.shell.GetNodeNetworks(self.auth, interface_ids)
- interface_dict = {}
- for interface in interfaces:
- interface_dict[interface['nodenetwork_id']] = interface
-
- # join nodes with thier interfaces
- for node in nodes:
- node['interfaces'] = []
- for nodenetwork_id in node['nodenetwork_ids']:
- node['interfaces'].append(interface_dict[nodenetwork_id])
-
- # convert and threshold to ints
- if self.timestamp.has_key('timestamp') and self.timestamp['timestamp']:
- timestamp = self.timestamp['timestamp']
- threshold = self.threshold
- else:
- timestamp = datetime.datetime.now()
- delta = datetime.timedelta(hours=self.nodes_ttl)
- threshold = timestamp + delta
-
-
- start_time = int(timestamp.strftime("%s"))
- end_time = int(threshold.strftime("%s"))
- duration = end_time - start_time
-
- # create the plc dict
- networks = [{'nodes': nodes, 'name': self.hrn, 'start_time': start_time, 'duration': duration}]
- resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
-
- # convert the plc dict to an rspec dict
- resourceDict = RspecDict(resources)
- # convert the rspec dict to xml
- rspec = Rspec()
- rspec.parseDict(resourceDict)
- return rspec.toxml()
-
- def getResources(self, slice_hrn):
- """
- Return the current rspec for the specified slice.
- """
- rspec = self.get_rspec(slice_hrn, 'slice')
-
- return rspec
-
-
- def getTicket(self, hrn, rspec):
- """
- Retrieve a ticket. This operation is currently implemented on PLC
- only (see SFA, engineering decisions); it is not implemented on
- components.
-
- @param name name of the slice to retrieve a ticket for
- @param rspec resource specification dictionary
- @return the string representation of a ticket object
- """
- #self.registry.get_ticket(name, rspec)
-
- return
-
-
- def createSlice(self, slice_hrn, rspec, attributes = []):
- """
- Instantiate the specified slice according to whats defined in the rspec.
- """
-
- spec = Rspec(rspec)
- # save slice state locally
- # we can assume that spec object has been validated so its safer to
- # save this instead of the unvalidated rspec the user gave us
- self.slices[slice_hrn] = spec.toxml()
- self.slices.write()
-
- # Get slice info
- slicename = hrn_to_pl_slicename(slice_hrn)
- slices = self.shell.GetSlices(self.auth, [slicename], ['node_ids'])
- if not slices:
- raise RecordNotFound(slice_hrn)
- slice = slices[0]
-
- # find out where this slice is currently running
- nodelist = self.shell.GetNodes(self.auth, slice['node_ids'], ['hostname'])
- hostnames = [node['hostname'] for node in nodelist]
-
- # get netspec details
- nodespecs = spec.getDictsByTagName('NodeSpec')
- nodes = []
- for nodespec in nodespecs:
- if isinstance(nodespec['name'], list):
- nodes.extend(nodespec['name'])
- elif isinstance(nodespec['name'], StringTypes):
- nodes.append(nodespec['name'])
-
- # save slice state locally
- # we can assume that spec object has been validated so its safer to
- # save this instead of the unvalidated rspec the user gave us
- self.slices[slice_hrn] = spec.toxml()
- self.slices.write()
-
- # remove nodes not in rspec
- deleted_nodes = list(set(hostnames).difference(nodes))
- # add nodes from rspec
- added_nodes = list(set(nodes).difference(hostnames))
-
- self.shell.AddSliceToNodes(self.auth, slicename, added_nodes)
- self.shell.DeleteSliceFromNodes(self.auth, slicename, deleted_nodes)
-
- for attribute in attributes:
- type, value, node, nodegroup = attribute['type'], attribute['value'], attribute['node'], attribute['nodegroup']
- self.shell.AddSliceAttribute(self.auth, slicename, type, value, node, nodegroup)
-
- # contact registry to get slice users and add them to the slice
- #slice_record = self.registry.resolve(self.credential, slice_hrn)
- # persons = slice_record['users']
- # for perosn in persons:
- # shell.AddPersonToSlice(person['email'], slice_name)
- return 1
-
- def updateSlice(self, slice_hrn, rspec, attributes = []):
- return self.create_slice(slice_hrn, rspec, attributes)
-
- def deleteSlice(self, slice_hrn):
- """
- Remove this slice from all components it was previouly associated with and
- free up the resources it was using.
- """
- if self.slices.has_key(slice_hrn):
- self.slices.pop(slice_hrn)
- self.slices.write()
-
- slicename = hrn_to_pl_slicename(slice_hrn)
- slices = self.shell.GetSlices(self.auth, [slicename])
- if not slices:
- return 1
- slice = slices[0]
-
- self.shell.DeleteSliceFromNodes(self.auth, slicename, slice['node_ids'])
- return 1
-
- def startSlice(self, slice_hrn):
- """
- Stop the slice at plc.
- """
- slicename = hrn_to_pl_slicename(slice_hrn)
- slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id'])
- if not slices:
- #raise RecordNotFound(slice_hrn)
- return 1
- slice_id = slices[0]
- atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id'])
- attribute_id = attreibutes[0]
- self.shell.UpdateSliceAttribute(self.auth, attribute_id, "1" )
- return 1
-
- def stopSlice(self, slice_hrn):
- """
- Stop the slice at plc
- """
- slicename = hrn_to_pl_slicename(slice_hrn)
- slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id'])
- if not slices:
- #raise RecordNotFound(slice_hrn)
- return 1
- slice_id = slices[0]
- atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id'])
- attribute_id = attreibutes[0]
- self.shell.UpdateSliceAttribute(self.auth, attribute_id, "0")
- return 1
-
-
- def resetSlice(self, slice_hrn):
- """
- Reset the slice
- """
- # XX not yet implemented
- return 1
-
- def getPolicy(self):
- """
- Return this aggregates policy.
- """
-
- return self.policy
-
-
-
-##############################
-## Server methods here for now
-##############################
-
-
- # XX fix rights, should be function name defined in
- # privilege_table (from util/rights.py)
- def list_nodes(self, cred):
- self.decode_authentication(cred, 'listnodes')
- return self.getNodes()
-
- def list_slices(self, cred):
- self.decode_authentication(cred, 'listslices')
- return self.getSlices()
-
- def get_resources(self, cred, hrn):
- self.decode_authentication(cred, 'listnodes')
- return self.getResources(hrn)
-
- def get_ticket(self, cred, hrn, rspec):
- self.decode_authentication(cred, 'getticket')
- return self.getTicket(hrn, rspec)
-
- def get_policy(self, cred):
- self.decode_authentication(cred, 'getpolicy')
- return self.getPolicy()
-
- def create_slice(self, cred, hrn, rspec):
- self.decode_authentication(cred, 'createslice')
- return self.createSlice(hrn, rspec)
-
- def update_slice(self, cred, hrn, rspec):
- self.decode_authentication(cred, 'updateslice')
- return self.updateSlice(hrn)
-
- def delete_slice(self, cred, hrn):
- self.decode_authentication(cred, 'deleteslice')
- return self.deleteSlice(hrn)
-
- def start_slice(self, cred, hrn):
- self.decode_authentication(cred, 'startslice')
- return self.startSlice(hrn)
-
- def stop_slice(self, cred, hrn):
- self.decode_authentication(cred, 'stopslice')
- return self.stopSlice(hrn)
-
- def reset_slice(self, cred, hrn):
- self.decode_authentication(cred, 'resetslice')
- return self.resetSlice(hrn)
-
- def register_functions(self):
- GeniServer.register_functions(self)
-
- # Aggregate interface methods
- self.server.register_function(self.list_nodes)
- self.server.register_function(self.list_slices)
- self.server.register_function(self.get_resources)
- self.server.register_function(self.get_policy)
- self.server.register_function(self.create_slice)
- self.server.register_function(self.update_slice)
- self.server.register_function(self.delete_slice)
- self.server.register_function(self.start_slice)
- self.server.register_function(self.stop_slice)
- self.server.register_function(self.reset_slice)
-