old_contents: # $Id$
  # $URL$
  
  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 BindObjectToPeer(Method):
      """
      This method is a hopefully temporary hack to let the sfa correctly
      attach the objects it creates to 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. 
  
      BindRemoteObjectToPeer 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,remote_object_id):
  
          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)
          adder_name = 'add_'+object_type
          add_function = getattr(type(peer),adder_name)
          add_function(peer,object,remote_object_id)
  
          return 1
  
new_contents: # $Id$
  # $URL$
  
  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 BindObjectToPeer(Method):
      """
      This method is a hopefully temporary hack to let the sfa correctly
      attach the objects it creates to 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. 
  
      BindRemoteObjectToPeer 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,remote_object_id):
  
          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)
          
          # There is no need to continue if the object is already bound to this peer  
          if object['peer_id'] in [peer['peer_id']]:
              return 1
          
          adder_name = 'add_'+object_type
          add_function = getattr(type(peer),adder_name)
          add_function(peer,object,remote_object_id)
  
          return 1
  
subject: check if the object is alredy bound to the peer