From cc95aa4f9966f014f45e32f177bf622b3ef7a8b7 Mon Sep 17 00:00:00 2001 From: GuangrongFu Date: Mon, 10 Sep 2018 14:47:40 +0800 Subject: Correted UT Coverage Issues Change-Id: Id89d4c600683646958e7e0b4b2982506e1bf7db4 Issue-ID: HOLMES-159 Signed-off-by: GuangrongFu --- .../rulemgt/dcae/DcaeConfigurationPolling.java | 3 +- .../rulemgt/dcae/DcaeConfigurationPollingTest.java | 24 +-- .../holmes/rulemgt/send/RuleAllocatorTest.java | 10 +- rules/ccvnp-rule.drl | 184 --------------------- rules/ccvpn-rule.drl | 184 +++++++++++++++++++++ 5 files changed, 203 insertions(+), 202 deletions(-) delete mode 100644 rules/ccvnp-rule.drl create mode 100644 rules/ccvpn-rule.drl diff --git a/rulemgt/src/main/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPolling.java b/rulemgt/src/main/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPolling.java index 6c0d732..68314e1 100644 --- a/rulemgt/src/main/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPolling.java +++ b/rulemgt/src/main/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPolling.java @@ -14,6 +14,7 @@ package org.onap.holmes.rulemgt.dcae; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; @@ -114,7 +115,7 @@ public class DcaeConfigurationPolling implements Runnable { httpClient = HttpsUtils.getHttpClient(HttpsUtils.DEFUALT_TIMEOUT); HttpResponse httpResponse = HttpsUtils.get(httpGet, headers, httpClient); String response = HttpsUtils.extractResponseEntity(httpResponse); - return JSON.parseObject(response, RuleQueryListResponse.class); + return JSONObject.parseObject(response, RuleQueryListResponse.class); } finally { httpGet.releaseConnection(); closeHttpClient(httpClient); diff --git a/rulemgt/src/test/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPollingTest.java b/rulemgt/src/test/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPollingTest.java index 52f1e37..4ad213c 100644 --- a/rulemgt/src/test/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPollingTest.java +++ b/rulemgt/src/test/java/org/onap/holmes/rulemgt/dcae/DcaeConfigurationPollingTest.java @@ -42,7 +42,6 @@ import org.powermock.reflect.Whitebox; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.expect; @@ -50,7 +49,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.powermock.api.easymock.PowerMock.*; -@PrepareForTest({HttpsUtils.class, DcaeConfigurationQuery.class, DcaeConfigurationPolling.class}) +@PrepareForTest({HttpsUtils.class, DcaeConfigurationQuery.class}) @SuppressStaticInitializationFor("org.onap.holmes.common.utils.HttpsUtils") @RunWith(PowerMockRunner.class) public class DcaeConfigurationPollingTest { @@ -58,14 +57,15 @@ public class DcaeConfigurationPollingTest { @org.junit.Rule public ExpectedException thrown = ExpectedException.none(); + @Test public void run() throws Exception { DcaeConfigurations dcaeConfigurations = new DcaeConfigurations(); dcaeConfigurations.addDefaultRule(new Rule("test", "clName", "contents", 1)); mockStatic(DcaeConfigurationQuery.class); expect(DcaeConfigurationQuery.getDcaeConfigurations(anyObject(String.class))).andReturn(dcaeConfigurations); - DcaeConfigurationPolling dcaeConfigurationPolling = createPartialMock(DcaeConfigurationPolling.class, - "getAllCorrelationRules"); + DcaeConfigurationPolling dcaeConfigurationPolling = new DcaeConfigurationPolling("localhost"); + Whitebox.setInternalState(dcaeConfigurationPolling, "url", "http://127.0.0.1"); RuleQueryListResponse ruleQueryListResponse = new RuleQueryListResponse(); @@ -76,10 +76,16 @@ public class DcaeConfigurationPollingTest { }; ruleQueryListResponse.setCorrelationRules(ruleResult4APIList); ruleQueryListResponse.setTotalCount(ruleResult4APIList.size()); - expect(dcaeConfigurationPolling.getAllCorrelationRules()).andReturn(ruleQueryListResponse); CloseableHttpClient clientMock = createMock(CloseableHttpClient.class); HttpResponse httpResponseMock = createMock(HttpResponse.class); + expect(HttpsUtils.getHttpClient(30000)).andReturn(clientMock); + expect(HttpsUtils.get(anyObject(HttpGet.class), anyObject(HashMap.class), anyObject(CloseableHttpClient.class))) + .andReturn(httpResponseMock); + expect(HttpsUtils.extractResponseEntity(httpResponseMock)).andReturn(JSONObject.toJSONString(ruleQueryListResponse)); + clientMock.close(); + expectLastCall(); + expect(HttpsUtils.getHttpClient(30000)).andReturn(clientMock); expect(HttpsUtils.delete(anyObject(HttpDelete.class), anyObject(HashMap.class), anyObject(CloseableHttpClient.class))) .andReturn(httpResponseMock); @@ -155,19 +161,13 @@ public class DcaeConfigurationPollingTest { @Test public void getAllCorrelationRules() throws Exception { - Map responseObj = new HashMap(){ - { - put("correlationRules", new ArrayList()); - put("totalCount", 0); - } - }; CloseableHttpClient clientMock = createMock(CloseableHttpClient.class); HttpResponse httpResponseMock = createMock(HttpResponse.class); expect(HttpsUtils.getHttpClient(30000)).andReturn(clientMock); expect(HttpsUtils.get(anyObject(HttpGet.class), anyObject(HashMap.class), anyObject(CloseableHttpClient.class))) .andReturn(httpResponseMock); - expect(HttpsUtils.extractResponseEntity(httpResponseMock)).andReturn(JSONObject.toJSONString(responseObj)); + expect(HttpsUtils.extractResponseEntity(httpResponseMock)).andReturn("{\"correlationRules\": [], \"totalCount\": 0}"); clientMock.close(); expectLastCall(); diff --git a/rulemgt/src/test/java/org/onap/holmes/rulemgt/send/RuleAllocatorTest.java b/rulemgt/src/test/java/org/onap/holmes/rulemgt/send/RuleAllocatorTest.java index 1815ebb..5dc8281 100644 --- a/rulemgt/src/test/java/org/onap/holmes/rulemgt/send/RuleAllocatorTest.java +++ b/rulemgt/src/test/java/org/onap/holmes/rulemgt/send/RuleAllocatorTest.java @@ -36,7 +36,7 @@ import org.onap.holmes.rulemgt.wrapper.RuleQueryWrapper; import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; +import org.powermock.modules.junit4.rule.PowerMockRule; import java.util.ArrayList; import java.util.Calendar; @@ -44,18 +44,18 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.Assert.assertThat; import static org.onap.holmes.rulemgt.send.RuleAllocator.ENABLE; -@RunWith(PowerMockRunner.class) @PrepareForTest({ServiceLocator.class, RuleMgtWrapper.class, RuleQueryWrapper.class, EngineWrapper.class, - EngineInsQueryTool.class, DbDaoUtil.class, RuleAllocator.class, ServiceLocatorHolder.class}) + EngineInsQueryTool.class, DbDaoUtil.class, ServiceLocatorHolder.class}) public class RuleAllocatorTest { @Rule public ExpectedException thrown = ExpectedException.none(); + @Rule + public PowerMockRule rule = new PowerMockRule(); + private RuleMgtWrapper ruleMgtWrapperMock; private RuleQueryWrapper ruleQueryWrapperMock; private EngineWrapper engineWrapperMock; diff --git a/rules/ccvnp-rule.drl b/rules/ccvnp-rule.drl deleted file mode 100644 index e006dbb..0000000 --- a/rules/ccvnp-rule.drl +++ /dev/null @@ -1,184 +0,0 @@ -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 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"), - null - ); -} - -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 updateAaiLinkStatus(String linkName, String status) { - AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); - Map body = new HashMap(){ - { - put("operational-status", status); - } - }; - aai.updateLogicLinkStatus(linkName, body); -} - -function void updateAaiTpStatus(String networkId, String pnfName, String ifName, String status) { - AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); - Map body = new HashMap(){ - { - put("operational-status", status); - } - }; - aai.updateTerminalPointStatus(networkId, pnfName, ifName, body); -} - -function Map getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) { - AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); - JSONArray instances = aai.getServiceInstances(networkId, pnfName, ifName, status); - - Map ret = new HashMap(); - - 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(id + ".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 - updateAaiTpStatus ( - getAdditionalField($a, "networkId"), - getAdditionalField($a, "node"), - getAdditionalField($a, "tp-id"), - 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 - String status = "down"; - if (status.equalsIgnoreCase(getAdditionalField($a, "oper-status")) - && status.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"); - updateAaiLinkStatus(getLogicLink($a), status); - } - $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 \ No newline at end of file diff --git a/rules/ccvpn-rule.drl b/rules/ccvpn-rule.drl new file mode 100644 index 0000000..e006dbb --- /dev/null +++ b/rules/ccvpn-rule.drl @@ -0,0 +1,184 @@ +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 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"), + null + ); +} + +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 updateAaiLinkStatus(String linkName, String status) { + AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); + Map body = new HashMap(){ + { + put("operational-status", status); + } + }; + aai.updateLogicLinkStatus(linkName, body); +} + +function void updateAaiTpStatus(String networkId, String pnfName, String ifName, String status) { + AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); + Map body = new HashMap(){ + { + put("operational-status", status); + } + }; + aai.updateTerminalPointStatus(networkId, pnfName, ifName, body); +} + +function Map getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) { + AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); + JSONArray instances = aai.getServiceInstances(networkId, pnfName, ifName, status); + + Map ret = new HashMap(); + + 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(id + ".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 + updateAaiTpStatus ( + getAdditionalField($a, "networkId"), + getAdditionalField($a, "node"), + getAdditionalField($a, "tp-id"), + 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 + String status = "down"; + if (status.equalsIgnoreCase(getAdditionalField($a, "oper-status")) + && status.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"); + updateAaiLinkStatus(getLogicLink($a), status); + } + $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 \ No newline at end of file -- cgit 1.2.3-korg