From 2db221c3845e2b1c44f8237c550704dca41df91a Mon Sep 17 00:00:00 2001 From: Matthieu Patou Date: Wed, 2 Nov 2011 20:24:20 +0100 Subject: [PATCH] s4-sites: Document, fix under optimal coding, use exceptions Autobuild-User: Matthieu Patou Autobuild-Date: Wed Nov 2 22:35:00 CET 2011 on sn-devel-104 --- source4/dsdb/tests/python/sites.py | 36 +++++----- .../scripting/python/samba/netcmd/sites.py | 40 +++++------ source4/scripting/python/samba/sites.py | 68 ++++++++++++++++++- 3 files changed, 104 insertions(+), 40 deletions(-) diff --git a/source4/dsdb/tests/python/sites.py b/source4/dsdb/tests/python/sites.py index d3f5c5769fe..8b984b2fe8b 100644 --- a/source4/dsdb/tests/python/sites.py +++ b/source4/dsdb/tests/python/sites.py @@ -80,7 +80,6 @@ class SitesBaseTests(samba.tests.TestCase): #tests on sites class SimpleSitesTests(SitesBaseTests): - def test_create(self): """test creation of 1 site""" @@ -88,30 +87,31 @@ class SimpleSitesTests(SitesBaseTests): ok = sites.create_site(self.ldb_admin, self.ldb_admin.get_config_basedn(), "testsamba") self.ldb_admin.transaction_commit() - self.assertTrue(ok) - ok = False - try: - ok = sites.create_site(self.ldb_admin, self.ldb_admin.get_config_basedn(), - "testsamba") - self.assertFalse(ok) - except: - self.assertFalse(ok) + + self.assertRaises(sites.SiteAlreadyExistsException, + sites.create_site, self.ldb_admin, self.ldb_admin.get_config_basedn(), + "testsamba") def test_delete(self): - """test creation of 1 site""" + """test removal of 1 site""" self.ldb_admin.transaction_start() ok = sites.delete_site(self.ldb_admin, self.ldb_admin.get_config_basedn(), "testsamba") + self.ldb_admin.transaction_commit() - self.assertTrue(ok) - ok = False - try: - ok = sites.delete_site(self.ldb_admin, self.ldb_admin.get_config_basedn(), - "testsamba") - self.assertFalse(ok) - except: - self.assertFalse(ok) + + self.assertRaises(sites.SiteNotFoundException, + sites.delete_site, self.ldb_admin, self.ldb_admin.get_config_basedn(), + "testsamba") + + + def test_delete_not_empty(self): + """test removal of 1 site with servers""" + + self.assertRaises(sites.SiteServerNotEmptyException, + sites.delete_site, self.ldb_admin, self.ldb_admin.get_config_basedn(), + "Default-First-Site-Name") ldb = SamDB(ldapshost, credentials=creds, session_info=system_session(lp), lp=lp) diff --git a/source4/scripting/python/samba/netcmd/sites.py b/source4/scripting/python/samba/netcmd/sites.py index a63b52442e2..f5223db5f86 100644 --- a/source4/scripting/python/samba/netcmd/sites.py +++ b/source4/scripting/python/samba/netcmd/sites.py @@ -23,7 +23,7 @@ import os from samba import sites -from samba import Ldb +from samba.samdb import SamDB from samba.auth import system_session from samba.netcmd import ( Command, @@ -42,20 +42,20 @@ class cmd_sites_create(Command): def run(self, sitename, sambaopts=None, credopts=None, versionopts=None): lp = sambaopts.get_loadparm() creds = credopts.get_credentials(lp, fallback_machine=True) - name = "sam.ldb" - path = lp.get("private dir") - url = os.path.join(path, name) + url = lp.private_path("sam.ldb") + if not os.path.exists(url): raise CommandError("secret database not found at %s " % url) - samdb = Ldb(url=url, session_info=system_session(), - credentials=creds, lp=lp) + samdb = SamDB(url=url, session_info=system_session(), + credentials=creds, lp=lp) samdb.transaction_start() - ok = sites.create_site(samdb, samdb.get_config_basedn(), sitename) - samdb.transaction_commit() - - if not ok: - raise CommandError("Error while creating site %s" % sitename) + try: + ok = sites.create_site(samdb, samdb.get_config_basedn(), sitename) + samdb.transaction_commit() + except sites.SiteAlreadyExistsException, e: + samdb.transaction_cancel() + raise CommandError("Error while creating site %s, error: %s" % (sitename, str(e))) self.outf.write("Site %s created !\n" % sitename) @@ -69,20 +69,20 @@ class cmd_sites_delete(Command): def run(self, sitename, sambaopts=None, credopts=None, versionopts=None): lp = sambaopts.get_loadparm() creds = credopts.get_credentials(lp, fallback_machine=True) - name = "sam.ldb" - path = lp.get("private dir") - url = os.path.join(path, name) + url = lp.private_path("sam.ldb") + if not os.path.exists(url): raise CommandError("secret database not found at %s " % url) - samdb = Ldb(url=url, session_info=system_session(), + samdb = SamDB(url=url, session_info=system_session(), credentials=creds, lp=lp) samdb.transaction_start() - ok = sites.delete_site(samdb, samdb.get_config_basedn(), sitename) - samdb.transaction_commit() - - if not ok: - raise CommandError("Error while creating site %s" % sitename) + try: + ok = sites.delete_site(samdb, samdb.get_config_basedn(), sitename) + samdb.transaction_commit() + except sites.SiteException, e: + samdb.transaction_cancel() + raise CommandError("Error while removing site %s, error: %s" % (sitename, str(e))) self.outf.write("Site %s removed!\n" % sitename) diff --git a/source4/scripting/python/samba/sites.py b/source4/scripting/python/samba/sites.py index d1d0e759733..f18441cbbb1 100644 --- a/source4/scripting/python/samba/sites.py +++ b/source4/scripting/python/samba/sites.py @@ -22,11 +22,59 @@ import ldb from ldb import FLAG_MOD_ADD + +class SiteException(Exception): + """Base element for Sites errors""" + + def __init__(self, value): + self.value = value + + def __str__(self): + return "SiteException: " + self.value + + +class SiteNotFoundException(SiteException): + """Raised when the site is not found and it's expected to exists.""" + + def __init__(self, value): + self.value = value + + def __str__(self): + return "SiteNotFoundException: " + self.value + +class SiteAlreadyExistsException(SiteException): + """Raised when the site is not found and it's expected not to exists.""" + + def __init__(self, value): + self.value = value + + def __str__(self): + return "SiteAlreadyExists: " + self.value + +class SiteServerNotEmptyException(SiteException): + """Raised when the site still has servers attached.""" + + def __init__(self, value): + self.value = value + + def __str__(self): + return "SiteServerNotEmpty: " + self.value + def create_site(samdb, configDn, siteName): + """ + Create a site + + :param samdb: A samdb connection + :param configDn: The DN of the configuration partition + :param siteName: Name of the site to create + :return: True upon success + :raise SiteAlreadyExists: if the site to be created already exists. + """ + ret = samdb.search(base=configDn, scope=ldb.SCOPE_SUBTREE, expression='(&(objectclass=Site)(cn=%s))' % siteName) if len(ret) != 0: - raise Exception('A site with the name %s already exists' % siteName) + raise SiteAlreadyExistsException('A site with the name %s already exists' % siteName) m = ldb.Message() m.dn = ldb.Dn(samdb, "Cn=%s,CN=Sites,%s" % (siteName, str(configDn))) @@ -49,14 +97,30 @@ def create_site(samdb, configDn, siteName): return True def delete_site(samdb, configDn, siteName): + """ + Delete a site + :param samdb: A samdb connection + :param configDn: The DN of the configuration partition + :param siteName: Name of the site to delete + :return: True upon success + :raise SiteNotFoundException: if the site to be deleted do not exists. + :raise SiteServerNotEmpty: if the site has still servers in it. + """ + + dnsites = ldb.Dn(samdb, "CN=Sites,%s" % (str(configDn))) dnsite = ldb.Dn(samdb, "Cn=%s,CN=Sites,%s" % (siteName, str(configDn))) dnserver = ldb.Dn(samdb, "Cn=Servers,%s" % str(dnsite)) + ret = samdb.search(base=dnsites, scope=ldb.SCOPE_ONELEVEL, + expression='(dn=%s)' % str(dnsite)) + if len(ret) != 1: + raise SiteNotFoundException('Site %s do not exists' % siteName) + ret = samdb.search(base=dnserver, scope=ldb.SCOPE_ONELEVEL, expression='(objectclass=server)') if len(ret) != 0: - raise Exception('Site %s still has servers in it, move them before removal' % siteName) + raise SiteServerNotEmptyException('Site %s still has servers in it, move them before removal' % siteName) samdb.delete(dnsite, ["tree_delete:0"]) -- 2.34.1