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 <[email protected]> Authored: Mon Dec 16 12:44:41 2013 +0530 Committer: Nirmal Fernando <[email protected]> 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
