Introduce 'activate' parameter to config stage handling

This functionality allows a stage to be uploaded and validated as
normal, but not activated. This is useful to pre-flight an Icinga config
package before it is applied to a monitoring cluster, for example in a
CI pipeline.
This commit is contained in:
Chris Boot 2019-09-24 17:17:19 +01:00
parent ac684ec128
commit aece8d61e2
3 changed files with 22 additions and 12 deletions

View File

@ -171,7 +171,7 @@ void ConfigPackageUtility::ActivateStage(const String& packageName, const String
WritePackageConfig(packageName);
}
void ConfigPackageUtility::TryActivateStageCallback(const ProcessResult& pr, const String& packageName, const String& stageName, bool reload)
void ConfigPackageUtility::TryActivateStageCallback(const ProcessResult& pr, const String& packageName, const String& stageName, bool activate, bool reload)
{
String logFile = GetPackageDir() + "/" + packageName + "/" + stageName + "/startup.log";
std::ofstream fpLog(logFile.CStr(), std::ofstream::out | std::ostream::binary | std::ostream::trunc);
@ -185,14 +185,16 @@ void ConfigPackageUtility::TryActivateStageCallback(const ProcessResult& pr, con
/* validation went fine, activate stage and reload */
if (pr.ExitStatus == 0) {
{
boost::mutex::scoped_lock lock(GetStaticPackageMutex());
if (activate) {
{
boost::mutex::scoped_lock lock(GetStaticPackageMutex());
ActivateStage(packageName, stageName);
ActivateStage(packageName, stageName);
}
if (reload)
Application::RequestRestart();
}
if (reload)
Application::RequestRestart();
} else {
Log(LogCritical, "ConfigPackageUtility")
<< "Config validation failed for package '"
@ -200,7 +202,7 @@ void ConfigPackageUtility::TryActivateStageCallback(const ProcessResult& pr, con
}
}
void ConfigPackageUtility::AsyncTryActivateStage(const String& packageName, const String& stageName, bool reload)
void ConfigPackageUtility::AsyncTryActivateStage(const String& packageName, const String& stageName, bool activate, bool reload)
{
VERIFY(Application::GetArgC() >= 1);
@ -226,7 +228,7 @@ void ConfigPackageUtility::AsyncTryActivateStage(const String& packageName, cons
Process::Ptr process = new Process(Process::PrepareCommand(args));
process->SetTimeout(Application::GetReloadTimeout());
process->Run(std::bind(&TryActivateStageCallback, _1, packageName, stageName, reload));
process->Run(std::bind(&TryActivateStageCallback, _1, packageName, stageName, activate, reload));
}
void ConfigPackageUtility::DeleteStage(const String& packageName, const String& stageName)

View File

@ -37,7 +37,7 @@ public:
static void SetActiveStage(const String& packageName, const String& stageName);
static void SetActiveStageToFile(const String& packageName, const String& stageName);
static void ActivateStage(const String& packageName, const String& stageName);
static void AsyncTryActivateStage(const String& packageName, const String& stageName, bool reload);
static void AsyncTryActivateStage(const String& packageName, const String& stageName, bool activate, bool reload);
static std::vector<std::pair<String, bool> > GetFiles(const String& packageName, const String& stageName);
@ -54,7 +54,7 @@ private:
static void WritePackageConfig(const String& packageName);
static void WriteStageConfig(const String& packageName, const String& stageName);
static void TryActivateStageCallback(const ProcessResult& pr, const String& packageName, const String& stageName, bool reload);
static void TryActivateStageCallback(const ProcessResult& pr, const String& packageName, const String& stageName, bool activate, bool reload);
};
}

View File

@ -112,6 +112,11 @@ void ConfigStagesHandler::HandlePost(
if (params->Contains("reload"))
reload = HttpUtility::GetLastParameter(params, "reload");
bool activate = true;
if (params->Contains("activate"))
activate = HttpUtility::GetLastParameter(params, "activate");
Dictionary::Ptr files = params->Get("files");
String stageName;
@ -120,12 +125,15 @@ void ConfigStagesHandler::HandlePost(
if (!files)
BOOST_THROW_EXCEPTION(std::invalid_argument("Parameter 'files' must be specified."));
if (reload && !activate)
BOOST_THROW_EXCEPTION(std::invalid_argument("Parameter 'reload' must be false when 'activate' is false."));
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticPackageMutex());
stageName = ConfigPackageUtility::CreateStage(packageName, files);
/* validate the config. on success, activate stage and reload */
ConfigPackageUtility::AsyncTryActivateStage(packageName, stageName, reload);
ConfigPackageUtility::AsyncTryActivateStage(packageName, stageName, activate, reload);
} catch (const std::exception& ex) {
return HttpUtility::SendJsonError(response, params, 500,
"Stage creation failed.",