summaryrefslogtreecommitdiffstats
path: root/application/forms/IcingaServiceSetForm.php
blob: 21508d51979012434db45d56ccc00e952de2b75a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php

namespace Icinga\Module\Director\Forms;

use Icinga\Module\Director\Objects\IcingaHost;
use Icinga\Module\Director\Web\Form\DirectorObjectForm;

class IcingaServiceSetForm extends DirectorObjectForm
{
    protected $host;

    protected $listUrl = 'director/services/sets';

    public function setup()
    {
        if ($this->host === null) {
            $this->setupTemplate();
        } else {
            $this->setupHost();
        }

        $this->setButtons();
    }

    protected function setupTemplate()
    {
        $this->addElement('text', 'object_name', [
            'label'       => $this->translate('Service set name'),
            'description' => $this->translate(
                'A short name identifying this set of services'
            ),
            'required'    => true,
        ])
        ->eventuallyAddNameRestriction('director/service_set/filter-by-name')
        ->addHidden('object_type', 'template')
        ->addDescriptionElement()
        ->addAssignmentElements();
    }

    protected function setObjectSuccessUrl()
    {
        if ($this->host) {
            $this->setSuccessUrl(
                'director/host/services',
                array('name' => $this->host->getObjectName())
            );
        } else {
            parent::setObjectSuccessUrl();
        }
    }

    protected function setupHost()
    {
        $object = $this->object();
        if ($this->hasBeenSent()) {
            $object->set('object_name', $this->getSentValue('imports'));
            $object->set('imports', $object->object_name);
        }

        if (! $object->hasBeenLoadedFromDb()) {
            $this->addSingleImportsElement();
        }

        if (count($object->get('imports'))) {
            $description = $object->getResolvedProperty('description');
            if ($description) {
                $this->addHtmlHint($description);
            }
        }

        $this->addHidden('object_type', 'object');
        $this->addHidden('host', $this->host->getObjectName());
        $this->groupMainProperties();
    }

    public function setHost(IcingaHost $host)
    {
        $this->host = $host;
        return $this;
    }

    protected function addSingleImportsElement()
    {
        $enum = $this->enumAllowedTemplates();

        $this->addElement('select', 'imports', array(
            'label'        => $this->translate('Service set'),
            'description'  => $this->translate(
                'The service set that should be assigned to this host'
            ),
            'required'     => true,
            'multiOptions' => $this->optionallyAddFromEnum($enum),
            'class'        => 'autosubmit'
        ));

        return $this;
    }

    protected function addDescriptionElement()
    {
        $this->addElement('textarea', 'description', array(
            'label'       => $this->translate('Description'),
            'description' => $this->translate(
                'A meaningful description explaining your users what to expect'
                . ' when assigning this set of services'
            ),
            'rows'        => '3',
            'required'    => ! $this->isTemplate(),
        ));

        return $this;
    }

    protected function addAssignmentElements()
    {
        if (! $this->hasPermission('director/service_set/apply')) {
            return $this;
        }

        $this->addAssignFilter([
            'suggestionContext' => 'HostFilterColumns',
            'description' => $this->translate(
                'This allows you to configure an assignment filter. Please feel'
                . ' free to combine as many nested operators as you want. You'
                . ' might also want to skip this, define it later and/or just'
                . ' add this set of services to single hosts. The "contains"'
                . ' operator is valid for arrays only. Please use wildcards and'
                . ' the = (equals) operator when searching for partial string'
                . ' matches, like in *.example.com'
            )
        ]);

        return $this;
    }
}