#!/usr/share/ucs-test/runner python3
## desc: Check dns/reverse_zone SOA record serial number incrementation
## tags: [udm]
## roles: [domaincontroller_master]
## exposure: careful
## packages:
##   - univention-config
##   - univention-directory-manager-tools
## versions:
##  3.1-1: skip
##  3.2-0: fixed

import ldap.dn
import ldap.filter

import univention.testing.utils as utils
import univention.testing.udm as udm_test
import univention.testing.strings as uts
from univention.testing.utils import wait_for_replication_from_master_openldap_to_local_samba

if __name__ == '__main__':
	s4connector_installed = utils.package_installed('univention-s4-connector')
	with udm_test.UCSTestUDM() as udm:
		# IPv4 case:
		reverse_zone_properties = {
			'subnet': '10.20.20',
			'nameserver': uts.random_string(),
			'contact': '%s@%s.%s' % (uts.random_name(), uts.random_name(), uts.random_name()),
			'serial': '1',
			'zonettl': '128',
			'refresh': '64',
			'expire': '32',
			'ttl': '16',
			'retry': '8'
		}
		reverse_zone = udm.create_object('dns/reverse_zone', **reverse_zone_properties)

		reverse_zone_properties['ttl'] = '12'
		udm.modify_object('dns/reverse_zone', dn=reverse_zone, ttl=reverse_zone_properties['ttl'])
		wait_for_replication_from_master_openldap_to_local_samba(ldap_filter=ldap.filter.filter_format('DC=%s', [ldap.dn.str2dn(reverse_zone)[0][0][1]]))
		utils.verify_ldap_object(reverse_zone, {'sOARecord': ['%s %s. %s %s %s %s %s' % (
			reverse_zone_properties['nameserver'] + '.' if s4connector_installed else reverse_zone_properties['nameserver'],
			reverse_zone_properties['contact'].replace('@', '.'),
			'3' if s4connector_installed else '2',
			reverse_zone_properties['refresh'],
			reverse_zone_properties['retry'],
			reverse_zone_properties['expire'],
			reverse_zone_properties['ttl']
		)]})

		# IPv6 case:
		reverse_zone_properties.update({
			'subnet': '2011:06f8:13dc:0002:19b7:d592:09dd',
			'nameserver': uts.random_string(),
			'contact': '%s@%s.%s' % (uts.random_name(), uts.random_name(), uts.random_name()),
			'ttl': '16',
		})
		reverse_zone = udm.create_object('dns/reverse_zone', **reverse_zone_properties)

		reverse_zone_properties['ttl'] = '12'
		udm.modify_object('dns/reverse_zone', dn=reverse_zone, ttl=reverse_zone_properties['ttl'], wait_for=True)
		wait_for_replication_from_master_openldap_to_local_samba(ldap_filter=ldap.filter.filter_format('DC=%s', [ldap.dn.str2dn(reverse_zone)[0][0][1]]))
		utils.verify_ldap_object(reverse_zone, {'sOARecord': ['%s %s. %s %s %s %s %s' % (
			reverse_zone_properties['nameserver'] + '.' if s4connector_installed else reverse_zone_properties['nameserver'],
			reverse_zone_properties['contact'].replace('@', '.'),
			'3' if s4connector_installed else '2',
			reverse_zone_properties['refresh'],
			reverse_zone_properties['retry'],
			reverse_zone_properties['expire'],
			reverse_zone_properties['ttl']
		)]})
