Commit 2c6124fb authored by Francis Dupont's avatar Francis Dupont

[30-implement-control-socket-for-ddns-2] Ported more code and some tests

parent 55cf0972
...@@ -34,7 +34,8 @@ D2CfgContext::D2CfgContext() ...@@ -34,7 +34,8 @@ D2CfgContext::D2CfgContext()
: d2_params_(new D2Params()), : d2_params_(new D2Params()),
forward_mgr_(new DdnsDomainListMgr("forward-ddns")), forward_mgr_(new DdnsDomainListMgr("forward-ddns")),
reverse_mgr_(new DdnsDomainListMgr("reverse-ddns")), reverse_mgr_(new DdnsDomainListMgr("reverse-ddns")),
keys_(new TSIGKeyInfoMap()) { keys_(new TSIGKeyInfoMap()),
control_socket_(ConstElementPtr()) {
} }
D2CfgContext::D2CfgContext(const D2CfgContext& rhs) : ConfigBase(rhs) { D2CfgContext::D2CfgContext(const D2CfgContext& rhs) : ConfigBase(rhs) {
...@@ -50,6 +51,8 @@ D2CfgContext::D2CfgContext(const D2CfgContext& rhs) : ConfigBase(rhs) { ...@@ -50,6 +51,8 @@ D2CfgContext::D2CfgContext(const D2CfgContext& rhs) : ConfigBase(rhs) {
} }
keys_ = rhs.keys_; keys_ = rhs.keys_;
control_socket_ = rhs.control_socket_;
} }
D2CfgContext::~D2CfgContext() { D2CfgContext::~D2CfgContext() {
...@@ -94,6 +97,10 @@ D2CfgContext::toElement() const { ...@@ -94,6 +97,10 @@ D2CfgContext::toElement() const {
tsig_keys->add(key->second->toElement()); tsig_keys->add(key->second->toElement());
} }
d2->set("tsig-keys", tsig_keys); d2->set("tsig-keys", tsig_keys);
// Set control-socket (skip if null as empty is not legal)
if (!isNull(control_socket_)) {
d2->set("control-socket", UserContext::toElement(control_socket_));
}
// Set DhcpDdns // Set DhcpDdns
ElementPtr result = Element::createMap(); ElementPtr result = Element::createMap();
result->set("DhcpDdns", d2); result->set("DhcpDdns", d2);
...@@ -238,6 +245,11 @@ D2CfgMgr::getD2Params() { ...@@ -238,6 +245,11 @@ D2CfgMgr::getD2Params() {
return (getD2CfgContext()->getD2Params()); return (getD2CfgContext()->getD2Params());
} }
const isc::data::ConstElementPtr
D2CfgMgr::getControlSocketInfo() {
return (getD2CfgContext()->getControlSocketInfo());
}
std::string std::string
D2CfgMgr::getConfigSummary(const uint32_t) { D2CfgMgr::getConfigSummary(const uint32_t) {
return (getD2Params()->getConfigSummary()); return (getD2Params()->getConfigSummary());
......
...@@ -90,6 +90,18 @@ public: ...@@ -90,6 +90,18 @@ public:
keys_ = keys; keys_ = keys;
} }
/// @brief Returns information about control socket
/// @return pointer to the Element that holds control-socket map
const isc::data::ConstElementPtr getControlSocketInfo() const {
return (control_socket_);
}
/// @brief Sets information about the control socket
/// @param control_socket Element that holds control-socket map
void setControlSocketInfo(const isc::data::ConstElementPtr& control_socket) {
control_socket_ = control_socket;
}
/// @brief Unparse a configuration object /// @brief Unparse a configuration object
/// ///
/// @return a pointer to a configuration /// @return a pointer to a configuration
...@@ -112,8 +124,11 @@ private: ...@@ -112,8 +124,11 @@ private:
/// @brief Reverse domain list manager. /// @brief Reverse domain list manager.
DdnsDomainListMgrPtr reverse_mgr_; DdnsDomainListMgrPtr reverse_mgr_;
/// @brief Storage for the map of TSIGKeyInfos /// @brief Storage for the map of TSIGKeyInfos.
TSIGKeyInfoMapPtr keys_; TSIGKeyInfoMapPtr keys_;
/// @brief Pointer to the control-socket information.
isc::data::ConstElementPtr control_socket_;
}; };
/// @brief Defines a pointer for DdnsDomain instances. /// @brief Defines a pointer for DdnsDomain instances.
...@@ -254,6 +269,11 @@ public: ...@@ -254,6 +269,11 @@ public:
/// @return reference to const D2ParamsPtr /// @return reference to const D2ParamsPtr
const D2ParamsPtr& getD2Params(); const D2ParamsPtr& getD2Params();
/// @brief Convenience method fetches information about control socket
/// from context
/// @return pointer to the Element that holds control-socket map
const isc::data::ConstElementPtr getControlSocketInfo();
/// @brief Returns configuration summary in the textual format. /// @brief Returns configuration summary in the textual format.
/// ///
/// @param selection Bitfield which describes the parts of the configuration /// @param selection Bitfield which describes the parts of the configuration
......
...@@ -77,7 +77,7 @@ namespace d2 { ...@@ -77,7 +77,7 @@ namespace d2 {
/// "interface" : "eth1" , /// "interface" : "eth1" ,
/// "ip-address" : "192.168.1.33" , /// "ip-address" : "192.168.1.33" ,
/// "port" : 88 , /// "port" : 88 ,
/// "control-socket": /// "control-socket":
/// { /// {
/// "socket-type": "unix" , /// "socket-type": "unix" ,
/// "socket-name": "/tmp/d2-ctrl-socket" /// "socket-name": "/tmp/d2-ctrl-socket"
......
...@@ -46,7 +46,7 @@ D2Controller::D2Controller() ...@@ -46,7 +46,7 @@ D2Controller::D2Controller()
: DControllerBase(d2_app_name_, d2_bin_name_) { : DControllerBase(d2_app_name_, d2_bin_name_) {
} }
isc::data::ConstElementPtr isc::data::ConstElementPtr
D2Controller::parseFile(const std::string& file_name) { D2Controller::parseFile(const std::string& file_name) {
isc::data::ConstElementPtr elements; isc::data::ConstElementPtr elements;
......
...@@ -265,6 +265,15 @@ void D2SimpleParser::parse(const D2CfgContextPtr& ctx, ...@@ -265,6 +265,15 @@ void D2SimpleParser::parse(const D2CfgContextPtr& ctx,
ctx->setContext(user); ctx->setContext(user);
} }
ConstElementPtr socket = config->get("control-socket");
if (socket) {
if (socket->getType() != Element::map) {
isc_throw(D2CfgError, "Specified control-socket is expected to be a map"
", i.e. a structure defined within { }");
}
ctx->setControlSocketInfo(socket);
}
// Attempt to create the new client config. This ought to fly as // Attempt to create the new client config. This ought to fly as
// we already validated everything. // we already validated everything.
D2ParamsPtr params(new D2Params(ip_address, port, dns_server_timeout, D2ParamsPtr params(new D2Params(ip_address, port, dns_server_timeout,
......
...@@ -39,7 +39,7 @@ public: ...@@ -39,7 +39,7 @@ public:
/// @brief Defines currently supported scopes /// @brief Defines currently supported scopes
/// ///
/// D2Parser may eventually support multiple levels of parsing scope. /// D2Parser may eventually support multiple levels of parsing scope.
/// Currently it supports only the D2 module scope which expects the data /// Currently it supports only the D2 module scope which expects the data
/// to be parsed to be a map containing the DhcpDdns element and its /// to be parsed to be a map containing the DhcpDdns element and its
/// constituents. /// constituents.
......
...@@ -80,9 +80,9 @@ public: ...@@ -80,9 +80,9 @@ public:
" \"dns-server-timeout\": " << dns_server_timeout << " , " " \"dns-server-timeout\": " << dns_server_timeout << " , "
" \"ncr-protocol\": \"" << ncr_protocol << "\" , " " \"ncr-protocol\": \"" << ncr_protocol << "\" , "
" \"ncr-format\": \"" << ncr_format << "\", " " \"ncr-format\": \"" << ncr_format << "\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {} " " \"reverse-ddns\" : {} "
"}"; "}";
return (config.str()); return (config.str());
...@@ -261,9 +261,9 @@ TEST_F(D2CfgMgrTest, defaultValues) { ...@@ -261,9 +261,9 @@ TEST_F(D2CfgMgrTest, defaultValues) {
" \"dns-server-timeout\": 333 , " " \"dns-server-timeout\": 333 , "
" \"ncr-protocol\": \"UDP\" , " " \"ncr-protocol\": \"UDP\" , "
" \"ncr-format\": \"JSON\", " " \"ncr-format\": \"JSON\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {} " " \"reverse-ddns\" : {} "
"}"; "}";
RUN_CONFIG_OK(config); RUN_CONFIG_OK(config);
...@@ -279,9 +279,9 @@ TEST_F(D2CfgMgrTest, defaultValues) { ...@@ -279,9 +279,9 @@ TEST_F(D2CfgMgrTest, defaultValues) {
" \"dns-server-timeout\": 333 , " " \"dns-server-timeout\": 333 , "
" \"ncr-protocol\": \"UDP\" , " " \"ncr-protocol\": \"UDP\" , "
" \"ncr-format\": \"JSON\", " " \"ncr-format\": \"JSON\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {} " " \"reverse-ddns\" : {} "
"}"; "}";
RUN_CONFIG_OK(config); RUN_CONFIG_OK(config);
...@@ -296,9 +296,9 @@ TEST_F(D2CfgMgrTest, defaultValues) { ...@@ -296,9 +296,9 @@ TEST_F(D2CfgMgrTest, defaultValues) {
" \"port\": 777 , " " \"port\": 777 , "
" \"ncr-protocol\": \"UDP\" , " " \"ncr-protocol\": \"UDP\" , "
" \"ncr-format\": \"JSON\", " " \"ncr-format\": \"JSON\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {} " " \"reverse-ddns\" : {} "
"}"; "}";
RUN_CONFIG_OK(config); RUN_CONFIG_OK(config);
...@@ -313,9 +313,9 @@ TEST_F(D2CfgMgrTest, defaultValues) { ...@@ -313,9 +313,9 @@ TEST_F(D2CfgMgrTest, defaultValues) {
" \"port\": 777 , " " \"port\": 777 , "
" \"dns-server-timeout\": 333 , " " \"dns-server-timeout\": 333 , "
" \"ncr-format\": \"JSON\", " " \"ncr-format\": \"JSON\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {} " " \"reverse-ddns\" : {} "
"}"; "}";
RUN_CONFIG_OK(config); RUN_CONFIG_OK(config);
...@@ -331,9 +331,9 @@ TEST_F(D2CfgMgrTest, defaultValues) { ...@@ -331,9 +331,9 @@ TEST_F(D2CfgMgrTest, defaultValues) {
" \"port\": 777 , " " \"port\": 777 , "
" \"dns-server-timeout\": 333 , " " \"dns-server-timeout\": 333 , "
" \"ncr-protocol\": \"UDP\", " " \"ncr-protocol\": \"UDP\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {} " " \"reverse-ddns\" : {} "
"}"; "}";
RUN_CONFIG_OK(config); RUN_CONFIG_OK(config);
...@@ -353,13 +353,13 @@ TEST_F(D2CfgMgrTest, unsupportedTopLevelItems) { ...@@ -353,13 +353,13 @@ TEST_F(D2CfgMgrTest, unsupportedTopLevelItems) {
" \"dns-server-timeout\": 333 , " " \"dns-server-timeout\": 333 , "
" \"ncr-protocol\": \"UDP\" , " " \"ncr-protocol\": \"UDP\" , "
" \"ncr-format\": \"JSON\", " " \"ncr-format\": \"JSON\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {}, " " \"reverse-ddns\" : {}, "
"\"bogus-param\" : true " " \"bogus-param\" : true "
"}"; "}";
SYNTAX_ERROR(config, "<string>:1.181-193: got unexpected " SYNTAX_ERROR(config, "<string>:1.185-197: got unexpected "
"keyword \"bogus-param\" in DhcpDdns map."); "keyword \"bogus-param\" in DhcpDdns map.");
// Check that unsupported top level objects fails. For // Check that unsupported top level objects fails. For
...@@ -371,14 +371,14 @@ TEST_F(D2CfgMgrTest, unsupportedTopLevelItems) { ...@@ -371,14 +371,14 @@ TEST_F(D2CfgMgrTest, unsupportedTopLevelItems) {
" \"dns-server-timeout\": 333 , " " \"dns-server-timeout\": 333 , "
" \"ncr-protocol\": \"UDP\" , " " \"ncr-protocol\": \"UDP\" , "
" \"ncr-format\": \"JSON\", " " \"ncr-format\": \"JSON\", "
"\"tsig-keys\": [], " " \"tsig-keys\": [], "
"\"bogus-object-one\" : {}, " " \"bogus-object-one\" : {}, "
"\"forward-ddns\" : {}, " " \"forward-ddns\" : {}, "
"\"reverse-ddns\" : {}, " " \"reverse-ddns\" : {}, "
"\"bogus-object-two\" : {} " " \"bogus-object-two\" : {} "
"}"; "}";
SYNTAX_ERROR(config, "<string>:1.139-156: got unexpected" SYNTAX_ERROR(config, "<string>:1.141-158: got unexpected"
" keyword \"bogus-object-one\" in DhcpDdns map."); " keyword \"bogus-object-one\" in DhcpDdns map.");
} }
...@@ -426,6 +426,8 @@ TEST_F(D2CfgMgrTest, invalidEntry) { ...@@ -426,6 +426,8 @@ TEST_F(D2CfgMgrTest, invalidEntry) {
" unexpected constant string, expecting JSON"); " unexpected constant string, expecting JSON");
} }
// Control socket tests in d2_process_unittests.cc
// DdnsDomainList and TSIGKey tests moved to d2_simple_parser_unittest.cc // DdnsDomainList and TSIGKey tests moved to d2_simple_parser_unittest.cc
/// @brief Tests construction of D2CfgMgr /// @brief Tests construction of D2CfgMgr
...@@ -462,9 +464,13 @@ TEST_F(D2CfgMgrTest, fullConfig) { ...@@ -462,9 +464,13 @@ TEST_F(D2CfgMgrTest, fullConfig) {
std::string config = "{ " std::string config = "{ "
"\"ip-address\" : \"192.168.1.33\" , " "\"ip-address\" : \"192.168.1.33\" , "
"\"port\" : 88 , " "\"port\" : 88 , "
" \"dns-server-timeout\": 333 , " "\"dns-server-timeout\": 333 , "
" \"ncr-protocol\": \"UDP\" , " "\"ncr-protocol\": \"UDP\" , "
" \"ncr-format\": \"JSON\", " "\"ncr-format\": \"JSON\", "
"\"control-socket\" : {"
" \"socket-type\" : \"unix\" ,"
" \"socket-name\" : \"/tmp/d2-ctrl-channel\" "
"},"
"\"tsig-keys\": [" "\"tsig-keys\": ["
"{" "{"
" \"name\": \"d2_key.example.com\" , " " \"name\": \"d2_key.example.com\" , "
...@@ -533,6 +539,16 @@ TEST_F(D2CfgMgrTest, fullConfig) { ...@@ -533,6 +539,16 @@ TEST_F(D2CfgMgrTest, fullConfig) {
EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_params->getNcrProtocol()); EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_params->getNcrProtocol());
EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_params->getNcrFormat()); EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_params->getNcrFormat());
// Verify that the control socket can be retrieved.
ConstElementPtr ctrl_sock = context->getControlSocketInfo();
ASSERT_TRUE(ctrl_sock);
ASSERT_EQ(Element::map, ctrl_sock->getType());
EXPECT_EQ(2, ctrl_sock->size());
ASSERT_TRUE(ctrl_sock->get("socket-type"));
EXPECT_EQ("\"unix\"", ctrl_sock->get("socket-type")->str());
ASSERT_TRUE(ctrl_sock->get("socket-name"));
EXPECT_EQ("\"/tmp/d2-ctrl-channel\"", ctrl_sock->get("socket-name")->str());
// Verify that the forward manager can be retrieved. // Verify that the forward manager can be retrieved.
DdnsDomainListMgrPtr mgr = context->getForwardMgr(); DdnsDomainListMgrPtr mgr = context->getForwardMgr();
ASSERT_TRUE(mgr); ASSERT_TRUE(mgr);
...@@ -941,6 +957,11 @@ TEST_F(D2CfgMgrTest, comments) { ...@@ -941,6 +957,11 @@ TEST_F(D2CfgMgrTest, comments) {
"\"comment\": \"D2 config\" , " "\"comment\": \"D2 config\" , "
"\"ip-address\" : \"192.168.1.33\" , " "\"ip-address\" : \"192.168.1.33\" , "
"\"port\" : 88 , " "\"port\" : 88 , "
"\"control-socket\": {"
" \"comment\": \"Control channel\" , "
" \"socket-type\": \"unix\" ,"
" \"socket-name\": \"/tmp/d2-ctrl-channel\" "
"},"
"\"tsig-keys\": [" "\"tsig-keys\": ["
"{" "{"
" \"user-context\": { " " \"user-context\": { "
...@@ -976,6 +997,13 @@ TEST_F(D2CfgMgrTest, comments) { ...@@ -976,6 +997,13 @@ TEST_F(D2CfgMgrTest, comments) {
ASSERT_TRUE(ctx->get("comment")); ASSERT_TRUE(ctx->get("comment"));
EXPECT_EQ("\"D2 config\"", ctx->get("comment")->str()); EXPECT_EQ("\"D2 config\"", ctx->get("comment")->str());
// Check control socket.
ConstElementPtr ctrl_sock = d2_context->getControlSocketInfo();
ASSERT_TRUE(ctrl_sock);
ASSERT_TRUE(ctrl_sock->get("user-context"));
EXPECT_EQ("{ \"comment\": \"Control channel\" }",
ctrl_sock->get("user-context")->str());
// Check TSIG keys. // Check TSIG keys.
TSIGKeyInfoMapPtr keys = d2_context->getKeys(); TSIGKeyInfoMapPtr keys = d2_context->getKeys();
ASSERT_TRUE(keys); ASSERT_TRUE(keys);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment