rule {
name 'NDCB-AAI-attribute-comparison'
category 'Attribute Mismatch'
description 'Verify that all attributes in Network-Discovery are the same as in AAI'
errorText 'Error found with attribute "{0}"; value "{1}" does not exist in Network-Discovery'
severity 'ERROR'
attributes 'ndcbItems', 'aaiItems'
validate '''
Closure<java.util.Map> getAttributes = { parsedData ->
java.util.Map attributeMap = new java.util.HashMap()
def isAttributeDataQualityOk = { attribute ->
attribute.findResult{ k, v -> if(k.equals("dataQuality") ) {return v.get("status")}}.equals("ok")
}
def addToMap = { attrKey, attrValue ->
java.util.Set values = attributeMap.get("$attrKey")
if(values == null) {
values = new java.util.HashSet()
attributeMap.put("$attrKey", values)
}
values.add("$attrValue")
}
def addAttributeToMap = { attribute ->
if(isAttributeDataQualityOk(attribute)) {
String key, value
attribute.each { k, v ->
if(k.equals("name")) {key = "$v"}
if(k.equals("value")) {value = "$v"}
}
addToMap("$key", "$value")
}
}
def processKeyValue = { key, value ->
if(value instanceof java.util.ArrayList) {
if(key.equals("attributeList")) {
value.each {
addAttributeToMap(it)
}
}
} else if(!(value instanceof groovy.json.internal.LazyMap)) {
// only add key-value attributes, skip the rest
addToMap("$key", "$value")
}
}
if(parsedData instanceof java.util.ArrayList) {
parsedData.each {
it.each { key, value -> processKeyValue(key, value) }
}
} else {
parsedData.each { key, value -> processKeyValue(key, value) }
}
return attributeMap
}
def slurper = new groovy.json.JsonSlurper()
java.util.Map ndcb = getAttributes(slurper.parseText(ndcbItems.toString()))
java.util.Map aai = getAttributes(slurper.parseText(aaiItems.toString()))
boolean result = true
List<String> details = new ArrayList<>();
ndcb.any{ ndcbKey, ndcbValueList ->
def aaiValueList = aai.get("$ndcbKey")
aaiValueList.each{ aaiValue ->
if(!ndcbValueList.any{ it == "$aaiValue" }) {
result = false
details.add("$ndcbKey")
details.add("$aaiValue")
}
}
if(result == false) {
// break out of 'any' loop
return true
}
}
return new Tuple2(result, details)
'''
} |