(*) slice atttribute types get cached
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 27 Nov 2006 12:18:13 +0000 (12:18 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 27 Nov 2006 12:18:13 +0000 (12:18 +0000)
(*) TestPeers to create custom slice attribute types and slice attributes
(*) new method GetPeerData to allow RefreshPeer to perform
    a single xmlrpc request (overall improvement : x 3 on small deployments)
(*) Cache created with a peer_id rather than with a peer,
    so as to remove a useless dependency (arg check done by RefreshPeer)
(*) caching slice attributes will require another method,
    equality cannot be based on a single column as for other types
    of cached data; ongoing

PLC/Cache.py
PLC/Methods/GetPeerData.py [new file with mode: 0644]
PLC/Methods/RefreshPeer.py
PLC/Methods/__init__.py
PLC/SliceAttributeTypes.py
TestPeers.py
TestPeers.ref
planetlab4.sql

index 97432af..f82248f 100644 (file)
@@ -4,7 +4,7 @@ from PLC.Filter import Filter
 from PLC.Table import Row, Table
 
 verbose_flag=False;
-verbose_flag=True;
+#verbose_flag=True;
 def verbose (*args):
     if verbose_flag:
        print (args)
@@ -31,13 +31,14 @@ class Cache:
     # an attempt to provide genericity in the caching algorithm
     
     # the Peer object we are syncing with
-    def __init__ (self, api, peer, peer_server, auth):
+    def __init__ (self, api, peer_id, peer_server, auth):
 
-       import PLC.Peers
+#      import PLC.Peers
 
        self.api = api
-        assert isinstance(peer,PLC.Peers.Peer)
-        self.peer = peer
+#        assert isinstance(peer,PLC.Peers.Peer)
+#        self.peer = peer
+        self.peer_id = peer_id
        self.peer_server = peer_server
        self.auth = auth
         
@@ -119,10 +120,12 @@ class Cache:
                       classname,
                       alien_object_list,
                      alien_xref_objs_dict = {},
-                      lambda_ignore=lambda x:False):
+                      lambda_ignore=lambda x:False,
+                      report_name_conflicts = True):
         
-        peer = self.peer
-        peer_id = peer['peer_id']
+#        peer = self.peer
+#        peer_id = peer['peer_id']
+        peer_id=self.peer_id
 
        attrs = class_attributes (classname)
        row_class = attrs['row_class']
@@ -178,11 +181,12 @@ class Cache:
                 ### We know about this object already
                 local_object = local_objects_index[object_name]
                if local_object ['peer_id'] is None:
-                   ### xxx send e-mail
-                   print '==================== We are in trouble here'
-                   print 'The %s object named %s is natively defined twice'%(classname,object_name)
-                   print 'Once on this PLC and once on peer %d'%peer_id
-                   print 'We dont raise an exception so that the remaining updates can still take place'
+                    if report_name_conflicts:
+                       ### xxx send e-mail
+                        print '==================== We are in trouble here'
+                        print 'The %s object named %s is natively defined twice'%(classname,object_name)
+                        print 'Once on this PLC and once on peer %d'%peer_id
+                        print 'We dont raise an exception so that the remaining updates can still take place'
                    continue
                 if local_object['peer_id'] != peer_id:
                     ### the object has changed its plc, 
@@ -248,7 +252,7 @@ class Cache:
 
         ### return delta in number of objects 
         return new_count-old_count
-                
+
     def get_locals (self, list):
        return [x for x in list if x['peer_id'] is None]
 
@@ -260,30 +264,47 @@ class Cache:
        # requires to know remote peer's peer_id for ourselves, mmhh..
        # does not make any difference in a 2-peer deployment though
 
+        ### uses GetPeerData to gather all info in a single xmlrpc request
+
+        # xxx see also GetPeerData - peer_id arg unused yet
+        all_data = self.peer_server.GetPeerData (self.auth,0)
+
        # refresh sites
-       all_sites = self.peer_server.GetSites(self.auth)
+       #all_sites = self.peer_server.GetSites(self.auth)
+       all_sites = all_data['Sites']
        local_sites = self.get_locals (all_sites)
        nb_new_sites = self.update_table('Site', local_sites)
 
        # refresh keys
-       all_keys = self.peer_server.GetKeys(self.auth)
+       #all_keys = self.peer_server.GetKeys(self.auth)
+       all_keys = all_data['Keys']
        local_keys = self.get_locals (all_keys)
        nb_new_keys = self.update_table('Key', local_keys)
 
        # refresh nodes
-        all_nodes = self.peer_server.GetNodes(self.auth)
+        #all_nodes = self.peer_server.GetNodes(self.auth)
+        all_nodes = all_data['Nodes']
        local_nodes = self.get_locals(all_nodes)
         nb_new_nodes = self.update_table('Node', local_nodes,
                                         { 'Site' : all_sites } )
 
        # refresh persons
