Fixed the Start-up Logic 21/40121/1
authorGuangrongFu <fu.guangrong@zte.com.cn>
Thu, 29 Mar 2018 09:20:07 +0000 (17:20 +0800)
committerGuangrongFu <fu.guangrong@zte.com.cn>
Thu, 29 Mar 2018 10:30:01 +0000 (18:30 +0800)
Change-Id: I5646e771e05f5f774162373a2f69a0815acb53e5
Issue-ID: HOLMES-106
Signed-off-by: GuangrongFu <fu.guangrong@zte.com.cn>
rulemgt-standalone/pom.xml
rulemgt-standalone/src/main/assembly/bin/run.sh
rulemgt-standalone/src/main/assembly/conf/rulemgt.yml
rulemgt/pom.xml
rulemgt/src/main/java/org/onap/holmes/rulemgt/RuleActiveApp.java
rulemgt/src/main/java/org/onap/holmes/rulemgt/msb/MsbQuery.java
rulemgt/src/main/java/org/onap/holmes/rulemgt/send/Ip4AddingRule.java
rulemgt/src/main/java/org/onap/holmes/rulemgt/send/RuleAllocation.java
rulemgt/src/test/java/org/onap/holmes/rulemgt/send/RuleAllocationTest.java

index 2b9ea50..606acbf 100644 (file)
                             <overwrite>true</overwrite>
                         </configuration>
                     </execution>
-                    <execution>
-                        <id>copy-lib-${linux64id}</id>
-                        <phase>process-resources</phase>
-                        <goals>
-                            <goal>copy-resources</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>${linux64outputdir}/lib</outputDirectory>
-                            <resources>
-                                <resource>
-                                    <directory>${project.parent.basedir}/rulemgt/target/lib</directory>
-                                    <filtering>false</filtering>
-                                </resource>
-                            </resources>
-                            <overwrite>true</overwrite>
-                        </configuration>
-                    </execution>
                     <execution>
                         <id>copy-resources-${win64id}</id>
                         <phase>process-resources</phase>
                             <overwrite>true</overwrite>
                         </configuration>
                     </execution>
-                    <execution>
-                        <id>copy-lib-${win64id}</id>
-                        <phase>process-resources</phase>
-                        <goals>
-                            <goal>copy-resources</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>${win64outputdir}/lib</outputDirectory>
-                            <resources>
-                                <resource>
-                                    <directory>${project.parent.basedir}/rulemgt/target/lib</directory>
-                                    <filtering>false</filtering>
-                                </resource>
-                            </resources>
-                            <overwrite>true</overwrite>
-                        </configuration>
-                    </execution>
                     <execution>
                         <id>copy-dockerfile</id>
                         <phase>process-resources</phase>
index 1b77f33..8d52c04 100644 (file)
@@ -25,12 +25,12 @@ JAVA="$JAVA_HOME/bin/java"
 echo @JAVA@ $JAVA
 main_path=$RUNHOME/..
 cd $main_path
-JAVA_OPTS="-Xms50m -Xmx128m"
+JAVA_OPTS="-Xms50m -Xmx128m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9201"
 port=8312
 #JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=$port,server=y,suspend=n"
 echo @JAVA_OPTS@ $JAVA_OPTS
 
-class_path="$main_path/*:$main_path/lib/*:$main_path/holmes-rulemgt.jar"
+class_path="$main_path/:$main_path/holmes-rulemgt.jar"
 echo @class_path@ $class_path
 
 if [ -z ${JDBC_USERNAME} ]; then
index c3dc4cc..26a94e8 100644 (file)
@@ -41,7 +41,7 @@ logging:
       threshold: ERROR
       #logFormat: "%nopexception%logger\n|%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX,UTC}\n|%level\n|%message\n|%X{InvocationID}\n|%rootException\n|%marker\n|%thread\n|%n \r\n"
       logFormat: "%d{yyyy-MM-dd HH:mm:ss SSS} %-5p [%c][%t] invocationID:{InvocationID} - %m%n"
