Создание связей между объектами cmdb

Всем доброго дня.
Возникла необходимость создать связи между объектами CMDB, что бы видеть - что к чему подключено физически. Для примера - нужна связь между персональным компьютером и принтером.

В мануалах на https://wiki.openitop.org ничего не нашел на эту тему, в интернете тоже (хотя может плохо искал).

Если кто знает - подскажите, в какую сторону копать.

Привет! Копать в сторону собственного модуля.
На самом деле даже копать не надо, просто берешь вот этот мануал и делаешь по нему пробный модуль, добавляющий какое-нибудь поле к какому-нибудь классу объектов.
Как только всё получилось, таким же образом делаешь настоящий модуль, но в этот раз в класс Принтеров нужно добавить поле типа AttributeExternalKey, ссылающееся на класс Персональных компьютеров. Получишь связь N принтеров к одному ПК.

С этим мануалом уже знакомился.
За отсылку к “поле типа AttributeExternalKey” спасибо, буду пробовать.
И еще вопрос - с полями для конечных классов разобрался, а как добавить поле (обычный текст), ко всем физическим устройствам? Точнее даже так - поле я добавил, в модели данных оно есть у всех устройств, а вот на веб-морде оно ну никак не хочет отображаться. Перепробовал все варианты, какие смог надумать, и все никак.

Давай подробнее, что пробовал?
Ты добавил поле к абстрактному классу в секцию <fields>. Теперь нужно во всех дочерних реальных классах, где нужно это поле показать, добавить его (поле) в секцию <presentation>.

В новом модуле создал поле для класса Физические устройства. Соответственно поле в модель данных добавляется. Различные комбинации секции Presentation в своем модуле так и не вывели новое поле на веб-морду. Либо было пусто, либо вываливалась ошибка.

Про добавление вывода поля в каждый класс отдельно я думал, но тут есть 2 НО:

  1. Это нудно )))
  2. После обновления это придется делать снова, если я правильно все понимаю.

Соответственно хочется найти способ сделать это так, что бы после обновления не подпрыгивать, но если такового способа нет, придется прописывать вывод в каждый класс.

Внутри тега <presentation> каждого класса есть три вложенные секции, каждая из которых отвечает за свой тип вывода:

  • в <search> описываются поля синей формы поиска вверху страницы;
  • в <list> - поля, которые будут показываться при табличном выводе объектов класса;
  • <details> описывает форму карточки объекта данного класса.

Классы бывают:

  • абстрактные - используются для передачи свойств по наследству дочерним классам, не используются для создания объектов;
  • реальные - используются для создания объектов.

Из этого следует, что <search> и <list> применимы для всех классов, а <details> только для реальных, объекты которых можно создавать в iTop.

Меняя <presentation> для класса Физические устройства, результат будет виден только в форме поиска и при табличном выводе Физических устройств. Для изменения карточки КЕ нужно менять <details> реального класса, которому принадлежит объект.

Картинка получается примерно такой:

<class id="PhysicalDevice"> 
  <fields>
    <field id="MY_SUPER_FIELD" xsi:type="AttributeExternalKey" _delta="define">
    </field>
  </fields>
  <presentation>
    <search>
      <items>
        <item id="MY_SUPER_FIELD"  _delta="define">
          <rank>40</rank>
        </item>
      </items>
    </search>
    <list>
      <items>
        <item id="MY_SUPER_FIELD"  _delta="define">
          <rank>130</rank>
        </item>
      </items>
    </list>
  </presentation>
</class>

<class id="Laptop"> 
  <presentation>
    <search>
      <items>
        <item id="MY_SUPER_FIELD"  _delta="define">
          <rank>130</rank>
        </item>
      </items>
    </search>
    <list>
      <items>
        <item id="MY_SUPER_FIELD"  _delta="define">
          <rank>30</rank>
        </item>
      </items>
    </list>
    <details>
      <items>
        <item id="MY_SUPER_FIELD"  _delta="define">
          <rank>50</rank>
        </item>
      </items>
    </details>
  </presentation>
</class>

То, что это немного нудно - согласен. А при обновлении ничего никуда не денется, если ты всё делаешь в отдельном модуле в extensions. Новая модель данных будет собираться с учетом твоего модуля.

Надеюсь, немного прояснил ситуацию)).

1 лайк

Спасибо за разъяснение.
Если я все верно понял, то мне надо:

  1. Сделать новый модуль (ну или в старый дописать, где уже есть добавление полей).

  2. В нем прописать






    130






    30






    50