-       all_persons = self.peer_server.GetPersons(self.auth)
+       #all_persons = self.peer_server.GetPersons(self.auth)
+       all_persons = all_data['Persons']
        local_persons = self.get_locals(all_persons)
        nb_new_persons = self.update_table ('Person', local_persons,
                                            { 'Key': all_keys, 'Site' : all_sites } )
 
+        # refresh slice attribute types
+        all_slice_attribute_types = all_data ['SliceAttibuteTypes']
+        local_slice_attribute_types = self.get_locals(all_slice_attribute_types)
+        nb_new_slice_attribute_types = self.update_table ('SliceAttributeType',
+                                                          local_slice_attribute_types,
+                                                          report_name_conflicts = False)
+
        # refresh slices
-        local_slices = self.peer_server.GetSlices(self.auth,{'peer_id':None})
+        #local_slices = self.peer_server.GetSlices(self.auth,{'peer_id':None})
+        local_slices = all_data['Slices']
 
        def is_system_slice (slice):
            return slice['creator_person_id'] == 1
@@ -292,10 +313,13 @@ class Cache:
                                           {'Node': all_nodes, 'Person': all_persons},
                                           is_system_slice)
 
+        ### returned as-is by RefreshPeer
         return {'plcname':self.api.config.PLC_NAME,
                'new_sites':nb_new_sites,
                'new_keys':nb_new_keys,
                 'new_nodes':nb_new_nodes,
                'new_persons':nb_new_persons,
-                'new_slices':nb_new_slices}
+                'new_slice_attribute_types':nb_new_slice_attribute_types,
+                'new_slices':nb_new_slices,
+                }
 
diff --git a/PLC/Methods/GetPeerData.py b/PLC/Methods/GetPeerData.py
new file mode 100644 (file)
index 0000000..da562e1
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Thierry Parmentelat - INRIA
+# 
+
+from PLC.Faults import *
+from PLC.Method import Method
+from PLC.Parameter import Parameter, Mixed
+from PLC.Auth import Auth
+
+from PLC.Peers import Peer, Peers
+
+from PLC.Sites import Site, Sites
+from PLC.Keys import Key, Keys
+from PLC.Nodes import Node, Nodes
+from PLC.Persons import Person, Persons
+from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes
+from PLC.Slices import Slice, Slices
+
+
+class GetPeerData (Method):
+    """
+    Gather all data needed by RefreshPeer in a single xmlrpc request
+
+    Expects a peer id or peer name, that identifies the requesting peer
+    
+    Returns a dict containing, for the various types of cached entities,
+    the local objects as well as the ones attached to that peer
+    """
+
+    roles = ['admin']
+
+    accepts = [Auth(),
+               Parameter (int, "Peer id"),
+               ]
+    # for RefreshPeer 
+    returns = Parameter (dict,"Sites, Keys, Nodes, Persons, Slices")
+
+    def call (self, auth, peer_id):
+        # xxx a peer cannot yet compute it's peer_id under another plc
+        # so we return evrything by now
+        
+        return {
+            'Sites' : Sites (self.api),
+            'Keys' : Keys (self.api),
+            'Nodes' : Nodes (self.api),
+            'Persons' : Persons (self.api),
+            'SliceAttibuteTypes' : SliceAttributeTypes (self.api),
+            'Slices' : Slices (self.api,{'peer_id':None}),
+            }
+        
index 68ea0d6..21ebf0a 100644 (file)
@@ -21,16 +21,20 @@ class RefreshPeer(Method):
     
     Returns a dict containing
     (*) 'plcname' :   the peer name
