Merge branch 'master' into exp2
[sfa.git] / tests / testInterfaces.py
index af50596..4d49d08 100755 (executable)
@@ -1,22 +1,29 @@
 #!/usr/bin/python
 import sys
 import os
-import sfa.util.xmlrpcprotocol as xmlrpc
+import random
+import string
 import unittest
+import sfa.util.xmlrpcprotocol as xmlrpc
 from unittest import TestCase
 from optparse import OptionParser
 from sfa.util.xmlrpcprotocol import ServerException
-from sfa.util.namespace import *
+from sfa.util.xrn import get_authority
 from sfa.util.config import *
 from sfa.trust.certificate import *
+from sfa.trust.credential import *
+from sfa.util.sfaticket import *
+from sfa.util.rspec import *
 from sfa.client import sfi
 
+def random_string(size):
+    return "".join(random.sample(string.letters, size))
+
 class Client:
     registry = None
     aggregate = None
     sm = None
     cm = None
-    user = None
     key = None
     cert = None
     credential = None
@@ -42,29 +49,29 @@ class Client:
         self.aggregate = xmlrpc.get_server(SFI_AGGREGATE, key_file, cert_file)
         self.sm = xmlrpc.get_server(config.SFI_SM, key_file, cert_file)
         self.cm = xmlrpc.get_server(SFI_CM, key_file, cert_file)
-        self.user = config.SFI_USER
+        self.hrn = config.SFI_USER
         # XX defaulting to user, but this should be configurable so we can
         # test from components persepctive
         self.type = 'user'
+        self.credential = self.get_credential(self.hrn)
         
     def get_credential(self, hrn = None, type = 'user'):
-        if not hrn: hrn = self.user 
-        if hrn == self.user:
+        if not hrn: hrn = self.hrn 
+        if hrn == self.hrn:
             cert = self.cert.save_to_string(save_parents=True)
             request_hash = self.key.compute_hash([cert, 'user', hrn])
-            self.credential = self.registry.get_self_credential(cert, type, hrn, request_hash)
-            return self.credential
+            credential = self.registry.get_self_credential(cert, type, hrn, request_hash)
+            return credential
         else:
             if not self.credential:
-                self.get_credential(self.user, 'user')
+                self.credential = self.get_credential(self.hrn, 'user')
             return self.registry.get_credential(self.credential, type, hrn)     
 
-       
-
 class BasicTestCase(unittest.TestCase):
-    def __init__(self, testname, client):
+    def __init__(self, testname, client, test_slice=None):
         unittest.TestCase.__init__(self, testname)
         self.client = client
+        self.slice = test_slice
     
     def setUp(self):
         self.registry = self.client.registry
@@ -72,7 +79,7 @@ class BasicTestCase(unittest.TestCase):
         self.sm = self.client.sm
         self.cm = self.client.cm
         self.credential = self.client.credential
-        self.hrn = self.client.user
+        self.hrn = self.client.hrn
         self.type = self.client.type  
                 
 # Registry tests
@@ -85,29 +92,72 @@ class RegistryTest(BasicTestCase):
         BasicTestCase.setUp(self)
 
     def testGetSelfCredential(self):
-        self.client.get_credential()
+        cred = self.client.get_credential()
+        # this will raise an openssl error if the credential string isnt valid
+        Credential(string=cred)
 
     def testRegister(self):
-        assert True 
+        authority = get_authority(self.hrn)
+        auth_cred = self.client.get_credential(authority, 'authority')
+        auth_record = {'hrn': '.'.join([authority, random_string(10).lower()]),
+                       'type': 'authority'}
+        node_record = {'hrn': '.'.join([authority, random_string(10)]),
+                       'type': 'node',
+                       'hostname': random_string(6) + '.' + random_string(6)}
+        slice_record = {'hrn': '.'.join([authority, random_string(10)]),
+                        'type': 'slice', 'researcher': [self.hrn]}
+        user_record = {'hrn': '.'.join([authority, random_string(10)]),
+                       'type': 'user',
+                       'email': random_string(6) +'@'+ random_string(5) +'.'+ random_string(3),
+                       'first_name': random_string(7),
+                       'last_name': random_string(7)}
+
+        all_records = [auth_record, node_record, slice_record, user_record]
+        for record in all_records:
+            try:
+                self.registry.register(auth_cred, record)
+                self.registry.resolve(self.credential, record['hrn'])
+            except:
+                raise
+            finally:
+                try: self.registry.remove(auth_cred, record['type'], record['hrn'])
+                except: pass
+
     
     def testRegisterPeerObject(self):
         assert True
    
     def testUpdate(self):
-        assert True
+        authority = get_authority(self.hrn)
+        auth_cred = self.client.get_credential(authority, 'authority')
+        records = self.registry.resolve(self.credential, self.hrn)
+        if not records: assert False
+        record = records[0]
+        self.registry.update(auth_cred, record) 
 
     def testResolve(self):
+        authority = get_authority(self.hrn)
         self.registry.resolve(self.credential, self.hrn)
-        assert True
    
     def testRemove(self):
-        assert True
+        authority = get_authority(self.hrn)
+        auth_cred = self.client.get_credential(authority, 'authority')
+        record = {'hrn': ".".join([authority, random_string(10)]),
+                       'type': 'slice'}
+        self.registry.register(auth_cred, record)
+        self.registry.remove(auth_cred, record['type'], record['hrn'])
+        # should generate an exception
+        try:
+            self.registry.resolve(self.credential,  record['hrn'])
+            assert False
+        except:       
+            assert True
  
     def testRemovePeerObject(self):
         assert True
 
     def testList(self):
