backported stress test to 4.2
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 23 Sep 2008 18:58:32 +0000 (18:58 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 23 Sep 2008 18:58:32 +0000 (18:58 +0000)
system/plcsh-stress-test.py

index c69fe90..a3ba07e 100755 (executable)
@@ -5,7 +5,7 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id: plcsh-stress-test.py 9524 2008-06-03 10:56:47Z thierry $
+# $Id: plcsh-stress-test.py 9505 2008-05-30 14:02:27Z thierry $
 #
 
 from pprint import pprint
@@ -135,15 +135,11 @@ def random_key(key_types):
         'key': randkey()
         }
 
-def random_tag_type (role_ids):
-    return  {'tagname': randstr(12),
-             'category':randstr(8),
-             'min_role_id': random.sample(role_ids, 1)[0],
-             'description' : randstr(128),
-             }
-
 def random_nodegroup():
-    return {'groupname' : randstr(50) }
+    return {
+        'name': randstr(50),
+#        'description': randstr(200),
+        }
 
 def random_node(boot_states):
     return {
@@ -173,9 +169,6 @@ def random_interface(method, type):
 
     return interface_fields
 
-def random_ilink ():
-    return randstr (12)
-
 def random_pcu():
     return {
         'hostname': randhostname(),
@@ -202,6 +195,13 @@ def random_conf_file():
         'always_update': bool(randint()),
         }
 
+def random_attribute_type(role_ids):
+    return {
+        'name': randstr(100),
+        'description': randstr(254),
+        'min_role_id': random.sample(role_ids, 1)[0],
+        }
+
 def random_slice(login_base):
     return {
         'name': login_base + "_" + randstr(11, letters).lower(),
@@ -216,13 +216,12 @@ class Test:
         'addresses_per_site': 1,
         'persons_per_site': 1,
         'keys_per_person': 1,
-        'slice_attributes': 1,
         'nodegroups': 1,
         'nodes_per_site': 1,
         'interfaces_per_node': 1,
-        'ilinks':1,
         'pcus_per_site': 1,
         'conf_files': 1,
+        'attribute_types': 1,
         'slices_per_site': 1,
         'attributes_per_slice': 1,
         }
@@ -231,39 +230,35 @@ class Test:
         'sites': 10,
         'address_types': 2,
         'addresses_per_site': 2,
-        'persons_per_site': 4,
+        'persons_per_site': 10,
         'keys_per_person': 2,
-        'slice_attributes': 10,
-        'nodegroups': 10,
+        # we're using a single tag so a given node can only be in a single nodegroup
+        'nodegroups': 1,
         'nodes_per_site': 2,
         'interfaces_per_node': 1,
-        'ilinks': 20,
         'pcus_per_site': 1,
         'conf_files': 10,
-        'slices_per_site': 4,
+        'attribute_types': 10,
+        'slices_per_site': 10,
         'attributes_per_slice': 2,
         }
 
-    def __init__(self, api, check = True, verbose = True, preserve = False):
+    def __init__(self, api, check = True, verbose = True):
         self.api = api
         self.check = check
         self.verbose = verbose
-        self.preserve = preserve
         
         self.site_ids = []
         self.address_type_ids = []
         self.address_ids = []
         self.person_ids = []
         self.key_ids = []
-        self.slice_type_ids = []
-        self.nodegroup_type_ids = []
-        self.ilink_type_ids = []
         self.nodegroup_ids = []
         self.node_ids = []
         self.interface_ids = []
-        self.ilink_ids = []
         self.pcu_ids = []
         self.conf_file_ids = []
+        self.attribute_type_ids = []
         self.slice_ids = []
         self.slice_attribute_ids = []
 
@@ -281,10 +276,7 @@ class Test:
 
         self.Add(**kwds)
         self.Update()
