def test_list_conversion(self): ad = dict(classad.ClassAd("[a = {1,2,3}]")) self.assertTrue(isinstance(ad["a"], types.ListType)) self.assertTrue(isinstance(ad["a"][0], types.LongType)) def listAdd(a, b): return a+b classad.register(listAdd) self.assertEqual(classad.ExprTree("listAdd({1,2}, {3,4})")[0], 1)
def test_register_custom_function(): def concatenateLists(list1, list2): return list1 + list2 classad.register(concatenateLists) assert classad.ExprTree("concatenateLists({1, 2}, {3, 4})").eval() == [ 1, 2, 3, 4 ]
def test_custom_function_can_see_python_values(): local = 1 def add(a): return a + local classad.register(add) assert classad.ExprTree("add(1)").eval() == 2
def test_list_conversion(self): ad = dict(classad.ClassAd("[a = {1,2,3}]")) self.assertTrue(isinstance(ad["a"], types.ListType)) self.assertTrue(isinstance(ad["a"][0], types.LongType)) def listAdd(a, b): return a + b classad.register(listAdd) self.assertEqual(classad.ExprTree("listAdd({1,2}, {3,4})")[0], 1)
def test_register_with_exception(): def bad(a, b): raise Exception("oops") classad.register(bad) with pytest.raises(Exception) as e: classad.ExprTree("bad(1, 2)").eval() assert str(e.value) == "oops"
def test_state(self): def myFunc(state): return 1 if state else 0 classad.register(myFunc) self.assertEquals(0, classad.ExprTree('myFunc(false)').eval()) self.assertEquals(1, classad.ExprTree('myFunc("foo")').eval()) ad = classad.ClassAd("""[foo = myFunc(); bar = 2]""") self.assertEquals(1, ad.eval('foo')) ad['foo'] = classad.ExprTree('myFunc(1)') self.assertRaises(TypeError, ad.eval, ('foo',)) def myFunc(arg1, **kw): return kw['state']['bar'] classad.register(myFunc) self.assertEquals(2, ad.eval('foo'))
def test_state(self): def myFunc(state): return 1 if state else 0 classad.register(myFunc) self.assertEqual(0, classad.ExprTree('myFunc(false)').eval()) self.assertEqual(1, classad.ExprTree('myFunc("foo")').eval()) ad = classad.ClassAd("""[foo = myFunc(); bar = 2]""") self.assertEqual(1, ad.eval('foo')) ad['foo'] = classad.ExprTree('myFunc(1)') self.assertRaises(TypeError, ad.eval, ('foo', )) def myFunc(arg1, **kw): return kw['state']['bar'] classad.register(myFunc) self.assertEqual(2, ad.eval('foo'))
def test_register(self): class BadException(Exception): pass def myAdd(a, b): return a+b def myBad(a, b): raise BadException("bad") def myComplex(a): return 1j # ClassAds have no complex numbers, not able to convert from python to an expression def myExpr(**kw): return classad.ExprTree("foo") # Functions must return values; this becomes "undefined". def myFoo(foo): return foo['foo'] def myIntersect(a, b): return set(a).intersection(set(b)) classad.register(myAdd) classad.register(myAdd, name='myAdd2') classad.register(myBad) classad.register(myComplex) classad.register(myExpr) classad.register(myFoo) classad.register(myIntersect) self.assertEquals(3, classad.ExprTree('myAdd(1, 2)').eval()) self.assertEquals(3, classad.ExprTree('myAdd2(1, 2)').eval()) self.assertRaises(BadException, classad.ExprTree('myBad(1, 2)').eval) self.assertRaises(TypeError, classad.ExprTree('myComplex(1)').eval) self.assertEquals(classad.Value.Undefined, classad.ExprTree('myExpr()').eval()) self.assertEquals(classad.ExprTree('myExpr()').eval({"foo": 2}), 2) self.assertRaises(TypeError, classad.ExprTree('myAdd(1)').eval) # myAdd requires 2 arguments; only one is given. self.assertEquals(classad.ExprTree('myFoo([foo = 1])').eval(), 1) self.assertEquals(classad.ExprTree('size(myIntersect({1, 2}, {2, 3}))').eval(), 1) self.assertEquals(classad.ExprTree('myIntersect({1, 2}, {2, 3})[0]').eval(), 2)
global g_expire_time if time.time() > g_expire_time: cache_users() g_expire_time = time.time() + 15*3600 def lpcUserDN(user): check_caches() if isinstance(user, classad.ExprTree): try: user = user.eval() except: return False return user in g_cache classad.register(lpcUserDN) if __name__ == '__main__': htcondor.param['CMSLPC_USER_CACHE'] = 'test_lpccache.txt.temp' shutil.copy('test_lpccache.txt', 'test_lpccache.txt.temp') htcondor.enable_debug() print "true ==", lpcUserDN("/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman") print "true ==", classad.ExprTree('lpcUserDN("/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman")').eval() print "false ==", lpcUserDN("/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman/false") print "false ==", classad.ExprTree('lpcUserDN("/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman/false")').eval() ad = classad.ClassAd({'x509userproxysubject': '/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman', 'foo': classad.ExprTree('lpcUserDN(x509userproxysubject)')}) print "true ==", ad.eval("foo") htcondor.param['CMSLPC_USER_URL'] = 'http://hcc-briantest.unl.edu/test_lpccache.txt' g_expire_time = 0 print "true ==", classad.ExprTree('lpcUserDN("/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman/true")').eval()
_split_re = re.compile(",\s*") def sortStringSet(in_list, state={}): if isinstance(in_list, classad.ExprTree): in_list = in_list.eval(state) if isinstance(in_list, classad.Value): return classad.Value.Undefined split_list = _split_re.split(in_list) split_list = list(set(split_list)) split_list.sort() return ",".join(split_list) _split_re = re.compile(",\s*") def siteMapping(in_list, source_to_dests, state={}): if isinstance(in_list, classad.ExprTree): in_list = in_list.eval(state) if isinstance(in_list, classad.Value): return classad.Value.Undefined split_list = _split_re.split(in_list) final_set = set() for site in split_list: final_set.add(site) final_set.update(source_to_dests.setdefault(site, set())) split_list = list(final_set) split_list.sort() return str(",".join(split_list)) classad.register(sortStringSet) classad.register(siteMapping)
def test_register(self): class BadException(Exception): pass def myAdd(a, b): return a + b def myBad(a, b): raise BadException("bad") def myComplex(a): return 1j # ClassAds have no complex numbers, not able to convert from python to an expression def myExpr(**kw): return classad.ExprTree( "foo" ) # Functions must return values; this becomes "undefined". def myFoo(foo): return foo['foo'] def myIntersect(a, b): return set(a).intersection(set(b)) classad.register(myAdd) classad.register(myAdd, name='myAdd2') classad.register(myBad) classad.register(myComplex) classad.register(myExpr) classad.register(myFoo) classad.register(myIntersect) self.assertEquals(3, classad.ExprTree('myAdd(1, 2)').eval()) self.assertEquals(3, classad.ExprTree('myAdd2(1, 2)').eval()) self.assertRaises(BadException, classad.ExprTree('myBad(1, 2)').eval) self.assertRaises(TypeError, classad.ExprTree('myComplex(1)').eval) self.assertEquals(classad.Value.Undefined, classad.ExprTree('myExpr()').eval()) self.assertEquals(classad.ExprTree('myExpr()').eval({"foo": 2}), 2) self.assertRaises(TypeError, classad.ExprTree('myAdd(1)').eval ) # myAdd requires 2 arguments; only one is given. self.assertEquals(classad.ExprTree('myFoo([foo = 1])').eval(), 1) self.assertEquals( classad.ExprTree('size(myIntersect({1, 2}, {2, 3}))').eval(), 1) self.assertEquals( classad.ExprTree('myIntersect({1, 2}, {2, 3})[0]').eval(), 2)
if time.time() > g_expire_time: cache_users() g_expire_time = time.time() + 15 * 3600 def lpcUserDN(user): check_caches() if isinstance(user, classad.ExprTree): try: user = user.eval() except: return False return user in g_cache classad.register(lpcUserDN) if __name__ == '__main__': htcondor.param['CMSLPC_USER_CACHE'] = 'test_lpccache.txt.temp' shutil.copy('test_lpccache.txt', 'test_lpccache.txt.temp') htcondor.enable_debug() print "true ==", lpcUserDN( "/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman" ) print "true ==", classad.ExprTree( 'lpcUserDN("/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman")' ).eval() print "false ==", lpcUserDN( "/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=bbockelm/CN=659869/CN=Brian Paul Bockelman/false" ) print "false ==", classad.ExprTree(
import re import classad _split_re = re.compile(",\s*") def sortStringSet(in_list, state={}): if isinstance(in_list, classad.ExprTree): in_list = in_list.eval(state) if isinstance(in_list, classad.Value): return classad.Value.Undefined split_list = _split_re.split(in_list) split_list = list(set(split_list)) split_list.sort() return ",".join(split_list) classad.register(sortStringSet)
_split_re = re.compile(",\s*") def siteMapping(in_list, source_to_dests, state={}): if isinstance(in_list, classad.ExprTree): in_list = in_list.eval(state) if isinstance(in_list, classad.Value): return classad.Value.Undefined split_list = _split_re.split(in_list) final_set = set() for site in split_list: ## add the source sites final_set.add(site) ## add all destination sites final_set.update(source_to_dests.setdefault(site, set())) split_list = list(final_set) split_list.sort() return str(",".join(split_list)) def removeSite(those, from_sites): to_remove = set(_split_re.split(those)) from_sites = set(_split_re.split(from_sites)) return str(",".join(sorted(from_sites - to_remove))) classad.register(sortStringSet) classad.register(siteMapping) classad.register(removeSite)
split_list = list(set(split_list)) split_list.sort() return ",".join(split_list) _split_re = re.compile(",\s*") def siteMapping(in_list, source_to_dests, state={}): if isinstance(in_list, classad.ExprTree): in_list = in_list.eval(state) if isinstance(in_list, classad.Value): return classad.Value.Undefined split_list = _split_re.split(in_list) final_set = set() for site in split_list: ## add the source sites final_set.add(site) ## add all destination sites final_set.update(source_to_dests.setdefault(site, set())) split_list = list(final_set) split_list.sort() return str(",".join(split_list)) def removeSite(those,from_sites): to_remove = set(_split_re.split(those)) from_sites = set(_split_re.split(from_sites)) return str(",".join( sorted( from_sites - to_remove ))) classad.register(sortStringSet) classad.register(siteMapping) classad.register(removeSite)