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

Добавил 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 лайк

Во время установки модуля появилась ошибка на 40%

Declaration of UPS: attempting to redeclare the inherited attribute ‘PowerModule’, originaly declared in UPS

Добавил в секцию ExternalKey ваш код

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

Проблема не в моем коде, а в том, что у вас два поля объявляются с одним и тем же идентификатором PowerModule.

1 лайк
        <item id="PowerModule">
          <rank>75</rank>
        </item>

вот тут похоже)

Вот тут:

<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>
```

Какие присутствуют связи между классом сервер и Network Interfaces.
У класса Server есть вкладка Network Interfaces (вероятно AttributeLinkedSet).

Я хочу добавить такую же вкладку к классу сервер, но только с физическими жесткими дисками.
AttributeExternalKey здесь не подходит.
Не могли бы вы подсказать с каким типом поле здесь необходимо использовать?

Реально как связать два разных КЕ между собой? Например Персональный компьютер и Монитор , созданный как расширение? Нигде об этом ни слова. Помогите.

Вся тема об этом. В Мониторе добавляем поле AttributeExternalKey, указывающее на ПК, в ПК добавляем вкладку AttributeLinkedSet. Готово!

Посмотрите на мой скриншот, (в паинте нарисовал) , т.е. возможно сделать так как я нарисовал?

Ну да, конечно.

Нашел в теме http://community.itop-itsm.ru/t/kak-mozhno-otredaktirovat-sistemnye-ke/1326/19 то что нужно в точности как мне и надо, но автор в самом конце не уточнил как он решил проблему окончательно, кто понимает о чем идет речь в самом конце?

создав дополнительный класс lnkServerToVLAN.

Это не то, что тебе надо. В теме описывается создание дополнительного класса-линка для связи «многие-ко-многим». В твоём случае нужна связь «один-ко-многим», которая реализуется простым добавлением полей, как я написал выше. Процесс добавления полей описан в официальной документации.

А можно небольшой пример как это сделать?

Конечно!

По примеру из руководства добавляется любое поле из списка.

Спасибо, я уже разобрался и все прекрасно работает, понял как связывать многое-ко-многим, понял как делать один-ко-многим. Остался один вопрос, можно ли связать как то один-с -одним ?