61 startScenario(options.
command, localScen, options.
print, armarXManager->getIceManager()->getIceGridSession()->getAdmin(), options.
parameters);
66 if (app.get() !=
nullptr)
68 startApplication(options.
command, app, options.
print, armarXManager->getIceManager()->getIceGridSession()->getAdmin(), options.
parameters);
73 optionsManager.
showHelp(options,
"Could not find application '" + options.
applicationName +
"' in scenario '" + localScen->getName() +
"'");
80 std::cout <<
"Finished" << std::endl;
85 armarXManager->shutdown();
88 armarXManager->waitForShutdown();
92 int ScenarioCli::run(
int argc,
char* argv[])
95 using namespace Parser;
96 using namespace Data_Structure;
103 std::cout <<
"Failed to parse arguments. exiting";
106 ScenarioManagerCliOptions optionsManager;
107 options = optionsManager.parseCmdOptions(argc, argv);
110 if (!options.parameters.empty())
112 std::cout <<
"Additional command line parameters are: " << options.parameters << std::endl;
116 if (options.showHelp || options.error)
120 optionsManager.showHelp(options,
"Could not parse input parameters");
123 optionsManager.showHelp(options);
128 if (options.print && options.command !=
"start")
130 optionsManager.showHelp(options,
"Print is only a valid option for the start command");
133 else if (options.wait && (options.command ==
"list" || options.command ==
"status"))
135 optionsManager.showHelp(options,
"Wait is not valid for the list or status command");
138 else if (options.remote && options.command !=
"deploy")
140 optionsManager.showHelp(options,
"The remote options is only usable with the deploy command");
144 PackageBuilder builder;
147 if (options.command.compare(
"list") == 0)
149 std::cout <<
"Listing all Scenarios out of default Packages" << std::endl;
152 std::cout <<
"Scenarios in " <<
package << ":" << std::endl;
153 PackagePtr currentPackage = builder.parsePackage(package);
154 if (currentPackage.get() ==
nullptr)
156 std::cout <<
"Package " <<
package << " is listed in default packages, but could not be found" << std::endl << std::endl << std::endl;
159 for (
auto scenario : * (currentPackage->getScenarios()))
161 std::cout << scenario->getName() << std::endl;
163 std::cout << std::endl << std::endl;
168 std::string packageName = options.packageName;
171 if (options.packageName.empty())
173 if (std::filesystem::is_regular_file(std::filesystem::path(options.scxPath))
174 || std::filesystem::is_directory(std::filesystem::path(options.scxPath)))
177 std::string filePackageName;
178 if (std::filesystem::is_regular_file(std::filesystem::path(options.scxPath)))
180 filePackageName =
parser.getPackageNameFromScx(options.scxPath);
184 filePackageName =
parser.getPackageNameFromScx((std::filesystem::path(options.scxPath) / std::filesystem::path(scenarioName +
".scx")).string());
187 if (filePackageName !=
"")
189 packageName = filePackageName;
193 packageName = packageChoosingDialog(scenarioName);
194 if (packageName.empty())
196 options.error =
true;
197 optionsManager.showHelp(options,
"Could not find any package for " + options.scxPath +
". Please add a PackageName or Add the PackageName to your default config.");
204 packageName = packageChoosingDialog(scenarioName);
205 if (packageName.empty())
207 options.error =
true;
208 optionsManager.showHelp(options,
"Could not find any package for " + options.scxPath +
". Please add a PackageName or Add the PackageName to your default config.");
215 if (scenarioName.empty())
217 options.error =
true;
218 optionsManager.showHelp(options,
"Could not find Scenario " + options.scxPath +
" in Package " + packageName);
225 CMakePackageFinder finder(packageName);
226 if (!finder.packageFound())
228 options.error =
true;
229 optionsManager.showHelp(options,
"CMakePackageFinder could not find package '" + packageName +
"'");
234 std::vector<std::string> scenarios =
parser.getScenariosFromFolder(finder.getScenariosDir());
236 for (
auto scen : scenarios)
238 auto sFolderPos = scen.rfind(
"/");
239 if ((sFolderPos == std::string::npos && scen == scenarioName)
240 || (sFolderPos != std::string::npos && scen.substr(sFolderPos + 1) == scenarioName))
242 package = builder.parsePackage(packageName, StringList {scen + "::Package::" + packageName});
247 if (package.get() ==
nullptr)
249 optionsManager.showHelp(options,
"Failed to parse package " + packageName);
253 scenario = package->getScenarioByName(scenarioName);
255 if (scenario.get() ==
nullptr)
257 options.
error =
true;
258 optionsManager.showHelp(options,
"Could not find Scenario " + scenarioName +
" in Package " + package->getName());
262 if (options.command ==
"generate")
271 localScen = scenario;
273 const char* n_argv[] = {argv[0],
"--ArmarX.RedirectStdout=false"};
277 std::string ScenarioCli::packageChoosingDialog(std::string scenarioName)
280 using namespace Parser;
281 using namespace Data_Structure;
282 using namespace Exec;
283 StringList packages = PackageBuilder::FilterPackagesForScenario(scenarioName);
285 if (packages.size() == 0)
289 else if (packages.size() == 1)
293 else if (packages.size() > 1)
296 while (answer > packages.size())
298 std::cout <<
"Found multiple possible packages for this Scenario path, please select: " << std::endl;
300 for (
auto package : packages)
302 std::cout << number <<
") " <<
package << std::endl;
305 std::cout <<
"Please enter a number now: " << std::endl;
307 std::string answerString;
308 std::cin >> answerString;
311 answer = boost::lexical_cast<size_t>(answerString);
315 std::cout <<
"ERROR: Could not convert input to a number - please type in a number between 1 and " << packages.size() << std::endl << std::endl;
319 if (answer > packages.size() || answer == 0)
326 return packages[answer];
332 bool ScenarioCli::deployDialog()
334 std::cout <<
"Last time this Scenario was deployed via Ice, but it is not deployed right now" << std::endl;
335 std::cout <<
"If you want to start this scenario via ice please enter 1" << std::endl;
336 std::cout <<
"If you want to start this scenario locally please enter 2" << std::endl;
337 std::cout <<
"Your answer: ";
342 std::string answerString;
343 std::cin >> answerString;
346 answer = boost::lexical_cast<size_t>(answerString);
350 std::cout <<
"ERROR: Could not convert input to a number - please type either 1 or 2" << std::endl << std::endl;
367 using namespace Exec;
368 StopStrategyFactory stopStrategyFactory;
369 Executor executor(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()), StarterFactory::getFactory()->getStarter());
371 std::future<void> result;
377 executor.setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), scenario);
378 executor.setStopStrategy(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getIceStopper(iceAdmin)), scenario);
383 for (
auto app : *scenario->getApplications())
385 app->setStatus(executor.getApplicationStatus(app));
389 if (command ==
"status")
391 std::cout <<
"Status of " << scenario->getName() <<
" is: ";
414 if (executor.isScenarioDeployed(scenario))
416 std::cout <<
" (Deployed via Ice)";
420 std::cout <<
" (Running locally)";
422 std::cout << std::endl;
423 bool scenarioDeployed = executor.isScenarioDeployed(scenario);
424 for (
auto app : *scenario->getApplications())
426 std::cout <<
"\t " << app->getName() <<
" : ";
444 if (scenarioDeployed)
446 if (executor.isApplicationDeployed(app))
448 std::cout <<
" (Deployed)";
452 std::cout <<
" (Not Deployed)";
455 std::cout << std::endl;
459 else if (command ==
"periodic_status")
463 std::cout <<
"Status of " << scenario->getName() <<
" is: ";
465 if (scenario->getStatus() ==
"Running")
467 coloredStdOut(
"Running", 92);
469 else if (scenario->getStatus() ==
"Stopped")
471 coloredStdOut(
"Stopped", 31);
473 else if (scenario->getStatus() ==
"Mixed")
475 coloredStdOut(
"Mixed", 93);
477 std::cout << std::endl;
478 for (
auto app : *scenario->getApplications())
480 app->setStatus(executor.getApplicationStatus(app));
485 else if (command ==
"start")
489 std::cout <<
"Starting Scenario ";
491 if (iceApp && !executor.isScenarioDeployed(scenario))
495 executor.setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), scenario);
496 std::future<void> waiter = executor.deployScenario(scenario, printOnly, commandLineParameters);
502 executor.setStarter(StarterFactory::getFactory()->getStarter(), scenario);
503 executor.setStopStrategy(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()), scenario);
506 result = executor.startScenario(scenario, printOnly, commandLineParameters);
508 else if (command ==
"deploy")
510 std::cout <<
"Deploying Scenario ";
511 if (!iceApp && scenario->getStatus() != Data_Structure::ApplicationStatus::Stopped)
513 optionsManager.showHelp(options,
"You cannot deploy an Scenario which is already running locally. Please stop it first");
516 executor.setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), scenario);
525 result = executor.deployScenario(scenario, printOnly, commandLineParameters);
527 else if (command ==
"stop")
529 std::cout <<
"Stopping Scenario ";
530 result = executor.stopScenario(scenario);
532 else if (command ==
"kill")
534 std::cout <<
"Killing Scenario ";
537 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(StopperFactory::getFactory()->getPidStopper(), 500), scenario);
539 result = executor.stopScenario(scenario);
541 else if (command ==
"remove")
543 std::cout <<
"Removing Scenario ";
544 executor.setStopStrategy(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getIceStopper(iceAdmin)), scenario);
545 result = executor.removeScenario(scenario);
547 else if (command ==
"restart")
552 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(StopperFactory::getFactory()->getPidStopper(), 500), scenario);
554 result = executor.restartScenario(scenario, printOnly);
559 std::cout << scenario->getName() << std::endl;
568 using namespace Exec;
569 StopStrategyFactory stopStrategyFactory;
570 Executor executor(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()), StarterFactory::getFactory()->getStarter());
572 std::future<void> result;
578 executor.setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), app->getScenario());
579 executor.setStopStrategy(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getIceStopper(iceAdmin)), app->getScenario());
584 app->setStatus(executor.getApplicationStatus(app));
586 if (command ==
"status")
588 std::cout <<
"Status of " << app->getName() <<
"is: ";
605 if (executor.isApplicationDeployed(app))
607 std::cout <<
" (Deployed via Ice)";
611 std::cout <<
" (Running locally)";
613 std::cout << std::endl;
616 else if (command ==
"start")
620 std::cout <<
"Starting Application ";
622 if (iceApp && !executor.isApplicationDeployed(app))
626 executor.deployApplication(app, printOnly, commandLineParameters);
631 executor.setStarter(StarterFactory::getFactory()->getStarter(), app->getScenario());
632 executor.setStopStrategy(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getPidStopper()), app->getScenario());
636 result = executor.startApplication(app, printOnly, commandLineParameters);
638 else if (command ==
"deploy")
640 std::cout <<
"Deploying Application ";
641 if (!iceApp && app->getStatus() != Data_Structure::ApplicationStatus::Stopped)
643 optionsManager.showHelp(options,
"You cannot deploy an Scenario which is already running locally. Please stop it first");
646 executor.setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), app->getScenario());
647 result = executor.deployApplication(app, printOnly, commandLineParameters);
649 else if (command ==
"stop")
651 std::cout <<
"Stopping Application ";
652 result = executor.stopApplication(app);
654 else if (command ==
"kill")
656 std::cout <<
"Killing Application ";
659 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(StopperFactory::getFactory()->getByNameStopper(), 0), app->getScenario());
661 result = executor.stopApplication(app);
663 else if (command ==
"remove")
665 std::cout <<
"Removing Application ";
666 executor.setStopStrategy(stopStrategyFactory.getStopStrategy(StopperFactory::getFactory()->getIceStopper(iceAdmin)), app->getScenario());
667 result = executor.removeApplication(app);
669 else if (command ==
"restart")
671 std::cout <<
"Restarting Application ";
674 executor.setStopStrategy(stopStrategyFactory.getStopAndKillStrategy(StopperFactory::getFactory()->getByNameStopper(), 0), app->getScenario());
676 result = executor.restartApplication(app, printOnly);
681 std::cout << app->getName() << std::endl;
686 void ScenarioCli::coloredStdOut(std::string
message,
int colorCode)
688 std::cout <<
"\033[" << colorCode <<
"m" <<
message <<
"\033[0m";