#!/usr/share/ucs-test/runner python
## desc: ucs-school-assign-internet-rules-check
## roles: [domaincontroller_master, domaincontroller_backup, domaincontroller_slave, memberserver]
## tags: [apptest, ucsschool]
## exposure: careful
## packages:  [ucs-school-umc-internetrules]

from essential.check import Check
from essential.internetrule import InternetRule
from essential.klasse import Klasse
from essential.workgroup import Workgroup
import random
import univention.testing.ucr as ucr_test
import univention.testing.ucsschool as utu
import univention.testing.utils as utils


# Assign internetrules to groups randomly
def assignRulesToGroupsRandomly(groupList, ruleList, school, groupType):
	assignedGroups = []
	for group in groupList:
		rule = random.choice(ruleList)
		rule.assign(
			school,
			group.name,
			groupType)
		assignedGroups.append(
			(group.name, rule.name))
	utils.wait_for_replication_and_postrun()
	return assignedGroups


def main():
	with utu.UCSTestSchool() as schoolenv:
		with ucr_test.UCSTestConfigRegistry() as ucr:
			school, oudn = schoolenv.create_ou(name_edudc=ucr.get('hostname'))

			# Instantiate InternetRule instance
			ruleIns = InternetRule(ucr=ucr)

			# define many random internet rules
			newRules = ruleIns.defineList(8)

			# test get the created rules via umc
			for rule in newRules:
				rule.get(should_exist=True)

			# Create random workgroups
			groupIns = Workgroup(school, ucr=ucr)
			newWorkgroups = groupIns.createList(2)
			assignedGroups = [(group.name, None) for group in newWorkgroups]

			# Instantiate Check instance
			check1 = Check(school, assignedGroups, ucr=ucr)

			# check the assigned internet rules UMCP
			check1.checkRules()
			# check ucr variables
			check1.checkUcr()

			# assign internetrules to groups randomly
			rules = newRules[:4]
			assignedGroups = assignRulesToGroupsRandomly(
				newWorkgroups,
				rules,
				school,
				'workgroup')

			# Instantiate another Check instance
			check2 = Check(school, assignedGroups, ucr=ucr)

			# check the assigned internet rules UMCP
			check2.checkRules()
			# check ucr variables
			check2.checkUcr()

			# switch internetrules for groups randomly
			rules = newRules[4:]
			assignedGroups = assignRulesToGroupsRandomly(
				newWorkgroups,
				rules,
				school,
				'workgroup')

			# Instantiate another Check instance
			check3 = Check(school, assignedGroups, ucr=ucr)

			# check the assigned internet rules UMCP
			check3.checkRules()
			# check ucr variables
			check3.checkUcr()

			# assign default internetrule to groups
			for group in newWorkgroups:
				rule.assign(
					school,
					group.name,
					'workgroup',
					default=True)

			# check the assigned internet rules UMCP
			check1.checkRules()
			# check ucr variables
			check1.checkUcr()

			# Create random classs
			cIns = Klasse(school, ucr=ucr)
			newclasses = cIns.createList(2)
			assignedClasses = [(c.name, None) for c in newclasses]

			check1 = Check(school, assignedClasses, ucr=ucr)

			# check the assigned internet rules UMCP
			check1.checkRules()
			# check ucr variables
			check1.checkUcr()

			# assign internetrules to classes randomly
			rules = newRules[:4]
			assignedClasses = assignRulesToGroupsRandomly(
				newclasses,
				rules,
				school,
				'class')

			check2 = Check(school, assignedClasses, ucr=ucr)

			# check the assigned internet rules UMCP
			check2.checkRules()
			# check ucr variables
			check2.checkUcr()

			# switch internetrules for classes randomly
			rules = newRules[4:]
			assignedClasses = assignRulesToGroupsRandomly(
				newclasses,
				rules,
				school,
				'class')
			check3 = Check(school, assignedClasses, ucr=ucr)

			# check the assigned internet rules UMCP
			check3.checkRules()
			# check ucr variables
			check3.checkUcr()

			# assign default internetrule to classes
			for c in newclasses:
				rule.assign(
					school,
					c.name,
					'class',
					default=True)

			# check the assigned internet rules UMCP
			check1.checkRules()
			# check ucr variables
			check1.checkUcr()


if __name__ == '__main__':
	main()
