/******************************************************************************* * Copyright (c) 2014 Imperial College London * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Raul Castro Fernandez - initial API and implementation ******************************************************************************/ package uk.ac.imperial.lsds.seep.infrastructure.monitor.policy; import java.util.Iterator; import org.junit.After; import org.junit.AfterClass; import static org.junit.Assert.*; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.action.ScaleInAction; import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.action.ScaleOutAction; import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricName; import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricName.*; import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricValue.*; import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.operator.OneOperator; import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.operator.Operator.*; import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.scale.constraint.AbsoluteScaleConstraint; import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.scale.constraint.ScaleConstraint.*; import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.scale.factor.RelativeScaleFactor; import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.scale.factor.ScaleFactor.*; import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.threshold.MetricThreshold.*; import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.threshold.TimeThreshold.*; import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.trigger.ActionTrigger; /** * * @author mrouaux */ public class PolicyRulesTest { public PolicyRulesTest() { } @BeforeClass public static void setUpClass() { } @AfterClass public static void tearDownClass() { } @Before public void setUp() { } @After public void tearDown() { } @Test public void testCreatePolicyWithOneRule() { PolicyRules rules = new PolicyRules() {{ rule("CPU above 60% for 30 seconds") .scaleOut(operator("test-operator", 1)) .by(relative(2)).butNeverAbove(nodes(10)) .when(metric("cpu")) .is(above(percent(60))) .forAtLeast(seconds(30)).build(); }}; PolicyRule rule = rules.iterator().next(); assertNotNull("Operator should not be null", rule.getOperator()); assertTrue("Operator is of incorrect type", rule.getOperator() instanceof OneOperator); assertEquals("Operator name is incorrect", "test-operator", ((OneOperator)rule.getOperator()).getName()); assertEquals("Operator identifier is incorrect", 1, ((OneOperator)rule.getOperator()).getId()); assertEquals("Name does not match expectations", "CPU above 60% for 30 seconds", rule.getName()); assertTrue("Action is not of expected type", rule.getAction() instanceof ScaleOutAction); assertTrue("Scale factor is not of expected type", rule.getScaleFactor() instanceof RelativeScaleFactor); assertEquals("Scale factor does not match expectation", Double.valueOf(2), Double.valueOf(rule.getScaleFactor().getFactor())); assertTrue("Scale constraint is not of expected type", rule.getScaleConstraint() instanceof AbsoluteScaleConstraint); assertEquals("Scale constraint does not match expectation", Double.valueOf(10), Double.valueOf(rule.getScaleConstraint().getValue())); ActionTrigger expectedTrigger = new ActionTrigger(above(percent(60)), seconds(30), MetricName.CPU_UTILIZATION); assertEquals("Trigger[0] do not match expectations", expectedTrigger, rule.getTriggers().get(0)); } @Test public void testCreatePolicyWithMultipleRule() { ActionTrigger expectedTrigger; PolicyRules rules = new PolicyRules() {{ rule("CPU above 60% for 30 seconds") .scaleOut(new OneOperator()) .by(relative(2)).butNeverAbove(nodes(10)) .when(metric("cpu")) .is(above(percent(60))) .forAtLeast(seconds(30)).build(); rule("Operator latency below 500ms for 2 minutes") .scaleIn(new OneOperator()) .by(relative(0.5)).butNeverBelow(nodes(1)) .when(metric("latency")) .is(below(millis(500))) .forAtLeast(minutes(2)).build(); }}; // Check assertions on first rule Iterator<PolicyRule> it = rules.iterator(); PolicyRule rule1 = it.next(); assertEquals("Rule 1: name does not match expectations", "CPU above 60% for 30 seconds", rule1.getName()); assertTrue("Rule 1: action is not of expected type", rule1.getAction() instanceof ScaleOutAction); assertTrue("Rule 1: scale factor is not of expected type", rule1.getScaleFactor() instanceof RelativeScaleFactor); assertEquals("Rule 1: scale factor does not match expectation", Double.valueOf(2), Double.valueOf(rule1.getScaleFactor().getFactor())); assertTrue("Rule 1: scale constraint is not of expected type", rule1.getScaleConstraint() instanceof AbsoluteScaleConstraint); assertEquals("Rule 1: scale constraint does not match expectation", Double.valueOf(10), Double.valueOf(rule1.getScaleConstraint().getValue())); expectedTrigger = new ActionTrigger(above(percent(60)), seconds(30), MetricName.CPU_UTILIZATION); assertEquals("Rule 1: trigger[0] do not match expectations", expectedTrigger, rule1.getTriggers().get(0)); // Check assertions on second rule PolicyRule rule2 = it.next(); assertEquals("Rule 2: name does not match expectations", "Operator latency below 500ms for 2 minutes", rule2.getName()); assertTrue("Rule 2: action is not of expected type", rule2.getAction() instanceof ScaleInAction); assertTrue("Rule 2: scale factor is not of expected type", rule2.getScaleFactor() instanceof RelativeScaleFactor); assertEquals("Rule 2: scale factor does not match expectation", Double.valueOf(0.5), Double.valueOf(rule2.getScaleFactor().getFactor())); assertTrue("Rule 2: scale constraint is not of expected type", rule2.getScaleConstraint() instanceof AbsoluteScaleConstraint); assertEquals("Rule 2: scale constraint does not match expectation", Double.valueOf(1), Double.valueOf(rule2.getScaleConstraint().getValue())); expectedTrigger = new ActionTrigger(below(millis(500)), minutes(2), MetricName.OPERATOR_LATENCY); assertEquals("Rule 2: trigger[0] do not match expectations", expectedTrigger, rule2.getTriggers().get(0)); } }