Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagetext
titleQuery for Logical-links
collapsetrue
URL: https://<AAI host>:<AAI port>/aai/v14/network/logical-links?link-name={linkName}&operational-status={status}
Method: GET
{
}

Response Body:
{
"results": [
    "logic-links" : {
      "link-name" : "{linkName}",
      "operational-status": "{status}",
      "model-invariant-id": "some invariant",
      "model-version-id"  : "some version",
      "link-id":"some id",
      "relationship-list"  : [
            {
            "relationship" : [
                {
                     "related-to": "p-interface",
                     "related-link": "url of p-interface 1",
                     "relationship-data":[
                          "relationship-key" : "p-interface.interface-name",
                          "relationship-value" : "some name 1"
                      ]
                }
             ],  
           },
           {
            "relationship" : [
                {
                     "related-to": "p-interface",
                     "related-link": "url of p-interface 2",
                     "relationship-data":[
                          "relationship-key" : "p-interface.interface-name",
                          "relationship-value" : "some name 2"
                      ]
                }
               ],  
            }    
      ]
 }


package org.onap.holmes.ccvpn;

dialect "java"

import org.onap.holmes.common.api.stat.VesAlarm;
import org.onap.holmes.common.api.stat.AlarmAdditionalField;
import org.onap.holmes.common.aai.AaiQuery4Ccvpn;
import org.onap.holmes.common.exception.CorrelationException;
import org.onap.holmes.common.dmaap.entity.PolicyMsg;
import org.onap.holmes.common.dmaap.DmaapService;
import org.onap.holmes.common.utils.DroolsLog;
import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.UUID;

function String getAdditionalField(VesAlarm a, String field) {
List<AlarmAdditionalField> fields = a.getAlarmAdditionalInformation();
for (AlarmAdditionalField f : fields) {
if (f.getName().equals(field)) {
return f.getValue();
}
}
return null;
}

function String getLogicLink(VesAlarm alarm) {
AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
return aai.getLogicLink(
getAdditionalField(alarm, "networkId"),
getAdditionalField(alarm, "node"),
getAdditionalField(alarm, "tp-id"),
getAdditionalField(alarm, "oper-status")
);
}

function boolean isCorrelated(VesAlarm a, VesAlarm b) {
String logicLinkA = getLogicLink(a);
if (logicLinkA == null) {
return false;
}

String logicLinkB = getLogicLink(b);
if (logicLinkB == null) {
return false;
}

return logicLinkA.equals(logicLinkB);
}

function void updateAaiStatus(String networkId, String pnfName, String ifName,
String linkName, String status) {
AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
Map<String, Object> body = new HashMap<String, Object>(){
{
put("operational-status", status);
}
};
aai.updateLogicLinkStatus(linkName, body);
aai.updateTerminalPointStatus(networkId, pnfName, ifName, body);
}

function Map<String, Object> getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) {
AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
JSONArray instances = aai.getServiceInstances(networkId, pnfName, ifName, status);

Map<String, Object> ret = new HashMap<String, Object>();

StringBuilder sbn = new StringBuilder();
StringBuilder sbi = new StringBuilder();
for(int i = 0; i < instances.size(); ++i) {
JSONObject o = instances.getJSONObject(i);
String name = o.getString("service-instance-name");
String id = o.getString("service-instance-id");
ret.put(name + ".input-parameters", o.getString("input-parameters"));
sbn.append(name).append(",");
sbi.append(id).append(",");
}
ret.put("service-instance.service-instance-name", sbn.substring(0, sbn.length() -1).toString());
ret.put("service-instance.service-instance-id", sbi.substring(0, sbi.length() -1).toString());
ret.put("vserver.vserver-name", "TBD");
ret.put("globalSubscriberId", instances.getJSONObject(0).getString("globalSubscriberId"));
ret.put("serviceType", instances.getJSONObject(0).getString("serviceType"));

return ret;
}

function PolicyMsg createPolicyMsg(VesAlarm alarm) {
PolicyMsg m = new PolicyMsg();
m.setPolicyVersion("1.0.0.5");
m.setPolicyName("CCVPN");
m.setPolicyScope("service=SOTNService,type=SampleType,closedLoopControlName=CL-CCVPN-d925ed73-8231-4d02-9545-db4e101f88f8");
m.setClosedLoopControlName(DmaapService.loopControlNames.get("org.onap.holmes.ccvpn"));
m.setRequestID(UUID.randomUUID().toString());
m.setClosedLoopAlarmStart(alarm.getStartEpochMicrosec());
m.setClosedLoopAlarmEnd(alarm.getLastEpochMicrosec());
m.setTarget("vserver.vserver-name");
m.setAai(getAdditionalResourceInfo(
getAdditionalField(alarm, "networkId"),
getAdditionalField(alarm, "node"),
getAdditionalField(alarm, "tp-id"),
getAdditionalField(alarm, "oper-status")
));

DmaapService.alarmUniqueRequestID.put(alarm.getEventId(), m.getRequestID());

return m;
}

rule "Update AAI Information"
no-loop true
salience 300
when
$a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
then
updateAaiStatus (
getAdditionalField($a, "networkId"),
getAdditionalField($a, "node"),
getAdditionalField($a, "tp-id"),
getLogicLink($a),
getAdditionalField($a, "oper-status")
);
end

rule "Set Up Correlation"
no-loop true
salience 200
when
$a: VesAlarm($id: eventId,
$start: startEpochMicrosec,
eventName.indexOf("Fault_Route_Status") != -1)
$b: VesAlarm(eventId != $id,
eventName.indexOf("Fault_Route_Status") != -1,
Math.abs(startEpochMicrosec - $start) < 60000)
then
if ("down".equalsIgnoreCase(getAdditionalField($a, "oper-status"))
&& "down".equalsIgnoreCase(getAdditionalField($b, "oper-status"))) {
if (isCorrelated($a, $b)){
// If any of the alarms have been marked as root, a policy message has ever been created and sent. Do NOT send it again.
if ($a.getRootFlag() != 1 && $b.getRootFlag() != 1) {
PolicyMsg msg = createPolicyMsg($a);
DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class);
dmaapService.publishPolicyMsg(msg, "unauthenticated.DCAE_CL_OUTPUT");
}
$a.setRootFlag(1);
$b.setRootFlag(1);
update($a);
update($b);
}
}
end

rule "Clear Alarms"
no-loop true
salience 100
when
$a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
then
if ("up".equalsIgnoreCase(getAdditionalField($a, "oper-status"))) {
if (DmaapService.alarmUniqueRequestID.containsKey($a.getEventId())) {
DmaapService.alarmUniqueRequestID.remove($a.getEventId());
}

//TODO: send alarm clearing message to Policy - for now it's not needed.
//...

retract($a);
}
end