-        if self.preserve:
-            print 'Preserving - delete skipped'
-        else:
-            self.Delete()
+        self.Delete()
 
     def Add(self, **kwds):
         """
@@ -303,13 +295,12 @@ class Test:
         self.AddAddresses(params['addresses_per_site'])
         self.AddPersons(params['persons_per_site'])
         self.AddKeys(params['keys_per_person'])
-        self.AddTagTypes(params['slice_attributes'],params['nodegroups'],params['ilinks'])
         self.AddNodeGroups(params['nodegroups'])
         self.AddNodes(params['nodes_per_site'])
         self.AddInterfaces(params['interfaces_per_node'])
-        self.AddIlinks (params['ilinks'])
         self.AddPCUs(params['pcus_per_site'])
         self.AddConfFiles(params['conf_files'])
+        self.AddSliceAttributeTypes(params['attribute_types'])
         self.AddSlices(params['slices_per_site'])
         self.AddSliceAttributes(params['attributes_per_slice'])
 
@@ -319,28 +310,26 @@ class Test:
         self.UpdateAddresses()
         self.UpdatePersons()
         self.UpdateKeys()
-        self.UpdateTagTypes()
         self.UpdateNodeGroups()
         self.UpdateNodes()
         self.UpdateInterfaces()
-        self.UpdateIlinks()
         self.UpdatePCUs()
         self.UpdateConfFiles()
+        self.UpdateSliceAttributeTypes()
         self.UpdateSlices()
         self.UpdateSliceAttributes()
 
     def Delete(self):
         self.DeleteSliceAttributes()
         self.DeleteSlices()
+        self.DeleteSliceAttributeTypes()
         self.DeleteKeys()
         self.DeleteConfFiles()
         self.DeletePCUs()
-        self.DeleteIlinks()
         self.DeleteInterfaces()
         self.DeleteNodes()
         self.DeletePersons()
         self.DeleteNodeGroups()
-        self.DeleteTagTypes()
         self.DeleteAddresses()
         self.DeleteAddressTypes()
         self.DeleteSites()
@@ -779,20 +768,16 @@ class Test:
 
         self.key_ids = []
 
+    # this assumes the default node tag types in db-config are visible
     def AddNodeGroups(self, n = 10):
         """
         Add a number of random node groups.
         """
 
         for i in range(n):
-            # locate tag type
-            tag_type_id = self.nodegroup_type_ids[i]
-            tagname=self.api.GetTagTypes([tag_type_id])[0]['tagname']
-            
             # Add node group
-            groupname = random_nodegroup() ['groupname']
-            tagvalue = 'yes'
-            nodegroup_id = self.api.AddNodeGroup(groupname, tagname, tagvalue)
+            nodegroup_fields = random_nodegroup()
+            nodegroup_id = self.api.AddNodeGroup(nodegroup_fields)
 
             # Should return a unique nodegroup_id
             assert nodegroup_id not in self.nodegroup_ids
@@ -801,9 +786,8 @@ class Test:
             if self.check:
                 # Check node group
                 nodegroup = self.api.GetNodeGroups([nodegroup_id])[0]
-                assert nodegroup['groupname'] == groupname
-                assert nodegroup['tagname'] == tagname
-                assert nodegroup['tagvalue'] == tagvalue
+                for field in nodegroup_fields:
+                    assert nodegroup[field] == nodegroup_fields[field]
 
             if self.verbose:
                 print "Added node group", nodegroup_id
@@ -814,10 +798,7 @@ class Test:
         """
 
         for nodegroup_id in self.nodegroup_ids:
-            # Update nodegroup
-            groupname = random_nodegroup()['groupname']
-            # cannot change tagname
-            nodegroup_fields = { 'groupname':groupname }
+            nodegroup_fields = random_nodegroup()
             self.api.UpdateNodeGroup(nodegroup_id, nodegroup_fields)
 
             if self.check:
@@ -872,8 +853,7 @@ class Test:
                 # Add to a random set of node groups
                 nodegroup_ids = random.sample(self.nodegroup_ids, randint(0, len(self.nodegroup_ids)))
                 for nodegroup_id in nodegroup_ids:
-                    tagname = self.api.GetNodeGroups([nodegroup_id])[0]['tagname']
-                    self.api.AddNodeTag( node_id, tagname, 'yes' )
+                    self.api.AddNodeToNodeGroup(node_id, nodegroup_id)
 
                 if self.check:
                     # Check node
@@ -903,23 +883,9 @@ class Test:
             # Add to a random set of node groups
             nodegroup_ids = random.sample(self.nodegroup_ids, randint(0, len(self.nodegroup_ids)))
             for nodegroup_id in (set(nodegroup_ids) - set(node['nodegroup_ids'])):