-    (*) 'new_nodes' : the number of new nodes from that peer - may be negative
-    (*) 'new_slices': the number of new slices from that peer - may be negative
+    (*) 'new_sites':  the number of new sites from that peer - may be negative
+    (*) 'new_keys':    
+    (*) 'new_nodes':   
+    (*) 'new_persons': 
+    (*) 'new_slices':  
     """
     
     roles = ['admin']
     
     accepts = [ Auth(),
-               Parameter (int, "Peer id") ]
+               Parameter (int, "Peer id"),
+                ]
     
-    returns = Parameter(dict, "plcname, new_nodes, new_slices")
+    returns = Parameter(dict, "plcname, new_sites, new_keys, new_nodes, new_persons, new_slices")
 
     def call (self, auth, peer_id):
        
@@ -59,5 +63,5 @@ class RefreshPeer(Method):
               'AuthString' : person['password'],
               'Role' : 'admin' }
 
-       cache = Cache (self.api, peer, apiserver, auth)
+       cache = Cache (self.api, peer_id, apiserver, auth)
        return cache.refresh_peer ()
index 1e491aa..98473dd 100644 (file)
@@ -1 +1 @@
-methods = 'AddAddressType AddAddressTypeToAddress AddBootState AddConfFile AddConfFileToNodeGroup AddConfFileToNode AddKeyType AddMessage AddNetworkMethod AddNetworkType AddNodeGroup AddNodeNetwork AddNode AddNodeToNodeGroup AddNodeToPCU AddPCU AddPeer AddPersonKey AddPerson AddPersonToSite AddPersonToSlice AddRole AddRoleToPerson AddSiteAddress AddSite AddSliceAttribute AddSliceAttributeType AddSliceInstantiation AddSlice AddSliceToNodes AdmAddAddressType AdmAddNodeGroup AdmAddNodeNetwork AdmAddNode AdmAddNodeToNodeGroup AdmAddPersonKey AdmAddPerson AdmAddPersonToSite AdmAddSitePowerControlUnit AdmAddSite AdmAssociateNodeToPowerControlUnitPort AdmAuthCheck AdmDeleteAddressType AdmDeleteAllPersonKeys AdmDeleteNodeGroup AdmDeleteNodeNetwork AdmDeleteNode AdmDeletePersonKeys AdmDeletePerson AdmDeleteSitePowerControlUnit AdmDeleteSite AdmDisassociatePowerControlUnitPort AdmGenerateNodeConfFile AdmGetAllAddressTypes AdmGetAllKeyTypes AdmGetAllNodeNetworks AdmGetAllRoles AdmGetNodeGroupNodes AdmGetNodeGroups AdmGetNodes AdmGetPersonKeys AdmGetPersonRoles AdmGetPersonSites AdmGetPersons AdmGetPowerControlUnitNodes AdmGetPowerControlUnits AdmGetSiteNodes AdmGetSitePersons AdmGetSitePIs AdmGetSitePowerControlUnits AdmGetSites AdmGetSiteTechContacts AdmGrantRoleToPerson AdmIsPersonInRole AdmQueryConfFile AdmQueryNode AdmQueryPerson AdmQueryPowerControlUnit AdmQuerySite AdmRebootNode AdmRemoveNodeFromNodeGroup AdmRemovePersonFromSite AdmRevokeRoleFromPerson AdmSetPersonEnabled AdmSetPersonPrimarySite AdmUpdateNodeGroup AdmUpdateNodeNetwork AdmUpdateNode AdmUpdatePerson AdmUpdateSitePowerControlUnit AdmUpdateSite AuthCheck BlacklistKey BootCheckAuthentication BootGetNodeDetails BootNotifyOwners BootUpdateNode DeleteAddress DeleteAddressTypeFromAddress DeleteAddressType DeleteBootState DeleteConfFileFromNodeGroup DeleteConfFileFromNode DeleteConfFile DeleteKey DeleteKeyType DeleteMessage DeleteNetworkMethod DeleteNetworkType DeleteNodeFromNodeGroup DeleteNodeFromPCU DeleteNodeGroup DeleteNodeNetwork DeleteNode DeletePCU DeletePersonFromSite DeletePersonFromSlice DeletePerson DeleteRoleFromPerson DeleteRole DeleteSession DeleteSite DeleteSliceAttribute DeleteSliceAttributeType DeleteSliceFromNodes DeleteSliceInstantiation DeleteSlice GetAddresses GetAddressTypes GetBootStates GetConfFiles GetEvents GetKeys GetKeyTypes GetMessages GetNetworkMethods GetNetworkTypes GetNodeGroups GetNodeNetworks GetNodes GetPCUs GetPeers GetPersons GetRoles GetSession GetSites GetSliceAttributes GetSliceAttributeTypes GetSliceInstantiations GetSlices GetSlivers RebootNode RefreshPeer SetPersonPrimarySite SliceCreate SliceDelete UpdateAddress UpdateAddressType UpdateConfFile UpdateKey UpdateMessage UpdateNodeGroup UpdateNodeNetwork UpdateNode UpdatePCU UpdatePerson UpdateSite UpdateSliceAttribute UpdateSliceAttributeType UpdateSlice  system.listMethods  system.methodHelp  system.methodSignature  system.multicall'.split()
+methods = 'AddAddressType AddAddressTypeToAddress AddBootState AddConfFile AddConfFileToNodeGroup AddConfFileToNode AddKeyType AddMessage AddNetworkMethod AddNetworkType AddNodeGroup AddNodeNetwork AddNode AddNodeToNodeGroup AddNodeToPCU AddPCU AddPeer AddPersonKey AddPerson AddPersonToSite AddPersonToSlice AddRole AddRoleToPerson AddSiteAddress AddSite AddSliceAttribute AddSliceAttributeType AddSliceInstantiation AddSlice AddSliceToNodes AdmAddAddressType AdmAddNodeGroup AdmAddNodeNetwork AdmAddNode AdmAddNodeToNodeGroup AdmAddPersonKey AdmAddPerson AdmAddPersonToSite AdmAddSitePowerControlUnit AdmAddSite AdmAssociateNodeToPowerControlUnitPort AdmAuthCheck AdmDeleteAddressType AdmDeleteAllPersonKeys AdmDeleteNodeGroup AdmDeleteNodeNetwork AdmDeleteNode AdmDeletePersonKeys AdmDeletePerson AdmDeleteSitePowerControlUnit AdmDeleteSite AdmDisassociatePowerControlUnitPort AdmGenerateNodeConfFile AdmGetAllAddressTypes AdmGetAllKeyTypes AdmGetAllNodeNetworks AdmGetAllRoles AdmGetNodeGroupNodes AdmGetNodeGroups AdmGetNodes AdmGetPersonKeys AdmGetPersonRoles AdmGetPersonSites AdmGetPersons AdmGetPowerControlUnitNodes AdmGetPowerControlUnits AdmGetSiteNodes AdmGetSitePersons AdmGetSitePIs AdmGetSitePowerControlUnits AdmGetSites AdmGetSiteTechContacts AdmGrantRoleToPerson AdmIsPersonInRole AdmQueryConfFile AdmQueryNode AdmQueryPerson AdmQueryPowerControlUnit AdmQuerySite AdmRebootNode AdmRemoveNodeFromNodeGroup AdmRemovePersonFromSite AdmRevokeRoleFromPerson AdmSetPersonEnabled AdmSetPersonPrimarySite AdmUpdateNodeGroup AdmUpdateNodeNetwork AdmUpdateNode AdmUpdatePerson AdmUpdateSitePowerControlUnit AdmUpdateSite AuthCheck BlacklistKey BootCheckAuthentication BootGetNodeDetails BootNotifyOwners BootUpdateNode DeleteAddress DeleteAddressTypeFromAddress DeleteAddressType DeleteBootState DeleteConfFileFromNodeGroup DeleteConfFileFromNode DeleteConfFile DeleteKey DeleteKeyType DeleteMessage DeleteNetworkMethod DeleteNetworkType DeleteNodeFromNodeGroup DeleteNodeFromPCU DeleteNodeGroup DeleteNodeNetwork DeleteNode DeletePCU DeletePersonFromSite DeletePersonFromSlice DeletePerson DeleteRoleFromPerson DeleteRole DeleteSession DeleteSite DeleteSliceAttribute DeleteSliceAttributeType DeleteSliceFromNodes DeleteSliceInstantiation DeleteSlice GetAddresses GetAddressTypes GetBootStates GetConfFiles GetEvents GetKeys GetKeyTypes GetMessages GetNetworkMethods GetNetworkTypes GetNodeGroups GetNodeNetworks GetNodes GetPCUs GetPeerData GetPeers GetPersons GetRoles GetSession GetSites GetSliceAttributes GetSliceAttributeTypes GetSliceInstantiations GetSlices GetSlivers RebootNode RefreshPeer SetPersonPrimarySite SliceCreate SliceDelete UpdateAddress UpdateAddressType UpdateConfFile UpdateKey UpdateMessage UpdateNodeGroup UpdateNodeNetwork UpdateNode UpdatePCU UpdatePerson UpdateSite UpdateSliceAttribute UpdateSliceAttributeType UpdateSlice  system.listMethods  system.methodHelp  system.methodSignature  system.multicall'.split()
index 4fa0ff8..f3817ef 100644 (file)
@@ -20,8 +20,14 @@ class SliceAttributeType(Row):
         'name': Parameter(str, "Slice attribute type name", max = 100),
         'description': Parameter(str, "Slice attribute type description", max = 254),
         'min_role_id': Parameter(int, "Minimum (least powerful) role that can set or change this attribute"),
+        'peer_id': Parameter(int, "Peer at which this node is managed", nullok = True),
         }
 
+    # for Cache
+    class_key = 'name'
+    foreign_fields = ['description','min_role_id']
+    foreign_xrefs = {}
+
     def validate_name(self, name):
         if not len(name):
             raise PLCInvalidArgument, "Slice attribute type name must be set"
index 2eafb56..a99e7d1 100755 (executable)
 ###
 ##############################
 
+### xxx todo
+# check sites
+# check persons
+
 # support reloading without wiping everything off
 # dunno how to do (defvar plc)
 
@@ -162,6 +166,9 @@ def slice_name (i,n):
     site_index=map_on_site(n)
     return "%s_slice%d"%(site_login_base(i,site_index),n)
 
+def sat_name (i):
+    return 'sat_%d'%i
+
 # to have indexes start at 1
 def myrange (n):
     return range (1,n+1,1)
@@ -172,12 +179,16 @@ def message (*args):
     
 ##########
 def timer_start ():
-    global epoch
+    global epoch,last_time
     epoch = time.time()
+    last_time=epoch
     print '+++ timer start'
 
 def timer_show ():
-    print '+++ %.02f seconds ellapsed'%(time.time()-epoch)
+    global last_time
+    now=time.time()
+    print '+++ %.02f seconds ellapsed (%.02f)'%(now-epoch,now-last_time)
+    last_time=now
 
 ####################
 def test00_init (args=[1,2]):
@@ -535,9 +546,6 @@ def clean_all_slices (args=[1,2]):
                 print '%02d:==== Cleaning slice %d'%(i,slice_id)
                 s[i].DeleteSlice(a[i],slice_id)
 
-def get_local_slice_id (i,name):
-    return s[i].GetSlices(a[i],{'name':[name],'peer_id':None})[0]['slice_id']
-
 def test04_slice (args=[1,2]):
     for n in myrange(number_slices):
        test04_slice_n (n,args)
@@ -574,7 +582,7 @@ def test04_node_slice_ns (ns,is_local, add_if_true, args=[1,2]):
 def test04_node_slice_nl_n (nnl,ns,is_local, add_if_true, args=[1,2]):
     for i in args:
         peer=peer_index(i)
-        slice_id = get_local_slice_id (i,slice_name (i,ns))
+        sname = slice_name (i,ns)
         
         if is_local:
             hostnames=[node_name(i,nn) for nn in nnl]
@@ -583,12 +591,12 @@ def test04_node_slice_nl_n (nnl,ns,is_local, add_if_true, args=[1,2]):
             hostnames=[node_name(peer,nn) for nn in nnl]
             nodetype='foreign'
         if add_if_true:
-            s[i].AddSliceToNodes (a[i], slice_id,hostnames)
+            s[i].AddSliceToNodes (a[i], sname,hostnames)
             message="added"
         else:
-            s[i].DeleteSliceFromNodes (a[i], slice_id,hostnames)
+            s[i].DeleteSliceFromNodes (a[i], sname,hostnames)
             message="deleted"
-        print '%02d:== %s in slice %d %s '%(i,message,slice_id,nodetype),
+        print '%02d:== %s in slice %s %s '%(i,message,sname,nodetype),
         print hostnames
 
 def test04_slice_add_lnode (args=[1,2]):
@@ -603,6 +611,54 @@ def test04_slice_del_lnode (args=[1,2]):
 def test04_slice_del_fnode (args=[1,2]):
     test04_node_slice (False,False,args)
 
+####################
+def test05_sat (args=[1,2]):
+    for i in args:
+        name = sat_name(i)
+        try:
+            sat_id=s[i].GetSliceAttributeTypes (a[i],[name])[0]
+        except:
+            description="custom sat on plc%d"%i
+            min_role_id=10
+            sat_id=s[i].AddSliceAttributeType (a[i],
+                                               { 'name':name,
+                                                 'description': description,
+                                                 'min_role_id' : min_role_id})
+            print '%02d:== created SliceAttributeType = %d'%(i,sat_id)
+
+# for test, we create 4 slice_attributes
+# on slice1 - sat=custom_made (see above) - all nodes
+# on slice1 - sat=custom_made (see above) - node=n1
+# on slice1 - sat='net_max' - all nodes
+# on slice1 - sat='net_max' - node=n1
+
+def test05_sa_atom (slice_name,sat_name,value,node,i):
+    sa_id=s[i].GetSliceAttributes(a[i],{'name':sat_name,
+                                        'value':value})
+    if not sa_id:
+        if node:
+            sa_id=s[i].AddSliceAttribute(a[i],
+                                         slice_name,
+                                         sat_name,
+                                         value,
+                                         node)
+        else:
+            print 'slice_name',slice_name,'sat_name',sat_name
+            sa_id=s[i].AddSliceAttribute(a[i],
+                                         slice_name,
+                                         sat_name,
+                                         value)
+            print '%02d:== created SliceAttribute = %d'%(i,sa_id),
+            print 'On slice',slice_name,'and node',node
+        
+def test05_sa (args=[1,2]):
+    for i in args:
+        test05_sa_atom (slice_name(i,1),sat_name(i),'custom sat/all nodes',None,i)
+        test05_sa_atom (slice_name(i,1),sat_name(i),'custom sat/node1',node_name(i,1),i)
+        test05_sa_atom (slice_name(i,1),'net_max','predefined sat/all nodes',None,i)
+        test05_sa_atom (slice_name(i,1),'net_max','predefined sat/node1',node_name(i,1),i)
+        
+
 ####################
 def test_all_init ():
     message ("INIT")
@@ -748,6 +804,10 @@ def test_all_slices ():
     test_all_addslices ()
     test_all_delslices ()
     
+def test_all_sats ():
+    test05_sat ()
+    test00_refresh("after SliceAttributeType creation")                   
+
 def test_all ():
     test_all_init ()
     timer_show()
@@ -759,6 +819,8 @@ def test_all ():
     timer_show()
     test_all_slices ()
     timer_show()
+    test_all_sats ()
+    timer_show()
     message("END")
 
 ### ad hoc test sequences
@@ -768,10 +830,12 @@ def populate ():
     test02_person()
     test03_node()
     test04_slice([1])
-    test00_refresh ("populate: refreshing peer 1",[1])
     test04_slice_add_lnode([1])
-    test04_slice_add_fnode([1])
-    test00_refresh("populate: refresh all")
+    test05_sat()
+    test05_sa([1])
+#    test00_refresh ("populate: refreshing peer 1",[1])
+#    test04_slice_add_fnode([1])
+#    test00_refresh("populate: refresh all")
 
 def test_now ():
     test_all_init()
index 45cf2b8..a9b4525 100644 (file)
@@ -27,7 +27,7 @@ Attempting to set passwd for person_id=4 in DB1UPDATE 1
  -> system returns 0
 Attempting to set passwd for person_id=4 in DB2UPDATE 1
  -> system returns 0
-+++ 19 seconds ellapsed
++++ 13.24 seconds ellapsed (13.24)
 01:== Created site 2 with max_slices=4
 02:== Created site 2 with max_slices=4
 01:== Created site 3 with max_slices=4
@@ -37,18 +37,18 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 01:== Created site 5 with max_slices=4
 02:== Created site 5 with max_slices=4
 === refresh after site creation
-+++ 39 seconds ellapsed
++++ 24.84 seconds ellapsed (11.61)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 4, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 1, 'new_nodes': 0}
-+++ 44 seconds ellapsed
++++ 27.08 seconds ellapsed (2.24)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 4, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 1, 'new_nodes': 0}
-+++ 50 seconds ellapsed
-+++ 50 seconds ellapsed
++++ 28.53 seconds ellapsed (1.45)
++++ 28.53 seconds ellapsed (0.00)
 === refresh before persons&keys creation
-+++ 56 seconds ellapsed
++++ 32.29 seconds ellapsed (3.76)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 62 seconds ellapsed
++++ 34.52 seconds ellapsed (2.23)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 67 seconds ellapsed
++++ 36.07 seconds ellapsed (1.55)
 01: Checking keys: got 0 local (e=0) & 0 foreign (e=0)
 02: Checking keys: got 0 local (e=0) & 0 foreign (e=0)
 01: Checking persons: got 4 local (e=4) & 1 foreign (e=1)
@@ -100,25 +100,25 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 01: Checking persons: got 8 local (e=8) & 1 foreign (e=1)
 02: Checking persons: got 8 local (e=8) & 1 foreign (e=1)
 === refresh after persons&keys creation
-+++ 117 seconds ellapsed
++++ 58.93 seconds ellapsed (22.86)
 01:== Refreshing peer got  {'new_keys': 8, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 4, 'new_nodes': 0}
-+++ 123 seconds ellapsed
++++ 61.32 seconds ellapsed (2.39)
 02:== Refreshing peer got  {'new_keys': 8, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 4, 'new_nodes': 0}
-+++ 129 seconds ellapsed
++++ 63.01 seconds ellapsed (1.70)
 01: Checking keys: got 8 local (e=8) & 8 foreign (e=8)
 02: Checking keys: got 8 local (e=8) & 8 foreign (e=8)
 01: Checking persons: got 8 local (e=8) & 5 foreign (e=5)
 02: Checking persons: got 8 local (e=8) & 5 foreign (e=5)
-+++ 134 seconds ellapsed
++++ 65.41 seconds ellapsed (2.40)
 ==================== ('RESETTING NODES',)
 01:== Cleaning all nodes
 02:== Cleaning all nodes
 === refresh cleaned nodes
-+++ 135 seconds ellapsed
++++ 66.35 seconds ellapsed (0.94)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 142 seconds ellapsed
++++ 68.67 seconds ellapsed (2.32)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 147 seconds ellapsed
++++ 70.77 seconds ellapsed (2.10)
 01: Checking nodes: got 0 local (e=0) & 0 foreign (e=0)
 02: Checking nodes: got 0 local (e=0) & 0 foreign (e=0)
 ==================== ('CREATING NODES',)
@@ -135,11 +135,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 01: Checking nodes: got 5 local (e=5) & 0 foreign (e=0)
 02: Checking nodes: got 5 local (e=5) & 0 foreign (e=0)
 === refresh after node creation
-+++ 168 seconds ellapsed
++++ 82.39 seconds ellapsed (11.63)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 5}
-+++ 176 seconds ellapsed
++++ 84.92 seconds ellapsed (2.53)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 5}
-+++ 182 seconds ellapsed
++++ 86.84 seconds ellapsed (1.92)
 01: Checking nodes: got 5 local (e=5) & 5 foreign (e=5)
 02: Checking nodes: got 5 local (e=5) & 5 foreign (e=5)
 02:== Deleted node 1, returns 1
@@ -170,11 +170,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 02:== Deleted node 20, returns 1
 02: Checking nodes: got 0 local (e=0) & 5 foreign (e=5)
 === refresh after deletion on plc2
-+++ 224 seconds ellapsed
++++ 94.94 seconds ellapsed (8.09)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': -5}
-+++ 231 seconds ellapsed
++++ 97.35 seconds ellapsed (2.42)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 237 seconds ellapsed
++++ 99.28 seconds ellapsed (1.93)
 01: Checking nodes: got 5 local (e=5) & 0 foreign (e=0)
 02: Checking nodes: got 0 local (e=0) & 5 foreign (e=5)
 ==================== ('ADD on plc2 for different indexes',)
@@ -186,14 +186,14 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 01: Checking nodes: got 5 local (e=5) & 0 foreign (e=0)
 02: Checking nodes: got 5 local (e=5) & 5 foreign (e=5)
 === refresh after re-creation on plc2
-+++ 247 seconds ellapsed
++++ 102.83 seconds ellapsed (3.54)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 5}
-+++ 254 seconds ellapsed
++++ 105.35 seconds ellapsed (2.52)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 260 seconds ellapsed
++++ 107.23 seconds ellapsed (1.88)
 01: Checking nodes: got 5 local (e=5) & 5 foreign (e=5)
 02: Checking nodes: got 5 local (e=5) & 5 foreign (e=5)
-+++ 262 seconds ellapsed
++++ 108.51 seconds ellapsed (1.28)
 ==================== ('RESETTING SLICES TEST',)
 01:== Cleaning all nodes
 01:==== Cleaning node 1
@@ -222,11 +222,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 02:== Cleaning all slices
 02:==== Cleaning slice 3
 === refresh After slices init
-+++ 293 seconds ellapsed
++++ 125.98 seconds ellapsed (17.47)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 300 seconds ellapsed
++++ 128.52 seconds ellapsed (2.54)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 306 seconds ellapsed
++++ 130.38 seconds ellapsed (1.85)
 ==================== ('CREATING SLICES on plc1',)
 01:== created slice 4 - max nodes=5
 01:== Attached person user1-1@plc1.org to slice oneone_slice1
@@ -251,11 +251,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 01: Checking slices: got 6 local (e=6) & 0 foreign (e=0)
 02: Checking slices: got 2 local (e=2) & 0 foreign (e=0)
 === refresh after slice created on plc1
-+++ 334 seconds ellapsed
++++ 152.20 seconds ellapsed (21.82)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 343 seconds ellapsed
++++ 154.71 seconds ellapsed (2.51)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 4, 'new_persons': 0, 'new_nodes': 0}
-+++ 350 seconds ellapsed
++++ 156.64 seconds ellapsed (1.93)
 01: Checking slices: got 6 local (e=6) & 0 foreign (e=0)
 02: Checking slices: got 2 local (e=2) & 4 foreign (e=4)
 01: local slice oneone_slice1 (e=0)  on nodes  []
@@ -284,11 +284,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 02: foreign slice onethree_slice3 (e=0)  on nodes  []
 02: foreign slice onefour_slice4 (e=0)  on nodes  []
 === refresh After local nodes were added on plc1
-+++ 390 seconds ellapsed
++++ 181.07 seconds ellapsed (24.44)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 397 seconds ellapsed
++++ 183.59 seconds ellapsed (2.52)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 403 seconds ellapsed
++++ 185.52 seconds ellapsed (1.93)
 01: local slice oneone_slice1 (e=5)  on nodes  [16, 17, 18, 19, 20]
 [LOC:5] :  n101.plc1.org  n102.plc1.org  n103.plc1.org  n104.plc1.org  n105.plc1.org  
 01: local slice onetwo_slice2 (e=5)  on nodes  [16, 17, 18, 19, 20]
@@ -331,11 +331,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 02: foreign slice onefour_slice4 (e=5)  on nodes  [8, 9, 10, 6, 7]
 [FOR:5] :  n101.plc1.org  n102.plc1.org  n103.plc1.org  n104.plc1.org  n105.plc1.org  
 === refresh After foreign nodes were added in plc1
-+++ 444 seconds ellapsed
++++ 209.31 seconds ellapsed (23.79)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 451 seconds ellapsed
++++ 211.86 seconds ellapsed (2.55)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 457 seconds ellapsed
++++ 213.88 seconds ellapsed (2.02)
 01: local slice oneone_slice1 (e=10)  on nodes  [16, 17, 18, 19, 20, 11, 12, 13, 14, 15]
 [LOC:5] :  n101.plc1.org  n102.plc1.org  n103.plc1.org  n104.plc1.org  n105.plc1.org  
 [FOR:5] :  n201.plc2.org  n202.plc2.org  n203.plc2.org  n204.plc2.org  n205.plc2.org  
@@ -653,11 +653,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
    'name': 'onefour_slice4',
    'slice_id': 7}
 === refresh After foreign nodes were removed on plc1
-+++ 507 seconds ellapsed
++++ 240.71 seconds ellapsed (26.83)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 514 seconds ellapsed
++++ 243.24 seconds ellapsed (2.53)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 520 seconds ellapsed
++++ 245.17 seconds ellapsed (1.93)
 01: local slice oneone_slice1 (e=5)  on nodes  [16, 17, 18, 19, 20]
 [LOC:5] :  n101.plc1.org  n102.plc1.org  n103.plc1.org  n104.plc1.org  n105.plc1.org  
 01: local slice onetwo_slice2 (e=5)  on nodes  [16, 17, 18, 19, 20]
@@ -692,11 +692,11 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 02: foreign slice onefour_slice4 (e=5)  on nodes  [8, 9, 10, 6, 7]
 [FOR:5] :  n101.plc1.org  n102.plc1.org  n103.plc1.org  n104.plc1.org  n105.plc1.org  
 === refresh After local nodes were removed on plc1
-+++ 558 seconds ellapsed
++++ 267.60 seconds ellapsed (22.43)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 564 seconds ellapsed
++++ 270.09 seconds ellapsed (2.49)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 571 seconds ellapsed
++++ 272.02 seconds ellapsed (1.92)
 01: local slice oneone_slice1 (e=0)  on nodes  []
 01: local slice onetwo_slice2 (e=0)  on nodes  []
 01: local slice onethree_slice3 (e=0)  on nodes  []
@@ -714,12 +714,12 @@ Attempting to set passwd for person_id=4 in DB2UPDATE 1
 01: Checking slices: got 2 local (e=2) & 0 foreign (e=0)
 02: Checking slices: got 2 local (e=2) & 4 foreign (e=4)
 === refresh After slices clenaup
-+++ 593 seconds ellapsed
++++ 286.11 seconds ellapsed (14.09)
 01:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc1', 'new_slices': 0, 'new_persons': 0, 'new_nodes': 0}
-+++ 600 seconds ellapsed
++++ 288.65 seconds ellapsed (2.54)
 02:== Refreshing peer got  {'new_keys': 0, 'new_sites': 0, 'plcname': 'Thierry plc2 on devbox', 'new_slices': -4, 'new_persons': 0, 'new_nodes': 0}
-+++ 606 seconds ellapsed
++++ 290.56 seconds ellapsed (1.91)
 01: Checking slices: got 2 local (e=2) & 0 foreign (e=0)
 02: Checking slices: got 2 local (e=2) & 0 foreign (e=0)
-+++ 609 seconds ellapsed
++++ 292.44 seconds ellapsed (1.88)
 ==================== ('END',)
index 2b3b4c3..3b26965 100644 (file)
@@ -9,7 +9,7 @@
 --
 -- Copyright (C) 2006 The Trustees of Princeton University
 --
--- $Id: planetlab4.sql,v 1.44 2006/11/24 12:05:59 thierry Exp $
+-- $Id: planetlab4.sql,v 1.45 2006/11/25 09:35:36 thierry Exp $
 --
 
 --------------------------------------------------------------------------------
@@ -639,7 +639,9 @@ CREATE TABLE slice_attribute_types (
     attribute_type_id serial PRIMARY KEY, -- Attribute type identifier
     name text UNIQUE NOT NULL, -- Attribute name
     description text, -- Attribute description
-    min_role_id integer REFERENCES roles DEFAULT 10 -- If set, minimum (least powerful) role that can set or change this attribute
+    min_role_id integer REFERENCES roles DEFAULT 10, -- If set, minimum (least powerful) role that can set or change this attribute
+    peer_id integer REFERENCES peers -- From which peer 
 ) WITH OIDS;
 
 -- Slice/sliver attributes
@@ -648,7 +650,9 @@ CREATE TABLE slice_attribute (
     slice_id integer REFERENCES slices NOT NULL, -- Slice identifier
     node_id integer REFERENCES nodes, -- Sliver attribute if set
     attribute_type_id integer REFERENCES slice_attribute_types NOT NULL, -- Attribute type identifier
-    value text
+    value text,
+
+    peer_id integer REFERENCES peers -- From which peer 
 ) WITH OIDS;
 CREATE INDEX slice_attribute_slice_id_idx ON slice_attribute (slice_id);
 CREATE INDEX slice_attribute_node_id_idx ON slice_attribute (node_id);