diff --git a/ChaosMetadataService/api/control_unit/GetFullDescription.cpp b/ChaosMetadataService/api/control_unit/GetFullDescription.cpp index 925d5e1d936487c81a3d40af37787e55e8f3f5eb..ee8b61da40dc2fc87d56f545abab40bf03df4118 100644 --- a/ChaosMetadataService/api/control_unit/GetFullDescription.cpp +++ b/ChaosMetadataService/api/control_unit/GetFullDescription.cpp @@ -134,9 +134,13 @@ CDWUniquePtr GetFullDescription::execute(CDWUniquePtr api_data) { //we can retrive the configured attribute ChaosSharedPtr<CDataWrapper> init_ds_attribute = mergeDatasetAttributeWithSetup(element, element_configuration); - init_dataset->appendCDataWrapperToArray(*init_ds_attribute.get()); + if(init_ds_attribute.get()){ + init_dataset->appendCDataWrapperToArray(*init_ds_attribute.get()); + } } else { - init_dataset->appendCDataWrapperToArray(*element.get()); + if(element.get()){ + init_dataset->appendCDataWrapperToArray(*element.get()); + } } } } diff --git a/ChaosMetadataService/api/control_unit/SearchInstancesByUS.cpp b/ChaosMetadataService/api/control_unit/SearchInstancesByUS.cpp index e14732a1d1a0bf11891838dc9bf56bb89ca262d1..e536c1913bb5b0dc53c096ff488b31f1d5d741d7 100644 --- a/ChaosMetadataService/api/control_unit/SearchInstancesByUS.cpp +++ b/ChaosMetadataService/api/control_unit/SearchInstancesByUS.cpp @@ -75,7 +75,9 @@ CDWUniquePtr SearchInstancesByUS::execute(CDWUniquePtr api_data) { for (std::vector<ChaosSharedPtr<CDataWrapper> >::iterator it = page_result.begin(); it != page_result.end(); it++) { - result->appendCDataWrapperToArray(*it->get()); + if(it->get()){ + result->appendCDataWrapperToArray(*it->get()); + } } result->finalizeArrayForKey(chaos::NodeType::NODE_SEARCH_LIST_KEY); } diff --git a/ChaosMetadataService/api/data_service/GetAllDataService.cpp b/ChaosMetadataService/api/data_service/GetAllDataService.cpp index 519f4a3af9deffdef88d8d78ef3a598cf3669a70..ac8c35e32298073b3f0fe3a30644e70d27017eef 100644 --- a/ChaosMetadataService/api/data_service/GetAllDataService.cpp +++ b/ChaosMetadataService/api/data_service/GetAllDataService.cpp @@ -45,7 +45,9 @@ CDWUniquePtr GetAllDataService::execute(CDWUniquePtr api_data) { for(std::vector<ChaosSharedPtr<CDataWrapper> >::iterator it = data_services.begin(); it != data_services.end(); it++) { - result->appendCDataWrapperToArray(*it->get()); + if(it->get()){ + result->appendCDataWrapperToArray(*it->get()); + } } result->finalizeArrayForKey(chaos::NodeType::NODE_SEARCH_LIST_KEY); } diff --git a/ChaosMetadataService/api/data_service/GetAssociationByDS.cpp b/ChaosMetadataService/api/data_service/GetAssociationByDS.cpp index 7d84b7cab002b05c63e45c9e5dc9a5708815ff89..dab3b2fea7c77c5034a3db1f65b79a6554ba4c7a 100644 --- a/ChaosMetadataService/api/data_service/GetAssociationByDS.cpp +++ b/ChaosMetadataService/api/data_service/GetAssociationByDS.cpp @@ -53,7 +53,9 @@ CDWUniquePtr GetAssociationByDS::execute(CDWUniquePtr api_data) { for(std::vector<ChaosSharedPtr<CDataWrapper> >::iterator it = node_associated.begin(); it != node_associated.end(); it++) { - result->appendCDataWrapperToArray(*it->get()); + if(it->get()){ + result->appendCDataWrapperToArray(*it->get()); + } } result->finalizeArrayForKey(chaos::NodeType::NODE_SEARCH_LIST_KEY); return result; diff --git a/ChaosMetadataService/api/logging/GetLogForSourceUID.cpp b/ChaosMetadataService/api/logging/GetLogForSourceUID.cpp index 71d63db4a23b02cce4a642c2d32e143f630e0ce0..3b75e4b50a166d3af36f2fba0cde0fa009296798 100644 --- a/ChaosMetadataService/api/logging/GetLogForSourceUID.cpp +++ b/ChaosMetadataService/api/logging/GetLogForSourceUID.cpp @@ -82,7 +82,9 @@ CDWUniquePtr GetLogForSourceUID::execute(CDWUniquePtr api_data) { for(LogEntryListIterator it = entry_list.begin(); it != entry_list.end(); it++){ - result->appendCDataWrapperToArray(*LogUtility::convertEntry(*(*it).get())); + if((*it).get()){ + result->appendCDataWrapperToArray(*LogUtility::convertEntry(*(*it).get())); + } } result->finalizeArrayForKey("result_list"); } diff --git a/ChaosMetadataService/api/logging/SearchLogEntry.cpp b/ChaosMetadataService/api/logging/SearchLogEntry.cpp index 13a4097836179bb66e1ffcacbe16862a02a91079..3f0eff4b41746f882b483f6218e8f718f7a8a0e9 100644 --- a/ChaosMetadataService/api/logging/SearchLogEntry.cpp +++ b/ChaosMetadataService/api/logging/SearchLogEntry.cpp @@ -82,7 +82,10 @@ CDWUniquePtr SearchLogEntry::execute(CDWUniquePtr api_data) { for(LogEntryListIterator it = entry_list.begin(); it != entry_list.end(); it++){ - result->appendCDataWrapperToArray(*LogUtility::convertEntry(*(*it).get())); + if((*it).get()){ + + result->appendCDataWrapperToArray(*LogUtility::convertEntry(*(*it).get())); + } } result->finalizeArrayForKey("result_list"); } diff --git a/ChaosMetadataService/api/service/GetAllSnapshot.cpp b/ChaosMetadataService/api/service/GetAllSnapshot.cpp index 6d4dce30c9d3a152dfa5a7c3ecad1f3107f9be3e..e7b12b41b793dec11c398cbbd8909767afc648cc 100644 --- a/ChaosMetadataService/api/service/GetAllSnapshot.cpp +++ b/ChaosMetadataService/api/service/GetAllSnapshot.cpp @@ -46,13 +46,16 @@ CDWUniquePtr GetAllSnapshot::execute(CDWUniquePtr api_data) { GET_DATA_ACCESS(SnapshotDataAccess, s_da, -1); if((err = s_da->getAllSnapshot(snapshots))){ - LOG_AND_TROW(S_GAS_ERR, -2, "Error getting the snpahsot list"); + LOG_AND_TROW(S_GAS_ERR, -2, "Error getting the snapshot list"); } for(SnapshotListIterator it = snapshots.begin(); it != snapshots.end(); it++) { - result->appendCDataWrapperToArray(*(*it).get()); + if((*it).get()){ + + result->appendCDataWrapperToArray(*(*it).get()); + } } result->finalizeArrayForKey("snapshot_list_result"); diff --git a/ChaosMetadataService/api/service/GetSnapshotDatasetsForNode.cpp b/ChaosMetadataService/api/service/GetSnapshotDatasetsForNode.cpp index 6ed0e34154f08750f661fc4f7e92a843a5c93901..58f388677cccb273f34bc2a8ecbec82317df34ef 100644 --- a/ChaosMetadataService/api/service/GetSnapshotDatasetsForNode.cpp +++ b/ChaosMetadataService/api/service/GetSnapshotDatasetsForNode.cpp @@ -58,7 +58,9 @@ CDWUniquePtr GetSnapshotDatasetsForNode::execute(CDWUniquePtr api_data) { it++) { CDataWrapper dataset_element; dataset_element.addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_NAME, it->first); - dataset_element.addCSDataValue("dataset_value", *it->second); + if(it->second){ + dataset_element.addCSDataValue("dataset_value", *it->second); + } result->appendCDataWrapperToArray(dataset_element); } diff --git a/ChaosMetadataService/api/service/QueryDataCloud.cpp b/ChaosMetadataService/api/service/QueryDataCloud.cpp index 40f511323dbf3d375bdf8fa3f5c093b173b1b695..a5451b6f7bfda6d7254e8d5b74487aa7e3aff146 100644 --- a/ChaosMetadataService/api/service/QueryDataCloud.cpp +++ b/ChaosMetadataService/api/service/QueryDataCloud.cpp @@ -95,7 +95,9 @@ CDWUniquePtr QueryDataCloud::execute(CDWUniquePtr api_data) { } for(VectorObject::iterator i=found_object_page.begin();i!=found_object_page.end();i++){ - result->appendCDataWrapperToArray(*(i->get())); + if(i->get()){ + result->appendCDataWrapperToArray(*(i->get())); + } } diff --git a/ChaosMetadataService/api/unit_server/GetSetFullUnitServer.cpp b/ChaosMetadataService/api/unit_server/GetSetFullUnitServer.cpp index 417f0aa5f9ed386211c675bdbc5dbdbf9c9b907a..7528a73b3b4d32af8b00c76b1e2fea03a01d82c0 100644 --- a/ChaosMetadataService/api/unit_server/GetSetFullUnitServer.cpp +++ b/ChaosMetadataService/api/unit_server/GetSetFullUnitServer.cpp @@ -231,7 +231,9 @@ CDWUniquePtr GetSetFullUnitServer::execute(CDWUniquePtr api_data) { LOG_AND_TROW(US_ACT_ERR, err, boost::str(boost::format("Error fetching the control unit instance description for cuid:%1%") % cu_uid)); } - tot_res.appendCDataWrapperToArray(*res); + if(res){ + tot_res.appendCDataWrapperToArray(*res); + } } } tot_res.finalizeArrayForKey("cu_desc"); diff --git a/ChaosMetadataService/common/CUCommonUtility.cpp b/ChaosMetadataService/common/CUCommonUtility.cpp index 1402e8d284a18ce32a3e43b2217b6127f74f18d6..f895a9ab69bde8327c7b9b4d1c25d0153eea2428 100644 --- a/ChaosMetadataService/common/CUCommonUtility.cpp +++ b/ChaosMetadataService/common/CUCommonUtility.cpp @@ -45,28 +45,28 @@ using namespace chaos::service_common::persistence::data_access; ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::prepareRequestPackForLoadControlUnit(const std::string &cu_uid, chaos::metadata_service::persistence::data_access::NodeDataAccess *n_da, chaos::metadata_service::persistence::data_access::ControlUnitDataAccess *cu_da, chaos::metadata_service::persistence::data_access::DataServiceDataAccess *ds_da) { CUCU_DBG << "Prepare autoload request for:" << cu_uid; int err = 0; - CDataWrapper * tmp_ptr = NULL; + CDataWrapper *tmp_ptr = NULL; ChaosUniquePtr<chaos::common::data::CDataWrapper> instance_description; ChaosUniquePtr<chaos::common::data::CDataWrapper> result_pack; if ((err = cu_da->getInstanceDescription(cu_uid, &tmp_ptr))) { - //we haven't found an instance for the node + // we haven't found an instance for the node CUCU_ERR << "Erroe getting instance" << err; } else if (tmp_ptr != NULL) { instance_description.reset(tmp_ptr); - //we have instances the rpc port is got from the unit server input data of the command + // we have instances the rpc port is got from the unit server input data of the command if (!instance_description->hasKey("control_unit_implementation")) { CUCU_ERR << "No implementaiton found"; } else { CUCU_DBG << "Create the autoload datapack for:" << cu_uid; result_pack.reset(new CDataWrapper()); - //add cu id + // add cu id result_pack->addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, cu_uid); - //add cu type + // add cu type result_pack->addStringValue(UnitServerNodeDomainAndActionRPC::PARAM_CONTROL_UNIT_TYPE, instance_description->getStringValue("control_unit_implementation")); - //add driver description + // add driver description instance_description->copyKeyTo(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DRIVER_DESCRIPTION, *result_pack); instance_description->copyKeyTo(ControlUnitNodeDefinitionKey::CONTROL_UNIT_LOAD_PARAM, *result_pack); addDataServicePack(result_pack, ds_da); @@ -77,15 +77,15 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::prepareReques return result_pack; } -void CUCommonUtility::prepareAutoInitAndStartInAutoLoadControlUnit(const std::string & cu_uid, - NodeDataAccess * n_da, +void CUCommonUtility::prepareAutoInitAndStartInAutoLoadControlUnit(const std::string &cu_uid, + NodeDataAccess *n_da, ControlUnitDataAccess *cu_da, DataServiceDataAccess *ds_da, - CDataWrapper * auto_load_pack) { + CDataWrapper *auto_load_pack) { CUCU_DBG << "Prepare autoload request for:" << cu_uid; int err = 0; CDataWrapper *tmp_ptr = NULL; - //if the control unit to load need also to be initialized and started we compose the startup command to achieve this + // if the control unit to load need also to be initialized and started we compose the startup command to achieve this if ((err = cu_da->getInstanceDescription(cu_uid, &tmp_ptr))) { LOG_AND_TROW_FORMATTED(CUCU_ERR, err, "Error %1% durring fetch of instance for unit server %2%", % err % cu_da) } else if (tmp_ptr) { @@ -102,9 +102,12 @@ void CUCommonUtility::prepareAutoInitAndStartInAutoLoadControlUnit(const std::st ChaosUniquePtr<chaos::common::data::CDataWrapper> init_message_datapack(new CDataWrapper()); init_message_datapack->addStringValue(RpcActionDefinitionKey::CS_CMDM_ACTION_NAME, NodeDomainAndActionRPC::ACTION_NODE_INIT); - init_message_datapack->addCSDataValue(RpcActionDefinitionKey::CS_CMDM_ACTION_MESSAGE, *init_datapack); - - auto_load_pack->appendCDataWrapperToArray(*init_message_datapack); + if (init_datapack.get()) { + init_message_datapack->addCSDataValue(RpcActionDefinitionKey::CS_CMDM_ACTION_MESSAGE, *init_datapack); + } + if (init_message_datapack.get()) { + auto_load_pack->appendCDataWrapperToArray(*init_message_datapack); + } } if (auto_start) { ChaosUniquePtr<chaos::common::data::CDataWrapper> start_datapack(new CDataWrapper()); @@ -116,37 +119,37 @@ void CUCommonUtility::prepareAutoInitAndStartInAutoLoadControlUnit(const std::st auto_load_pack->appendCDataWrapperToArray(*start_message_datapack); } - //finalize startup command array + // finalize startup command array auto_load_pack->finalizeArrayForKey(UnitServerNodeDomainAndActionRPC::PARAM_CONTROL_UNIT_STARTUP_COMMAND); } } } -CDWShrdPtr CUCommonUtility::getConfigurationToUse(const std::string & cu_uid, - const std::string & ds_attribute_name, - chaos::metadata_service::persistence::data_access::NodeDataAccess * n_da, +CDWShrdPtr CUCommonUtility::getConfigurationToUse(const std::string &cu_uid, + const std::string &ds_attribute_name, + chaos::metadata_service::persistence::data_access::NodeDataAccess *n_da, chaos::metadata_service::persistence::data_access::ControlUnitDataAccess *cu_da, - PropertyGroup & control_unit_property_group) { + PropertyGroup &control_unit_property_group) { int err = 0; ChaosSharedPtr<CDataWrapper> element_configuration; - //fetch static information + // fetch static information if ((err = cu_da->getInstanceDatasetAttributeConfiguration(cu_uid, ds_attribute_name, element_configuration))) { LOG_AND_TROW(CUCU_ERR, err, boost::str(boost::format("Error loading the configuration for the the dataset's attribute: %1% for control unit: %2%") % ds_attribute_name % cu_uid)); } - //check if we need to do a restor at initialization time + // check if we need to do a restor at initialization time if (control_unit_property_group.hasProperty(chaos::ControlUnitPropertyKey::INIT_RESTORE_APPLY) & control_unit_property_group.getProperty(chaos::ControlUnitPropertyKey::INIT_RESTORE_APPLY).getPropertyValue().isValid() && control_unit_property_group.getProperty(chaos::ControlUnitPropertyKey::INIT_RESTORE_APPLY).getPropertyValue().asBool()) { - //in case of restore at init if we need to to a restor to a last valid dataset wi try to fetch it from database + // in case of restore at init if we need to to a restor to a last valid dataset wi try to fetch it from database if (control_unit_property_group.hasProperty(chaos::ControlUnitPropertyKey::INIT_RESTORE_OPTION) && control_unit_property_group.getProperty(chaos::ControlUnitPropertyKey::INIT_RESTORE_OPTION).getPropertyValue().isValid()) { if (control_unit_property_group.getProperty(chaos::ControlUnitPropertyKey::INIT_RESTORE_OPTION).getPropertyValue().asInt32() == chaos::ControlUnitPropertyKey::INIT_RESTORE_OPTION_TYPE_LAST_VALIDE) { - //in this case we need only the value, but if the attribute has been set in static configuration all othe property are preserved - //get last dataset + // in this case we need only the value, but if the attribute has been set in static configuration all othe property are preserved + // get last dataset CDWShrdPtr tmp_result; AbstractPersistenceDriver &obj_storage_drv = DriverPoolManager::getInstance()->getObjectStorageDrv(); if (obj_storage_drv.getDataAccess<ObjectStorageDataAccess>()->getLastObject(cu_uid + chaos::DataPackPrefixID::INPUT_DATASET_POSTFIX, tmp_result) == 0) { @@ -155,7 +158,7 @@ CDWShrdPtr CUCommonUtility::getConfigurationToUse(const std::string & if (element_configuration.get() == NULL) { element_configuration.reset(new CDataWrapper()); } - //we have found last dataset + // we have found last dataset ChaosSharedPtr<CDataWrapper> new_configuration(new CDataWrapper()); element_configuration->getAllKey(all_keys); @@ -169,10 +172,10 @@ CDWShrdPtr CUCommonUtility::getConfigurationToUse(const std::string & element_configuration->copyKeyTo(*it, *new_configuration); } } - //set new confiuration as element default configuration + // set new confiuration as element default configuration element_configuration = new_configuration; } else { - //we have got problem to fetch last dataset so we trow exception + // we have got problem to fetch last dataset so we trow exception throw CException(-1, "No dataset found on object storage", __PRETTY_FUNCTION__); } } @@ -183,13 +186,12 @@ CDWShrdPtr CUCommonUtility::getConfigurationToUse(const std::string & } static int64_t nu_cache_ts = 0; static std::vector<ChaosSharedPtr<CDataWrapper> > data_services; -static CDataWrapper fillWrapperFromPersistenceParams(chaos::service_common::persistence::data_access::PersistenceDriverSetting& setting){ +static CDataWrapper fillWrapperFromPersistenceParams(chaos::service_common::persistence::data_access::PersistenceDriverSetting &setting) { CDataWrapper persistence; - if(setting.persistence_implementation.size()){ - std::vector<std::string> pers_servers=setting.persistence_server_list;//ChaosMetadataService::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< std::string> >(chaos::service_common::persistence::OPT_PERSITENCE_SERVER_ADDR_LIST); + if (setting.persistence_implementation.size()) { + std::vector<std::string> pers_servers = setting.persistence_server_list; // ChaosMetadataService::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< std::string> >(chaos::service_common::persistence::OPT_PERSITENCE_SERVER_ADDR_LIST); persistence.addStringValue(chaos::service_common::persistence::OPT_PERSITENCE_IMPL, setting.persistence_implementation); - if ( pers_servers.size()){ - + if (pers_servers.size()) { for (std::vector<std::string>::iterator i = pers_servers.begin(); i != pers_servers.end(); i++) { if (*i == "localhost" || (*i == "127.0.0.1")) { persistence.appendStringToArray(chaos::GlobalConfiguration::getInstance()->getLocalServerAddress()); @@ -197,18 +199,17 @@ static CDataWrapper fillWrapperFromPersistenceParams(chaos::service_common::pers persistence.appendStringToArray(*i); } } - persistence.finalizeArrayForKey(chaos::service_common::persistence::OPT_PERSITENCE_SERVER_ADDR_LIST); - } - std::map<std::string,std::string> parameter = setting.persistence_kv_param_map; - for (std::map<std::string,std::string>::iterator i = parameter.begin(); i != parameter.end(); i++) { - persistence.appendStringToArray(i->first+":"+i->second); - } - if(parameter.begin()!=parameter.end()){ + persistence.finalizeArrayForKey(chaos::service_common::persistence::OPT_PERSITENCE_SERVER_ADDR_LIST); + } + std::map<std::string, std::string> parameter = setting.persistence_kv_param_map; + for (std::map<std::string, std::string>::iterator i = parameter.begin(); i != parameter.end(); i++) { + persistence.appendStringToArray(i->first + ":" + i->second); + } + if (parameter.begin() != parameter.end()) { persistence.finalizeArrayForKey(chaos::service_common::persistence::OPT_PERSITENCE_KV_PARAMTER); - + } } -} -return persistence; + return persistence; } void CUCommonUtility::addDataServicePack(ChaosUniquePtr<chaos::common::data::CDataWrapper> &result, chaos::metadata_service::persistence::data_access::DataServiceDataAccess *ds_da, unsigned numner_or_result) { int err = 0; @@ -226,7 +227,7 @@ void CUCommonUtility::addDataServicePack(ChaosUniquePtr<chaos::common::data::CDa numner_or_result))) { throw CException(err, "Error fetching best available data service", __PRETTY_FUNCTION__); } - //update cache on first call after ten seconds + // update cache on first call after ten seconds } std::string msgbroker = GlobalConfiguration::getInstance()->getOption<std::string>(InitOption::OPT_MSG_BROKER_SERVER); if (msgbroker.size()) { @@ -234,22 +235,21 @@ void CUCommonUtility::addDataServicePack(ChaosUniquePtr<chaos::common::data::CDa result->finalizeArrayForKey(chaos::DataServiceNodeDefinitionKey::DS_BROKER_ADDRESS_LIST); result->addInt64Value(chaos::DataServiceNodeDefinitionKey::DS_TIMESTAMP_UNCERTENTY, (uint64_t)ChaosMetadataService::timePrecisionMask); } - - if(DriverPoolManager::objectSetting.persistence_implementation.size()){ - result->append(chaos::DataServiceNodeDefinitionKey::DS_STORAGE_SETTINGS, fillWrapperFromPersistenceParams(DriverPoolManager::objectSetting)); + if (DriverPoolManager::objectSetting.persistence_implementation.size()) { + result->append(chaos::DataServiceNodeDefinitionKey::DS_STORAGE_SETTINGS, fillWrapperFromPersistenceParams(DriverPoolManager::objectSetting)); } - if( DriverPoolManager::persistentSetting.persistence_implementation.size()){ + if (DriverPoolManager::persistentSetting.persistence_implementation.size()) { result->append(chaos::DataServiceNodeDefinitionKey::DS_ADMIN_SETTINGS, fillWrapperFromPersistenceParams(DriverPoolManager::persistentSetting)); - } - if( DriverPoolManager::logSetting.persistence_implementation.size()){ + } + if (DriverPoolManager::logSetting.persistence_implementation.size()) { result->append(chaos::DataServiceNodeDefinitionKey::DS_LOG_SETTINGS, fillWrapperFromPersistenceParams(DriverPoolManager::logSetting)); - } - // std::vector<std::string> cache_server = GlobalConfiguration::getInstance()->getOption<std::vector<std::string> >(OPT_CACHE_SERVER_LIST); + } + // std::vector<std::string> cache_server = GlobalConfiguration::getInstance()->getOption<std::vector<std::string> >(OPT_CACHE_SERVER_LIST); std::vector<std::string> cache_server = DriverPoolManager::cacheSetting.startup_chache_servers; if (cache_server.size()) { CDataWrapper cache; - //cache.addStringValue(OPT_CACHE_DRIVER, GlobalConfiguration::getInstance()->getOption<std::string>(OPT_CACHE_DRIVER)); + // cache.addStringValue(OPT_CACHE_DRIVER, GlobalConfiguration::getInstance()->getOption<std::string>(OPT_CACHE_DRIVER)); cache.addStringValue(OPT_CACHE_DRIVER, DriverPoolManager::cacheSetting.cache_driver_impl); for (std::vector<std::string>::iterator i = cache_server.begin(); i != cache_server.end(); i++) { if (*i == "localhost" || (*i == "127.0.0.1")) { @@ -259,21 +259,20 @@ void CUCommonUtility::addDataServicePack(ChaosUniquePtr<chaos::common::data::CDa } } cache.finalizeArrayForKey(OPT_CACHE_SERVER_LIST); - // std::vector<std::string> parameter = GlobalConfiguration::getInstance()->getOption<std::vector<std::string> >(OPT_CACHE_DRIVER_KVP); - std::map<std::string,std::string> parameter = DriverPoolManager::cacheSetting.key_value_custom_param; - for (std::map<std::string,std::string>::iterator i = parameter.begin(); i != parameter.end(); i++) { - cache.appendStringToArray(i->first+":"+i->second); + // std::vector<std::string> parameter = GlobalConfiguration::getInstance()->getOption<std::vector<std::string> >(OPT_CACHE_DRIVER_KVP); + std::map<std::string, std::string> parameter = DriverPoolManager::cacheSetting.key_value_custom_param; + for (std::map<std::string, std::string>::iterator i = parameter.begin(); i != parameter.end(); i++) { + cache.appendStringToArray(i->first + ":" + i->second); } cache.finalizeArrayForKey(OPT_CACHE_DRIVER_KVP); result->append(chaos::DataServiceNodeDefinitionKey::DS_CACHE_SETTINGS, cache); } - - //constructs the result - //result.reset(new CDataWrapper()); + // constructs the result + // result.reset(new CDataWrapper()); if (data_services.size() == 0) { /// something wrong returning my self - + result->appendStringToArray(boost::str(boost::format("%1%|0") % NetworkBroker::getInstance()->getDirectIOUrl())); result->finalizeArrayForKey(chaos::DataServiceNodeDefinitionKey::DS_DIRECT_IO_FULL_ADDRESS_LIST); @@ -295,7 +294,7 @@ void CUCommonUtility::addDataServicePack(ChaosUniquePtr<chaos::common::data::CDa } result->finalizeArrayForKey(chaos::DataServiceNodeDefinitionKey::DS_DIRECT_IO_FULL_ADDRESS_LIST); - //add rpc information for found nodes + // add rpc information for found nodes BOOST_FOREACH (ChaosSharedPtr<CDataWrapper> ds_element, data_services) { if (ds_element->hasKey(chaos::NodeDefinitionKey::NODE_RPC_ADDR)) { result->appendStringToArray(ds_element->getStringValue(chaos::NodeDefinitionKey::NODE_RPC_ADDR)); @@ -308,7 +307,6 @@ void CUCommonUtility::addDataServicePack(ChaosUniquePtr<chaos::common::data::CDa throw CException(err, "No best endpoint found", __PRETTY_FUNCTION__); } CUCU_DBG << "Configuration pack:" << result->getJSONString(); - } #if 0 void CUCommonUtility::addDataServicePack(const std::string& cu_uid,ChaosUniquePtr<chaos::common::data::CDataWrapper>& init_datapack, @@ -364,36 +362,36 @@ void CUCommonUtility::addDataServicePack(const std::string& cu_uid,ChaosUniquePt } #endif -ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack(const std::string & cu_uid, - NodeDataAccess * n_da, +ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack(const std::string &cu_uid, + NodeDataAccess *n_da, ControlUnitDataAccess *cu_da, DataServiceDataAccess *ds_da) { int err = 0; int64_t run_id = 0; - CDataWrapper * result = NULL; + CDataWrapper *result = NULL; PropertyGroup control_unit_property_group; ChaosUniquePtr<chaos::common::data::CDataWrapper> cu_base_description; ChaosUniquePtr<chaos::common::data::CDataWrapper> dataset_description; ChaosUniquePtr<chaos::common::data::CDataWrapper> init_datapack(new CDataWrapper()); - //set the control unique id in the init datapack + // set the control unique id in the init datapack init_datapack->addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, cu_uid); - //get default control unit node description + // get default control unit node description if ((err = n_da->getNodeDescription(cu_uid, &result))) { LOG_AND_TROW(CUCU_ERR, err, boost::str(boost::format("Error fetching the control unit node default description for unique id:%1% with error %2%") % cu_uid)); } cu_base_description.reset(result); result = NULL; - //copy rpc information in the init datapack + // copy rpc information in the init datapack if (init_datapack->hasKey(NodeDefinitionKey::NODE_RPC_ADDR)) { - //CHECK_KEY_THROW_AND_LOG(cu_base_description, NodeDefinitionKey::NODE_RPC_ADDR, CUCU_ERR, -3, "No rpc addres in the control unit descirption") + // CHECK_KEY_THROW_AND_LOG(cu_base_description, NodeDefinitionKey::NODE_RPC_ADDR, CUCU_ERR, -3, "No rpc addres in the control unit descirption") init_datapack->addStringValue(NodeDefinitionKey::NODE_RPC_ADDR, cu_base_description->getStringValue(NodeDefinitionKey::NODE_RPC_ADDR)); } if (init_datapack->hasKey(NodeDefinitionKey::NODE_RPC_DOMAIN)) { - //CHECK_KEY_THROW_AND_LOG(cu_base_description, NodeDefinitionKey::NODE_RPC_DOMAIN, CUCU_ERR, -3, "No rpc domain in the control unit descirption") + // CHECK_KEY_THROW_AND_LOG(cu_base_description, NodeDefinitionKey::NODE_RPC_DOMAIN, CUCU_ERR, -3, "No rpc domain in the control unit descirption") init_datapack->addStringValue(NodeDefinitionKey::NODE_RPC_DOMAIN, cu_base_description->getStringValue(NodeDefinitionKey::NODE_RPC_DOMAIN)); } @@ -403,12 +401,12 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( } else if (result == NULL) { LOG_AND_TROW(CUCU_ERR, err, boost::str(boost::format("No instance found for control unit: %1%") % cu_uid)); } - //we have the configured instance + // we have the configured instance ChaosUniquePtr<chaos::common::data::CDataWrapper> instance_description(result); result = NULL; - //update run id - //update the cotnrol unit id + // update run id + // update the cotnrol unit id // better to return the timestamp is always growing, has a more information and faster /* if((err = cu_da->getNextRunID(cu_uid, @@ -427,15 +425,15 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( } } run_id = chaos::common::utility::TimingUtil::getTimeStamp(); - //get the dataset of the control unit + // get the dataset of the control unit if ((err = cu_da->getDataset(cu_uid, &result))) { LOG_AND_TROW(CUCU_ERR, err, boost::str(boost::format("Error fetching dataset for control unit %1%") % cu_uid)); } else if (result != NULL) { - //we have the published dataset + // we have the published dataset dataset_description.reset(result); - //check for restore option + // check for restore option if ((err = n_da->getPropertyGroup(PropertyTypeDefaultValues, cu_uid, chaos::ControlUnitPropertyKey::P_GROUP_NAME, @@ -448,11 +446,13 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( for (int idx = 0; idx < dataset_element_vec->size(); idx++) { - //get the dataset element + // get the dataset element ChaosUniquePtr<chaos::common::data::CDataWrapper> element(dataset_element_vec->getCDataWrapperElementAtIndex(idx)); const std::string ds_attribute_name = element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME); int32_t direction = element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION); - //get the dataset element setup + // get the dataset element setup + if(element.get()==NULL) continue; + if (direction == chaos::DataType::Input || direction == chaos::DataType::Bidirectional) { CDWShrdPtr element_configuration = getConfigurationToUse(cu_uid, @@ -464,7 +464,9 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( //we can retrive the configured attribute ChaosUniquePtr<chaos::common::data::CDataWrapper> init_ds_attribute = mergeDatasetAttributeWithSetup(element.get(), element_configuration.get()); - init_dataset->appendCDataWrapperToArray(*init_ds_attribute.get()); + if(init_ds_attribute.get()){ + init_dataset->appendCDataWrapperToArray(*init_ds_attribute.get()); + } } else { init_dataset->appendCDataWrapperToArray(*element.get()); } @@ -474,10 +476,10 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( } init_dataset->finalizeArrayForKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); - //add configurad dataset to the init datapack + // add configurad dataset to the init datapack init_datapack->addCSDataValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION, *init_dataset.get()); } else { - //we have no dataset configure, in this case we send back only the configuration witho merge + // we have no dataset configure, in this case we send back only the configuration witho merge if ((err = cu_da->getInstanceDescription(cu_uid, &result))) { LOG_AND_TROW(CUCU_ERR, err, boost::str(boost::format("Error fetching the isntance for control unit %1%") % cu_uid)); } else if (result != NULL) { @@ -485,7 +487,7 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( ChaosUniquePtr<chaos::common::data::CDataWrapper> init_dataset(new CDataWrapper()); if (instance_description->hasKey("attribute_value_descriptions") && instance_description->isVectorValue("attribute_value_descriptions")) { - //we have a configuration so we try to send it as dataset + // we have a configuration so we try to send it as dataset CMultiTypeDataArrayWrapperSPtr instance_description_array(result->getVectorValue("attribute_value_descriptions")); for (int aai = 0; aai < instance_description_array->size(); @@ -497,7 +499,7 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( } init_dataset->finalizeArrayForKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); - //add configurad dataset to the init datapack + // add configurad dataset to the init datapack init_datapack->addCSDataValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION, *init_dataset.get()); } } @@ -514,7 +516,7 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::initDataPack( pgu_default.serialize()->copyAllTo(*init_datapack); init_datapack->addInt64Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_RUN_ID, run_id); - //set the action type + // set the action type init_datapack->addInt32Value("action", (int32_t)0); return init_datapack; } @@ -557,14 +559,14 @@ ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::deinitDataPac ChaosUniquePtr<chaos::common::data::CDataWrapper> CUCommonUtility::mergeDatasetAttributeWithSetup(CDataWrapper *element_in_dataset, CDataWrapper *element_in_setup) { ChaosUniquePtr<chaos::common::data::CDataWrapper> result(new CDataWrapper()); - //move + // move MOVE_STRING_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME, element_in_dataset, result) MOVE_STRING_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION, element_in_dataset, result) MOVE_INT32_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_TYPE, element_in_dataset, result) MOVE_INT32_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION, element_in_dataset, result) MOVE_INT32_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_VALUE_MAX_SIZE, element_in_dataset, result) - //update config value + // update config value MERGE_STRING_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE, element_in_dataset, element_in_setup, result) MERGE_STRING_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE, element_in_dataset, element_in_setup, result) MERGE_STRING_VALUE(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE, element_in_dataset, element_in_setup, result) diff --git a/ChaosMetadataService/object_storage/influxDB/InfluxDB.cpp b/ChaosMetadataService/object_storage/influxDB/InfluxDB.cpp index 012975d0bedd53a74904fbd3f2435a56f476a863..035c270b80224e1745d31ae0a1e77580e42fee69 100644 --- a/ChaosMetadataService/object_storage/influxDB/InfluxDB.cpp +++ b/ChaosMetadataService/object_storage/influxDB/InfluxDB.cpp @@ -27,7 +27,6 @@ #define DBG DBG_LOG(InfluxDB) #define ERR ERR_LOG(InfluxDB) #include <chaos/common/utility/TimingUtil.h> -#define MAX_ARRAY_POINTS 512 using namespace chaos::metadata_service::object_storage; #if CHAOS_PROMETHEUS @@ -185,104 +184,129 @@ static const unsigned int DPCK_DATASET_TYPE_LOG = 7; case DataType::TYPE_VECTOR_BOOL: { uint32_t size = 0; const bool* ptr = (const bool*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(bool)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + + if (ptr && ( size / sizeof(bool)< si.max_array_size)) { + for (int cnt = 0; (cnt <size/sizeof(bool)) ; cnt++) { measurements << c <<pref<< *i + "." << cnt << "=" << ((ptr[cnt]) ? 't' : 'f'); first++; nmeas++; } + } else { + ERR << "Skipped vector (bool) measurement \"" << *i << "\", size " <<size / sizeof(bool) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_INT32: { uint32_t size = 0; const int32_t* ptr = (const int32_t*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(int32_t)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(int32_t)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(int32_t)); cnt++) { measurements << c << pref<<*i + "." << cnt << "=" << ptr[cnt] << "i"; first++; nmeas++; } + } else { + ERR << "Skipped vector (int32_t) measurement \"" << *i << "\", size " <<size / sizeof(int32_t) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_UINT32: { uint32_t size = 0; const uint32_t* ptr = (const uint32_t*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(int32_t)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(int32_t)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(int32_t)) ; cnt++) { measurements << c <<pref<< *i + "." << cnt << "=" << ptr[cnt] << "i"; first++; nmeas++; } + } else { + ERR << "Skipped vector (uint32_t) measurement \"" << *i << "\", size " <<size / sizeof(uint32_t) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_UINT8: { uint32_t size = 0; const uint8_t* ptr = (const uint8_t*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(uint8_t)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(uint8_t)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(uint8_t)); cnt++) { measurements << c <<pref<< *i + "." << cnt << "=" << ptr[cnt] << "i"; first++; nmeas++; } + } else { + ERR << "Skipped vector (uint8_t) measurement \"" << *i << "\", size " <<size / sizeof(uint8_t) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_UINT16: { uint32_t size = 0; const uint16_t* ptr = (const uint16_t*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(uint16_t)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(uint16_t)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(uint16_t)) ; cnt++) { measurements << c << pref<<*i + "." << cnt << "=" << ptr[cnt] << "i"; first++; nmeas++; } + } else { + ERR << "Skipped vector (uint16_t) measurement \"" << *i << "\", size " <<size / sizeof(uint16_t) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_INT16: { uint32_t size = 0; const int16_t* ptr = (const int16_t*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(int16_t)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(int16_t)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(int16_t)) ; cnt++) { measurements << c <<pref<< *i + "." << cnt << "=" << ptr[cnt] << "i"; first++; nmeas++; } + } else { + ERR << "Skipped vector (int16_t) measurement \"" << *i << "\", size " <<size / sizeof(int16_t) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_INT8: { uint32_t size = 0; const int8_t* ptr = (const int8_t*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(int8_t)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(int8_t)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(int8_t)); cnt++) { measurements << c << pref<<*i + "." << cnt << "=" << ptr[cnt] << "i"; first++; nmeas++; } + } else { + ERR << "Skipped vector (int8_t) measurement \"" << *i << "\", size " <<size / sizeof(int8_t) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_INT64: { uint32_t size = 0; const int64_t* ptr = (const int64_t*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(int64_t)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(int64_t)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(int64_t)); cnt++) { measurements << c << pref<<*i + "." << cnt << "=" << ptr[cnt] << "i"; first++; nmeas++; } + }else { + ERR << "Skipped vector (int64) measurement \"" << *i << "\", size " <<size / sizeof(int64_t) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_DOUBLE: { uint32_t size = 0; const double* ptr = (const double*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(double)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(double)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(double)); cnt++) { if (std::isfinite(ptr[cnt])) { measurements << c << pref<<*i + "." << cnt << "=" << ptr[cnt]; first++; @@ -290,14 +314,17 @@ static const unsigned int DPCK_DATASET_TYPE_LOG = 7; } // DBG<< c << *i+"_" <<cnt<< "=" << ptr[cnt]; } + } else { + ERR << "Skipped vector (double) measurement \"" << *i << "\", size " <<size / sizeof(double) << " max " << si.max_array_size; + } break; } case DataType::TYPE_VECTOR_FLOAT: { uint32_t size = 0; const float* ptr = (const float*)stored_object.getBinaryValue(*i, size); - if (ptr) { - for (int cnt = 0; (cnt < size / sizeof(float)) && (cnt < MAX_ARRAY_POINTS); cnt++) { + if (ptr&& ( size / sizeof(float)< si.max_array_size)) { + for (int cnt = 0; (cnt < size / sizeof(float)) ; cnt++) { if (std::isfinite(ptr[cnt])) { measurements << c << pref<<*i + "." << cnt << "=" << ptr[cnt]; first++; @@ -305,6 +332,9 @@ static const unsigned int DPCK_DATASET_TYPE_LOG = 7; } // DBG<< c << *i+"_" <<cnt<< "=" << ptr[cnt]; } + } else { + ERR << "Skipped vector (float) measurement \"" << *i << "\", size " <<size / sizeof(float) << " max " << si.max_array_size; + } break; } @@ -432,7 +462,7 @@ void InfluxDB::push_process() { measurements.str(""); } - sleep(1); + usleep(1000*si.max_time_ms); } } diff --git a/ChaosMetadataService/object_storage/influxDB/InfluxDB.h b/ChaosMetadataService/object_storage/influxDB/InfluxDB.h index ab65622ca9aaa296882ca9157683053f4a786609..1b1ff67ba595d67b38f98b684e404359cac0340e 100644 --- a/ChaosMetadataService/object_storage/influxDB/InfluxDB.h +++ b/ChaosMetadataService/object_storage/influxDB/InfluxDB.h @@ -39,7 +39,6 @@ //#include "influxdb-cpp-rest/influxdb_raw_db_utf8.h" //#include "influxdb-cpp-rest/influxdb_simple_async_api.h" #include "influxdb.hpp" -#define MAX_MEASURES 5000 namespace chaos { namespace metadata_service { diff --git a/ChaosMetadataService/object_storage/influxDB/InfluxDBLogStorageDriver.cpp b/ChaosMetadataService/object_storage/influxDB/InfluxDBLogStorageDriver.cpp index 60f73ed3e2fe144abd330e981dbbdc5fc14f0d84..ae2748fc74fcc6fe40c53e35671ce261fa83d79e 100644 --- a/ChaosMetadataService/object_storage/influxDB/InfluxDBLogStorageDriver.cpp +++ b/ChaosMetadataService/object_storage/influxDB/InfluxDBLogStorageDriver.cpp @@ -59,13 +59,12 @@ void InfluxDBLogStorageDriver::init(void *init_data) { const std::string retention = DriverPoolManager::logSetting.persistence_kv_param_map["retention"]; const std::string max_measure_opt = DriverPoolManager::logSetting.persistence_kv_param_map["max_mesure"]; const std::string max_measure_ms_opt = DriverPoolManager::logSetting.persistence_kv_param_map["max_time_ms"]; + const std::string max_array_size_opt = DriverPoolManager::logSetting.persistence_kv_param_map["max_array_size"]; - int max_measure=1000; - int max_time_ms=10000; std::string servername="localhost"; std::string funcpath=""; - std::string exptime="365d"; + std::string exptime="1095d"; int port=8086; if(url_list.size()>0){ std::vector<std::string> ele; @@ -87,25 +86,29 @@ void InfluxDBLogStorageDriver::init(void *init_data) { port=atoi(ele[1].c_str()); }*/ } - if(max_measure_ms_opt.size()){ - max_time_ms=atoi(max_measure_ms_opt.c_str()); - } - if(max_measure_opt.size()){ - max_measure=atoi(max_measure_opt.c_str()); - } if(database.size()==0){ ERR<<"You must specify a valid database name"; throw chaos::CException(-1,"You must specify a valid database name",__FUNCTION__); } - if(retention.size()){ + if(retention.size()){ exptime=retention; } + influxdb_cpp::server_info si(servername,port,database,user,password,"ms",exptime,funcpath); + + if(max_measure_ms_opt.size()){ + si.max_time_ms=atoi(max_measure_ms_opt.c_str()); + } + if(max_measure_opt.size()){ + si.max_mesurements=atoi(max_measure_opt.c_str()); + } + if(max_array_size_opt.size()){ + si.max_array_size=atoi(max_array_size_opt.c_str()); + } + + //influxdb_t asyncdb = influxdb_t( new influxdb::async_api::simple_db(url_list[0], database)); // asyncdb->with_authentication(user,password); - DBG<<"server:"<<servername<<"\nport:"<<port<<"\ndatabase:"<<database<<"\nuser:"<<user<<"\npassw:"<<password<<" retention:"<<exptime<<" path:"<<funcpath<<" max_measures:"<<max_measure; - influxdb_cpp::server_info si(servername,port,database,user,password,"ms",exptime,funcpath); - si.max_mesurements=max_measure; - si.max_time_ms=max_time_ms; + DBG<<"server:"<<servername<<"\nport:"<<port<<"\ndatabase:"<<database<<"\nuser:"<<user<<"\npassw:"<<password<<" retention:"<<exptime<<" path:"<<funcpath<<" max_measures:"<<si.max_mesurements<<" poll time(ms):"<<si.max_time_ms<<" max array size:"<<si.max_array_size; //register the data access implementations std::string resp; int ret; diff --git a/ChaosMetadataService/object_storage/influxDB/influxdb.hpp b/ChaosMetadataService/object_storage/influxDB/influxdb.hpp index fdd9ed252b7faf5777aaf00a540015a42ddf8429..923107d5f9319b2726ad2c90cc254ae9dc4a7284 100644 --- a/ChaosMetadataService/object_storage/influxDB/influxdb.hpp +++ b/ChaosMetadataService/object_storage/influxDB/influxdb.hpp @@ -30,6 +30,9 @@ #include <arpa/inet.h> #define closesocket close #endif +#define MAX_MEASURES 2000 +#define MAX_POLL_TIME 300 // default poll 300 ms +#define MAX_ARRAY_SIZE 512 // default max array size namespace influxdb_cpp { struct server_info { @@ -43,8 +46,9 @@ namespace influxdb_cpp { std::string funcprefix; int max_mesurements; //commit when n mesures reach max_measurement int max_time_ms; // commit when expired max_time_ms - server_info(const std::string& host, int port, const std::string& db = "", const std::string& usr = "", const std::string& pwd = "", const std::string& precision="ms", const std::string& retention="365d", const std::string& prefix="") - : host_(host), port_(port), db_(db), usr_(usr), pwd_(pwd), precision_(precision), retention_(retention),funcprefix(prefix),max_mesurements(0),max_time_ms(1000) {} + int max_array_size; // push maximum array of this size + server_info(const std::string& host, int port, const std::string& db = "", const std::string& usr = "", const std::string& pwd = "", const std::string& precision="ms", const std::string& retention="1095d", const std::string& prefix="") + : host_(host), port_(port), db_(db), usr_(usr), pwd_(pwd), precision_(precision), max_array_size(MAX_ARRAY_SIZE),retention_(retention),funcprefix(prefix),max_mesurements(MAX_MEASURES),max_time_ms(MAX_POLL_TIME) {} }; namespace detail { struct meas_caller; diff --git a/ChaosMetadataService/persistence/mongodb/MongoDBControlUnitDataAccess.cpp b/ChaosMetadataService/persistence/mongodb/MongoDBControlUnitDataAccess.cpp index 57afbf9fe48de444ea43242153f995238e01278e..32f648e683b0abc5c6390b1872c840f3db8ee507 100644 --- a/ChaosMetadataService/persistence/mongodb/MongoDBControlUnitDataAccess.cpp +++ b/ChaosMetadataService/persistence/mongodb/MongoDBControlUnitDataAccess.cpp @@ -18,20 +18,20 @@ * See the Licence for the specific language governing * permissions and limitations under the Licence. */ -#include "mongo_db_constants.h" #include "MongoDBControlUnitDataAccess.h" +#include "mongo_db_constants.h" -#include <chaos/common/utility/TimingUtil.h> -#include <chaos/common/property/property.h> #include <chaos/common/batch_command/BatchCommandConstants.h> +#include <chaos/common/property/property.h> +#include <chaos/common/utility/TimingUtil.h> #include <boost/foreach.hpp> #include <mongo/client/dbclient.h> #define MDBCUDA_INFO INFO_LOG(MongoDBControlUnitDataAccess) -#define MDBCUDA_DBG DBG_LOG(MongoDBControlUnitDataAccess) -#define MDBCUDA_ERR ERR_LOG(MongoDBControlUnitDataAccess) +#define MDBCUDA_DBG DBG_LOG(MongoDBControlUnitDataAccess) +#define MDBCUDA_ERR ERR_LOG(MongoDBControlUnitDataAccess) using namespace chaos; using namespace chaos::common::data; @@ -42,640 +42,602 @@ using namespace chaos::service_common::persistence::mongodb; using namespace chaos::metadata_service::persistence::mongodb; MongoDBControlUnitDataAccess::MongoDBControlUnitDataAccess(const ChaosSharedPtr<service_common::persistence::mongodb::MongoDBHAConnectionManager>& _connection, - data_access::DataServiceDataAccess *_data_service_da): -MongoDBAccessor(_connection), -ControlUnitDataAccess(_data_service_da), -node_data_access(NULL){} + data_access::DataServiceDataAccess* _data_service_da) + : MongoDBAccessor(_connection), ControlUnitDataAccess(_data_service_da), node_data_access(NULL) {} MongoDBControlUnitDataAccess::~MongoDBControlUnitDataAccess() {} - -//int MongoDBControlUnitDataAccess::compeleteControlUnitForAgeingManagement(const std::string& control_unit_id) { -// int err = 0; -// try { -// uint64_t current_ts = TimingUtil::getTimeStamp(); -// const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); -// const std::string key_last_checing_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); -// const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); +// int MongoDBControlUnitDataAccess::compeleteControlUnitForAgeingManagement(const std::string& control_unit_id) { +// int err = 0; +// try { +// uint64_t current_ts = TimingUtil::getTimeStamp(); +// const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); +// const std::string key_last_checing_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); +// const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); // -// mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_id -// << MONGODB_COLLECTION_NODES_AGEING_INFO << BSON("$exists" << false )); +// mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_id +// << MONGODB_COLLECTION_NODES_AGEING_INFO << BSON("$exists" << false )); // -// mongo::BSONObj update = BSON("$set" << BSON(key_last_checing_time << mongo::Date_t(current_ts) << -// key_last_performed_time << mongo::Date_t(current_ts) << -// key_processing_ageing << false)); +// mongo::BSONObj update = BSON("$set" << BSON(key_last_checing_time << mongo::Date_t(current_ts) << +// key_last_performed_time << mongo::Date_t(current_ts) << +// key_processing_ageing << false)); // -// /*BSON(key_last_checing_time << mongo::Date_t(current_ts) << -// key_last_performed_time << mongo::Date_t(current_ts) << -// key_processing_ageing << false);*/ -// DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, -// "update", -// DATA_ACCESS_LOG_2_ENTRY("query", -// "update", -// query.jsonString(), -// update.jsonString()));) -// //remove the field of the document -// if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), -// query, -// update))) { -// MDBCUDA_ERR << CHAOS_FORMAT("Error %1% completing control unit %2% with ageing management information", %err%control_unit_id); -// } -// } catch (const mongo::DBException &e) { -// MDBCUDA_ERR << e.what(); -// err = -1; -// } catch (const CException &e) { -// MDBCUDA_ERR << e.what(); -// err = e.errorCode; -// } -// return err; -//} +// /*BSON(key_last_checing_time << mongo::Date_t(current_ts) << +// key_last_performed_time << mongo::Date_t(current_ts) << +// key_processing_ageing << false);*/ +// DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, +// "update", +// DATA_ACCESS_LOG_2_ENTRY("query", +// "update", +// query.jsonString(), +// update.jsonString()));) +// //remove the field of the document +// if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), +// query, +// update))) { +// MDBCUDA_ERR << CHAOS_FORMAT("Error %1% completing control unit %2% with ageing management information", %err%control_unit_id); +// } +// } catch (const mongo::DBException &e) { +// MDBCUDA_ERR << e.what(); +// err = -1; +// } catch (const CException &e) { +// MDBCUDA_ERR << e.what(); +// err = e.errorCode; +// } +// return err; +// } int MongoDBControlUnitDataAccess::checkPresence(const std::string& unit_server_unique_id, - bool& presence) { - CHAOS_ASSERT(node_data_access) - return node_data_access->checkNodePresence(presence, - unit_server_unique_id); + bool& presence) { + CHAOS_ASSERT(node_data_access) + return node_data_access->checkNodePresence(presence, + unit_server_unique_id); } -int MongoDBControlUnitDataAccess::getControlUnitWithAutoFlag(const std::string& unit_server_host, +int MongoDBControlUnitDataAccess::getControlUnitWithAutoFlag(const std::string& unit_server_host, chaos::metadata_service::persistence::AutoFlag auto_flag, - uint64_t last_sequence_id, - std::vector<NodeSearchIndex>& control_unit_found) { - int err = 0; - SearchResult paged_result; - try { - mongo::BSONObjBuilder query_builder; - - //filter on unit server - query_builder << boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_host; - query_builder << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; - switch(auto_flag) { - case AUTO_LOAD: - query_builder << "instance_description.auto_load" << true; - break; - case AUTO_INIT: - query_builder << "instance_description.auto_init" << true; - break; - case AUTO_START: - query_builder << "instance_description.auto_start" << true; - break; - } - - query_builder << "seq" << BSON("$gt"<<(long long)last_sequence_id); - query_builder << "$or" << BSON_ARRAY(BSON(NodeDefinitionKey::NODE_SUB_TYPE << BSON("$ne" << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT)) << - BSON("$and" << BSON_ARRAY(BSON(NodeDefinitionKey::NODE_SUB_TYPE << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT) << - BSON("script_bind_type" << service_common::data::script::ScriptBindTypeUnitServer)))); - //query_builder << NodeDefinitionKey::NODE_SUB_TYPE << BSON("$ne" << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); - - mongo::Query query = query_builder.obj(); - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "performPagedQuery", - DATA_ACCESS_LOG_1_ENTRY("query", - query.toString()));) - //remove the field of the document - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query.sort("seq"), - NULL, - NULL, - MAX_PAGE_FOR_LOAD_CU))) { - MDBCUDA_ERR << "Error performing auto flag search"; - } else { - for(SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - control_unit_found.push_back(NodeSearchIndex(it->getField("seq").numberLong(), - it->getField(NodeDefinitionKey::NODE_UNIQUE_ID).String())); - } - MDBCUDA_DBG<<unit_server_host<<" must AUTOLOAD "<<control_unit_found.size()<<" CUs"; - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; - } - return err; - -} + uint64_t last_sequence_id, + std::vector<NodeSearchIndex>& control_unit_found) { + int err = 0; + SearchResult paged_result; + try { + mongo::BSONObjBuilder query_builder; -int MongoDBControlUnitDataAccess::insertNewControlUnit(CDataWrapper& control_unit_description) { - int err = 0; - if(!control_unit_description.hasKey(NodeDefinitionKey::NODE_TYPE)) { - //set the type of control unit - control_unit_description.addStringValue(NodeDefinitionKey::NODE_TYPE, NodeType::NODE_TYPE_CONTROL_UNIT); + // filter on unit server + query_builder << boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_host; + query_builder << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; + switch (auto_flag) { + case AUTO_LOAD: + query_builder << "instance_description.auto_load" << true; + break; + case AUTO_INIT: + query_builder << "instance_description.auto_init" << true; + break; + case AUTO_START: + query_builder << "instance_description.auto_start" << true; + break; } - if((err = node_data_access->insertNewNode(control_unit_description))) { - MDBCUDA_ERR << "Error:" << err << " adding new node for control unit"; + + query_builder << "seq" << BSON("$gt" << (long long)last_sequence_id); + query_builder << "$or" << BSON_ARRAY(BSON(NodeDefinitionKey::NODE_SUB_TYPE << BSON("$ne" << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT)) << BSON("$and" << BSON_ARRAY(BSON(NodeDefinitionKey::NODE_SUB_TYPE << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT) << BSON("script_bind_type" << service_common::data::script::ScriptBindTypeUnitServer)))); + // query_builder << NodeDefinitionKey::NODE_SUB_TYPE << BSON("$ne" << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); + + mongo::Query query = query_builder.obj(); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "performPagedQuery", + DATA_ACCESS_LOG_1_ENTRY("query", + query.toString()));) + // remove the field of the document + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query.sort("seq"), + NULL, + NULL, + MAX_PAGE_FOR_LOAD_CU))) { + MDBCUDA_ERR << "Error performing auto flag search"; } else { - //compelte control unit with ageing managment information - err = node_data_access->addAgeingManagementDataToNode(control_unit_description.getStringValue(NodeDefinitionKey::NODE_UNIQUE_ID)); + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + control_unit_found.push_back(NodeSearchIndex(it->getField("seq").numberLong(), + it->getField(NodeDefinitionKey::NODE_UNIQUE_ID).String())); + } + MDBCUDA_DBG << unit_server_host << " must AUTOLOAD " << control_unit_found.size() << " CUs"; } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; +} + +int MongoDBControlUnitDataAccess::insertNewControlUnit(CDataWrapper& control_unit_description) { + int err = 0; + if (!control_unit_description.hasKey(NodeDefinitionKey::NODE_TYPE)) { + // set the type of control unit + control_unit_description.addStringValue(NodeDefinitionKey::NODE_TYPE, NodeType::NODE_TYPE_CONTROL_UNIT); + } + if ((err = node_data_access->insertNewNode(control_unit_description))) { + MDBCUDA_ERR << "Error:" << err << " adding new node for control unit"; + } else { + // compelte control unit with ageing managment information + err = node_data_access->addAgeingManagementDataToNode(control_unit_description.getStringValue(NodeDefinitionKey::NODE_UNIQUE_ID)); + } + return err; } int MongoDBControlUnitDataAccess::updateControlUnit(CDataWrapper& control_unit_description) { - int err = 0; - if(!control_unit_description.hasKey(NodeDefinitionKey::NODE_TYPE)) { - //set the type of control unit - control_unit_description.addStringValue(NodeDefinitionKey::NODE_TYPE, NodeType::NODE_TYPE_CONTROL_UNIT); - } - chaos::common::data::CDWUniquePtr ptr=control_unit_description.clone(); - MDBCUDA_DBG<<" update:"<<control_unit_description.getJSONString(); - if((err = node_data_access->setNodeDescription(control_unit_description.getStringValue(NodeDefinitionKey::NODE_UNIQUE_ID),ptr))) { - MDBCUDA_ERR << "Error:" << err << " updating new node for control unit:"<<control_unit_description.getJSONString(); - } - return err; + int err = 0; + if (!control_unit_description.hasKey(NodeDefinitionKey::NODE_TYPE)) { + // set the type of control unit + control_unit_description.addStringValue(NodeDefinitionKey::NODE_TYPE, NodeType::NODE_TYPE_CONTROL_UNIT); + } + chaos::common::data::CDWUniquePtr ptr = control_unit_description.clone(); + MDBCUDA_DBG << " update:" << control_unit_description.getJSONString(); + if ((err = node_data_access->setNodeDescription(control_unit_description.getStringValue(NodeDefinitionKey::NODE_UNIQUE_ID), ptr))) { + MDBCUDA_ERR << "Error:" << err << " updating new node for control unit:" << control_unit_description.getJSONString(); + } + return err; } int MongoDBControlUnitDataAccess::setDataset(const std::string& cu_unique_id, - CDataWrapper& dataset_description) { - int err = 0; - //allocate data block on vfat - mongo::BSONObjBuilder bson_find; - mongo::BSONObjBuilder updated_field; - mongo::BSONObjBuilder bson_update; - try { - //check for principal mandatory keys - if(cu_unique_id.size() == 0) return -1; - if(!dataset_description.hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)){ - MDBCUDA_DBG<<cu_unique_id<<" Missing key:"<<ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION<<" skipping dataset initialization";; - return 0; - } - if(!dataset_description.isCDataWrapperValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)){ - MDBCUDA_ERR<<cu_unique_id<<" Not a dataset :"<<ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION; + CDataWrapper& dataset_description) { + int err = 0; + // allocate data block on vfat + mongo::BSONObjBuilder bson_find; + mongo::BSONObjBuilder updated_field; + mongo::BSONObjBuilder bson_update; + try { + // check for principal mandatory keys + if (cu_unique_id.size() == 0) return -1; + if (!dataset_description.hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)) { + MDBCUDA_DBG << cu_unique_id << " Missing key:" << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << " skipping dataset initialization"; + ; + return 0; + } + if (!dataset_description.isCDataWrapperValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)) { + MDBCUDA_ERR << cu_unique_id << " Not a dataset :" << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION; + + return -3; + } + // checkout the dataset + ChaosUniquePtr<chaos::common::data::CDataWrapper> dataset(dataset_description.getCSDataValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)); + if (!dataset->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)) { + MDBCUDA_ERR << cu_unique_id << " Missing nested key :" << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION; + + return -5; + } + if (!dataset->isVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)) { + MDBCUDA_ERR << cu_unique_id << " Expected to be a vectorkey :" << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION; + + return -6; + } + if (!dataset->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP)) { + MDBCUDA_ERR << cu_unique_id << " doesnt have a timestamp :" << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP; + + return -4; + } + + // serach criteria + bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id; + //<< NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; + + // add dataset timestamp + updated_field << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP << (long long)dataset->getInt64Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP); + + CMultiTypeDataArrayWrapperSPtr ds_vec(dataset->getVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)); + if (!ds_vec.get()) return -7; + // cicle all dataset attribute + mongo::BSONArrayBuilder dataset_bson_array; + int32_t type = 0; + for (int idx = 0; + idx < ds_vec->size(); + idx++) { + mongo::BSONObjBuilder dataset_element_builder; + + ChaosUniquePtr<chaos::common::data::CDataWrapper> dataset_element(ds_vec->getCDataWrapperElementAtIndex(idx)); + // MDBCUDA_DBG<<cu_unique_id<<" DS ELEM:"<<dataset_element->getJSONString(); + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME) && + /*dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION)&&*/ + dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_TYPE) && + dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION)) { + // mandatory field + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME); + + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION << ((dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION)) ? dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION) : dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME)); + + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION << dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION); + + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_TYPE << (type = dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_TYPE)); + + if (type == DataType::TYPE_BYTEARRAY) { + // we need to have addtional information for binary data + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE)) { + if (dataset_element->isVector(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE)) { + // we have multipler value for subtype + mongo::BSONArrayBuilder subtype_array_builder; + CMultiTypeDataArrayWrapperSPtr sub_t_vec(dataset_element->getVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE)); + for (int idx = 0; + idx < sub_t_vec->size(); + idx++) { + subtype_array_builder << sub_t_vec->getInt32ElementAtIndex(idx); + } + // add array to dataset element + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE + << subtype_array_builder.arr(); + } else { + // we have only one value + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE + << dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE); + } + } - return -3; + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_MIME_DESCRIPTION)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_MIME_DESCRIPTION + << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_MIME_DESCRIPTION); + } } - //checkout the dataset - ChaosUniquePtr<chaos::common::data::CDataWrapper> dataset(dataset_description.getCSDataValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)); - if(!dataset->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)){ - MDBCUDA_ERR<<cu_unique_id<<" Missing nested key :"<<ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION; - return -5; + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_CARDINALITY)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_CARDINALITY << dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_CARDINALITY); } - if(!dataset->isVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)){ - MDBCUDA_ERR<<cu_unique_id<<" Expected to be a vectorkey :"<<ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION; - return -6; + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_VALUE_MAX_SIZE)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_VALUE_MAX_SIZE + << dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_VALUE_MAX_SIZE); } - if(!dataset->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP)){ - MDBCUDA_ERR<<cu_unique_id<<" doesnt have a timestamp :"<<ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP; - return -4; + // optional field + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE); + } + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE); } - - //serach criteria - bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id; - //<< NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; - - //add dataset timestamp - updated_field << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP << (long long)dataset->getInt64Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP); - - - - CMultiTypeDataArrayWrapperSPtr ds_vec(dataset->getVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)); - if(!ds_vec.get()) return -7; - //cicle all dataset attribute - mongo::BSONArrayBuilder dataset_bson_array; - int32_t type = 0; - for(int idx = 0; - idx < ds_vec->size(); - idx++) { - mongo::BSONObjBuilder dataset_element_builder; - - ChaosUniquePtr<chaos::common::data::CDataWrapper> dataset_element(ds_vec->getCDataWrapperElementAtIndex(idx)); - // MDBCUDA_DBG<<cu_unique_id<<" DS ELEM:"<<dataset_element->getJSONString(); - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME) && - /*dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION)&&*/ - dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_TYPE)&& - dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION)) { - - //mandatory field - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME); - - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION << - ((dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION))?dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DESCRIPTION):dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME)); - - - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION << - dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_DIRECTION); - - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_TYPE << - (type = dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_TYPE)); - - if(type == DataType::TYPE_BYTEARRAY) { - //we need to have addtional information for binary data - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE)) { - if(dataset_element->isVector(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE)) { - //we have multipler value for subtype - mongo::BSONArrayBuilder subtype_array_builder; - CMultiTypeDataArrayWrapperSPtr sub_t_vec(dataset_element->getVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE)); - for(int idx = 0; - idx < sub_t_vec->size(); - idx++) { - subtype_array_builder << sub_t_vec->getInt32ElementAtIndex(idx); - } - //add array to dataset element - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE - << subtype_array_builder.arr(); - } else { - //we have only one value - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE - << dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_SUBTYPE); - } - } - - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_MIME_DESCRIPTION)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_MIME_DESCRIPTION - << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_MIME_DESCRIPTION); - } - } - - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_CARDINALITY)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_CARDINALITY << - dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_BINARY_CARDINALITY); - } - - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_VALUE_MAX_SIZE)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_VALUE_MAX_SIZE - << dataset_element->getInt32Value(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_VALUE_MAX_SIZE); - } - - //optional field - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE); - } - - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE); - } - - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE); - } - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT); - } - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT); - } - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT); - } - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET); - } + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE); + } + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT); + } + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT); + } + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT); + } + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET); + } - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR); - } - if(dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR)) { - dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR << - dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR); - } - dataset_bson_array << dataset_element_builder.obj(); - } + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR); } - //add dataset array to update bson - updated_field.appendArray(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION, - dataset_bson_array.arr()); - - //check if we have bactch command in the dataset - if(dataset_description.hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION)) { - CMultiTypeDataArrayWrapperSPtr bc_vec(dataset_description.getVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION)); - mongo::BSONArrayBuilder batch_command_bson_array; - for(int idx = 0; - idx < bc_vec->size(); - idx++) { - mongo::BSONObjBuilder batch_command_builder; - - ChaosUniquePtr<chaos::common::data::CDataWrapper> bc_element(bc_vec->getCDataWrapperElementAtIndex(idx)); - MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_builder, bc_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID) - MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_builder, bc_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_ALIAS) - MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_builder, bc_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_DESCRIPTION) - - //check for parameter - if(bc_element->hasKey(common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)){ - mongo::BSONArrayBuilder batch_command_parameter_bson_array; - CMultiTypeDataArrayWrapperSPtr bc_param_vec(bc_element->getVectorValue(common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)); - for(int idx_param = 0; - idx_param < bc_param_vec->size(); - idx_param++) { - mongo::BSONObjBuilder batch_command_parameter_builder; - ChaosUniquePtr<chaos::common::data::CDataWrapper> bc_param_element(bc_param_vec->getCDataWrapperElementAtIndex(idx_param)); - MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_NAME) - MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_DESCRIPTION) - MDB_COPY_I32_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_TYPE) - MDB_COPY_I32_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_FLAG) - - batch_command_parameter_bson_array << batch_command_parameter_builder.obj(); - } - //add dataset array to update bson - batch_command_builder.appendArray(common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETERS, - batch_command_parameter_bson_array.arr()); - } - //add the batch command description to the command array - batch_command_bson_array << batch_command_builder.obj(); - - //insert commandi onto node comamnd collection - node_data_access->setCommand(*bc_element); - } - - //add batch command to the dataset - updated_field.appendArray(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION, - batch_command_bson_array.arr()); + if (dataset_element->hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR)) { + dataset_element_builder << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR << dataset_element->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR); } - - mongo::BSONObj query = bson_find.obj(); - mongo::BSONObj update = BSON("$set" << BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << updated_field.obj())); - - //update dateset - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "update - dataset", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - query.toString(), - update.jsonString()));) - //set the instance parameter within the node representing the control unit - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - update))) { - MDBCUDA_ERR << "Error updating unit server"; + dataset_bson_array << dataset_element_builder.obj(); + } + } + // add dataset array to update bson + updated_field.appendArray(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION, + dataset_bson_array.arr()); + + // check if we have bactch command in the dataset + if (dataset_description.hasKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION)) { + CMultiTypeDataArrayWrapperSPtr bc_vec(dataset_description.getVectorValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION)); + mongo::BSONArrayBuilder batch_command_bson_array; + for (int idx = 0; + idx < bc_vec->size(); + idx++) { + mongo::BSONObjBuilder batch_command_builder; + + ChaosUniquePtr<chaos::common::data::CDataWrapper> bc_element(bc_vec->getCDataWrapperElementAtIndex(idx)); + MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_builder, bc_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID) + MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_builder, bc_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_ALIAS) + MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_builder, bc_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_DESCRIPTION) + + // check for parameter + if (bc_element->hasKey(common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)) { + mongo::BSONArrayBuilder batch_command_parameter_bson_array; + CMultiTypeDataArrayWrapperSPtr bc_param_vec(bc_element->getVectorValue(common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)); + for (int idx_param = 0; + idx_param < bc_param_vec->size(); + idx_param++) { + mongo::BSONObjBuilder batch_command_parameter_builder; + ChaosUniquePtr<chaos::common::data::CDataWrapper> bc_param_element(bc_param_vec->getCDataWrapperElementAtIndex(idx_param)); + MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_NAME) + MDB_COPY_STRING_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_DESCRIPTION) + MDB_COPY_I32_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_TYPE) + MDB_COPY_I32_CDWKEY_TO_BUILDER(batch_command_parameter_builder, bc_param_element, common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETER_FLAG) + + batch_command_parameter_bson_array << batch_command_parameter_builder.obj(); + } + // add dataset array to update bson + batch_command_builder.appendArray(common::batch_command::BatchCommandAndParameterDescriptionkey::BC_PARAMETERS, + batch_command_parameter_bson_array.arr()); } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + // add the batch command description to the command array + batch_command_bson_array << batch_command_builder.obj(); + + // insert commandi onto node comamnd collection + node_data_access->setCommand(*bc_element); + } + + // add batch command to the dataset + updated_field.appendArray(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION, + batch_command_bson_array.arr()); } - return err; -} + mongo::BSONObj query = bson_find.obj(); + mongo::BSONObj update = BSON("$set" << BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << updated_field.obj())); + + // update dateset + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "update - dataset", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + query.toString(), + update.jsonString()));) + // set the instance parameter within the node representing the control unit + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + update))) { + MDBCUDA_ERR << "Error updating unit server"; + } + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; +} int MongoDBControlUnitDataAccess::checkDatasetPresence(const std::string& cu_unique_id, - bool& presence) { - int err = 0; - unsigned long long counter; - try { - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id - //<< NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT - << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON("$exists" << true )); - - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "find", - DATA_ACCESS_LOG_1_ENTRY("query", - query.toString()));) - //remove the field of the document - if((err = connection->count(counter, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query))) { - MDBCUDA_ERR << "Error counting the element"; - } else { - presence = (counter == 1); - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + bool& presence) { + int err = 0; + unsigned long long counter; + try { + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id + //<< NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT + << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON("$exists" << true)); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "find", + DATA_ACCESS_LOG_1_ENTRY("query", + query.toString()));) + // remove the field of the document + if ((err = connection->count(counter, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query))) { + MDBCUDA_ERR << "Error counting the element"; + } else { + presence = (counter == 1); } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -int MongoDBControlUnitDataAccess::getFullDescription(const std::string& cu_unique_id, - chaos::common::data::CDataWrapper **dataset_description){ - int err = 0; - mongo::BSONObj result; - mongo::BSONObjBuilder bson_find; +int MongoDBControlUnitDataAccess::getFullDescription(const std::string& cu_unique_id, + chaos::common::data::CDataWrapper** dataset_description) { + int err = 0; + mongo::BSONObj result; + mongo::BSONObjBuilder bson_find; - mongo::BSONArrayBuilder bson_find_or,bson_find_and; + mongo::BSONArrayBuilder bson_find_or, bson_find_and; - try { - bson_find_or<<BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); - bson_find_and<<BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id); - bson_find_and<<BSON("$or"<<bson_find_or.arr()); - bson_find.appendArray("$and", bson_find_and.obj()); - - mongo::BSONObj query = bson_find.obj();/*BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id - << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT);*/ - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findOne", - DATA_ACCESS_LOG_1_ENTRY("query", - query.toString()));) - //remove the field of the document - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query))) { - MDBCUDA_ERR << "Error fetching dataset"; - } else if(result.isEmpty()) { - MDBCUDA_ERR << "No element found:"<<cu_unique_id; - } else { - //we have dataset so set it directly within the cdsta wrapper - *dataset_description = new CDataWrapper(result.objdata()); - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + try { + bson_find_or << BSON(chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT) << BSON(chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); + bson_find_and << BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id); + bson_find_and << BSON("$or" << bson_find_or.arr()); + bson_find.appendArray("$and", bson_find_and.obj()); + + mongo::BSONObj query = bson_find.obj(); /*BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id + << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT);*/ + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findOne", + DATA_ACCESS_LOG_1_ENTRY("query", + query.toString()));) + // remove the field of the document + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query))) { + MDBCUDA_ERR << "Error fetching dataset"; + } else if (result.isEmpty()) { + MDBCUDA_ERR << "No element found:" << cu_unique_id; + } else { + // we have dataset so set it directly within the cdsta wrapper + *dataset_description = new CDataWrapper(result.objdata()); } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -int MongoDBControlUnitDataAccess::getDataset(const std::string& cu_unique_id, - chaos::common::data::CDataWrapper **dataset_description) { - int err = 0; - mongo::BSONObj result; - try { - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id - // << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT - << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON("$exists" << true )); - mongo::BSONObj prj = BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << 1 << - ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION << 1); - - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findOne", - DATA_ACCESS_LOG_2_ENTRY("query", - "prj", - query.toString(), - prj.toString()));) - //remove the field of the document - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - &prj))) { - MDBCUDA_ERR << "Error fetching dataset"; - } else if(result.isEmpty()) { - MDBCUDA_ERR << "No element found:"<<cu_unique_id; - } else { - //we have dataset so set it directly within the cdsta wrapper - *dataset_description = new CDataWrapper(result.getObjectField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION).objdata()); - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; +int MongoDBControlUnitDataAccess::getDataset(const std::string& cu_unique_id, + chaos::common::data::CDataWrapper** dataset_description) { + int err = 0; + mongo::BSONObj result; + try { + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id + // << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT + << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON("$exists" << true)); + mongo::BSONObj prj = BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << 1 << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION << 1); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findOne", + DATA_ACCESS_LOG_2_ENTRY("query", + "prj", + query.toString(), + prj.toString()));) + // remove the field of the document + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + &prj))) { + MDBCUDA_ERR << "Error fetching dataset"; + } else if (result.isEmpty()) { + MDBCUDA_ERR << "No element found:" << cu_unique_id; + } else { + // we have dataset so set it directly within the cdsta wrapper + *dataset_description = new CDataWrapper(result.getObjectField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION).objdata()); } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } - int MongoDBControlUnitDataAccess::getDataset(const std::string& cu_unique_id, - Dataset& dataset) { - int err = 0; - mongo::BSONObj result; - try { - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id - // << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT - << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON("$exists" << true )); - mongo::BSONObj prj = BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << 1 << - ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION << 1); - - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findOne", - DATA_ACCESS_LOG_2_ENTRY("query", - "prj", - query.toString(), - prj.toString()));) - //remove the field of the document - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - &prj))) { - MDBCUDA_ERR << "Error fetching dataset"; - } else if(result.isEmpty()) { - MDBCUDA_ERR << "No element found:"<<cu_unique_id; - } else { - //we have dataset so set it directly within the cdsta wrapper - CDWUniquePtr ds_in_cdw(new CDataWrapper(result.getObjectField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION).objdata())); - DatasetSDWrapper reference_ser_wrap(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(Dataset, dataset)); - reference_ser_wrap.deserialize(ds_in_cdw.get()); - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + Dataset& dataset) { + int err = 0; + mongo::BSONObj result; + try { + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id + // << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT + << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON("$exists" << true)); + mongo::BSONObj prj = BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << 1 << ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_COMMAND_DESCRIPTION << 1); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findOne", + DATA_ACCESS_LOG_2_ENTRY("query", + "prj", + query.toString(), + prj.toString()));) + // remove the field of the document + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + &prj))) { + MDBCUDA_ERR << "Error fetching dataset"; + } else if (result.isEmpty()) { + MDBCUDA_ERR << "No element found:" << cu_unique_id; + } else { + // we have dataset so set it directly within the cdsta wrapper + CDWUniquePtr ds_in_cdw(new CDataWrapper(result.getObjectField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION).objdata())); + DatasetSDWrapper reference_ser_wrap(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(Dataset, dataset)); + reference_ser_wrap.deserialize(ds_in_cdw.get()); } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } int MongoDBControlUnitDataAccess::setCommandDescription(chaos::common::data::CDataWrapper& command_description) { - return -1; + return -1; } - /* -*/ + */ int MongoDBControlUnitDataAccess::setInstanceDescription(const std::string& cu_unique_id, - CDataWrapper& instance_description) { - int err = 0; - //allocate data block on vfat - mongo::BSONObjBuilder bson_find; - mongo::BSONObjBuilder updated_field; - mongo::BSONObjBuilder bson_update; - try { - - if(!instance_description.hasKey(NodeDefinitionKey::NODE_PARENT)) return -1; - - //serach criteria - bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id;//<< NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; - - int size; - mongo::BSONObj u(instance_description.getBSONRawData(size)); - updated_field.appendElements(u); - - - mongo::BSONObj query = bson_find.obj(); - mongo::BSONObj update = BSON("$set" << BSON("instance_description" << updated_field.obj())); - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - query.toString(), - update.jsonString()));) - //set the instance parameter within the node representing the control unit - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - update))) { - MDBCUDA_ERR << "Error updating unit server with code:" << err; - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + CDataWrapper& instance_description) { + int err = 0; + // allocate data block on vfat + mongo::BSONObjBuilder bson_find; + mongo::BSONObjBuilder updated_field; + mongo::BSONObjBuilder bson_update; + try { + if (!instance_description.hasKey(NodeDefinitionKey::NODE_PARENT)) return -1; + + // serach criteria + bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << cu_unique_id; //<< NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; + + int size; + mongo::BSONObj u(instance_description.getBSONRawData(size)); + updated_field.appendElements(u); + + mongo::BSONObj query = bson_find.obj(); + mongo::BSONObj update = BSON("$set" << BSON("instance_description" << updated_field.obj())); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + query.toString(), + update.jsonString()));) + // set the instance parameter within the node representing the control unit + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + update))) { + MDBCUDA_ERR << "Error updating unit server with code:" << err; } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } int MongoDBControlUnitDataAccess::getInstanceDescription(const std::string& unit_server_uid, const std::string& control_unit_uid, - CDataWrapper **result) { - int err = 0; - mongo::BSONObj q_result; - mongo::BSONObjBuilder bson_find; - SearchResult paged_result; - try{ - bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid; - if(unit_server_uid.size()>0) { - //ad also unit server for search the instance description - bson_find << boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_uid; - } - mongo::BSONObj q = bson_find.obj(); - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.toString()));) - - if((err = connection->findOne(q_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q))){ - MDBCUDA_ERR << "Error calling performPagedQuery with error" << err; - } else if(q_result.isEmpty()){ - MDBCUDA_DBG << "No instance description found for control unit:" <<control_unit_uid << " with parent:" << unit_server_uid; - } else { - mongo::BSONObj instance_description = q_result.getObjectField("instance_description"); - *result = new CDataWrapper(instance_description.objdata()); - (*result)->addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, q_result.getStringField(NodeDefinitionKey::NODE_UNIQUE_ID)); + CDataWrapper** result) { + int err = 0; + mongo::BSONObj q_result; + mongo::BSONObjBuilder bson_find; + SearchResult paged_result; + try { + bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid; + if (unit_server_uid.size() > 0) { + // ad also unit server for search the instance description + bson_find << boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_uid; + } + mongo::BSONObj q = bson_find.obj(); - - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.toString()));) + + if ((err = connection->findOne(q_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q))) { + MDBCUDA_ERR << "Error calling performPagedQuery with error" << err; + } else if (q_result.isEmpty()) { + MDBCUDA_DBG << "No instance description found for control unit:" << control_unit_uid << " with parent:" << unit_server_uid; + } else { + mongo::BSONObj instance_description = q_result.getObjectField("instance_description"); + *result = new CDataWrapper(instance_description.objdata()); + (*result)->addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, q_result.getStringField(NodeDefinitionKey::NODE_UNIQUE_ID)); } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } #if 0 @@ -892,8 +854,10 @@ int MongoDBControlUnitDataAccess::getInstanceDescription(const std::string& unit for(std::vector< mongo::BSONElement >::iterator it = drv_descriptions.begin(); it != drv_descriptions.end(); it++) { - CDataWrapper driver_desc(it->Obj().objdata()); - (*result)->appendCDataWrapperToArray(driver_desc); + if(it->Obj().objdata()){ + CDataWrapper driver_desc(it->Obj().objdata()); + (*result)->appendCDataWrapperToArray(driver_desc); + } } (*result)->finalizeArrayForKey(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DRIVER_DESCRIPTION); } @@ -904,8 +868,10 @@ int MongoDBControlUnitDataAccess::getInstanceDescription(const std::string& unit for(std::vector< mongo::BSONElement >::iterator it = attr_descriptions.begin(); it != attr_descriptions.end(); it++) { + if(it->Obj().objdata()){ CDataWrapper driver_desc(it->Obj().objdata()); (*result)->appendCDataWrapperToArray(driver_desc); + } } (*result)->finalizeArrayForKey("attribute_value_descriptions"); } @@ -922,527 +888,513 @@ int MongoDBControlUnitDataAccess::getInstanceDescription(const std::string& unit #endif int MongoDBControlUnitDataAccess::searchInstanceForUnitServer(std::vector<ChaosSharedPtr<CDataWrapper> >& result_page, - const std::string& unit_server_uid, - std::vector<std::string> cu_type_filter, - uint32_t last_sequence_id, - uint32_t results_for_page) { - int err = 0; - mongo::BSONObjBuilder bson_find; - mongo::BSONArrayBuilder bson_find_or; - mongo::BSONArrayBuilder bson_find_and; - SearchResult paged_result; - - //compose query - try{ - //filter on sequence, type and unit server - bson_find_and << BSON(NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT); - bson_find_and << BSON(boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_uid); - - //add cu types - if(cu_type_filter.size()) { - for(std::vector<std::string>::iterator it = cu_type_filter.begin(); - it != cu_type_filter.end(); - it++) { - bson_find_or << BSON("instance_description.control_unit_implementation" << *it); - } - bson_find_and << BSON("$or" << bson_find_or.arr()); - } - bson_find.appendArray("$and", bson_find_and.obj()); - // filter on node unique id - - mongo::BSONObj q = bson_find.obj(); - // mongo::BSONObj p = BSON(NodeDefinitionKey::NODE_UNIQUE_ID<<1); - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.toString()));) - //perform the search for the query page - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - NULL,//return only the control unit unique id - NULL, - results_for_page))) { - MDBCUDA_ERR << "Error calling performPagedQuery with error" << err; - } else { - DEBUG_CODE(MDBCUDA_DBG << "The query '"<< q.toString() <<"' has found " << paged_result.size() << " result";) - if(paged_result.size()) { - for (SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - ChaosSharedPtr<CDataWrapper> result_intance(new CDataWrapper()); - result_intance->addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, it->getStringField(NodeDefinitionKey::NODE_UNIQUE_ID)); - if(it->hasField(NodeDefinitionKey::NODE_RPC_ADDR))result_intance->addStringValue(NodeDefinitionKey::NODE_RPC_ADDR, it->getStringField(NodeDefinitionKey::NODE_RPC_ADDR)); - if(it->hasField(NodeDefinitionKey::NODE_RPC_DOMAIN))result_intance->addStringValue(NodeDefinitionKey::NODE_RPC_DOMAIN, it->getStringField(NodeDefinitionKey::NODE_RPC_DOMAIN)); - - mongo::BSONObj instance_description = it->getObjectField("instance_description"); - result_intance->addStringValue("control_unit_implementation", instance_description.getStringField("control_unit_implementation")); - - result_page.push_back(result_intance); - } - } + const std::string& unit_server_uid, + std::vector<std::string> cu_type_filter, + uint32_t last_sequence_id, + uint32_t results_for_page) { + int err = 0; + mongo::BSONObjBuilder bson_find; + mongo::BSONArrayBuilder bson_find_or; + mongo::BSONArrayBuilder bson_find_and; + SearchResult paged_result; + + // compose query + try { + // filter on sequence, type and unit server + bson_find_and << BSON(NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT); + bson_find_and << BSON(boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_uid); + + // add cu types + if (cu_type_filter.size()) { + for (std::vector<std::string>::iterator it = cu_type_filter.begin(); + it != cu_type_filter.end(); + it++) { + bson_find_or << BSON("instance_description.control_unit_implementation" << *it); + } + bson_find_and << BSON("$or" << bson_find_or.arr()); + } + bson_find.appendArray("$and", bson_find_and.obj()); + // filter on node unique id + + mongo::BSONObj q = bson_find.obj(); + // mongo::BSONObj p = BSON(NodeDefinitionKey::NODE_UNIQUE_ID<<1); + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.toString()));) + // perform the search for the query page + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + NULL, // return only the control unit unique id + NULL, + results_for_page))) { + MDBCUDA_ERR << "Error calling performPagedQuery with error" << err; + } else { + DEBUG_CODE(MDBCUDA_DBG << "The query '" << q.toString() << "' has found " << paged_result.size() << " result";) + if (paged_result.size()) { + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + ChaosSharedPtr<CDataWrapper> result_intance(new CDataWrapper()); + result_intance->addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, it->getStringField(NodeDefinitionKey::NODE_UNIQUE_ID)); + if (it->hasField(NodeDefinitionKey::NODE_RPC_ADDR)) result_intance->addStringValue(NodeDefinitionKey::NODE_RPC_ADDR, it->getStringField(NodeDefinitionKey::NODE_RPC_ADDR)); + if (it->hasField(NodeDefinitionKey::NODE_RPC_DOMAIN)) result_intance->addStringValue(NodeDefinitionKey::NODE_RPC_DOMAIN, it->getStringField(NodeDefinitionKey::NODE_RPC_DOMAIN)); + + mongo::BSONObj instance_description = it->getObjectField("instance_description"); + result_intance->addStringValue("control_unit_implementation", instance_description.getStringField("control_unit_implementation")); + + result_page.push_back(result_intance); } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + } } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } int MongoDBControlUnitDataAccess::getInstanceDescription(const std::string& control_unit_uid, - CDataWrapper **result) { - return getInstanceDescription("", control_unit_uid, result); + CDataWrapper** result) { + return getInstanceDescription("", control_unit_uid, result); } - - int MongoDBControlUnitDataAccess::deleteInstanceDescription(const std::string& unit_server_uid, const std::string& control_unit_uid) { - int err = 0; - mongo::BSONObj q_result; - mongo::BSONObjBuilder bson_find; - try{ - bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid; - bson_find << boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_uid; - mongo::BSONObj q = bson_find.obj(); - mongo::BSONObj u = BSON("$unset" << BSON("instance_description" << "")); - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q.toString(), - u.jsonString()));) - //remove the field of the document - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u))) { - MDBCUDA_ERR << "Error removing control unit instance from node"; - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + int err = 0; + mongo::BSONObj q_result; + mongo::BSONObjBuilder bson_find; + try { + bson_find << NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid; + bson_find << boost::str(boost::format("instance_description.%1%") % NodeDefinitionKey::NODE_PARENT) << unit_server_uid; + mongo::BSONObj q = bson_find.obj(); + mongo::BSONObj u = BSON("$unset" << BSON("instance_description" + << "")); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q.toString(), + u.jsonString()));) + // remove the field of the document + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u))) { + MDBCUDA_ERR << "Error removing control unit instance from node"; } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -int MongoDBControlUnitDataAccess::getInstanceDatasetAttributeDescription(const std::string& control_unit_uid, - const std::string& attribute_name, +int MongoDBControlUnitDataAccess::getInstanceDatasetAttributeDescription(const std::string& control_unit_uid, + const std::string& attribute_name, ChaosSharedPtr<chaos::common::data::CDataWrapper>& result) { - int err = 0; - mongo::BSONObj result_bson; - const std::string dotted_dataset_path = boost::str(boost::format("%1%.%1%")%ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); - const std::string dotted_dataset_path_proj = boost::str(boost::format("%1%.%1%.$")%ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); - try{ - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid << - // NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT << - dotted_dataset_path << BSON("$elemMatch"<<BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME << attribute_name))); - mongo::BSONObj prj = BSON(dotted_dataset_path_proj << 1); - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findOne", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Projection", - query.toString(), - prj.jsonString()));) - //remove the field of the document - if((err = connection->findOne(result_bson, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - &prj))){ - - }else if(result_bson.isEmpty()){ - MDBCUDA_ERR << "No attribute has been found:"<<attribute_name<<" in "<<control_unit_uid; - } else { - std::vector<mongo::BSONElement> result_array = result_bson.getFieldDotted(dotted_dataset_path).Array(); - if(result_array.size()!=0) { - mongo::BSONObj attribute_config = result_array[0].Obj(); - //we have found description and need to return all field - result.reset(new CDataWrapper(attribute_config.objdata())); - } - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + int err = 0; + mongo::BSONObj result_bson; + const std::string dotted_dataset_path = boost::str(boost::format("%1%.%1%") % ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); + const std::string dotted_dataset_path_proj = boost::str(boost::format("%1%.%1%.$") % ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); + try { + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid << + // NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT << + dotted_dataset_path << BSON("$elemMatch" << BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME << attribute_name))); + mongo::BSONObj prj = BSON(dotted_dataset_path_proj << 1); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findOne", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Projection", + query.toString(), + prj.jsonString()));) + // remove the field of the document + if ((err = connection->findOne(result_bson, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + &prj))) { + } else if (result_bson.isEmpty()) { + MDBCUDA_ERR << "No attribute has been found:" << attribute_name << " in " << control_unit_uid; + } else { + std::vector<mongo::BSONElement> result_array = result_bson.getFieldDotted(dotted_dataset_path).Array(); + if (result_array.size() != 0) { + mongo::BSONObj attribute_config = result_array[0].Obj(); + // we have found description and need to return all field + result.reset(new CDataWrapper(attribute_config.objdata())); + } } - return err; - + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -int MongoDBControlUnitDataAccess::getInstanceDatasetAttributeConfiguration(const std::string& control_unit_uid, - const std::string& attribute_name, +int MongoDBControlUnitDataAccess::getInstanceDatasetAttributeConfiguration(const std::string& control_unit_uid, + const std::string& attribute_name, ChaosSharedPtr<chaos::common::data::CDataWrapper>& result) { - int err = 0; - mongo::BSONObj result_bson; - try{ - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid << - // NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT << - "instance_description.attribute_value_descriptions" << BSON("$elemMatch"<<BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME << attribute_name))); - mongo::BSONObj prj = BSON("instance_description.attribute_value_descriptions.$" << 1); - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findOne", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Projection", - query.toString(), - prj.jsonString()));) - //remove the field of the document - if((err = connection->findOne(result_bson, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - &prj))){ - - } else if(!result_bson.isEmpty()){ - std::vector<mongo::BSONElement> result_array = result_bson.getFieldDotted("instance_description.attribute_value_descriptions").Array(); - if(result_array.size()!=0) { - mongo::BSONObj attribute_config = result_array[0].Obj(); - ChaosUniquePtr<CDataWrapper> ac(new CDataWrapper(attribute_config.objdata())); - - //we have found description - result.reset(new CDataWrapper()); - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME)); - } - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE)); - } - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE)); - } - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE)); - } - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT)); - } - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT)); - } + int err = 0; + mongo::BSONObj result_bson; + try { + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_uid << + // NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT << + "instance_description.attribute_value_descriptions" << BSON("$elemMatch" << BSON(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME << attribute_name))); + mongo::BSONObj prj = BSON("instance_description.attribute_value_descriptions.$" << 1); - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT)); - } - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET)); - } + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findOne", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Projection", + query.toString(), + prj.jsonString()));) + // remove the field of the document + if ((err = connection->findOne(result_bson, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + &prj))) { + } else if (!result_bson.isEmpty()) { + std::vector<mongo::BSONElement> result_array = result_bson.getFieldDotted("instance_description.attribute_value_descriptions").Array(); + if (result_array.size() != 0) { + mongo::BSONObj attribute_config = result_array[0].Obj(); + ChaosUniquePtr<CDataWrapper> ac(new CDataWrapper(attribute_config.objdata())); - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR)); - } - if(attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR)) { - result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR, - ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR)); - } - } + // we have found description + result.reset(new CDataWrapper()); + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_NAME)); } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DEFAULT_VALUE)); + } + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MAX_RANGE)); + } + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_MIN_RANGE)); + } + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_INCREMENT)); + } + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_UNIT)); + } + + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_CONVFACT)); + } + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_OFFSET)); + } + + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_WARN_THR)); + } + if (attribute_config.hasField(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR)) { + result->addStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR, + ac->getStringValue(ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_ATTRIBUTE_ERROR_THR)); + } + } } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -int MongoDBControlUnitDataAccess::getScriptAssociatedToControlUnitInstance(const std::string& cu_instance, - bool& found, +int MongoDBControlUnitDataAccess::getScriptAssociatedToControlUnitInstance(const std::string& cu_instance, + bool& found, ScriptBaseDescription& script_base_descrition) { - int err = 0; - found = false; - mongo::BSONObj result_bson; - try{ - mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_instance << - NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT << - NodeDefinitionKey::NODE_SUB_TYPE << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); - - mongo::BSONObj p = BSON(NodeDefinitionKey::NODE_GROUP_SET << 1 << - "script_seq" << 1); - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "find", - DATA_ACCESS_LOG_2_ENTRY("Query", - "projection", - q.toString(), - p.jsonString()));) - if((err = connection->findOne(result_bson, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - &p))) { - MDBCUDA_ERR << CHAOS_FORMAT("Error searching script information on instance %1%",%cu_instance); - } else if(result_bson.isEmpty() == false) { - mongo::BSONElement sname = result_bson.getField(NodeDefinitionKey::NODE_GROUP_SET); - mongo::BSONElement sseq = result_bson.getField("script_seq"); - //getscript - q = BSON("script_name" << sname.String() << - "seq" << sseq.numberLong()); - - if((err = connection->findOne(result_bson, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q))) { - MDBCUDA_ERR << CHAOS_FORMAT("Error loading script %1% information on instance %2%",%sname.String()%cu_instance); - } else if((found = (result_bson.isEmpty() == false))) { - ChaosUniquePtr<CDataWrapper> script_data(new CDataWrapper(result_bson.objdata())); - ScriptBaseDescriptionSDWrapper sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(ScriptBaseDescription, script_base_descrition)); - sdw.deserialize(script_data.get()); - } - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + int err = 0; + found = false; + mongo::BSONObj result_bson; + try { + mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << cu_instance << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT << NodeDefinitionKey::NODE_SUB_TYPE << NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); + + mongo::BSONObj p = BSON(NodeDefinitionKey::NODE_GROUP_SET << 1 << "script_seq" << 1); + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "find", + DATA_ACCESS_LOG_2_ENTRY("Query", + "projection", + q.toString(), + p.jsonString()));) + if ((err = connection->findOne(result_bson, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + &p))) { + MDBCUDA_ERR << CHAOS_FORMAT("Error searching script information on instance %1%", % cu_instance); + } else if (result_bson.isEmpty() == false) { + mongo::BSONElement sname = result_bson.getField(NodeDefinitionKey::NODE_GROUP_SET); + mongo::BSONElement sseq = result_bson.getField("script_seq"); + // getscript + q = BSON("script_name" << sname.String() << "seq" << sseq.numberLong()); + + if ((err = connection->findOne(result_bson, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q))) { + MDBCUDA_ERR << CHAOS_FORMAT("Error loading script %1% information on instance %2%", % sname.String() % cu_instance); + } else if ((found = (result_bson.isEmpty() == false))) { + ChaosUniquePtr<CDataWrapper> script_data(new CDataWrapper(result_bson.objdata())); + ScriptBaseDescriptionSDWrapper sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(ScriptBaseDescription, script_base_descrition)); + sdw.deserialize(script_data.get()); + } } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -int MongoDBControlUnitDataAccess::getDataServiceAssociated(const std::string& cu_uid, - std::vector<std::string>& associated_ds){ - CHAOS_ASSERT(node_data_access) - int err = 0; - std::vector<mongo::BSONObj> result; - try{ - mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_DATA_SERVICE - << "cu_association" << BSON("$in" << BSON_ARRAY(cu_uid))); - mongo::BSONObj p = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << 1); - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "find", - DATA_ACCESS_LOG_2_ENTRY("Query", - "projection", - q.toString(), - p.jsonString()));) - connection->findN(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - 10, - 0, - &p); - - BOOST_FOREACH(mongo::BSONObj element, result){ - if(!element.hasField(NodeDefinitionKey::NODE_UNIQUE_ID)) continue; - const std::string ds_unique_id = element.getStringField(NodeDefinitionKey::NODE_UNIQUE_ID); - CDataWrapper *node_description; - if((err = node_data_access->getNodeDescription(ds_unique_id, - &node_description))){ - MDBCUDA_ERR << "Error fetching node description for data service:" << ds_unique_id; - } else if(node_description!=NULL){ - //we have object description - ChaosUniquePtr<chaos::common::data::CDataWrapper> node_ptr(node_description); - associated_ds.push_back(node_ptr->getStringValue(NodeDefinitionKey::NODE_UNIQUE_ID)); - } else { - MDBCUDA_ERR << "no node description found for data service:" << ds_unique_id; - } - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; +int MongoDBControlUnitDataAccess::getDataServiceAssociated(const std::string& cu_uid, + std::vector<std::string>& associated_ds) { + CHAOS_ASSERT(node_data_access) + int err = 0; + std::vector<mongo::BSONObj> result; + try { + mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_DATA_SERVICE + << "cu_association" << BSON("$in" << BSON_ARRAY(cu_uid))); + mongo::BSONObj p = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << 1); + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "find", + DATA_ACCESS_LOG_2_ENTRY("Query", + "projection", + q.toString(), + p.jsonString()));) + connection->findN(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + 10, + 0, + &p); + + BOOST_FOREACH (mongo::BSONObj element, result) { + if (!element.hasField(NodeDefinitionKey::NODE_UNIQUE_ID)) continue; + const std::string ds_unique_id = element.getStringField(NodeDefinitionKey::NODE_UNIQUE_ID); + CDataWrapper* node_description; + if ((err = node_data_access->getNodeDescription(ds_unique_id, + &node_description))) { + MDBCUDA_ERR << "Error fetching node description for data service:" << ds_unique_id; + } else if (node_description != NULL) { + // we have object description + ChaosUniquePtr<chaos::common::data::CDataWrapper> node_ptr(node_description); + associated_ds.push_back(node_ptr->getStringValue(NodeDefinitionKey::NODE_UNIQUE_ID)); + } else { + MDBCUDA_ERR << "no node description found for data service:" << ds_unique_id; + } } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -int MongoDBControlUnitDataAccess::reserveControlUnitForAgeingManagement(uint64_t& last_sequence_id, +int MongoDBControlUnitDataAccess::reserveControlUnitForAgeingManagement(uint64_t& last_sequence_id, std::string& control_unit_found, - uint32_t& control_unit_ageing_time, - uint64_t& last_ageing_perform_time, - uint64_t timeout_for_checking, - uint64_t delay_next_check) { - int err = 0; - SearchResult paged_result; - try { - mongo::BSONObj result_found; - mongo::BSONObjBuilder query_builder; - mongo::BSONArrayBuilder query_ageing_and; - mongo::BSONArrayBuilder query_ageing_or; - - const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); - const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); - const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); - query_builder << "property_defaults" << BSON("$elemMatch" << BSON("property_g_plist" << BSON("$elemMatch" << BSON("property_name" << DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING << "property_value" << BSON("$gt" << 0))))); - - //get all control unit - // we want to search everithing - //// query_builder << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; - - //condition on sequence - query_builder << "seq" << BSON("$gt" << (long long)last_sequence_id); - - //select control unit also if it is in checking managemnt but data checking time is old than one minute(it is gone in timeout) - query_ageing_or << BSON(key_processing_ageing << true << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp()-timeout_for_checking))); - - //or on previous condition and on checking management == false the last checking date need to be greater that noral chack timeout - query_ageing_or << BSON(key_processing_ageing << false << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp()-delay_next_check))); - - query_builder << "$or" << query_ageing_or.arr(); - - - mongo::BSONObj query = query_builder.obj(); - // set atomicalli processing ageing to true - mongo::BSONObj update = BSON("$set" << BSON(key_processing_ageing << true << - key_last_checking_time << mongo::Date_t(TimingUtil::getTimeStamp()))); - // order getting first cu being the last processed one - mongo::BSONObj order_by = BSON(key_last_checking_time << 1); - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "findAndUpdate", - DATA_ACCESS_LOG_3_ENTRY("query", - "update", - "order_by", - query.jsonString(), - update.jsonString(), - order_by.jsonString()));) - //find the control unit - if((err = connection->findAndModify(result_found, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - update, - false, - false, - order_by))){ - MDBCUDA_ERR << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", %err); - } else if(result_found.isEmpty() == false && (result_found.hasField(NodeDefinitionKey::NODE_UNIQUE_ID) && - result_found.hasField(MONGODB_COLLECTION_NODES_AGEING_INFO))) { - last_sequence_id = 0; - control_unit_found.clear(); - last_ageing_perform_time = 0; - control_unit_ageing_time = 0; - //find property - if(result_found.hasElement("property_defaults")) { - CDWUniquePtr prop_ser(new CDataWrapper(result_found.objdata())); - chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw; - pg_sdw.serialization_key = "property_defaults"; - pg_sdw.deserialize(prop_ser.get()); - for(common::property::PropertyGroupVectorConstIterator it = pg_sdw().begin(), - end = pg_sdw().end(); - it != end; - it++) { - const std::string& pg_name = it->getGroupName(); - if(pg_name.compare(ControlUnitPropertyKey::P_GROUP_NAME) == 0) { - if(it->hasProperty(DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING)&&it->hasProperty(DataServiceNodeDefinitionKey::DS_STORAGE_TYPE)){ - //we have ageing data - control_unit_ageing_time = (uint32_t)it->getPropertyValue(DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING).asInt32(); - int type= it->getPropertyValue(DataServiceNodeDefinitionKey::DS_STORAGE_TYPE).asInt32(); - last_sequence_id = (uint64_t)result_found.getField("seq").Long(); - last_ageing_perform_time = (uint64_t)result_found.getFieldDotted(key_last_performed_time).Date().asInt64(); - - if((type& ((int)DataServiceNodeDefinitionType::DSStorageTypeHistory)) && (control_unit_ageing_time>0)){ - control_unit_found = result_found.getField(NodeDefinitionKey::NODE_UNIQUE_ID).String(); - } - } - break; - } - } + uint32_t& control_unit_ageing_time, + uint64_t& last_ageing_perform_time, + uint64_t timeout_for_checking, + uint64_t delay_next_check) { + int err = 0; + SearchResult paged_result; + try { + mongo::BSONObj result_found; + mongo::BSONObjBuilder query_builder; + mongo::BSONArrayBuilder query_ageing_and; + mongo::BSONArrayBuilder query_ageing_or; + + const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_PROCESSING_AGEING); + const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); + const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_PERFORMED_AGEING); + query_builder << "property_defaults" << BSON("$elemMatch" << BSON("property_g_plist" << BSON("$elemMatch" << BSON("property_name" << DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING << "property_value" << BSON("$gt" << 0))))); + + // get all control unit + // we want to search everithing + //// query_builder << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; + + // condition on sequence + query_builder << "seq" << BSON("$gt" << (long long)last_sequence_id); + + // select control unit also if it is in checking managemnt but data checking time is old than one minute(it is gone in timeout) + query_ageing_or << BSON(key_processing_ageing << true << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp() - timeout_for_checking))); + + // or on previous condition and on checking management == false the last checking date need to be greater that noral chack timeout + query_ageing_or << BSON(key_processing_ageing << false << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp() - delay_next_check))); + + query_builder << "$or" << query_ageing_or.arr(); + + mongo::BSONObj query = query_builder.obj(); + // set atomicalli processing ageing to true + mongo::BSONObj update = BSON("$set" << BSON(key_processing_ageing << true << key_last_checking_time << mongo::Date_t(TimingUtil::getTimeStamp()))); + // order getting first cu being the last processed one + mongo::BSONObj order_by = BSON(key_last_checking_time << 1); + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "findAndUpdate", + DATA_ACCESS_LOG_3_ENTRY("query", + "update", + "order_by", + query.jsonString(), + update.jsonString(), + order_by.jsonString()));) + // find the control unit + if ((err = connection->findAndModify(result_found, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + update, + false, + false, + order_by))) { + MDBCUDA_ERR << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", % err); + } else if (result_found.isEmpty() == false && (result_found.hasField(NodeDefinitionKey::NODE_UNIQUE_ID) && + result_found.hasField(MONGODB_COLLECTION_NODES_AGEING_INFO))) { + last_sequence_id = 0; + control_unit_found.clear(); + last_ageing_perform_time = 0; + control_unit_ageing_time = 0; + // find property + if (result_found.hasElement("property_defaults")) { + CDWUniquePtr prop_ser(new CDataWrapper(result_found.objdata())); + chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw; + pg_sdw.serialization_key = "property_defaults"; + pg_sdw.deserialize(prop_ser.get()); + for (common::property::PropertyGroupVectorConstIterator it = pg_sdw().begin(), + end = pg_sdw().end(); + it != end; + it++) { + const std::string& pg_name = it->getGroupName(); + if (pg_name.compare(ControlUnitPropertyKey::P_GROUP_NAME) == 0) { + if (it->hasProperty(DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING) && it->hasProperty(DataServiceNodeDefinitionKey::DS_STORAGE_TYPE)) { + // we have ageing data + control_unit_ageing_time = (uint32_t)it->getPropertyValue(DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING).asInt32(); + int type = it->getPropertyValue(DataServiceNodeDefinitionKey::DS_STORAGE_TYPE).asInt32(); + last_sequence_id = (uint64_t)result_found.getField("seq").Long(); + last_ageing_perform_time = (uint64_t)result_found.getFieldDotted(key_last_performed_time).Date().asInt64(); + + if ((type & ((int)DataServiceNodeDefinitionType::DSStorageTypeHistory)) && (control_unit_ageing_time > 0)) { + control_unit_found = result_found.getField(NodeDefinitionKey::NODE_UNIQUE_ID).String(); + } } + break; + } } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + } } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } int MongoDBControlUnitDataAccess::releaseControlUnitForAgeingManagement(std::string& control_unit_found, - bool performed) { - int err = 0; - SearchResult paged_result; - try { - mongo::BSONObj result_found; - uint64_t current_ts = TimingUtil::getTimeStamp(); - const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); - const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); - const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); - - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_found); - // set atomicalli processing ageing to true - mongo::BSONObj update = BSON("$set" << (performed?BSON(key_processing_ageing << false << - key_last_checking_time << mongo::Date_t(current_ts) << - key_last_performed_time << mongo::Date_t(current_ts)): - BSON(key_processing_ageing << false << - key_last_checking_time << mongo::Date_t(current_ts)))); - - DEBUG_CODE(MDBCUDA_DBG<<log_message(__func__, - "update", - DATA_ACCESS_LOG_2_ENTRY("query", - "update", - query.jsonString(), - update.jsonString()));) - //find the control unit - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - update))){ - MDBCUDA_ERR << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", %err); - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBCUDA_ERR << e.what(); - err = e.errorCode; + bool performed) { + int err = 0; + SearchResult paged_result; + try { + mongo::BSONObj result_found; + uint64_t current_ts = TimingUtil::getTimeStamp(); + const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_PROCESSING_AGEING); + const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); + const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_PERFORMED_AGEING); + + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_found); + // set atomicalli processing ageing to true + mongo::BSONObj update = BSON("$set" << (performed ? BSON(key_processing_ageing << false << key_last_checking_time << mongo::Date_t(current_ts) << key_last_performed_time << mongo::Date_t(current_ts)) : BSON(key_processing_ageing << false << key_last_checking_time << mongo::Date_t(current_ts)))); + + DEBUG_CODE(MDBCUDA_DBG << log_message(__func__, + "update", + DATA_ACCESS_LOG_2_ENTRY("query", + "update", + query.jsonString(), + update.jsonString()));) + // find the control unit + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + update))) { + MDBCUDA_ERR << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", % err); } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBCUDA_ERR << e.what(); + err = e.errorCode; + } + return err; } int MongoDBControlUnitDataAccess::getNextRunID(const std::string& control_unit_id, - int64_t& run_id) { - int err = 0; + int64_t& run_id) { + int err = 0; - try { - const std::string run_id_key = CHAOS_FORMAT("%1%.%2%", %"run_description"%ControlUnitNodeDefinitionKey::CONTROL_UNIT_RUN_ID); - - //increment the run id - mongo::BSONObj r; - mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_id); - mongo::BSONObj u = BSON("$inc" << BSON(run_id_key<<(long long)1)); - mongo::BSONObj sort; - mongo::BSONObj projection = BSON(run_id_key<<1); - //update run id - - DEBUG_CODE(MDBCUDA_DBG<<log_message("updateRunID", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q.toString(), - u.jsonString()));) - //set the instance parameter within the node representing the control unit - if((err = connection->findAndModify(r, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u, - false, - true, - sort, - projection))) { - MDBCUDA_ERR << "Error updating run id for control unit " << control_unit_id; - } else if(r.isEmpty()) { - run_id = 0; - } else { - run_id = r.getFieldDotted(run_id_key).Long(); - } - } catch (const mongo::DBException &e) { - MDBCUDA_ERR << e.what(); - err = e.getCode(); + try { + const std::string run_id_key = CHAOS_FORMAT("%1%.%2%", % "run_description" % ControlUnitNodeDefinitionKey::CONTROL_UNIT_RUN_ID); + + // increment the run id + mongo::BSONObj r; + mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_id); + mongo::BSONObj u = BSON("$inc" << BSON(run_id_key << (long long)1)); + mongo::BSONObj sort; + mongo::BSONObj projection = BSON(run_id_key << 1); + // update run id + + DEBUG_CODE(MDBCUDA_DBG << log_message("updateRunID", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q.toString(), + u.jsonString()));) + // set the instance parameter within the node representing the control unit + if ((err = connection->findAndModify(r, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u, + false, + true, + sort, + projection))) { + MDBCUDA_ERR << "Error updating run id for control unit " << control_unit_id; + } else if (r.isEmpty()) { + run_id = 0; + } else { + run_id = r.getFieldDotted(run_id_key).Long(); } - return err; + } catch (const mongo::DBException& e) { + MDBCUDA_ERR << e.what(); + err = e.getCode(); + } + return err; } diff --git a/ChaosMetadataService/persistence/mongodb/MongoDBNodeDataAccess.cpp b/ChaosMetadataService/persistence/mongodb/MongoDBNodeDataAccess.cpp index 029ac55b2b69771cd3b6eb4485e5dd0f78195b53..52ad7de0512d8902d7796f812a0798ad5c574e47 100644 --- a/ChaosMetadataService/persistence/mongodb/MongoDBNodeDataAccess.cpp +++ b/ChaosMetadataService/persistence/mongodb/MongoDBNodeDataAccess.cpp @@ -18,18 +18,18 @@ * See the Licence for the specific language governing * permissions and limitations under the Licence. */ -//#undef DEBUG +// #undef DEBUG -#include <mongo/client/dbclient.h> #include "MongoDBNodeDataAccess.h" -#include "mongo_db_constants.h" -#include "../../ChaosMetadataService.h" -#include <chaos/common/utility/TimingUtil.h> #include <chaos/common/batch_command/BatchCommandConstants.h> +#include <chaos/common/utility/TimingUtil.h> +#include <mongo/client/dbclient.h> #include <map> +#include "../../ChaosMetadataService.h" +#include "mongo_db_constants.h" #define MDBNDA_INFO INFO_LOG(MongoDBNodeDataAccess) -#define MDBNDA_DBG DBG_LOG(MongoDBNodeDataAccess) -#define MDBNDA_ERR ERR_LOG(MongoDBNodeDataAccess) +#define MDBNDA_DBG DBG_LOG(MongoDBNodeDataAccess) +#define MDBNDA_ERR ERR_LOG(MongoDBNodeDataAccess) using namespace boost; using namespace chaos::common::property; @@ -40,1301 +40,1272 @@ using namespace chaos::common::batch_command; using namespace chaos::service_common::persistence::mongodb; using namespace chaos::metadata_service::persistence::mongodb; -MongoDBNodeDataAccess::MongoDBNodeDataAccess(const ChaosSharedPtr<service_common::persistence::mongodb::MongoDBHAConnectionManager>& _connection): -MongoDBAccessor(_connection), -utility_data_access(NULL){} +MongoDBNodeDataAccess::MongoDBNodeDataAccess(const ChaosSharedPtr<service_common::persistence::mongodb::MongoDBHAConnectionManager>& _connection) + : MongoDBAccessor(_connection), utility_data_access(NULL) {} MongoDBNodeDataAccess::~MongoDBNodeDataAccess() {} mongo::BSONObj MongoDBNodeDataAccess::getAliveOption(unsigned int timeout_sec) { - return BSON(CHAOS_FORMAT("health_stat.%1%",%NodeHealtDefinitionKey::NODE_HEALT_MDS_TIMESTAMP) << BSON("$gte" << mongo::Date_t(TimingUtil::getTimestampWithDelay((timeout_sec * 1000), false)))); + return BSON(CHAOS_FORMAT("health_stat.%1%", % NodeHealtDefinitionKey::NODE_HEALT_MDS_TIMESTAMP) << BSON("$gte" << mongo::Date_t(TimingUtil::getTimestampWithDelay((timeout_sec * 1000), false)))); } -int MongoDBNodeDataAccess::getNodeDescription(const std::string& node_unique_id, - chaos::common::data::CDWUniquePtr &node_description) { - int err = 0; - chaos::common::data::CDataWrapper *node_description_tmp = NULL; - if((err = getNodeDescription(node_unique_id, +int MongoDBNodeDataAccess::getNodeDescription(const std::string& node_unique_id, + chaos::common::data::CDWUniquePtr& node_description) { + int err = 0; + chaos::common::data::CDataWrapper* node_description_tmp = NULL; + if ((err = getNodeDescription(node_unique_id, &node_description_tmp))) { - MDBNDA_ERR << "Error fetching node description"; - } else { - node_description.reset(node_description_tmp); - } - return err; + MDBNDA_ERR << "Error fetching node description"; + } else { + node_description.reset(node_description_tmp); + } + return err; } - int MongoDBNodeDataAccess::setNodeDescription(const std::string& node_unique_id, - chaos::common::data::CDWUniquePtr &node_description){ +int MongoDBNodeDataAccess::setNodeDescription(const std::string& node_unique_id, + chaos::common::data::CDWUniquePtr& node_description) { + int err = 0; + mongo::BSONObj result; + mongo::BSONObjBuilder query_builder; + try { + int size; + if (node_unique_id.size() == 0) return -1; // invalid unique id + query_builder << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; - int err = 0; - mongo::BSONObj result; - mongo::BSONObjBuilder query_builder; - try { - int size; - if(node_unique_id.size() == 0) return -1; //invalid unique id - query_builder << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; - - mongo::BSONObj q = query_builder.obj(); - mongo::BSONObj u = BSON("$set" << mongo::BSONObj(node_description->getBSONRawData(size))); - DEBUG_CODE(MDBNDA_DBG<<log_message("setNodeDescription", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "update", - q.jsonString(), - u.jsonString()));) - - // want to have the full information - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), q,u))){ - MDBNDA_ERR << "Error setting/update node description"; - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + mongo::BSONObj q = query_builder.obj(); + mongo::BSONObj u = BSON("$set" << mongo::BSONObj(node_description->getBSONRawData(size))); + DEBUG_CODE(MDBNDA_DBG << log_message("setNodeDescription", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "update", + q.jsonString(), + u.jsonString()));) + + // want to have the full information + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), q, u))) { + MDBNDA_ERR << "Error setting/update node description"; } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } - -int MongoDBNodeDataAccess::getNodeDescription(const std::string& node_unique_id, - chaos::common::data::CDataWrapper **node_description) { - int err = 0; - mongo::BSONObj result; - mongo::BSONObjBuilder query_builder; - try { - if(node_unique_id.size() == 0) return -1; //invalid unique id - query_builder << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; - - mongo::BSONObj q = query_builder.obj(); - /* mongo::BSONObj p = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << 1 << - chaos::NodeDefinitionKey::NODE_TYPE << 1 << - chaos::NodeDefinitionKey::NODE_SUB_TYPE << 1 << - chaos::NodeDefinitionKey::NODE_RPC_ADDR << 1 << - chaos::NodeDefinitionKey::NODE_RPC_DOMAIN << 1 << - chaos::NodeDefinitionKey::NODE_HOST_NAME << 1 << - chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR << 1 << - chaos::NodeDefinitionKey::NODE_TIMESTAMP << 1);*/ - - /*DEBUG_CODE(MDBNDA_DBG<<log_message("getNodeDescription", - "findOne", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Projection", - q.jsonString(), - p.jsonString()));) - */ - DEBUG_CODE(MDBNDA_DBG<<log_message("getNodeDescription", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString() - ));) - // want to have the full information - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), q/*, &p*/))){ - MDBNDA_ERR << "Error fetching node description for:"<<node_unique_id; - } else if(result.isEmpty()) { - MDBNDA_ERR << "No node description has been found for:"<<node_unique_id; - err = -2; - } else { - *node_description = new CDataWrapper(result.objdata()); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + +int MongoDBNodeDataAccess::getNodeDescription(const std::string& node_unique_id, + chaos::common::data::CDataWrapper** node_description) { + int err = 0; + mongo::BSONObj result; + mongo::BSONObjBuilder query_builder; + try { + if (node_unique_id.size() == 0) return -1; // invalid unique id + query_builder << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; + + mongo::BSONObj q = query_builder.obj(); + /* mongo::BSONObj p = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << 1 << + chaos::NodeDefinitionKey::NODE_TYPE << 1 << + chaos::NodeDefinitionKey::NODE_SUB_TYPE << 1 << + chaos::NodeDefinitionKey::NODE_RPC_ADDR << 1 << + chaos::NodeDefinitionKey::NODE_RPC_DOMAIN << 1 << + chaos::NodeDefinitionKey::NODE_HOST_NAME << 1 << + chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR << 1 << + chaos::NodeDefinitionKey::NODE_TIMESTAMP << 1);*/ + + /*DEBUG_CODE(MDBNDA_DBG<<log_message("getNodeDescription", + "findOne", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Projection", + q.jsonString(), + p.jsonString()));) + */ + DEBUG_CODE(MDBNDA_DBG << log_message("getNodeDescription", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + // want to have the full information + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q /*, &p*/))) { + MDBNDA_ERR << "Error fetching node description for:" << node_unique_id; + } else if (result.isEmpty()) { + MDBNDA_ERR << "No node description has been found for:" << node_unique_id; + err = -2; + } else { + *node_description = new CDataWrapper(result.objdata()); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -//inherited method +// inherited method int MongoDBNodeDataAccess::insertNewNode(CDataWrapper& node_description) { - int err = 0; - uint64_t sequence_id = 0; - try { - if(!node_description.hasKey(chaos::NodeDefinitionKey::NODE_UNIQUE_ID)) return -1; - if(!node_description.hasKey(chaos::NodeDefinitionKey::NODE_TYPE)) return -2; - if(!node_description.hasKey("seq")) { - CHAOS_ASSERT(utility_data_access) - if(utility_data_access->getNextSequenceValue("nodes", sequence_id)) { - MDBNDA_ERR << "Error getting new sequence for node"; - return err; - } else { - node_description.addInt64Value("seq", sequence_id); - } - // node_description.addInt64Value("seq", chaos::common::utility::TimingUtil::getTimeStamp()); + int err = 0; + uint64_t sequence_id = 0; + try { + if (!node_description.hasKey(chaos::NodeDefinitionKey::NODE_UNIQUE_ID)) return -1; + if (!node_description.hasKey(chaos::NodeDefinitionKey::NODE_TYPE)) return -2; + if (!node_description.hasKey("seq")) { + CHAOS_ASSERT(utility_data_access) + if (utility_data_access->getNextSequenceValue("nodes", sequence_id)) { + MDBNDA_ERR << "Error getting new sequence for node"; + return err; + } else { + node_description.addInt64Value("seq", sequence_id); + } + // node_description.addInt64Value("seq", chaos::common::utility::TimingUtil::getTimeStamp()); + } - } - - ChaosUniquePtr<SerializationBuffer> ser(node_description.getBSONData()); - mongo::BSONObj obj_to_insert(ser->getBufferPtr()); - MDBNDA_DBG<<"inserting:"<<node_description.getCompliantJSONString(); - DEBUG_CODE(MDBNDA_DBG<<log_message("insertNewNode", - "insert", - DATA_ACCESS_LOG_1_ENTRY("Query", - obj_to_insert));) - - - if((err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - obj_to_insert))) { - MDBNDA_ERR << "Error creating new node"; - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + ChaosUniquePtr<SerializationBuffer> ser(node_description.getBSONData()); + mongo::BSONObj obj_to_insert(ser->getBufferPtr()); + MDBNDA_DBG << "inserting:" << node_description.getCompliantJSONString(); + DEBUG_CODE(MDBNDA_DBG << log_message("insertNewNode", + "insert", + DATA_ACCESS_LOG_1_ENTRY("Query", + obj_to_insert));) + + if ((err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + obj_to_insert))) { + MDBNDA_ERR << "Error creating new node"; } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } //! update the node updatable feature int MongoDBNodeDataAccess::updateNode(chaos::common::data::CDataWrapper& node_description) { - int err = 0; - //allocate data block on vfat - mongo::BSONObjBuilder bson_find; - mongo::BSONObjBuilder updated_field; - mongo::BSONObjBuilder bson_update; - mongo::BSONArrayBuilder bson_update_array; - try { - if(!node_description.hasKey(chaos::NodeDefinitionKey::NODE_UNIQUE_ID)) return -1; - - //serach criteria - bson_find << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_UNIQUE_ID); - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_TYPE)) { - bson_find << chaos::NodeDefinitionKey::NODE_TYPE << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_TYPE); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_SUB_TYPE)) { - updated_field << chaos::NodeDefinitionKey::NODE_SUB_TYPE << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_SUB_TYPE); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_RPC_ADDR)) { - updated_field << chaos::NodeDefinitionKey::NODE_RPC_ADDR << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_RPC_ADDR); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_RPC_DOMAIN)) { - updated_field << chaos::NodeDefinitionKey::NODE_RPC_DOMAIN << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_RPC_DOMAIN); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_IP_ADDR)) { - updated_field << chaos::NodeDefinitionKey::NODE_IP_ADDR << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_IP_ADDR); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_HOST_NAME)) { - updated_field << chaos::NodeDefinitionKey::NODE_HOST_NAME << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_HOST_NAME); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR)) { - updated_field << chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_PARENT)) { - updated_field << chaos::NodeDefinitionKey::NODE_PARENT << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_PARENT); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_TIMESTAMP)) { - updated_field << chaos::NodeDefinitionKey::NODE_TIMESTAMP << mongo::Date_t(node_description.getUInt64Value(chaos::NodeDefinitionKey::NODE_TIMESTAMP)); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_DESC)) { - updated_field << chaos::NodeDefinitionKey::NODE_DESC << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_DESC); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_REST_PORT)) { - updated_field << chaos::NodeDefinitionKey::NODE_REST_PORT << node_description.getInt32Value(chaos::NodeDefinitionKey::NODE_REST_PORT); - } - if(node_description.hasKey(chaos::NodeDefinitionKey::NODE_BUILD_INFO)) { - updated_field << chaos::NodeDefinitionKey::NODE_BUILD_INFO << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_BUILD_INFO); - } - if(node_description.hasKey(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_VIEW)) { - updated_field << chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_VIEW << node_description.getStringValue(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_VIEW); - } - if(node_description.hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)) { - CMultiTypeDataArrayWrapperSPtr description_array(node_description.getVectorValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)); - for(int desc_idx = 0; - desc_idx < description_array->size(); - desc_idx++) { - ChaosUniquePtr<CDataWrapper> desc_obj(description_array->getCDataWrapperElementAtIndex(desc_idx)); - if(desc_obj->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)) { - CMultiTypeDataArrayWrapperSPtr action_array(desc_obj->getVectorValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)); - for(int idx = 0; - idx < action_array->size(); - idx++) { - mongo::BSONObjBuilder action_description; - mongo::BSONArrayBuilder param_descriptions; - ChaosUniquePtr<chaos::common::data::CDataWrapper> element(action_array->getCDataWrapperElementAtIndex(idx)); - if(element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DOMAIN)) { - action_description << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DOMAIN - << element->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DOMAIN); - } - if(element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_NAME)) { - action_description << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_NAME - << element->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_NAME); - } - if(element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESCRIPTION)) { - action_description << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESCRIPTION - << element->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESCRIPTION); - } - //check if the action has parameter - if(element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PARAM)) { - CMultiTypeDataArrayWrapperSPtr param_array(element->getVectorValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PARAM)); - for(int idx = 0; - idx < param_array->size(); - idx++) { - mongo::BSONObjBuilder single_param_desc; - ChaosUniquePtr<chaos::common::data::CDataWrapper> param(param_array->getCDataWrapperElementAtIndex(idx)); - - if(param->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_NAME)) { - single_param_desc << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_NAME - << param->getStringValue( chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_NAME); - } - if(param->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_INFO)) { - single_param_desc << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_INFO - << param->getStringValue( chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_INFO); - } - if(param->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_TYPE)) { - single_param_desc << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_TYPE + int err = 0; + // allocate data block on vfat + mongo::BSONObjBuilder bson_find; + mongo::BSONObjBuilder updated_field; + mongo::BSONObjBuilder bson_update; + mongo::BSONArrayBuilder bson_update_array; + try { + if (!node_description.hasKey(chaos::NodeDefinitionKey::NODE_UNIQUE_ID)) return -1; + + // serach criteria + bson_find << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_UNIQUE_ID); + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_TYPE)) { + bson_find << chaos::NodeDefinitionKey::NODE_TYPE << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_TYPE); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_SUB_TYPE)) { + updated_field << chaos::NodeDefinitionKey::NODE_SUB_TYPE << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_SUB_TYPE); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_RPC_ADDR)) { + updated_field << chaos::NodeDefinitionKey::NODE_RPC_ADDR << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_RPC_ADDR); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_RPC_DOMAIN)) { + updated_field << chaos::NodeDefinitionKey::NODE_RPC_DOMAIN << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_RPC_DOMAIN); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_IP_ADDR)) { + updated_field << chaos::NodeDefinitionKey::NODE_IP_ADDR << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_IP_ADDR); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_HOST_NAME)) { + updated_field << chaos::NodeDefinitionKey::NODE_HOST_NAME << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_HOST_NAME); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR)) { + updated_field << chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_DIRECT_IO_ADDR); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_PARENT)) { + updated_field << chaos::NodeDefinitionKey::NODE_PARENT << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_PARENT); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_TIMESTAMP)) { + updated_field << chaos::NodeDefinitionKey::NODE_TIMESTAMP << mongo::Date_t(node_description.getUInt64Value(chaos::NodeDefinitionKey::NODE_TIMESTAMP)); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_DESC)) { + updated_field << chaos::NodeDefinitionKey::NODE_DESC << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_DESC); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_REST_PORT)) { + updated_field << chaos::NodeDefinitionKey::NODE_REST_PORT << node_description.getInt32Value(chaos::NodeDefinitionKey::NODE_REST_PORT); + } + if (node_description.hasKey(chaos::NodeDefinitionKey::NODE_BUILD_INFO)) { + updated_field << chaos::NodeDefinitionKey::NODE_BUILD_INFO << node_description.getStringValue(chaos::NodeDefinitionKey::NODE_BUILD_INFO); + } + if (node_description.hasKey(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_VIEW)) { + updated_field << chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_VIEW << node_description.getStringValue(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_VIEW); + } + if (node_description.hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)) { + CMultiTypeDataArrayWrapperSPtr description_array(node_description.getVectorValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)); + for (int desc_idx = 0; + desc_idx < description_array->size(); + desc_idx++) { + ChaosUniquePtr<CDataWrapper> desc_obj(description_array->getCDataWrapperElementAtIndex(desc_idx)); + if (desc_obj->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)) { + CMultiTypeDataArrayWrapperSPtr action_array(desc_obj->getVectorValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC)); + for (int idx = 0; + idx < action_array->size(); + idx++) { + mongo::BSONObjBuilder action_description; + mongo::BSONArrayBuilder param_descriptions; + ChaosUniquePtr<chaos::common::data::CDataWrapper> element(action_array->getCDataWrapperElementAtIndex(idx)); + if (element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DOMAIN)) { + action_description << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DOMAIN + << element->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DOMAIN); + } + if (element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_NAME)) { + action_description << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_NAME + << element->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_NAME); + } + if (element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESCRIPTION)) { + action_description << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESCRIPTION + << element->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESCRIPTION); + } + // check if the action has parameter + if (element->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PARAM)) { + CMultiTypeDataArrayWrapperSPtr param_array(element->getVectorValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PARAM)); + for (int idx = 0; + idx < param_array->size(); + idx++) { + mongo::BSONObjBuilder single_param_desc; + ChaosUniquePtr<chaos::common::data::CDataWrapper> param(param_array->getCDataWrapperElementAtIndex(idx)); + + if (param->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_NAME)) { + single_param_desc << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_NAME + << param->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_NAME); + } + if (param->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_INFO)) { + single_param_desc << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_INFO + << param->getStringValue(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_INFO); + } + if (param->hasKey(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_TYPE)) { + single_param_desc << chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_TYPE << param->getInt32Value(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PAR_TYPE); - } - //add element to array - param_descriptions << single_param_desc.obj(); - } - //add all param description - action_description.appendArray(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PARAM, param_descriptions.arr()); - } - //appen action description to array - bson_update_array << action_description.obj(); - } } + // add element to array + param_descriptions << single_param_desc.obj(); + } + // add all param description + action_description.appendArray(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC_PARAM, param_descriptions.arr()); } - //add all action to the bson update object - updated_field.appendArray(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC, bson_update_array.arr()); + // appen action description to array + bson_update_array << action_description.obj(); + } } - if(updated_field.asTempObj().isEmpty()) return 0; - mongo::BSONObj query = bson_find.obj(); - //set the update - bson_update << "$set" << updated_field.obj(); - mongo::BSONObj update = bson_update.obj(); - - - - DEBUG_CODE(MDBNDA_DBG<<log_message("updateNode", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - query.jsonString(), - update.jsonString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - update))) { - MDBNDA_ERR << "Error updating NODE:"<<node_description.getCompliantJSONString(); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + } + // add all action to the bson update object + updated_field.appendArray(chaos::RpcActionDefinitionKey::CS_CMDM_ACTION_DESC, bson_update_array.arr()); + } + if (updated_field.asTempObj().isEmpty()) return 0; + mongo::BSONObj query = bson_find.obj(); + // set the update + bson_update << "$set" << updated_field.obj(); + mongo::BSONObj update = bson_update.obj(); + + DEBUG_CODE(MDBNDA_DBG << log_message("updateNode", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + query.jsonString(), + update.jsonString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + update))) { + MDBNDA_ERR << "Error updating NODE:" << node_description.getCompliantJSONString(); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBNodeDataAccess::checkNodePresence(bool& presence, +int MongoDBNodeDataAccess::checkNodePresence(bool& presence, const std::string& node_unique_id, const std::string& node_unique_type) { - int err = 0; - //allocate data block on vfat - mongo::BSONObjBuilder bson_find; - mongo::BSONObj result; - try { - bson_find << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; - if(node_unique_type.size()>0) { - bson_find << chaos::NodeDefinitionKey::NODE_TYPE << node_unique_type; - } - mongo::BSONObj q = bson_find.obj(); - - DEBUG_CODE(MDBNDA_DBG<<log_message("checkNodePresence", - "find", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q))){ - MDBNDA_ERR << "Error searching NODE:" << node_unique_id<<" type:"<<node_unique_type; - } - presence = !result.isEmpty(); - } catch (const mongo::DBException &e) { - presence = false; - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + // allocate data block on vfat + mongo::BSONObjBuilder bson_find; + mongo::BSONObj result; + try { + bson_find << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; + if (node_unique_type.size() > 0) { + bson_find << chaos::NodeDefinitionKey::NODE_TYPE << node_unique_type; + } + mongo::BSONObj q = bson_find.obj(); + + DEBUG_CODE(MDBNDA_DBG << log_message("checkNodePresence", + "find", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q))) { + MDBNDA_ERR << "Error searching NODE:" << node_unique_id << " type:" << node_unique_type; } - return err; + presence = !result.isEmpty(); + } catch (const mongo::DBException& e) { + presence = false; + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::setNodeHealthStatus(const std::string& node_unique_id, - const HealthStat& health_stat) { - int err = 0; - - try { - mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id); - mongo::BSONObj u = BSON("$set" << BSON("health_stat" << BSON(NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP << mongo::Date_t(health_stat.timestamp) << - NodeHealtDefinitionKey::NODE_HEALT_MDS_TIMESTAMP << mongo::Date_t(health_stat.mds_received_timestamp) << - NodeHealtDefinitionKey::NODE_HEALT_PROCESS_UPTIME << (long long)health_stat.uptime << - NodeHealtDefinitionKey::NODE_HEALT_USER_TIME << health_stat.usr_time << - NodeHealtDefinitionKey::NODE_HEALT_SYSTEM_TIME << health_stat.sys_time << - NodeHealtDefinitionKey::NODE_HEALT_STATUS << health_stat.health_status))); - DEBUG_CODE(MDBNDA_DBG<<log_message("setNodeHealthStatus", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "update", - q.jsonString(), - u.jsonString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u))){ - MDBNDA_ERR << CHAOS_FORMAT("Error updating health stat information for node %1%",%node_unique_id); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + const HealthStat& health_stat) { + int err = 0; + + try { + mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id); + mongo::BSONObj u = BSON("$set" << BSON("health_stat" << BSON(NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP << mongo::Date_t(health_stat.timestamp) << NodeHealtDefinitionKey::NODE_HEALT_MDS_TIMESTAMP << mongo::Date_t(health_stat.mds_received_timestamp) << NodeHealtDefinitionKey::NODE_HEALT_PROCESS_UPTIME << (long long)health_stat.uptime << NodeHealtDefinitionKey::NODE_HEALT_USER_TIME << health_stat.usr_time << NodeHealtDefinitionKey::NODE_HEALT_SYSTEM_TIME << health_stat.sys_time << NodeHealtDefinitionKey::NODE_HEALT_STATUS << health_stat.health_status))); + DEBUG_CODE(MDBNDA_DBG << log_message("setNodeHealthStatus", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "update", + q.jsonString(), + u.jsonString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u))) { + MDBNDA_ERR << CHAOS_FORMAT("Error updating health stat information for node %1%", % node_unique_id); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::getNodeHealthStatus(const std::string& node_unique_id, - HealthStat& health_stat) { - int err = 0; - - try { - mongo::BSONObj result; - mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id << - "health_stat" << BSON("$exists" << true)); - DEBUG_CODE(MDBNDA_DBG<<log_message("setNodeHealthStatus", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q))){ - MDBNDA_ERR << CHAOS_FORMAT("Error getting health stat information for node %1%",%node_unique_id); - } else if(result.isEmpty() == false) { - //we have found health stat - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + HealthStat& health_stat) { + int err = 0; + + try { + mongo::BSONObj result; + mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id << "health_stat" << BSON("$exists" << true)); + DEBUG_CODE(MDBNDA_DBG << log_message("setNodeHealthStatus", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q))) { + MDBNDA_ERR << CHAOS_FORMAT("Error getting health stat information for node %1%", % node_unique_id); + } else if (result.isEmpty() == false) { + // we have found health stat } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::deleteNode(const std::string& node_unique_id, const std::string& node_type) { - int err = 0; - //allocate data block on vfat - mongo::BSONObjBuilder bson_find; - try { - bson_find << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; - if(node_type.size()) { - bson_find << chaos::NodeDefinitionKey::NODE_TYPE << node_type; - } - mongo::BSONObj q = bson_find.obj(); - - MDBNDA_DBG<<log_message("deleteNode", - "delete", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString())); - - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q))){ - MDBNDA_ERR << "Error deleting NODE:" << node_unique_id; - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + // allocate data block on vfat + mongo::BSONObjBuilder bson_find; + try { + bson_find << chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_unique_id; + if (node_type.size()) { + bson_find << chaos::NodeDefinitionKey::NODE_TYPE << node_type; + } + mongo::BSONObj q = bson_find.obj(); + + MDBNDA_DBG << log_message("deleteNode", + "delete", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString())); + + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q))) { + MDBNDA_ERR << "Error deleting NODE:" << node_unique_id; } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -#define BUILD_SEARCH(x,v) \ -if((int)search_type & (int)x){bson_find_or << BSON( chaos::NodeDefinitionKey::NODE_TYPE << v);} - -int MongoDBNodeDataAccess::searchNode(chaos::common::data::CDataWrapper **result, - const std::string& criteria, - chaos::NodeType::NodeSearchType search_type, - bool alive_only, - uint32_t last_unique_id, - uint32_t page_length, - const std::string& impl) { - int err = 0; - //decode the type of the node - std::string type_of_node; - //contain token found in criteria - std::vector<std::string> criteria_token; - //helper for regular expression - std::string token_for_mongo; - mongo::BSONObjBuilder bson_find; - mongo::BSONArrayBuilder bson_find_or; - mongo::BSONArrayBuilder bson_find_and; - SearchResult paged_result; - - //compose query - - //filter on sequence - if(!(search_type&chaos::NodeType::NodeSearchType::node_type_cds)){ - bson_find_and << BSON( "seq" << BSON("$gt"<<last_unique_id)); +#define BUILD_SEARCH(x, v) \ + if ((int)search_type & (int)x) { \ + bson_find_or << BSON(chaos::NodeDefinitionKey::NODE_TYPE << v); \ + } + +int MongoDBNodeDataAccess::searchNode(chaos::common::data::CDataWrapper** result, + const std::string& criteria, + chaos::NodeType::NodeSearchType search_type, + bool alive_only, + uint32_t last_unique_id, + uint32_t page_length, + const std::string& impl) { + int err = 0; + // decode the type of the node + std::string type_of_node; + // contain token found in criteria + std::vector<std::string> criteria_token; + // helper for regular expression + std::string token_for_mongo; + mongo::BSONObjBuilder bson_find; + mongo::BSONArrayBuilder bson_find_or; + mongo::BSONArrayBuilder bson_find_and; + SearchResult paged_result; + + // compose query + + // filter on sequence + if (!(search_type & chaos::NodeType::NodeSearchType::node_type_cds)) { + bson_find_and << BSON("seq" << BSON("$gt" << last_unique_id)); + } + + // filter on type + if (search_type > 0) { + BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_us, chaos::NodeType::NODE_TYPE_UNIT_SERVER); + BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_cu, chaos::NodeType::NODE_TYPE_CONTROL_UNIT); + BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_agent, chaos::NodeType::NODE_TYPE_AGENT); + BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_cds, chaos::NodeType::NODE_TYPE_DATA_SERVICE); + BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_wan, chaos::NodeType::NODE_TYPE_WAN_PROXY); + BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_root, chaos::NodeType::NODE_TYPE_ROOT); + + bson_find_and << BSON("$or" << bson_find_or.arr()); + + /* + switch(search_type) { + case chaos::NodeType::NodeSearchType::node_type_us: + type_of_node = chaos::NodeType::NODE_TYPE_UNIT_SERVER; + break; + case chaos::NodeType::NodeSearchType::node_type_cu: + type_of_node = chaos::NodeType::NODE_TYPE_CONTROL_UNIT; + break; + case chaos::NodeType::NodeSearchType::node_type_agent: + type_of_node = chaos::NodeType::NODE_TYPE_AGENT; + break; + case chaos::NodeType::NodeSearchType::node_type_cds: + type_of_node = chaos::NodeType::NODE_TYPE_DATA_SERVICE; + break; + case chaos::NodeType::NodeSearchType::node_type_wan: + type_of_node = chaos::NodeType::NODE_TYPE_WAN_PROXY; + break; + case chaos::NodeType::NodeSearchType::node_type_root: + type_of_node = chaos::NodeType::NODE_TYPE_ROOT; + break; + default: + break; } - - //filter on type - if(search_type>0) { - BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_us,chaos::NodeType::NODE_TYPE_UNIT_SERVER); - BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_cu,chaos::NodeType::NODE_TYPE_CONTROL_UNIT); - BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_agent,chaos::NodeType::NODE_TYPE_AGENT); - BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_cds,chaos::NodeType::NODE_TYPE_DATA_SERVICE); - BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_wan,chaos::NodeType::NODE_TYPE_WAN_PROXY); - BUILD_SEARCH(chaos::NodeType::NodeSearchType::node_type_root,chaos::NodeType::NODE_TYPE_ROOT); - - bson_find_and<<BSON("$or"<<bson_find_or.arr()); - - - /* - switch(search_type) { - case chaos::NodeType::NodeSearchType::node_type_us: - type_of_node = chaos::NodeType::NODE_TYPE_UNIT_SERVER; - break; - case chaos::NodeType::NodeSearchType::node_type_cu: - type_of_node = chaos::NodeType::NODE_TYPE_CONTROL_UNIT; - break; - case chaos::NodeType::NodeSearchType::node_type_agent: - type_of_node = chaos::NodeType::NODE_TYPE_AGENT; - break; - case chaos::NodeType::NodeSearchType::node_type_cds: - type_of_node = chaos::NodeType::NODE_TYPE_DATA_SERVICE; - break; - case chaos::NodeType::NodeSearchType::node_type_wan: - type_of_node = chaos::NodeType::NODE_TYPE_WAN_PROXY; - break; - case chaos::NodeType::NodeSearchType::node_type_root: - type_of_node = chaos::NodeType::NODE_TYPE_ROOT; - break; - default: - break; + switch(search_type){ + case chaos::NodeType::NodeSearchType::node_type_all_server:{ + MDBNDA_DBG << "QUERY SERVER but:"<<criteria; + bson_find_or<<BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_UNIT_SERVER)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_WAN_PROXY)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_AGENT)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_DATA_SERVICE); + bson_find_and<<BSON("$or"<<bson_find_or.arr()); + break; } - switch(search_type){ - case chaos::NodeType::NodeSearchType::node_type_all_server:{ - MDBNDA_DBG << "QUERY SERVER but:"<<criteria; - bson_find_or<<BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_UNIT_SERVER)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_WAN_PROXY)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_AGENT)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_DATA_SERVICE); - bson_find_and<<BSON("$or"<<bson_find_or.arr()); - break; - } - case chaos::NodeType::NodeSearchType::node_type_ceu:{ - bson_find_or<<BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); - bson_find_and<<BSON("$or"<<bson_find_or.arr()); - break; - } - case chaos::NodeType::NodeSearchType::node_type_all:{ - bson_find_or<<BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_UNIT_SERVER)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_WAN_PROXY)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_AGENT)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_DATA_SERVICE)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< - BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); - bson_find_and<<BSON("$or"<<bson_find_or.arr()); - - break; - } - default: - bson_find_and << BSON( chaos::NodeDefinitionKey::NODE_TYPE << type_of_node); + case chaos::NodeType::NodeSearchType::node_type_ceu:{ + bson_find_or<<BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); + bson_find_and<<BSON("$or"<<bson_find_or.arr()); + break; + } + case chaos::NodeType::NodeSearchType::node_type_all:{ + bson_find_or<<BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_UNIT_SERVER)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_WAN_PROXY)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_AGENT)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_DATA_SERVICE)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_ROOT)<< + BSON( chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); + bson_find_and<<BSON("$or"<<bson_find_or.arr()); break; + } + default: + bson_find_and << BSON( chaos::NodeDefinitionKey::NODE_TYPE << type_of_node); - - }*/ - - - } + break; + + + }*/ + } #ifdef HEALTH_ON_DB - - if(alive_only){bson_find_and << getAliveOption(6);} -#endif - //compose the 'or' condition for all token of unique_id filed - if(criteria.size()>0){ - bson_find_and << BSON("$or" << getSearchTokenOnFiled(criteria, chaos::NodeDefinitionKey::NODE_UNIQUE_ID)); - } - if((impl.size()>0)){ - bson_find_and << BSON("$or" << getSearchTokenOnFiled(impl, "instance_description.control_unit_implementation")); - } - bson_find.appendArray("$and", bson_find_and.obj()); - mongo::BSONObj q = bson_find.obj(); - mongo::BSONObj p = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << 1 << - chaos::NodeDefinitionKey::NODE_TYPE << 1 << - chaos::NodeDefinitionKey::NODE_RPC_ADDR << 1 << - "seq" << 1 << - "health_stat" <<1<< - "instance_description.control_unit_implementation"<<1); - DEBUG_CODE(MDBNDA_DBG<<log_message("searchNode", + if (alive_only) { + bson_find_and << getAliveOption(6); + } +#endif + // compose the 'or' condition for all token of unique_id filed + if (criteria.size() > 0) { + bson_find_and << BSON("$or" << getSearchTokenOnFiled(criteria, chaos::NodeDefinitionKey::NODE_UNIQUE_ID)); + } + if ((impl.size() > 0)) { + bson_find_and << BSON("$or" << getSearchTokenOnFiled(impl, "instance_description.control_unit_implementation")); + } + bson_find.appendArray("$and", bson_find_and.obj()); + mongo::BSONObj q = bson_find.obj(); + mongo::BSONObj p = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << 1 << chaos::NodeDefinitionKey::NODE_TYPE << 1 << chaos::NodeDefinitionKey::NODE_RPC_ADDR << 1 << "seq" << 1 << "health_stat" << 1 << "instance_description.control_unit_implementation" << 1); + DEBUG_CODE(MDBNDA_DBG << log_message("searchNode", "performPagedQuery", DATA_ACCESS_LOG_2_ENTRY("Query", "Projection", q.jsonString(), p.jsonString()));) - - //perform the search for the query page - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - &p, - NULL, - page_length))) { - MDBNDA_ERR << "Error calling performPagedQuery with error" << err; - } else { - DEBUG_CODE(MDBNDA_DBG << "The query '"<< q.toString() <<"' has found " << paged_result.size() << " result";) - if(paged_result.size()) { - *result = new CDataWrapper(); - for (SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - std::string node_uid_found; - try { - CDataWrapper cd; - cd.addStringValue(chaos::NodeDefinitionKey::NODE_UNIQUE_ID, node_uid_found = it->getField(chaos::NodeDefinitionKey::NODE_UNIQUE_ID).String()); - - cd.addStringValue(chaos::NodeDefinitionKey::NODE_TYPE, it->getField(chaos::NodeDefinitionKey::NODE_TYPE).String()); - if(cd.hasKey(chaos::NodeDefinitionKey::NODE_RPC_ADDR)) { - cd.addStringValue(chaos::NodeDefinitionKey::NODE_RPC_ADDR, it->getField(chaos::NodeDefinitionKey::NODE_RPC_ADDR).String()); - } - if(it->hasField("seq")){ - cd.addInt64Value("seq", (int64_t)it->getField("seq").Long()); - } /*else { - cd.addInt64Value("seq", (int64_t)0); - }*/ - - if(it->hasField("health_stat")) { - mongo::BSONElement health_stat_element = it->getField("health_stat"); - if(health_stat_element.type() == mongo::Object) { - mongo::BSONObj o = health_stat_element.embeddedObject(); - //we can retrieve the data - CDataWrapper health; - health.addInt64Value(chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP).date().asInt64()); - health.addInt64Value(chaos::NodeHealtDefinitionKey::NODE_HEALT_PROCESS_UPTIME, (int64_t)o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_PROCESS_UPTIME).Long()); - health.addDoubleValue(chaos::NodeHealtDefinitionKey::NODE_HEALT_USER_TIME, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_USER_TIME).Double()); - health.addDoubleValue(chaos::NodeHealtDefinitionKey::NODE_HEALT_SYSTEM_TIME, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_SYSTEM_TIME).Double()); - health.addStringValue(chaos::NodeHealtDefinitionKey::NODE_HEALT_STATUS, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_STATUS).String()); - cd.addCSDataValue("health_stat", health); - } - } + + // perform the search for the query page + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + &p, + NULL, + page_length))) { + MDBNDA_ERR << "Error calling performPagedQuery with error" << err; + } else { + DEBUG_CODE(MDBNDA_DBG << "The query '" << q.toString() << "' has found " << paged_result.size() << " result";) + if (paged_result.size()) { + *result = new CDataWrapper(); + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + std::string node_uid_found; + try { + CDataWrapper cd; + cd.addStringValue(chaos::NodeDefinitionKey::NODE_UNIQUE_ID, node_uid_found = it->getField(chaos::NodeDefinitionKey::NODE_UNIQUE_ID).String()); + + cd.addStringValue(chaos::NodeDefinitionKey::NODE_TYPE, it->getField(chaos::NodeDefinitionKey::NODE_TYPE).String()); + if (cd.hasKey(chaos::NodeDefinitionKey::NODE_RPC_ADDR)) { + cd.addStringValue(chaos::NodeDefinitionKey::NODE_RPC_ADDR, it->getField(chaos::NodeDefinitionKey::NODE_RPC_ADDR).String()); + } + if (it->hasField("seq")) { + cd.addInt64Value("seq", (int64_t)it->getField("seq").Long()); + } /*else { + cd.addInt64Value("seq", (int64_t)0); + }*/ + + if (it->hasField("health_stat")) { + mongo::BSONElement health_stat_element = it->getField("health_stat"); + if (health_stat_element.type() == mongo::Object) { + mongo::BSONObj o = health_stat_element.embeddedObject(); + // we can retrieve the data + CDataWrapper health; + health.addInt64Value(chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP).date().asInt64()); + health.addInt64Value(chaos::NodeHealtDefinitionKey::NODE_HEALT_PROCESS_UPTIME, (int64_t)o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_PROCESS_UPTIME).Long()); + health.addDoubleValue(chaos::NodeHealtDefinitionKey::NODE_HEALT_USER_TIME, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_USER_TIME).Double()); + health.addDoubleValue(chaos::NodeHealtDefinitionKey::NODE_HEALT_SYSTEM_TIME, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_SYSTEM_TIME).Double()); + health.addStringValue(chaos::NodeHealtDefinitionKey::NODE_HEALT_STATUS, o.getField(chaos::NodeHealtDefinitionKey::NODE_HEALT_STATUS).String()); + cd.addCSDataValue("health_stat", health); + } + } #ifdef HEALTH_ON_DB - (*result)->appendCDataWrapperToArray(cd); + (*result)->appendCDataWrapperToArray(cd); #else - if(alive_only){ - bool alive = ChaosMetadataService::getInstance()->isNodeAlive(node_uid_found); - if(alive){ - (*result)->appendCDataWrapperToArray(cd); - - } - - } else { - (*result)->appendCDataWrapperToArray(cd); + if (alive_only) { + bool alive = ChaosMetadataService::getInstance()->isNodeAlive(node_uid_found); + if (alive) { + (*result)->appendCDataWrapperToArray(cd); + } - } + } else { + (*result)->appendCDataWrapperToArray(cd); + } #endif - } catch(...) { - MDBNDA_ERR << "Exception during scan of found node:" << node_uid_found; - } - } - (*result)->finalizeArrayForKey(chaos::NodeType::NODE_SEARCH_LIST_KEY); + } catch (...) { + MDBNDA_ERR << "Exception during scan of found node:" << node_uid_found; } + } + (*result)->finalizeArrayForKey(chaos::NodeType::NODE_SEARCH_LIST_KEY); } - return err; + } + return err; } -int MongoDBNodeDataAccess::setProperty(const std::string& node_uid, +int MongoDBNodeDataAccess::setProperty(const std::string& node_uid, const PropertyGroupVector& property_group_vector) { - int err = 0; - int size = 0; - try { - chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(PropertyGroupVector, const_cast<PropertyGroupVector&>(property_group_vector))); - pg_sdw.serialization_key = "property"; - mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid); - mongo::BSONObj u = BSON("$set" << mongo::BSONObj(pg_sdw.serialize()->getBSONRawData(size))); - DEBUG_CODE(MDBNDA_DBG<<log_message("setProperty", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q.jsonString(), - u.jsonString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u))){ - MDBNDA_ERR << CHAOS_FORMAT("Error setting property for %1%",%node_uid); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + int size = 0; + try { + chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(PropertyGroupVector, const_cast<PropertyGroupVector&>(property_group_vector))); + pg_sdw.serialization_key = "property"; + mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid); + mongo::BSONObj u = BSON("$set" << mongo::BSONObj(pg_sdw.serialize()->getBSONRawData(size))); + DEBUG_CODE(MDBNDA_DBG << log_message("setProperty", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q.jsonString(), + u.jsonString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u))) { + MDBNDA_ERR << CHAOS_FORMAT("Error setting property for %1%", % node_uid); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -PropertyGroup *getPrgFromVec(const std::string& group_name, +PropertyGroup* getPrgFromVec(const std::string& group_name, chaos::common::property::PropertyGroupVector& property_group_vector) { - PropertyGroup *res_ptr = NULL; - for(PropertyGroupVectorIterator it = property_group_vector.begin(), - end = property_group_vector.end(); - it != end; - it++) { - if(it->getGroupName().compare(group_name) != 0) continue; - res_ptr = &(*it); - break; - } - return res_ptr; + PropertyGroup* res_ptr = NULL; + for (PropertyGroupVectorIterator it = property_group_vector.begin(), + end = property_group_vector.end(); + it != end; + it++) { + if (it->getGroupName().compare(group_name) != 0) continue; + res_ptr = &(*it); + break; + } + return res_ptr; } -//update porperty without removing old, if old are present the value are pushed -int MongoDBNodeDataAccess::updatePropertyDefaultValue(const std::string& node_uid, +// update porperty without removing old, if old are present the value are pushed +int MongoDBNodeDataAccess::updatePropertyDefaultValue(const std::string& node_uid, const chaos::common::property::PropertyGroupVector& property_group_vector) { - int err = 0; - int size = 0; - - //get store default and update or add new - PropertyGroupVector property_stored; - if((err = getProperty(data_access::PropertyTypeDefaultValues, - node_uid, property_stored)) != 0) return err; - - for(PropertyGroupVectorConstIterator it = property_group_vector.begin(), - end = property_group_vector.end(); - it != end; - it++) { - const std::string group_name = it->getGroupName(); - - PropertyGroup *pg = getPrgFromVec(group_name, property_stored); - if(pg != NULL) { - pg->copyPropertiesFromGroup(*it, true); - } else { - property_stored.push_back(*it); - } + int err = 0; + int size = 0; + + // get store default and update or add new + PropertyGroupVector property_stored; + if ((err = getProperty(data_access::PropertyTypeDefaultValues, + node_uid, + property_stored)) != 0) return err; + + for (PropertyGroupVectorConstIterator it = property_group_vector.begin(), + end = property_group_vector.end(); + it != end; + it++) { + const std::string group_name = it->getGroupName(); + + PropertyGroup* pg = getPrgFromVec(group_name, property_stored); + if (pg != NULL) { + pg->copyPropertiesFromGroup(*it, true); + } else { + property_stored.push_back(*it); } - //no we can update all defaults - try { - chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(PropertyGroupVector, const_cast<PropertyGroupVector&>(property_stored))); - pg_sdw.serialization_key = "property_defaults"; - mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid); - mongo::BSONObj u = BSON("$set" << mongo::BSONObj(pg_sdw.serialize()->getBSONRawData(size))); - DEBUG_CODE(MDBNDA_DBG<<log_message("updatePropertyDefaultValue", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q.jsonString(), - u.jsonString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u))){ - MDBNDA_ERR << CHAOS_FORMAT("Error updating property default values for %1%",%node_uid); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + } + // no we can update all defaults + try { + chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(PropertyGroupVector, const_cast<PropertyGroupVector&>(property_stored))); + pg_sdw.serialization_key = "property_defaults"; + mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid); + mongo::BSONObj u = BSON("$set" << mongo::BSONObj(pg_sdw.serialize()->getBSONRawData(size))); + DEBUG_CODE(MDBNDA_DBG << log_message("updatePropertyDefaultValue", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q.jsonString(), + u.jsonString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u))) { + MDBNDA_ERR << CHAOS_FORMAT("Error updating property default values for %1%", % node_uid); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBNodeDataAccess::getProperty(const data_access::PropertyType property_type, - const std::string& node_uid, +int MongoDBNodeDataAccess::getProperty(const data_access::PropertyType property_type, + const std::string& node_uid, chaos::common::property::PropertyGroupVector& property_group_vector) { - int err = 0; - try { - std::string property_key; - switch (property_type) { - case data_access::PropertyTypeDescription: - property_key = "property"; - break; - - case data_access::PropertyTypeDefaultValues: - property_key = "property_defaults"; - break; - } - mongo::BSONObj found_property; - mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid << - property_key << BSON("$exists" << true)); - mongo::BSONObj p = BSON(property_key << 1); - DEBUG_CODE(MDBNDA_DBG<<log_message("getProperty", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(found_property, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - &p))){ - MDBNDA_ERR << CHAOS_FORMAT("Error retriving property for %1%",%node_uid); - } - if(!found_property.isEmpty()) { - CDWUniquePtr prop_ser(new CDataWrapper(found_property.objdata())); - chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(PropertyGroupVector, property_group_vector)); - pg_sdw.serialization_key = property_key; - pg_sdw.deserialize(prop_ser.get()); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + try { + std::string property_key; + switch (property_type) { + case data_access::PropertyTypeDescription: + property_key = "property"; + break; + + case data_access::PropertyTypeDefaultValues: + property_key = "property_defaults"; + break; } - return err; + mongo::BSONObj found_property; + mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid << property_key << BSON("$exists" << true)); + mongo::BSONObj p = BSON(property_key << 1); + DEBUG_CODE(MDBNDA_DBG << log_message("getProperty", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(found_property, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + &p))) { + MDBNDA_ERR << CHAOS_FORMAT("Error retriving property for %1%", % node_uid); + } + if (!found_property.isEmpty()) { + CDWUniquePtr prop_ser(new CDataWrapper(found_property.objdata())); + chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw(CHAOS_DATA_WRAPPER_REFERENCE_AUTO_PTR(PropertyGroupVector, property_group_vector)); + pg_sdw.serialization_key = property_key; + pg_sdw.deserialize(prop_ser.get()); + } + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBNodeDataAccess::getPropertyGroup(const data_access::PropertyType property_type, - const std::string& node_uid, - const std::string& property_group_name, +int MongoDBNodeDataAccess::getPropertyGroup(const data_access::PropertyType property_type, + const std::string& node_uid, + const std::string& property_group_name, chaos::common::property::PropertyGroup& property_group) { - int err = 0; - try { - std::string property_key; - switch (property_type) { - case data_access::PropertyTypeDescription: - property_key = "property"; - break; - - case data_access::PropertyTypeDefaultValues: - property_key = "property_defaults"; - break; - } - mongo::BSONObj found_property; - mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid << - property_key << BSON("$exists" << true) << - CHAOS_FORMAT("%1%.property_g_name", %property_key) << property_group_name); - mongo::BSONObj p = BSON("_id" << 0 << CHAOS_FORMAT("%1%", %property_key) << 1); - DEBUG_CODE(MDBNDA_DBG<<log_message("getProperty", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(found_property, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - &p))){ - MDBNDA_ERR << CHAOS_FORMAT("Error retriving property for %1%",%node_uid); - } - if(!found_property.isEmpty()) { - CDWUniquePtr prop_ser(new CDataWrapper(found_property.objdata())); - chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw; - pg_sdw.serialization_key = property_key; - pg_sdw.deserialize(prop_ser.get()); - if(pg_sdw().size()) { - property_group = pg_sdw()[0]; - } - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + try { + std::string property_key; + switch (property_type) { + case data_access::PropertyTypeDescription: + property_key = "property"; + break; + + case data_access::PropertyTypeDefaultValues: + property_key = "property_defaults"; + break; } - return err; + mongo::BSONObj found_property; + mongo::BSONObj q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << node_uid << property_key << BSON("$exists" << true) << CHAOS_FORMAT("%1%.property_g_name", % property_key) << property_group_name); + mongo::BSONObj p = BSON("_id" << 0 << CHAOS_FORMAT("%1%", % property_key) << 1); + DEBUG_CODE(MDBNDA_DBG << log_message("getProperty", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(found_property, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + &p))) { + MDBNDA_ERR << CHAOS_FORMAT("Error retriving property for %1%", % node_uid); + } + if (!found_property.isEmpty()) { + CDWUniquePtr prop_ser(new CDataWrapper(found_property.objdata())); + chaos::common::property::PropertyGroupVectorSDWrapper pg_sdw; + pg_sdw.serialization_key = property_key; + pg_sdw.deserialize(prop_ser.get()); + if (pg_sdw().size()) { + property_group = pg_sdw()[0]; + } + } + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::checkCommandPresence(const std::string& command_unique_id, - bool& presence) { - int err = 0; - mongo::BSONObj result; - try { - mongo::BSONObj q = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); - - DEBUG_CODE(MDBNDA_DBG<<log_message("checkCommandPresence", - "find", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), - q))){ - MDBNDA_ERR << boost::str(boost::format("Error checking presence for command uid:%1%")%command_unique_id); - } - presence = !result.isEmpty(); - } catch (const mongo::DBException &e) { - presence = false; - MDBNDA_ERR << e.what(); - err = e.getCode(); + bool& presence) { + int err = 0; + mongo::BSONObj result; + try { + mongo::BSONObj q = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); + + DEBUG_CODE(MDBNDA_DBG << log_message("checkCommandPresence", + "find", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), + q))) { + MDBNDA_ERR << boost::str(boost::format("Error checking presence for command uid:%1%") % command_unique_id); } - return err; + presence = !result.isEmpty(); + } catch (const mongo::DBException& e) { + presence = false; + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::setCommand(chaos::common::data::CDataWrapper& command) { - int err = 0; - mongo::BSONObj result; - mongo::BSONObjBuilder update_builder; - try { - if(!command.hasKey(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID)) { - return -1; - MDBNDA_ERR << "No command uid found"; - } - if(!command.hasKey(BatchCommandAndParameterDescriptionkey::BC_ALIAS)) { - return -2; - MDBNDA_ERR << "No command alias found"; - } - if(!command.hasKey(BatchCommandAndParameterDescriptionkey::BC_DESCRIPTION)) { - return -3; - MDBNDA_ERR << "No command description found"; - } - ChaosUniquePtr<SerializationBuffer> ser(command.getBSONData()); - mongo::BSONObj i(ser->getBufferPtr()); - - mongo::BSONObj query = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command.getStringValue(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID)); - - update_builder.append(i.getField(BatchCommandAndParameterDescriptionkey::BC_ALIAS)); - update_builder.append(i.getField(BatchCommandAndParameterDescriptionkey::BC_DESCRIPTION)); - if(i.hasElement(BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)){ - //we have parameters - update_builder.append(i.getField(BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)); - } - mongo::BSONObj update = BSON("$set" << update_builder.obj()); - - DEBUG_CODE(MDBNDA_DBG<<log_message("updateUS", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - query.jsonString(), - update.jsonString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), - query, - update, - true))) { - MDBNDA_ERR << "Error updating NODE command:" << command.getCompliantJSONString()<<" err:"<<err; - } - - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + mongo::BSONObj result; + mongo::BSONObjBuilder update_builder; + try { + if (!command.hasKey(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID)) { + return -1; + MDBNDA_ERR << "No command uid found"; + } + if (!command.hasKey(BatchCommandAndParameterDescriptionkey::BC_ALIAS)) { + return -2; + MDBNDA_ERR << "No command alias found"; + } + if (!command.hasKey(BatchCommandAndParameterDescriptionkey::BC_DESCRIPTION)) { + return -3; + MDBNDA_ERR << "No command description found"; + } + ChaosUniquePtr<SerializationBuffer> ser(command.getBSONData()); + mongo::BSONObj i(ser->getBufferPtr()); + + mongo::BSONObj query = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command.getStringValue(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID)); + + update_builder.append(i.getField(BatchCommandAndParameterDescriptionkey::BC_ALIAS)); + update_builder.append(i.getField(BatchCommandAndParameterDescriptionkey::BC_DESCRIPTION)); + if (i.hasElement(BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)) { + // we have parameters + update_builder.append(i.getField(BatchCommandAndParameterDescriptionkey::BC_PARAMETERS)); + } + mongo::BSONObj update = BSON("$set" << update_builder.obj()); + + DEBUG_CODE(MDBNDA_DBG << log_message("updateUS", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + query.jsonString(), + update.jsonString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), + query, + update, + true))) { + MDBNDA_ERR << "Error updating NODE command:" << command.getCompliantJSONString() << " err:" << err; } - return err; + + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBNodeDataAccess::getCommand(const std::string& command_unique_id, - chaos::common::data::CDataWrapper **command) { - int err = 0; - mongo::BSONObj result; - try { - //create query - mongo::BSONObj q = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); - - DEBUG_CODE(MDBNDA_DBG<<log_message("getCommand", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), - q))){ - MDBNDA_ERR << boost::str(boost::format("Error searching the command uid:%2%")%command_unique_id); - } else if(result.isEmpty()) { - MDBNDA_ERR << boost::str(boost::format("No command for uid:%2%")%command_unique_id); - } else { - //return a new datawrapper with the found content - *command = new CDataWrapper(result.objdata()); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); +int MongoDBNodeDataAccess::getCommand(const std::string& command_unique_id, + chaos::common::data::CDataWrapper** command) { + int err = 0; + mongo::BSONObj result; + try { + // create query + mongo::BSONObj q = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); + + DEBUG_CODE(MDBNDA_DBG << log_message("getCommand", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), + q))) { + MDBNDA_ERR << boost::str(boost::format("Error searching the command uid:%2%") % command_unique_id); + } else if (result.isEmpty()) { + MDBNDA_ERR << boost::str(boost::format("No command for uid:%2%") % command_unique_id); + } else { + // return a new datawrapper with the found content + *command = new CDataWrapper(result.objdata()); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } //! inherited method int MongoDBNodeDataAccess::deleteCommand(const std::string& command_unique_id) { - int err = 0; - try { - //create query - mongo::BSONObj q = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); - - DEBUG_CODE(MDBNDA_DBG<<log_message("deleteCommandTemplate", - "delete", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), - q))){ - MDBNDA_ERR << boost::str(boost::format("Error removing the command uid:%2%")%command_unique_id); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + try { + // create query + mongo::BSONObj q = BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); + + DEBUG_CODE(MDBNDA_DBG << log_message("deleteCommandTemplate", + "delete", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND), + q))) { + MDBNDA_ERR << boost::str(boost::format("Error removing the command uid:%2%") % command_unique_id); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::checkCommandTemplatePresence(const std::string& template_name, const std::string& command_unique_id, - bool& presence) { - int err = 0; - mongo::BSONObj result; - try { - mongo::BSONObj q = BSON("template_name" << template_name << - BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); - - DEBUG_CODE(MDBNDA_DBG<<log_message("checkCommandTemplatePresence", - "find", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), - q))){ - MDBNDA_ERR << boost::str(boost::format("Error searching template name: %1% for command uid:%2%")%template_name%command_unique_id); - } - presence = !result.isEmpty(); - } catch (const mongo::DBException &e) { - presence = false; - MDBNDA_ERR << e.what(); - err = e.getCode(); + bool& presence) { + int err = 0; + mongo::BSONObj result; + try { + mongo::BSONObj q = BSON("template_name" << template_name << BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); + + DEBUG_CODE(MDBNDA_DBG << log_message("checkCommandTemplatePresence", + "find", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), + q))) { + MDBNDA_ERR << boost::str(boost::format("Error searching template name: %1% for command uid:%2%") % template_name % command_unique_id); } - return err; + presence = !result.isEmpty(); + } catch (const mongo::DBException& e) { + presence = false; + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::setCommandTemplate(chaos::common::data::CDataWrapper& command_template) { - int err = 0; - try { - if(!command_template.hasKey("template_name") || - !command_template.hasKey(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID)) { - MDBNDA_ERR << boost::str(boost::format("The key 'template_name' and '%2%' are mandatory!")%"template_name"%BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID); - return -1; - } - - std::string template_name = command_template.getStringValue("template_name"); - std::string command_unique_id = command_template.getStringValue(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID); - - //create query - mongo::BSONObj q = BSON("template_name" << template_name << - BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); - - //create the update package (all key imnus the first two used before - ChaosUniquePtr<chaos::common::data::CDataWrapper> to_update(new CDataWrapper()); - to_update->addStringValue("type", "template"); - std::vector<std::string> all_keys; - command_template.getAllKey(all_keys); - - for(std::vector<std::string>::iterator it = all_keys.begin(); - it != all_keys.end(); - it++) { - if((it->compare("template_name")==0) || - (it->compare(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID)==0)) continue; - - //copy the key if present - command_template.copyKeyTo(*it, *to_update); - } - - ChaosUniquePtr<SerializationBuffer> chaos_bson(to_update->getBSONData()); - mongo::BSONObj u = BSON("$set" << mongo::BSONObj(chaos_bson->getBufferPtr())); - - DEBUG_CODE(MDBNDA_DBG<<log_message("setCommandTemplate", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "update", - q.jsonString(), - u.jsonString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), - q, - u, - true))){ - MDBNDA_ERR << boost::str(boost::format("Error setting the template name: %1% for command uid:%2%")%template_name%command_unique_id); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + try { + if (!command_template.hasKey("template_name") || + !command_template.hasKey(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID)) { + MDBNDA_ERR << boost::str(boost::format("The key 'template_name' and '%2%' are mandatory!") % "template_name" % BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID); + return -1; + } + + std::string template_name = command_template.getStringValue("template_name"); + std::string command_unique_id = command_template.getStringValue(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID); + + // create query + mongo::BSONObj q = BSON("template_name" << template_name << BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); + + // create the update package (all key imnus the first two used before + ChaosUniquePtr<chaos::common::data::CDataWrapper> to_update(new CDataWrapper()); + to_update->addStringValue("type", "template"); + std::vector<std::string> all_keys; + command_template.getAllKey(all_keys); + + for (std::vector<std::string>::iterator it = all_keys.begin(); + it != all_keys.end(); + it++) { + if ((it->compare("template_name") == 0) || + (it->compare(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID) == 0)) continue; + + // copy the key if present + command_template.copyKeyTo(*it, *to_update); } - return err; + + ChaosUniquePtr<SerializationBuffer> chaos_bson(to_update->getBSONData()); + mongo::BSONObj u = BSON("$set" << mongo::BSONObj(chaos_bson->getBufferPtr())); + + DEBUG_CODE(MDBNDA_DBG << log_message("setCommandTemplate", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "update", + q.jsonString(), + u.jsonString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), + q, + u, + true))) { + MDBNDA_ERR << boost::str(boost::format("Error setting the template name: %1% for command uid:%2%") % template_name % command_unique_id); + } + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBNodeDataAccess::deleteCommandTemplate(const std::string& template_name, const std::string& command_unique_id) { - int err = 0; - try { - //create query - mongo::BSONObj q = BSON("template_name" << template_name << - BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); - - DEBUG_CODE(MDBNDA_DBG<<log_message("deleteCommandTemplate", - "delete", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), - q))){ - MDBNDA_ERR << boost::str(boost::format("Error removing the template name: %1% for command uid:%2%")%template_name%command_unique_id); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + try { + // create query + mongo::BSONObj q = BSON("template_name" << template_name << BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); + + DEBUG_CODE(MDBNDA_DBG << log_message("deleteCommandTemplate", + "delete", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), + q))) { + MDBNDA_ERR << boost::str(boost::format("Error removing the template name: %1% for command uid:%2%") % template_name % command_unique_id); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBNodeDataAccess::getCommandTemplate(const std::string& template_name, - const std::string& command_unique_id, - chaos::common::data::CDataWrapper **command_template) { - int err = 0; - mongo::BSONObj result; - try { - //create query - mongo::BSONObj q = BSON("template_name" << template_name << - BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); - - DEBUG_CODE(MDBNDA_DBG<<log_message("getCommandTemplate", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.jsonString()));) - - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), - q))){ - MDBNDA_ERR << boost::str(boost::format("Error searching the template name: %1% for command uid:%2%")%template_name%command_unique_id); - } else if(result.isEmpty()) { - MDBNDA_ERR << boost::str(boost::format("No template found for template name: %1% and command uid:%2%")%template_name%command_unique_id); - } else { - //return a new datawrapper with the found content - *command_template = new CDataWrapper(result.objdata()); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = e.getCode(); +int MongoDBNodeDataAccess::getCommandTemplate(const std::string& template_name, + const std::string& command_unique_id, + chaos::common::data::CDataWrapper** command_template) { + int err = 0; + mongo::BSONObj result; + try { + // create query + mongo::BSONObj q = BSON("template_name" << template_name << BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << command_unique_id); + + DEBUG_CODE(MDBNDA_DBG << log_message("getCommandTemplate", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.jsonString()));) + + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), + q))) { + MDBNDA_ERR << boost::str(boost::format("Error searching the template name: %1% for command uid:%2%") % template_name % command_unique_id); + } else if (result.isEmpty()) { + MDBNDA_ERR << boost::str(boost::format("No template found for template name: %1% and command uid:%2%") % template_name % command_unique_id); + } else { + // return a new datawrapper with the found content + *command_template = new CDataWrapper(result.objdata()); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = e.getCode(); + } + return err; } //! inherited method -int MongoDBNodeDataAccess::searchCommandTemplate(chaos::common::data::CDataWrapper **result, - const std::vector<std::string>& cmd_uid_to_filter, - uint32_t last_unique_id, - uint32_t page_length) { - int err = 0; - - mongo::BSONObjBuilder bson_find; - mongo::BSONArrayBuilder bson_uid_array_list; - mongo::BSONArrayBuilder bson_find_and; - SearchResult paged_result; - - //compose query - - //filter on sequence - bson_find_and << BSON( "seq" << BSON("$gte"<<last_unique_id)); - - //filter on type - for(std::vector<std::string>::const_iterator it = cmd_uid_to_filter.begin(); - it != cmd_uid_to_filter.end(); - it++) { - bson_uid_array_list << *it; - } - - //compose the or - bson_find_and << BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << BSON("$in" << bson_uid_array_list.arr())); - bson_find.appendArray("$and", bson_find_and.obj()); - mongo::BSONObj q = bson_find.obj(); - mongo::BSONObj p = BSON("template_name" << 1 << - BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << 1); - DEBUG_CODE(MDBNDA_DBG<<log_message("searchCommandTemplate", +int MongoDBNodeDataAccess::searchCommandTemplate(chaos::common::data::CDataWrapper** result, + const std::vector<std::string>& cmd_uid_to_filter, + uint32_t last_unique_id, + uint32_t page_length) { + int err = 0; + + mongo::BSONObjBuilder bson_find; + mongo::BSONArrayBuilder bson_uid_array_list; + mongo::BSONArrayBuilder bson_find_and; + SearchResult paged_result; + + // compose query + + // filter on sequence + bson_find_and << BSON("seq" << BSON("$gte" << last_unique_id)); + + // filter on type + for (std::vector<std::string>::const_iterator it = cmd_uid_to_filter.begin(); + it != cmd_uid_to_filter.end(); + it++) { + bson_uid_array_list << *it; + } + + // compose the or + bson_find_and << BSON(BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << BSON("$in" << bson_uid_array_list.arr())); + bson_find.appendArray("$and", bson_find_and.obj()); + mongo::BSONObj q = bson_find.obj(); + mongo::BSONObj p = BSON("template_name" << 1 << BatchCommandAndParameterDescriptionkey::BC_UNIQUE_ID << 1); + DEBUG_CODE(MDBNDA_DBG << log_message("searchCommandTemplate", "performPagedQuery", DATA_ACCESS_LOG_2_ENTRY("Query", "Projection", q.jsonString(), p.jsonString()));) - - //perform the search for the query page - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), - q, - NULL, - NULL, - page_length))) { - MDBNDA_ERR << "Error calling performPagedQuery with error" << err; - } else { - DEBUG_CODE(MDBNDA_DBG << "The query '"<< q.toString() <<"' has found " << paged_result.size() << " result";) - if(paged_result.size()) { - *result = new CDataWrapper(); - for (SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - CDataWrapper cd(it->objdata()); - (*result)->appendCDataWrapperToArray(cd); - } - (*result)->finalizeArrayForKey("cmd_tmpl_search_result_page"); + + // perform the search for the query page + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE), + q, + NULL, + NULL, + page_length))) { + MDBNDA_ERR << "Error calling performPagedQuery with error" << err; + } else { + DEBUG_CODE(MDBNDA_DBG << "The query '" << q.toString() << "' has found " << paged_result.size() << " result";) + if (paged_result.size()) { + *result = new CDataWrapper(); + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + if (it->objdata()) { + CDataWrapper cd(it->objdata()); + (*result)->appendCDataWrapperToArray(cd); } + } + (*result)->finalizeArrayForKey("cmd_tmpl_search_result_page"); } - return err; + } + return err; } int MongoDBNodeDataAccess::addAgeingManagementDataToNode(const std::string& control_unit_id) { - int err = 0; - try { - uint64_t current_ts = TimingUtil::getTimeStamp(); - const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); - const std::string key_last_checing_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); - const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); - - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_id - << MONGODB_COLLECTION_NODES_AGEING_INFO << BSON("$exists" << false )); - - mongo::BSONObj update = BSON("$set" << BSON(key_last_checing_time << mongo::Date_t(current_ts) << - key_last_performed_time << mongo::Date_t(current_ts) << - key_processing_ageing << false)); - - - DEBUG_CODE(MDBNDA_DBG<<log_message("completeNodeForAgeingManagement", - "update", - DATA_ACCESS_LOG_2_ENTRY("query", - "update", - query.jsonString(), - update.jsonString()));) - //remove the field of the document - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query, - update))) { - MDBNDA_DBG << CHAOS_FORMAT("Error %1% completing NODE %2% with ageing management information", %err%control_unit_id); - } - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBNDA_ERR << e.what(); - err = e.errorCode; + int err = 0; + try { + uint64_t current_ts = TimingUtil::getTimeStamp(); + const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_PROCESSING_AGEING); + const std::string key_last_checing_time = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); + const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%", % MONGODB_COLLECTION_NODES_AGEING_INFO % MONGODB_COLLECTION_NODES_PERFORMED_AGEING); + + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << control_unit_id + << MONGODB_COLLECTION_NODES_AGEING_INFO << BSON("$exists" << false)); + + mongo::BSONObj update = BSON("$set" << BSON(key_last_checing_time << mongo::Date_t(current_ts) << key_last_performed_time << mongo::Date_t(current_ts) << key_processing_ageing << false)); + + DEBUG_CODE(MDBNDA_DBG << log_message("completeNodeForAgeingManagement", + "update", + DATA_ACCESS_LOG_2_ENTRY("query", + "update", + query.jsonString(), + update.jsonString()));) + // remove the field of the document + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query, + update))) { + MDBNDA_DBG << CHAOS_FORMAT("Error %1% completing NODE %2% with ageing management information", % err % control_unit_id); } - return err; + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBNDA_ERR << e.what(); + err = e.errorCode; + } + return err; } int MongoDBNodeDataAccess::isNodeAlive(const std::string& node_uid, bool& alive) { - int err = 0; - try { - mongo::BSONObj result; - mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << node_uid << - CHAOS_FORMAT("health_stat.%1%",%NodeHealtDefinitionKey::NODE_HEALT_MDS_TIMESTAMP) << - BSON("$gte" << mongo::Date_t(TimingUtil::getTimestampWithDelay((6*1000))))); - - DEBUG_CODE(MDBNDA_DBG<<log_message("isNodeAlive", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("query", - query.jsonString()));) - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - query))) { - MDBNDA_DBG << CHAOS_FORMAT("Error %1% determinating the alive state for node %2%", %err%node_uid); - } - alive = (result.isEmpty() == false); - } catch (const mongo::DBException &e) { - MDBNDA_ERR << e.what(); - err = -1; - } catch (const CException &e) { - MDBNDA_ERR << e.what(); - err = e.errorCode; + int err = 0; + try { + mongo::BSONObj result; + mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << node_uid << CHAOS_FORMAT("health_stat.%1%", % NodeHealtDefinitionKey::NODE_HEALT_MDS_TIMESTAMP) << BSON("$gte" << mongo::Date_t(TimingUtil::getTimestampWithDelay((6 * 1000))))); + + DEBUG_CODE(MDBNDA_DBG << log_message("isNodeAlive", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("query", + query.jsonString()));) + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + query))) { + MDBNDA_DBG << CHAOS_FORMAT("Error %1% determinating the alive state for node %2%", % err % node_uid); } - return err; + alive = (result.isEmpty() == false); + } catch (const mongo::DBException& e) { + MDBNDA_ERR << e.what(); + err = -1; + } catch (const CException& e) { + MDBNDA_ERR << e.what(); + err = e.errorCode; + } + return err; } -//int MongoDBNodeDataAccess::reserveNodeForAgeingManagement(uint64_t& last_sequence_id, -// std::string& node_uid_reserved, -// uint32_t& node_ageing_time, -// uint64_t& last_ageing_perform_time, -// uint64_t timeout_for_checking, -// uint64_t delay_next_check) { -// int err = 0; -// SearchResult paged_result; -// try { -// mongo::BSONObj result_found; -// mongo::BSONObjBuilder query_builder; -// mongo::BSONArrayBuilder query_ageing_and; -// mongo::BSONArrayBuilder query_ageing_or; +// int MongoDBNodeDataAccess::reserveNodeForAgeingManagement(uint64_t& last_sequence_id, +// std::string& node_uid_reserved, +// uint32_t& node_ageing_time, +// uint64_t& last_ageing_perform_time, +// uint64_t timeout_for_checking, +// uint64_t delay_next_check) { +// int err = 0; +// SearchResult paged_result; +// try { +// mongo::BSONObj result_found; +// mongo::BSONObjBuilder query_builder; +// mongo::BSONArrayBuilder query_ageing_and; +// mongo::BSONArrayBuilder query_ageing_or; // -// const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); -// const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); -// const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); -// //get all node where ageing is > of 0 -// query_builder << CHAOS_FORMAT("instance_description.%1%",%DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING) << BSON("$gt" << 0); +// const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); +// const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); +// const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); +// //get all node where ageing is > of 0 +// query_builder << CHAOS_FORMAT("instance_description.%1%",%DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING) << BSON("$gt" << 0); // -// //get all control unit -// query_builder << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; +// //get all control unit +// query_builder << NodeDefinitionKey::NODE_TYPE << NodeType::NODE_TYPE_CONTROL_UNIT; // -// //condition on sequence -// query_builder << "seq" << BSON("$gt" << (long long)last_sequence_id); +// //condition on sequence +// query_builder << "seq" << BSON("$gt" << (long long)last_sequence_id); // -// //select control unit also if it is in checking managemnt but data checking time is old than one minute(it is gone in timeout) -// query_ageing_or << BSON(key_processing_ageing << true << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp()-timeout_for_checking))); +// //select control unit also if it is in checking managemnt but data checking time is old than one minute(it is gone in timeout) +// query_ageing_or << BSON(key_processing_ageing << true << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp()-timeout_for_checking))); // -// //or on previous condition and on checking management == false the last checking date need to be greater that noral chack timeout -// query_ageing_or << BSON(key_processing_ageing << false << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp()-delay_next_check))); +// //or on previous condition and on checking management == false the last checking date need to be greater that noral chack timeout +// query_ageing_or << BSON(key_processing_ageing << false << key_last_checking_time << BSON("$lte" << mongo::Date_t(TimingUtil::getTimeStamp()-delay_next_check))); // -// query_builder << "$or" << query_ageing_or.arr(); +// query_builder << "$or" << query_ageing_or.arr(); // // -// mongo::BSONObj query = query_builder.obj(); -// // set atomicalli processing ageing to true -// mongo::BSONObj update = BSON("$set" << BSON(key_processing_ageing << true << -// key_last_checking_time << mongo::Date_t(TimingUtil::getTimeStamp()))); -// // order getting first cu being the last processed one -// mongo::BSONObj order_by = BSON(key_last_checking_time << 1); -// DEBUG_CODE(MDBNDA_DBG<<log_message("reserveNodeForAgeingManagement", -// "findAndUpdate", -// DATA_ACCESS_LOG_3_ENTRY("query", -// "update", -// "order_by", -// query.jsonString(), -// update.jsonString(), -// order_by.jsonString()));) -// //find the control unit -// if((err = connection->findAndModify(result_found, -// MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), -// query, -// update, -// false, -// false, -// order_by))){ -// MDBNDA_DBG << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", %err); -// } else if(result_found.isEmpty() == false && (result_found.hasField(NodeDefinitionKey::NODE_UNIQUE_ID) && -// result_found.hasField(MONGODB_COLLECTION_NODES_AGEING_INFO))) { -// //we have control unit -// last_sequence_id = (uint64_t)result_found.getField("seq").Long(); -// node_uid_reserved = result_found.getField(NodeDefinitionKey::NODE_UNIQUE_ID).String(); -// node_ageing_time = (uint32_t)result_found.getFieldDotted(CHAOS_FORMAT("instance_description.%1%",%DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING)).numberInt(); -// last_ageing_perform_time = (uint64_t)result_found.getFieldDotted(key_last_performed_time).Date().asInt64(); -// } else { -// last_sequence_id = 0; -// node_uid_reserved.clear(); -// last_ageing_perform_time = 0; -// node_ageing_time = 0; -// } +// mongo::BSONObj query = query_builder.obj(); +// // set atomicalli processing ageing to true +// mongo::BSONObj update = BSON("$set" << BSON(key_processing_ageing << true << +// key_last_checking_time << mongo::Date_t(TimingUtil::getTimeStamp()))); +// // order getting first cu being the last processed one +// mongo::BSONObj order_by = BSON(key_last_checking_time << 1); +// DEBUG_CODE(MDBNDA_DBG<<log_message("reserveNodeForAgeingManagement", +// "findAndUpdate", +// DATA_ACCESS_LOG_3_ENTRY("query", +// "update", +// "order_by", +// query.jsonString(), +// update.jsonString(), +// order_by.jsonString()));) +// //find the control unit +// if((err = connection->findAndModify(result_found, +// MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), +// query, +// update, +// false, +// false, +// order_by))){ +// MDBNDA_DBG << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", %err); +// } else if(result_found.isEmpty() == false && (result_found.hasField(NodeDefinitionKey::NODE_UNIQUE_ID) && +// result_found.hasField(MONGODB_COLLECTION_NODES_AGEING_INFO))) { +// //we have control unit +// last_sequence_id = (uint64_t)result_found.getField("seq").Long(); +// node_uid_reserved = result_found.getField(NodeDefinitionKey::NODE_UNIQUE_ID).String(); +// node_ageing_time = (uint32_t)result_found.getFieldDotted(CHAOS_FORMAT("instance_description.%1%",%DataServiceNodeDefinitionKey::DS_STORAGE_HISTORY_AGEING)).numberInt(); +// last_ageing_perform_time = (uint64_t)result_found.getFieldDotted(key_last_performed_time).Date().asInt64(); +// } else { +// last_sequence_id = 0; +// node_uid_reserved.clear(); +// last_ageing_perform_time = 0; +// node_ageing_time = 0; +// } // -// } catch (const mongo::DBException &e) { -// MDBNDA_ERR << e.what(); -// err = -1; -// } catch (const CException &e) { -// MDBNDA_ERR << e.what(); -// err = e.errorCode; -// } -// return err; -//} +// } catch (const mongo::DBException &e) { +// MDBNDA_ERR << e.what(); +// err = -1; +// } catch (const CException &e) { +// MDBNDA_ERR << e.what(); +// err = e.errorCode; +// } +// return err; +// } // -//int MongoDBNodeDataAccess::releaseNodeForAgeingManagement(std::string& node_uid, -// bool performed) { -// int err = 0; -// SearchResult paged_result; -// try { -// mongo::BSONObj result_found; -// uint64_t current_ts = TimingUtil::getTimeStamp(); -// const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); -// const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); -// const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); +// int MongoDBNodeDataAccess::releaseNodeForAgeingManagement(std::string& node_uid, +// bool performed) { +// int err = 0; +// SearchResult paged_result; +// try { +// mongo::BSONObj result_found; +// uint64_t current_ts = TimingUtil::getTimeStamp(); +// const std::string key_processing_ageing = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PROCESSING_AGEING); +// const std::string key_last_checking_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_AGEING_LAST_CHECK_DATA); +// const std::string key_last_performed_time = CHAOS_FORMAT("%1%.%2%",%MONGODB_COLLECTION_NODES_AGEING_INFO%MONGODB_COLLECTION_NODES_PERFORMED_AGEING); // -// mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << node_uid); -// // set atomicalli processing ageing to true -// mongo::BSONObj update = BSON("$set" << (performed?BSON(key_processing_ageing << false << -// key_last_checking_time << mongo::Date_t(current_ts) << -// key_last_performed_time << mongo::Date_t(current_ts)): -// BSON(key_processing_ageing << false << -// key_last_checking_time << mongo::Date_t(current_ts)))); +// mongo::BSONObj query = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << node_uid); +// // set atomicalli processing ageing to true +// mongo::BSONObj update = BSON("$set" << (performed?BSON(key_processing_ageing << false << +// key_last_checking_time << mongo::Date_t(current_ts) << +// key_last_performed_time << mongo::Date_t(current_ts)): +// BSON(key_processing_ageing << false << +// key_last_checking_time << mongo::Date_t(current_ts)))); // -// DEBUG_CODE(MDBNDA_ERR<<log_message("releaseNodeForAgeingManagement", -// "update", -// DATA_ACCESS_LOG_2_ENTRY("query", -// "update", -// query.jsonString(), -// update.jsonString()));) -// //find the control unit -// if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), -// query, -// update))) { -// MDBNDA_ERR << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", %err); -// } -// } catch (const mongo::DBException &e) { -// MDBNDA_ERR << e.what(); -// err = -1; -// } catch (const CException &e) { -// MDBNDA_ERR << e.what(); -// err = e.errorCode; -// } -// return err; -//} +// DEBUG_CODE(MDBNDA_ERR<<log_message("releaseNodeForAgeingManagement", +// "update", +// DATA_ACCESS_LOG_2_ENTRY("query", +// "update", +// query.jsonString(), +// update.jsonString()));) +// //find the control unit +// if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), +// query, +// update))) { +// MDBNDA_ERR << CHAOS_FORMAT("Error %1% fetching the next cheable control unit for ageing", %err); +// } +// } catch (const mongo::DBException &e) { +// MDBNDA_ERR << e.what(); +// err = -1; +// } catch (const CException &e) { +// MDBNDA_ERR << e.what(); +// err = e.errorCode; +// } +// return err; +// } diff --git a/ChaosMetadataService/persistence/mongodb/MongoDBScriptDataAccess.cpp b/ChaosMetadataService/persistence/mongodb/MongoDBScriptDataAccess.cpp index 14f52c479dac7a5553cf034e63afc679effc2d15..d53c308296db6073f7cb91052e0299efe2151296 100644 --- a/ChaosMetadataService/persistence/mongodb/MongoDBScriptDataAccess.cpp +++ b/ChaosMetadataService/persistence/mongodb/MongoDBScriptDataAccess.cpp @@ -25,9 +25,9 @@ #include <chaos/common/additional_lib/base64.h> #include <chaos/common/utility/TimingUtil.h> -#include <regex> -#include <boost/foreach.hpp> #include <boost/algorithm/string.hpp> +#include <boost/foreach.hpp> +#include <regex> #include <json/json.h> @@ -40,953 +40,930 @@ using namespace chaos::service_common::persistence::mongodb; using namespace chaos::metadata_service::persistence::mongodb; using namespace chaos::metadata_service::persistence::data_access; -#define SDA_INFO INFO_LOG(MongoDBScriptDataAccess) -#define SDA_DBG DBG_LOG(MongoDBScriptDataAccess) -#define SDA_ERR ERR_LOG(MongoDBScriptDataAccess) +#define SDA_INFO INFO_LOG(MongoDBScriptDataAccess) +#define SDA_DBG DBG_LOG(MongoDBScriptDataAccess) +#define SDA_ERR ERR_LOG(MongoDBScriptDataAccess) -static const std::string ESCAPE_REPLACE_STRING("\\\\&"); -static const std::regex ESCAPE_REPLACE_SEARCH_REGEXP("([\\^\\.\\$\\|\\(\\)\\[\\]\\*\\+\\?\\/\\\\])"); -static const std::regex REGEX_EXECUTION_POOL_VALIDATION("[A-Za-z0-9_]+:[A-Za-z0-9\\/_]+"); +static const std::string ESCAPE_REPLACE_STRING("\\\\&"); +static const std::regex ESCAPE_REPLACE_SEARCH_REGEXP("([\\^\\.\\$\\|\\(\\)\\[\\]\\*\\+\\?\\/\\\\])"); +static const std::regex REGEX_EXECUTION_POOL_VALIDATION("[A-Za-z0-9_]+:[A-Za-z0-9\\/_]+"); -MongoDBScriptDataAccess::MongoDBScriptDataAccess(const ChaosSharedPtr<service_common::persistence::mongodb::MongoDBHAConnectionManager>& _connection): -MongoDBAccessor(_connection), -ScriptDataAccess(), -utility_data_access(NULL){} +MongoDBScriptDataAccess::MongoDBScriptDataAccess(const ChaosSharedPtr<service_common::persistence::mongodb::MongoDBHAConnectionManager>& _connection) + : MongoDBAccessor(_connection), ScriptDataAccess(), utility_data_access(NULL) {} MongoDBScriptDataAccess::~MongoDBScriptDataAccess() {} -int MongoDBScriptDataAccess::insertNewScript(ChaosUniquePtr<chaos::common::data::CDataWrapper>& serialization){ - int size; - int err = 0; -try{ +int MongoDBScriptDataAccess::insertNewScript(ChaosUniquePtr<chaos::common::data::CDataWrapper>& serialization) { + int size; + int err = 0; + try { mongo::BSONObjBuilder builder; - long long seq=(long long)TimingUtil::getTimeStamp(); - if(( err = updateScript(serialization))) { - SDA_ERR << "Error updating new script, try new"; - } else { - return err; - } - if(serialization->hasKey("seq")){ - if(serialization->getInt64Value("seq")){ - seq=serialization->getInt64Value("seq"); // maintain the original sequence - } - } - builder << "seq" <<seq; - - mongo::BSONObj u(serialization->getBSONRawData(size)); - builder.appendElements(u); - mongo::BSONObj i = builder.obj(); - DEBUG_CODE(SDA_DBG<<log_message("insertNewScript", - "insert", - DATA_ACCESS_LOG_1_ENTRY("Insert", - i));) - //inset on database new script description - /* if((err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - i))) { - SDA_ERR << "Error creating new script"; - } else { - //add sccript content - err = updateScript(serialization); - } + long long seq = (long long)TimingUtil::getTimeStamp(); + if ((err = updateScript(serialization))) { + SDA_ERR << "Error updating new script, try new"; + } else { + return err; + } + if (serialization->hasKey("seq")) { + if (serialization->getInt64Value("seq")) { + seq = serialization->getInt64Value("seq"); // maintain the original sequence + } + } + builder << "seq" << seq; + + mongo::BSONObj u(serialization->getBSONRawData(size)); + builder.appendElements(u); + mongo::BSONObj i = builder.obj(); + DEBUG_CODE(SDA_DBG << log_message("insertNewScript", + "insert", + DATA_ACCESS_LOG_1_ENTRY("Insert", + i));) + // inset on database new script description + /* if((err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + i))) { + SDA_ERR << "Error creating new script"; + } else { + //add sccript content + err = updateScript(serialization); + } */ - if(err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT),i)){ - SDA_ERR << "Error inserting new script:"<<err; - - } - - - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + if (err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), i)) { + SDA_ERR << "Error inserting new script:" << err; } - return err; + + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; }; int MongoDBScriptDataAccess::insertNewScript(Script& script_entry) { - int err = 0; - int size; - uint64_t sequence_id; - mongo::BSONObjBuilder builder; - CHAOS_ASSERT(utility_data_access) - try { - //start adding new base entry for the script - //composed only with name and desription - if(script_entry.script_description.name.size() == 0) { - SDA_ERR << "Script name is not valid"; - return -1; - } - if(script_entry.script_description.description.size() == 0) { - SDA_ERR << "Script description is not valid"; - return -2; - } - - CHAOS_ASSERT(utility_data_access) - // NOTE: have a sequence allows to have many scripts with the name that's dangerous + int err = 0; + int size; + uint64_t sequence_id; + mongo::BSONObjBuilder builder; + CHAOS_ASSERT(utility_data_access) + try { + // start adding new base entry for the script + // composed only with name and desription + if (script_entry.script_description.name.size() == 0) { + SDA_ERR << "Script name is not valid"; + return -1; + } + if (script_entry.script_description.description.size() == 0) { + SDA_ERR << "Script description is not valid"; + return -2; + } - /* if(utility_data_access->getNextSequenceValue("script", sequence_id)) { - SDA_ERR << "Error getting new sequence for node"; - return err; - } else { - builder << "seq" << (long long)sequence_id; - } - */ - // better have as unique name the timestamp that tracks also when the script was inserted - /* builder << CHAOS_SBD_NAME << script_entry.script_description.name - << CHAOS_SBD_DESCRIPTION << script_entry.script_description.description - <<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE<< script_entry.script_description.language; - */ - - if(( err = updateScript(script_entry))) { - SDA_ERR << "Error updating new script, try inserting"; - } else { - return err; - } + CHAOS_ASSERT(utility_data_access) + // NOTE: have a sequence allows to have many scripts with the name that's dangerous + + /* if(utility_data_access->getNextSequenceValue("script", sequence_id)) { + SDA_ERR << "Error getting new sequence for node"; + return err; + } else { + builder << "seq" << (long long)sequence_id; + } + */ + // better have as unique name the timestamp that tracks also when the script was inserted + /* builder << CHAOS_SBD_NAME << script_entry.script_description.name + << CHAOS_SBD_DESCRIPTION << script_entry.script_description.description + <<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE<< script_entry.script_description.language; + */ + + if ((err = updateScript(script_entry))) { + SDA_ERR << "Error updating new script, try inserting"; + } else { + return err; + } - ScriptSDWrapper s_dw; - s_dw.dataWrapped() = script_entry; - - ChaosUniquePtr<chaos::common::data::CDataWrapper> serialization = s_dw.serialize(); - - if(serialization->hasKey("seq")){ - builder << "seq" <<(long long)serialization->getInt64Value("seq"); + ScriptSDWrapper s_dw; + s_dw.dataWrapped() = script_entry; - } else { - builder << "seq" <<(long long)TimingUtil::getTimeStamp(); - } - mongo::BSONObj u(serialization->getBSONRawData(size)); - builder.appendElements(u); - mongo::BSONObj i = builder.obj(); - DEBUG_CODE(SDA_DBG<<log_message("insertNewScript", - "insert", - DATA_ACCESS_LOG_1_ENTRY("Insert", - i));) - //inset on database new script description - /* if((err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - i))) { - SDA_ERR << "Error creating new script"; - } else { - //add script content - err = updateScript(script_entry); - }*/ - if(err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT),i)){ - SDA_ERR << "Error creating new script, err:"<<err; + ChaosUniquePtr<chaos::common::data::CDataWrapper> serialization = s_dw.serialize(); - } + if (serialization->hasKey("seq")) { + builder << "seq" << (long long)serialization->getInt64Value("seq"); - - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); - } - return err; -} -int MongoDBScriptDataAccess::updateScript(ChaosUniquePtr<chaos::common::data::CDataWrapper>& serialization) { - int err = 0; - int size = 0; - mongo::BSONObjBuilder query_builder; - CHAOS_ASSERT(utility_data_access); - std::string description_name=serialization->getStringValue(chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME); - uint64_t uid=(long long)TimingUtil::getTimeStamp(); - if(serialization->hasKey("seq")){ - uid =serialization->getInt64Value("seq"); } else { - serialization->addInt64Value("seq",uid); + builder << "seq" << (long long)TimingUtil::getTimeStamp(); + } + mongo::BSONObj u(serialization->getBSONRawData(size)); + builder.appendElements(u); + mongo::BSONObj i = builder.obj(); + DEBUG_CODE(SDA_DBG << log_message("insertNewScript", + "insert", + DATA_ACCESS_LOG_1_ENTRY("Insert", + i));) + // inset on database new script description + /* if((err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + i))) { + SDA_ERR << "Error creating new script"; + } else { + //add script content + err = updateScript(script_entry); + }*/ + if (err = connection->insert(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), i)) { + SDA_ERR << "Error creating new script, err:" << err; } - try { - mongo::BSONObj q = BSON("seq"<< (long long)uid<< - chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << description_name); - - - mongo::BSONObj u(serialization->getBSONRawData(size)); - DEBUG_CODE(SDA_DBG<<log_message("updateScriptContent", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q, - u));) - //inset on database new script description - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q, - u,true))) { - SDA_ERR << "Error Updating script content"; - } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; +} +int MongoDBScriptDataAccess::updateScript(ChaosUniquePtr<chaos::common::data::CDataWrapper>& serialization) { + int err = 0; + int size = 0; + mongo::BSONObjBuilder query_builder; + CHAOS_ASSERT(utility_data_access); + std::string description_name = serialization->getStringValue(chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME); + uint64_t uid = (long long)TimingUtil::getTimeStamp(); + if (serialization->hasKey("seq")) { + uid = serialization->getInt64Value("seq"); + } else { + serialization->addInt64Value("seq", uid); + } + + try { + mongo::BSONObj q = BSON("seq" << (long long)uid << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << description_name); + + mongo::BSONObj u(serialization->getBSONRawData(size)); + DEBUG_CODE(SDA_DBG << log_message("updateScriptContent", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q, + u));) + // inset on database new script description + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q, + u, + true))) { + SDA_ERR << "Error Updating script content"; } - return err; + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBScriptDataAccess::updateScript(Script& script) { - ScriptSDWrapper s_dw; - s_dw.dataWrapped() = script; - - ChaosUniquePtr<chaos::common::data::CDataWrapper> serialization = s_dw.serialize(); - return updateScript(serialization); + ScriptSDWrapper s_dw; + s_dw.dataWrapped() = script; + ChaosUniquePtr<chaos::common::data::CDataWrapper> serialization = s_dw.serialize(); + return updateScript(serialization); } int MongoDBScriptDataAccess::searchScript(ChaosUniquePtr<chaos::common::data::CDataWrapper>& script_list, - const std::string& search_string, - uint64_t last_sequence_id, - uint32_t page_length){ -int err = 0; - SearchResult paged_result; - mongo::BSONObj p = BSON("seq"<<1<<chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME<< 1<<chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_DESCRIPTION<<1 <<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE<<1<<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_GROUP<<1<<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_TARGET<<1); - CHAOS_ASSERT(utility_data_access) - try { - mongo::Query q = getNextPagedQuery(last_sequence_id, - search_string); - - DEBUG_CODE(SDA_DBG<<log_message("searchScript", - "performPagedQuery", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q, - &p, - NULL, - page_length))) { - SDA_ERR << "Error calling performPagedQuery with error" << err; - } else { - DEBUG_CODE(SDA_DBG << "The query '"<< q.toString() <<"' has found " << paged_result.size() << " result";) - if(paged_result.size()) { - for (SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - CDataWrapper element_found(it->objdata()); - script_list->appendCDataWrapperToArray(element_found); - DEBUG_CODE(SDA_DBG << "Result '"<< element_found.getCompliantJSONString();) - - } - script_list->finalizeArrayForKey(chaos::MetadataServerApiKey::script::search_script::FOUND_SCRIPT_LIST); - } + const std::string& search_string, + uint64_t last_sequence_id, + uint32_t page_length) { + int err = 0; + SearchResult paged_result; + mongo::BSONObj p = BSON("seq" << 1 << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << 1 << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_DESCRIPTION << 1 << chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE << 1 << chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_GROUP << 1 << chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_TARGET << 1); + CHAOS_ASSERT(utility_data_access) + try { + mongo::Query q = getNextPagedQuery(last_sequence_id, + search_string); + + DEBUG_CODE(SDA_DBG << log_message("searchScript", + "performPagedQuery", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q, + &p, + NULL, + page_length))) { + SDA_ERR << "Error calling performPagedQuery with error" << err; + } else { + DEBUG_CODE(SDA_DBG << "The query '" << q.toString() << "' has found " << paged_result.size() << " result";) + if (paged_result.size()) { + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + if (it->objdata()) { + CDataWrapper element_found(it->objdata()); + script_list->appendCDataWrapperToArray(element_found); + DEBUG_CODE(SDA_DBG << "Result '" << element_found.getCompliantJSONString();) + } } - - //now all other part of the script are managed with update - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + script_list->finalizeArrayForKey(chaos::MetadataServerApiKey::script::search_script::FOUND_SCRIPT_LIST); + } } - return err; + + // now all other part of the script are managed with update + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBScriptDataAccess::searchScript(ScriptBaseDescriptionListWrapper& script_list, - const std::string& search_string, - uint64_t last_sequence_id, - uint32_t page_length) { - int err = 0; - SearchResult paged_result; - mongo::BSONObj p = BSON("seq"<<1<<chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME<< 1<<chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_DESCRIPTION<<1 <<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE<<1<<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_GROUP<<1<<chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_TARGET<<1); - CHAOS_ASSERT(utility_data_access) - try { - mongo::Query q = getNextPagedQuery(last_sequence_id, - search_string); - - DEBUG_CODE(SDA_DBG<<log_message("searchScript", - "performPagedQuery", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q, - &p, - NULL, - page_length))) { - SDA_ERR << "Error calling performPagedQuery with error" << err; - } else { - DEBUG_CODE(SDA_DBG << "The query '"<< q.toString() <<"' has found " << paged_result.size() << " result";) - if(paged_result.size()) { - for (SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - CDataWrapper element_found(it->objdata()); - script_list.add(&element_found); - - } - } + const std::string& search_string, + uint64_t last_sequence_id, + uint32_t page_length) { + int err = 0; + SearchResult paged_result; + mongo::BSONObj p = BSON("seq" << 1 << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << 1 << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_DESCRIPTION << 1 << chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE << 1 << chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_GROUP << 1 << chaos::ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_TARGET << 1); + CHAOS_ASSERT(utility_data_access) + try { + mongo::Query q = getNextPagedQuery(last_sequence_id, + search_string); + + DEBUG_CODE(SDA_DBG << log_message("searchScript", + "performPagedQuery", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q, + &p, + NULL, + page_length))) { + SDA_ERR << "Error calling performPagedQuery with error" << err; + } else { + DEBUG_CODE(SDA_DBG << "The query '" << q.toString() << "' has found " << paged_result.size() << " result";) + if (paged_result.size()) { + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + CDataWrapper element_found(it->objdata()); + script_list.add(&element_found); } - - //now all other part of the script are managed with update - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + } } - return err; + + // now all other part of the script are managed with update + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } //! Inherited Method -int MongoDBScriptDataAccess::addScriptInstance(const uint64_t seq, +int MongoDBScriptDataAccess::addScriptInstance(const uint64_t seq, const std::string& script_name, const std::string& instance_name) { - CHAOS_ASSERT(node_data_access) - int err = 0; - try { - CDataWrapper node_description; - node_description.addStringValue(chaos::NodeDefinitionKey::NODE_UNIQUE_ID, instance_name); - node_description.addStringValue(chaos::NodeDefinitionKey::NODE_TYPE, chaos::NodeType::NODE_TYPE_CONTROL_UNIT); - node_description.addStringValue(chaos::NodeDefinitionKey::NODE_SUB_TYPE, chaos::NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); - node_description.addStringValue(chaos::NodeDefinitionKey::NODE_GROUP_SET, script_name); - node_description.addInt64Value("script_seq", seq); - //now all other part of the script are managed with update - if((err = node_data_access->insertNewNode(node_description))){ - return err; - } - - mongo::Query q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID<< instance_name<< - chaos::NodeDefinitionKey::NODE_GROUP_SET << script_name<< - "script_seq" << (long long)seq); - //add base instance information control control unit implementation - mongo::BSONObj u = BSON("$set" << BSON("script_bind_type" << ScriptBindTypeDisable << - "instance_description" << BSON("control_unit_implementation" << "ScriptableExecutionUnit"))); - - DEBUG_CODE(SDA_DBG<<log_message("addScriptInstance", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q, - u));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), q, u))){ - SDA_ERR << "Error updating script instance node with default instance data" << err; - return err; - } - - //we have the script now get the dataset and attach it to the instance - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + CHAOS_ASSERT(node_data_access) + int err = 0; + try { + CDataWrapper node_description; + node_description.addStringValue(chaos::NodeDefinitionKey::NODE_UNIQUE_ID, instance_name); + node_description.addStringValue(chaos::NodeDefinitionKey::NODE_TYPE, chaos::NodeType::NODE_TYPE_CONTROL_UNIT); + node_description.addStringValue(chaos::NodeDefinitionKey::NODE_SUB_TYPE, chaos::NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); + node_description.addStringValue(chaos::NodeDefinitionKey::NODE_GROUP_SET, script_name); + node_description.addInt64Value("script_seq", seq); + // now all other part of the script are managed with update + if ((err = node_data_access->insertNewNode(node_description))) { + return err; + } + + mongo::Query q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << instance_name << chaos::NodeDefinitionKey::NODE_GROUP_SET << script_name << "script_seq" << (long long)seq); + // add base instance information control control unit implementation + mongo::BSONObj u = BSON("$set" << BSON("script_bind_type" << ScriptBindTypeDisable << "instance_description" << BSON("control_unit_implementation" + << "ScriptableExecutionUnit"))); + + DEBUG_CODE(SDA_DBG << log_message("addScriptInstance", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q, + u));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), q, u))) { + SDA_ERR << "Error updating script instance node with default instance data" << err; + return err; } - return err; + + // we have the script now get the dataset and attach it to the instance + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBScriptDataAccess::updateBindType(const chaos::service_common::data::script::ScriptBaseDescription& script_base_descrition, - const chaos::service_common::data::script::ScriptInstance& instance) { - CHAOS_ASSERT(node_data_access) - int err = 0; - try { - mongo::Query q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID<< instance.instance_name<< - chaos::NodeDefinitionKey::NODE_GROUP_SET << script_base_descrition.name<< - "script_seq" << (long long)script_base_descrition.unique_id); - mongo::BSONObj u; - if(instance.bind_type == ScriptBindTypeUnitServer) { - if(instance.bind_node.size() == 0) {SDA_ERR << "Invalid bind node name";return -1;} - u = BSON("$set" << BSON("script_bind_type" << (int32_t)instance.bind_type << - CHAOS_FORMAT("instance_description.%1%",%chaos::NodeDefinitionKey::NODE_PARENT) << instance.bind_node)); - } else { - u = BSON("$set" << BSON("script_bind_type" << (int32_t)instance.bind_type)); - } - DEBUG_CODE(SDA_DBG<<log_message("addScriptInstance", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q, - u));) - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), q, u))){ - SDA_ERR << "Error updating script instance node with default instance data" << err; - return err; - } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + const chaos::service_common::data::script::ScriptInstance& instance) { + CHAOS_ASSERT(node_data_access) + int err = 0; + try { + mongo::Query q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << instance.instance_name << chaos::NodeDefinitionKey::NODE_GROUP_SET << script_base_descrition.name << "script_seq" << (long long)script_base_descrition.unique_id); + mongo::BSONObj u; + if (instance.bind_type == ScriptBindTypeUnitServer) { + if (instance.bind_node.size() == 0) { + SDA_ERR << "Invalid bind node name"; + return -1; + } + u = BSON("$set" << BSON("script_bind_type" << (int32_t)instance.bind_type << CHAOS_FORMAT("instance_description.%1%", % chaos::NodeDefinitionKey::NODE_PARENT) << instance.bind_node)); + } else { + u = BSON("$set" << BSON("script_bind_type" << (int32_t)instance.bind_type)); + } + DEBUG_CODE(SDA_DBG << log_message("addScriptInstance", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q, + u));) + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), q, u))) { + SDA_ERR << "Error updating script instance node with default instance data" << err; + return err; } - return err; + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } //! Inherited Method -int MongoDBScriptDataAccess::removeScriptInstance(const uint64_t seq, +int MongoDBScriptDataAccess::removeScriptInstance(const uint64_t seq, const std::string& script_name, const std::string& instance_name) { - CHAOS_ASSERT(node_data_access) - int err = 0; - try { - //now all other part of the script are managed with update - mongo::Query q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID<< instance_name<< - chaos::NodeDefinitionKey::NODE_GROUP_SET << script_name<< - "script_seq" << (long long)seq); - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q))) { - SDA_ERR << CHAOS_FORMAT("Error removing instance %1% for script %2% with code %3%", %instance_name%script_name%err); - } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + CHAOS_ASSERT(node_data_access) + int err = 0; + try { + // now all other part of the script are managed with update + mongo::Query q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << instance_name << chaos::NodeDefinitionKey::NODE_GROUP_SET << script_name << "script_seq" << (long long)seq); + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q))) { + SDA_ERR << CHAOS_FORMAT("Error removing instance %1% for script %2% with code %3%", % instance_name % script_name % err); } - return err; + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBScriptDataAccess::searchScriptInstance(std::vector<ScriptInstance>& instance_list, - const std::string& script_name, - const std::string& search_string, - uint64_t start_sequence_id, - uint32_t page_length) { - int err = 0; - SearchResult paged_result; - try { - mongo::Query q = getNextPagedQueryForInstance(start_sequence_id, - script_name, - search_string); - DEBUG_CODE(SDA_DBG<<log_message("searchScriptInstance", - "performPagedQuery", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - NULL, - NULL, - page_length))) { - SDA_ERR << "Error calling performPagedQuery with error" << err; - } else { - DEBUG_CODE(SDA_DBG << "The query '"<< q.toString() <<"' has found " << paged_result.size() << " result";) - if(paged_result.size()) { - for (SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - if(it->hasField("seq") && - it->hasField(chaos::NodeDefinitionKey::NODE_UNIQUE_ID)){ - ScriptInstance instance; - instance.instance_seq = (uint64_t)it->getField("seq").Long(); - instance.instance_name = it->getField(chaos::NodeDefinitionKey::NODE_UNIQUE_ID).String(); - mongo::BSONElement bte = it->getFieldDotted("script_bind_type"); - instance.bind_type = bte.ok()?static_cast<ScriptBindType>(bte.numberInt()):ScriptBindTypeDisable; - mongo::BSONElement bne = it->getFieldDotted(CHAOS_FORMAT("instance_description.%1%",%NodeDefinitionKey::NODE_PARENT)); - instance.bind_node = bne.ok()?bne.String():""; - instance_list.push_back(instance); - } - } - } + const std::string& script_name, + const std::string& search_string, + uint64_t start_sequence_id, + uint32_t page_length) { + int err = 0; + SearchResult paged_result; + try { + mongo::Query q = getNextPagedQueryForInstance(start_sequence_id, + script_name, + search_string); + DEBUG_CODE(SDA_DBG << log_message("searchScriptInstance", + "performPagedQuery", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + NULL, + NULL, + page_length))) { + SDA_ERR << "Error calling performPagedQuery with error" << err; + } else { + DEBUG_CODE(SDA_DBG << "The query '" << q.toString() << "' has found " << paged_result.size() << " result";) + if (paged_result.size()) { + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + if (it->hasField("seq") && + it->hasField(chaos::NodeDefinitionKey::NODE_UNIQUE_ID)) { + ScriptInstance instance; + instance.instance_seq = (uint64_t)it->getField("seq").Long(); + instance.instance_name = it->getField(chaos::NodeDefinitionKey::NODE_UNIQUE_ID).String(); + mongo::BSONElement bte = it->getFieldDotted("script_bind_type"); + instance.bind_type = bte.ok() ? static_cast<ScriptBindType>(bte.numberInt()) : ScriptBindTypeDisable; + mongo::BSONElement bne = it->getFieldDotted(CHAOS_FORMAT("instance_description.%1%", % NodeDefinitionKey::NODE_PARENT)); + instance.bind_node = bne.ok() ? bne.String() : ""; + instance_list.push_back(instance); + } } - - //now all other part of the script are managed with update - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + } } - return err; + + // now all other part of the script are managed with update + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBScriptDataAccess::getScriptInstance(const std::string& script_instance, - const uint64_t& seq, - bool& found, - ScriptInstance& instance) { - int err = 0; - mongo::BSONObj element_found; - CHAOS_ASSERT(utility_data_access) - try { - found = false; - mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << script_instance - << "seq" << (long long)seq); - - DEBUG_CODE(SDA_DBG<<log_message("getScriptInstance", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = connection->findOne(element_found, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q))) { - SDA_ERR << CHAOS_FORMAT("Error fetching instance %1%[%2%] with error [%3%]", %script_instance%seq%err); - } else { - if((found = !element_found.isEmpty())) { - instance.instance_name = script_instance; - instance.instance_seq = seq; - mongo::BSONElement bte = element_found.getFieldDotted("script_bind_type"); - instance.bind_type = bte.ok()?static_cast<ScriptBindType>(bte.numberInt()):ScriptBindTypeDisable; - mongo::BSONElement bne = element_found.getFieldDotted(CHAOS_FORMAT("instance_description.%1%",%NodeDefinitionKey::NODE_PARENT)); - instance.bind_node = bne.ok()?bne.String():""; - } else { - SDA_ERR << CHAOS_FORMAT("The instance %1%[%2%] is empty", %script_instance%seq); - - } - } - - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + const uint64_t& seq, + bool& found, + ScriptInstance& instance) { + int err = 0; + mongo::BSONObj element_found; + CHAOS_ASSERT(utility_data_access) + try { + found = false; + mongo::BSONObj q = BSON(NodeDefinitionKey::NODE_UNIQUE_ID << script_instance + << "seq" << (long long)seq); + + DEBUG_CODE(SDA_DBG << log_message("getScriptInstance", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = connection->findOne(element_found, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q))) { + SDA_ERR << CHAOS_FORMAT("Error fetching instance %1%[%2%] with error [%3%]", % script_instance % seq % err); + } else { + if ((found = !element_found.isEmpty())) { + instance.instance_name = script_instance; + instance.instance_seq = seq; + mongo::BSONElement bte = element_found.getFieldDotted("script_bind_type"); + instance.bind_type = bte.ok() ? static_cast<ScriptBindType>(bte.numberInt()) : ScriptBindTypeDisable; + mongo::BSONElement bne = element_found.getFieldDotted(CHAOS_FORMAT("instance_description.%1%", % NodeDefinitionKey::NODE_PARENT)); + instance.bind_node = bne.ok() ? bne.String() : ""; + } else { + SDA_ERR << CHAOS_FORMAT("The instance %1%[%2%] is empty", % script_instance % seq); + } } - return err; + + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBScriptDataAccess::loadScript(const uint64_t unique_id, - const std::string& name, - ChaosUniquePtr<chaos::common::data::CDataWrapper>& script, - bool load_source_code){ -int err = 0; - mongo::BSONObj element_found; - CHAOS_ASSERT(utility_data_access) - try { - mongo::BSONObj q = BSON("seq" << (long long)unique_id - << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); - - DEBUG_CODE(SDA_DBG<<log_message("loadScript", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = connection->findOne(element_found, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q))) { - SDA_ERR << CHAOS_FORMAT("Error executin query for load script %1%[%2%] with error [%3%]", %unique_id%name%err); - } else { - if(element_found.isEmpty()) { - SDA_ERR << CHAOS_FORMAT("The script %1%[%2%] has not been found", %unique_id%name); - } else { - // fill script with base description - CDataWrapper element_found_cdw(element_found.objdata()); - element_found_cdw.copyAllTo(*script.get()); - } - } - - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); +int MongoDBScriptDataAccess::loadScript(const uint64_t unique_id, + const std::string& name, + ChaosUniquePtr<chaos::common::data::CDataWrapper>& script, + bool load_source_code) { + int err = 0; + mongo::BSONObj element_found; + CHAOS_ASSERT(utility_data_access) + try { + mongo::BSONObj q = BSON("seq" << (long long)unique_id + << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); + + DEBUG_CODE(SDA_DBG << log_message("loadScript", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = connection->findOne(element_found, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q))) { + SDA_ERR << CHAOS_FORMAT("Error executin query for load script %1%[%2%] with error [%3%]", % unique_id % name % err); + } else { + if (element_found.isEmpty()) { + SDA_ERR << CHAOS_FORMAT("The script %1%[%2%] has not been found", % unique_id % name); + } else { + // fill script with base description + CDataWrapper element_found_cdw(element_found.objdata()); + element_found_cdw.copyAllTo(*script.get()); + } } - return err; + + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } - -int MongoDBScriptDataAccess::loadScript(const uint64_t unique_id, - const std::string& name, + +int MongoDBScriptDataAccess::loadScript(const uint64_t unique_id, + const std::string& name, chaos::service_common::data::script::Script& script, - bool load_source_code) { - int err = 0; - mongo::BSONObj element_found; - CHAOS_ASSERT(utility_data_access) - try { - mongo::BSONObj q = BSON("seq" << (long long)unique_id - << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); - - DEBUG_CODE(SDA_DBG<<log_message("loadScript", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = connection->findOne(element_found, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q))) { - SDA_ERR << CHAOS_FORMAT("Error executin query for load script %1%[%2%] with error [%3%]", %unique_id%name%err); - } else { - if(element_found.isEmpty()) { - SDA_ERR << CHAOS_FORMAT("The script %1%[%2%] has not been found", %unique_id%name); - } else { - // fill script with base description - ScriptSDWrapper s_dw; - CDataWrapper element_found_cdw(element_found.objdata()); - s_dw.deserialize(&element_found_cdw); - script = s_dw.dataWrapped(); - } - } - - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + bool load_source_code) { + int err = 0; + mongo::BSONObj element_found; + CHAOS_ASSERT(utility_data_access) + try { + mongo::BSONObj q = BSON("seq" << (long long)unique_id + << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); + + DEBUG_CODE(SDA_DBG << log_message("loadScript", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = connection->findOne(element_found, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q))) { + SDA_ERR << CHAOS_FORMAT("Error executin query for load script %1%[%2%] with error [%3%]", % unique_id % name % err); + } else { + if (element_found.isEmpty()) { + SDA_ERR << CHAOS_FORMAT("The script %1%[%2%] has not been found", % unique_id % name); + } else { + // fill script with base description + ScriptSDWrapper s_dw; + CDataWrapper element_found_cdw(element_found.objdata()); + s_dw.deserialize(&element_found_cdw); + script = s_dw.dataWrapped(); + } } - return err; + + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBScriptDataAccess::deleteScript(const uint64_t unique_id, +int MongoDBScriptDataAccess::deleteScript(const uint64_t unique_id, const std::string& name) { - int err = 0; - mongo::BSONObj element_found; - CHAOS_ASSERT(utility_data_access) - try { - mongo::BSONObj q_script; - if(unique_id==0){ - q_script= BSON( chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); - } else { - q_script= BSON("seq" << (long long)unique_id - <<chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); - - } - mongo::BSONObj q_instance = BSON("script_seq" << (long long)unique_id - << chaos::NodeDefinitionKey::NODE_GROUP_SET << name); - DEBUG_CODE(SDA_DBG<<log_message("deleteScript", - "remove[instance]", - DATA_ACCESS_LOG_1_ENTRY("Query", - q_instance));) - //inset on database new script description - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q_instance))) { - SDA_ERR << CHAOS_FORMAT("Error removing instance for script %1%[%2%] with error [%3%]", %unique_id%name%err); - } - - DEBUG_CODE(SDA_DBG<<log_message("deleteScript", - "remove[script]", - DATA_ACCESS_LOG_1_ENTRY("Query", - q_script));) - //inset on database new script description - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q_script))) { - SDA_ERR << CHAOS_FORMAT("Error removing script %1%[%2%] with error [%3%]", %unique_id%name%err); - } - - - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + int err = 0; + mongo::BSONObj element_found; + CHAOS_ASSERT(utility_data_access) + try { + mongo::BSONObj q_script; + if (unique_id == 0) { + q_script = BSON(chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); + } else { + q_script = BSON("seq" << (long long)unique_id + << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << name); + } + mongo::BSONObj q_instance = BSON("script_seq" << (long long)unique_id + << chaos::NodeDefinitionKey::NODE_GROUP_SET << name); + DEBUG_CODE(SDA_DBG << log_message("deleteScript", + "remove[instance]", + DATA_ACCESS_LOG_1_ENTRY("Query", + q_instance));) + // inset on database new script description + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q_instance))) { + SDA_ERR << CHAOS_FORMAT("Error removing instance for script %1%[%2%] with error [%3%]", % unique_id % name % err); + } + + DEBUG_CODE(SDA_DBG << log_message("deleteScript", + "remove[script]", + DATA_ACCESS_LOG_1_ENTRY("Query", + q_script));) + // inset on database new script description + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q_script))) { + SDA_ERR << CHAOS_FORMAT("Error removing script %1%[%2%] with error [%3%]", % unique_id % name % err); } - return err; + + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBScriptDataAccess::getScriptForExecutionPoolPathList(const ChaosStringVector& pool_path, +int MongoDBScriptDataAccess::getScriptForExecutionPoolPathList(const ChaosStringVector& pool_path, std::vector<ScriptBaseDescription>& script_found, - uint64_t last_sequence_id, - uint32_t max_result) { - int err = 0; - //given a list of execution pool path the list of the script is returned. Every script into the - //list can belog to one or more of the path present in the input list - //the key execution_pool_list need to have one or more of the value present in the list "field : { $in : array }" - SearchResult paged_result; - mongo::BSONArrayBuilder bson_find_in; - try { - BOOST_FOREACH( std::string pool_path_element, pool_path ) { - if(std::regex_match(pool_path_element, - REGEX_EXECUTION_POOL_VALIDATION) == false) continue; - - //escape xecution ppool path for earchunder the path - const std::string result = std::regex_replace(pool_path_element, - ESCAPE_REPLACE_SEARCH_REGEXP, - ESCAPE_REPLACE_STRING, - std::regex_constants::match_default | std::regex_constants::format_sed); - bson_find_in.appendRegex(CHAOS_FORMAT("%1%[A-Za-z0-9\\/_]*",%result)); - } - mongo::Query q = BSON("execution_pool_list" << BSON("$in"<< bson_find_in.arr()) << - "seq" << BSON("$gt" << (long long)last_sequence_id)); - //ordered by sequence - q = q.sort(BSON("seq"<< 1)); - - DEBUG_CODE(SDA_DBG<<log_message("getScriptForExecutionPoolPathList", - "find", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - connection->findN(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q, - max_result); - if(paged_result.size()) { - ScriptBaseDescriptionSDWrapper scrpt_desc_dw; - //iterate for each elemente deserializing it with the data wrapper - BOOST_FOREACH( mongo::BSONObj element, paged_result ) { - CDataWrapper dw(element.objdata()); - scrpt_desc_dw.deserialize(&dw); - script_found.push_back(scrpt_desc_dw.dataWrapped()); - } - } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + uint64_t last_sequence_id, + uint32_t max_result) { + int err = 0; + // given a list of execution pool path the list of the script is returned. Every script into the + // list can belog to one or more of the path present in the input list + // the key execution_pool_list need to have one or more of the value present in the list "field : { $in : array }" + SearchResult paged_result; + mongo::BSONArrayBuilder bson_find_in; + try { + BOOST_FOREACH (std::string pool_path_element, pool_path) { + if (std::regex_match(pool_path_element, + REGEX_EXECUTION_POOL_VALIDATION) == false) continue; + + // escape xecution ppool path for earchunder the path + const std::string result = std::regex_replace(pool_path_element, + ESCAPE_REPLACE_SEARCH_REGEXP, + ESCAPE_REPLACE_STRING, + std::regex_constants::match_default | std::regex_constants::format_sed); + bson_find_in.appendRegex(CHAOS_FORMAT("%1%[A-Za-z0-9\\/_]*", % result)); } - - return err; -} + mongo::Query q = BSON("execution_pool_list" << BSON("$in" << bson_find_in.arr()) << "seq" << BSON("$gt" << (long long)last_sequence_id)); + // ordered by sequence + q = q.sort(BSON("seq" << 1)); + + DEBUG_CODE(SDA_DBG << log_message("getScriptForExecutionPoolPathList", + "find", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + connection->findN(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q, + max_result); + if (paged_result.size()) { + ScriptBaseDescriptionSDWrapper scrpt_desc_dw; + // iterate for each elemente deserializing it with the data wrapper + BOOST_FOREACH (mongo::BSONObj element, paged_result) { + CDataWrapper dw(element.objdata()); + scrpt_desc_dw.deserialize(&dw); + script_found.push_back(scrpt_desc_dw.dataWrapped()); + } + } + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; +} int MongoDBScriptDataAccess::getUnscheduledInstanceForJob(const chaos::service_common::data::script::ScriptBaseDescription& script, - ChaosStringVector& instance_found_list, - uint32_t timeout, - uint32_t max_result) { - int err = 0; - SearchResult paged_result; - mongo::BSONArrayBuilder bson_find_and; - mongo::BSONArrayBuilder bson_find_hb_or; - CHAOS_ASSERT(utility_data_access) - try { - //calucate the millisecond that we want to consider timeout - mongo::Date_t start_timeout_date(TimingUtil::getTimeStamp() - timeout); - bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_GROUP_SET << script.name); - bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); - bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_SUB_TYPE << chaos::NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); - bson_find_and << BSON("script_seq" << (long long)script.unique_id); - bson_find_and << BSON("instance_description.auto_load" << true); - bson_find_and << BSON("script_bind_type" << ScriptBindTypeAuto); - bson_find_hb_or << BSON(CHAOS_FORMAT("health_stat.%1%",%chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP) << BSON("$exists" << true << "$lt" << start_timeout_date)); - bson_find_hb_or << BSON(CHAOS_FORMAT("health_stat.%1%",%chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP) << BSON("$exists" << false)); - bson_find_and << BSON("$or" << bson_find_hb_or.arr()); - - mongo::BSONObj q = BSON("$and" << bson_find_and.arr()); - - DEBUG_CODE(SDA_DBG<<log_message("instanceHeartbeat", - "findN", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - connection->findN(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - max_result); - - //!return instance - BOOST_FOREACH( mongo::BSONObj element, paged_result ) { - if(element.hasField(NodeDefinitionKey::NODE_UNIQUE_ID) == false) continue; - instance_found_list.push_back(element.getStringField(NodeDefinitionKey::NODE_UNIQUE_ID)); - } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + ChaosStringVector& instance_found_list, + uint32_t timeout, + uint32_t max_result) { + int err = 0; + SearchResult paged_result; + mongo::BSONArrayBuilder bson_find_and; + mongo::BSONArrayBuilder bson_find_hb_or; + CHAOS_ASSERT(utility_data_access) + try { + // calucate the millisecond that we want to consider timeout + mongo::Date_t start_timeout_date(TimingUtil::getTimeStamp() - timeout); + bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_GROUP_SET << script.name); + bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT); + bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_SUB_TYPE << chaos::NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT); + bson_find_and << BSON("script_seq" << (long long)script.unique_id); + bson_find_and << BSON("instance_description.auto_load" << true); + bson_find_and << BSON("script_bind_type" << ScriptBindTypeAuto); + bson_find_hb_or << BSON(CHAOS_FORMAT("health_stat.%1%", % chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP) << BSON("$exists" << true << "$lt" << start_timeout_date)); + bson_find_hb_or << BSON(CHAOS_FORMAT("health_stat.%1%", % chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP) << BSON("$exists" << false)); + bson_find_and << BSON("$or" << bson_find_hb_or.arr()); + + mongo::BSONObj q = BSON("$and" << bson_find_and.arr()); + + DEBUG_CODE(SDA_DBG << log_message("instanceHeartbeat", + "findN", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + connection->findN(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + max_result); + + //! return instance + BOOST_FOREACH (mongo::BSONObj element, paged_result) { + if (element.hasField(NodeDefinitionKey::NODE_UNIQUE_ID) == false) continue; + instance_found_list.push_back(element.getStringField(NodeDefinitionKey::NODE_UNIQUE_ID)); } - return err; + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } - -int MongoDBScriptDataAccess::reserveInstanceForScheduling(bool& reserverd, +int MongoDBScriptDataAccess::reserveInstanceForScheduling(bool& reserverd, const std::string& instance_uid, const std::string& unit_server_parent, - uint32_t timeout) { - int err = 0; - //we need to use find adn update to perform prenotation of the instance uid, the rule are - // instance is in timeout of not have the heartbeat - mongo::BSONObj result; - mongo::BSONArrayBuilder bson_find_and; - mongo::BSONArrayBuilder bson_find_hb_or; - CHAOS_ASSERT(utility_data_access) - try { - reserverd = false; - - //unique id rule - bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << instance_uid); - bson_find_and << BSON("script_bind_type" << ScriptBindTypeAuto); - //timeout rule - uint64_t now = TimingUtil::getTimeStamp(); - mongo::Date_t start_timeout_date(now + timeout); //date need to be in the future because we need to reserve it - bson_find_hb_or << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << BSON("$exists" << true << "$lt" << start_timeout_date)); - bson_find_hb_or << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << BSON("$exists" << false)); - bson_find_and << BSON("$or" << bson_find_hb_or.arr()); - - mongo::BSONObj q = BSON("$and" << bson_find_and.arr()); - //the reservation is done using updateing the heartbeat and unit server alias - mongo::BSONObj u = BSON("$set" << BSON(CHAOS_FORMAT("instance_description.%1%",%chaos::NodeDefinitionKey::NODE_PARENT) << unit_server_parent << - CHAOS_FORMAT("health_stat.%1%",%chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP) << mongo::Date_t(now))); - - DEBUG_CODE(SDA_DBG<<log_message("instanceHeartbeat", - "update", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = connection->findAndModify(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u))){ - SDA_ERR << CHAOS_FORMAT("Error executin reservation on script instance %1% with error %2%", %instance_uid%err); - } else { - reserverd = (result.isEmpty() == false); - } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + uint32_t timeout) { + int err = 0; + // we need to use find adn update to perform prenotation of the instance uid, the rule are + // instance is in timeout of not have the heartbeat + mongo::BSONObj result; + mongo::BSONArrayBuilder bson_find_and; + mongo::BSONArrayBuilder bson_find_hb_or; + CHAOS_ASSERT(utility_data_access) + try { + reserverd = false; + + // unique id rule + bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << instance_uid); + bson_find_and << BSON("script_bind_type" << ScriptBindTypeAuto); + // timeout rule + uint64_t now = TimingUtil::getTimeStamp(); + mongo::Date_t start_timeout_date(now + timeout); // date need to be in the future because we need to reserve it + bson_find_hb_or << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << BSON("$exists" << true << "$lt" << start_timeout_date)); + bson_find_hb_or << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << BSON("$exists" << false)); + bson_find_and << BSON("$or" << bson_find_hb_or.arr()); + + mongo::BSONObj q = BSON("$and" << bson_find_and.arr()); + // the reservation is done using updateing the heartbeat and unit server alias + mongo::BSONObj u = BSON("$set" << BSON(CHAOS_FORMAT("instance_description.%1%", % chaos::NodeDefinitionKey::NODE_PARENT) << unit_server_parent << CHAOS_FORMAT("health_stat.%1%", % chaos::NodeHealtDefinitionKey::NODE_HEALT_TIMESTAMP) << mongo::Date_t(now))); + + DEBUG_CODE(SDA_DBG << log_message("instanceHeartbeat", + "update", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = connection->findAndModify(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u))) { + SDA_ERR << CHAOS_FORMAT("Error executin reservation on script instance %1% with error %2%", % instance_uid % err); + } else { + reserverd = (result.isEmpty() == false); } - return err; + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBScriptDataAccess::copyScriptDatasetAndContentToInstance(const chaos::service_common::data::script::ScriptBaseDescription& script, - const std::string& script_instance) { - int err = 0; - mongo::BSONObj script_found; - mongo::BSONObj instance_found; - - CHAOS_ASSERT(utility_data_access) - try { - mongo::BSONObj q = BSON("seq" << (long long)script.unique_id - << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << script.name); - - DEBUG_CODE(SDA_DBG<<log_message("copyScriptDatasetToInstance", - "findOne[script]", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = connection->findOne(script_found, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), - q))) { - SDA_ERR << CHAOS_FORMAT("Error executin query for load script %1%[%2%] with error [%3%]", %script.unique_id%script.name%err); + const std::string& script_instance) { + int err = 0; + mongo::BSONObj script_found; + mongo::BSONObj instance_found; + + CHAOS_ASSERT(utility_data_access) + try { + mongo::BSONObj q = BSON("seq" << (long long)script.unique_id + << chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME << script.name); + + DEBUG_CODE(SDA_DBG << log_message("copyScriptDatasetToInstance", + "findOne[script]", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = connection->findOne(script_found, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SCRIPT), + q))) { + SDA_ERR << CHAOS_FORMAT("Error executin query for load script %1%[%2%] with error [%3%]", % script.unique_id % script.name % err); + } else { + if (script_found.isEmpty()) { + SDA_ERR << CHAOS_FORMAT("The script %1%[%2%] has not been found", % script.unique_id % script.name); + } else { + // check the dataset presence within th script + if (script_found.hasElement(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION) == false) { + err = -100; + SDA_ERR << "The script ans't any dataset configured"; } else { - if(script_found.isEmpty()) { - SDA_ERR << CHAOS_FORMAT("The script %1%[%2%] has not been found", %script.unique_id%script.name); + // now we need to search the instance and verify that it si conencted to the script so we need one query bson objet + q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << script_instance << chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT << chaos::NodeDefinitionKey::NODE_SUB_TYPE << chaos::NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT << chaos::NodeDefinitionKey::NODE_GROUP_SET << script.name << "script_seq" << (long long)script.unique_id); + + DEBUG_CODE(SDA_DBG << log_message("copyScriptDatasetToInstance", + "findOne[instance for script]", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + + if ((err = connection->findOne(instance_found, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q))) { + SDA_ERR << CHAOS_FORMAT("Error executin query for load instance %1% for script %2%[%3%] with error [%4%]", % script_instance % script.unique_id % script.name % err); + } else { + if (instance_found.isEmpty()) { + SDA_ERR << CHAOS_FORMAT("The instance %1% for script %2%[%3%] has not been found", % script.name % script_instance % script.unique_id); } else { - //check the dataset presence within th script - if(script_found.hasElement(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION) == false) { - err = -100; - SDA_ERR << "The script ans't any dataset configured"; - } else { - //now we need to search the instance and verify that it si conencted to the script so we need one query bson objet - q = BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << script_instance << - chaos::NodeDefinitionKey::NODE_TYPE << chaos::NodeType::NODE_TYPE_CONTROL_UNIT << - chaos::NodeDefinitionKey::NODE_SUB_TYPE << chaos::NodeType::NODE_SUBTYPE_SCRIPTABLE_EXECUTION_UNIT << - chaos::NodeDefinitionKey::NODE_GROUP_SET << script.name << - "script_seq" << (long long)script.unique_id); - - DEBUG_CODE(SDA_DBG<<log_message("copyScriptDatasetToInstance", - "findOne[instance for script]", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - - if((err = connection->findOne(instance_found, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q))) { - SDA_ERR << CHAOS_FORMAT("Error executin query for load instance %1% for script %2%[%3%] with error [%4%]", %script_instance%script.unique_id%script.name%err); - } else { - if(instance_found.isEmpty()) { - SDA_ERR << CHAOS_FORMAT("The instance %1% for script %2%[%3%] has not been found", %script.name%script_instance%script.unique_id); - } else { - //now we can copy the dataset to the instance from his script - mongo::BSONObjBuilder ub; - //copy dataset - // ub << chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP << mongo::Date_t(TimingUtil::getTimeStamp()) << - // chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << script_found.getField(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)); - - //ccompose the laod parameter for describe the script language and content - const std::string script_language = script_found.getField(ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE).String(); - const std::string script_content = script_found.getField(ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_CONTENT).String(); - - //load parameter need to have script and dataset - Json::FastWriter fast_writer; - Json::Value script_load_parameter; - script_load_parameter[ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE] = script_language; - script_load_parameter[ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_CONTENT] = script_content; - - - CDataWrapper dataset_description; - //add node uid - dataset_description.addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, script_instance); - - std::vector<mongo::BSONElement> dataset_element = script_found.getField(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION).Array(); - - CDataWrapper node_dataset; - for(std::vector<mongo::BSONElement>::iterator it = dataset_element.begin(), - end = dataset_element.end(); - it != end; - it++) { - CDataWrapper dataset_element(it->embeddedObject().objdata()); - node_dataset.appendCDataWrapperToArray(dataset_element); - } - node_dataset.finalizeArrayForKey(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); - dataset_description.addCSDataValue(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION, node_dataset); - - - int bin_len; - const char * bin_data = dataset_description.getBSONRawData(bin_len); - const std::string encoded_binary_ds = base64_encode((unsigned char const *)bin_data, bin_len); - - script_load_parameter[ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION] = encoded_binary_ds; - ub.append(CHAOS_FORMAT("instance_description.%1%",%ControlUnitNodeDefinitionKey::CONTROL_UNIT_LOAD_PARAM), fast_writer.write(script_load_parameter)); - - //copy dataset to update bson objet - mongo::BSONObj u = BSON("$set" << ub.obj()); - - DEBUG_CODE(SDA_DBG<<log_message("copyScriptDatasetToInstance", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q, - u));) - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u))){ - SDA_ERR << CHAOS_FORMAT("Error updating instance %1% for script %2%[%3%] with error [%4%]", %script_instance%script.unique_id%script.name%err); - } - } - } + // now we can copy the dataset to the instance from his script + mongo::BSONObjBuilder ub; + // copy dataset + // ub << chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << BSON(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_TIMESTAMP << mongo::Date_t(TimingUtil::getTimeStamp()) << + // chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION << script_found.getField(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION)); + + // ccompose the laod parameter for describe the script language and content + const std::string script_language = script_found.getField(ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE).String(); + const std::string script_content = script_found.getField(ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_CONTENT).String(); + + // load parameter need to have script and dataset + Json::FastWriter fast_writer; + Json::Value script_load_parameter; + script_load_parameter[ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_LANGUAGE] = script_language; + script_load_parameter[ExecutionUnitNodeDefinitionKey::EXECUTION_SCRIPT_INSTANCE_CONTENT] = script_content; + + CDataWrapper dataset_description; + // add node uid + dataset_description.addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, script_instance); + + std::vector<mongo::BSONElement> dataset_element = script_found.getField(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION).Array(); + + CDataWrapper node_dataset; + for (std::vector<mongo::BSONElement>::iterator it = dataset_element.begin(), + end = dataset_element.end(); + it != end; + it++) { + if (it->embeddedObject().objdata()) { + CDataWrapper dataset_element(it->embeddedObject().objdata()); + node_dataset.appendCDataWrapperToArray(dataset_element); } + } + node_dataset.finalizeArrayForKey(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION); + dataset_description.addCSDataValue(chaos::ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION, node_dataset); + + int bin_len; + const char* bin_data = dataset_description.getBSONRawData(bin_len); + const std::string encoded_binary_ds = base64_encode((unsigned char const*)bin_data, bin_len); + + script_load_parameter[ControlUnitNodeDefinitionKey::CONTROL_UNIT_DATASET_DESCRIPTION] = encoded_binary_ds; + ub.append(CHAOS_FORMAT("instance_description.%1%", % ControlUnitNodeDefinitionKey::CONTROL_UNIT_LOAD_PARAM), fast_writer.write(script_load_parameter)); + + // copy dataset to update bson objet + mongo::BSONObj u = BSON("$set" << ub.obj()); + + DEBUG_CODE(SDA_DBG << log_message("copyScriptDatasetToInstance", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q, + u));) + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u))) { + SDA_ERR << CHAOS_FORMAT("Error updating instance %1% for script %2%[%3%] with error [%4%]", % script_instance % script.unique_id % script.name % err); + } } + } } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + } } - return err; + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } int MongoDBScriptDataAccess::instanceForUnitServerHeartbeat(const ChaosStringVector& script_instance_list, - const std::string& unit_server_parent, - uint32_t timeout) { - int err = 0; - mongo::BSONArrayBuilder bson_find_and; - mongo::BSONArrayBuilder bson_find_in; - CHAOS_ASSERT(utility_data_access) - try { - for(ChaosStringVectorConstIterator in_it = script_instance_list.begin(), - in_end = script_instance_list.end(); - in_it < in_end; - in_it++) { - //add every instance uid to the array - bson_find_in << *in_it; - } - uint64_t now = TimingUtil::getTimeStamp(); - mongo::Date_t start_timeout_date(now-timeout); - - //and rule for uid - bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << BSON("$in" << bson_find_in.arr())); - - //! for this unit server associaito - bson_find_and << BSON(CHAOS_FORMAT("instance_description.%1%",%chaos::NodeDefinitionKey::NODE_PARENT) << unit_server_parent); - - //not in timeout - //bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << BSON("$exists" << true << "$lte" << start_timeout_date)); - - //compose the query - mongo::BSONObj q = BSON("$and" << bson_find_and.arr()); - //we need to update only the timeout - mongo::BSONObj u = BSON("$set" << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << mongo::Date_t(now))); - DEBUG_CODE(SDA_DBG<<log_message("instanceHeartbeat", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q, - u));) - //inset on database new script description - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), - q, - u, - false, - true))) { - SDA_ERR << CHAOS_FORMAT("Error executin query for update running script intance with error [%1%]", %err); - } - } catch (const mongo::DBException &e) { - SDA_ERR << e.what(); - err = e.getCode(); + const std::string& unit_server_parent, + uint32_t timeout) { + int err = 0; + mongo::BSONArrayBuilder bson_find_and; + mongo::BSONArrayBuilder bson_find_in; + CHAOS_ASSERT(utility_data_access) + try { + for (ChaosStringVectorConstIterator in_it = script_instance_list.begin(), + in_end = script_instance_list.end(); + in_it < in_end; + in_it++) { + // add every instance uid to the array + bson_find_in << *in_it; + } + uint64_t now = TimingUtil::getTimeStamp(); + mongo::Date_t start_timeout_date(now - timeout); + + // and rule for uid + bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_UNIQUE_ID << BSON("$in" << bson_find_in.arr())); + + //! for this unit server associaito + bson_find_and << BSON(CHAOS_FORMAT("instance_description.%1%", % chaos::NodeDefinitionKey::NODE_PARENT) << unit_server_parent); + + // not in timeout + // bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << BSON("$exists" << true << "$lte" << start_timeout_date)); + + // compose the query + mongo::BSONObj q = BSON("$and" << bson_find_and.arr()); + // we need to update only the timeout + mongo::BSONObj u = BSON("$set" << BSON(chaos::NodeDefinitionKey::NODE_TIMESTAMP << mongo::Date_t(now))); + DEBUG_CODE(SDA_DBG << log_message("instanceHeartbeat", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q, + u));) + // inset on database new script description + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_NODES), + q, + u, + false, + true))) { + SDA_ERR << CHAOS_FORMAT("Error executin query for update running script intance with error [%1%]", % err); } - return err; + } catch (const mongo::DBException& e) { + SDA_ERR << e.what(); + err = e.getCode(); + } + return err; } #pragma Private Methods -mongo::Query MongoDBScriptDataAccess::getNextPagedQuery(uint64_t last_sequence, +mongo::Query MongoDBScriptDataAccess::getNextPagedQuery(uint64_t last_sequence, const std::string& search_string) { - mongo::Query q; - mongo::BSONObjBuilder bson_find; - mongo::BSONObjBuilder build_query_or; - mongo::BSONArrayBuilder bson_find_and; - - if(last_sequence){bson_find_and <<BSON("seq" << BSON("$lt"<<(long long)last_sequence));} - bson_find_and << BSON("$or" << getSearchTokenOnFiled(search_string, chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME)); - bson_find.appendArray("$and", bson_find_and.obj()); - q = bson_find.obj(); - return q.sort(BSON("seq"<<(int)1)); + mongo::Query q; + mongo::BSONObjBuilder bson_find; + mongo::BSONObjBuilder build_query_or; + mongo::BSONArrayBuilder bson_find_and; + + if (last_sequence) { + bson_find_and << BSON("seq" << BSON("$lt" << (long long)last_sequence)); + } + bson_find_and << BSON("$or" << getSearchTokenOnFiled(search_string, chaos::ExecutionUnitNodeDefinitionKey::CHAOS_SBD_NAME)); + bson_find.appendArray("$and", bson_find_and.obj()); + q = bson_find.obj(); + return q.sort(BSON("seq" << (int)1)); } -mongo::Query MongoDBScriptDataAccess::getNextPagedQueryForInstance(uint64_t last_sequence_before_this_page, +mongo::Query MongoDBScriptDataAccess::getNextPagedQueryForInstance(uint64_t last_sequence_before_this_page, const std::string& script_name, const std::string& search_string) { - mongo::Query q; - mongo::BSONObjBuilder bson_find; - mongo::BSONArrayBuilder bson_find_or; - mongo::BSONArrayBuilder bson_find_and; - std::vector<std::string> criteria_token; - - if(last_sequence_before_this_page){bson_find_and <<BSON("seq" << BSON("$lt"<<(long long)last_sequence_before_this_page));} - - - boost::split(criteria_token, search_string, - boost::is_any_of(" "), - boost::token_compress_on); - for (std::vector<std::string>::iterator it = criteria_token.begin(); - it != criteria_token.end(); - it++) { - bson_find_or << MONGODB_REGEX_ON_FILED(chaos::NodeDefinitionKey::NODE_UNIQUE_ID, ".*"+*it+".*"); - } - - bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_GROUP_SET << script_name); - bson_find_and << BSON("$or" << bson_find_or.arr()); - bson_find.appendArray("$and", bson_find_and.obj()); - q = bson_find.obj(); - return q.sort(BSON("seq"<<(int)1)); + mongo::Query q; + mongo::BSONObjBuilder bson_find; + mongo::BSONArrayBuilder bson_find_or; + mongo::BSONArrayBuilder bson_find_and; + std::vector<std::string> criteria_token; + + if (last_sequence_before_this_page) { + bson_find_and << BSON("seq" << BSON("$lt" << (long long)last_sequence_before_this_page)); + } + + boost::split(criteria_token, search_string, boost::is_any_of(" "), boost::token_compress_on); + for (std::vector<std::string>::iterator it = criteria_token.begin(); + it != criteria_token.end(); + it++) { + bson_find_or << MONGODB_REGEX_ON_FILED(chaos::NodeDefinitionKey::NODE_UNIQUE_ID, ".*" + *it + ".*"); + } + + bson_find_and << BSON(chaos::NodeDefinitionKey::NODE_GROUP_SET << script_name); + bson_find_and << BSON("$or" << bson_find_or.arr()); + bson_find.appendArray("$and", bson_find_and.obj()); + q = bson_find.obj(); + return q.sort(BSON("seq" << (int)1)); } - diff --git a/ChaosMetadataService/persistence/mongodb/MongoDBUtilityDataAccess.cpp b/ChaosMetadataService/persistence/mongodb/MongoDBUtilityDataAccess.cpp index 2807a15b4c0e040e2e70749f08038cd86016fe15..cc1c722d132fae8ae2fb4283c6d908da1ccdef23 100644 --- a/ChaosMetadataService/persistence/mongodb/MongoDBUtilityDataAccess.cpp +++ b/ChaosMetadataService/persistence/mongodb/MongoDBUtilityDataAccess.cpp @@ -19,8 +19,8 @@ * permissions and limitations under the Licence. */ -#include "mongo_db_constants.h" #include "MongoDBUtilityDataAccess.h" +#include "mongo_db_constants.h" #include <chaos/common/global.h> #include <chaos/common/utility/TimingUtil.h> @@ -28,229 +28,227 @@ #include <mongo/client/dbclient.h> #define MDBUDA_INFO INFO_LOG(MongoDBUtilityDataAccess) -#define MDBUDA_DBG DBG_LOG(MongoDBUtilityDataAccess) -#define MDBUDA_ERR ERR_LOG(MongoDBUtilityDataAccess) +#define MDBUDA_DBG DBG_LOG(MongoDBUtilityDataAccess) +#define MDBUDA_ERR ERR_LOG(MongoDBUtilityDataAccess) using namespace chaos::common::data; using namespace chaos::service_common::persistence::mongodb; using namespace chaos::metadata_service::persistence::mongodb; -MongoDBUtilityDataAccess::MongoDBUtilityDataAccess(const ChaosSharedPtr<service_common::persistence::mongodb::MongoDBHAConnectionManager>& _connection): -MongoDBAccessor(_connection){} +MongoDBUtilityDataAccess::MongoDBUtilityDataAccess(const ChaosSharedPtr<service_common::persistence::mongodb::MongoDBHAConnectionManager>& _connection) + : MongoDBAccessor(_connection) {} MongoDBUtilityDataAccess::~MongoDBUtilityDataAccess() {} int MongoDBUtilityDataAccess::getNextSequenceValue(const std::string& sequence_name, uint64_t& next_value) { - int err = 0; - mongo::BSONObj result; - mongo::BSONObjBuilder query; - mongo::BSONObjBuilder update; - try { - query << "seq" << sequence_name; - mongo::BSONObj q = query.obj(); - - //try to sse if we need to initialize - mongo::BSONObj ui = BSON("$setOnInsert" << BSON("value" << (int32_t)1)); - - DEBUG_CODE(MDBUDA_DBG<<log_message("getNextSequenceValue", - "update", + int err = 0; + mongo::BSONObj result; + mongo::BSONObjBuilder query; + mongo::BSONObjBuilder update; + try { + query << "seq" << sequence_name; + mongo::BSONObj q = query.obj(); + + // try to sse if we need to initialize + mongo::BSONObj ui = BSON("$setOnInsert" << BSON("value" << (int32_t)1)); + + DEBUG_CODE(MDBUDA_DBG << log_message("getNextSequenceValue", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update[upsert]", + q.toString(), + ui.toString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SEQUENCES), q, ui, true))) { + MDBUDA_ERR << "Error initilizing "; + } else { + update << "$inc" << BSON("value" << 1); + mongo::BSONObj u = update.obj(); + + DEBUG_CODE(MDBUDA_DBG << log_message("getNextSequenceValue", + "findAndModify", DATA_ACCESS_LOG_2_ENTRY("Query", - "Update[upsert]", + "Update", q.toString(), - ui.toString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SEQUENCES), q, ui, true))) { - MDBUDA_ERR << "Error initilizing "; - } else { - update << "$inc" << BSON("value" << 1); - mongo::BSONObj u = update.obj(); - - DEBUG_CODE(MDBUDA_DBG<<log_message("getNextSequenceValue", - "findAndModify", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q.toString(), - u.toString()));) - - if((err = connection->findAndModify(result, MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SEQUENCES), q, u, false, false))) { - MDBUDA_ERR << "Error updating "; - } else if (!result.hasField("value")){ - MDBUDA_ERR << "Error retriving the sequence value"; - err = -1; - } else { - next_value = (uint64_t)result["value"].numberLong(); - } - } - } catch (const mongo::DBException &e) { - MDBUDA_ERR << e.what(); + u.toString()));) + + if ((err = connection->findAndModify(result, MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_SEQUENCES), q, u, false, false))) { + MDBUDA_ERR << "Error updating "; + } else if (!result.hasField("value")) { + MDBUDA_ERR << "Error retriving the sequence value"; err = -1; + } else { + next_value = (uint64_t)result["value"].numberLong(); + } } - return err; + } catch (const mongo::DBException& e) { + MDBUDA_ERR << e.what(); + err = -1; + } + return err; } int MongoDBUtilityDataAccess::resetAllData() { - int err = 0; - try { - mongo::BSONObj q = BSON("ndk_uid" << BSON("$ne" << NodeType::NODE_TYPE_DATA_SERVICE)); - - MDBUDA_DBG<<"Start resetting mds data"; - - - const char* const collection[] = {MONGODB_COLLECTION_SEQUENCES, - MONGODB_COLLECTION_NODES, - MONGODB_COLLECTION_NODES_COMMAND, - MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE}; - - for(int idx = 0; - idx < 4; - idx++) { - MDBUDA_DBG<<"Remove all documents for:" << collection[idx]; - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(collection[idx]), q, false))) { - MDBUDA_ERR << "Error removing all documents from:" << collection[idx]; - } - } - } catch (const mongo::DBException &e) { - MDBUDA_ERR << e.what(); - err = -1; + int err = 0; + try { + mongo::BSONObj q = BSON("ndk_uid" << BSON("$ne" << NodeType::NODE_TYPE_DATA_SERVICE)); + + MDBUDA_DBG << "Start resetting mds data"; + + const char* const collection[] = {MONGODB_COLLECTION_SEQUENCES, + MONGODB_COLLECTION_NODES, + MONGODB_COLLECTION_NODES_COMMAND, + MONGODB_COLLECTION_NODES_COMMAND_TEMPLATE}; + + for (int idx = 0; + idx < 4; + idx++) { + MDBUDA_DBG << "Remove all documents for:" << collection[idx]; + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(collection[idx]), q, false))) { + MDBUDA_ERR << "Error removing all documents from:" << collection[idx]; + } } - return err; + } catch (const mongo::DBException& e) { + MDBUDA_ERR << e.what(); + err = -1; + } + return err; } -int MongoDBUtilityDataAccess::setVariable(const std::string& variable_name, - chaos::common::data::CDataWrapper& cdw){ - int err = 0; - int variable_size = 0; - try { - mongo::BSONObj q = BSON(VariableDefinitionKey::VARIABLE_NAME_KEY << variable_name); - mongo::BSONObj u = BSON("$set" << BSON(VariableDefinitionKey::VARIABLE_VALUE_KEY << mongo::BSONObj(cdw.getBSONRawData(variable_size)))); - DEBUG_CODE(MDBUDA_DBG<<log_message("setVariable", - "update", - DATA_ACCESS_LOG_2_ENTRY("Query", - "Update", - q.toString(), - u.toString()));) - - if((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), - q, - u, - true))) { - MDBUDA_ERR << CHAOS_FORMAT("Error setting the variable %1% with error %2%", %variable_name%err); - } - }catch (const mongo::DBException &e) { - MDBUDA_ERR << e.what(); - err = -1; +int MongoDBUtilityDataAccess::setVariable(const std::string& variable_name, + chaos::common::data::CDataWrapper& cdw) { + int err = 0; + int variable_size = 0; + try { + mongo::BSONObj q = BSON(VariableDefinitionKey::VARIABLE_NAME_KEY << variable_name); + mongo::BSONObj u = BSON("$set" << BSON(VariableDefinitionKey::VARIABLE_VALUE_KEY << mongo::BSONObj(cdw.getBSONRawData(variable_size)))); + DEBUG_CODE(MDBUDA_DBG << log_message("setVariable", + "update", + DATA_ACCESS_LOG_2_ENTRY("Query", + "Update", + q.toString(), + u.toString()));) + + if ((err = connection->update(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), + q, + u, + true))) { + MDBUDA_ERR << CHAOS_FORMAT("Error setting the variable %1% with error %2%", % variable_name % err); } - return err; + } catch (const mongo::DBException& e) { + MDBUDA_ERR << e.what(); + err = -1; + } + return err; } -int MongoDBUtilityDataAccess::searchVariable(chaos::common::data::CDataWrapper **res, - const std::string& search_string, - uint32_t last_sequence_id, - uint32_t page_length){ - int err = 0; - SearchResult paged_result; - mongo::BSONObjBuilder bson_find; - - try { - mongo::BSONObj p = BSON(chaos::VariableDefinitionKey::VARIABLE_NAME_KEY << 1); - //bson_find=getSearchTokenOnFiled(search_string, chaos::VariableDefinitionKey::VARIABLE_NAME_KEY); - //mongo::BSONObj q = bson_find.obj(); - mongo::BSONObj q =regexOnField( chaos::VariableDefinitionKey::VARIABLE_NAME_KEY,search_string); - - /*mongo::Query q = getNextPagedQuery(last_sequence_id, - search_string); - */ - DEBUG_CODE(MDBUDA_DBG<<log_message("searchVariable", - "performPagedQuery", - DATA_ACCESS_LOG_1_ENTRY("Query", - q));) - //inset on database new script description - if((err = performPagedQuery(paged_result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), - q, - &p, - NULL, - page_length))) { - MDBUDA_ERR << "Error calling performPagedQuery with error" << err; - } else { - DEBUG_CODE(MDBUDA_DBG << "The query '"<< q.toString() <<"' has found " << paged_result.size() << " result";) - if(paged_result.size()) { - *res = new CDataWrapper(); - - for (SearchResultIterator it = paged_result.begin(); - it != paged_result.end(); - it++) { - CDataWrapper element_found(it->objdata()); - element_found.addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID,element_found.getStringValue(chaos::VariableDefinitionKey::VARIABLE_NAME_KEY)); - (*res)->appendCDataWrapperToArray(element_found); - - DEBUG_CODE(MDBUDA_DBG << "Result '"<< element_found.getCompliantJSONString();) - - } - (*res)->finalizeArrayForKey(chaos::NodeType::NODE_SEARCH_LIST_KEY); - - } +int MongoDBUtilityDataAccess::searchVariable(chaos::common::data::CDataWrapper** res, + const std::string& search_string, + uint32_t last_sequence_id, + uint32_t page_length) { + int err = 0; + SearchResult paged_result; + mongo::BSONObjBuilder bson_find; + + try { + mongo::BSONObj p = BSON(chaos::VariableDefinitionKey::VARIABLE_NAME_KEY << 1); + // bson_find=getSearchTokenOnFiled(search_string, chaos::VariableDefinitionKey::VARIABLE_NAME_KEY); + // mongo::BSONObj q = bson_find.obj(); + mongo::BSONObj q = regexOnField(chaos::VariableDefinitionKey::VARIABLE_NAME_KEY, search_string); + + /*mongo::Query q = getNextPagedQuery(last_sequence_id, + search_string); + */ + DEBUG_CODE(MDBUDA_DBG << log_message("searchVariable", + "performPagedQuery", + DATA_ACCESS_LOG_1_ENTRY("Query", + q));) + // inset on database new script description + if ((err = performPagedQuery(paged_result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), + q, + &p, + NULL, + page_length))) { + MDBUDA_ERR << "Error calling performPagedQuery with error" << err; + } else { + DEBUG_CODE(MDBUDA_DBG << "The query '" << q.toString() << "' has found " << paged_result.size() << " result";) + if (paged_result.size()) { + *res = new CDataWrapper(); + + for (SearchResultIterator it = paged_result.begin(); + it != paged_result.end(); + it++) { + if (it->objdata()) { + CDataWrapper element_found(it->objdata()); + element_found.addStringValue(NodeDefinitionKey::NODE_UNIQUE_ID, element_found.getStringValue(chaos::VariableDefinitionKey::VARIABLE_NAME_KEY)); + (*res)->appendCDataWrapperToArray(element_found); + + DEBUG_CODE(MDBUDA_DBG << "Result '" << element_found.getCompliantJSONString();) + } } - - //now all other part of the script are managed with update - } catch (const mongo::DBException &e) { - MDBUDA_ERR << e.what(); - err = e.getCode(); + (*res)->finalizeArrayForKey(chaos::NodeType::NODE_SEARCH_LIST_KEY); + } } - return err; + // now all other part of the script are managed with update + } catch (const mongo::DBException& e) { + MDBUDA_ERR << e.what(); + err = e.getCode(); + } + return err; } -int MongoDBUtilityDataAccess::getVariable(const std::string& variable_name, - chaos::common::data::CDataWrapper **cdw){ - int err = 0; - try { - mongo::BSONObj result; - mongo::BSONObj q = BSON(VariableDefinitionKey::VARIABLE_NAME_KEY << variable_name); - - DEBUG_CODE(MDBUDA_DBG<<log_message("getVariable", - "findOne", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.toString()));) - if((err = connection->findOne(result, - MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), - q))) { - MDBUDA_ERR << CHAOS_FORMAT("Error find the variable '%1%' with error %2%", %variable_name%err); - } else if((result.isEmpty() == false)&& - result.hasField(VariableDefinitionKey::VARIABLE_VALUE_KEY)){ - mongo::BSONElement e = result[VariableDefinitionKey::VARIABLE_VALUE_KEY]; - if(e.type() == mongo::Object) { - int buffer_len = 0; - const char * bin_data = (const char * ) e.Obj().objdata(); - if(bin_data) { - *cdw = new CDataWrapper(bin_data); - } - } +int MongoDBUtilityDataAccess::getVariable(const std::string& variable_name, + chaos::common::data::CDataWrapper** cdw) { + int err = 0; + try { + mongo::BSONObj result; + mongo::BSONObj q = BSON(VariableDefinitionKey::VARIABLE_NAME_KEY << variable_name); + + DEBUG_CODE(MDBUDA_DBG << log_message("getVariable", + "findOne", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.toString()));) + if ((err = connection->findOne(result, + MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), + q))) { + MDBUDA_ERR << CHAOS_FORMAT("Error find the variable '%1%' with error %2%", % variable_name % err); + } else if ((result.isEmpty() == false) && + result.hasField(VariableDefinitionKey::VARIABLE_VALUE_KEY)) { + mongo::BSONElement e = result[VariableDefinitionKey::VARIABLE_VALUE_KEY]; + if (e.type() == mongo::Object) { + int buffer_len = 0; + const char* bin_data = (const char*)e.Obj().objdata(); + if (bin_data) { + *cdw = new CDataWrapper(bin_data); } - }catch (const mongo::DBException &e) { - MDBUDA_ERR << e.what(); - err = -1; + } } - return err; + } catch (const mongo::DBException& e) { + MDBUDA_ERR << e.what(); + err = -1; + } + return err; } int MongoDBUtilityDataAccess::deleteVariable(const std::string& variable_name) { - int err = 0; - try { - mongo::BSONObj q = BSON(VariableDefinitionKey::VARIABLE_NAME_KEY << variable_name); - - DEBUG_CODE(MDBUDA_DBG<<log_message("deleteVariable", - "delete", - DATA_ACCESS_LOG_1_ENTRY("Query", - q.toString()));) - - if((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), - q))) { - MDBUDA_ERR << CHAOS_FORMAT("Error deleting the variable %1% with error %2%", %variable_name%err); - } - }catch (const mongo::DBException &e) { - MDBUDA_ERR << e.what(); - err = -1; + int err = 0; + try { + mongo::BSONObj q = BSON(VariableDefinitionKey::VARIABLE_NAME_KEY << variable_name); + + DEBUG_CODE(MDBUDA_DBG << log_message("deleteVariable", + "delete", + DATA_ACCESS_LOG_1_ENTRY("Query", + q.toString()));) + + if ((err = connection->remove(MONGO_DB_COLLECTION_NAME(MONGODB_COLLECTION_VARIABLES), + q))) { + MDBUDA_ERR << CHAOS_FORMAT("Error deleting the variable %1% with error %2%", % variable_name % err); } - return err; + } catch (const mongo::DBException& e) { + MDBUDA_ERR << e.what(); + err = -1; + } + return err; }