host/config/ConfiguratorAPITestBed/ConfiguratorAPITestBed.cpp (468 lines of code) (raw):

// ConfiguratorAPITestBed.cpp : Defines the entry point for the console application. // #ifdef SV_WINDOWS #include "stdafx.h" #endif #include <ace/Init_ACE.h> #include <ace/OS_main.h> #include <cstdlib> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include "sigslot.h" #include "portablehelpers.h" #include "dataprotectionexception.h" #include "configurator2.h" #include "localconfigurator.h" #include "TestVolumeManager.h" #include "Globals.h" #include "TestSnapshotAPIs.h" #include "../tal/HandlerCurl.h" #include "inmsafecapis.h" #include "terminateonheapcorruption.h" #include "AgentHealthContract.h" #include <iostream> using namespace std; Configurator* TheConfigurator = 0; extern string targetdrive; void run(int argc, char *argv[]); void usage(char *exename) { stringstream out; out << "usage: " << exename << " --default --fromcache\n" <<" "<<exename << " --SourceHealth\n" << " " << exename << " --custom --ip <cx-ip> --port <cx-port> --hostid <hostid>\n" << "\n where --fromcache is optional, this option should given if we want to fetch data from cache\n"; cout << out.str().c_str(); } int tabs = 0; void PopulateVSSWriter(SourceAgentProtectionPairHealthIssues & sapphl) { //VSS Writer Health Issue std::vector<HealthIssue> aglHealthIssues; std::map<std::string, std::string> vssWriterParams1; vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::HealthCode,"ECH00031" }); vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::ErrorCode,"0x8004230c" }); vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::Operation,"Snapshot" }); vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::WriteName,"SQL VSS Writer" }); HealthIssue hiVssWriter1(std::string("ECH00031"), vssWriterParams1); aglHealthIssues.push_back(hiVssWriter1); sapphl.HealthIssues = aglHealthIssues; cout << endl << "Posting VSS Writer Health Issue" << endl; } void PopulateVSSProvider(SourceAgentProtectionPairHealthIssues & sapphl) { //VSS Provider Health Issue std::vector<HealthIssue> aglHealthIssues; HealthIssue hiVssProvider(std::string("ECH00030"), std::map<std::string, std::string>()); aglHealthIssues.push_back(hiVssProvider);//agent level health issues sapphl.HealthIssues = aglHealthIssues; cout << endl << "Posting VSS Provider Health Issue..." << endl; } void PopulatePeakChurn(SourceAgentProtectionPairHealthIssues & sapphl,std::vector<std::string> &vDiskIds,bool canDiskHealthIssuesBePosted) { if (!canDiskHealthIssuesBePosted) return; std::vector<HealthIssue> aglHealthIssues; std::vector<AgentDiskLevelHealthIssue> dlHealthIssues;//disk level health issues std::map<std::string, std::string>peakChurnParams; for (int i = 0; i < vDiskIds.size(); i++) { int nChurn = 60 % std::rand(); int nTotalChurn = 60 + nChurn; std::string strPeakChurn = boost::lexical_cast<std::string>(nTotalChurn); //peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::HealthCode,"SourceAgentPeakChurnObserved" }); peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::ChurnRate,strPeakChurn }); peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::UploadPending,"200 MB" }); peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::ObservationTime,"2019-Jul-15 18:41:00 UTC" }); AgentDiskLevelHealthIssue hiPeakChurn(vDiskIds[i], AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::HealthCode, peakChurnParams); dlHealthIssues.push_back(hiPeakChurn); sapphl.DiskLevelHealthIssues = dlHealthIssues; peakChurnParams.clear(); } cout << endl << "Posting Peak Churn Health Issue..." << endl; } void PopulateHighLatency(SourceAgentProtectionPairHealthIssues & sapphl, std::vector<std::string> &vDiskIds, bool canDiskHealthIssuesBePosted) { if (!canDiskHealthIssuesBePosted) return; std::vector<HealthIssue> aglHealthIssues; std::vector<AgentDiskLevelHealthIssue> dlHealthIssues;//disk level health issues std::map<std::string, std::string>highLatencyParams; for (int i = 0; i < vDiskIds.size(); i++) { int nLatencyChurn = 200 % std::rand(); int nTotalLatencyChurn = 60 + nLatencyChurn; std::string strHighLatencyChurn = boost::lexical_cast<std::string>(nTotalLatencyChurn); //highLatencyParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::HealthCode,"SourceAgentHighLatencyObserved" }); highLatencyParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::UploadPending,strHighLatencyChurn }); highLatencyParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::ObservationTime,"2019-Jun-18 19:21:00 UTC" }); AgentDiskLevelHealthIssue hiHighLatency(vDiskIds[i], AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::HealthCode, highLatencyParams); dlHealthIssues.push_back(hiHighLatency); sapphl.DiskLevelHealthIssues = dlHealthIssues; highLatencyParams.clear(); } cout << endl << "Posting High Latency Health Issue..." << endl; } void PostHealthIssues(SourceAgentProtectionPairHealthIssues & sapphl) { TheConfigurator->getVxAgent().ReportAgentHealthStatus(sapphl); } void ClearAllHealthIssues(SourceAgentProtectionPairHealthIssues & sapphl) { cout << endl << "Clearing All the Health Issues..." << endl; sapphl.HealthIssues.clear(); sapphl.DiskLevelHealthIssues.clear(); TheConfigurator->getVxAgent().ReportAgentHealthStatus(sapphl); } int main( int argc, char* argv[] ) { TerminateOnHeapCorruption(); init_inm_safe_c_apis(); // PR#10815: Long Path support ACE::init(); run(argc, argv); return 0; } void run(int argc, char *argv[]) { tal::GlobalInitialize(); boost::shared_ptr<void> guardTal( static_cast<void*>(0), boost::bind(tal::GlobalShutdown) ); MaskRequiredSignals(); LocalConfigurator lconfigurator ; std::map<string, string> options; do { if (argc < 2) { usage(argv[0]); break; } if ((0 == stricmp(argv[1], "--h")) || (0 == stricmp(argv[1], "--help" ))) { usage(argv[0]); break; } else if (0 == stricmp(argv[1], "--default")) { try { ConfigSource configSource = FETCH_SETTINGS_FROM_CX; if ((argc > 2) && (0 == stricmp(argv[2], "--fromcache"))) { cout << "Parsing cache setting \n\n"; configSource = USE_ONLY_CACHE_SETTINGS; } cout << "PARSING INITIAL SETTINGS START" << endl; cout << "------------------------------" << endl; cout << endl << endl; //Configurator * configurator = 0; std::string configcachepath ; SerializeType_t serializerType = lconfigurator.getSerializerType() ; if (!InitializeConfigurator(&TheConfigurator,configSource, serializerType,configcachepath)) { std::cout << "Failed to get the configurator" << std::endl; break; } TheConfigurator->GetCurrentSettings() ; cout << "PARSING INITIAL SETTINGS END" << endl; cout << "----------------------------" << endl; //TheConfigurator = configurator; } catch( std::exception const& e ) { std::cout << "exception: " << e.what() << std::endl; break; } } else if (0 == stricmp(argv[1], "--custom")) { if (argc != 8) { usage(argv[0]); break; } for (int i=2;i < 8; i+=2) options[argv[i]] = argv[i+1]; std::map<string, string>::iterator endit = options.end(); if ((options.find("--ip") == endit) || (options.find("--port") == endit) || (options.find("--hostid") == endit)) { usage(argv[0]); break; } try { cout << "PARSING INITIAL SETTINGS START" << endl; cout << "------------------------------" << endl; int const port = atoi(options["--port"].c_str()); if(!InitializeConfigurator(&TheConfigurator,options["--ip"], port, options["--hostid"] )) { std::cout << "Failed to get configurator" << std::endl; break; } cout << "PARSING INITIAL SETTINGS END" << endl; cout << "----------------------------" << endl; cout << endl; //TheConfigurator = configurator; } catch( std::exception const& e ) { std::cout << "exception: " << e.what() << std::endl; break; } } else if (boost::iequals(std::string(argv[1]), std::string("--SourceHealth"))) { ConfigSource configSource = FETCH_SETTINGS_FROM_CX; cout << "Parsing cache setting \n\n"; configSource = USE_ONLY_CACHE_SETTINGS; std::string configcachepath; SerializeType_t serializerType = lconfigurator.getSerializerType(); if (!InitializeConfigurator(&TheConfigurator, configSource, serializerType, configcachepath)) { std::cout << "Failed to get the configurator" << std::endl; break; } bool bV2AProvider = true; char choice_provider; std::string strHostId; std::cout << std::endl << "Is this for V2A (y/n)(default:y)? "; std::cin >> choice_provider; if ((choice_provider == 'y') || (choice_provider == 'Y')) { bV2AProvider = true; } else { bV2AProvider = false; std::cout << std::endl << "Enter HostId of the Protected Source Machine : "; std::cin >> strHostId; } char option; int numOfDisks; std::vector<std::string>vDiskSignatures; std::string strDiskSignature; bool bCanDiskLevelHealthIssuesbeGenerated = true; cout << "Do you want to generate Disk Level Health Issues. (y/n)?"; cin >> option; if ((option == 'y') || (option == 'Y')) { cout << endl << "On How many disks you want to generate Disk Level Health Issues?"; cin >> numOfDisks; for (int i = 0; i < numOfDisks; i++) { cout << endl << "Enter the disk signature of Disk" << i << ":"; cin >> strDiskSignature; strDiskSignature = std::string("{") + strDiskSignature + std::string("}"); cout << endl << "Disk Id:" << strDiskSignature; vDiskSignatures.push_back(strDiskSignature); } } else { cout << endl << "No Disk Level Health Issues can be generated." << endl; bCanDiskLevelHealthIssuesbeGenerated = false; } bool bHealthIssues = true; do { cout << "Choose options for issuing Health Issues to Cx >> " << endl; cout << "(0) -- Clear all Health Issues." << endl; cout << "(1) -- VM Level: VSS Writer Health Issue." << endl; cout << "(2) -- VM Level: VSS Provider Health Issue." << endl; cout << "(3) -- Disk Level: Peak Churn Health Issue." << endl; cout << "(4) -- Disk Level: High Latency Health Issue." << endl; cout << "(5) -- Disk Level: Peak Churn + High Latency Health Issue." << endl; cout << "(6) -- VM + Disk Level: Peak Churn + VSS Writer Health Issue." << endl; cout << "(7) -- VM + Disk Level: Peak Churn + VSS Provider Health Issue." << endl; cout << "(8) -- VM + Disk Level: High Latency + VSS Writer Health Issue." << endl; cout << "(9) -- VM + Disk Level: High Latency + VSS Provider Health Issue." << endl; cout << "(10) -- VM + Disk Level: High Latency + Peak Churn + VSS Writer Health Issue." << endl; cout << "(11) -- VM + Disk Level: High Latency + Peak Churn + VSS Provider Health Issue." << endl; cout << "(12) -- VM + Disk Level: High Latency + Peak Churn + VSS Writer + VSS Provider Health Issue." << endl; cout << "(20) -- Do you want to continue? \n"<< endl; cout << "\nEnter option : >>"; int choose; cin >> choose; switch (choose) { case 0://"(0) -- Clear all Health Issues" { SourceAgentProtectionPairHealthIssues Health; ClearAllHealthIssues(Health); break; } case 1://"(1) -- VM Level: VSS Writer Health Issue." { //VSS Writer Health Issue SourceAgentProtectionPairHealthIssues Health; PopulateVSSWriter(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 2://"(2) -- VM Level: VSS Provider Health Issue." { //Vss Provider Health Issue SourceAgentProtectionPairHealthIssues Health; PopulateVSSProvider(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 3://"(3) -- Disk Level: Peak Churn Health Issue." { //Peak Churn Health Issue SourceAgentProtectionPairHealthIssues Health; PopulatePeakChurn(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 4://"(4) -- Disk Level: High Latency Health Issue." { //High Latency Health Issue SourceAgentProtectionPairHealthIssues Health; PopulateHighLatency(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 5://"(5) -- Disk Level: Peak Churn + High Latency Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulatePeakChurn(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateHighLatency(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 6://"(6) -- VM + Disk Level: Peak Churn + VSS Writer Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulatePeakChurn(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateVSSWriter(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 7://"(7) -- VM + Disk Level: Peak Churn + VSS Provider Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulatePeakChurn(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateVSSProvider(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 8://"(8) -- VM + Disk Level: High Latency + VSS Writer Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulateHighLatency(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateVSSWriter(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 9://"(9) -- VM + Disk Level: High Latency + VSS Provider Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulateHighLatency(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateVSSProvider(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 10://"(10) -- VM + Disk Level: High Latency + Peak Churn + VSS Writer Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulateHighLatency(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulatePeakChurn(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateVSSWriter(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 11://"(11) -- VM + Disk Level: High Latency + Peak Churn + VSS Provider Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulateHighLatency(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulatePeakChurn(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateVSSProvider(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 12://"(12) -- VM + Disk Level: High Latency + Peak Churn + VSS Writer + VSS Provider Health Issue." { SourceAgentProtectionPairHealthIssues Health; PopulateHighLatency(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulatePeakChurn(Health, vDiskSignatures, bCanDiskLevelHealthIssuesbeGenerated); PopulateVSSWriter(Health); PopulateVSSProvider(Health); //PostHealthIssues(Health,strHostId,bV2AProvider); PostHealthIssues(Health); break; } case 20://"(20) -- VM Level: VSS Writer Health Issue." { char opt; cout << endl << "Do you want to continue(y:Exit/n:Continue)? "; cin >> opt; if ((opt == 'y') || (opt == 'Y')) { bHealthIssues = false; exit(0); }; break; } } } while (bHealthIssues); } else { cout << "Error..." << endl; usage(argv[0]); break; } cout << "Choose options for getting Cx settings >> " << endl; cout << "(1) -- All settings" << endl; cout << "(2) -- Initial Settings" << endl; cout << "(3) -- Snapshot Settings" << endl; cout << "(4) -- getReplicationPairInfo" << endl; cout << "(5) -- postHealthIssues" << endl; cout << "\nEnter option : >>"; int choose; cin >> choose; switch (choose) { case 1: { TestGetInitialSettings* tgis = static_cast<TestGetInitialSettings*>(TheConfigurator); if (tgis) tgis->Print(); TestSnapshotAPIs tSnapApis; tSnapApis.TestGetSnapshotRequestFromCx(); break; } case 2: { TestGetInitialSettings* tgis = static_cast<TestGetInitialSettings*>(TheConfigurator); if (tgis) tgis->Print(); break; } case 3: { TestSnapshotAPIs tSnapApis; tSnapApis.TestGetSnapshotRequestFromCx(); break; } case 4: { std::map<std::string, std::string> map_info; map_info = TheConfigurator->getReplicationPairInfo("imitswks105"); std::map<std::string, std::string>::iterator it = map_info.begin(); for (;it != map_info.end(); it++) cout << "first = " << it->first << ", second = " << it->second << endl; } case 5: { SourceAgentProtectionPairHealthIssues agentHealth; std::vector<HealthIssue> aglHealthIssues; //Vss Writer HealthIssue std::map<std::string, std::string> vssWriterParams1; vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::HealthCode,"ECH00031" }); vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::ErrorCode,"0x8004230c" }); vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::Operation,"Snapshot" }); vssWriterParams1.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::WriteName,"SQL VSS Writer" }); //HealthIssue hiVssWriter1(std::string("ECH00031"), vssWriterParams1); //aglHealthIssues.push_back(hiVssWriter1); //agentHealth.HealthIssues = aglHealthIssues; //cout << endl << "Posting only one Agentlevel Health Issue..." << endl; //TheConfigurator->getVxAgent().ReportAgentHealthStatus(agentHealth); //Vss Writer Health Issue; std::map<std::string, std::string> vssWriterParams2; vssWriterParams2.insert({AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::HealthCode,"ECH00031"}); vssWriterParams2.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::ErrorCode,"0x8004233c" }); vssWriterParams2.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::Operation,"Backup" }); vssWriterParams2.insert({ AgentHealthIssueCodes::VMLevelHealthIssues::VssWriterFailure::WriteName,"Sharepoint VSS Writer" }); HealthIssue hiVssWriter2(std::string("ECH00031"), vssWriterParams2); //aglHealthIssues.push_back(hiVssWriter2); // agentHealth.HealthIssues = aglHealthIssues; //cout << endl << "Posting two Agentlevel Health Issues..." << endl; //TheConfigurator->getVxAgent().ReportAgentHealthStatus(agentHealth); //Vss Provider Health Issue HealthIssue hiVssProvider(std::string("ECH00030"), std::map<std::string, std::string>()); //aglHealthIssues.push_back(hiVssProvider);//agent level health issues //agentHealth.HealthIssues = aglHealthIssues; //cout << endl << "Posting three Agentlevel Health Issues..." << endl; //TheConfigurator->getVxAgent().ReportAgentHealthStatus(agentHealth); std::vector<AgentDiskLevelHealthIssue> dlHealthIssues;//disk level health issues std::map<std::string, std::string>peakChurnParams; peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::HealthCode,"SourceAgentPeakChurnObserved" }); peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::ChurnRate,"60 MBPS" }); peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::UploadPending,"200 MB" }); peakChurnParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::ObservationTime,"2019-Jul-15 18:41:00" }); AgentDiskLevelHealthIssue hiPeakChurn(std::string("{4087759736}"), AgentHealthIssueCodes::DiskLevelHealthIssues::PeakChurn::HealthCode, peakChurnParams); dlHealthIssues.push_back(hiPeakChurn); agentHealth.DiskLevelHealthIssues = dlHealthIssues; cout << endl << "Posting 3 Agent Level and 1 Disk Level Health Issues..." << endl; TheConfigurator->getVxAgent().ReportAgentHealthStatus(agentHealth); /*std::map<std::string, std::string>highLatencyParams; highLatencyParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::HealthCode,"SourceAgentHighLatencyObserved"}); highLatencyParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::UploadPending,"205 MB" }); highLatencyParams.insert({ AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::ObservationTime,"2019-Jun-18 19:21:00" }); AgentDiskLevelHealthIssue hiHighLatency(std::string("{3C48DD76-BE19-42A8-A8C7-5FD182E8E64B}"), AgentHealthIssueCodes::DiskLevelHealthIssues::HighLatency::HealthCode, highLatencyParams); dlHealthIssues.push_back(hiHighLatency); agentHealth.DiskLevelHealthIssues = dlHealthIssues; agentHealth.HealthIssues = aglHealthIssues; cout << endl << "Posting 3 Agent Level and 2 Disk Level Health Issues..." << endl; TheConfigurator->getVxAgent().ReportAgentHealthStatus(agentHealth);*/ } break; default: break; } } while (false); }