1 from sfa.util.xrn import get_authority, urn_to_hrn
2 from sfa.util.sfalogging import logger
9 rspec_to_slice_tag = {'max_rate':'net_max_rate'}
11 #def __init__(self, api, ttl = .5, origin_hrn=None):
13 ##filepath = path + os.sep + filename
14 #self.policy = Policy(self.api)
15 #self.origin_hrn = origin_hrn
16 #self.registry = api.registries[api.hrn]
17 #self.credential = api.getCredential()
22 def __init__(self, driver):
26 #def get_slivers(self, xrn, node=None):
27 #hrn, hrn_type = urn_to_hrn(xrn)
29 #slice_name = hrn_to_pl_slicename(hrn)
30 ## XX Should we just call PLCAPI.GetSliceTicket(slice_name) instead
31 ## of doing all of this?
32 ##return self.api.driver.GetSliceTicket(self.auth, slice_name)
36 #sfa_slice = self.driver.GetSlices(slice_filter = slice_name, \
37 # slice_filter_type = 'slice_hrn')
40 ## Get user information
42 #alchemy_person = dbsession.query(RegRecord).filter_by(record_id = \
43 #sfa_slice['record_id_user']).first()
46 #sliver_attributes = []
48 #if sfa_slice['oar_job_id'] is not -1:
49 #nodes_all = self.driver.GetNodes({'hostname': \
50 #sfa_slice['node_ids']},
51 #['node_id', 'hostname','site','boot_state'])
52 #nodeall_byhostname = dict([(n['hostname'], n) for n in nodes_all])
53 #nodes = sfa_slice['node_ids']
56 ##for sliver_attribute in filter(lambda a: a['node_id'] == \
57 #node['node_id'], slice_tags):
58 #sliver_attribute['tagname'] = 'slab-tag'
59 #sliver_attribute['value'] = 'slab-value'
60 #sliver_attributes.append(sliver_attribute['tagname'])
61 #attributes.append({'tagname': sliver_attribute['tagname'],
62 #'value': sliver_attribute['value']})
64 ## set nodegroup slice attributes
65 #for slice_tag in filter(lambda a: a['nodegroup_id'] \
66 #in node['nodegroup_ids'], slice_tags):
67 ## Do not set any nodegroup slice attributes for
68 ## which there is at least one sliver attribute
70 #if slice_tag not in slice_tags:
71 #attributes.append({'tagname': slice_tag['tagname'],
72 #'value': slice_tag['value']})
74 #for slice_tag in filter(lambda a: a['node_id'] is None, \
76 ## Do not set any global slice attributes for
77 ## which there is at least one sliver attribute
79 #if slice_tag['tagname'] not in sliver_attributes:
80 #attributes.append({'tagname': slice_tag['tagname'],
81 #'value': slice_tag['value']})
83 ## XXX Sanity check; though technically this should
84 ## be a system invariant
85 ## checked with an assertion
86 #if sfa_slice['expires'] > MAXINT: sfa_slice['expires']= MAXINT
90 #'name': sfa_slice['name'],
91 #'slice_id': sfa_slice['slice_id'],
92 #'instantiation': sfa_slice['instantiation'],
93 #'expires': sfa_slice['expires'],
95 #'attributes': attributes
105 def get_peer(self, xrn):
106 hrn, hrn_type = urn_to_hrn(xrn)
107 #Does this slice belong to a local site or a peer senslab site?
110 # get this slice's authority (site)
111 slice_authority = get_authority(hrn)
112 site_authority = slice_authority
113 # get this site's authority (sfa root authority or sub authority)
114 #site_authority = get_authority(slice_authority).lower()
115 logger.debug("SLABSLICES \ get_peer slice_authority %s \
116 site_authority %s hrn %s" %(slice_authority, \
117 site_authority, hrn))
118 # check if we are already peered with this site_authority, if so
119 #peers = self.driver.GetPeers({})
120 peers = self.driver.GetPeers(peer_filter = slice_authority)
121 for peer_record in peers:
123 if site_authority == peer_record.hrn:
125 logger.debug(" SLABSLICES \tget_peer peer %s " %(peer))
128 def get_sfa_peer(self, xrn):
129 hrn, hrn_type = urn_to_hrn(xrn)
131 # return the authority for this hrn or None if we are the authority
133 slice_authority = get_authority(hrn)
134 site_authority = get_authority(slice_authority)
136 if site_authority != self.driver.hrn:
137 sfa_peer = site_authority
142 def verify_slice_leases(self, sfa_slice, requested_leases, kept_leases, \
144 logger.debug("SLABSLICES \tverify_slice_leases requested_leases %s kept_leases %s sfa_slice%s peer%s" %(requested_leases, kept_leases,sfa_slice,peer) )
145 leases = self.driver.GetLeases({'name':sfa_slice['name']}, ['lease_id'])
146 grain = self.driver.GetLeaseGranularity()
148 current_leases = [lease['lease_id'] for lease in leases]
149 deleted_leases = list(set(current_leases).difference(kept_leases))
153 #peer = RegAuyhority object is unsubscriptable
154 #TODO :UnBindObjectFromPeer Quick and dirty auth='senslab2 SA 27/07/12
155 self.driver.UnBindObjectFromPeer('senslab2', 'slice', \
156 sfa_slice['record_id_slice'], peer.hrn)
157 deleted = self.driver.DeleteLeases(deleted_leases, sfa_slice['name'])
158 for lease in requested_leases:
159 added = self.driver.AddLeases(lease['hostname'], \
160 sfa_slice['name'], int(lease['start_time']), \
161 int(lease['duration']))
162 #TODO : catch other exception?
164 logger.log_exc('Failed to add/remove slice leases')
168 def verify_slice_nodes(self, sfa_slice, requested_slivers, peer):
172 if sfa_slice['node_ids']:
173 nodes = self.driver.GetNodes(sfa_slice['node_ids'], ['hostname'])
174 current_slivers = [node['hostname'] for node in nodes]
176 # remove nodes not in rspec
177 deleted_nodes = list(set(current_slivers).\
178 difference(requested_slivers))
180 # add nodes from rspec
181 added_nodes = list(set(requested_slivers).difference(current_slivers))
184 #self.driver.UnBindObjectFromPeer('slice', slice['slice_id'], \
186 #PI is a list, get the only username in this list
187 #so that the OAR/LDAP knows the user:
188 #remove the authority from the name
189 tmp = sfa_slice['PI'][0].split(".")
190 username = tmp[(len(tmp)-1)]
191 #Update the table with the nodes that populate the slice
192 self.driver.db.update_job(sfa_slice['name'], nodes = added_nodes)
193 logger.debug("SLABSLICES \tverify_slice_nodes slice %s \r\n \r\n deleted_nodes %s"\
194 %(sfa_slice,deleted_nodes))
195 #If there is a timeslot specified, then a job can be launched
197 ##slot = sfa_slice['timeslot']
198 #self.driver.LaunchExperimentOnOAR(sfa_slice, added_nodes, \
201 #logger.log_exc("SLABSLICES \verify_slice_nodes KeyError \
202 #sfa_slice %s " %(sfa_slice))
206 self.driver.DeleteSliceFromNodes(sfa_slice['name'], \
210 logger.log_exc('Failed to add/remove slice from nodes')
213 def free_egre_key(self):
215 for tag in self.driver.GetSliceTags({'tagname': 'egre_key'}):
216 used.add(int(tag['value']))
218 for i in range(1, 256):
223 raise KeyError("No more EGRE keys available")
232 def handle_peer(self, site, sfa_slice, persons, peer):
237 self.driver.BindObjectToPeer('site', site['site_id'], \
238 peer['shortname'], sfa_slice['site_id'])
239 except Exception, error:
240 self.driver.DeleteSite(site['site_id'])
246 self.driver.BindObjectToPeer('slice', slice['slice_id'], \
247 peer['shortname'], sfa_slice['slice_id'])
248 except Exception, error:
249 self.driver.DeleteSlice(sfa_slice['slice_id'])
253 for person in persons:
255 self.driver.BindObjectToPeer('person', \
256 person['person_id'], peer['shortname'], \
257 person['peer_person_id'])
259 for (key, remote_key_id) in zip(person['keys'], \
262 self.driver.BindObjectToPeer( 'key', \
263 key['key_id'], peer['shortname'], \
266 self.driver.DeleteKey(key['key_id'])
267 logger.log_exc("failed to bind key: %s \
268 to peer: %s " % (key['key_id'], \
270 except Exception, error:
271 self.driver.DeletePerson(person['person_id'])
276 #def verify_site(self, slice_xrn, slice_record={}, peer=None, \
277 #sfa_peer=None, options={}):
278 #(slice_hrn, type) = urn_to_hrn(slice_xrn)
279 #site_hrn = get_authority(slice_hrn)
280 ## login base can't be longer than 20 characters
281 ##slicename = hrn_to_pl_slicename(slice_hrn)
282 #authority_name = slice_hrn.split('.')[0]
283 #login_base = authority_name[:20]
284 #logger.debug(" SLABSLICES.PY \tverify_site authority_name %s \
285 #login_base %s slice_hrn %s" \
286 #%(authority_name,login_base,slice_hrn)
288 #sites = self.driver.GetSites(login_base)
290 ## create new site record
291 #site = {'name': 'geni.%s' % authority_name,
292 #'abbreviated_name': authority_name,
293 #'login_base': login_base,
295 #'max_slivers': 1000,
297 #'peer_site_id': None}
299 #site['peer_site_id'] = slice_record.get('site_id', None)
300 #site['site_id'] = self.driver.AddSite(site)
301 ## exempt federated sites from monitor policies
302 #self.driver.AddSiteTag(site['site_id'], 'exempt_site_until', \
305 ### is this still necessary?
306 ### add record to the local registry
307 ##if sfa_peer and slice_record:
308 ##peer_dict = {'type': 'authority', 'hrn': site_hrn, \
309 ##'peer_authority': sfa_peer, 'pointer': \
311 ##self.registry.register_peer_object(self.credential, peer_dict)
315 ## unbind from peer so we can modify if necessary.
316 ## Will bind back later
317 #self.driver.UnBindObjectFromPeer('site', site['site_id'], \
322 def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer, options={}):
324 #login_base = slice_hrn.split(".")[0]
325 slicename = slice_hrn
326 sl = self.driver.GetSlices(slice_filter = slicename, \
327 slice_filter_type = 'slice_hrn')
330 logger.debug("SLABSLICE \tverify_slice slicename %s sl %s \
331 slice_record %s"%(slicename, sl, slice_record))
333 sfa_slice.update(slice_record)
334 #del slice['last_updated']
335 #del slice['date_created']
337 #slice['peer_slice_id'] = slice_record.get('slice_id', None)
338 ## unbind from peer so we can modify if necessary.
339 ## Will bind back later
340 #self.driver.UnBindObjectFromPeer('slice', slice['slice_id'], \
342 #Update existing record (e.g. expires field)
343 #it with the latest info.
344 ##if slice_record and slice['expires'] != slice_record['expires']:
345 ##self.driver.UpdateSlice( slice['slice_id'], {'expires' : \
346 #slice_record['expires']})
348 logger.debug(" SLABSLICES \tverify_slice Oups \
349 slice_record %s peer %s sfa_peer %s "\
350 %(slice_record, peer,sfa_peer))
351 sfa_slice = {'slice_hrn': slicename,
352 #'url': slice_record.get('url', slice_hrn),
353 #'description': slice_record.get('description', slice_hrn)
355 'record_id_user' : slice_record['person_ids'][0],
356 'record_id_slice': slice_record['record_id'],
357 'peer_authority':str(peer.hrn)
361 self.driver.AddSlice(sfa_slice)
362 #slice['slice_id'] = self.driver.AddSlice(slice)
363 logger.debug("SLABSLICES \tverify_slice ADDSLICE OK")
364 #slice['node_ids']=[]
365 #slice['person_ids'] = []
367 #slice['peer_slice_id'] = slice_record.get('slice_id', None)
368 # mark this slice as an sfa peer record
370 #peer_dict = {'type': 'slice', 'hrn': slice_hrn,
371 #'peer_authority': sfa_peer, 'pointer': \
373 #self.registry.register_peer_object(self.credential, peer_dict)
380 def verify_persons(self, slice_hrn, slice_record, users, peer, sfa_peer, \
388 if 'urn' in user and (not 'hrn' in user ) :
389 user['hrn'], user['type'] = urn_to_hrn(user['urn'])
391 if 'person_id' in user and 'hrn' in user:
392 users_by_id[user['person_id']] = user
393 users_dict[user['person_id']] = {'person_id':\
394 user['person_id'], 'hrn':user['hrn']}
396 users_by_hrn[user['hrn']] = user
397 users_dict[user['hrn']] = {'person_id':user['person_id'], \
400 logger.debug( "SLABSLICE.PY \tverify_person \
401 users_dict %s \r\n user_by_hrn %s \r\n \
403 %(users_dict,users_by_hrn, users_by_id))
405 existing_user_ids = []
406 existing_user_hrns = []
408 #Check if user is in LDAP using its hrn.
409 #Assuming Senslab is centralised : one LDAP for all sites,
410 # user_id unknown from LDAP
411 # LDAP does not provide users id, therfore we rely on hrns
413 #Construct the list of filters for GetPersons
415 for hrn in users_by_hrn:
416 #filter_user.append ( {'hrn':hrn})
417 filter_user.append (users_by_hrn[hrn])
418 logger.debug(" SLABSLICE.PY \tverify_person filter_user %s " \
420 existing_users = self.driver.GetPersons(filter_user)
421 #existing_users = self.driver.GetPersons({'hrn': \
422 #users_by_hrn.keys()})
423 #existing_users = self.driver.GetPersons({'hrn': \
424 #users_by_hrn.keys()}, \
427 for user in existing_users :
428 #for k in users_dict[user['hrn']] :
429 existing_user_hrns.append(users_dict[user['hrn']]['hrn'])
431 append(users_dict[user['hrn']]['person_id'])
433 #User from another federated site ,
434 #does not have a senslab account yet?
435 #or have multiple SFA accounts
436 #Check before adding them to LDAP
440 if isinstance(users, list):
441 ldap_reslt = self.driver.ldap.LdapSearch(users[0])
443 ldap_reslt = self.driver.ldap.LdapSearch(users)
445 existing_users = ldap_reslt[0]
446 existing_user_hrns.append(users_dict[user['hrn']]['hrn'])
448 append(users_dict[user['hrn']]['person_id'])
450 #User not existing in LDAP
452 logger.debug(" SLABSLICE.PY \tverify_person users \
453 not in ldap ... %s \r\n \t ldap_reslt %s " \
454 %(users, ldap_reslt))
457 # requested slice users
458 requested_user_ids = users_by_id.keys()
459 requested_user_hrns = users_by_hrn.keys()
460 logger.debug("SLABSLICE.PY \tverify_person requested_user_ids %s \
461 user_by_hrn %s " %(requested_user_ids, users_by_hrn))
462 # existing slice users
464 #existing_slice_users_filter = {'hrn': slice_record['PI'][0]}
465 #logger.debug(" SLABSLICE.PY \tverify_person requested_user_ids %s \
466 #existing_slice_users_filter %s slice_record %s" %(requested_user_ids,\
467 #existing_slice_users_filter,slice_record))
469 #existing_slice_users = \
470 #self.driver.GetPersons([existing_slice_users_filter])
471 #existing_slice_users = \
472 #self.driver.GetPersons(existing_slice_users_filter, \
474 #logger.debug("SLABSLICE.PY \tverify_person existing_slice_users %s " \
475 #%(existing_slice_users))
476 #Check that the user of the slice in the slice record
477 #matches the existing users
479 if slice_record['record_id_user'] in requested_user_ids and \
480 slice_record['PI'][0] in requested_user_hrns:
481 logger.debug(" SLABSLICE \tverify_person \
482 requested_user_ids %s = \
483 slice_record['record_id_user'] %s" \
484 %(requested_user_ids,slice_record['record_id_user']))
489 #existing_slice_user_hrns = [user['hrn'] for \
490 #user in existing_slice_users]
492 # users to be added, removed or updated
493 #One user in one senslab slice : there should be no need
494 #to remove/ add any user from/to a slice.
495 #However a user from SFA which is not registered in Senslab yet
496 #should be added to the LDAP.
498 added_user_hrns = set(requested_user_hrns).\
499 difference(set(existing_user_hrns))
501 #self.verify_keys(existing_slice_users, updated_users_list, \
506 for added_user_hrn in added_user_hrns:
507 added_user = users_dict[added_user_hrn]
508 #hrn, type = urn_to_hrn(added_user['urn'])
510 'first_name': added_user.get('first_name', hrn),
511 'last_name': added_user.get('last_name', hrn),
512 'person_id': added_user['person_id'],
513 'peer_person_id': None,
515 'key_ids': added_user.get('key_ids', []),
518 person['person_id'] = self.driver.AddPerson(person)
520 person['peer_person_id'] = added_user['person_id']
521 added_persons.append(person)
524 self.driver.UpdatePerson(person['person_id'], {'enabled': True})
527 #self.driver.AddPersonToSite(added_user_id, login_base)
529 #for key_string in added_user.get('keys', []):
530 #key = {'key':key_string, 'key_type':'ssh'}
531 #key['key_id'] = self.driver.AddPersonKey(person['person_id'], \
533 #person['keys'].append(key)
535 # add the registry record
537 #peer_dict = {'type': 'user', 'hrn': hrn, 'peer_authority': \
539 #'pointer': person['person_id']}
540 #self.registry.register_peer_object(self.credential, peer_dict)
541 #for added_slice_user_hrn in \
542 #added_slice_user_hrns.union(added_user_hrns):
543 #self.driver.AddPersonToSlice(added_slice_user_hrn, \
544 #slice_record['name'])
545 #for added_slice_user_id in \
546 #added_slice_user_ids.union(added_user_ids):
547 # add person to the slice
548 #self.driver.AddPersonToSlice(added_slice_user_id, \
549 #slice_record['name'])
550 # if this is a peer record then it
551 # should already be bound to a peer.
552 # no need to return worry about it getting bound later
557 def verify_keys(self, persons, users, peer, options={}):
560 for person in persons:
561 key_ids.extend(person['key_ids'])
562 keylist = self.driver.GetKeys(key_ids, ['key_id', 'key'])
565 keydict[key['key']] = key['key_id']
566 existing_keys = keydict.keys()
568 for person in persons:
569 persondict[person['email']] = person
575 user_keys = user.get('keys', [])
576 updated_persons.append(user)
577 for key_string in user_keys:
578 requested_keys.append(key_string)
579 if key_string not in existing_keys:
580 key = {'key': key_string, 'key_type': 'ssh'}
583 person = persondict[user['email']]
584 self.driver.UnBindObjectFromPeer('person', \
585 person['person_id'], peer['shortname'])
587 self.driver.AddPersonKey(user['email'], key)
589 key_index = user_keys.index(key['key'])
590 remote_key_id = user['key_ids'][key_index]
591 self.driver.BindObjectToPeer('key', \
592 key['key_id'], peer['shortname'], \
597 self.driver.BindObjectToPeer('person', \
598 person['person_id'], peer['shortname'], \
601 # remove old keys (only if we are not appending)
602 append = options.get('append', True)
604 removed_keys = set(existing_keys).difference(requested_keys)
605 for existing_key_id in keydict:
606 if keydict[existing_key_id] in removed_keys:
609 self.driver.UnBindObjectFromPeer('key', \
610 existing_key_id, peer['shortname'])
611 self.driver.DeleteKey(existing_key_id)
615 #def verify_slice_attributes(self, slice, requested_slice_attributes, \
616 #append=False, admin=False):
617 ## get list of attributes users ar able to manage
618 #filter = {'category': '*slice*'}
620 #filter['|roles'] = ['user']
621 #slice_attributes = self.driver.GetTagTypes(filter)
622 #valid_slice_attribute_names = [attribute['tagname'] \
623 #for attribute in slice_attributes]
625 ## get sliver attributes
626 #added_slice_attributes = []
627 #removed_slice_attributes = []
628 #ignored_slice_attribute_names = []
629 #existing_slice_attributes = self.driver.GetSliceTags({'slice_id': \
632 ## get attributes that should be removed
633 #for slice_tag in existing_slice_attributes:
634 #if slice_tag['tagname'] in ignored_slice_attribute_names:
635 ## If a slice already has a admin only role
636 ## it was probably given to them by an
637 ## admin, so we should ignore it.
638 #ignored_slice_attribute_names.append(slice_tag['tagname'])
640 ## If an existing slice attribute was not
641 ## found in the request it should
643 #attribute_found=False
644 #for requested_attribute in requested_slice_attributes:
645 #if requested_attribute['name'] == slice_tag['tagname'] \
646 #and requested_attribute['value'] == slice_tag['value']:
647 #attribute_found=True
650 #if not attribute_found and not append:
651 #removed_slice_attributes.append(slice_tag)
653 ## get attributes that should be added:
654 #for requested_attribute in requested_slice_attributes:
655 ## if the requested attribute wasn't found we should add it
656 #if requested_attribute['name'] in valid_slice_attribute_names:
657 #attribute_found = False
658 #for existing_attribute in existing_slice_attributes:
659 #if requested_attribute['name'] == \
660 #existing_attribute['tagname'] and \
661 #requested_attribute['value'] == \
662 #existing_attribute['value']:
663 #attribute_found=True
665 #if not attribute_found:
666 #added_slice_attributes.append(requested_attribute)
669 ## remove stale attributes
670 #for attribute in removed_slice_attributes:
672 #self.driver.DeleteSliceTag(attribute['slice_tag_id'])
673 #except Exception, error:
674 #self.logger.warn('Failed to remove sliver attribute. name: \
675 #%s, value: %s, node_id: %s\nCause:%s'\
676 #% (name, value, node_id, str(error)))
678 ## add requested_attributes
679 #for attribute in added_slice_attributes:
681 #self.driver.AddSliceTag(slice['name'], attribute['name'], \
682 #attribute['value'], attribute.get('node_id', None))
683 #except Exception, error:
684 #self.logger.warn('Failed to add sliver attribute. name: %s, \
685 #value: %s, node_id: %s\nCause:%s'\
686 #% (name, value, node_id, str(error)))
688 #def create_slice_aggregate(self, xrn, rspec):
689 #hrn, type = urn_to_hrn(xrn)
690 ## Determine if this is a peer slice
691 #peer = self.get_peer(hrn)
692 #sfa_peer = self.get_sfa_peer(hrn)
695 ## Get the slice record from sfa
696 #slicename = hrn_to_pl_slicename(hrn)
699 #registry = self.api.registries[self.api.hrn]
700 #credential = self.api.getCredential()
702 #site_id, remote_site_id = self.verify_site(registry, \
703 #credential, hrn, peer, sfa_peer)
704 #slice = self.verify_slice(registry, credential, \
705 #hrn, site_id, remote_site_id, peer, sfa_peer)
707 ## find out where this slice is currently running
708 #nodelist = self.driver.GetNodes(slice['node_ids'], ['hostname'])
709 #hostnames = [node['hostname'] for node in nodelist]
711 ## get netspec details
712 #nodespecs = spec.getDictsByTagName('NodeSpec')
714 ## dict in which to store slice attributes to set for the nodes
716 #for nodespec in nodespecs:
717 #if isinstance(nodespec['name'], list):
718 #for nodename in nodespec['name']:
719 #nodes[nodename] = {}
720 #for k in nodespec.keys():
721 #rspec_attribute_value = nodespec[k]
722 #if (self.rspec_to_slice_tag.has_key(k)):
723 #slice_tag_name = self.rspec_to_slice_tag[k]
724 #nodes[nodename][slice_tag_name] = \
725 #rspec_attribute_value
726 #elif isinstance(nodespec['name'], StringTypes):
727 #nodename = nodespec['name']
728 #nodes[nodename] = {}
729 #for k in nodespec.keys():
730 #rspec_attribute_value = nodespec[k]
731 #if (self.rspec_to_slice_tag.has_key(k)):
732 #slice_tag_name = self.rspec_to_slice_tag[k]
733 #nodes[nodename][slice_tag_name] = rspec_attribute_value
735 #for k in nodespec.keys():
736 #rspec_attribute_value = nodespec[k]
737 #if (self.rspec_to_slice_tag.has_key(k)):
738 #slice_tag_name = self.rspec_to_slice_tag[k]
739 #nodes[nodename][slice_tag_name] = rspec_attribute_value
741 #node_names = nodes.keys()
742 ## remove nodes not in rspec
743 #deleted_nodes = list(set(hostnames).difference(node_names))
744 ## add nodes from rspec
745 #added_nodes = list(set(node_names).difference(hostnames))
749 #self.driver.UnBindObjectFromPeer('slice', \
750 #slice['slice_id'], peer)
752 #self.driver.LaunchExperimentOnOAR(slicename, added_nodes)
754 ## Add recognized slice tags
755 #for node_name in node_names:
756 #node = nodes[node_name]
757 #for slice_tag in node.keys():
758 #value = node[slice_tag]
759 #if (isinstance(value, list)):
762 #self.driver.AddSliceTag(slicename, slice_tag, \
765 #self.driver.DeleteSliceFromNodes(slicename, deleted_nodes)
768 #self.driver.BindObjectToPeer('slice', slice['slice_id'], \
769 #peer, slice['peer_slice_id'])