Skip to content

Commit 0a58fe9

Browse files
PRIS-156: Merge metaData
1 parent d1b90f8 commit 0a58fe9

File tree

8 files changed

+132
-11
lines changed

8 files changed

+132
-11
lines changed

opennms-pris-api/src/main/java/org/opennms/pris/util/RequisitionUtils.java

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.opennms.pris.util;
22

33
import java.util.Objects;
4+
5+
import org.opennms.pris.model.MetaData;
46
import org.opennms.pris.model.Requisition;
57
import org.opennms.pris.model.RequisitionAsset;
68
import org.opennms.pris.model.RequisitionCategory;
@@ -72,6 +74,17 @@ public static RequisitionAsset findAsset(final RequisitionNode node,
7274
return null;
7375
}
7476

77+
public static MetaData findMetaData(final RequisitionNode node,
78+
final String context, final String key) {
79+
for (final MetaData metaData : node.getMetaDatas()) {
80+
if (Objects.equals(metaData.getContext(), context) && Objects.equals(metaData.getKey(), key)) {
81+
return metaData;
82+
}
83+
}
84+
85+
return null;
86+
}
87+
7588
public static RequisitionMonitoredService findMonitoredService(final RequisitionInterface _interface,
7689
final String serviceName) {
7790
for (final RequisitionMonitoredService monitoredService : _interface.getMonitoredServices()) {

opennms-pris-plugins/opennms-pris-plugins-defaults/pom.xml

+6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
<artifactId>httpclient</artifactId>
2323
<version>${httpComponentsVersion}</version>
2424
</dependency>
25+
<dependency>
26+
<groupId>${project.groupId}</groupId>
27+
<artifactId>opennms-pris-api</artifactId>
28+
<classifier>tests</classifier>
29+
</dependency>
30+
2531
</dependencies>
2632

2733
<build>

opennms-pris-plugins/opennms-pris-plugins-defaults/src/main/java/org/opennms/opennms/pris/plugins/defaults/source/HttpRequisitionMergeSource.java

+26-11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@
2525
*/
2626
package org.opennms.opennms.pris.plugins.defaults.source;
2727

28+
import java.io.BufferedReader;
29+
import java.io.IOException;
30+
import java.io.InputStreamReader;
31+
import java.util.HashMap;
32+
import java.util.Map;
33+
34+
import javax.xml.bind.JAXBContext;
35+
import javax.xml.bind.JAXBException;
36+
import javax.xml.bind.Unmarshaller;
37+
2838
import org.apache.http.HttpResponse;
2939
import org.apache.http.auth.AuthScope;
3040
import org.apache.http.auth.UsernamePasswordCredentials;
@@ -36,20 +46,18 @@
3646
import org.kohsuke.MetaInfServices;
3747
import org.opennms.pris.api.InstanceConfiguration;
3848
import org.opennms.pris.api.Source;
39-
import org.opennms.pris.model.*;
49+
import org.opennms.pris.model.MetaData;
50+
import org.opennms.pris.model.PrimaryType;
51+
import org.opennms.pris.model.Requisition;
52+
import org.opennms.pris.model.RequisitionAsset;
53+
import org.opennms.pris.model.RequisitionCategory;
54+
import org.opennms.pris.model.RequisitionInterface;
55+
import org.opennms.pris.model.RequisitionMonitoredService;
56+
import org.opennms.pris.model.RequisitionNode;
4057
import org.opennms.pris.util.RequisitionUtils;
4158
import org.slf4j.Logger;
4259
import org.slf4j.LoggerFactory;
4360

44-
import javax.xml.bind.JAXBContext;
45-
import javax.xml.bind.JAXBException;
46-
import javax.xml.bind.Unmarshaller;
47-
import java.io.BufferedReader;
48-
import java.io.IOException;
49-
import java.io.InputStreamReader;
50-
import java.util.HashMap;
51-
import java.util.Map;
52-
5361
/**
5462
* Source to merge two requisitions (A and B) provided via HTTP. The merge
5563
* behavior is configurable and allows the following configuration:
@@ -63,7 +71,7 @@ public class HttpRequisitionMergeSource implements Source {
6371

6472
private final InstanceConfiguration config;
6573

66-
private HttpRequisitionMergeSource(final InstanceConfiguration config) {
74+
HttpRequisitionMergeSource(final InstanceConfiguration config) {
6775
this.config = config;
6876
}
6977

@@ -188,6 +196,13 @@ private RequisitionNode mergeNodes(RequisitionNode nodeA, RequisitionNode nodeB)
188196
}
189197
}
190198

199+
//Add all nodeB metadata to nodeA, do not duplicate
200+
for (MetaData metaData : nodeB.getMetaDatas()) {
201+
if (RequisitionUtils.findMetaData(nodeA, metaData.getContext(), metaData.getKey()) == null) {
202+
nodeA.getMetaDatas().add(metaData);
203+
}
204+
}
205+
191206
//Add all Interfaces and Services from nodeB to nodeA
192207
for (RequisitionInterface interfaceB : nodeB.getInterfaces()) {
193208
RequisitionInterface interfaceA = RequisitionUtils.findInterface(nodeA, interfaceB.getIpAddr());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.opennms.opennms.pris.plugins.defaults.source;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import java.io.IOException;
7+
import java.io.OutputStream;
8+
import java.net.InetSocketAddress;
9+
import java.nio.charset.StandardCharsets;
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
import java.nio.file.Paths;
13+
14+
import org.junit.Before;
15+
import org.junit.Test;
16+
import org.opennms.pris.api.MockInstanceConfiguration;
17+
import org.opennms.pris.model.MetaData;
18+
import org.opennms.pris.model.Requisition;
19+
import org.opennms.pris.model.RequisitionNode;
20+
21+
import com.sun.net.httpserver.Headers;
22+
import com.sun.net.httpserver.HttpExchange;
23+
import com.sun.net.httpserver.HttpHandler;
24+
import com.sun.net.httpserver.HttpServer;
25+
26+
public class HttpRequisitionMergeSourceTest {
27+
28+
@Before
29+
public void setup() throws Exception {
30+
final HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
31+
server.createContext("/source1.xml", new TestHandler(Paths.get("src/test/resources/source1.xml")));
32+
server.createContext("/source2.xml", new TestHandler(Paths.get("src/test/resources/source2.xml")));
33+
server.setExecutor(null);
34+
server.start();
35+
}
36+
37+
@Test
38+
public void testMetaDataMerging() throws Exception {
39+
final MockInstanceConfiguration config = new MockInstanceConfiguration("test");
40+
config.set("encoding", "ISO-8859-1");
41+
config.set("A.url", "http://localhost:8000/source1.xml");
42+
config.set("B.url", "http://localhost:8000/source2.xml");
43+
final HttpRequisitionMergeSource httpRequisitionMergeSource = new HttpRequisitionMergeSource(config);
44+
45+
final Requisition result = (Requisition) httpRequisitionMergeSource.dump();
46+
assertEquals(1, result.getNodes().size());
47+
final RequisitionNode requisitionNode = result.getNodes().get(0);
48+
assertEquals(2, requisitionNode.getMetaDatas().size());
49+
assertTrue(requisitionNode.getMetaDatas().stream().anyMatch(e -> e.equals(new MetaData("requisition", "env", "pro"))));
50+
assertTrue(requisitionNode.getMetaDatas().stream().anyMatch(e -> e.equals(new MetaData("requisition", "app", "application"))));
51+
}
52+
53+
static class TestHandler implements HttpHandler {
54+
final byte[] contents;
55+
56+
public TestHandler(final Path path) throws Exception {
57+
this.contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8).getBytes();
58+
}
59+
60+
@Override
61+
public void handle(HttpExchange httpExchange) throws IOException {
62+
final Headers headers = httpExchange.getResponseHeaders();
63+
headers.add("Content-Type", "application/xml");
64+
httpExchange.sendResponseHeaders(200, contents.length);
65+
final OutputStream outputStream = httpExchange.getResponseBody();
66+
outputStream.write(contents, 0, contents.length);
67+
outputStream.close();
68+
}
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<model-import foreign-source="source1" xmlns="http://xmlns.opennms.org/xsd/config/model-import">
3+
<node node-label="node1" foreign-id="node1">
4+
<interface ip-addr="10.10.6.41" snmp-primary="P">
5+
<monitored-service service-name="service1"/>
6+
</interface>
7+
</node>
8+
</model-import>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<model-import foreign-source="source2" xmlns="http://xmlns.opennms.org/xsd/config/model-import">
3+
<node node-label="node1" foreign-id="node1">
4+
<interface ip-addr="10.10.6.41" snmp-primary="P"/>
5+
<asset name="modelNumber" value="Test"/>
6+
<meta-data context="requisition" key="env" value="pro"/>
7+
<meta-data context="requisition" key="app" value="application"/>
8+
</node>
9+
</model-import>

0 commit comments

Comments
 (0)