DeploymentLinkForm: introduce new form
This commit is contained in:
parent
5d01c1d843
commit
1ba276cf15
|
@ -0,0 +1,154 @@
|
|||
<?php
|
||||
|
||||
namespace Icinga\Module\Director\Forms;
|
||||
|
||||
use Icinga\Authentication\Auth;
|
||||
use Icinga\Exception\IcingaException;
|
||||
use Icinga\Module\Director\Core\CoreApi;
|
||||
use Icinga\Module\Director\Db;
|
||||
use Icinga\Module\Director\Deployment\DeploymentInfo;
|
||||
use Icinga\Module\Director\IcingaConfig\IcingaConfig;
|
||||
use Icinga\Module\Director\Web\Form\DirectorForm;
|
||||
use ipl\Html\Icon;
|
||||
use Zend_View_Interface;
|
||||
|
||||
class DeploymentLinkForm extends DirectorForm
|
||||
{
|
||||
/** @var DeploymentInfo */
|
||||
protected $info;
|
||||
|
||||
/** @var Auth */
|
||||
protected $auth;
|
||||
|
||||
/** @var CoreApi */
|
||||
protected $api;
|
||||
|
||||
/** @var Db */
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* @param DeploymentInfo $info
|
||||
* @param Auth $auth
|
||||
* @return static
|
||||
*/
|
||||
public static function create(Db $db, DeploymentInfo $info, Auth $auth, CoreApi $api)
|
||||
{
|
||||
$self = static::load();
|
||||
$self->setAuth($auth);
|
||||
$self->db = $db;
|
||||
$self->info = $info;
|
||||
$self->api = $api;
|
||||
return $self;
|
||||
}
|
||||
|
||||
public function setAuth(Auth $auth)
|
||||
{
|
||||
$this->auth = $auth;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setup()
|
||||
{
|
||||
if (! $this->canDeploy()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$onObject = $this->info->getSingleObjectChanges();
|
||||
$total = $this->info->getTotalChanges();
|
||||
|
||||
if ($onObject === 0) {
|
||||
if ($total === 1) {
|
||||
$msg = $this->translate('There is a single pending change');
|
||||
} else {
|
||||
$msg = sprintf(
|
||||
$this->translate('There are %d pending changes'),
|
||||
$total
|
||||
);
|
||||
}
|
||||
} elseif ($total === 1) {
|
||||
$msg = $this->translate('There has been a single change to this object, nothing else has been modified');
|
||||
} elseif ($total === $onObject) {
|
||||
$msg = sprintf(
|
||||
$this->translate('There have be+en %d changes to this object, nothing else has been modified'),
|
||||
$onObject
|
||||
);
|
||||
} else {
|
||||
$msg = sprintf(
|
||||
$this->translate('There are %d pending changes, %d of them applied to this object'),
|
||||
$total,
|
||||
$onObject
|
||||
);
|
||||
}
|
||||
|
||||
$this->setAttrib('class', 'inline');
|
||||
$this->addHtml(Icon::create('wrench'));
|
||||
$this->addSubmitButton($this->translate('Deploy'), [
|
||||
'class' => 'link-button icon-wrench',
|
||||
'title' => $msg,
|
||||
'data-base-target' => '_next'
|
||||
]);
|
||||
}
|
||||
|
||||
protected function canDeploy()
|
||||
{
|
||||
return $this->auth->hasPermission('director/deploy');
|
||||
}
|
||||
|
||||
public function render(Zend_View_Interface $view = null)
|
||||
{
|
||||
if (! $this->canDeploy()) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return parent::render($view);
|
||||
}
|
||||
|
||||
public function onSuccess()
|
||||
{
|
||||
$this->deploy();
|
||||
}
|
||||
|
||||
public function deploy()
|
||||
{
|
||||
$this->setSuccessUrl('director/config/deployments');
|
||||
$config = IcingaConfig::generate($this->db);
|
||||
$checksum = $config->getHexChecksum();
|
||||
|
||||
try {
|
||||
$this->api->wipeInactiveStages($this->db);
|
||||
} catch (\Exception $e) {
|
||||
$this->notifyError($e->getMessage());
|
||||
}
|
||||
|
||||
if ($this->api->dumpConfig($config, $this->db)) {
|
||||
$this->deploymentSucceeded($checksum);
|
||||
} else {
|
||||
$this->deploymentFailed($checksum);
|
||||
}
|
||||
}
|
||||
|
||||
protected function deploymentSucceeded($checksum)
|
||||
{
|
||||
if ($this->getRequest()->isApiRequest()) {
|
||||
throw new IcingaException('Not yet');
|
||||
// $this->sendJson($this->getResponse(), (object) array('checksum' => $checksum));
|
||||
} else {
|
||||
$msg = $this->translate('Config has been submitted, validation is going on');
|
||||
$this->redirectOnSuccess($msg);
|
||||
}
|
||||
}
|
||||
|
||||
protected function deploymentFailed($checksum, $error = null)
|
||||
{
|
||||
$extra = $error ? ': ' . $error: '';
|
||||
|
||||
if ($this->getRequest()->isApiRequest()) {
|
||||
throw new IcingaException('Not yet');
|
||||
// $this->sendJsonError($this->getResponse(), 'Config deployment failed' . $extra);
|
||||
} else {
|
||||
$msg = $this->translate('Config deployment failed') . $extra;
|
||||
$this->notifyError($msg);
|
||||
$this->redirectAndExit('director/config/deployments');
|
||||
}
|
||||
}
|
||||
}
|
|
@ -363,7 +363,7 @@ abstract class ObjectController extends ActionController
|
|||
|
||||
if (! $this->getRequest()->isApiRequest()) {
|
||||
$this->actions()->add(
|
||||
DeploymentLinkForm::create($info, $this->Auth())->handleRequest()
|
||||
DeploymentLinkForm::create($this->db(), $info, $this->Auth(), $this->api())->handleRequest()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue