Скриптовые модификации схемы МВС

На вкладке "Настройки контентов" для каждого контента настраиваются следующие скрипты.

Метод для выполнения сортировки горизонтальных групп

Метод для переопределения порядка горизонтальных групп.

Входные параметры скрипта:

  • groupList — коллекция горизонтальных групп, в том порядке, в котором его расположила система;
  • lvmSubject — целевой объект.

Метод возвращает коллекцию горизонтальных групп в нужном порядке.

Closure resortGroups = { Collection<Object> groupList, IUUIDIdentifiable lvmSubject ->
return groupList
}

Метод для фильтрации и сортировки вертикальных групп

Метод для переопределения порядка и набора вертикальных групп, указать уровень вложенности вертикальных групп.

Входные параметры скрипта:

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

Метод возвращает UUIDы групп, вложенность в которых необходимо отключить, т.е. каждый объект, вертикальной группой которого является одна из вложенных в возвращенные из этого метода группы, будет считаться вложенным в эту группу.

  • Метод возвращает ['UUID$11'].

    Иерархия вверх вертикальных групп объекта А = ['UUID$111', 'UUID$11', 'UUID$1'].

    На схеме группа с UUID = 'UUID$11' будет считаться вертикальной группой объекта А.

  • Если ни одного UUID из иерархии не найдено, то вертикальной группой считается самый нижний в иерархии объект.
  • Если в возвращаемой коллекции присутствует более одного UUID из иерархии, то вертикальной группой считается объект, находящийся НИЖЕ по иерархии.
Copy
filterAndSortVerticalGroups: {Map groupToObjectCount, IUUIDIdentifiable lvmSubject ->
def groupListMap = [:]
def groupListWithoutAttr = []
groupToObjectCount.each {it ->
def groupUuid = it.key
def group = utils.get(groupUuid)
if (group.layer == null)
{
groupListWithoutAttr << groupUuid
}
else
{
groupListMap[groupUuid] = group.layer
}
}
def sortedGroupsByAttr = groupListMap.sort {it.value}
def sortedGroups = sortedGroupsByAttr.keySet().plus(groupListWithoutAttr)
return sortedGroups as List
}

Метод для определения UUID групп, вложенность в которых необходимо отключить

Метод возвращает список UUID вертикальных групп, которые будут отображаться на схеме МВС без вложенных групп. Все объекты, принадлежащие вложенным группам, будут включены в родительскую вертикальную группу.

Входные параметры скрипта:

  • groupUuids — UUID'ы вертикальных групп, присутствующих на схеме;

  • lvmSubject — целевой объект.
def getVGroupUuidsWithoutHierarchy(Collection<String> groupUuids)
{
return []
}

Методы для фильтрации

Метод для фильтрации всех объектов, выводимых на граф

Входные параметры скрипта: toFilter, lvmSubject (обращение к целевому объекту).

Метод для общей фильтрации всех объектов, которые необходимо вывести на граф

Входные параметры скрипта: toFilter, lvmSubject (обращение к целевому объекту).

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

Фильтр проходит по всем объектам, который могут попасть на схему, поэтому проверять на принадлежность к какому-либо типу нужно внутри функции.

Проверку можно осуществить сравнением строкового значения FQN или с помощью api.metainfo.

Примеры:

  1. Проверка на принадлежность к какому-либо классу (в примере cmdbObject) с помощью строкового значения FQN

    Copy
    toFilter.findAll {      
            String fqn = it.metaClass.toString()
            if(fqn.startsWith('virtualEntity$ipAddress')){
                 return true
            }
            else
           {
                 return true
            }
        }
  2. Проверка на принадлежность к некоторому набору типов( фильтрация применяется только к объявленным в коллекции типам).

    Copy
    //Перечисление фильтруемых типов
            Collection applicableFqns = ['cmdbObject$physicalServer',
                                         'cmdbObject$software',
                                         'cmdbObject$hardware',
                                         'cmdbObject$CI']
    //Проверка на принадлежность фильтруемого объекта к фильтруемым типам
            if (fqn in applicableFqns)
            {
                //описание логики фильтра
            }
            else
            {
                return true
            }
        }
    }
  3. Проверка на принадлежность к классу и неравенство определенным типам с помощью строкового значения FQN

    Copy
    //Перечисление типов, которые не подлежат фильтрации
                    Collection inapplicableFqns = ['cmdbObject$physicalServer',
                                                   'cmdbObject$software',
                                                   'cmdbObject$hardware',
                                                   'cmdbObject$CI']
    //Проверка на тип класса cmdbObject и непринадлежность к нефильтруемым типам.
            if(fqn.startsWith('cmdbObject') && !(fqn in inapplicableFqns))
            {
                //описание логики фильтра
            }
            else
            {
                return true
            }
        }
    }
  4. Проверка на принадлежность к какому-либо классу (в примере cmdbObject) (пример 1), используя объект метакласса api.metainfo.

    Copy
    //Проверка на принадлежность к типам cmdbObject api.metainfo.getTypes(...) может не работать на типы класса
            if(objMetaClass in api.metainfo.getTypes('cmdbObject'))
            {
                //описание логики фильтрации
            }
            else
            {
                return false
            }
        }
    }
  5. Проверка на принадлежность к некоторому набору типов, фильтрация применяется только к объявленным в коллекции типам (пример 2), используя объект метакласса.

    Copy
    //Перечисление фильтруемых типов
            Collection applicableMetaClasses = [api.metainfo.getMetaClass('cmdbObject$physicalServer'),
                                                api.metainfo.getMetaClass('cmdbObject$software')
            ]
    //Проверка на принадлежность фильтруемого объекта к фильтруемым типам
            if(objMetaClass in applicableMetaClasses)
            {
                //описание логики фильтрации
            }
            else
            {
                return false
            }
        }
    }
  6. Проверка на принадлежность к классу и неравенство определенным типам (пример 3), используя объект метакласса

    Copy
    //Перечисление фильтруемых типов
            Collection inapplicableMetaClasses = [api.metainfo.getMetaClass('cmdbObject$physicalServer'),
                                                  api.metainfo.getMetaClass('cmdbObject$software')]
    //Проверка на тип класса cmdbObject и непринадлежность к нефильтруемым типам.
            if(!(objMetaClass in inapplicableMetaClasses) && objMetaClass in api.metainfo.getTypes('cmdbObject'))
            {
                //описание логики фильтрации
            }
            else
            {
                return false
            }
        }
    }