для каждого класса. Верно?
Или же будет лучше скопировать содержимое datamodel.itop-enduser-devices и часть из datamodel.itop-config-mgmt (в части конечных устройств типа сервер и т.д.) в модуль и туда дописать вывод своих полей?

В том же модуле, где ты добавляешь поля, делай их вывод. Одно без другого не имеет смысла.
По поводу копипаста всей модели данных, мне кажется не лучшая идея. Потом запутаешься, где твоё, а где родное. Я стараюсь в свои модули переносить минимум из первоначального кода и только тогда, когда действительно необходимо.

Компьютер и принтер реальные классы.
Можно как-нибудь установить связь что конкретный принтер, с определенной моделью и серийным номером подключен к какому-то конкретному компьютеру.
В данном примере описан один абстрактный класс PhysicalDevice, от которого наследуются свойства к реальному классу Laptop.
Как сделать связь между двумя реальными классами?

В базовых классах есть сервера и стойки.
Конкретный сервер можно поставить в конкретную стойку.
Как такую связь между двумя реальными классами реализовать?

Реальность или абстрактность классов не влияет на создание связей. Разница лишь в том, что описав функционал для реального класса, использовать его будут только объекты этого класса. А если описать функционал в абстрактном классе, то им будут пользоваться все объекты дочерних классов.
Как сделать связь “один ко многим” описано несколькими сообщениями выше. Что конкретно не получается?

Создал класс UPS.
В который хочу включить два дочерних класса батарейный модуль и силовой модуль.
Начал описывать данный класс, начиная дочерних модулей.
Описал два дочерних модуля, проверил в toolkit, без проблем установилось.
Захотел вставить батарейный модуль и силовой модуль в UPS.
Не получилось. Toolkit выдает ошибки.

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:340 Message:Opening and ending tag mismatch: sql line 337 and field

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:345 Message:Opening and ending tag mismatch: sql line 342 and field

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:346 Message:Opening and ending tag mismatch: sql line 342 and fields

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:485 Message:Opening and ending tag mismatch: field line 341 and class

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:486 Message:Opening and ending tag mismatch: sql line 337 and classes

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:533 Message:Opening and ending tag mismatch: field line 336 and itop_design

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag fields line 335

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag class line 310

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag classes line 5

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag itop_design line 2

An error occured while processing the PHP files of the data model:

ERROR missing parameter 'on_target_delete' in AttributeExternalKey declaration for class UPS (/var/www/html/env-toolkit/power-module/model.power-module.php - 176)

Check the PHP files describing the data model before running the toolkit again !

Ниже мой модуль в XML

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
	<class id="PowerModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>powermodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/PowerModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="BatteryModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>batterymodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/BatteryModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="UPS" _delta="define">
		<parent>PhysicalDevice</parent>
		<properties>
			<category>bizmodel,searchable</category>
			<abstract>false</abstract>
			<key_type>autoincrement</key_type>
			<db_table>ups</db_table>
			<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/ups.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
			</attributes>
			</reconciliation>			
		</properties>
		<fields>
			<field id="PowerModule" xsi:type="AttributeExternalKey" _delta="define">
			<sql>powermodule<sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalKey" _delta="define">
			<sql>batterymodule<sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			</field>
		</fields>
		<methods/>
      <presentation>
        <details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
        </list>
      </presentation>
	</class>
  </classes>
  <menus>
    <menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="112" xsi:type="DashletBadge" _delta="define">
              <rank>11</rank>
              <class>PowerModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="113" xsi:type="DashletBadge" _delta="define">
              <rank>12</rank>
              <class>BatteryModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="114" xsi:type="DashletBadge" _delta="define">
              <rank>13</rank>
              <class>UPS</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
  </menus>
    <profiles>
    </profiles>
</itop_design>

Прошу помочь связать данные классы

Opening and ending tag mismatch == Несоответствие открывающего и закрывающего тегов

В твоем случае <sql>.

Premature end of data in tag == Преждевременное окончание данных в теге

В твоем случает на правильное объявление поля AttributeExternalKey, не хватает обязательных полей. См. ман по полям: https://wiki.openitop.org/doku.php?id=2_2_0:customization:xml_reference#fields.

Дополнительно. Если делаем <class id="UPS" _delta="define">, то всё, что внутри этого класса тоже имеет _delta="define. То есть писать _delta="define в полях <field id="PowerModule" ... _delta="define"> не нужно.

