To illustrate implementation of Control Loop automation using ONAP, following sections contain use case specific code belonging to main components.
Alarming Analytic
Drools rule implementing the detection of the problem
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
package ca.bell.kjar;
//list any import classes here.
import ca.bell.json.ves.model.CommonEventFormat3010;
import ca.bell.dcae.controlloop.VirtualControlLoopEvent;
import ca.bell.dcae.controlloop.ControlLoopTargetType;
import ca.bell.dcae.controlloop.ControlLoopEventStatus
import java.util.ArrayList;
import java.util.UUID
import java.util.HashMap
import java.util.Map
import java.math.BigDecimal;
import java.util.Date;
//declare any global variables here
global org.apache.nifi.logging.ComponentLog LOG;
function long getTimestamp(String hostname){
long timestamp = 0;
int index = 0;
long mult = 1;
char c = hostname.charAt(hostname.length()-1-index);
while(c >= '0' && c <= '9'){
timestamp += (c-'0')*mult;
mult = mult*10;
c = hostname.charAt(hostname.length()-1-(++index));
}
return timestamp;
}
rule "Empty hostname"
no-loop true
salience 10
when
$event :CommonEventFormat3010(
$hostname: event.otherFields.hashMap.additionalProperties.get("hostname"),
$hostname == "UNDEFINED",
$pnf_id: event.commonEventHeader.sourceId
)
then
$event.getEvent().getOtherFields().getHashMap().setAdditionalProperty("pnfId",$pnf_id);
channels["VesMessage"].send($event);
retract($event);
end
//The 2 rules have same action and can be merged into 1 rule, but is kept separated for modular purpose
rule "Check timestamp"
no-loop true
salience 2
when
$event :CommonEventFormat3010(
$hostname : event.otherFields.hashMap.additionalProperties.get("hostname"),
$hostname != "UNDEFINED",
$epochMilli : event.commonEventHeader.lastEpochMicrosec,
($epochMilli - getTimestamp($hostname)) >= (5*60*1000),
$pnf_id: event.commonEventHeader.sourceId
)
then
$event.getEvent().getOtherFields().getHashMap().setAdditionalProperty("pnfId",$pnf_id);
channels["VesMessage"].send($event);
retract($event);
end
rule "No issue detected"
no-loop true
salience 1
when
$event :CommonEventFormat3010(
$hostname : event.otherFields.hashMap.additionalProperties.get("hostname"),
$hostname != "UNDEFINED",
$epochMilli : event.commonEventHeader.lastEpochMicrosec,
($epochMilli - getTimestamp($hostname)) < (5*60*1000)
)
then
retract($event);
end
|
State Analytic
Drools rule responsible to detect a state change
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
package ca.bell.kjar;
//list any import classes here.
import ca.bell.json.ves.model.CommonEventFormat3010;
import ca.bell.dcae.controlloop.VirtualControlLoopEvent;
import ca.bell.dcae.controlloop.ControlLoopTargetType;
import ca.bell.dcae.controlloop.ControlLoopEventStatus
import java.util.ArrayList;
import java.util.UUID
import java.util.HashMap
import java.util.Map
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Date;
//declare any global variables here
global org.apache.nifi.logging.ComponentLog LOG;
declare Memory
previousHostname : String
end
rule "Initialize memory"
salience 10
when
not Memory()
then
Memory mem = new Memory();
mem.setPreviousHostname(null);
insert(mem);
LOG.info("Initialized memory");
end
rule "Hostname changed"
no-loop true
salience 2
when
$mem : Memory($previousHostname : previousHostname)
$event: CommonEventFormat3010( $newHostname : event.otherFields.hashMap.additionalProperties.get("hostname") != $previousHostname)
then
$mem.setPreviousHostname($newHostname);
String stateDBvalue = "{\"hostname\" : \"" + $newHostname + "\"}";
$event.getEvent().getOtherFields().getHashMap().setAdditionalProperty("hostname",stateDBvalue);
channels["VesMessage"].send($event);
LOG.info("Hostname changed!");
retract($event);
update($mem);
end
rule "Hostname unchanged"
salience 3
no-loop true
when
$mem : Memory($previousHostname : previousHostname)
$event: CommonEventFormat3010( $newHostname : event.otherFields.hashMap.additionalProperties.get("hostname") == $previousHostname || $newHostname == null)
then
retract($event);
end
|
Policy
APEX policy responsible to generate the new hostname and request for CDS remediation
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
{
"engineServiceParameters": {
"name": "MyApexEngine",
"version": "0.0.1",
"id": 45,
"instanceCount": 4,
"deploymentPort": 12561,
"engineParameters": {
"executorParameters": {
"JAVASCRIPT": {
"parameterClassName": "org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters"
}
},
"contextParameters": {
"parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters",
"schemaParameters": {
"Avro": {
"parameterClassName": "org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters"
}
}
},
"taskParameters": [
{
"key": "logUrl",
"value": "http://message-router:3904/events/POLICY-CL-MGT"
}
]
}
},
"eventInputParameters": {
"DCAEConsumer": {
"carrierTechnologyParameters": {
"carrierTechnology": "RESTCLIENT",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters",
"parameters": {
"url": "http://message-router:3904/events/unauthenticated.DCAE_CL_OUTPUT/cl/apex?timeout=30000"
}
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventName": "VesEvent",
"eventNameFilter": "VesEvent"
},
"AAISuccessResponseConsumer": {
"carrierTechnologyParameters": {
"carrierTechnology": "RESTREQUESTOR",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters",
"parameters": {
"url": "http://aai:8443/aai/v14/network/pnfs/pnf?pnf-id={pnfId}",
"httpMethod": "GET",
"httpCodeFilter" : "[2][0-1][0-9]",
"httpHeaders" : [
["Accept", "application/json"],
["Content-Type", "application/json"],
["X-FromAppId", "dcae-curl"],
["x-transactionId", "9998"],
["Authorization", "Basic QUFJOkFBSQ=="]
]
}
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventName": "AAISuccessResponseEvent",
"eventNameFilter": "AAISuccessResponseEvent",
"requestorMode": true,
"requestorPeer": "AAIProducer1",
"requestorTimeout": 2000
},
"AAIFailureResponseConsumer": {
"carrierTechnologyParameters": {
"carrierTechnology": "RESTREQUESTOR",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters",
"parameters": {
"url": "http://aai:8443/aai/v14/network/pnfs/pnf?pnf-id={pnfId}",
"httpMethod": "GET",
"httpCodeFilter" : "[4-5][0-1][0-9]",
"httpHeaders" : [
["Accept", "application/json"],
["Content-Type", "application/json"],
["X-FromAppId", "dcae-curl"],
["x-transactionId", "9998"],
["Authorization", "Basic QUFJOkFBSQ=="]
]
}
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventName": "AAIFailureResponseEvent",
"eventNameFilter": "AAIFailureResponseEvent",
"requestorMode": true,
"requestorPeer": "AAIProducer2",
"requestorTimeout": 2000
},
"CDSConfigModifySuccessResponseConsumer": {
"carrierTechnologyParameters": {
"carrierTechnology": "GRPC",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.grpc.GrpcCarrierTechnologyParameters"
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventName": "CDSConfigModifySuccessResponseEvent",
"eventNameFilter": "CDSConfigModifySuccessResponseEvent",
"requestorMode": true,
"requestorPeer": "CDSConfigModifyRequestProducer1",
"requestorTimeout": 500
}
},
"eventOutputParameters": {
"AAIProducer1": {
"carrierTechnologyParameters": {
"carrierTechnology": "RESTREQUESTOR",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters"
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventNameFilter": "AAIRequestEvent",
"requestorMode": true,
"requestorPeer": "AAISuccessResponseConsumer",
"requestorTimeout": 2000
},
"AAIProducer2": {
"carrierTechnologyParameters": {
"carrierTechnology": "RESTREQUESTOR",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters"
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventNameFilter": "AAIRequestEvent",
"requestorMode": true,
"requestorPeer": "AAIFailureResponseConsumer",
"requestorTimeout": 2000
},
"CDSConfigModifyRequestProducer1": {
"carrierTechnologyParameters": {
"carrierTechnology": "GRPC",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.grpc.GrpcCarrierTechnologyParameters",
"parameters": {
"host": "cds-blueprints-processor-grpc",
"port": 9111,
"username": "ccsdkapps",
"password": "ccsdkapps",
"timeout": 60
}
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventNameFilter": "CDSConfigModifyRequestEvent",
"requestorMode": true,
"requestorPeer": "CDSConfigModifySuccessResponseConsumer",
"requestorTimeout": 500
},
"CDSReplyProducer": {
"carrierTechnologyParameters": {
"carrierTechnology": "RESTCLIENT",
"parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters",
"parameters": {
"url": "http://message-router:3904/events/POLICY-CL-MGT"
}
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
},
"eventNameFilter": "LogStatusEvent"
},
"logOutputter": {
"carrierTechnologyParameters": {
"carrierTechnology": "FILE",
"parameters": {
"fileName": "outputevents.log"
}
},
"eventProtocolParameters": {
"eventProtocol": "JSON"
}
}
}
}
|