From 84ac6c6bbfc4baaf28906ee5826a9cf888043656 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Dec 2007 18:54:19 +0100 Subject: [PATCH] r26527: Start on tests for provision. --- source/scripting/python/samba/__init__.py | 2 - source/scripting/python/samba/provision.py | 60 +++++++------------ .../scripting/python/samba/tests/__init__.py | 17 ++++++ .../scripting/python/samba/tests/provision.py | 59 ++++++++++++++++++ source/selftest/samba4_tests.sh | 1 + 5 files changed, 97 insertions(+), 42 deletions(-) create mode 100644 source/scripting/python/samba/tests/provision.py diff --git a/source/scripting/python/samba/__init__.py b/source/scripting/python/samba/__init__.py index 39814646817..9ac283e6607 100644 --- a/source/scripting/python/samba/__init__.py +++ b/source/scripting/python/samba/__init__.py @@ -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 diff --git a/source/scripting/python/samba/provision.py b/source/scripting/python/samba/provision.py index ebc82883518..04f50e8359f 100644 --- a/source/scripting/python/samba/provision.py +++ b/source/scripting/python/samba/provision.py @@ -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=*)" diff --git a/source/scripting/python/samba/tests/__init__.py b/source/scripting/python/samba/tests/__init__.py index d3930e217aa..08084699072 100644 --- a/source/scripting/python/samba/tests/__init__.py +++ b/source/scripting/python/samba/tests/__init__.py @@ -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 index 00000000000..5edfe79084a --- /dev/null +++ b/source/scripting/python/samba/tests/provision.py @@ -0,0 +1,59 @@ +#!/usr/bin/python + +# Unix SMB/CIFS implementation. +# Copyright (C) Jelmer Vernooij 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 . +# + +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) + diff --git a/source/selftest/samba4_tests.sh b/source/selftest/samba4_tests.sh index f0700a6956a..268a3246e5a 100755 --- a/source/selftest/samba4_tests.sh +++ b/source/selftest/samba4_tests.sh @@ -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 -- 2.34.1