14#include <boost/algorithm/string/split.hpp>
15#include <boost/algorithm/string/classification.hpp>
16#include <boost/make_shared.hpp>
28 const std::string& formatted_value,
30 return (boost::make_shared<OptionDescriptor>(opt, persist, formatted_value,
36 return (boost::make_shared<OptionDescriptor>(persist));
41 return (boost::make_shared<OptionDescriptor>(desc));
57 return (options_.
empty() && vendor_options_.
empty());
62 return (options_.
equals(other.options_) &&
63 vendor_options_.
equals(other.vendor_options_));
68 const std::string& option_space,
74 add(desc, option_space);
84 << option_space <<
"'");
89 vendor_options_.
addItem(desc, vendor_id);
91 options_.
addItem(desc, option_space);
105 <<
" does not exist");
110 auto const& od_itr = idx.find(desc.
option_->getType());
111 if (od_itr == idx.end()) {
113 << option_space <<
":" << desc.
option_->getType()
114 <<
", it does not exist");
117 idx.replace(od_itr, desc);
120std::list<std::string>
123 std::list<std::string> names;
124 for (
auto const&
id : ids) {
125 std::ostringstream s;
128 s <<
"vendor-" << id;
129 names.push_back(s.str());
155 for (
auto opt_desc : *(
getAll(space))) {
169 "validateCreateOption: descriptor has no option instance");
173 uint16_t code = opt_desc.
option_->getType();
191 def = cfg_def->get(space, code);
196 if (!formatted_value.empty()) {
198 <<
" has a formatted value: '" << formatted_value
199 <<
"' but no option definition");
211 if (formatted_value.empty()) {
213 opt_desc.
option_ = def->optionFactory(universe, code, opt_desc.
option_->getData());
216 std::vector<std::string> split_vec;
217 boost::split(split_vec, formatted_value, boost::is_any_of(
","));
218 opt_desc.
option_ = def->optionFactory(universe, code, split_vec);
220 }
catch (
const std::exception& ex) {
222 <<
" from data specified, reason: " << ex.
what());
232 mergeInternal(options_, other.options_);
234 mergeInternal(vendor_options_, other.vendor_options_);
254CfgOption::encapsulateInternal(
const std::string& option_space) {
259 for (
auto const& opt : *options) {
260 encapsulateInternal(opt.option_);
265CfgOption::encapsulateInternal(
const OptionPtr& option) {
267 const std::string& encap_space = option->getEncapsulatedSpace();
269 if (!encap_space.empty()) {
272 for (
auto const& encap_opt : *encap_options) {
274 if (!option->getOption(encap_opt.option_->getType())) {
275 option->addOption(encap_opt.option_);
282 encapsulateInternal(encap_opt.option_);
288template <
typename Selector>
291 OptionDescriptor, Selector>& src_container,
293 OptionDescriptor, Selector>& dest_container)
const {
295 std::list<Selector> selectors = src_container.getOptionSpaceNames();
300 for (
auto const& it : selectors) {
308 for (
auto const& src_opt : *src_all) {
311 idx.equal_range(src_opt.option_->getType());
314 if (std::distance(range.first, range.second) == 0) {
315 dest_container.addItem(OptionDescriptor(src_opt), it);
323 return (options_.
getItems(option_space));
328 return (vendor_options_.
getItems(vendor_id));
335 if (!options || options->empty()) {
347 for (
auto option_space_from_list : option_space_names) {
349 auto options_in_space =
getAll(option_space_from_list);
350 for (
auto option_it = options_in_space->begin();
351 option_it != options_in_space->end();
356 if (option_it->option_ &&
357 (option_it->option_->getEncapsulatedSpace() == option_space)) {
358 option_it->option_->delOption(option_code);
364 auto& idx = options->get<1>();
365 return (idx.erase(option_code));
372 if (!vendor_options || vendor_options->empty()) {
377 auto& idx = vendor_options->get<1>();
378 return (idx.erase(option_code));
388 auto options =
getAll(space_name);
389 for (
auto option_it = options->begin(); option_it != options->end();
391 if (!option_it->option_) {
397 auto sub_options = option_it->option_->getOptions();
398 for (
auto sub = sub_options.begin(); sub != sub_options.end();
401 option_it->option_->delOption(sub->second->getType());
414 return (num_deleted);
428 for (
auto const& name : names) {
430 for (
auto const& opt : *opts) {
434 opt.contextToElement(map);
438 uint16_t code = opt.option_->getType();
452 if (!opt.formatted_value_.empty()) {
457 std::vector<uint8_t> bin = opt.option_->toBinary();
465 if (include_metadata) {
466 map->set(
"metadata", opt.getMetadata());
475 for (
auto const&
id : ids) {
477 for (
auto const& opt : *opts) {
481 opt.contextToElement(map);
483 std::ostringstream oss;
484 oss <<
"vendor-" << id;
487 uint16_t code = opt.option_->getType();
501 if (!opt.formatted_value_.empty()) {
506 std::vector<uint8_t> bin = opt.option_->toBinary();
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if a function is called in a prohibited way.
void setId(const uint64_t id)
Sets element's database identifier.
static ElementPtr create(const Position &pos=ZERO_POSITION())
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
Represents option data configuration for the DHCP server.
void encapsulate()
Appends encapsulated options to top-level options.
void replace(const OptionDescriptor &desc, const std::string &option_space)
Replaces the instance of an option within this collection.
static bool createDescriptorOption(CfgOptionDefPtr cfg_def, const std::string &space, OptionDescriptor &opt_desc)
Creates an option descriptor's option based on a set of option defs.
virtual isc::data::ElementPtr toElement() const
Unparse a configuration object.
void createOptions(CfgOptionDefPtr cfg_def)
Re-create the option in each descriptor based on given definitions.
isc::data::ElementPtr toElementWithMetadata(const bool include_metadata) const
Unparse a configuration object with optionally including the metadata.
size_t del(const std::string &option_space, const uint16_t option_code)
Deletes option for the specified option space and option code.
std::list< std::string > getOptionSpaceNames() const
Returns a list of configured option space names.
bool empty() const
Indicates the object is empty.
void mergeTo(CfgOption &other) const
Merges this configuration to another configuration.
void copyTo(CfgOption &other) const
Copies this configuration to another configuration.
CfgOption()
default constructor
std::list< std::string > getVendorIdsSpaceNames() const
Returns a list of option space names for configured vendor ids.
OptionContainerPtr getAll(const std::string &option_space) const
Returns all options for the specified option space.
void merge(CfgOptionDefPtr cfg_def, CfgOption &other)
Merges another option configuration into this one.
void add(const OptionPtr &option, const bool persistent, const std::string &option_space, const uint64_t id=0)
Adds instance of the option to the configuration.
bool equals(const CfgOption &other) const
Check if configuration is equal to other configuration.
std::list< uint32_t > getVendorIds() const
Returns a list of all configured vendor identifiers.
static OptionDefinitionPtr getOptionDef(const std::string &space, const uint16_t code)
Return the first option definition matching a particular option code.
static OptionDefinitionPtr getVendorOptionDef(const Option::Universe u, const uint32_t vendor_id, const uint16_t code)
Returns vendor option definition for a given vendor-id and code.
static uint32_t optionSpaceToVendorId(const std::string &option_space)
Converts option space name to vendor id.
static OptionDefinitionPtr getRuntimeOptionDef(const std::string &space, const uint16_t code)
Returns runtime (non-standard) option definition by space and option code.
static OptionDefinitionPtr getLastResortOptionDef(const std::string &space, const uint16_t code)
Returns last resort option definition by space and option code.
OptionPtr option_
Option instance.
std::string space_name_
Option space name.
bool equals(const OptionDescriptor &other) const
Checks if the one descriptor is equal to another.
std::string formatted_value_
Option value in textual (CSV) format.
static OptionDescriptorPtr create(const OptionPtr &opt, bool persist, const std::string &formatted_value="", data::ConstElementPtr user_context=data::ConstElementPtr())
Factory function creating an instance of the OptionDescriptor.
bool persistent_
Persistence flag.
uint64_t deleteItems(const uint64_t id)
Remove all options or option definitions with a given database identifier.
void addItem(const ItemType &item, const Selector &option_space)
Adds a new item to the option_space.
bool empty() const
Indicates the container is empty.
void clearItems()
Remove all items from the container.
std::list< Selector > getOptionSpaceNames() const
Get a list of existing option spaces.
ItemsContainerPtr getItems(const Selector &option_space) const
Get all items for the particular option space.
bool equals(const OptionSpaceContainer &other) const
Check if two containers are equal.
static bool validateName(const std::string &name)
Checks that the provided option space name is valid.
Universe
defines option universe DHCPv4 or DHCPv6
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
std::pair< OptionContainerTypeIndex::const_iterator, OptionContainerTypeIndex::const_iterator > OptionContainerTypeRange
Pair of iterators to represent the range of options having the same option type value.
OptionContainer::nth_index< 1 >::type OptionContainerTypeIndex
Type of the index #1 - option type.
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
boost::multi_index_container< OptionDescriptor, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::hashed_non_unique< KeyFromKeyExtractor< boost::multi_index::const_mem_fun< Option, uint16_t, &Option::getType >, boost::multi_index::member< OptionDescriptor, OptionPtr, &OptionDescriptor::option_ > > >, boost::multi_index::hashed_non_unique< boost::multi_index::member< OptionDescriptor, bool, &OptionDescriptor::persistent_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< OptionIdIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, uint64_t, &data::BaseStampedElement::getId > > > > OptionContainer
Multi index container for DHCP option descriptors.
boost::shared_ptr< OptionDescriptor > OptionDescriptorPtr
A pointer to option descriptor.
boost::shared_ptr< OptionContainer > OptionContainerPtr
Pointer to the OptionContainer object.
boost::shared_ptr< Option > OptionPtr
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 ('hex') format.
Defines the logger used by the top-level component of kea-lfc.
#define DHCP4_OPTION_SPACE
global std option spaces
#define DHCP6_OPTION_SPACE