1 лайк

Добавил mandatory поля в AttributeExternalKey.
Модуль установился.
При попытке создания новой единицы в основном модуле нету связей с дочерними модулями.
Расскажите как сделать чтобы в модуле UPS можно было выбрать батарейный модуль и силовой модуль.
У меня создалось 3 отдельных модуля без связей между ними.
Ниже мой код, который у меня установился.

<img src="/uploads/default/56/d49db6ac108d0b4f.jpg" width="586" height="500"> <?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
	<class id="PowerModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>powermodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/PowerModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="BatteryModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>batterymodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/BatteryModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="UPS" _delta="define">
		<parent>PhysicalDevice</parent>
		<properties>
			<category>bizmodel,searchable</category>
			<abstract>false</abstract>
			<key_type>autoincrement</key_type>
			<db_table>ups</db_table>
			<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/ups.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
			</attributes>
			</reconciliation>			
		</properties>
		<fields>
			<field id="PowerModule" xsi:type="AttributeExternalKey">
			<sql>powermodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalKey">
			<sql>batterymodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
		</fields>
		<methods/>
      <presentation>
        <details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
        </list>
      </presentation>
	</class>
  </classes>
  <menus>
    <menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="112" xsi:type="DashletBadge" _delta="define">
              <rank>11</rank>
              <class>PowerModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="113" xsi:type="DashletBadge" _delta="define">
              <rank>12</rank>
              <class>BatteryModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="114" xsi:type="DashletBadge" _delta="define">
              <rank>13</rank>
              <class>UPS</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
  </menus>
    <profiles>
    </profiles>
</itop_design>

Я не использовал атрибут

<field id="name" xsi:type="AttributeExternalField">

Наверное как-то через это связываются классы.

Добавил AttributeExternalField в свой код.
Связь между типами создать не получилось.

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
	<class id="PowerModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>powermodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/PowerModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="BatteryModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>batterymodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/BatteryModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="UPS" _delta="define">
		<parent>PhysicalDevice</parent>
		<properties>
			<category>bizmodel,searchable</category>
			<abstract>false</abstract>
			<key_type>autoincrement</key_type>
			<db_table>ups</db_table>
			<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/ups.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
			</attributes>
			</reconciliation>			
		</properties>
		<fields>
			<field id="PowerModule" xsi:type="AttributeExternalKey">
			<sql>powermodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
			<field id="PowerModule" xsi:type="AttributeExternalField">
				<extkey_attcode>PowerModule</extkey_attcode>
				<target_attcode>PowerModule</target_attcode>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalKey">
			<sql>batterymodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalField">
				<extkey_attcode>BatteryModule</extkey_attcode>
				<target_attcode>BatteryModule</target_attcode>
			</field>
		</fields>
		<methods/>
      <presentation>
        <details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
        </list>
      </presentation>
	</class>
  </classes>
  <menus>
    <menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="112" xsi:type="DashletBadge" _delta="define">
              <rank>11</rank>
              <class>PowerModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="113" xsi:type="DashletBadge" _delta="define">
              <rank>12</rank>
              <class>BatteryModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="114" xsi:type="DashletBadge" _delta="define">
              <rank>13</rank>
              <class>UPS</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
  </menus>
    <profiles>
    </profiles>
</itop_design>

Еще наверное мне нужно

<field id="name" xsi:type="AttributeLinkedSet">

Пытаюсь дописать дальше)

Внимательно смотри на теги внутри AttributeExternalKey. Где target_class, где filter?

AttributeExternalField нужен для того, чтобы в объект, в котором он создан, протаскивать атрибуты объекта, на который ссылается соответствующий AttributeExternalKey. Например, в объект UPS можно вытащить модель батареи.

AtributeLinkedSet нужно использовать в батарее и силовом модули, чтобы отобразить вкладку с ссылающимися на них UPS.

1 лайк
<target_class>name</target_class>

Класс объекта к которому ссылается внешний ключ.

<filter>SELECT Location AS L WHERE L.org_id = :this->org_id</filter>

OQL выборка определенных объектов к которым ссылается внешний ключ. Используйте: this -> name чтобы сослаться на значение в текущем объекте.
Не совсем понятно как сделать запрос в filter.
Попробую написать код. Выложу здесь

    <target_class>PowerModule</target_class>
    <filter>SELECT PowerModule</filter>

Позволит выбирать любой объект PowerModule.

1 лайк