-        authority = get_authority(self.client.user)
+        authority = get_authority(self.client.hrn)
         self.registry.list(self.credential, authority)
              
     def testGetRegistries(self):
@@ -128,58 +178,94 @@ class RegistryTest(BasicTestCase):
             if self.type in ['user'] and not server_exception:
                 assert False
             
-            
-
 
 class AggregateTest(BasicTestCase):
-    def setup(self):
+    def setUp(self):
         BasicTestCase.setUp(self)
-
+        
     def testGetSlices(self):
-        self.aggregate.get_slices(self.credential)
+        self.aggregate.ListSlices(self.credential)
 
     def testGetResources(self):
-        self.aggregate.get_resources(self.credential)
+        # available resources
+        agg_rspec = self.aggregate.get_resources(self.credential)
+        # resources used by a slice
+        slice_rspec = self.aggregate.get_resources(self.credential, self.slice['hrn'])
+        # will raise an exception if the rspec isnt valid
+        RSpec(xml=agg_rspec)
+        RSpec(xml=slice_rspec)
 
     def testCreateSlice(self):
-        assert True
+        # get availabel resources   
+        rspec = self.aggregate.get_resources(self.credential)
+        slice_credential = self.client.get_credential(self.slice['hrn'], 'slice')
+        self.aggregate.CreateSliver(slice_credential, self.slice['hrn'], rspec)
 
     def testDeleteSlice(self):
-        assert True
+        slice_credential = self.client.get_credential(self.slice['hrn'], 'slice')
+        self.aggregate.DeleteSliver(slice_credential, self.slice['hrn'],"call-id-delete-slice")
 
     def testGetTicket(self):
-        assert True
+        slice_credential = self.client.get_credential(self.slice['hrn'], 'slice')
+        rspec = self.aggregate.get_resources(self.credential)
+        ticket = self.aggregate.get_ticket(slice_credential, self.slice['hrn'], rspec)
+        # will raise an exception if the ticket inst valid
+        SfaTicket(string=ticket)        
 
 class SlicemgrTest(AggregateTest):
-    def setup(self):
+    def setUp(self):
         AggregateTest.setUp(self)
+        
+        # force calls to go through slice manager   
+        self.aggregate = self.sm
+
+        # get the slice credential
+        
 
 class ComponentTest(BasicTestCase):
-    def setup(self):
+    def setUp(self):
         BasicTestCase.setUp(self)
+        self.slice_cred = self.client.get_credential(self.slice['hrn'], 'slice')
 
     def testStartSlice(self):
-        assert True
+        self.cm.start_slice(self.slice_cred, self.slice['hrn'])
 
     def testStopSlice(self):
-        assert True
+        self.cm.stop_slice(self.slice_cred, self.slice['hrn'])
 
     def testDeleteSlice(self):
-        assert True
+        self.cm.DeleteSliver(self.slice_cred, self.slice['hrn'],"call-id-delete-slice-cm")
 
     def testRestartSlice(self):
-        assert True
+        self.cm.restart_slice(self.slice_cred, self.slice['hrn'])
 
     def testGetSlices(self):
-        assert True        
+        self.cm.ListSlices(self.slice_cred, self.slice['hrn'])
 
     def testRedeemTicket(self):
-        assert True
+        rspec = self.aggregate.get_resources(self.credential)
+        ticket = self.aggregate.get_ticket(slice_cred, self.slice['hrn'], rspec)
+        self.cm.redeem_ticket(slice_cred, ticket)
 
 
 def test_names(testcase):
     return [name for name in dir(testcase) if name.startswith('test')]
+
+def CreateSliver(client):
+    # register a slice that will be used for some test
+    authority = get_authority(client.hrn)
+    auth_cred = client.get_credential(authority, 'authority')
+    slice_record = {'hrn': ".".join([authority, random_string(10)]),
+                    'type': 'slice', 'researcher': [client.hrn]}
+    client.registry.register(auth_cred, slice_record)
+    return  slice_record
  
+def DeleteSliver(client, slice):
+    authority = get_authority(client.hrn)
+    auth_cred = client.get_credential(authority, 'authority')
+    if slice:
+        client.registry.remove(auth_cred, 'slice', slice['hrn'])
+    
 if __name__ == '__main__':
 
     args = sys.argv
@@ -205,8 +291,12 @@ if __name__ == '__main__':
     options, args = parser.parse_args()
     suite = unittest.TestSuite()
     client = Client(options)
-    # bootstrap the users credential
-    client.get_credential()
+    test_slice = {}
+    
+    # create the test slice if necessary
+    if options.all or options.slicemgr or options.aggregate \
+       or options.component:
+        test_slice = CreateSliver(client)
 
     if options.registry or options.all:
         for name in test_names(RegistryTest):
@@ -214,15 +304,18 @@ if __name__ == '__main__':
 
     if options.aggregate or options.all: 
         for name in test_names(AggregateTest):
-            suite.addTest(AggregateTest(name, client))
+            suite.addTest(AggregateTest(name, client, test_slice))
 
     if options.slicemgr or options.all: 
         for name in test_names(SlicemgrTest):
-            suite.addTest(SlicemgrTest(name, client))
+            suite.addTest(SlicemgrTest(name, client, test_slice))
 
     if options.component or options.all: 
         for name in test_names(ComponentTest):
-            suite.addTest(ComponentTest(name, client))
-
+            suite.addTest(ComponentTest(name, client, test_slice))
+    
+    # run tests 
     unittest.TextTestRunner(verbosity=2).run(suite)
 
+    # remove teset slice
+    DeleteSliver(client, test_slice)