summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAna Krivokapic <akrivoka@redhat.com>2013-05-09 18:47:12 +0200
committerMartin Kosek <mkosek@redhat.com>2013-05-16 11:01:33 +0200
commitc5bfeb1ed0fc8a31fcfea475cccc98da37f7c17e (patch)
tree14c3f46121ed968a58764259a2c3c67741734a61
parent78774916c89a3feac7ab8b380fcd483285951a8d (diff)
downloadfreeipa-c5bfeb1ed0fc8a31fcfea475cccc98da37f7c17e.tar.gz
freeipa-c5bfeb1ed0fc8a31fcfea475cccc98da37f7c17e.tar.xz
freeipa-c5bfeb1ed0fc8a31fcfea475cccc98da37f7c17e.zip
Prompt for nameserver IP address in dnszone-add
Prompt for nameserver IP address in interactive mode of dnszone-add. Add a corresponding field to dnszone creation dialog in the web UI. This parameter is required if and only if: * New zone is a forward zone * Nameserver is defined inside the new zone Add a new unit test to cover this functionality. https://fedorahosted.org/freeipa/ticket/3603
-rw-r--r--install/ui/src/freeipa/dns.js58
-rw-r--r--install/ui/src/freeipa/widget.js4
-rw-r--r--install/ui/test/data/ipa_init_commands.json11
-rw-r--r--ipalib/plugins/dns.py21
-rw-r--r--tests/test_cmdline/test_cli.py67
5 files changed, 161 insertions, 0 deletions
diff --git a/install/ui/src/freeipa/dns.js b/install/ui/src/freeipa/dns.js
index 5024e8b76..52cbb81f3 100644
--- a/install/ui/src/freeipa/dns.js
+++ b/install/ui/src/freeipa/dns.js
@@ -300,6 +300,11 @@ return {
fields: [
'idnssoamname',
{
+ name: 'ip_address',
+ validators: [ 'ip_address' ],
+ metadata: '@mc-opt:dnszone_add:ip_address'
+ },
+ {
name: 'idnssoarname',
required: false
},
@@ -576,11 +581,64 @@ IPA.dnszone_adder_dialog = function(spec) {
var that = IPA.entity_adder_dialog(spec);
+ function ends_with(str, suffix) {
+ return str.indexOf(suffix, str.length - suffix.length) !== -1;
+ }
+
+ var init = function() {
+ var zone_w = that.fields.get_field('idnsname').widget;
+ var reverse_zone_w = that.fields.get_field('name_from_ip').widget;
+ var ns_w = that.fields.get_field('idnssoamname').widget;
+
+ zone_w.value_changed.attach(that.check_ns_ip);
+ reverse_zone_w.value_changed.attach(that.check_ns_ip);
+ ns_w.value_changed.attach(that.check_ns_ip);
+ };
+
+ that.check_ns_ip = function() {
+ var ip_address_f = that.fields.get_field('ip_address');
+ var zone_w = that.fields.get_field('idnsname').widget;
+ var ns_w = that.fields.get_field('idnssoamname').widget;
+
+ var zone = zone_w.save()[0] || '';
+ var ns = ns_w.save()[0] || '';
+
+ var zone_is_reverse = !zone_w.is_enabled() ||
+ ends_with(zone, '.in-addr.arpa.') ||
+ ends_with(zone, '.ip6.arpa.');
+ var relative_ns = true;
+ var ns_in_zone = false;
+
+ if (ns && ns[ns.length-1] === '.') {
+ relative_ns = false;
+ ns = ns.slice(0, -1);
+ }
+
+ if (zone && zone[zone.length-1] === '.') {
+ zone = zone.slice(0, -1);
+ }
+
+ if (ns && zone && ends_with(ns, '.' + zone)) {
+ ns_in_zone = true;
+ }
+
+ if (!zone_is_reverse && (relative_ns || ns_in_zone)) {
+ ip_address_f.set_enabled(true);
+ ip_address_f.set_required(true);
+ } else {
+ ip_address_f.reset();
+ ip_address_f.set_required(false);
+ ip_address_f.set_enabled(false);
+ }
+ };
+
that.create = function() {
that.entity_adder_dialog_create();
that.container.addClass('dnszone-adder-dialog');
};
+ init();
+
return that;
};
diff --git a/install/ui/src/freeipa/widget.js b/install/ui/src/freeipa/widget.js
index 8f1208e0b..4570c9033 100644
--- a/install/ui/src/freeipa/widget.js
+++ b/install/ui/src/freeipa/widget.js
@@ -303,6 +303,10 @@ IPA.text_widget = function(spec) {
}
};
+ that.is_enabled = function(value) {
+ return !that.input.prop('disabled');
+ };
+
that.set_enabled = function(value) {
that.input.prop('disabled', !value);
diff --git a/install/ui/test/data/ipa_init_commands.json b/install/ui/test/data/ipa_init_commands.json
index a7e00ba55..b66ae4dd1 100644
--- a/install/ui/test/data/ipa_init_commands.json
+++ b/install/ui/test/data/ipa_init_commands.json
@@ -7654,6 +7654,17 @@
{
"attribute": true,
"class": "Str",
+ "doc": "Add forward record for nameserver located in the created zone",
+ "flags": [],
+ "label": "Nameserver IP address",
+ "name": "ip_address",
+ "noextrawhitespace": true,
+ "required": true,
+ "type": "unicode"
+ },
+ {
+ "attribute": true,
+ "class": "Str",
"doc": "Administrator e-mail address",
"flags": [],
"label": "Administrator e-mail address",
diff --git a/ipalib/plugins/dns.py b/ipalib/plugins/dns.py
index 3ad03402d..fbc445215 100644
--- a/ipalib/plugins/dns.py
+++ b/ipalib/plugins/dns.py
@@ -1781,9 +1781,30 @@ class dnszone_add(LDAPCreate):
),
Str('ip_address?', _validate_ipaddr,
doc=_('Add forward record for nameserver located in the created zone'),
+ label=_('Nameserver IP address'),
),
)
+ def interactive_prompt_callback(self, kw):
+ """
+ Interactive mode should prompt for nameserver IP address only if all
+ of the following conditions are true:
+ * New zone is a forward zone
+ * NS is defined inside the new zone (NS can be given either in the
+ form of absolute or relative name)
+ """
+ if kw.get('ip_address', None):
+ return
+
+ zone = normalize_zone(kw['idnsname'])
+ ns = kw['idnssoamname']
+ relative_ns = not ns.endswith('.')
+ ns_in_zone = self.obj.get_name_in_zone(zone, ns)
+
+ if not zone_is_reverse(zone) and (relative_ns or ns_in_zone):
+ ip_address = self.Backend.textui.prompt(_(u'Nameserver IP address'))
+ kw['ip_address'] = ip_address
+
def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options):
assert isinstance(dn, DN)
if not dns_container_exists(self.api.Backend.ldap2):
diff --git a/tests/test_cmdline/test_cli.py b/tests/test_cmdline/test_cli.py
index f66906c6a..bd1281e1d 100644
--- a/tests/test_cmdline/test_cli.py
+++ b/tests/test_cmdline/test_cli.py
@@ -258,3 +258,70 @@ class TestCLIParsing(object):
version=API_VERSION)
finally:
self.run_command('dnszone_del', idnsname=u'test-example.com')
+
+ def test_dnszone_add(self):
+ """
+ Test dnszone-add with nameserver IP passed interatively
+ """
+ # Pass IP of nameserver interactively for nameserver in zone
+ # (absolute name)
+ with self.fake_stdin('1.1.1.1\n'):
+ self.check_command(
+ 'dnszone_add example.com --name-server=ns.example.com. '
+ '--admin-email=admin@example.com',
+ 'dnszone_add',
+ idnsname=u'example.com',
+ idnssoamname=u'ns.example.com.',
+ idnssoarname=u'admin@example.com',
+ ip_address=u'1.1.1.1',
+ idnssoaexpire=util.Fuzzy(type=int),
+ idnssoaserial=util.Fuzzy(type=int),
+ idnssoaretry=util.Fuzzy(type=int),
+ idnssoaminimum=util.Fuzzy(type=int),
+ idnssoarefresh=util.Fuzzy(type=int),
+ all=False,
+ raw=False,
+ force=False,
+ version=API_VERSION
+ )
+
+ # Pass IP of nameserver interactively for nameserver in zone
+ # (relative name)
+ with self.fake_stdin('1.1.1.1\n'):
+ self.check_command(
+ 'dnszone_add example.com --name-server=ns '
+ '--admin-email=admin@example.com',
+ 'dnszone_add',
+ idnsname=u'example.com',
+ idnssoamname=u'ns',
+ idnssoarname=u'admin@example.com',
+ ip_address=u'1.1.1.1',
+ idnssoaexpire=util.Fuzzy(type=int),
+ idnssoaserial=util.Fuzzy(type=int),
+ idnssoaretry=util.Fuzzy(type=int),
+ idnssoaminimum=util.Fuzzy(type=int),
+ idnssoarefresh=util.Fuzzy(type=int),
+ all=False,
+ raw=False,
+ force=False,
+ version=API_VERSION
+ )
+
+ # Nameserver is outside the zone - no need to pass the IP
+ self.check_command(
+ 'dnszone_add example.com --name-server=ns.example.net. '
+ '--admin-email=admin@example.com',
+ 'dnszone_add',
+ idnsname=u'example.com',
+ idnssoamname=u'ns.example.net.',
+ idnssoarname=u'admin@example.com',
+ idnssoaexpire=util.Fuzzy(type=int),
+ idnssoaserial=util.Fuzzy(type=int),
+ idnssoaretry=util.Fuzzy(type=int),
+ idnssoaminimum=util.Fuzzy(type=int),
+ idnssoarefresh=util.Fuzzy(type=int),
+ all=False,
+ raw=False,
+ force=False,
+ version=API_VERSION
+ )