#!/usr/share/ucs-test/runner python3
## desc: Create DNS NS record and try to resolve it
## bugs: [32626]
## roles:
##  - domaincontroller_master
## packages:
##   - univention-config
##   - univention-directory-manager-tools
##   - univention-s4-connector
## tags:
##  - skip_admember
## exposure: safe

import univention.testing.udm as udm_test
import univention.testing.ucr as ucr_test
import univention.testing.strings as uts
import subprocess
from univention.testing.ucs_samba import wait_for_s4connector
import univention.testing.utils as utils
import re


if __name__ == '__main__':
	ucr = ucr_test.UCSTestConfigRegistry()
	ucr.load()
	with udm_test.UCSTestUDM() as udm:
		partentzone = '%(domainname)s' % ucr
		partentzone = partentzone
		pos = 'cn=dns,%s' % (udm.LDAP_BASE,)
		forward_zone = "zoneName=%(domainname)s,cn=dns,%(ldap/base)s" % ucr

		zonename = uts.random_name()
		nameserver1 = ".".join([uts.random_name(), partentzone])
		nameserver2 = ".".join([uts.random_name(), partentzone])
		nameservers = [nameserver1, nameserver2]

		record_properties = {
			'zone': zonename,
			'zonettl': '%s' % (uts.random_int(bottom_end=100, top_end=999)),
			'nameserver': nameservers
		}
		ns_record = udm.create_object('dns/ns_record', superordinate=forward_zone, **record_properties)

		wait_for_s4connector()

		zone_fqdn = '%s.%s' % (zonename, partentzone)
		p1 = subprocess.Popen(['dig', '+nocmd', '+noall', '+answer', '@localhost', zone_fqdn, 'ANY'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
		stdout, stderr = p1.communicate()
		stdout = stdout.decode('UTF-8', 'replace')
		if p1.returncode != 0:
			utils.fail("DNS dig query failed")

		found = [x for x in nameservers if re.search("^%s\\.[ \t][0-9]+[ \t]IN\tNS\t%s\\." % (re.escape(zone_fqdn), re.escape(x)), stdout, re.MULTILINE)]

		if nameservers != found:
			utils.fail("Record not found: %s" % ([set(nameservers) - set(found)],))