-                nodegroup = self.api.GetNodeGroups([nodegroup_id])[0]
-                tagname = nodegroup['tagname']
-                node_tags = self.api.GetNodeTags({'node_id':node_id,'tagname':tagname})
-                if not node_tags:
-                    self.api.AddNodeTag(node_id,tagname,'yes')
-                else:
-                    node_tag=node_tags[0]
-                    self.api.UpdateNodeTag(node_tag['node_tag_id'],'yes')
+                self.api.AddNodeToNodeGroup(node_id, nodegroup_id)
             for nodegroup_id in (set(node['nodegroup_ids']) - set(nodegroup_ids)):
-                nodegroup = self.api.GetNodeGroups([nodegroup_id])[0]
-                tagname = nodegroup['tagname']
-                node_tags = self.api.GetNodeTags({'node_id':node_id,'tagname':tagname})
-                if not node_tags:
-                    self.api.AddNodeTag(node_id,tagname,'no')
-                else:
-                    node_tag=node_tags[0]
-                    self.api.UpdateNodeTag(node_tag['node_tag_id'],'no')
+                self.api.DeleteNodeFromNodeGroup(node_id, nodegroup_id)
 
             if self.check:
                 # Check node
@@ -930,6 +896,7 @@ class Test:
 
             if self.verbose:
                 print "Updated node", node_id
+                print "Added node", node_id, "to node groups", nodegroup_ids
 
     def DeleteNodes(self):
         """
@@ -939,8 +906,8 @@ class Test:
         for node_id in self.node_ids:
             # Remove from node groups
             node = self.api.GetNodes([node_id])[0]
-            for node_tag in GetNodeTags ( {'node_id': node_id} ):
-                self.api.UpdateNodeTag(node_tag['node_tag_id'],'')
+            for nodegroup_id in node['nodegroup_ids']:
+                self.api.DeleteNodeFromNodeGroup(node_id, nodegroup_id)
 
             if self.check:
                 node = self.api.GetNodes([node_id])[0]
@@ -977,22 +944,22 @@ class Test:
                 method = random.sample(network_methods, 1)[0]
                 type = random.sample(network_types, 1)[0]
 
-                # Add interface
+                # Add node network
                 interface_fields = random_interface(method, type)
-                interface_id = self.api.AddInterface(node_id, interface_fields)
+                interface_id = self.api.AddNodeNetwork(node_id, interface_fields)
 
                 # Should return a unique interface_id
                 assert interface_id not in self.interface_ids
                 self.interface_ids.append(interface_id)
 
                 if self.check:
-                    # Check interface
+                    # Check node network
                     interface = self.api.GetInterfaces([interface_id])[0]
                     for field in interface_fields:
                         assert interface[field] == interface_fields[field]
 
                 if self.verbose:
-                    print "Added interface", interface_id, "to node", node_id
+                    print "Added node network", interface_id, "to node", node_id
 
     def UpdateInterfaces(self):
         """
@@ -1013,7 +980,7 @@ class Test:
 
             # Update interface
             interface_fields = random_interface(method, type)
-            self.api.UpdateInterface(interface_id, interface_fields)
+            self.api.UpdateNodeNetwork(interface_id, interface_fields)
 
             if self.check:
                 # Check interface
@@ -1022,7 +989,7 @@ class Test:
                     assert interface[field] == interface_fields[field]
 
             if self.verbose:
-                print "Updated interface", interface_id
+                print "Updated node network", interface_id
 
     def DeleteInterfaces(self):
         """
@@ -1030,71 +997,18 @@ class Test:
         """
 
         for interface_id in self.interface_ids:
-            self.api.DeleteInterface(interface_id)
+            self.api.DeleteNodeNetwork(interface_id)
 
             if self.check:
                 assert not self.api.GetInterfaces([interface_id])
 
             if self.verbose:
-                print "Deleted interface", interface_id
+                print "Deleted node network", interface_id
 
         if self.check:
             assert not self.api.GetInterfaces(self.interface_ids)
 
         self.interface_ids = []
