r26527: Start on tests for provision.
authorJelmer Vernooij <jelmer@samba.org>
Tue, 18 Dec 2007 17:54:19 +0000 (18:54 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 21 Dec 2007 04:51:50 +0000 (05:51 +0100)
source/scripting/python/samba/__init__.py
source/scripting/python/samba/provision.py
source/scripting/python/samba/tests/__init__.py
source/scripting/python/samba/tests/provision.py [new file with mode: 0644]
source/selftest/samba4_tests.sh

index 398146468174699cbfbee1f4ab1a0be14d75d895..9ac283e660788c0cd91f377b9d5b89786a0a7deb 100644 (file)
@@ -129,8 +129,6 @@ def substitute_var(text, values):
         assert isinstance(value, str), "Value %r for %s is not a string" % (value, name)
         text = text.replace("${%s}" % name, value)
 
-    assert "${" not in text, text
-
     return text
 
 
index ebc82883518ae9ffe1d21f4d9daa48e3cf6bf4de..04f50e8359f25956f8a63f3ad49b0a710f8da246 100644 (file)
@@ -135,18 +135,6 @@ def hostname():
     return gethostname().split(".")[0]
 
 
-def ldb_delete(ldb):
-    """Delete a LDB file.
-
-    This may be necessary if the ldb is in bad shape, possibly due to being 
-    built from an incompatible previous version of the code, so delete it
-    completely.
-    """
-    print "Deleting %s\n" % ldb.filename
-    os.unlink(ldb.filename)
-    ldb.connect(ldb.filename)
-
-
 def open_ldb(session_info, credentials, lp, dbname):
     assert session_info is not None
     try:
@@ -176,6 +164,13 @@ def setup_add_ldif(ldb, setup_dir, ldif, subst_vars=None):
 
 
 def setup_modify_ldif(ldb, setup_dir, ldif, substvars=None):
+    """Modify a ldb in the private dir.
+    
+    :param ldb: LDB object.
+    :param setup_dir: Setup directory.
+    :param ldif: LDIF file path.
+    :param substvars: Optional dictionary with substitution variables.
+    """
     src = os.path.join(setup_dir, ldif)
 
     data = open(src, 'r').read()
@@ -199,19 +194,6 @@ def setup_ldb(ldb, setup_dir, ldif, subst_vars=None):
     ldb.transaction_commit()
 
 
-def setup_ldb_modify(ldb, setup_dir, ldif, substvars=None):
-    """Modify a ldb in the private dir."""
-    src = os.path.join(setup_dir, ldif)
-
-    data = open(src, 'r').read()
-    if substvars is not None:
-        data = substitute_var(data, substvars)
-    assert not "${" in data
-
-    for (changetype, msg) in ldb.parse_ldif(data):
-        ldb.modify(msg)
-
-
 def setup_file(setup_dir, template, fname, substvars):
     """Setup a file in the private dir."""
     f = fname
@@ -328,7 +310,7 @@ def provision_become_dc(setup_dir, subobj, message, paths, lp, session_info,
         setup_samdb_rootdse(samdb, setup_dir, subobj)
 
         message("Erasing data from partitions")
-        ldb_erase_partitions(subobj, message, samdb, None)
+        ldb_erase_partitions(subobj.domaindn, message, samdb, None)
 
         message("Setting up %s indexes" % paths.samdb)
         setup_add_ldif(samdb, setup_dir, "provision_index.ldif")
@@ -453,8 +435,7 @@ def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
             smbconfsuffix = "member"
         else:
             assert "Invalid server role setting: %s" % lp.get("server role")
-        setup_file(setup_dir, "provision.smb.conf.%s" % smbconfsuffix, paths.smbconf, 
-                None)
+        setup_file(setup_dir, "provision.smb.conf.%s" % smbconfsuffix, paths.smbconf)
         lp.reload()
 
     # only install a new shares config db if there is none
@@ -462,7 +443,7 @@ def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
         message("Setting up share.ldb")
         share_ldb = Ldb(paths.shareconf, session_info=session_info, 
                         credentials=credentials, lp=lp)
-        setup_ldb(share_ldb, setup_dir, "share.ldif", None)
+        setup_ldb(share_ldb, setup_dir, "share.ldif")
 
     message("Setting up %s" % paths.secrets)
     secrets_ldb = setup_secretsdb(paths.secrets, setup_dir, session_info=session_info, 
@@ -497,7 +478,7 @@ def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
         setup_samdb_rootdse(samdb, setup_dir, subobj)
 
         message("Erasing data from partitions")
-        ldb_erase_partitions(subobj, message, samdb, ldapbackend)
+        ldb_erase_partitions(subobj.domaindn, message, samdb, ldapbackend)
     except:
         samdb.transaction_cancel()
         raise
@@ -527,7 +508,7 @@ def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
         else:
             domainguid_mod = ""
 
-        setup_ldb_modify(samdb, setup_dir, "provision_basedn_modify.ldif", {
+        setup_modify_ldif(samdb, setup_dir, "provision_basedn_modify.ldif", {
             "RDN_DC": subobj.rdn_dc,
             "LDAPTIME": timestring(int(time.time())),
             "DOMAINSID": str(subobj.domainsid),
@@ -547,7 +528,7 @@ def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
             "EXTENSIBLEOBJECT": "# no objectClass: extensibleObject for local ldb",
             })
         message("Modifying configuration container")
-        setup_ldb_modify(samdb, setup_dir, "provision_configuration_basedn_modify.ldif", {
+        setup_modify_ldif(samdb, setup_dir, "provision_configuration_basedn_modify.ldif", {
             "CONFIGDN": subobj.configdn, 
             "SCHEMADN": subobj.schemadn,
             })
@@ -559,7 +540,7 @@ def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
             "EXTENSIBLEOBJECT": "# no objectClass: extensibleObject for local ldb"
             })
         message("Modifying schema container")
-        setup_ldb_modify(samdb, setup_dir, "provision_schema_basedn_modify.ldif", {
+        setup_modify_ldif(samdb, setup_dir, "provision_schema_basedn_modify.ldif", {
             "SCHEMADN": subobj.schemadn,
             "NETBIOSNAME": subobj.netbiosname,
             "DEFAULTSITE": subobj.defaultsite,
@@ -593,13 +574,13 @@ def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
         setup_add_ldif(samdb, setup_dir, "provision_users_add.ldif", {
             "DOMAINDN": subobj.domaindn})
         message("Modifying users container")
-        setup_ldb_modify(samdb, setup_dir, "provision_users_modify.ldif", {
+        setup_modify_ldif(samdb, setup_dir, "provision_users_modify.ldif", {
             "DOMAINDN": subobj.domaindn})
         message("Adding computers container (permitted to fail)")
         setup_add_ldif(samdb, setup_dir, "provision_computers_add.ldif", {
             "DOMAINDN": subobj.domaindn})
         message("Modifying computers container")
-        setup_ldb_modify(samdb, setup_dir, "provision_computers_modify.ldif", {
+        setup_modify_ldif(samdb, setup_dir, "provision_computers_modify.ldif", {
             "DOMAINDN": subobj.domaindn})
         message("Setting up sam.ldb data")
         setup_add_ldif(samdb, setup_dir, "provision.ldif", {
@@ -807,7 +788,7 @@ def load_schema(setup_dir, samdb, subobj):
     samdb.attach_schema_from_ldif(head_data, schema_data)
 
 
-def join_domain(domain, netbios_name, join_type, creds, message):
+def join_domain(domain, netbios_name, join_type, creds):
     ctx = NetContext(creds)
     joindom = object()
     joindom.domain = domain
@@ -824,8 +805,7 @@ def vampire(domain, session_info, credentials, message):
     access to our local database (might be remote ldap)
     """
     ctx = NetContext(credentials)
-    vampire_ctx = object()
-    machine_creds = credentials_init()
+    machine_creds = Credentials()
     machine_creds.set_domain(form.domain)
     if not machine_creds.set_machine_account():
         raise Exception("Failed to access domain join information!")
@@ -835,7 +815,7 @@ def vampire(domain, session_info, credentials, message):
         raise Exception("Migration of remote domain to Samba failed: %s " % vampire_ctx.error_string)
 
 
-def ldb_erase_partitions(subobj, message, ldb, ldapbackend):
+def ldb_erase_partitions(domaindn, message, ldb, ldapbackend):
     """Erase an ldb, removing all records."""
     assert ldb is not None
     res = ldb.search(Dn(ldb, ""), SCOPE_BASE, "(objectClass=*)", 
@@ -848,7 +828,7 @@ def ldb_erase_partitions(subobj, message, ldb, ldapbackend):
         previous_remaining = 1
         current_remaining = 0
 
-        if ldapbackend and (basedn == subobj.domaindn):
+        if ldapbackend and (basedn == domaindn):
             # Only delete objects that were created by provision
             anything = "(objectcategory=*)"
 
index d3930e217aa1fb3fa1b1ffbca7d5eea7bc45cb19..080846990728db268cdc9092a2a880b1d0412a0a 100644 (file)
@@ -35,3 +35,20 @@ class LdbTestCase(unittest.TestCase):
         self.ldb = samba.Ldb(self.filename)
 
 
+class SubstituteVarTestCase(unittest.TestCase):
+    def test_empty(self):
+        self.assertEquals("", samba.substitute_var("", {}))
+
+    def test_nothing(self):
+        self.assertEquals("foo bar", samba.substitute_var("foo bar", {"bar": "bla"}))
+
+    def test_replace(self):
+        self.assertEquals("foo bla", samba.substitute_var("foo ${bar}", {"bar": "bla"}))
+
+    def test_broken(self):
+        self.assertEquals("foo ${bdkjfhsdkfh sdkfh ", 
+                samba.substitute_var("foo ${bdkjfhsdkfh sdkfh ", {"bar": "bla"}))
+
+    def test_unknown_var(self):
+        self.assertEquals("foo ${bla} gsff", 
+                samba.substitute_var("foo ${bla} gsff", {"bar": "bla"}))
diff --git a/source/scripting/python/samba/tests/provision.py b/source/scripting/python/samba/tests/provision.py
new file mode 100644 (file)
index 0000000..5edfe79
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+
+# Unix SMB/CIFS implementation.
+# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
+#   
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#   
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#   
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import unittest
+import samba.provision
+
+class ProvisionTestCase(unittest.TestCase):
+    def test_setup_secretsdb(self):
+        raise NotImplementedError(self.test_setup_secretsdb)
+
+    def test_setup_templatesdb(self):
+        raise NotImplementedError(self.test_setup_templatesdb)
+
+    def test_setup_registry(self):
+        raise NotImplementedError(self.test_setup_registry)
+
+    def test_setup_samdb_rootdse(self):
+        raise NotImplementedError(self.test_setup_samdb_rootdse)
+
+    def test_setup_samdb_partitions(self):
+        raise NotImplementedError(self.test_setup_samdb_partitions)
+
+    def test_create_phpldapadmin_config(self):
+        raise NotImplementedError(self.test_create_phpldapadmin_config)
+
+    def test_provision_dns(self):
+        raise NotImplementedError(self.test_provision_dns)
+
+    def test_provision_ldapbase(self):
+        raise NotImplementedError(self.test_provision_ldapbase)
+
+    def test_provision_guess(self):
+        raise NotImplementedError(self.test_provision_guess)
+
+    def test_join_domain(self):
+        raise NotImplementedError(self.test_join_domain)
+
+    def test_vampire(self):
+        raise NotImplementedError(self.test_vampire)
+
+    def test_erase_partitions(self):
+        raise NotImplementedError(self.test_erase_partitions)
+
index f0700a6956af8985a8438a31c93895652dcb28c1..268a3246e5a660b48cafbdf1c1a95062a689abfe 100755 (executable)
@@ -295,4 +295,5 @@ then
        plantest "security.python" none PYTHONPATH=bin/python:scripting/python:libcli/security/tests/ scripting/bin/subunitrun bindings
        plantest "param.python" none PYTHONPATH=bin/python:scripting/python:param/tests scripting/bin/subunitrun bindings
        plantest "upgrade.python" none PYTHONPATH=bin/python:scripting/python scripting/bin/subunitrun samba.tests.upgrade
+       plantest "samba.python" none PYTHONPATH=bin/python:scripting/python scripting/bin/subunitrun samba.tests
 fi