Commit 7cfc5d3f authored by Thomas Markwalder's avatar Thomas Markwalder

[#35,!517] Addressed review comments

Addressed a myriad of minor typos and wording issues.

modified:
ChangeLog
doc/examples/kea4/all-keys.json
doc/examples/kea6/all-keys.json
doc/sphinx/arm/dhcp4-srv.rst
doc/sphinx/arm/dhcp6-srv.rst
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp4/tests/fqdn_unittest.cc
src/bin/dhcp6/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/d2_unittest.cc
src/bin/dhcp6/tests/fqdn_unittest.cc
src/lib/dhcpsrv/alloc_engine.cc
src/lib/dhcpsrv/alloc_engine.h
src/lib/dhcpsrv/d2_client_cfg.h
src/lib/dhcpsrv/parsers/base_network_parser.cc
src/lib/dhcpsrv/srv_config.h
parent 9635e5fc
......@@ -99,6 +99,7 @@
},
// Specifies a prefix to be prepended to the generated Client FQDN.
// It may be specified at the global, shared-network and subnet levels.
"ddns-generated-prefix": "myhost",
// Boolean flag indicating that server should ignore DHCP client
......@@ -106,18 +107,21 @@
// the server will send DNS updates for both forward and
// reverse DNS data. The default value is false, which indicates
// that the server will delegate DNS update to the client when
// requested.
// requested. It may be specified at the global, shared-network
// and subnet levels.
"ddns-override-client-update": false,
// Boolean flag indicating that the server should override DHCP
// client's wish to not update the DNS. With this parameter
// set to true the server will send DNS update even when
// the client requested no update.
// the client requested no update. It may be specified at the
// global, shared-network and subnet levels.
"ddns-override-no-update": false,
// Suffix appended to the partial name sent to the DNS. The
// default value is an empty string which indicates that no
// suffix is appended.
// suffix is appended. It may be specified at the global,
// shared-network and subnet levels.
"ddns-qualifying-suffix": "",
// Enumeration specifying whether the server should honor
......@@ -128,14 +132,15 @@
// sent, but do not generate one when the client didn't sent
// the name), "when-not-present" (generate the name when
// client didn't send one, otherwise leave the name the
// client sent). The default value is "never".
// client sent). The default value is "never". It may be
// specified at the global, shared-network and subnet levels.
"ddns-replace-client-name": "never",
// Boolean flag which enables or disables the DDNS updating. It
// defaults to true. It may be specified at the global, shared-
// network and subnet levels. It works in conjunction with
// dhcp-ddns:enable-updates which must be true enable connectivity
// kea-dhcp-ddns..
// dhcp-ddns:enable-updates which must be true to enable connectivity
// to kea-dhcp-ddns.
"ddns-send-updates": true,
// Time in seconds specifying how long a declined lease should be
......@@ -177,7 +182,20 @@
"server-ip": "127.0.0.1",
// Port number on which D2 listens for NCRs.
"server-port": 53001
"server-port": 53001,
// The follow parameters are DEPRECATED. They have been
// replaced with parameters that may be set at the global,
// shared-network, and subnet4 scopes. They are listed here
// as configuration parsing still accepts them. Eventually
// support for them will be removed.
"generated-prefix": "myhost",
"hostname-char-replacement": "x",
"hostname-char-set": "[^A-Za-z0-9.-]",
"override-client-update": false,
"override-no-update": false,
"qualifying-suffix": "",
"replace-client-name": "never"
},
// Specifies the first of the two consecutive ports of the UDP
......@@ -520,53 +538,28 @@
// empty string is provided, no restriction is applied.
"client-class": "",
// Specifies a prefix to be prepended to the generated Client FQDN.
// Shared network level value. See description at the global level.
"ddns-generated-prefix": "myhost",
// Boolean flag indicating that server should ignore DHCP client
// wishes to update DNS on its own. With that flag set to true
// the server will send DNS updates for both forward and
// reverse DNS data. The default value is false, which indicates
// that the server will delegate DNS update to the client when
// requested.
// Shared network level value. See description at the global level.
"ddns-override-client-update": false,
// Boolean flag indicating that the server should override DHCP
// client's wish to not update the DNS. With this parameter
// set to true the server will send DNS update even when
// the client requested no update.
// Shared network level value. See description at the global level.
"ddns-override-no-update": false,
// Suffix appended to the partial name sent to the DNS. The
// default value is an empty string which indicates that no
// suffix is appended.
// Shared network level value. See description at the global level.
"ddns-qualifying-suffix": "",
// Enumeration specifying whether the server should honor
// hostname or Client FQDN sent by the client or replace
// this name. The acceptable values are: "never" (use the
// name the client sent), "always" (replace the name the
// client sent), "when-present" (replace the name the client
// sent, but do not generate one when the client didn't sent
// the name), "when-not-present" (generate the name when
// client didn't send one, otherwise leave the name the
// client sent). The default value is "never".
// Shared network level value. See description at the global level.
"ddns-replace-client-name": "never",
// Boolean flag which enables or disables DDNS updating for
// subnets in this network. It works in conjunction with
// dhcp-ddns:enable-updates which must be true enable connectivity
// kea-dhcp-ddns. The default value is "true".
// Shared network level value. See description at the global level.
"ddns-send-updates": true,
// String of zero or more characters with which to replace each
// invalid character in the hostname or Client FQDN. The default
// value is an empty string which will cause invalid characters
// to be omitted rather than replaced.
// Shared network level value. See description at the global level.
"hostname-char-replacement": "x",
// Regular expression describing the invalid character set in
// the hostname or Client FQDN.
// Shared network level value. See description at the global level.
"hostname-char-set": "[^A-Za-z0-9.-]",
// Specifies that this shared network is selected for the
......@@ -640,53 +633,28 @@
// provided, no restriction is applied.
"client-class": "",
// Specifies a prefix to be prepended to the generated Client FQDN.
// Subnet level value. See description at the global level.
"ddns-generated-prefix": "myhost",
// Boolean flag indicating that server should ignore DHCP client
// wishes to update DNS on its own. With that flag set to true
// the server will send DNS updates for both forward and
// reverse DNS data. The default value is false, which indicates
// that the server will delegate DNS update to the client when
// requested.
// Subnet level value. See description at the global level.
"ddns-override-client-update": false,
// Boolean flag indicating that the server should override DHCP
// client's wish to not update the DNS. With this parameter
// set to true the server will send DNS update even when
// the client requested no update.
// Subnet level value. See description at the global level.
"ddns-override-no-update": false,
// Suffix appended to the partial name sent to the DNS. The
// default value is an empty string which indicates that no
// suffix is appended.
// Subnet level value. See description at the global level.
"ddns-qualifying-suffix": "",
// Enumeration specifying whether the server should honor
// hostname or Client FQDN sent by the client or replace
// this name. The acceptable values are: "never" (use the
// name the client sent), "always" (replace the name the
// client sent), "when-present" (replace the name the client
// sent, but do not generate one when the client didn't sent
// the name), "when-not-present" (generate the name when
// client didn't send one, otherwise leave the name the
// client sent). The default value is "never".
// Subnet level value. See description at the global level.
"ddns-replace-client-name": "never",
// Boolean flag which enables or disables DDNS updating for
// subnets in this network. It works in conjunction with
// dhcp-ddns:enable-updates which must be true enable connectivity
// kea-dhcp-ddns. The default value is "true".
// Subnet level value. See description at the global level.
"ddns-send-updates": true,
// String of zero or more characters with which to replace each
// invalid character in the hostname or Client FQDN. The default
// value is an empty string which will cause invalid characters
// to be omitted rather than replaced.
// Subnet level value. See description at the global level.
"hostname-char-replacement": "x",
// Regular expression describing the invalid character set in
// the hostname or Client FQDN.
// Subnet level value. See description at the global level.
"hostname-char-set": "[^A-Za-z0-9.-]",
// Subnet unique identifier.
......
......@@ -64,6 +64,7 @@
},
// Specifies a prefix to be prepended to the generated Client FQDN.
// It may be specified at the global, shared-network and subnet levels.
"ddns-generated-prefix": "myhost",
// Boolean flag indicating that server should ignore DHCP client
......@@ -71,18 +72,21 @@
// the server will send DNS updates for both forward and
// reverse DNS data. The default value is false, which indicates
// that the server will delegate DNS update to the client when
// requested.
// requested. It may be specified at the global, shared-network
// and subnet levels.
"ddns-override-client-update": false,
// Boolean flag indicating that the server should override DHCP
// client's wish to not update the DNS. With this parameter
// set to true the server will send DNS update even when
// the client requested no update.
// the client requested no update. It may be specified at the
// global, shared-network and subnet levels.
"ddns-override-no-update": false,
// Suffix appended to the partial name sent to the DNS. The
// default value is an empty string which indicates that no
// suffix is appended.
// suffix is appended. It may be specified at the global,
// shared-network and subnet levels.
"ddns-qualifying-suffix": "",
// Enumeration specifying whether the server should honor
......@@ -93,14 +97,15 @@
// sent, but do not generate one when the client didn't sent
// the name), "when-not-present" (generate the name when
// client didn't send one, otherwise leave the name the
// client sent). The default value is "never".
// client sent). The default value is "never". It may be
// specified at the global, shared-network and subnet levels.
"ddns-replace-client-name": "never",
// Boolean flag which enables or disables the DDNS updating. It
// defaults to true. It may be specified at the global, shared-
// network and subnet levels. It works in conjunction with
// dhcp-ddns:enable-updates which must be true enable connectivity
// kea-dhcp-ddns..
// dhcp-ddns:enable-updates which must be true to enable connectivity
// to kea-dhcp-ddns.
"ddns-send-updates": true,
// Time in seconds specifying how long a declined lease should be
......@@ -141,7 +146,20 @@
"server-ip": "::1",
// Port number on which D2 listens for NCRs.
"server-port": 53001
"server-port": 53001,
// The follow parameters are DEPRECATED. They have been
// replaced with parameters that may be set at the global,
// shared-network, and subnet6 scopes. They are listed here
// as configuration parsing still accepts them. Eventually
// support for them will be removed.
"generated-prefix": "myhost",
"hostname-char-replacement": "x",
"hostname-char-set": "[^A-Za-z0-9.-]",
"override-client-update": false,
"override-no-update": false,
"qualifying-suffix": "",
"replace-client-name": "never"
},
// Specifies the first of the two consecutive ports of the UDP
......@@ -473,53 +491,28 @@
// empty string is provided, no restriction is applied.
"client-class": "",
// Specifies a prefix to be prepended to the generated Client FQDN.
// Shared network level value. See description at the global level.
"ddns-generated-prefix": "myhost",
// Boolean flag indicating that server should ignore DHCP client
// wishes to update DNS on its own. With that flag set to true
// the server will send DNS updates for both forward and
// reverse DNS data. The default value is false, which indicates
// that the server will delegate DNS update to the client when
// requested.
// Shared network level value. See description at the global level.
"ddns-override-client-update": false,
// Boolean flag indicating that the server should override DHCP
// client's wish to not update the DNS. With this parameter
// set to true the server will send DNS update even when
// the client requested no update.
// Shared network level value. See description at the global level.
"ddns-override-no-update": false,
// Suffix appended to the partial name sent to the DNS. The
// default value is an empty string which indicates that no
// suffix is appended.
// Shared network level value. See description at the global level.
"ddns-qualifying-suffix": "",
// Enumeration specifying whether the server should honor
// hostname or Client FQDN sent by the client or replace
// this name. The acceptable values are: "never" (use the
// name the client sent), "always" (replace the name the
// client sent), "when-present" (replace the name the client
// sent, but do not generate one when the client didn't sent
// the name), "when-not-present" (generate the name when
// client didn't send one, otherwise leave the name the
// client sent). The default value is "never".
// Shared network level value. See description at the global level.
"ddns-replace-client-name": "never",
// Boolean flag which enables or disables DDNS updating for
// subnets in this network. It works in conjunction with
// dhcp-ddns:enable-updates which must be true enable connectivity
// kea-dhcp-ddns. The default value is "true".
// Shared network level value. See description at the global level.
"ddns-send-updates": true,
// String of zero or more characters with which to replace each
// invalid character in the Client FQDN. The default
// value is an empty string which will cause invalid characters
// to be omitted rather than replaced.
// Shared network level value. See description at the global level.
"hostname-char-replacement": "x",
// Regular expression describing the invalid character set in
// the Client FQDN.
// Shared network level value. See description at the global level.
"hostname-char-set": "[^A-Za-z0-9.-]",
// Specifies that this shared network is selected for the
......@@ -588,53 +581,28 @@
// provided, no restriction is applied.
"client-class": "",
// Specifies a prefix to be prepended to the generated Client FQDN.
// Subnet level value. See description at the global level.
"ddns-generated-prefix": "myhost",
// Boolean flag indicating that server should ignore DHCP client
// wishes to update DNS on its own. With that flag set to true
// the server will send DNS updates for both forward and
// reverse DNS data. The default value is false, which indicates
// that the server will delegate DNS update to the client when
// requested.
// Subnet level value. See description at the global level.
"ddns-override-client-update": false,
// Boolean flag indicating that the server should override DHCP
// client's wish to not update the DNS. With this parameter
// set to true the server will send DNS update even when
// the client requested no update.
// Subnet level value. See description at the global level.
"ddns-override-no-update": false,
// Suffix appended to the partial name sent to the DNS. The
// default value is an empty string which indicates that no
// suffix is appended.
// Subnet level value. See description at the global level.
"ddns-qualifying-suffix": "",
// Enumeration specifying whether the server should honor
// hostname or Client FQDN sent by the client or replace
// this name. The acceptable values are: "never" (use the
// name the client sent), "always" (replace the name the
// client sent), "when-present" (replace the name the client
// sent, but do not generate one when the client didn't sent
// the name), "when-not-present" (generate the name when
// client didn't send one, otherwise leave the name the
// client sent). The default value is "never".
// Subnet level value. See description at the global level.
"ddns-replace-client-name": "never",
// Boolean flag which enables or disables DDNS updating for
// subnets in this network. It works in conjunction with
// dhcp-ddns:enable-updates which must be true enable connectivity
// kea-dhcp-ddns. The default value is "true".
// Subnet level value. See description at the global level.
"ddns-send-updates": true,
// String of zero or more characters with which to replace each
// invalid character in the Client FQDN. The default
// value is an empty string which will cause invalid characters
// to be omitted rather than replaced.
// Subnet level value. See description at the global level.
"hostname-char-replacement": "x",
// Regular expression describing the invalid character set in
// the or Client FQDN.
// Subnet level value. See description at the global level.
"hostname-char-set": "[^A-Za-z0-9.-]",
// Subnet unique identifier.
......
......@@ -2812,7 +2812,7 @@ NCRs. Each NCR contains the following information:
(information identifying the client associated with the FQDN)
Prior to Kea 1.7.1, all parameters for controlling DDNS were within the
global, ``dhcp-ddns`` section of the kea-dhcp4. Beginning with Kea 1.7.1
global ``dhcp-ddns`` section of the kea-dhcp4. Beginning with Kea 1.7.1
DDNS related parameters were split into two groups:
1. Connectivity Parameters
......@@ -2856,7 +2856,7 @@ DDNS related parameters were split into two groups:
parameter is specified both globally and in ``dhcp-ddns``, the latter
value will be ignored. In either case, a log will be emitted explaining
what has occurred. Specifying these values within ``dhcp-ddns`` is
deprecated and support for it may be removed at some future date.
deprecated and support for it will be removed at some future date.
The default configuration would appear as follows:
......@@ -2897,22 +2897,22 @@ together:
.. table:: Enabling and Disabling DDNS Updates
+-----------------+--------------------+------------------------------+
| dhcp-ddns: | Global | Outcome |
| enable-updates | ddns-send-udpates | |
+=================+====================+==============================+
| false (default) | false | no updates at any scope |
+-----------------+--------------------+------------------------------+
| false | true (default) | no updates at any scope |
+-----------------+--------------------+------------------------------+
| true | false | updates only at scopes with |
| | | a local value of true for |
| | | ddns-enable-updates |
+-----------------+--------------------+------------------------------+
| true | true | updates at all scopes except |
| | | those with a local value of |
| | | false for ddns-enble-updates |
+-----------------+--------------------+------------------------------+
+-----------------+--------------------+-------------------------------+
| dhcp-ddns: | Global | Outcome |
| enable-updates | ddns-send-udpates | |
+=================+====================+===============================+
| false (default) | false | no updates at any scope |
+-----------------+--------------------+-------------------------------+
| false | true (default) | no updates at any scope |
+-----------------+--------------------+-------------------------------+
| true | false | updates only at scopes with |
| | | a local value of true for |
| | | ddns-enable-updates |
+-----------------+--------------------+-------------------------------+
| true | true | updates at all scopes except |
| | | those with a local value of |
| | | false for ddns-enable-updates |
+-----------------+--------------------+-------------------------------+
.. _dhcpv4-d2-io-config:
......
......@@ -2566,13 +2566,13 @@ NCR contains the following information:
(information identifying the client associated with the FQDN)
Prior to Kea 1.7.1, all parameters for controlling DDNS were within the
global, ``dhcp-ddns`` section of the kea-dhcp6. Beginning with Kea 1.7.1
global ``dhcp-ddns`` section of the kea-dhcp6. Beginning with Kea 1.7.1
DDNS related parameters were split into two groups:
1. Connectivity Parameters
These are parameters which specify where and how kea-dhcp4 connects to
These are parameters which specify where and how kea-dhcp6 connects to
and communicates with D2. These parameters can only be specified
within the top-level ``dhcp-ddns`` section in the kea-dhcp4
within the top-level ``dhcp-ddns`` section in the kea-dhcp6
configuration. The connectivity parameters are listed below:
- ``enable-updates``
......@@ -2608,9 +2608,9 @@ DDNS related parameters were split into two groups:
the original behavioral parameters specified in ``dhcp-ddns``. It will
do so by translating the parameter into its global equivalent. If a
parameter is specified both globally and in ``dhcp-ddns``, the latter
value will be ignored. In either case, a log will be emitted explaining what
has occurred. Specifying these values within ``dhcp-ddns`` is deprecated
and support for it may be removed at some future date.
value will be ignored. In either case, a log will be emitted explaining
what has occurred. Specifying these values within ``dhcp-ddns`` is
deprecated and support for it will be removed at some future date.
The default configuration and values would appear as follows:
......@@ -2651,22 +2651,22 @@ together:
.. table:: Enabling and Disabling DDNS Updates
+-----------------+--------------------+------------------------------+
| dhcp-ddns: | Global | Outcome |
| enable-updates | ddns-send-udpates | |
+=================+====================+==============================+
| false (default) | false | no updates at any scope |
+-----------------+--------------------+------------------------------+
| false | true (default) | no updates at any scope |
+-----------------+--------------------+------------------------------+
| true | false | updates only at scopes with |
| | | a local value of true for |
| | | ddns-enable-updates |
+-----------------+--------------------+------------------------------+
| true | true | updates at all scopes except |
| | | those with a local value of |
| | | false for ddns-enble-updates |
+-----------------+--------------------+------------------------------+
+-----------------+--------------------+-------------------------------+
| dhcp-ddns: | Global | Outcome |
| enable-updates | ddns-send-udpates | |
+=================+====================+===============================+
| false (default) | false | no updates at any scope |
+-----------------+--------------------+-------------------------------+
| false | true (default) | no updates at any scope |
+-----------------+--------------------+-------------------------------+
| true | false | updates only at scopes with |
| | | a local value of true for |
| | | ddns-enable-updates |
+-----------------+--------------------+-------------------------------+
| true | true | updates at all scopes except |
| | | those with a local value of |
| | | false for ddns-enable-updates |
+-----------------+--------------------+-------------------------------+
.. _dhcpv6-d2-io-config:
......@@ -2674,7 +2674,7 @@ DHCP-DDNS Server Connectivity
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For NCRs to reach the D2 server, kea-dhcp6 must be able to communicate
with it. kea-dhcp4 uses the following configuration parameters to
with it. kea-dhcp6 uses the following configuration parameters to
control this communication:
- ``enable-updates`` - As of Kea 1.7.1, this parameter only enables
......
......@@ -1799,8 +1799,9 @@ Dhcpv4Srv::processHostnameOption(Dhcpv4Exchange& ex) {
// send back a hostname option, send this option with a reserved
// name for this client.
if (should_send_hostname) {
std::string hostname = d2_mgr.qualifyName(ctx->currentHost()->getHostname(),
*(ex.getContext()->getDdnsParams()), false);
std::string hostname =
d2_mgr.qualifyName(ctx->currentHost()->getHostname(),
*(ex.getContext()->getDdnsParams()), false);
// Convert hostname to lower case.
boost::algorithm::to_lower(hostname);
......@@ -1823,8 +1824,8 @@ Dhcpv4Srv::processHostnameOption(Dhcpv4Exchange& ex) {
// hostname option to this client if the client has included hostname option
// but there is no reservation, or the configuration of the server requires
// that we send the option regardless.
D2ClientConfig::ReplaceClientNameMode replace_name_mode
= ex.getContext()->getDdnsParams()->replace_client_name_mode_;
D2ClientConfig::ReplaceClientNameMode replace_name_mode =
ex.getContext()->getDdnsParams()->replace_client_name_mode_;
// If we don't have a hostname then either we'll supply it or do nothing.
if (!opt_hostname) {
......@@ -1898,8 +1899,8 @@ Dhcpv4Srv::processHostnameOption(Dhcpv4Exchange& ex) {
opt_hostname_resp.reset(new OptionString(Option::V4, DHO_HOST_NAME, "."));
} else {
// Sanitize the name the client sent us, if we're configured to do so.
isc::util::str::StringSanitizerPtr sanitizer
= ex.getContext()->getDdnsParams()->getHostnameSanitizer();
isc::util::str::StringSanitizerPtr sanitizer =
ex.getContext()->getDdnsParams()->getHostnameSanitizer();
if (sanitizer) {
hostname = sanitizer->scrub(hostname);
......@@ -2292,7 +2293,6 @@ Dhcpv4Srv::assignLease(Dhcpv4Exchange& ex) {
// Set T1 and T2 per configuration.
setTeeTimes(lease, subnet, resp);
// Create NameChangeRequests if DDNS is enabled and this is a
// real allocation.
if (!fake_allocation && (ex.getContext()->getDdnsParams()->enable_updates_)) {
......
......@@ -4289,7 +4289,6 @@ TEST_F(Dhcp4ParserTest, d2ClientConfigValid) {
// The following, deprecated dhcp-ddns parameters,
// should all have global default values.
checkGlobal("ddns-send-updates", true);
checkGlobal("ddns-override-no-update", false);
checkGlobal("ddns-override-client-update", false);
checkGlobal("ddns-replace-client-name", "never");
......
......@@ -2106,7 +2106,7 @@ TEST_F(NameDhcpv4SrvTest, sanitizeFqdnGlobal) {
}
}
// Verifies that socped ddns-parameter handling.
// Verifies that scoped ddns-parameter handling.
// Specifically that D2 can be enabled with sending updates
// disabled globally, and enabled at the subnet level.
TEST_F(NameDhcpv4SrvTest, ddnsScopeTest) {
......@@ -2120,7 +2120,8 @@ TEST_F(NameDhcpv4SrvTest, ddnsScopeTest) {
// Include the Client FQDN option.
ASSERT_NO_THROW(client1.includeFQDN((Option4ClientFqdn::FLAG_S
| Option4ClientFqdn::FLAG_E),
"client1.example.org.", Option4ClientFqdn::FULL));
"client1.example.org.",
Option4ClientFqdn::FULL));
// Now send the DHCPREQUEST with including the FQDN option.
ASSERT_NO_THROW(client1.doDORA());
......@@ -2144,7 +2145,8 @@ TEST_F(NameDhcpv4SrvTest, ddnsScopeTest) {
// Include the Client FQDN option.
ASSERT_NO_THROW(client2.includeFQDN((Option4ClientFqdn::FLAG_S
| Option4ClientFqdn::FLAG_E),
"two.example.org.", Option4ClientFqdn::FULL));
"two.example.org.",
Option4ClientFqdn::FULL));
ASSERT_NO_THROW(client2.doDORA());
resp = client2.getContext().response_;
......
......@@ -4781,9 +4781,8 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) {
EXPECT_TRUE (pools.at(3)->clientSupported(classes));
}
// This test checks the ability of the server to parse a configuration
// containing a full, valid dhcp-ddns (D2ClientConfig) entry.
TEST_F(Dhcp6ParserTest, d2ClientConfig) {
// This test verifies that valid d2CliengConfig works correctly.
TEST_F(Dhcp6ParserTest, d2ClientConfigValid) {