-      currentLogFilename: var/log/ONAP/holmes/rulemgt-relation-error.log
+      currentLogFilename: /var/log/ONAP/holmes/rulemgt-relation-error.log
       archivedLogFilenamePattern: /var/log/ONAP/holmes/zip/rulemgt-relation-error-%d{yyyy-MM-dd}.log.gz
       archivedFileCount: 7
     - type: file
index ba5524c..d07689f 100644 (file)
                     <archive>
                         <manifest>
                             <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-                            <mainClass>org.onap.holmes.rulemgt.RuleActiveApp</mainClass>
-                            <classpathPrefix>lib/</classpathPrefix>
                         </manifest>
                     </archive>
                 </configuration>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <configuration>
+                    <createDependencyReducedPom>true</createDependencyReducedPom>
+                    <filters>
+                        <filter>
+                            <artifact>*:*</artifact>
+                            <excludes>
+                                <exclude>META-INF/*.SF</exclude>
+                                <exclude>META-INF/*.DSA</exclude>
+                                <exclude>META-INF/*.RSA</exclude>
+                            </excludes>
+                        </filter>
+                    </filters>
+                </configuration>
                 <executions>
                     <execution>
-                        <id>copy</id>
                         <phase>package</phase>
                         <goals>
-                            <goal>copy-dependencies</goal>
+                            <goal>shade</goal>
                         </goals>
                         <configuration>
-                            <outputDirectory>
-                                ${project.build.directory}/lib
-                            </outputDirectory>
+                            <transformers>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>org.onap.holmes.rulemgt.RuleActiveApp</mainClass>
+                                </transformer>
+                            </transformers>
                         </configuration>
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.3</version>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                </configuration>
-            </plugin>
         </plugins>
         <resources>
             <resource>
index 5f96912..daebff3 100644 (file)
@@ -31,6 +31,7 @@ import org.onap.holmes.common.exception.CorrelationException;
 import org.onap.holmes.common.utils.MSBRegisterUtil;
 import org.onap.holmes.common.utils.transactionid.TransactionIdFilter;
 import org.onap.holmes.rulemgt.dcae.DcaeConfigurationPolling;
+import org.onap.holmes.rulemgt.msb.MsbQuery;
 import org.onap.holmes.rulemgt.resources.RuleMgtResources;
 import org.onap.msb.sdk.discovery.entity.MicroServiceInfo;
 import org.onap.msb.sdk.discovery.entity.Node;
@@ -64,6 +65,8 @@ public class RuleActiveApp extends IOCApplication<RuleAppConfig> {
                 DcaeConfigurationPolling.POLLING_PERIOD, TimeUnit.MILLISECONDS);
         environment.servlets().addFilter("customFilter",new TransactionIdFilter()).addMappingForUrlPatterns(EnumSet
                 .allOf(DispatcherType.class),true,"/*");
+
+        new MsbQuery().startTimer();
     }
 
     private MicroServiceInfo createMicroServiceInfo() {
index ed9b9af..2f440b6 100644 (file)
@@ -1,12 +1,12 @@
 /**
  * Copyright 2017 ZTE Corporation.
- *
+ * <p>
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 package org.onap.holmes.rulemgt.msb;
 
 import lombok.extern.slf4j.Slf4j;
-import org.jvnet.hk2.annotations.Service;
+import org.glassfish.hk2.api.ServiceLocator;
+import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder;
 import org.onap.holmes.rulemgt.send.RuleAllocation;
 import org.onap.holmes.rulemgt.send.Ip4AddingRule;
 import org.onap.holmes.rulemgt.wrapper.RuleMgtWrapper;
 
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
 import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
 
 
-@Service
 @Slf4j
 public class MsbQuery {
 
-    @Inject
     private RuleAllocation ruleAllocation;
 
-    @Inject
     private Ip4AddingRule ip4AddingRule;
 
-    @Inject
     private EngineIpList engineIpList;
 
-    @Inject
     private RuleMgtWrapper ruleMgtWrapper;
 
-    private  List<String> timerIpList;
+    private List<String> timerIpList;
 
-    @PostConstruct
-    public void init() {
+    public MsbQuery() {
+        ruleAllocation = new RuleAllocation();
 
-        try{
+        ServiceLocator locator = ServiceLocatorHolder.getLocator();
+        ip4AddingRule = locator.getService(Ip4AddingRule.class);
+        engineIpList = locator.getService(EngineIpList.class);
+        ruleMgtWrapper = locator.getService(RuleMgtWrapper.class);
+    }
+
+    public void startTimer() {
+        try {
             timer();
-        }catch(Exception e){
-            log.error("MSBQuery init timer task failed !" + e.getMessage());
+        } catch (Exception e) {
+            log.error("MSBQuery startTimer timer task failed !" + e.getMessage(), e);
+            try {
+                Thread.sleep(30000);
+            } catch (InterruptedException e1) {
+                Thread.currentThread().interrupt();
+            }
         }
 
+
     }
 
-    public void timer() throws Exception{
+    public void timer() throws Exception {
         Timer timer = new Timer();
         timer.schedule(new TimerTask() {
 
             public void run() {
                 try {
                     timerIpList = engineIpList.getServiceCount();
-                    ip4AddingRule.getIpList(timerIpList);
-                    ruleAllocation.judgeAndAllocateRule(timerIpList);
+                    log.info(String.format("There are %d engine instance(s) running currently.", timerIpList.size()));
 
+                    ip4AddingRule.setIpList(timerIpList);
+                    ruleAllocation.judgeAndAllocateRule(timerIpList);
                 } catch (Exception e) {
-                    log.error("The timing query engine instance failed " ,e);
+                    log.error("The timing query engine instance failed "e);
                 }
             }
 
-        }, 5000, 30000);
+        }, 10000, 30000);
 
     }
 
index f82d3a4..e224bb5 100644 (file)
@@ -32,7 +32,7 @@ public class Ip4AddingRule {
     private RuleQueryWrapper ruleQueryWrapper;
     private List<String> engineService;
 
-    public void getIpList(List<String> ipList){
+    public void setIpList(List<String> ipList){
         engineService = ipList;
     }
 
index e69be51..75f0a08 100644 (file)
@@ -1,12 +1,12 @@
 /**
  * Copyright 2017 ZTE Corporation.
- *
+ * <p>
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 package org.onap.holmes.rulemgt.send;
 
 import lombok.extern.slf4j.Slf4j;
+import org.glassfish.hk2.api.ServiceLocator;
 import org.jvnet.hk2.annotations.Service;
 import org.onap.holmes.common.api.entity.CorrelationRule;
+import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder;
 import org.onap.holmes.common.exception.CorrelationException;
 import org.onap.holmes.common.utils.DbDaoUtil;
 import org.onap.holmes.rulemgt.bolt.enginebolt.EngineWrapper;
@@ -32,56 +34,62 @@ import javax.inject.Inject;
 import java.util.*;
 
 
-@Service
 @Slf4j
 public class RuleAllocation {
 
     private final static int ENABLE = 1;
-
-    @Inject
     private RuleMgtWrapper ruleMgtWrapper;
-    @Inject
     private RuleQueryWrapper ruleQueryWrapper;
-    @Inject
     private EngineWrapper engineWrapper;
-    @Inject
     private EngineIpList engineIpList;
-    @Inject
     private DbDaoUtil daoUtil;
-
     private CorrelationRuleDao correlationRuleDao;
-
     private int ruleCount;
     private int serviceCount;
     private List<String> temIpList = new ArrayList<>();
     private List<String> engineService = new ArrayList<>();
     private List<CorrelationRule> allRules = new ArrayList<>();
 
-    @PostConstruct
-    public void initDaoUtilAndEngineIp() throws Exception{
+    public RuleAllocation() {
+        ServiceLocator locator = ServiceLocatorHolder.getLocator();
+        ruleMgtWrapper = locator.getService(RuleMgtWrapper.class);
+        ruleQueryWrapper = locator.getService(RuleQueryWrapper.class);
+        engineWrapper = locator.getService(EngineWrapper.class);
+        engineIpList = locator.getService(EngineIpList.class);
+        daoUtil = locator.getService(DbDaoUtil.class);
+
+        initDaoUtilAndEngineIp();
+    }
+
+    private void initDaoUtilAndEngineIp() {
         correlationRuleDao = daoUtil.getJdbiDaoByOnDemand(CorrelationRuleDao.class);
-        temIpList =  engineIpList.getServiceCount();
+        try {
+            temIpList = engineIpList.getServiceCount();
+
+        } catch (Exception e) {
+            log.warn("Failed to get the number of engine instances.", e);
+        }
     }
 
-    public void judgeAndAllocateRule(List<String> ipList)throws Exception{
-        if(ipList != null) {
+    public void judgeAndAllocateRule(List<String> ipList) throws Exception {
+        if (ipList != null) {
             engineService = ipList;
             serviceCount = ipList.size();
         }
-        if(temIpList.size() < serviceCount){
+        if (temIpList.size() < serviceCount) {
             //extend
             List<CorrelationRule> deleteRule = calculateRule(temIpList);
-            List<CorrelationRule> allocateRule =  calculateRule(temIpList);
-            List<String> extendIp = extendCompareIp(engineService,temIpList);
-            AllocateService(extendIp,allocateRule);
-            deleteRuleFromFormerEngine(deleteRule,temIpList);
+            List<CorrelationRule> allocateRule = calculateRule(temIpList);
+            List<String> extendIp = extendCompareIp(engineService, temIpList);
+            AllocateService(extendIp, allocateRule);
+            deleteRuleFromFormerEngine(deleteRule, temIpList);
 
         } else if (temIpList.size() > serviceCount) {
             //destroy
             List<String> destroyIp = destroyCompareIp(engineService, temIpList);
             AllocateService(restIp(destroyIp), relocateRuleAfterDestroy(destroyIp));
 
-        } else if(temIpList.size() == serviceCount) {
+        } else if (temIpList.size() == serviceCount) {
             temIpList = engineService;
             return;
         }
@@ -91,18 +99,18 @@ public class RuleAllocation {
 
 
     // When the engine is expanding, the rules that need to be allocated are calculated.
-    private List<CorrelationRule> calculateRule(List<String> oldIpList) throws Exception{
+    private List<CorrelationRule> calculateRule(List<String> oldIpList) throws Exception {
         allRules = ruleQueryWrapper.queryRuleByEnable(ENABLE);
-        if(allRules != null) {
+        if (allRules != null) {
             ruleCount = allRules.size();
         }
         int count = ruleCount / serviceCount;
         int remainder = ruleCount % serviceCount;
 
         List<CorrelationRule> subRule = new ArrayList<>();
-        for(String ip : oldIpList) {
+        for (String ip : oldIpList) {
             List<CorrelationRule> rules = ruleQueryWrapper.queryRuleByEngineInstance(ip);
-            List<CorrelationRule> tem = rules.subList(count + (remainder-- / oldIpList.size()),rules.size());
+            List<CorrelationRule> tem = rules.subList(count + (remainder-- / oldIpList.size()), rules.size());
             subRule.addAll(tem);
         }
         return subRule;
@@ -111,24 +119,24 @@ public class RuleAllocation {
     //Rules that need to be allocated after the engine is destroyed
     private List<CorrelationRule> relocateRuleAfterDestroy(List<String> destroyIpList) throws CorrelationException {
         List<CorrelationRule> rules = new ArrayList<>();
-        try{
-            if(destroyIpList != null){
-                for(String ip : destroyIpList) {
+        try {
+            if (destroyIpList != null) {
+                for (String ip : destroyIpList) {
                     rules.addAll(ruleQueryWrapper.queryRuleByEngineInstance(ip));
                 }
             }
-        }catch(CorrelationException e) {
-            log.error("method relocateRuleAfterDestroy get data from DB failed !" +e.getMessage());
+        } catch (CorrelationException e) {
+            log.error("method relocateRuleAfterDestroy get data from DB failed !", e);
         }
         return rules;
     }
 
     //Extended IP
-    private List<String> extendCompareIp(List<String> newList, List<String> oldList){
+    private List<String> extendCompareIp(List<String> newList, List<String> oldList) {
         List<String> extendIpList = new ArrayList<>();
 
-        for( String ip :newList) {
-            if(! oldList.contains(ip)) {
+        for (String ip : newList) {
+            if (!oldList.contains(ip)) {
                 extendIpList.add(ip);
             }
         }
@@ -138,8 +146,8 @@ public class RuleAllocation {
     //Destroyed IP
     private List<String> destroyCompareIp(List<String> newList, List<String> oldList) {
         List<String> destroyIpList = new ArrayList<>();
-        for(String ip : oldList) {
-            if(!newList.contains(ip)) {
+        for (String ip : oldList) {
+            if (!newList.contains(ip)) {
                 destroyIpList.add(ip);
             }
         }
@@ -149,52 +157,51 @@ public class RuleAllocation {
     //Residual IP after destruction
     private List<String> restIp(List<String> destroyIp) {
         List<String> restIpList = new ArrayList<>();
-        for(String ip : engineService) {
-            if(!destroyIp.contains(ip)) {
+        for (String ip : engineService) {
+            if (!destroyIp.contains(ip)) {
                 restIpList.add(ip);
             }
         }
         return restIpList;
     }
 
-    public void AllocateService(List<String> extendIpList, List<CorrelationRule> subList) throws Exception{
+    public void AllocateService(List<String> extendIpList, List<CorrelationRule> subList) throws Exception {
         List<String> needIpList = getSortIp(extendIpList);
 
-        for(int i=0,j=0;j < subList.size();i++,j++ ){
+        for (int i = 0, j = 0; j < subList.size(); i++, j++) {
             int index = i % needIpList.size();
             String deployIp = needIpList.get(index);
             CorrelationRule rule = subList.get(j);
             rule.setEngineInstance(deployIp);
-            allocateDeployRule(rule,deployIp);
+            allocateDeployRule(rule, deployIp);
         }
     }
 
     //The IP to be allocated is in ascending order, and the least is circulate.
-    private List<String > getSortIp(List<String> ipList){
-        List<CorrelationRule> ipRuleList  = new ArrayList<>();
-        HashMap<String,String> hashMap = new HashMap();
+    private List<String> getSortIp(List<String> ipList) {
+        List<CorrelationRule> ipRuleList = new ArrayList<>();
+        HashMap<String, String> hashMap = new HashMap();
 
-        try{
-            for(String ip : ipList){
+        try {
+            for (String ip : ipList) {
                 ipRuleList = ruleQueryWrapper.queryRuleByEngineInstance(ip);
-                if(ipRuleList != null) {
+                if (ipRuleList != null) {
                     hashMap.put(ip, String.valueOf(ipRuleList.size()));
                 }
             }
-        }catch (Exception e){
-            log.error("getEngineIp4AddRule failed !" + e.getMessage());
+        } catch (Exception e) {
+            log.error("getEngineIp4AddRule failed !", e);
         }
 
         List<Map.Entry<String, String>> list_Data = new ArrayList<Map.Entry<String, String>>(hashMap.entrySet());
         Collections.sort(list_Data, new Comparator<Map.Entry<String, String>>() {
-            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2)
-            {
+            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                 return o1.getValue().compareTo(o2.getValue());
             }
         });
 
         List<String> needList = new ArrayList<>();
-        for(Map.Entry<String, String> map: list_Data) {
+        for (Map.Entry<String, String> map : list_Data) {
             String key = map.getKey();
             needList.add(key);
         }
@@ -202,25 +209,25 @@ public class RuleAllocation {
     }
 
     private void allocateDeployRule(CorrelationRule rule, String ip) throws CorrelationException {
-        try{
-            ruleMgtWrapper.deployRule2Engine(rule,ip);
+        try {
+            ruleMgtWrapper.deployRule2Engine(rule, ip);
             correlationRuleDao.updateRule(rule);
-        }catch (CorrelationException e){
+        } catch (CorrelationException e) {
             throw new CorrelationException("allocate Deploy Rule failed", e);
         }
     }
 
     private void deleteRuleFromFormerEngine(List<CorrelationRule> subRule, List<String> oldList) {
-        try{
-            for(String ip : oldList){
-                for(CorrelationRule rule: subRule) {
-                    if(ip.equals(rule.getEngineInstance())) {
-                        engineWrapper.deleteRuleFromEngine(rule.getPackageName(),ip);
+        try {
+            for (String ip : oldList) {
+                for (CorrelationRule rule : subRule) {
+                    if (ip.equals(rule.getEngineInstance())) {
+                        engineWrapper.deleteRuleFromEngine(rule.getPackageName(), ip);
                     }
                 }
             }
-        }catch (CorrelationException e) {
-            log.error("When the engine is extended, deleting rule failed" +e.getMessage());
+        } catch (CorrelationException e) {
+            log.error("When the engine is extended, deleting rule failed", e);
         }
 
     }
index 24c5f3a..696e32a 100644 (file)
 package org.onap.holmes.rulemgt.send;
 
 
+import org.easymock.EasyMock;
+import org.glassfish.hk2.api.ServiceLocator;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder;
+import org.onap.holmes.common.utils.DbDaoUtil;
+import org.onap.holmes.rulemgt.bolt.enginebolt.EngineWrapper;
+import org.onap.holmes.rulemgt.db.CorrelationRuleDao;
+import org.onap.holmes.rulemgt.msb.EngineIpList;
+import org.onap.holmes.rulemgt.wrapper.RuleMgtWrapper;
+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 java.util.ArrayList;
@@ -27,11 +41,50 @@ import java.util.List;
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.junit.Assert.assertThat;
 
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ServiceLocator.class, RuleMgtWrapper.class, RuleQueryWrapper.class, EngineWrapper.class,
+        EngineIpList.class, DbDaoUtil.class, RuleAllocation.class, ServiceLocatorHolder.class})
 public class RuleAllocationTest {
 
-    private RuleAllocation ruleAllocation = new RuleAllocation();
+    @Before
+    public void prepare() {
+
+        ServiceLocator locator = PowerMock.createMock(ServiceLocator.class);
+        RuleMgtWrapper ruleMgtWrapper = PowerMock.createMock(RuleMgtWrapper.class);
+        RuleQueryWrapper ruleQueryWrapper = PowerMock.createMock(RuleQueryWrapper.class);
+        EngineWrapper engineWrapper = PowerMock.createMock(EngineWrapper.class);
+        EngineIpList engineIpList = PowerMock.createMock(EngineIpList.class);
+        CorrelationRuleDao correlationRuleDao = PowerMock.createMock(CorrelationRuleDao.class);
+        DbDaoUtil daoUtil = PowerMock.createMock(DbDaoUtil.class);
+        PowerMock.mockStatic(ServiceLocatorHolder.class);
+
+        EasyMock.expect(ServiceLocatorHolder.getLocator()).andReturn(locator);
+        EasyMock.expect(locator.getService(RuleMgtWrapper.class)).andReturn(ruleMgtWrapper);
+        EasyMock.expect(locator.getService(RuleQueryWrapper.class)).andReturn(ruleQueryWrapper);
+        EasyMock.expect(locator.getService(EngineWrapper.class)).andReturn(engineWrapper);
+        EasyMock.expect(locator.getService(EngineIpList.class)).andReturn(engineIpList);
+        EasyMock.expect(locator.getService(DbDaoUtil.class)).andReturn(daoUtil);
+        EasyMock.expect(daoUtil.getJdbiDaoByOnDemand(CorrelationRuleDao.class)).andReturn(correlationRuleDao);
+        try {
+            EasyMock.expect(engineIpList.getServiceCount()).andReturn(new ArrayList());
+        } catch (Exception e) {
+            // Do nothing
+        }
+
+
+        PowerMock.replayAll();
+
+    }
+
+    @After
+    public void destroy() {
+        PowerMock.resetAll();
+    }
+
     @Test
     public void extendCompareIpTest() throws Exception{
+        RuleAllocation ruleAllocation = new RuleAllocation();
+
         List<String> newList = new ArrayList<>();
         newList.add("10.96.33.34");
         newList.add("10.74.65.24");
@@ -47,6 +100,8 @@ public class RuleAllocationTest {
 
     @Test
     public void destroyCompareIpTest() throws Exception{
+        RuleAllocation ruleAllocation = new RuleAllocation();
+
         List<String> newList = new ArrayList<>();
         newList.add("10.96.33.34");