Source code for univention.testing.ucsschool.importgroups
# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import subprocess
import tempfile
import ucsschool.lib.models.utils
import univention.config_registry
import univention.testing.strings as uts
import univention.testing.ucsschool.ucs_test_school as utu
from ucsschool.lib.models.group import SchoolClass as GroupLib
from ucsschool.lib.models.school import School as SchoolLib
from ucsschool.lib.roles import create_ucsschool_role_string, role_school_class, role_school_class_share
from univention.testing import utils
from univention.testing.ucsschool.importou import get_school_base
configRegistry = univention.config_registry.ConfigRegistry()
configRegistry.load()
cn_pupils = configRegistry.get("ucsschool/ldap/default/container/pupils", "schueler")
[docs]
class Group:
def __init__(self, school):
self.name = "{}-{}".format(school, uts.random_name())
self.description = uts.random_name()
self.school = school
self.mode = "A"
self.school_base = get_school_base(self.school)
self.dn = "cn=%s,cn=klassen,cn=%s,cn=groups,%s" % (self.name, cn_pupils, self.school_base)
self.share_dn = "cn=%s,cn=klassen,cn=shares,%s" % (self.name, self.school_base)
[docs]
def set_mode_to_modify(self):
self.mode = "M"
[docs]
def set_mode_to_delete(self):
self.mode = "D"
def __str__(self):
delimiter = "\t"
line = self.mode
line += delimiter
line += self.school
line += delimiter
line += self.name
line += delimiter
line += self.description
return line
[docs]
def expected_attributes(self):
attr = {}
attr["cn"] = [self.name]
attr["description"] = [self.description]
attr["ucsschoolRole"] = [create_ucsschool_role_string(role_school_class, self.school)]
return attr
[docs]
def verify(self):
print("verify group: %s" % self.name)
if self.mode == "D":
utils.verify_ldap_object(self.dn, should_exist=False)
utils.verify_ldap_object(self.share_dn, should_exist=False)
return
utils.verify_ldap_object(self.dn, expected_attr=self.expected_attributes(), should_exist=True)
utils.verify_ldap_object(
self.share_dn,
expected_attr={
"ucsschoolRole": [create_ucsschool_role_string(role_school_class_share, self.school)]
},
should_exist=True,
)
[docs]
class ImportFile:
def __init__(self, use_cli_api, use_python_api):
self.use_cli_api = use_cli_api
self.use_python_api = use_python_api
self.import_fd, self.import_file = tempfile.mkstemp()
os.close(self.import_fd)
self.group_import = None
[docs]
def write_import(self):
self.import_fd = os.open(self.import_file, os.O_RDWR | os.O_CREAT)
os.write(self.import_fd, str(self.group_import).encode("UTF-8"))
os.close(self.import_fd)
[docs]
def run_import(self, group_import):
self.group_import = group_import
try:
if self.use_cli_api:
self.write_import()
self._run_import_via_cli()
elif self.use_python_api:
self._run_import_via_python_api()
print("SCHOOL DATA :\n%s" % str(self.group_import))
finally:
try:
os.remove(self.import_file)
except OSError as e:
print("WARNING: %s not removed. %s" % (self.import_file, e))
def _run_import_via_cli(self):
cmd_block = ["/usr/share/ucs-school-import/scripts/import_group", self.import_file]
print("cmd_block: %r" % cmd_block)
subprocess.check_call(cmd_block)
def _run_import_via_python_api(self):
# reload UCR
ucsschool.lib.models.utils.ucr.load()
lo = univention.admin.uldap.getAdminConnection()[0]
# get school from first group
school = self.group_import.groups[0].school
school_obj = SchoolLib.cache(school, display_name=school)
if not school_obj.exists(lo):
school_obj.dc_name = uts.random_name()
school_obj.create(lo)
for grp in self.group_import.groups:
kwargs = {"school": grp.school, "name": grp.name, "description": grp.description}
if grp.mode == "A":
GroupLib(**kwargs).create(lo)
elif grp.mode == "M":
GroupLib(**kwargs).modify(lo)
elif grp.mode == "D":
GroupLib(**kwargs).remove(lo)
[docs]
class GroupImport:
def __init__(self, ou_name, nr_groups=20):
assert nr_groups > 3
self.school = ou_name
self.groups = [Group(self.school) for _i in range(nr_groups)]
def __str__(self):
lines = [str(group) for group in self.groups]
return "\n".join(lines)
[docs]
def verify(self):
for group in self.groups:
group.verify()
[docs]
def modify(self):
for group in self.groups:
group.set_mode_to_modify()
self.groups[0].description = uts.random_name()
self.groups[1].description = uts.random_name()
[docs]
def delete(self):
for group in self.groups:
group.set_mode_to_delete()
[docs]
def create_and_verify_groups(use_cli_api=True, use_python_api=False, nr_groups=5):
assert use_cli_api != use_python_api
with utu.UCSTestSchool() as schoolenv:
ou_name, ou_dn = schoolenv.create_ou(name_edudc=schoolenv.ucr.get("hostname"))
print("********** Generate school data")
group_import = GroupImport(ou_name, nr_groups=nr_groups)
print(group_import)
import_file = ImportFile(use_cli_api, use_python_api)
print("********** Create groups")
import_file.run_import(group_import)
group_import.verify()
print("********** Modify groups")
group_import.modify()
import_file.run_import(group_import)
group_import.verify()
print("********** Delete groups")
group_import.delete()
import_file.run_import(group_import)
group_import.verify()
[docs]
def import_groups_basics(use_cli_api=True, use_python_api=False):
create_and_verify_groups(use_cli_api, use_python_api, 10)