8 #include <boost/algorithm/string/trim.hpp>
9 #include <boost/asio/ip/address.hpp>
10 #include <boost/uuid/name_generator.hpp>
11 #include <boost/uuid/nil_generator.hpp>
12 #include <boost/uuid/uuid.hpp>
13 #include <boost/uuid/uuid_io.hpp>
14 #include <pugixml/pugixml.hpp>
25 static void MapObjectLink(
const string <ype,
const string &lname,
26 const string &rtype,
const string &rname,
27 const string &linkname,
33 request->
key.reset(key);
37 request->
data.reset(data);
42 requests->push_back(request);
45 static void MapObjectLinkAttr(
const string <ype,
const string &lname,
46 const string &rtype,
const string &rname,
53 request->
key.reset(key);
57 request->
data.reset(data);
63 requests->push_back(request);
66 static void SetData(
const string &identifier,
const string &id_type,
72 request->
key.reset(key);
76 request->
data.reset(data);
80 requests->push_back(request);
83 static void ClearData(
const string &identifier,
const string &id_type,
84 const string &metadata,
89 request->
key.reset(key);
93 request->
data.reset(data);
96 requests->push_back(request);
99 static bool ParseVnNetworkIpam(
const xml_node &node,
bool add_change,
101 xml_attribute name_attr = node.attribute(
"name");
102 xml_attribute ipam_attr = node.attribute(
"ipam");
103 xml_attribute vn_attr = node.attribute(
"vn");
109 name = name_attr.value();
111 ipam = ipam_attr.value();
113 vn = vn_attr.value();
115 unique_ptr<autogen::VnSubnetsType> params(
new autogen::VnSubnetsType());
116 if (!params->XmlParse(node)) {
121 MapObjectLinkAttr(
"virtual-network", vn,
"network-ipam", ipam,
122 "virtual-network-network-ipam", params.release(), requests,
125 MapObjectLinkAttr(
"virtual-network", vn,
"network-ipam", ipam,
126 "virtual-network-network-ipam", params.release(), requests,
133 static bool ParseNetworkIpam(
const xml_node &node,
bool add_change,
135 xml_attribute name = node.attribute(
"name");
138 identifier = name.value();
140 unique_ptr<autogen::IpamType> params(
new autogen::IpamType());
141 if (!params->XmlParse(node)) {
146 SetData(identifier,
"network-ipam",
"network-ipam-mgmt",
147 params.release(), requests);
149 ClearData(identifier,
"network-ipam",
"network-ipam-mgmt", requests);
155 static bool ParseVirtualDNS(
const xml_node &node,
bool add_change,
157 xml_attribute name = node.attribute(
"name");
158 xml_attribute domain = node.attribute(
"domain");
163 identifier = name.value();
165 view = domain.value();
167 unique_ptr<autogen::VirtualDnsType> params(
new autogen::VirtualDnsType());
168 if (!params->XmlParse(node)) {
173 SetData(identifier,
"virtual-DNS",
"virtual-DNS-data",
174 params.release(), requests);
175 MapObjectLink(
"domain", view,
"virtual-DNS", identifier,
176 "domain-virtual-DNS", requests,
179 ClearData(identifier,
"virtual-DNS",
"virtual-DNS-data", requests);
180 MapObjectLink(
"domain", view,
"virtual-DNS", identifier,
181 "domain-virtual-DNS", requests,
188 static bool ParseVirtualDNSRecord(
const xml_node &node,
bool add_change,
190 xml_attribute name = node.attribute(
"name");
191 xml_attribute dns = node.attribute(
"dns");
196 identifier = name.value();
198 virtual_dns = dns.value();
200 unique_ptr<autogen::VirtualDnsRecordType> params(
new autogen::VirtualDnsRecordType());
201 if (!params->XmlParse(node)) {
206 SetData(identifier,
"virtual-DNS-record",
"virtual-DNS-record-data",
207 params.release(), requests);
208 MapObjectLink(
"virtual-DNS", virtual_dns,
209 "virtual-DNS-record", identifier,
210 "virtual-DNS-virtual-DNS-record", requests,
213 ClearData(identifier,
"virtual-DNS-record",
214 "virtual-DNS-record-data", requests);
215 MapObjectLink(
"virtual-DNS", virtual_dns,
216 "virtual-DNS-record", identifier,
217 "virtual-DNS-virtual-DNS-record", requests,
224 static bool ParseGlobalQosConfig(
const xml_node &node,
bool add_change,
226 xml_attribute name = node.attribute(
"name");
229 identifier = name.value();
231 for (xml_node child = node.first_child(); child;
232 child = child.next_sibling()) {
233 if (strcmp(child.name(),
"control-traffic-dscp") == 0) {
234 unique_ptr<autogen::ControlTrafficDscpType> cfg(
235 new autogen::ControlTrafficDscpType());
236 assert(cfg->XmlParse(child));
239 SetData(identifier,
"global-qos-config",
240 "control-traffic-dscp", cfg.release(), requests);
242 ClearData(identifier,
"global-qos-config",
243 "control-traffic-dscp", requests);
258 for (xml_node node = root.first_child(); node; node = node.next_sibling()) {
259 if (strcmp(node.name(),
"network-ipam") == 0) {
260 ParseNetworkIpam(node, add_change, requests);
262 else if (strcmp(node.name(),
"virtual-network-network-ipam") == 0) {
263 ParseVnNetworkIpam(node, add_change, requests);
265 else if (strcmp(node.name(),
"virtual-DNS") == 0) {
266 ParseVirtualDNS(node, add_change, requests);
268 else if (strcmp(node.name(),
"virtual-DNS-record") == 0) {
269 ParseVirtualDNSRecord(node, add_change, requests);
271 else if (strcmp(node.name(),
"global-qos-config") == 0) {
272 ParseGlobalQosConfig(node, add_change, requests);
280 istringstream sstream(content);
282 xml_parse_result result = xdoc.load(sstream);
284 std::stringstream str;
285 str <<
"Unable to load XML document. (status="
286 << result.status <<
", offset=" << result.offset <<
")";
292 for (xml_node node = xdoc.first_child(); node; node = node.next_sibling()) {
294 if (strcmp(node.name(),
"config") == 0) {
296 }
else if (strcmp(node.name(),
"delete") == 0) {
307 while (!requests.empty()) {
308 unique_ptr<DBRequest> req(requests.front());
309 requests.pop_front();
void STLDeleteValues(Container *container)
std::unique_ptr< DBRequestData > data
bool Enqueue(DBRequest *req)
std::unique_ptr< AutogenProperty > content
std::list< DBRequest * > RequestList
void set_origin(Origin in_origin)
std::unique_ptr< DBRequestKey > key
#define DNS_TRACE(Obj,...)
static IFMapTable * FindTable(DB *db, const std::string &element_type)
bool ParseConfig(const pugi::xml_node &root, bool add_change, RequestList *requests) const
bool Parse(const std::string &content)