Support the rendering of service custom variable in Dependencies form

This commit is contained in:
Ravi Kumar Kempapura Srinivasa 2021-03-10 09:42:09 +01:00 committed by raviks789
parent c65369602f
commit 1b74177d6d
2 changed files with 100 additions and 25 deletions

View File

@ -5,6 +5,7 @@ namespace Icinga\Module\Director\Forms;
use Icinga\Module\Director\Data\Db\DbObject; use Icinga\Module\Director\Data\Db\DbObject;
use Icinga\Module\Director\Web\Form\DirectorObjectForm; use Icinga\Module\Director\Web\Form\DirectorObjectForm;
use Icinga\Module\Director\Objects\IcingaDependency; use Icinga\Module\Director\Objects\IcingaDependency;
use Zend_Validate_Callback;
class IcingaDependencyForm extends DirectorObjectForm class IcingaDependencyForm extends DirectorObjectForm
{ {
@ -196,34 +197,79 @@ class IcingaDependencyForm extends DirectorObjectForm
$parentHost = '$' . $dependency->get('parent_host_var') . '$'; $parentHost = '$' . $dependency->get('parent_host_var') . '$';
} }
} }
$parentHostDescription = $this->translate('Optional. The parent host.');
$applyTo = $this->getSentOrObjectValue('apply_to');
$parentHostValidator = new Zend_Validate_Callback(function ($value) use ($applyTo) {
if ($applyTo === 'host' && $this->isCustomVar($value)) {
return explode('.', trim($value, '$'))[0] === 'host';
}
return true;
});
$parentHostValidator->setMessage(
$this->translate('The parent host cannot be a service custom variable for a host dependency'),
Zend_Validate_Callback::INVALID_VALUE
);
if ($applyTo === 'service') {
$additionalDescription = $this->translate(
'You might want to refer to Host or Service Custom Variables via $host|service.vars.varname$'
);
} else {
$additionalDescription = $this->translate(
'You might want to refer to Host Custom Variables via $host.vars.varname$'
);
}
$parentHostDescription .= ' ' . $additionalDescription;
$this->addElement('text', 'parent_host', [ $this->addElement('text', 'parent_host', [
'label' => $this->translate('Parent Host'), 'label' => $this->translate('Parent Host'),
'description' => $this->translate( 'description' => $parentHostDescription,
'The parent host. You might want to refer Host Custom Variables' 'class' => "autosubmit director-suggest",
. ' via $host.vars.varname$'
),
'class' => "autosubmit director-suggest",
'data-suggestion-context' => 'hostnames', 'data-suggestion-context' => 'hostnames',
'order' => 10, 'order' => 10,
'required' => $this->isObject(), 'required' => $this->isObject(),
'value' => $parentHost 'value' => $parentHost,
'validators' => [$parentHostValidator]
]); ]);
$sentParent = $this->getSentOrObjectValue('parent_host'); $sentParent = $this->getSentOrObjectValue('parent_host');
if (!empty($sentParent) || $dependency->isApplyRule()) { if (!empty($sentParent) || $dependency->isApplyRule()) {
$parentService = $dependency->get('parent_service'); $parentService = $dependency->get('parent_service');
if ($parentService === null) {
$parentServiceVar = $dependency->get('parent_service_by_name');
if ($parentServiceVar) {
$parentService = '$' . $parentServiceVar . '$';
}
}
$parentServiceDescription = $this->translate(
'Optional. The parent service. If omitted this dependency'
. ' object is treated as host dependency.'
);
$parentServiceDescription .= ' ' . $additionalDescription;
$parentServiceValidator = clone $parentHostValidator;
$parentServiceValidator->setMessage(
$this->translate('The parent service cannot be a service custom variable for a host dependency'),
Zend_Validate_Callback::INVALID_VALUE
);
$this->addElement('text', 'parent_service', [ $this->addElement('text', 'parent_service', [
'label' => $this->translate('Parent Service'), 'label' => $this->translate('Parent Service'),
'description' => $this->translate( 'description' => $parentServiceDescription,
'Optional. The parent service. If omitted this dependency' 'class' => "autosubmit director-suggest",
. ' object is treated as host dependency.' 'data-suggestion-context' => 'servicenames',
), 'data-suggestion-for-host' => $sentParent,
'class' => "autosubmit director-suggest", 'order' => 20,
'data-suggestion-context' => 'servicenames', 'value' => $parentService,
'data-suggestion-for-host' => $sentParent, 'validators' => [$parentServiceValidator]
'order' => 20, ]);
'value' => $parentService
]);
} }
// If configuring Object, allow selection of child host and/or service, // If configuring Object, allow selection of child host and/or service,
@ -296,6 +342,13 @@ class IcingaDependencyForm extends DirectorObjectForm
$values['parent_host_var'] = \trim($values['parent_host'], '$'); $values['parent_host_var'] = \trim($values['parent_host'], '$');
$values['parent_host'] = ''; $values['parent_host'] = '';
} }
if (isset($values['parent_service'])
&& $this->isCustomVar($values['parent_service'])
) {
$values['parent_service_by_name'] = trim($values['parent_service'], '$');
$values['parent_service'] = '';
}
} }
parent::handleProperties($object, $values); parent::handleProperties($object, $values);
@ -303,7 +356,6 @@ class IcingaDependencyForm extends DirectorObjectForm
protected function isCustomVar($string) protected function isCustomVar($string)
{ {
return \preg_match('/^\$(?:host)\.vars\..+\$$/', $string); return preg_match('/^\$(?:host|service)\.vars\..+\$$/', $string);
// Eventually: return \preg_match('/^\$(?:host|service)\.vars\..+\$$/', $string);
} }
} }

View File

@ -83,6 +83,18 @@ class IcingaDependency extends IcingaObject implements ExportInterface
return $this->get('parent_host_var') !== null; return $this->get('parent_host_var') !== null;
} }
/**
* Check if the given string is a custom variable
*
* @param $string string
*
* @return false|int
*/
protected function isCustomVar(string $string)
{
return preg_match('/^(?:host|service)\.vars\..+$/', $string);
}
/** /**
* @return string * @return string
* @throws ConfigurationError * @throws ConfigurationError
@ -440,9 +452,16 @@ class IcingaDependency extends IcingaObject implements ExportInterface
public function renderParent_service_by_name() public function renderParent_service_by_name()
{ {
// @codingStandardsIgnoreEnd // @codingStandardsIgnoreEnd
$var = $this->get('parent_service_by_name');
if ($this->isCustomVar($var)) {
return c::renderKeyValue(
'parent_service_name',
$var
);
}
return c::renderKeyValue( return c::renderKeyValue(
'parent_service_name', 'parent_service_name',
c::renderString($this->get('parent_service_by_name')) c::renderString($var)
); );
} }
@ -593,8 +612,12 @@ class IcingaDependency extends IcingaObject implements ExportInterface
$related = parent::getRelatedProperty($key); $related = parent::getRelatedProperty($key);
// handle special case for plain string parent service on Dependency // handle special case for plain string parent service on Dependency
// Apply rules // Apply rules
if ($related === null && $key === 'parent_service' if ($related === null
&& null !== $this->get('parent_service_by_name') && $key === 'parent_service'
&& (
$this->get('parent_service_by_name')
&& ! $this->isCustomVar($this->get('parent_service_by_name'))
)
) { ) {
return $this->get('parent_service_by_name'); return $this->get('parent_service_by_name');
} }