Versions Compared

Key

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

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
languagejava
titlerules.drl
linenumberstrue
collapsetrue
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
languagejava
titlerules.drl
linenumberstrue
collapsetrue
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
languagejs
title config/ApexConfig.json
linenumberstrue
collapsetrue
{
    "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"
            }
        }
    }
}