- CPS-393Getting issue details... STATUS
Spike Description:
Investigate A&AI interface, especially how to register and receive DMaaP Events from A&AI. Investigate filter-options and consider some PoC code.
Issues & Decisions
# | Description | Notes | Decision |
---|---|---|---|
1 | AAI failed to send DMaaP notification after xNF was created | The bug causing this error was fixed and changes have been merged. | |
2 | DMaap Client failed because of dependency Issues | The bug causing this error was fixed and changes have been submitted. | |
3 | setFilter() is not documented | Fiachra Corcoran (DMaaP) advised any existing documentation is out of date and this should not be used | Based on input from (DMaaP) team and possible lack of future support we will do filtering on client side |
4 | Update Events for address information | is it possible for address information to change ie. does CPS need to listen to these? |
Background:
When a xNF object is added to A&AI, a DMaaP event, AAI-EVENT is created. A&AI handles the publishing of this event. To be notified of the AAI-EVENT, CPS will need to register on DMaaP Message Router.
DMaaP offers a client plugin called DMaaP Client, which can be found here. This Client can be used to register to a DMaaP event. The PoC code will use this client to show that CPS can listen for and receive DMaaP events.
Filtering of AAI-EVENT:
Based on input from the DMaaP team, the filtering will be done on client side. From looking at the DMaaP event that is created when a xNF is created, we can filter on the following properties:
- equip-type
- equip-vendor
- equip-model
- pnf-id
Note* The exact property to filter on is still being decided
Example of DMaaP Event when a xNF is added to A&AI:
Proof Of Concept Code:
To use the DMaaP Client we need the following dependency in our pom.xml file.
<dependency> <groupId>org.onap.dmaap.messagerouter.dmaapclient</groupId> <artifactId>dmaapClient</artifactId> <version>1.1.12</version> </dependency>
The following builder method is used to create an instance of a DMaaP Consumer Client:
final MRConsumerImpl mrConsumer = new MRConsumerImpl.MRConsumerImplBuilder().setHostPart(hosts) .setTopic("AAI-EVENT").setConsumerGroup("onap-cps").setConsumerId("cps-ncmp").setTimeoutMs(10000) .setLimit(1000).setFilter("").setApiKey_username(null) .setApiSecret_password(null).createMRConsumerImpl();
*Note setFilter() method is not documented and we have been advised by DMaaP team not to use it. So all filtering as to be done on client side. See also issue #2
For the Consumer client to be created we need to pass in the values for the following attributes:
Attribute name | Attribute Description | Example |
---|---|---|
setHostPart | The host and port of the DMaaP server in the format <host:port>. This method takes a collection of strings, check example. | Example of HostPart final Collection<String> hosts = new ArrayList<>(); hosts.add("message-router.onap:3904"); |
setTopic | The topic name to consume from | "AAI-EVENT" |
setConsumerGroup | A name that uniquely identifies the subscriber's group | "onap-cps" |
setConsumerId | Within the subscriber's group, a name that uniquely identifies the subscriber's process | "cps-ncmp" |
setTimeoutMs | Time in ms to wait for messages on the server before returning | 10000 |
setLimit | Maximum number of messages that is returned per fetch | 1000 |
setFilter | A customizable message filter, or null if no filtering is required | null |
setApiKey_username | The username of the client application | null |
setApiSecret_password | The password for the username | null |
The consumer also takes in the following properties:
# This Specifies the request header type used in the request to DMaaP server. # Valid types: # DME2 # HTTPAAF # HTTPAUTH # HTTPNOAUTH # For this POC we use the HTTPNOAUTH, this supports both https and http protocols. mrConsumer.setProtocolFlag("HTTPNOAUTH");
# The http protocol to use: # http # https final Properties props = new Properties(); props.setProperty("Protocol", "http"); mrConsumer.setProps(props);
To fetch, the following method needs to be called on the consumer object:
mrConsumer.fetch()
The POC used in the demo: