Как можно отредактировать системные КЕ?

Доброго дня!

На днях я разобрался как добавлять кастомные поля в кастомные КЕ.
Но вот как редактировать системные поля пока так и остается загадкой.

Подскажите, плз:

  1. Как я могу у какой либо системной КЕ (возьмем, к примеру, Server) сделать системное поле CPU обязательным для заполнения. Ну и вообще как я могу изменить тип любого системного поля. Какие файлы нужно смотреть? После изменения данных файлов нужно так же через toolkit производить переустановку, чтобы изменения скомпилились?

  2. Каким образом в экран КЕ можно добавить кастомную вкладку (наподобие системных типа contacts_list, documents_list, tickets_list и т.д.)?

Буду благодарен за наводку!

  1. Создаёте кастомный класс по гайду. Там пишите что-то вроде:
<class id="Server" >
         
      <fields>
        <field id="osfamily_id" xsi:type="AttributeExternalKey" _delta="redefine">
          <sql>osfamily_id</sql>
          <target_class>OSFamily</target_class>
          <is_null_allowed>false</is_null_allowed>
          <on_target_delete>DEL_MANUAL</on_target_delete>
        </field>

Ключевое _delta=“redefine”. Т.е. вы говорите, что конфигурацию этого элемента нужно переопределить.
Соответственно также можно какие-то элементы удалять, добавлять и т.п. подробней тут
https://www.itophub.io/wiki/page?id=2_5_0%3Acustomization%3Axml_reference
2.Насколько я понимаю вкладки сами добавляются когда вы в

> <Presentation><details>
Указываете аттрибут который имеет тип AttributeExternalKey.

https://www.itophub.io/wiki/page?id=2_5_0%3Acustomization%3Axml_reference#presentation_(details)

Создать самому дополнительную вкладку похоже нельзя. :frowning:

Большое спасибо, Павел!

По 1. пункту получилось сделать системное поле CPU обязательным таким вот образом:

> <field id="cpu" xsi:type="AttributeString" _delta="redefine">
> 		<sql>cpu</sql>
> 		<is_null_allowed>false</is_null_allowed>
> 		<on_target_delete>DEL_MANUAL</on_target_delete>
> 		<target_class>cpu</target_class>
> </field>

А вот сделать обязательное системное поле “Название” (name) не обязательным не получается, toolkit при компиляции выдает ошибку:
Error loading module "sample-add-attribute": /itop_design/classes/class[cmdbAbstractObject]/class[FunctionalCI]/class[PhysicalDevice]/class[ConnectableCI]/class[DatacenterDevice]/class[Server]/fields/field[name] at line 11: could not be modified (not found) - Loaded modules: dictionaries,core,application,authent-external,authent-ldap,authent-local,itop-attachments,itop-backup,itop-config-mgmt,itop-config,itop-datacenter-mgmt,itop-endusers-devices,itop-hub-connector,itop-portal-base,itop-portal,itop-profiles-itil,itop-sla-computation,itop-storage-mgmt,itop-tickets,itop-virtualization-mgmt,itop-welcome-itil,my-module,sample-add-attribute

В xml у меня такой код для переопределения поля name:

<field id="name" xsi:type="AttributeString" _delta="redefine">
		<sql>name</sql>
		<is_null_allowed>false</is_null_allowed>
		<on_target_delete>DEL_MANUAL</on_target_delete>
		<target_class>name</target_class>
</field>

Предполагаю, что это связано с тем, что где-то вместо name надо указать какой-то другой класс, но пока не получается понять логику.

Подскажите, что в коде может быть не так?

Не уверен в корректности ответа, но возможно дело в том, что name унаследованный аттрибут


И в классе Server он не определён, а следовательно и переопределить его нельзя. Нужно идти в родительский FunctionalCI и переопределять его там. Или определять новое поле на уровне сервера.

1 лайк

Можно делать _delta="redefine" и глубже:

        <field id="cpu">
          <is_null_allowed _delta="redefine">true</is_null_allowed>
        </field>

Глядя на код, можно будет понять, что именно изменяется относительно стандартной модели данных.

А что такое вот это? Не припоминаю тега target_class в поле с типом AttributeString :slight_smile:

Про name @Pavel_Solopov прав, менять нужно в FunctionalCI. Только это изменение затронет все дочерние классы КЕ.

1 лайк

Павел, Владимир, благодарю за ответы!

Это просто строка, которую я взял из примера выше:
<target_class>cpu</target_class>
Сам пока не понял для чего она, но на всякий случай оставил.
Я так понимаю, данная строка в этом случае не требуется?

По поводу type=“AttributeString” - я так понял, что это относится к типу поля “name”.
Т.е. поле name изначально есть Строка, и переопределяю я его тоже как строку.
Или я не прав?

Не требуется. В примере добавляется поле AttributeExternalKey. Для него другой набор параметров (см. ссылки в посте с примером).

Переопределять всё поле <field> не нужно, а нужно изменить толко <is_null_allowed> (если речь про “сделать системное поле CPU обязательным для заполнения”).

Вкладки со списками связанных объектов создаются через AttributeLinkedSet для связи 1-n или AttributeLinkedSetIndirect для связи n-n.
Если класс A содержит поле AttributeExternalKey, в котором выбирается класс Б, то в класс Б можно добавить поле AttributeLinkedSet, которое будет вкладкой со списком связанных объектов класса А.

Владимир, а можно код примера создания подобной вкладки, чтобы понять синтаксис?

Не худо и гайды читать, не только форум. Я вам даже и ссылку дал. :frowning:

Можно конечно! /path/to/itop/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml
По ссылке от Павла перечислены все возможные поля.

В гайде как раз эта строка указана как обязательная :slight_smile:

@abb-user, Вас не смущает, что у вас другой тип аттрибута?

Да, Павел, Вы правы. Я немного запутался.

Владимир, спасибо!
С подключением вкладок разобрался + -.

Может кому в будущем полезен будет мой пример вывода КЕ VLAN во вкладку КЕ Server:

 <fields>
     <field id="VLAN Settings" xsi:type="AttributeLinkedSet" _delta="define">
     	<linked_class>VLAN</linked_class>
     	<ext_key_to_me>org_id</ext_key_to_me>
     	<edit_mode>in_place</edit_mode>
     	<tracking_level>all</tracking_level>
     	<count_min>0</count_min>
     	<count_max>0</count_max>
     </field>
 </fields>

плюс вывод на экран:

<items>
  <item id="VLAN Settings" _delta="define">
        		<rank>5</rank>
  </item>
</items>

Плохая идея задавать такие id.

Обрати внимание, как называются системные вкладки. Красивое название нужно добавлять в файлах локализации.

Спасибо. По поводу id-шника с пробелом вчера уже понял, что это корректно не работает. Вкладка появляется, но сама кнопка добавления VLAN не появляется.
Убрал пробел и все заработало (но только на кастомном модуле).

А вот при попытке добавить вкладку VLAN в КЕ Server обнаружил такой момент, что после добавления VLAN во вкладке и сохранения записи КЕ Server возникает ошибка:

Не удается сохранить объект : No result for the single row query: 'SELECT DISTINCT Organization_organization.id AS Organizationid, Organization_organization.name AS Organizationname, Organization_organization.code AS Organizationcode, Organization_organization.status AS Organizationstatus, Organization_organization.parent_id AS Organizationparent_id, Organization_parent_id_organization.name AS Organizationparent_name, Organization_organization.deliverymodel_id AS Organizationdeliverymodel_id, DeliveryModel_deliverymodel_id_deliverymodel.name AS Organizationdeliverymodel_name, CAST(CONCAT(COALESCE(Organization_organization.name, ‘’)) AS CHAR) AS Organizationfriendlyname, COALESCE((Organization_organization.status = ‘inactive’), 0) AS Organizationobsolescence_flag, Organization_organization.obsolescence_date AS Organizationobsolescence_date, CAST(CONCAT(COALESCE(Organization_parent_id_organization.name, ‘’)) AS CHAR) AS Organizationparent_id_friendlyname, COALESCE((Organization_parent_id_organization.status = ‘inactive’), 0) AS Organizationparent_id_obsolescence_flag, CAST(CONCAT(COALESCE(DeliveryModel_deliverymodel_id_deliverymodel.name, ‘’)) AS CHAR) AS Organizationdeliverymodel_id_friendlyname FROM organization AS Organization_organizationLEFT JOIN organization AS Organization_parent_id_organization ON Organization_organization.parent_id = Organization_parent_id_organization.idLEFT JOIN deliverymodel AS DeliveryModel_deliverymodel_id_deliverymodel ON Organization_organization.deliverymodel_id = DeliveryModel_deliverymodel_id_deliverymodel.id WHERE (Organization_organization.id = 3) ’

Обнаружил, что в самой КЕ VLAN при добавлении записи присутствуют 3 поля:
Тег VLAN
Организация
Описание

А во вкладке VLAN, которую я добавил в КЕ Server отображаются только 2 поля:
Тег VLAN
Описание
А поле “Организация” отсутствует.

Видимо, я опять что-то с классами путаю.

Тут должно быть поле, в котором лежит id текущего объекта (в котором вкладка добавляется).
Пример: Person ссылается на Location через поле Person.location_id. При добавлении вкладки с персонами Location.persons_list внутри <ext_key_to_me> будет указано location_id.

Владимир, спасибо за наводку!
Методом тыка нашел решение.
Исходя из Вашего примера пришел к пониманию, что прямой связи между Server и VLAN нет. А между Person и Location она есть.

Увидел в xml /path/to/itop/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml пример как записывается Внешний ключ и временно там же по аналогии прописал его для КЕ VLAN, чтобы связать КЕ VLAN с КЕ Server:

<field id="vlan2_id" xsi:type="AttributeExternalKey">
      <sql>vlan2_id</sql>
      <target_class>VLAN</target_class>
      <is_null_allowed>true</is_null_allowed>
      <on_target_delete>DEL_MANUAL</on_target_delete>
      <allow_target_creation>false</allow_target_creation>
 </field>

А для КЕ Server прописал:

   <field id="vlan_list" xsi:type="AttributeLinkedSet" _delta="define">
     	<linked_class>VLAN</linked_class>
     	<ext_key_to_me>vlan2_id</ext_key_to_me>
     	<tracking_level>all</tracking_level>
        <edit_mode>in_place</edit_mode>
   </field>

В итоге получил работающий вариант вкладки VLAN в КЕ Server.

Коллеги, подскажите, в чем может быть проблема в нижеописанном случае.

Как я описал в этой теме ранее, я добавил вкладку VLAN в КЕ Server. Это все я делал на тестовом iTop (v.2.6.0-4294) и все заработало.
Сейчас решил эти настройки перенести на боевой iTop (той же версии, что и тест), но на бою с этим возникла проблема.

Когда в КЕ Server я добавляю запись во вкладке VLAN и пробую сохранить запись, то получаю сообщение об ошибке " Не удается сохранить объект : Unexpected value for attribute ‘vlan2_id’: Target object not found (VLAN::241) ".

Соответственно, запись сохранить не получается.
Перепроверил xml-ки модулей, через которые я добавляю вкладку VLAN в КЕ Server на тесте и на бою несколько раз - все один в один.

Подскажите, в чем может быть загвоздка?
Может ли это быть связано с разными версиями PHP и БД?
На тесте версии PHP 7.2.15-0ubuntu0.18.04.2, MySQL 5.7.25-0ubuntu0.18.04.2
На бою версии PHP 7.2.10-0ubuntu0.18.04.1, MySQL 5.7.23-0ubuntu0.18.04.1

Уточнение:
в теге edit_mode я заменил значение на add_remove, так как во вкладке VLAN мне нужно было выбирать уже заведенные в модуле VLAN элементы:

<field id="vlan_list" xsi:type="AttributeLinkedSet" _delta="define">
         	<linked_class>VLAN</linked_class>
         	<ext_key_to_me>vlan2_id</ext_key_to_me>
         	<edit_mode>add_remove</edit_mode>
         	<tracking_level>all</tracking_level>
</field>