diff options
| -rw-r--r-- | source4/dsdb/tests/python/sites.py | 36 | ||||
| -rw-r--r-- | source4/scripting/python/samba/netcmd/sites.py | 40 | ||||
| -rw-r--r-- | 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 d3f5c5769f..8b984b2fe8 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 a63b52442e..f5223db5f8 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 d1d0e75973..f18441cbbb 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"])  | 
