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