From 280e53abd766fda72f2955006a98075a823ed350 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Sat, 1 Aug 2009 03:45:33 +0000 Subject: [PATCH] added UnBindObjectFromPeer() --- PLC/Methods/UnBindObjectFromPeer.py | 69 +++++++++++++++++++++++++++++ PLC/Methods/__init__.py | 2 + PLC/Peers.py | 68 ++++++++++++++++++++++------ 3 files changed, 125 insertions(+), 14 deletions(-) create mode 100644 PLC/Methods/UnBindObjectFromPeer.py diff --git a/PLC/Methods/UnBindObjectFromPeer.py b/PLC/Methods/UnBindObjectFromPeer.py new file mode 100644 index 0000000..4778ccb --- /dev/null +++ b/PLC/Methods/UnBindObjectFromPeer.py @@ -0,0 +1,69 @@ +# $Id: UnBindObjectFromPeer.py 14587 2009-07-19 13:18:50Z thierry $ +# $URL: svn+ssh://svn.planet-lab.org/svn/PLCAPI/trunk/PLC/Methods/BindObjectToPeer.py $ + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Persons import Persons +from PLC.Sites import Sites +from PLC.Nodes import Nodes +from PLC.Slices import Slices +from PLC.Peers import Peers +from PLC.Faults import * + +class UnBindObjectFromPeer(Method): + """ + This method is a hopefully temporary hack to let the sfa correctly + detach the objects it creates from a remote peer object. This is + needed so that the sfa federation link can work in parallel with + RefreshPeer, as RefreshPeer depends on remote objects being + correctly marked. + + UnBindObjectFromPeer is allowed to admins only. + """ + + roles = ['admin'] + + known_types = ['site','person','slice','node','key'] + types_doc = ",".join(["'%s'"%type for type in known_types]) + + accepts = [ + Auth(), + Parameter(str,"Object type, among "+types_doc), + Parameter(int,"object_id"), + Parameter(str,"peer shortname"), + Parameter(int,"remote object_id, set to 0 if unknown"), + ] + + returns = Parameter (int, '1 if successful') + + def locate_object (self, object_type, object_id): + # locate e.g. the Nodes symbol + class_obj = globals()[object_type.capitalize()+'s'] + id_name=object_type+'_id' + # invoke e.g. Nodes ({'node_id':node_id}) + objs=class_obj(self.api,{id_name:object_id}) + if len(objs) != 1: + raise PLCInvalidArgument,"Cannot locate object, type=%s id=%d"%\ + (type,object_id) + return objs[0] + + + def call(self, auth, object_type, object_id, shortname): + + object_type = object_type.lower() + if object_type not in self.known_types: + raise PLCInvalidArgument, 'Unrecognized object type %s'%object_type + + peers=Peers(self.api,{'shortname':shortname.upper()}) + if len(peers) !=1: + raise PLCInvalidArgument, 'No such peer with shortname %s'%shortname + + peer=peers[0] + object = self.locate_object (object_type, object_id) + remover_name = 'remove_'+object_type + remove_function = getattr(type(peer),remover_name) + remove_function(peer,object) + + return 1 diff --git a/PLC/Methods/__init__.py b/PLC/Methods/__init__.py index 61ad2d1..dc27c96 100644 --- a/PLC/Methods/__init__.py +++ b/PLC/Methods/__init__.py @@ -1,5 +1,6 @@ ## Please use make index to update this file native_methods = """ +BinaryTest AddAddressType AddAddressTypeToAddress AddBootState @@ -154,6 +155,7 @@ system.listMethods system.methodHelp system.methodSignature system.multicall +UnBindObjectFromPeer UpdateAddress UpdateAddressType UpdateConfFile diff --git a/PLC/Peers.py b/PLC/Peers.py index 80265bf..b2cb738 100644 --- a/PLC/Peers.py +++ b/PLC/Peers.py @@ -32,11 +32,11 @@ class Peer(Row): primary_key = 'peer_id' join_tables = ['peer_site', 'peer_person', 'peer_key', 'peer_node', 'peer_slice'] fields = { - 'peer_id': Parameter (int, "Peer identifier"), - 'peername': Parameter (str, "Peer name"), - 'peer_url': Parameter (str, "Peer API URL"), - 'key': Parameter(str, "Peer GPG public key"), - 'cacert': Parameter(str, "Peer SSL public certificate"), + 'peer_id': Parameter (int, "Peer identifier"), + 'peername': Parameter (str, "Peer name"), + 'peer_url': Parameter (str, "Peer API URL"), + 'key': Parameter(str, "Peer GPG public key"), + 'cacert': Parameter(str, "Peer SSL public certificate"), 'shortname' : Parameter(str, "Peer short name"), 'hrn_root' : Parameter(str, "Root of this peer in a hierarchical naming space"), ### cross refs @@ -59,9 +59,9 @@ class Peer(Row): return peername def validate_peer_url(self, url): - """ - Validate URL. Must be HTTPS. - """ + """ + Validate URL. Must be HTTPS. + """ (scheme, netloc, path, params, query, fragment) = urlparse(url) if scheme != "https": @@ -72,11 +72,11 @@ class Peer(Row): return url def delete(self, commit = True): - """ - Deletes this peer and all related entities. - """ + """ + Deletes this peer and all related entities. + """ - assert 'peer_id' in self + assert 'peer_id' in self # Remove all related entities for obj in \ @@ -89,8 +89,8 @@ class Peer(Row): obj.delete(commit = False) # Mark as deleted - self['deleted'] = True - self.sync(commit) + self['deleted'] = True + self.sync(commit) def add_site(self, site, peer_site_id, commit = True): """ @@ -104,6 +104,14 @@ class Peer(Row): 'peer_site_id': peer_site_id}, commit = commit) + def remove_site(self, site, commit = True): + """ + Unassociate a site with this peer. + """ + + remove = Row.remove_object(Site, 'peer_site') + remove(self, site, commit) + def add_person(self, person, peer_person_id, commit = True): """ Associate a local user entry with this peer. @@ -115,6 +123,14 @@ class Peer(Row): 'person_id': person['person_id'], 'peer_person_id': peer_person_id}, commit = commit) + + def remove_person(self, person, commit = True): + """ + Unassociate a site with this peer. + """ + + remove = Row.remove_object(Person, 'peer_person') + remove(self, person, commit) def add_key(self, key, peer_key_id, commit = True): """ @@ -128,6 +144,14 @@ class Peer(Row): 'peer_key_id': peer_key_id}, commit = commit) + def remove_key(self, key, commit = True): + """ + Unassociate a key with this peer. + """ + + remove = Row.remove_object(Key, 'peer_key') + remove(self, key, commit) + def add_node(self, node, peer_node_id, commit = True): """ Associate a local node entry with this peer. @@ -140,6 +164,14 @@ class Peer(Row): 'peer_node_id': peer_node_id}, commit = commit) + def remove_node(self, node, commit = True): + """ + Unassociate a node with this peer. + """ + + remove = Row.remove_object(Node, 'peer_node') + remove(self, node, commit) + def add_slice(self, slice, peer_slice_id, commit = True): """ Associate a local slice entry with this peer. @@ -152,6 +184,14 @@ class Peer(Row): 'peer_slice_id': peer_slice_id}, commit = commit) + def remove_slice(self, slice, commit = True): + """ + Unassociate a slice with this peer. + """ + + remove = Row.remove_object(Slice, 'peer_slice') + remove(self, slice, commit) + def connect(self, **kwds): """ Connect to this peer via XML-RPC. -- 2.43.0