Commit 6fce342c authored by Francis Dupont's avatar Francis Dupont
Browse files

[575-cb-cmds-unknown-fields-in-arguments-should-raise-an-error] Added keyword...

[575-cb-cmds-unknown-fields-in-arguments-should-raise-an-error] Added keyword checks for option def, data, subnet, shared network, (pd)pools
parent 11b99aa7
......@@ -112,6 +112,19 @@ OptionDataParser::findOptionDefinition(const std::string& option_space,
// ******************************** OptionDefParser ****************************
const SimpleKeywords
OptionDefParser::OPTION_DEF_PARAMETERS = {
{ "name", Element::string },
{ "code", Element::integer },
{ "type", Element::string },
{ "record-types", Element::string },
{ "space", Element::string },
{ "encapsulate", Element::string },
{ "array", Element::boolean, },
{ "user-context", Element::map },
{ "comment", Element::string }
};
OptionDefParser::OptionDefParser(const uint16_t address_family)
: address_family_(address_family) {
}
......@@ -119,6 +132,9 @@ OptionDefParser::OptionDefParser(const uint16_t address_family)
std::pair<isc::dhcp::OptionDefinitionPtr, std::string>
OptionDefParser::parse(ConstElementPtr option_def) {
// Check parameters.
checkKeywords(OPTION_DEF_PARAMETERS, option_def);
// Get mandatory parameters.
std::string name = getString(option_def, "name");
int64_t code64 = getInteger(option_def, "code");
......@@ -364,11 +380,23 @@ RelayInfoParser::addAddress(const std::string& name,
//****************************** PoolParser ********************************
const SimpleKeywords
PoolParser::POOL_PARAMETERS = {
{ "pool", Element::string },
{ "option-data", Element::list },
{ "client-class", Element::string },
{ "require-client-classes", Element::list },
{ "user-context", Element::map },
{ "comment", Element::string }
};
void
PoolParser::parse(PoolStoragePtr pools,
ConstElementPtr pool_structure,
const uint16_t address_family) {
checkKeywords(POOL_PARAMETERS, pool_structure);
ConstElementPtr text_pool = pool_structure->get("pool");
if (!text_pool) {
......@@ -661,12 +689,45 @@ SubnetConfigParser::createSubnet(ConstElementPtr params) {
//****************************** Subnet4ConfigParser *************************
const SimpleKeywords
Subnet4ConfigParser::SUBNET4_PARAMETERS = {
{ "valid-lifetime", Element::integer },
{ "renew-timer", Element::integer },
{ "rebind-timer", Element::integer },
{ "option-data", Element::list },
{ "pools", Element::list },
{ "subnet", Element::string },
{ "interface", Element::string },
{ "id", Element::integer },
{ "client-class", Element::string },
{ "require-client-classes", Element::list },
{ "reservations", Element::list },
{ "reservation-mode", Element::string },
{ "relay", Element::map },
{ "match-client-id", Element::boolean },
{ "authoritative", Element::boolean },
{ "next-server", Element::string },
{ "server-hostname", Element::string },
{ "boot-file-name", Element::string },
{ "4o6-interface", Element::string },
{ "4o6-interface-id", Element::string },
{ "4o6-subnet", Element::string },
{ "user-context", Element::map },
{ "comment", Element::string },
{ "calculate-tee-times", Element::boolean },
{ "t1-percent", Element::real },
{ "t2-percent", Element::real }
};
Subnet4ConfigParser::Subnet4ConfigParser()
:SubnetConfigParser(AF_INET) {
}
Subnet4Ptr
Subnet4ConfigParser::parse(ConstElementPtr subnet) {
// Check parameters.
checkKeywords(SUBNET4_PARAMETERS, subnet);
/// Parse Pools first.
ConstElementPtr pools = subnet->get("pools");
if (pools) {
......@@ -989,11 +1050,27 @@ Pools6ListParser::parse(PoolStoragePtr pools, ConstElementPtr pools_list) {
//**************************** PdPoolParser ******************************
const SimpleKeywords
PdPoolParser::PD_POOL_PARAMETERS = {
{ "prefix", Element::string },
{ "prefix-len", Element::integer },
{ "delegated-len", Element::integer },
{ "option-data", Element::list },
{ "client-class", Element::string },
{ "require-client-classes", Element::list },
{ "excluded-prefix", Element::string },
{ "excluded-prefix-len", Element::integer },
{ "user-context", Element::map },
{ "comment", Element::string }
};
PdPoolParser::PdPoolParser() : options_(new CfgOption()) {
}
void
PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) {
checkKeywords(PD_POOL_PARAMETERS, pd_pool_);
std::string addr_str = getString(pd_pool_, "prefix");
uint8_t prefix_len = getUint8(pd_pool_, "prefix-len");
......@@ -1088,12 +1165,41 @@ PdPoolsListParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_list) {
//**************************** Subnet6ConfigParser ***********************
const SimpleKeywords
Subnet6ConfigParser::SUBNET6_PARAMETERS = {
{ "preferred-lifetime", Element::integer },
{ "valid-lifetime", Element::integer },
{ "renew-timer", Element::integer },
{ "rebind-timer", Element::integer },
{ "option-data", Element::list },
{ "pools", Element::list },
{ "pd-pools", Element::list },
{ "subnet", Element::string },
{ "interface", Element::string },
{ "interface-id", Element::string },
{ "id", Element::integer },
{ "rapid-commit", Element::boolean },
{ "client-class", Element::string },
{ "require-client-classes", Element::list },
{ "reservations", Element::list },
{ "reservation-mode", Element::string },
{ "relay", Element::map },
{ "user-context", Element::map },
{ "comment", Element::string },
{ "calculate-tee-times", Element::boolean },
{ "t1-percent", Element::real },
{ "t2-percent", Element::real }
};
Subnet6ConfigParser::Subnet6ConfigParser()
: SubnetConfigParser(AF_INET6) {
}
Subnet6Ptr
Subnet6ConfigParser::parse(ConstElementPtr subnet) {
// Check parameters.
checkKeywords(SUBNET6_PARAMETERS, subnet);
/// Parse all pools first.
ConstElementPtr pools = subnet->get("pools");
if (pools) {
......
......@@ -242,6 +242,13 @@ public:
OptionDefinitionTuple
parse(isc::data::ConstElementPtr option_def);
/// @brief This table defines all option definition parameters.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows option_def_param rules in bison grammar.
static const isc::data::SimpleKeywords OPTION_DEF_PARAMETERS;
private:
/// @brief Address family: @c AF_INET or @c AF_INET6.
uint16_t address_family_;
......@@ -309,6 +316,13 @@ public:
isc::data::ConstElementPtr pool_structure,
const uint16_t address_family);
/// @brief This table defines all pool parameters.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows pool_param rules in bison grammar.
static const isc::data::SimpleKeywords POOL_PARAMETERS;
protected:
/// @brief Creates a Pool object given a IPv4 prefix and the prefix length.
///
......@@ -547,6 +561,13 @@ public:
/// @return a pointer to created Subnet4 object
Subnet4Ptr parse(data::ConstElementPtr subnet);
/// @brief This table defines all subnet parameters for DHCPv4.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows subnet4_param rule in bison grammar.
static const isc::data::SimpleKeywords SUBNET4_PARAMETERS;
protected:
/// @brief Instantiates the IPv4 Subnet based on a given IPv4 address
......@@ -669,6 +690,13 @@ public:
/// @throw DhcpConfigError if configuration parsing fails.
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_);
/// @brief This table defines all prefix delegation pool parameters.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows pd_pool_param rules in bison grammar.
static const isc::data::SimpleKeywords PD_POOL_PARAMETERS;
private:
/// Pointer to the created pool object.
......@@ -730,6 +758,13 @@ public:
/// @return a pointer to created Subnet6 object
Subnet6Ptr parse(data::ConstElementPtr subnet);
/// @brief This table defines all subnet parameters for DHCPv6.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows subnet6_param rule in bison grammar.
static const isc::data::SimpleKeywords SUBNET6_PARAMETERS;
protected:
/// @brief Issues a DHCP6 server specific warning regarding duplicate subnet
/// options.
......
......@@ -27,6 +27,18 @@ namespace dhcp {
// **************************** OptionDataParser *************************
const SimpleKeywords
OptionDataParser::OPTION_PARAMETERS = {
{ "name", Element::string },
{ "data", Element::string },
{ "code", Element::integer },
{ "space", Element::string },
{ "csv-format", Element::boolean },
{ "always-send", Element::boolean },
{ "user-context", Element::map },
{ "comment", Element::string }
};
OptionDataParser::OptionDataParser(const uint16_t address_family,
CfgOptionDefPtr cfg_option_def)
: address_family_(address_family), cfg_option_def_(cfg_option_def) {
......@@ -35,6 +47,9 @@ OptionDataParser::OptionDataParser(const uint16_t address_family,
std::pair<OptionDescriptor, std::string>
OptionDataParser::parse(isc::data::ConstElementPtr single_option) {
// Check parameters.
checkKeywords(OPTION_PARAMETERS, single_option);
// Try to create the option instance.
std::pair<OptionDescriptor, std::string> opt = createOption(single_option);
......
......@@ -64,6 +64,14 @@ public:
/// space
std::pair<OptionDescriptor, std::string>
parse(isc::data::ConstElementPtr single_option);
/// @brief This table defines all option parameters.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows option_param rules in bison grammar.
static const isc::data::SimpleKeywords OPTION_PARAMETERS;
private:
/// @brief Finds an option definition within an option space
......
......@@ -24,11 +24,39 @@ using namespace isc::util;
namespace isc {
namespace dhcp {
const SimpleKeywords
SharedNetwork4Parser::SHARED_NETWORK4_PARAMETERS = {
{ "name", Element::string },
{ "subnet4", Element::list },
{ "interface", Element::string },
{ "renew-timer", Element::integer },
{ "rebind-timer", Element::integer },
{ "option-data", Element::list },
{ "match-client-id", Element::boolean },
{ "authoritative", Element::boolean },
{ "next-server", Element::string },
{ "server-hostname", Element::string },
{ "boot-file-name", Element::string },
{ "relay", Element::map },
{ "reservation-mode", Element::string },
{ "client-class", Element::string },
{ "require-client-classes", Element::list },
{ "valid-lifetime", Element::integer },
{ "user-context", Element::map },
{ "comment", Element::string },
{ "calculate-tee-times", Element::boolean },
{ "t1-percent", Element::real },
{ "t2-percent", Element::real }
};
SharedNetwork4Ptr
SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) {
SharedNetwork4Ptr shared_network;
try {
// Check parameters.
checkKeywords(SHARED_NETWORK4_PARAMETERS, shared_network_data);
// Make sure that the network name has been specified. The name is required
// to create a SharedNetwork4 object.
std::string name = getString(shared_network_data, "name");
......@@ -186,11 +214,37 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) {
return (shared_network);
}
const SimpleKeywords
SharedNetwork6Parser::SHARED_NETWORK6_PARAMETERS = {
{ "name", Element::string },
{ "subnet6", Element::list },
{ "interface", Element::string },
{ "interface-id", Element::string },
{ "renew-timer", Element::integer },
{ "rebind-timer", Element::integer },
{ "option-data", Element::list },
{ "relay", Element::map },
{ "reservation-mode", Element::string },
{ "client-class", Element::string },
{ "require-client-classes", Element::list },
{ "preferred-lifetime", Element::integer },
{ "rapid-commit", Element::boolean },
{ "valid-lifetime", Element::integer },
{ "user-context", Element::map },
{ "comment", Element::string },
{ "calculate-tee-times", Element::boolean },
{ "t1-percent", Element::real },
{ "t2-percent", Element::real }
};
SharedNetwork6Ptr
SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) {
SharedNetwork6Ptr shared_network;
std::string name;
try {
// Check parameters.
checkKeywords(SHARED_NETWORK6_PARAMETERS, shared_network_data);
// Make sure that the network name has been specified. The name is required
// to create a SharedNetwork6 object.
std::string name = getString(shared_network_data, "name");
......
......@@ -21,6 +21,13 @@ namespace dhcp {
class SharedNetwork4Parser : public BaseNetworkParser {
public:
/// @brief This table defines all shared network parameters for DHCPv4.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows shared_network_param rule in bison grammar.
static const isc::data::SimpleKeywords SHARED_NETWORK4_PARAMETERS;
/// @brief Parses shared configuration information for IPv4 shared network.
///
/// @param shared_network_data Data element holding shared network
......@@ -36,6 +43,13 @@ public:
class SharedNetwork6Parser : public BaseNetworkParser {
public:
/// @brief This table defines all shared network parameters for DHCPv6.
///
/// Boolean, integer, real and string types are for scalar parameters,
/// list and map types for entries.
/// Order follows shared_network_param rule in bison grammar.
static const isc::data::SimpleKeywords SHARED_NETWORK6_PARAMETERS;
/// @brief Parses shared configuration information for IPv6 shared network.
///
/// @param shared_network_data Data element holding shared network
......
......@@ -1255,9 +1255,7 @@ TEST(CfgSubnets4Test, teeTimePercentValidation) {
" \"reservation-mode\": \"all\", \n"
" \"4o6-interface\": \"\", \n"
" \"4o6-interface-id\": \"\", \n"
" \"4o6-subnet\": \"\", \n"
" \"dhcp4o6-port\": 0, \n"
" \"decline-probation-period\": 86400 \n"
" \"4o6-subnet\": \"\" \n"
" }";
......
......@@ -1047,12 +1047,7 @@ TEST(CfgSubnets6Test, teeTimePercentValidation) {
" \"valid-lifetime\": 300, \n"
" \"client-class\": \"\", \n"
" \"require-client-classes\": [] \n,"
" \"reservation-mode\": \"all\", \n"
" \"4o6-interface\": \"\", \n"
" \"4o6-interface-id\": \"\", \n"
" \"4o6-subnet\": \"\", \n"
" \"dhcp4o6-port\": 0, \n"
" \"decline-probation-period\": 86400 \n"
" \"reservation-mode\": \"all\" \n"
" }";
......
......@@ -1701,7 +1701,7 @@ TEST_F(ParseConfigTest, hexOptionData) {
"{ \n"
" \"option-data\": [ { \n"
" \"name\": \"domain-name-servers\", \n"
" \"code \": 6, \n"
" \"code\": 6, \n"
" \"space\": \"dhcp4\", \n"
" \"csv-format\": false, \n"
" \"data\": \"" << hex_str << "\" \n"
......
......@@ -162,8 +162,6 @@ public:
" \"4o6-interface\": \"\","
" \"4o6-interface-id\": \"\","
" \"4o6-subnet\": \"\","
" \"dhcp4o6-port\": 0,"
" \"decline-probation-period\": 86400,"
" \"reservation-mode\": \"all\","
" \"calculate-tee-times\": true,"
" \"t1-percent\": .45,"
......@@ -187,8 +185,6 @@ public:
" \"4o6-interface\": \"\","
" \"4o6-interface-id\": \"\","
" \"4o6-subnet\": \"\","
" \"dhcp4o6-port\": 0,"
" \"decline-probation-period\": 86400,"
" \"reservation-mode\": \"all\","
" \"calculate-tee-times\": false,"
" \"t1-percent\": .40,"
......@@ -472,8 +468,6 @@ public:
" \"client-class\": \"\","
" \"require-client-classes\": []\n,"
" \"reservation-mode\": \"all\","
" \"decline-probation-period\": 86400,"
" \"dhcp4o6-port\": 0,"
" \"rapid-commit\": false"
" },"
" {"
......@@ -488,8 +482,6 @@ public:
" \"client-class\": \"\","
" \"require-client-classes\": []\n,"
" \"reservation-mode\": \"all\","
" \"decline-probation-period\": 86400,"
" \"dhcp4o6-port\": 0,"
" \"rapid-commit\": false"
" }"
" ]"
......
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