support for nodegroups, several nodenetworks and related settings
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 14 Jan 2008 11:10:52 +0000 (11:10 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 14 Jan 2008 11:10:52 +0000 (11:10 +0000)
system/TestMain.py
system/TestNode.py
system/TestPlc.py
system/config_wifilab.py [new file with mode: 0644]

index b079031..8e89782 100755 (executable)
@@ -13,8 +13,8 @@ from TestNode import TestNode
 default_config = [ 'onelab' ]
 
 default_steps = ['uninstall','install','configure', 'start', 'store_keys', 'initscripts', 
-                 'sites', 'nodes', 'slices',  
-                 'bootcd', 'start_nodes', 'check_nodes', 'check_slices' ]
+                 'sites', 'nodes', 'slices', 'bootcd',  
+                 'nodegroups', 'start_nodes', 'check_nodes', 'check_slices' ]
 other_steps = [ 'fresh_install', 'stop', 'install_vserver_create', 'install_vserver_native',
                 'clean_sites', 'clean_nodes', 'clean_slices', 'clean_keys',
                 'stop_nodes' ,  'db_dump' , 'db_restore',
index 5ebdba6..7924798 100644 (file)
@@ -18,15 +18,36 @@ class TestNode:
         ownername = self.node_spec['owner']
         user_spec = self.test_site.locate_user(ownername)
         test_user = TestUser(self.test_plc,self.test_site,user_spec)
-        auth = test_user.auth()
+        userauth = test_user.auth()
         utils.header("node %s created by user %s"%(self.name(),test_user.name()))
-        filter={'boot_state':'rins'}
-        self.test_plc.server.AddNode(auth,
-                                     self.test_site.site_spec['site_fields']['login_base'],
-                                     self.node_spec['node_fields'])
-        self.test_plc.server.AddNodeNetwork(auth,self.name(),
+        rootauth=self.test_plc.auth_root()
+        server = self.test_plc.server
+        server.AddNode(userauth,
+                       self.test_site.site_spec['site_fields']['login_base'],
+                       self.node_spec['node_fields'])
+        # create as reinstall to avoid user confirmation
+        server.UpdateNode(userauth, self.name(), {'boot_state':'rins'})
+        # populate network interfaces - primary
+        server.AddNodeNetwork(userauth,self.name(),
                                             self.node_spec['network_fields'])
-        self.test_plc.server.UpdateNode(auth, self.name(), filter)
+        # populate network interfaces - others
+        if self.node_spec.has_key('extra_interfaces'):
+            for interface in self.node_spec['extra_interfaces']:
+                server.AddNodeNetwork(userauth,self.name(),
+                                                    interface['network_fields'])
+                if interface.has_key('attributes'):
+                    for (attribute,value) in interface['attributes'].iteritems():
+                        # locate node network
+                        nn = server.GetNodeNetworks(userauth,{'ip':interface['network_fields']['ip']})[0]
+                        nnid=nn['nodenetwork_id']
+                        # locate or create node network attribute type
+                        try:
+                            nnst = server.GetNodeNetworkSettingTypes(userauth,{'name':attribute})[0]
+                        except:
+                            nnst = server.AddNodeNetworkSettingType(rootauth,{'category':'test',
+                                                                          'name':attribute})
+                        # attach value
+                        server.AddNodeNetworkSetting(userauth,nnid,attribute,value)
 
     def delete_node (self):
         # uses the right auth as far as poss.
@@ -84,5 +105,3 @@ class TestNode:
 
     def start_qemu (self, options):
         utils.header ("TestNode.start_qemu: not implemented yet")
-
-        
index e5e1012..42ccafc 100644 (file)
@@ -239,6 +239,30 @@ class TestPlc:
                     test_node.create_node ()
         return True
 
+    # create nodegroups if needed, and populate
+    # no need for a clean_nodegroups if we are careful enough
+    def nodegroups (self, options):
+        # 1st pass to scan contents
+        groups_dict = {}
+        for site_spec in self.plc_spec['sites']:
+            test_site = TestSite (self,site_spec)
+            for node_spec in site_spec['nodes']:
+                test_node=TestNode (self,test_site,node_spec)
+                if node_spec.has_key('nodegroups'):
+                    for nodegroupname in node_spec['nodegroups']:
+                        if not groups_dict.has_key(nodegroupname):
+                            groups_dict[nodegroupname]=[]
+                        groups_dict[nodegroupname].append(test_node.name())
+        auth=self.auth_root()
+        for (nodegroupname,group_nodes) in groups_dict.iteritems():
+            try:
+                self.server.GetNodeGroups(auth,{'name':nodegroupname})[0]
+            except:
+                self.server.AddNodeGroup(auth,{'name':nodegroupname})
+            for node in group_nodes:
+                self.server.AddNodeToNodeGroup(auth,node,nodegroupname)
+        return True
+
     def bootcd (self, options):
         for site_spec in self.plc_spec['sites']:
             test_site = TestSite (self,site_spec)
diff --git a/system/config_wifilab.py b/system/config_wifilab.py
new file mode 100644 (file)
index 0000000..449f8ab
--- /dev/null
@@ -0,0 +1,180 @@
+# a configuration module is expected:
+# (*) to define a config method
+# (*) that takes two arguments
+#     (**) the current set of plc_specs as output by the preceding config modules
+#     (**) TestMain options field
+# (*) and that returns the new set of plc_specs
+
+onelab="one-lab.org"
+
+# use a model that contains "vmware" to get the node actually started
+def nodes():
+    return [ {'node_fields': {'hostname': 'wlab02.inria.fr',
+                              'model':'Dell Latitude 830'},
+              'owner' : 'pi',
+              'nodegroups' : 'wireless',
+              'network_fields': { 'method':'dhcp',
+                                  'type' : 'ipv4',
+                                  'ip':'138.96.250.162',
+                                  },
+              'extra_interfaces' : [ { 'network_fields' : 
+                                       { 'method' : 'dhcp',
+                                         'type' : 'ipv4',
+                                         'ip' : '138.96.250.50' },
+                                       'attributes' : 
+                                       { 'ssid' : 'guest-inria-sophia' },
+                                       },
+                                     ],
+              },
+             ]
+
+def all_nodenames ():
+    return [ node['node_fields']['hostname'] for node in nodes()]
+
+def users (domain=onelab) :
+    return [ {'name' : 'pi', 'keynames' : [ 'key1' ],
+              'user_fields' : {'first_name':'PI', 'last_name':'PI',
+                               'enabled':'True',
+                               'email':'fake-pi1@%s'%domain,
+                               'password':'testpi'},
+              'roles':['pi']},
+             {'name' : 'tech', 'keynames' : [ 'key1' ],
+              'user_fields' : {'first_name':'Tech', 'last_name':'Tech',
+                               'enabled':'true',
+                               'email':'fake-tech1@%s'%domain,
+                               'password':'testtech'},
+              'roles':['tech']},
+             {'name':'user', 'keynames' : [ 'key1' ],
+              'user_fields' : {'first_name':'User', 'last_name':'User',
+                               'enabled':'true',
+                               'email':'fake-user1@%s'%domain,
+                               'password':'testuser'},
+              'roles':['user']},
+             {'name':'techuser', 'keynames' : [ 'key1' ],
+              'user_fields' : {'first_name':'UserTech', 'last_name':'UserTech',
+                               'enabled':'true',
+                               'email':'fake-tech2@%s'%domain,
+                               'password':'testusertech'},
+              'roles':['tech','user']},
+             {'name':'pitech', 'keynames' : [ 'key1' ],
+              'user_fields' : {'first_name':'PiTech',
+                               'last_name':'PiTech',
+                               'enabled':'true',
+                               'email':'fake-pi2@%s'%domain,
+                               'password':'testusertech'},
+              'roles':['pi','tech']},
+             ]
+
+def all_usernames ():
+    return [ user['name'] for user in users()]
+
+def sites ():
+    return [ {'site_fields' : {'name':'wifisite',
+                               'login_base':'wifi',
+                               'abbreviated_name':'wifi',
+                               'max_slices':100,
+                               'url':'http://onelab-test.inria.fr',
+                               },
+              'address_fields' : {'line1':'route des lucioles',
+                                  'city':'sophia',
+                                  'state':'fr',
+                                  'postalcode':'06902',
+                                  'country':'france',
+                                  },
+              'users' : users(),
+              'nodes': nodes(),
+            }]
+
+##########
+public_key="""ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4jNj8yT9ieEc6nSJz/ESu4fui9WrJ2y/MCfqIZ5WcdVKhBFUYyIenmUaeTduMcSqvoYRQ4QnFR1BFdLG8XR9D6FWZ5zTKUgpkew22EVNeqai4IXeWYKyt1Qf3ehaz9E3o1PG/bmQNIM6aQay6TD1Y4lqXI+eTVXVQev4K2fixySjFQpp9RB4UHbeA8c28yoa/cgAYHqCqlvm9uvpGMjgm/Qa4M+ZeO7NdjowfaF/wF4BQIzVFN9YRhvQ/d8WDz84B5Pr0J7pWpaX7EyC4bvdskxl6kmdNIwIRcIe4OcuIiX5Z9oO+7h/chsEVJWF4vqNIYlL9Zvyhnr0hLLhhuk2bw== root@test.one-lab.org
+"""
+private_key="""-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEA4jNj8yT9ieEc6nSJz/ESu4fui9WrJ2y/MCfqIZ5WcdVKhBFU
+YyIenmUaeTduMcSqvoYRQ4QnFR1BFdLG8XR9D6FWZ5zTKUgpkew22EVNeqai4IXe
+WYKyt1Qf3ehaz9E3o1PG/bmQNIM6aQay6TD1Y4lqXI+eTVXVQev4K2fixySjFQpp
+9RB4UHbeA8c28yoa/cgAYHqCqlvm9uvpGMjgm/Qa4M+ZeO7NdjowfaF/wF4BQIzV
+FN9YRhvQ/d8WDz84B5Pr0J7pWpaX7EyC4bvdskxl6kmdNIwIRcIe4OcuIiX5Z9oO
++7h/chsEVJWF4vqNIYlL9Zvyhnr0hLLhhuk2bwIBIwKCAQATY32Yf4NyN93oNd/t
+QIyTuzG0NuLI3W95J/4gI4PAnUDmv6glwRiRO92ynlnnAjqFW/LZ5sGFd4k8YoYU
+sjaa8JJgpwrJBi9y6Fx47/9Tp+ITPqyoliyTXvtqysX0jkaY+I1mNHoTITDkbknZ
+eTma0UOhiKcrMz4qOMwg+kajWsAhIplJXyf0Mio/XuyqjMT4wI/NyGZQ4bGuUjO7
+gj3p+9psOvONsRBW4MV27W5ts9c7HEXg+VJ2PSCEMs+uyzXcdnMJcTb4zQ/+tVxR
+5IMeEuR9ZzDNkDtNF6Nnw5kYcTBNoayzZbUfjcuSmsMklMXr0qJ4qcW9/ONKgBQ9
+6qhDAoGBAPkvSYuF/bxwatEiUKyF97oGDe025h/58aqK1VBD5/BBVqqvbQOeNtR5
+/LerGfFa5D9Jm+6U97gDdq3tH0j95Mo0F00LWq2+vp7U4DTQsiddepzNdbcvSrzT
+NVZ2cnOAlKTHO4hGggShm04n/M5LOzkHtI5TLcIJjw4b5iiIw9EtAoGBAOhjLTds
+Zz8UbXVTeGv8yBGhnjAeHQ5WISN6V5KenB4GIyaYCCcQUOUGqc5nCttlnPLv/GHp
+4DOJ2/0KbwDEwk7HbAtXG2Tv1OkmfcOq9RH19V9lyqynA+zvI6taisCEaMvBlafd
+k+RgXsR+NdLs96RakKt4BtgpuuADoSIryQ+LAoGBAKremNSzpq0Z4tiMjxc3Ssiz
+scc7lnxTnmZQkkWq6C+3xmZpqdaYYByra3ahNlxblTK2IcgroozPLM8I/4KCNnwG
+dmC3VB9eOZF8B3SsXOfLEj+i1GBa8WuJg6kAw4JmzFO70Qz9JfSMErk//c9Jh7IT
+6YYqaIUN3nATIXrhcFTrAoGAVlC5BfUQZ+MEFaKpEiqwthd1RRJ/0h/9rhd/nNvT
+lh+JZhs2OmUlXGGPhy2WUX2DcC1AfCOrC9Qego7YxcVsvizQW/vIWLDaDXSyXp6V
+ilQKrmejDO2Tvmdzpguv4Rs83fdyGcdUMEENQas4kCwhd49aTlEnHRbQYdV2XSY0
+vKECgYEAlhYzfSswIF2h5/hGDLETxgNJ2kD0HIZYh7aud6X6aEYNdJopbfbEhifU
+vTbf8GtvERDoxWEsk9Qp7km8xXfKWdcZtqIwsSmn/ri5d7iyvpIk591YIHSY0dr2
+BO+VyPNWF+kDNI8mSUwi7jLW6liMdhNOmDaSX0+0X8CHtK898xM=
+-----END RSA PRIVATE KEY-----
+"""
+
+def keys ():
+    return [ {'name': 'key1',
+              'private' : private_key,
+              'key_fields' : {'key_type':'ssh',
+                              'key': public_key}}
+             ]
+
+def initscripts(): 
+    return [ { 'initscript_fields' : { 'enabled' : True,
+                                       'name':'script1',
+                                       'script' : '#! /bin/sh\n (echo Starting test initscript: Stage 1; date) > /tmp/initscript1.log \n ',
+                                       }},
+             { 'initscript_fields' : { 'enabled' : True,
+                                       'name':'script2',
+                                       'script' : '#! /bin/sh\n (echo Starting test initscript: Stage 2; date) > /tmp/initscript2.log \n ',
+                                       }},
+             ]
+
+def slices ():
+    return [ { 'slice_fields': {'name':'wifi_slice1',
+                                'instantiation':'plc-instantiated',
+                                'url':'http://foo@foo.com',
+                                'description':'test slice',
+                                'max_nodes':2
+                                },
+               'usernames' : [ 'pi','tech','techuser' ],
+               'nodenames' : all_nodenames(),
+               'initscriptname' : 'script1',
+               'sitename' : 'wifi',
+               'owner' : 'pi',
+               },
+             ]
+
+def plc () :
+    return { 
+        'name' : 'onelab',
+        # as of yet, not sure we can handle foreign hosts, but this is required though
+        'hostname' : 'localhost',
+        # set these two items to run within a vserver
+        # 'vservername': '138.96.250.131'
+        # 'vserverip': '138.96.250.131'
+        'role' : 'root',
+        'PLC_ROOT_USER' : 'root@test.one-lab.org',
+        'PLC_ROOT_PASSWORD' : 'test++',
+        'PLC_NAME' : 'TestLab',
+        'PLC_MAIL_ENABLED':'true',
+        'PLC_MAIL_SUPPORT_ADDRESS' : 'mohamed-amine.chaoui@sophia.inria.fr',
+        'PLC_DB_HOST' : 'test.one-lab.org',
+        'PLC_API_HOST' : 'test.one-lab.org',
+        'PLC_WWW_HOST' : 'test.one-lab.org',
+        'PLC_BOOT_HOST' : 'test.one-lab.org',
+        'PLC_NET_DNS1' : '138.96.0.10',
+        'PLC_NET_DNS2' : '138.96.0.11',
+        'sites' : sites(),
+        'keys' : keys(),
+        'initscripts': initscripts(),
+        'slices' : slices(),
+    }
+
+def config (plc_specs,options):
+    return plc_specs + [ plc() ]