You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2013/12/16 08:15:01 UTC

git commit: adding a new test case to test the obsoleted member rule and refactoring test delegator

Updated Branches:
  refs/heads/master 4fce32bdd -> 8bac94f3f


adding a new test case to test the obsoleted member rule and refactoring test delegator


Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/8bac94f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/8bac94f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/8bac94f3

Branch: refs/heads/master
Commit: 8bac94f3f774ea68fd3d742bf9d991b28ecdf06f
Parents: 4fce32b
Author: Nirmal Fernando <ni...@apache.org>
Authored: Mon Dec 16 12:44:41 2013 +0530
Committer: Nirmal Fernando <ni...@apache.org>
Committed: Mon Dec 16 12:44:41 2013 +0530

----------------------------------------------------------------------
 .../stratos/autoscaler/TestDelegator.java       |  26 ++-
 .../stratos/autoscaler/TestKnowledgeBase.java   |  95 -----------
 .../stratos/autoscaler/TestMinimumRule.java     |  95 +++++++++++
 .../autoscaler/TestObsoletedMemberRule.java     | 168 +++++++++++++++++++
 .../resources/test-minimum-autoscaler-rule.drl  |   4 +-
 .../test-terminating-obsoleted-members-rule.drl |  63 +++++++
 6 files changed, 349 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8bac94f3/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestDelegator.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestDelegator.java