-        
-    def AddIlinks (self, n):
-        """
-        Add random links between interfaces.
-        """
-
-        for i in range (n):
-            src = random.sample(self.interface_ids,1)[0]
-            dst = random.sample(self.interface_ids,1)[0]
-            ilink_id = self.api.AddIlink (src,dst,
-                                          self.ilink_type_ids[i],
-                                          random_ilink())
-
-            assert ilink_id not in self.ilink_ids
-            self.ilink_ids.append(ilink_id)
-
-            if self.verbose:
-                print 'Added Ilink',ilink_id,' - attached interface',src,'to',dst
-
-            if self.check:
-                retrieve=GetIlinks({'src_interface_id':src,'dst_interface_id':dst,
-                                    'tag_type_id':self.ilink_type_ids[i]})
-                assert ilink_id==retrieve[0]['ilink_id']
-
-
-    def UpdateIlinks (self):
-
-        for ilink_id in self.ilink_ids:
-            new_value=random_ilink()
-            self.api.UpdateIlink(ilink_id,new_value)
-
-            if self.check:
-                ilink=self.api.GetIlinks([ilink_id])[0]
-                assert ilink['value'] == new_value
-
-            if self.verbose:
-                print 'Updated Ilink',ilink_id
-
-    def DeleteIlinks (self):
-        for ilink_id in self.ilink_ids:
-            self.api.DeleteIlink(ilink_id)
-
-            if self.check:
-                assert not self.api.GetIlinks({'ilink_id':ilink_id})
-
-            if self.verbose:
-                print 'Deleted Ilink',ilink_id
-
-        if self.check:
-            assert not self.api.GetIlinks(self.ilink_ids)
-
-        self.ilink_ids = []
-
 
     def AddPCUs(self, per_site = 1):
         """
@@ -1274,10 +1188,9 @@ class Test:
 
         self.conf_file_ids = []
 
-    def AddTagTypes(self,n_sa,n_ng,n_il):
+    def AddSliceAttributeTypes(self, n = 10):
         """
-        Add as many tag types as there are nodegroups, 
-        will use tagvalue=yes for each nodegroup
+        Add a number of random slice attribute types.
         """
 
         roles = self.api.GetRoles()
@@ -1285,30 +1198,24 @@ class Test:
             raise Exception, "No roles"
         role_ids = [role['role_id'] for role in roles]
 
-        for i in range (n_sa + n_ng + n_il):
-            tag_type_fields = random_tag_type (role_ids)
-            tag_type_id = self.api.AddTagType (tag_type_fields)
+        for i in range(n):
+            attribute_type_fields = random_attribute_type(role_ids)
+            attribute_type_id = self.api.AddSliceAttributeType(attribute_type_fields)
 
-            assert tag_type_id not in \
-                self.slice_type_ids + \
-                self.nodegroup_type_ids + \
-                self.ilink_type_ids
-            
-            if i < n_sa:
-                self.slice_type_ids.append(tag_type_id)
-            elif i < n_sa+n_ng :
-                self.nodegroup_type_ids.append(tag_type_id)
-            else:
-                self.ilink_type_ids.append(tag_type_id)
+            # Should return a unique attribute_type_id
+            assert attribute_type_id not in self.attribute_type_ids
+            self.attribute_type_ids.append(attribute_type_id)
 
             if self.check:
-                tag_type = self.api.GetTagTypes([tag_type_id])[0]
-                for field in tag_type_fields:
-                    assert tag_type[field] == tag_type_fields[field]
+                # Check slice attribute type
+                attribute_type = self.api.GetSliceAttributeTypes([attribute_type_id])[0]
+                for field in attribute_type_fields:
+                    assert attribute_type[field] == attribute_type_fields[field]
+
             if self.verbose:
-                print "Updated slice attribute type", tag_type_id
+                print "Added slice attribute type", attribute_type_id
 
-    def UpdateTagTypes(self):
+    def UpdateSliceAttributeTypes(self):
         """
         Make random changes to any slice attribute types we may have added.
         """
@@ -1318,38 +1225,38 @@ class Test:
             raise Exception, "No roles"
         role_ids = [role['role_id'] for role in roles]
 
-        for tag_type_id in self.slice_type_ids + self.nodegroup_type_ids + self.ilink_type_ids:
+        for attribute_type_id in self.attribute_type_ids:
             # Update slice attribute type
-            tag_type_fields = random_tag_type(role_ids)
-            self.api.UpdateTagType(tag_type_id, tag_type_fields)
+            attribute_type_fields = random_attribute_type(role_ids)
+            self.api.UpdateSliceAttributeType(attribute_type_id, attribute_type_fields)
 
             if self.check:
                 # Check slice attribute type
-                tag_type = self.api.GetTagTypes([tag_type_id])[0]
-                for field in tag_type_fields:
-                    assert tag_type[field] == tag_type_fields[field]
+                attribute_type = self.api.GetSliceAttributeTypes([attribute_type_id])[0]
+                for field in attribute_type_fields:
+                    assert attribute_type[field] == attribute_type_fields[field]
+
             if self.verbose:
-                print "Updated slice attribute type", tag_type_id
+                print "Updated slice attribute type", attribute_type_id
 
-    def DeleteTagTypes(self):
+    def DeleteSliceAttributeTypes(self):
         """
         Delete any random slice attribute types we may have added.
         """
 
-        for tag_type_id in self.slice_type_ids + self.nodegroup_type_ids + self.ilink_type_ids:
-            self.api.DeleteTagType(tag_type_id)
+        for attribute_type_id in self.attribute_type_ids:
+            self.api.DeleteSliceAttributeType(attribute_type_id)
 
             if self.check:
-                assert not self.api.GetTagTypes([tag_type_id])
+                assert not self.api.GetSliceAttributeTypes([attribute_type_id])
 
             if self.verbose:
-                print "Deleted slice attribute type", tag_type_id
+                print "Deleted slice attribute type", attribute_type_id
 
         if self.check:
-            assert not self.api.GetTagTypes(self.slice_type_ids+self.nodegroup_type_ids+self.ilink_type_ids)
+            assert not self.api.GetSliceAttributeTypes(self.attribute_type_ids)
 
-        self.slice_type_ids = []
-        self.nodegroup_type_ids = []
+        self.attribute_type_ids = []
 
     def AddSlices(self, per_site = 10):
         """
