From f000b6b54d4abfad7abe39ed0b817a29a1f073f0 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Wed, 9 Jan 2013 17:07:21 +0100 Subject: [PATCH] [2317] Parse record-types field in DHCPv4 option definition configuration. --- src/bin/dhcp4/config_parser.cc | 27 ++++++++++++++++--- src/bin/dhcp4/dhcp4.spec | 11 ++------ src/bin/dhcp4/tests/config_parser_unittest.cc | 2 +- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/bin/dhcp4/config_parser.cc b/src/bin/dhcp4/config_parser.cc index 6fe9030b8c..deacd7c10b 100644 --- a/src/bin/dhcp4/config_parser.cc +++ b/src/bin/dhcp4/config_parser.cc @@ -960,7 +960,8 @@ public: BOOST_FOREACH(ConfigPair param, option_def->mapValue()) { std::string entry(param.first); ParserPtr parser; - if (entry == "name" || entry == "type" || entry == "space") { + if (entry == "name" || entry == "type" || + entry == "record-types" || entry == "space") { StringParserPtr str_parser(dynamic_cast(StringParser::factory(entry))); if (str_parser) { @@ -981,8 +982,6 @@ public: array_parser->setStorage(&boolean_values_); parser = array_parser; } - } else if (entry == "record_types") { - // do nothing yet } else { isc_throw(DhcpConfigError, "invalid parameter: " << entry); } @@ -1050,6 +1049,28 @@ private: OptionDefinitionPtr def(new OptionDefinition(name, code, type, array_type)); + // The record-types field may carry a list of comma separated names + // of data types that form a record. + std::string record_types = getParam("record-types", + string_values_); + // Split the list of record types into tokens. + std::vector record_tokens = + isc::util::str::tokens(record_types, ","); + // Iterate over each token and add a record typy into + // option definition. + BOOST_FOREACH(std::string record_type, record_tokens) { + try { + boost::trim(record_type); + if (!record_type.empty()) { + def->addRecordField(record_type); + } + } catch (const Exception& ex) { + isc_throw(DhcpConfigError, "invalid record type values" + << " specified for the option definition: " + << ex.what()); + } + } + // Check the option definition parameters are valid. try { def->validate(); diff --git a/src/bin/dhcp4/dhcp4.spec b/src/bin/dhcp4/dhcp4.spec index d5ac872635..0be4da1db9 100644 --- a/src/bin/dhcp4/dhcp4.spec +++ b/src/bin/dhcp4/dhcp4.spec @@ -71,16 +71,9 @@ }, { "item_name": "record_types", - "item_type": "list", + "item_type": "string", "item_optional": false, - "item_default": [], - "list_item_spec": - { - "item_name": "record-type", - "item_type": "string", - "item_optional": false, - "item_default": "" - } + "item_default": "", }, { "item_name": "space", diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index 2cd8c93ae4..2669552c66 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -447,7 +447,7 @@ TEST_F(Dhcp4ParserTest, optionDefAdd) { " \"code\": 100," " \"type\": \"ipv4-address\"," " \"array\": False," - // " \"record_types\": [ ]," + " \"record-types\": \"\"," " \"space\": \"isc\"" " } ]" "}";