index 5d09e82..2a164de 100644
--- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestDelegator.java
@@ -19,20 +19,36 @@
 
 package org.apache.stratos.autoscaler;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Helper class to keep the state of the consequence of a rule.
  * @author nirmal
  *
  */
 public class TestDelegator {
-    private static boolean isDelegated;
+    private static boolean isMinRuleFired;
+    private static List<String> obsoletedMembers = new ArrayList<String>();
+
+    public static boolean isMinRuleFired() {
+        return isMinRuleFired;
+    }
 
-    public static boolean isDelegated() {
-        return isDelegated;
+    public static void setMinRuleFired(boolean isMinRuleFired) {
+        TestDelegator.isMinRuleFired = isMinRuleFired;
     }
 
-    public static void setDelegated(boolean isDelegated) {
-        TestDelegator.isDelegated = isDelegated;
+    public static List<String> getObsoletedMembers() {
+        return obsoletedMembers;
+    }
+
+    public static void setObsoletedMembers(List<String> obsoletedMembers) {
+        TestDelegator.obsoletedMembers = obsoletedMembers;
+    }
+    
+    public static void addObsoleteMember(String memberId) {
+        TestDelegator.obsoletedMembers.add(memberId);
     }
 
     

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8bac94f3/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java
deleted file mode 100644
index 5c4f959..0000000
--- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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
- *
- * 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.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.stratos.autoscaler;
-
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.cloud.controller.pojo.MemberContext;
-import org.drools.KnowledgeBase;
-import org.drools.KnowledgeBaseFactory;
-import org.drools.builder.*;
-import org.drools.io.Resource;
-import org.drools.io.ResourceFactory;
-import org.drools.runtime.StatefulKnowledgeSession;
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestKnowledgeBase {
-    private static final Log log = LogFactory.getLog(TestKnowledgeBase.class);
-    private String droolsFilePath = "src/test/resources/test-minimum-autoscaler-rule.drl";
-    private KnowledgeBase kbase;
-    private StatefulKnowledgeSession ksession;
-
-    @Before
-    public void setUp() {
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        Resource resource = ResourceFactory.newFileResource(droolsFilePath);
-        kbuilder.add(resource, ResourceType.DRL);
-        KnowledgeBuilderErrors errors = kbuilder.getErrors();
-        if (errors.size() > 0) {
-            StringBuilder sb = new StringBuilder();
-            for (KnowledgeBuilderError error : errors) {
-                sb.append(error.getMessage());
-            }
-            if(sb.length() > 0) {
-                log.error(sb.toString());
-            }
-            throw new IllegalArgumentException(String.format("Could not parse drools file: %s", droolsFilePath));
-        }
-        
-        kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
-    }
-    
-    @Test
-    public void testMinimumRule() {
-        if(kbase == null) {
-            throw new IllegalArgumentException("Knowledge base is null.");
-        }
-        
-        assertEquals(false, TestDelegator.isDelegated());
-        
-        ksession = kbase.newStatefulKnowledgeSession();
-        ksession.setGlobal("clusterId", "lb.cluster.1");
-        ksession.setGlobal("lbRef", null);
-        PartitionContext p = new PartitionContext();
-        p.setPendingMembers(new ArrayList<MemberContext>());
-        p.setMinimumMemberCount(1);
-        ksession.insert(p);
-        ksession.fireAllRules();
-
-        try {
-            Thread.sleep(3000);
-        } catch (InterruptedException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-        
-        assertEquals(true, TestDelegator.isDelegated());
-        
-    }
-    
-    public static String get() {
-        return "null";
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8bac94f3/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java
new file mode 100644
index 0000000..79249e4
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ *
+ * 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.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.autoscaler;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.pojo.MemberContext;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.*;
+import org.drools.io.Resource;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestMinimumRule {
+    private static final Log log = LogFactory.getLog(TestMinimumRule.class);
+    private String droolsFilePath = "src/test/resources/test-minimum-autoscaler-rule.drl";
+    private KnowledgeBase kbase;
+    private StatefulKnowledgeSession ksession;
+
+    @Before
+    public void setUp() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        Resource resource = ResourceFactory.newFileResource(droolsFilePath);
+        kbuilder.add(resource, ResourceType.DRL);
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if (errors.size() > 0) {
+            StringBuilder sb = new StringBuilder();
+            for (KnowledgeBuilderError error : errors) {
+                sb.append(error.getMessage());
+            }
+            if(sb.length() > 0) {
+                log.error(sb.toString());
+            }
+            throw new IllegalArgumentException(String.format("Could not parse drools file: %s", droolsFilePath));
+        }
+        
+        kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+    }
+    
+    @Test
+    public void testMinimumRule() {
+        if(kbase == null) {
+            throw new IllegalArgumentException("Knowledge base is null.");
+        }
+        
+        assertEquals(false, TestDelegator.isMinRuleFired());
+        
+        ksession = kbase.newStatefulKnowledgeSession();
+        ksession.setGlobal("clusterId", "lb.cluster.1");
+        ksession.setGlobal("lbRef", null);
+        PartitionContext p = new PartitionContext();
+        p.setPendingMembers(new ArrayList<MemberContext>());
+        p.setMinimumMemberCount(1);
+        ksession.insert(p);
+        ksession.fireAllRules();
+
+        try {
+            Thread.sleep(3000);
+        } catch (InterruptedException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        assertEquals(true, TestDelegator.isMinRuleFired());
+        
+    }
+    
+    public static String get() {
+        return "null";
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8bac94f3/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java
new file mode 100644
index 0000000..f888d9f
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ *
+ * 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.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.autoscaler;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.*;
+import org.drools.io.Resource;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.FactHandle;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestObsoletedMemberRule {
+    private static final Log log = LogFactory.getLog(TestObsoletedMemberRule.class);
+    private String droolsFilePath = "src/test/resources/test-terminating-obsoleted-members-rule.drl";
+    private KnowledgeBase kbase;
+    private StatefulKnowledgeSession ksession;
+
+    @Before
+    public void setUp() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        Resource resource = ResourceFactory.newFileResource(droolsFilePath);
+        kbuilder.add(resource, ResourceType.DRL);
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if (errors.size() > 0) {
+            StringBuilder sb = new StringBuilder();
+            for (KnowledgeBuilderError error : errors) {
+                sb.append(error.getMessage());
+            }
+            if(sb.length() > 0) {
+                log.error(sb.toString());
+            }
+            throw new IllegalArgumentException(String.format("Could not parse drools file: %s", droolsFilePath));
+        }
+        
+        kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+        log.info("Knowledge base has been set up.");
+    }
+    
+    @Test
+    public void testOneObsoletedMemberCase() {
+        
+        // reset helper class
+        TestDelegator.setObsoletedMembers(new ArrayList<String>());
+        
+        if(kbase == null) {
+            throw new IllegalArgumentException("Knowledge base is null.");
+        }
+        
+        assertEquals(false, TestDelegator.isMinRuleFired());
+        
+        ksession = kbase.newStatefulKnowledgeSession();
+        PartitionContext p = new PartitionContext();
+        p.setObsoletedMembers(new CopyOnWriteArrayList<String>());
+        String memberId = "member1";
+        p.addObsoleteMember(memberId);
+        ksession.insert(p);
+        ksession.fireAllRules();
+
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        assertEquals(1, TestDelegator.getObsoletedMembers().size());
+        assertEquals(memberId, TestDelegator.getObsoletedMembers().get(0));
+        
+    }
+    
+    @Test
+    public void testMoreThanOneObsoletedMemberCase() {
+        
+        // reset helper class
+        TestDelegator.setObsoletedMembers(new ArrayList<String>());
+        
+        if(kbase == null) {
+            throw new IllegalArgumentException("Knowledge base is null.");
+        }
+        
+        assertEquals(false, TestDelegator.isMinRuleFired());
+        
+        ksession = kbase.newStatefulKnowledgeSession();
+        PartitionContext p = new PartitionContext();
+        p.setObsoletedMembers(new CopyOnWriteArrayList<String>());
+        String memberId1 = "member1";
+        String memberId2 = "member2";
+        String memberId3 = "member3";
+        
+        p.addObsoleteMember(memberId1);
+        p.addObsoleteMember(memberId2);
+        
+        FactHandle handle = ksession.insert(p);
+        ksession.fireAllRules();
+
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        assertEquals(2, TestDelegator.getObsoletedMembers().size());
+        
+        assertEquals(0, p.getObsoletedMembers().size());
+        
+        assertNotEquals(TestDelegator.getObsoletedMembers().get(0), TestDelegator.getObsoletedMembers().get(1));
+        
+        boolean check0thPosition = memberId1.equals(TestDelegator.getObsoletedMembers().get(0)) ||
+                memberId2.equals(TestDelegator.getObsoletedMembers().get(0));
+        assertEquals(true, check0thPosition);
+        
+        boolean check1stPosition = memberId1.equals(TestDelegator.getObsoletedMembers().get(1)) ||
+                memberId2.equals(TestDelegator.getObsoletedMembers().get(2));
+        assertEquals(true, check1stPosition);
+        
+        // reset helper class
+        TestDelegator.setObsoletedMembers(new ArrayList<String>());
+        
+        p.addObsoleteMember(memberId3);
+        ksession.update(handle, p);
+        ksession.fireAllRules();
+        
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        assertEquals(1, TestDelegator.getObsoletedMembers().size());
+        assertEquals(memberId3, TestDelegator.getObsoletedMembers().get(0));
+        
+        
+    }
+    
+    public static String get() {
+        return "null";
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8bac94f3/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl b/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
index faaf142..86c354a 100644
--- a/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
+++ b/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
@@ -49,7 +49,7 @@ global java.util.Map partitionCtxts;
 global java.lang.String clusterId;
 global java.lang.String lbRef;
 
-import function org.apache.stratos.autoscaler.TestDelegator.setDelegated;
+import function org.apache.stratos.autoscaler.TestDelegator.setMinRuleFired;
 
 rule "Minimum Rule"
 dialect "mvel"
@@ -58,6 +58,6 @@ dialect "mvel"
 	       eval($ctxt.getCurrentMemberCount() < $ctxt.getMinimumMemberCount())
 
        then
-	       setDelegated(true);
+	       setMinRuleFired(true);
 	       
 end

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8bac94f3/components/org.apache.stratos.autoscaler/src/test/resources/test-terminating-obsoleted-members-rule.drl
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/resources/test-terminating-obsoleted-members-rule.drl b/components/org.apache.stratos.autoscaler/src/test/resources/test-terminating-obsoleted-members-rule.drl
new file mode 100644
index 0000000..3468408
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/test/resources/test-terminating-obsoleted-members-rule.drl
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ *
+ * 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.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.autoscaler.rule;
+
+import org.apache.stratos.messaging.domain.topology.Service;
+import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.autoscaler.AutoscalerContext;
+import org.apache.stratos.autoscaler.Constants;
+import org.apache.stratos.autoscaler.policy.PolicyManager;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
+import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
+import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
+import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm;
+import org.apache.stratos.autoscaler.algorithm.OneAfterAnother;
+import org.apache.stratos.autoscaler.algorithm.RoundRobin;
+import org.apache.stratos.autoscaler.PartitionContext;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
+import org.apache.commons.logging.Log;
+import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.pojo.MemberContext;
+
+
+global org.apache.stratos.autoscaler.policy.PolicyManager $manager;
+global org.apache.stratos.autoscaler.AutoscalerContext $context; 
+global org.apache.commons.logging.Log log;
+global org.apache.stratos.messaging.domain.topology.Topology $topology;
+global java.util.Map partitionCtxts;
+global java.lang.String clusterId;
+global java.lang.String lbRef;
+
+import function org.apache.stratos.autoscaler.TestDelegator.addObsoleteMember;
+
+rule "Terminate Obsoleted Instances"
+dialect "mvel"
+        when
+            $ctxt : PartitionContext ()
+            eval($ctxt.getObsoletedMembers().size() > 0)
+            memberId : String() from $ctxt.getObsoletedMembers()
+            eval($ctxt.removeObsoleteMember(memberId))
+        then
+            addObsoleteMember(memberId);
+end