7 #include <boost/lexical_cast.hpp>
8 #include <sandesh/request_pipeline.h>
13 #include "ifmap/ifmap_log_types.h"
15 #include "ifmap/ifmap_server_show_types.h"
17 #include "schema/bgp_schema_types.h"
18 #include "schema/vnc_cfg_types.h"
19 #include "config-client-mgr/config_client_show_types.h"
20 #include "config-client-mgr/config_client_log_types.h"
25 using contrail_rapidjson::Value;
30 #define CONFIG_PARSE_ASSERT(t, condition, key, value) \
34 IFMAP_WARN_LOG(ConfigurationMalformed ## t ## Warning ## Log, \
35 Category::IFMAP, key, value, adapter.type(), \
37 IFMAP_TRACE(ConfigurationMalformed ## t ## Warning ## Trace, \
38 key, value, adapter.type(), adapter.uuid()); \
39 if (ConfigCass2JsonAdapter::assert_on_parse_error()) \
52 bgp_schema_Server_GenerateObjectTypeList(&FilterList);
53 vnc_cfg_Server_GenerateObjectTypeList(&FilterList);
54 for (ObjectTypeList::iterator it = FilterList.begin();
55 it != FilterList.end(); it++) {
61 vnc_cfg_FilterInfo vnc_filter_info;
62 bgp_schema_FilterInfo bgp_schema_filter_info;
64 bgp_schema_Server_GenerateGraphFilter(&bgp_schema_filter_info);
65 vnc_cfg_Server_GenerateGraphFilter(&vnc_filter_info);
67 for (vnc_cfg_FilterInfo::iterator it = vnc_filter_info.begin();
68 it != vnc_filter_info.end(); it++) {
71 make_pair(it->metadata_, it->linkattr_));
78 for (bgp_schema_FilterInfo::iterator it = bgp_schema_filter_info.begin();
79 it != bgp_schema_filter_info.end(); it++) {
82 make_pair(it->metadata_, it->linkattr_));
92 bgp_schema_Server_GenerateWrapperPropertyInfo(&wrapper_field_map);
93 vnc_cfg_Server_GenerateWrapperPropertyInfo(&wrapper_field_map);
94 for (WrapperFieldMap::iterator it = wrapper_field_map.begin();
95 it != wrapper_field_map.end(); it++) {
111 pair<MetadataParseMap::iterator, bool> result =
113 assert(result.second);
133 Value::ConstMemberIterator itr = adapter.
document().MemberBegin();
137 key->
id_type = itr->name.GetString();
140 const Value &value_node = itr->value;
143 const Value &fq_name_node = value_node[
"fq_name"];
145 "FQ name is not an array");
147 key->
id_type,
"FQ name array is empty");
152 for (; i < fq_name_node.Size() - 1; ++i) {
153 key->
id_name += fq_name_node[i].GetString();
156 key->
id_name += fq_name_node[i].GetString();
162 const Value &key_node,
const Value &value_node,
165 string metaname = key_node.GetString();
166 MetadataParseMap::const_iterator loc =
metadata_map_.find(metaname);
172 if (add_change && value_node.IsNull())
174 std::unique_ptr<AutogenProperty> pvalue;
176 bool success = (loc->second)(value_node, &pvalue);
178 "No entry in metadata map");
180 const string key = metaname;
185 std::replace(metaname.begin(), metaname.end(),
'_',
'-');
187 add_change, req_list);
195 Value::ConstMemberIterator doc_itr = adapter.
document().MemberBegin();
196 const Value &value_node = doc_itr->value;
197 for (Value::ConstMemberIterator itr = value_node.MemberBegin();
198 itr != value_node.MemberEnd(); ++itr) {
200 req_list, add_change);
210 const Value& to_node = ref_entry[
"to"];
212 string from_underscore = key.
id_type;
213 std::replace(from_underscore.begin(), from_underscore.end(),
'-',
'_');
217 "Link name is empty");
218 string metaname = link_name;
219 std::replace(metaname.begin(), metaname.end(),
'-',
'_');
221 MetadataParseMap::const_iterator loc =
metadata_map_.find(metaname);
223 "No entry in metadata map");
225 std::unique_ptr<AutogenProperty> pvalue;
226 if (ref_entry.HasMember(
"attr")) {
227 const Value& attr_node = ref_entry[
"attr"];
228 bool success = (loc->second)(attr_node, &pvalue);
230 "Link attribute parse error");
234 neigh_name += to_node.GetString();
237 link_name, pvalue, key, add_change, req_list);
245 const string &key_str,
size_t pos,
bool add_change)
const {
246 string refer = key_str.substr(0, pos);
248 for (
size_t i = 0; i < arr.Size(); ++i)
249 ParseRef(adapter, arr[i], origin, refer, key, req_list, add_change);
256 Value::ConstMemberIterator doc_itr = adapter.
document().MemberBegin();
257 const Value &properties = doc_itr->value;
258 for (Value::ConstMemberIterator itr = properties.MemberBegin();
259 itr != properties.MemberEnd(); ++itr) {
260 string key_str = itr->name.GetString();
262 if (key_str.find(
"back_refs") != string::npos) {
265 size_t pos = key_str.find(
"_refs");
266 if (pos != string::npos) {
267 ParseOneRef(adapter, itr->value, key, origin, req_list, key_str,
271 if (key_str.compare(
"parent_type") == 0) {
272 const Value& ptype_node = itr->value;
274 "Invalid parent type");
275 pos = key.
id_name.find_last_of(
":");
276 if (pos != string::npos) {
277 string parent_type = ptype_node.GetString();
279 string parent_name = key.
id_name.substr(0, pos);
283 "Missing link name");
284 std::unique_ptr<AutogenProperty > pvalue;
286 parent_name, metaname, pvalue, key, add_change, req_list);
310 if (!
ParseLinks(adapter, *key, origin, req_list, add_change)) {
318 const string &neigh_type,
const string &neigh_name,
319 const string &metaname, std::unique_ptr<AutogenProperty> &pvalue,
326 data->
content.reset(pvalue.release());
332 db_request->
data.reset(data);
334 req_list->push_back(db_request);
338 while (!req_list->empty()) {
339 unique_ptr<DBRequest> req(req_list->front());
340 req_list->pop_front();
359 size_t pos = adapter.
document().GetErrorOffset();
362 "Error in parsing JSON message at position",
363 pos,
"with error description",
364 boost::lexical_cast<string>(
380 int stage,
int instNum,
382 const ConfigClientInfoReq *request =
383 static_cast<const ConfigClientInfoReq *
>(ps.
snhRequest_.get());
384 ConfigClientInfoResp *response =
new ConfigClientInfoResp();
392 ConfigAmqpConnInfo amqp_conn_info;
394 response->set_amqp_conn_info(amqp_conn_info);
397 ConfigDBConnInfo db_conn_info;
400 ConfigClientManagerInfo client_mgr_info;
403 response->set_client_manager_info(client_mgr_info);
404 response->set_db_conn_info(db_conn_info);
405 response->set_context(request->context());
406 response->set_more(
false);
407 response->Response();
411 void ConfigClientInfoReq::HandleRequest()
const {
420 ps.stages_= boost::assign::list_of(s0).convert_to_container<
421 std::vector<RequestPipeline::StageSpec> >();
427 int stage,
int instNum,
429 const ConfigClientReinitReq *request =
430 static_cast<const ConfigClientReinitReq *
>(ps.
snhRequest_.get());
431 ConfigClientReinitResp *response =
new ConfigClientReinitResp();
440 response->set_success(
true);
441 response->set_context(request->context());
442 response->set_more(
false);
443 response->Response();
447 void ConfigClientReinitReq::HandleRequest()
const {
456 ps.stages_= boost::assign::list_of(s0).convert_to_container<
457 std::vector<RequestPipeline::StageSpec> >();
void AddParentName(LinkMemberPair member_pair, std::string s)
void AddLinkName(LinkMemberPair member_pair, LinkDataPair data_pair)
std::vector< int > instances_
MetadataParseMap metadata_map_
IFMapServer * ifmap_server()
void STLDeleteValues(Container *container)
ConfigClientManager * get_config_manager()
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
virtual void GetConnectionInfo(ConfigDBConnInfo &status) const
bool IsListOrMapPropEmpty(const std::string &uuid_key, const std::string &lookup_key) const
boost::function< bool(const contrail_rapidjson::Value &, std::unique_ptr< AutogenProperty > *) > MetadataParseFn
void CleanupStaleEntries()
bool ParseOneProperty(const ConfigCass2JsonAdapter &adapter, const contrail_rapidjson::Value &key_node, const contrail_rapidjson::Value &value_node, const IFMapTable::RequestKey &key, IFMapOrigin::Origin origin, RequestList *req_list, bool add_change) const
ConfigDbClient * config_db_client() const
bool ParseOneRef(const ConfigCass2JsonAdapter &adapter, const contrail_rapidjson::Value &arr, const IFMapTable::RequestKey &key, IFMapOrigin::Origin origin, RequestList *req_list, const std::string &key_str, size_t pos, bool add_change) const
std::unique_ptr< DBRequestData > data
ConfigAmqpClient * config_amqp_client() const
const std::string & uuid() const
bool Enqueue(DBRequest *req)
void MetadataRegister(const std::string &metadata, MetadataParseFn parser)
void ReinitConfigClient(const ConfigClientOptions &config)
void AddWrapperField(std::string key, std::string value)
std::set< std::string > ObjectTypeList
std::unique_ptr< AutogenProperty > content
IFMapServer * ifmap_server_
std::string GetParentName(const std::string &left, const std::string &right) const
std::map< std::string, std::string > WrapperFieldMap
int GetTaskId(const std::string &name)
std::string GetLinkName(const std::string &left, const std::string &right) const
bool ParseDocument(const ConfigCass2JsonAdapter &adapter, IFMapOrigin::Origin origin, RequestList *req_list, IFMapTable::RequestKey *key, bool add_change) const
void GetConnectionInfo(ConfigAmqpConnInfo &info) const
const contrail_rapidjson::Document & document() const
void SetupSchemaGraphFilter()
bool ParseLinks(const ConfigCass2JsonAdapter &adapter, const IFMapTable::RequestKey &key, IFMapOrigin::Origin origin, RequestList *req_list, bool add_change) const
static TaskScheduler * GetInstance()
std::unique_ptr< DBRequestKey > key
bool ParseRef(const ConfigCass2JsonAdapter &adapter, const contrail_rapidjson::Value &ref_entry, IFMapOrigin::Origin origin, const std::string &refer, const IFMapTable::RequestKey &key, RequestList *req_list, bool add_change) const
bool ParseProperties(const ConfigCass2JsonAdapter &adapter, const IFMapTable::RequestKey &key, IFMapOrigin::Origin origin, RequestList *req_list, bool add_change) const
void SetupSchemaWrapperPropertyInfo()
static bool ConfigClientInfoHandleRequest(const Sandesh *sr, const RequestPipeline::PipeSpec ps, int stage, int instNum, RequestPipeline::InstData *data)
void EnqueueListToTables(RequestList *req_list) const
IFMapTable::RequestKey * CloneKey(const IFMapTable::RequestKey &src) const
uint64_t GetGenerationNumber() const
bool ParseNameType(const ConfigCass2JsonAdapter &adapter, IFMapTable::RequestKey *key) const
virtual bool Receive(const ConfigCass2JsonAdapter &adapter, bool add_change)
#define CONFIG_PARSE_ASSERT(t, condition, key, value)
void MetadataClear(const std::string &module)
std::list< struct DBRequest * > RequestList
static bool ConfigClientReinitHandleRequest(const Sandesh *sr, const RequestPipeline::PipeSpec ps, int stage, int instNum, RequestPipeline::InstData *data)
#define IFMAP_WARN(obj,...)
void GetClientManagerInfo(ConfigClientManagerInfo &info) const
static IFMapTable * FindTable(DB *db, const std::string &element_type)
boost::shared_ptr< const SandeshRequest > snhRequest_
#define IFMAP_TRACE(obj,...)
virtual void SetupGraphFilter()
void InsertRequestIntoQ(IFMapOrigin::Origin origin, const std::string &neigh_type, const std::string &neigh_name, const std::string &metaname, std::unique_ptr< AutogenProperty > &pvalue, const IFMapTable::RequestKey &key, bool add_change, RequestList *req_list) const
static bool ParseString(const contrail_rapidjson::Value &node, std::string *s)
virtual void EndOfConfig()
void AddObjectType(std::string object)