Skip to content
Snippets Groups Projects
Commit 845afc0f authored by Rafael Guterres Jeffman's avatar Rafael Guterres Jeffman
Browse files

ipadnszone: Fix modification o SOA serial with other attributes.

Due to an issue with FreeIPA, when modifying the SOA serial attribute
along with other attributes, the value is ignored. In order to have
the value provided, the attribute is set is a later call to dnszone-mod
allowing it to retain the desired value.

Ref: https://pagure.io/freeipa/issue/8489
parent f50cd613
Branches
Tags
No related merge requests found
...@@ -214,6 +214,7 @@ from ansible.module_utils.ansible_freeipa_module import ( ...@@ -214,6 +214,7 @@ from ansible.module_utils.ansible_freeipa_module import (
is_ipv6_addr, is_ipv6_addr,
is_valid_port, is_valid_port,
) # noqa: E402 ) # noqa: E402
import ipalib.errors
import netaddr import netaddr
import six import six
...@@ -404,13 +405,14 @@ class DNSZoneModule(FreeIPABaseModule): ...@@ -404,13 +405,14 @@ class DNSZoneModule(FreeIPABaseModule):
def get_zone(self, zone_name): def get_zone(self, zone_name):
get_zone_args = {"idnsname": zone_name, "all": True} get_zone_args = {"idnsname": zone_name, "all": True}
response = self.api_command("dnszone_find", args=get_zone_args)
try:
response = self.api_command("dnszone_show", args=get_zone_args)
except ipalib.errors.NotFound:
zone = None zone = None
is_zone_active = False is_zone_active = False
else:
if response["count"] == 1: zone = response["result"]
zone = response["result"][0]
is_zone_active = zone.get("idnszoneactive") == ["TRUE"] is_zone_active = zone.get("idnszoneactive") == ["TRUE"]
return zone, is_zone_active return zone, is_zone_active
...@@ -448,7 +450,10 @@ class DNSZoneModule(FreeIPABaseModule): ...@@ -448,7 +450,10 @@ class DNSZoneModule(FreeIPABaseModule):
# Look for existing zone in IPA # Look for existing zone in IPA
zone, is_zone_active = self.get_zone(zone_name) zone, is_zone_active = self.get_zone(zone_name)
args = self.get_ipa_command_args(zone=zone) args = self.get_ipa_command_args(zone=zone)
just_added = False set_serial = self.ipa_params.serial is not None
if set_serial:
del args["idnssoaserial"]
if self.ipa_params.state in ["present", "enabled", "disabled"]: if self.ipa_params.state in ["present", "enabled", "disabled"]:
if not zone: if not zone:
...@@ -456,7 +461,7 @@ class DNSZoneModule(FreeIPABaseModule): ...@@ -456,7 +461,7 @@ class DNSZoneModule(FreeIPABaseModule):
# with given args # with given args
self.add_ipa_command("dnszone_add", zone_name, args) self.add_ipa_command("dnszone_add", zone_name, args)
is_zone_active = True is_zone_active = True
just_added = True # just_added = True
else: else:
# Zone already exist so we need to verify if given args # Zone already exist so we need to verify if given args
...@@ -470,16 +475,18 @@ class DNSZoneModule(FreeIPABaseModule): ...@@ -470,16 +475,18 @@ class DNSZoneModule(FreeIPABaseModule):
if self.ipa_params.state == "disabled" and is_zone_active: if self.ipa_params.state == "disabled" and is_zone_active:
self.add_ipa_command("dnszone_disable", zone_name) self.add_ipa_command("dnszone_disable", zone_name)
if self.ipa_params.state == "absent": if self.ipa_params.state == "absent" and zone is not None:
if zone:
self.add_ipa_command("dnszone_del", zone_name) self.add_ipa_command("dnszone_del", zone_name)
# Due to a bug in FreeIPA dnszone-add won't set # Due to a bug in FreeIPA dnszone-add won't set
# SOA Serial. The good news is that dnszone-mod does the job. # SOA Serial in the creation of a zone, or if
# See: https://pagure.io/freeipa/issue/8227 # another field is modified along with it.
# Because of that, if the zone was just added with a given serial # As a workaround, we set only the SOA serial,
# we run mod just after to workaround the bug # with dnszone-mod, after other changes.
if just_added and self.ipa_params.serial is not None: # See:
# - https://pagure.io/freeipa/issue/8227
# - https://pagure.io/freeipa/issue/8489
if set_serial:
args = { args = {
"idnssoaserial": self.ipa_params.serial, "idnssoaserial": self.ipa_params.serial,
} }
......
...@@ -11,6 +11,80 @@ ...@@ -11,6 +11,80 @@
include_tasks: env_setup.yml include_tasks: env_setup.yml
# Tests # Tests
- name: Verify if zone can be created with a specific SOA serial.
block:
- name: Create zone with serial, refresh, retry and expire.
ipadnszone:
ipaadmin_password: SomeADMINpassword
name: testzone.local
serial: 4567
refresh: 70
retry: 89
expire: 200
- name: Verify zone was created with correct values.
shell: |
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
KRB5CCNAME={{ KRB5CCNAME }} ipa dnszone-show testzone.local
kdestroy -A -q -c {{ KRB5CCNAME }}
register: result
failed_when: |
result.failed or not (
"serial: 4567" in result.stdout
and "refresh: 70" in result.stdout
and "retry: 89" in result.stdout
and "expire: 200" in result.stdout
)
- name: Remove test zone.
ipadnszone:
ipaadmin_password: SomeADMINpassword
name: testzone.local
state: absent
vars:
KRB5CCNAME: verify_bz_1876896
- name: Verify if a zone can have the the SOA serial modified to a specific value.
block:
- name: Create zone.
ipadnszone:
ipaadmin_password: SomeADMINpassword
name: testzone.local
state: present
- name: Modify zone with serial, refresh, retry and expire.
ipadnszone:
ipaadmin_password: SomeADMINpassword
name: testzone.local
serial: 4567
refresh: 70
retry: 89
expire: 200
- name: Verify zone was modified to the correct values
shell: |
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
KRB5CCNAME={{ KRB5CCNAME }} ipa dnszone-show testzone.local
kdestroy -A -q -c {{ KRB5CCNAME }}
register: result
failed_when: |
result.failed or not (
"serial: 4567" in result.stdout
and "refresh: 70" in result.stdout
and "retry: 89" in result.stdout
and "expire: 200" in result.stdout
)
- name: Remove test zone.
ipadnszone:
ipaadmin_password: SomeADMINpassword
name: testzone.local
state: absent
vars:
KRB5CCNAME: verify_bz_1876896
- name: Ensure zone is present. - name: Ensure zone is present.
ipadnszone: ipadnszone:
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment