Commit 533c4afd authored by Marcin Siodelski's avatar Marcin Siodelski

[2317] Added parser classes for option definitions.

parent 4e973e22
......@@ -956,6 +956,130 @@ public:
ParserCollection parsers_;
};
/// @brief Parser for a single option definition.
///
/// This parser creates an instance of a single option definition.
class OptionDefParser: DhcpConfigParser {
public:
/// @brief Constructor.
///
/// This constructor sets the pointer to the option definitions
/// storage to NULL. It must be set to point to the actual storage
/// before \ref build is called.
OptionDefParser(const std::string&)
: storage_(NULL) {
}
/// @brief Parses an entry that describes single option definition.
///
/// @param option_def a configuration entry to be parsed.
///
/// @throw Dhcp4ConfigError if parsing was unsuccessful.
void build(ConstElementPtr option_def) {
}
/// @brief Stores the parsed option definition in a storage.
void commit() {
}
/// @brief Sets a pointer to a storage.
///
/// The newly created instance of an option definition will be
/// added to a storage given by the argument.
///
/// @param storage pointer to a storage where the option definition
/// will be added to.
void setStorage(OptionDefContainer* storage) {
storage_ = storage;
}
private:
/// Instance of option definition being created by this parser.
OptionDefinitionPtr option_definition_;
/// Pointer to a storage where the option definition will be
/// added when \ref commit is called.
OptionDefContainer* storage_;
};
/// @brief Parser for a list of option definitions.
///
/// This parser iterates over all configuration entries that define
/// option definitions and creates instances of these definitions.
/// If the parsing is successful, the collection of created definitions
/// is put into the provided storage.
class OptionDefListParser : DhcpConfigParser {
public:
/// @brief Constructor.
///
/// This constructor initializes the pointer to option definitions
/// storage to NULL value. This pointer has to be set to point to
/// the actual storage before the \ref build function is called.
OptionDefListParser(const std::string&)
: option_defs_(NULL) {
}
/// @brief Parse configuration entries.
///
/// This function parses configuration entries and creates instances
/// of option definitions.
///
/// @param option_def_list pointer to an element that holds entries
/// that define option definitions.
/// @throw Dhcp4ConfigError if configuration parsing fails.
void build(ConstElementPtr option_def_list) {
if (!option_def_list) {
isc_throw(Dhcp4ConfigError, "parser error: a pointer to a list of"
<< " option definitions is NULL");
} else if (option_defs_ == NULL) {
isc_throw(Dhcp4ConfigError, "parser error: the storage for option"
<< " definitions must be set before parsing option"
<< " definitions");
}
BOOST_FOREACH(ConstElementPtr option_def, option_def_list->listValue()) {
boost::shared_ptr<OptionDefParser>
parser(new OptionDefParser("single-option-def"));
parser->setStorage(&option_defs_local_);
parser->build(option_def);
}
}
/// @brief Stores option definitions in the provided storage.
void commit() {
}
/// @brief Create an OptionDefListParser object.
///
/// @param param_name configuration entry holding option definitions.
///
/// @return OptionDefListParser object.
static DhcpConfigParser* factory(const std::string& param_name) {
return (new OptionDefListParser(param_name));
}
/// @brief Set storage for option definition instances.
///
/// @param storage pointer to the option definition storage
/// where created option instances should be stored.
void setStorage(OptionDefContainer* storage) {
option_defs_ = storage;
}
private:
/// Pointer to the container where option definitions should
/// be stored when \ref commit is called.
OptionDefContainer* option_defs_;
/// Temporary storage for option definitions. It holds option
/// definitions before \ref commit is called.
OptionDefContainer option_defs_local_;
};
/// @brief this class parses a single subnet
///
/// This class parses the whole subnet definition. It creates parsers
......
......@@ -436,6 +436,37 @@ TEST_F(Dhcp4ParserTest, poolPrefixLen) {
EXPECT_EQ(4000, subnet->getValid());
}
// The goal of this test is to check whether an option definition
// can be added to the dhcp4 option space.
TEST_F(Dhcp4ParserTest, optionDefAdd) {
// Configuration string.
std::string config =
"{ \"option-def\": [ {"
" \"name\": \"foo\","
" \"code\": 100,"
" \"type\": \"ipv4-address\","
" \"array\": False,"
" \"record_types\": [ ],"
" \"space\": \"isc\""
" } ]"
"}";
ElementPtr json = Element::fromJSON(config);
// Make sure that the particular option definition does not exist.
OptionDefinitionPtr def = CfgMgr::instance().getOptionDef("isc", 100);
ASSERT_FALSE(def);
// Use the configuration string to create new option definition.
ConstElementPtr status;
EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
ASSERT_TRUE(status);
// The option definition should now be available in the CfgMgr.
def = CfgMgr::instance().getOptionDef("isc", 100);
ASSERT_TRUE(def);
}
// Goal of this test is to verify that global option
// data is configured for the subnet if the subnet
// configuration does not include options configuration.
......
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