@@ -1456,7 +1363,7 @@ class Test:
         Add a number of random slices per site.
         """
 
-        if not self.slice_type_ids:
+        if not self.attribute_type_ids:
             return
 
         for slice_id in self.slice_ids:
@@ -1464,7 +1371,7 @@ class Test:
 
             for i in range(per_slice):
                 # Set a random slice/sliver attribute
-                for tag_type_id in random.sample(self.slice_type_ids, 1):
+                for attribute_type_id in random.sample(self.attribute_type_ids, 1):
                     value = randstr(16, letters + '_' + digits)
                     # Make it a sliver attribute with 50% probability
                     if slice['node_ids']:
@@ -1474,9 +1381,9 @@ class Test:
 
                     # Add slice attribute
                     if node_id is None:
-                        slice_attribute_id = self.api.AddSliceAttribute(slice_id, tag_type_id, value)
+                        slice_attribute_id = self.api.AddSliceAttribute(slice_id, attribute_type_id, value)
                     else:
-                        slice_attribute_id = self.api.AddSliceAttribute(slice_id, tag_type_id, value, node_id)
+                        slice_attribute_id = self.api.AddSliceAttribute(slice_id, attribute_type_id, value, node_id)
 
                     # Should return a unique slice_attribute_id
                     assert slice_attribute_id not in self.slice_attribute_ids
@@ -1485,11 +1392,11 @@ class Test:
                     if self.check:
                         # Check slice attribute
                         slice_attribute = self.api.GetSliceAttributes([slice_attribute_id])[0]
-                        for field in 'tag_type_id', 'slice_id', 'node_id', 'slice_attribute_id', 'value':
+                        for field in 'attribute_type_id', 'slice_id', 'node_id', 'slice_attribute_id', 'value':
                             assert slice_attribute[field] == locals()[field]
 
                     if self.verbose:
-                        print "Added slice attribute", slice_attribute_id, "of type", tag_type_id,
+                        print "Added slice attribute", slice_attribute_id, "of type", attribute_type_id,
                         if node_id is not None:
                             print "to node", node_id,
                         print
@@ -1536,16 +1443,13 @@ def main():
                       help = "Check most actions (default: %default)")
     parser.add_option("-q", "--quiet", action = "store_true", default = False, 
                       help = "Be quiet (default: %default)")
-    parser.add_option("-p","--preserve", action="store_true", default =False,
-                      help = "Do not delete created objects")
     parser.add_option("-t", "--tiny", action = "store_true", default = False, 
                       help = "Run a tiny test (default: %default)")
     (options, args) = parser.parse_args()
 
     test = Test(api = Shell(),
                 check = options.check,
-                verbose = not options.quiet,
-                preserve = options.preserve)
+                verbose = not options.quiet)
 
     if options.tiny:
         params = Test.tiny