def test_basic(self): control = MockControl() state = control.get_state() minimum_n = 1 maximum_n = 3 metric = 'fake' sample_function = Statistics.AVERAGE scale_up_threshold = 2.0 scale_down_threshold = 0.5 scale_up_n_vms = 1 scale_down_n_vms = 1 config = self._get_config(minimum_n, maximum_n, metric, sample_function, scale_up_threshold, scale_up_n_vms, scale_down_threshold, scale_down_n_vms, "dt1") sensor_series_up = [1, 3, 5] sensor_average_up = sum(sensor_series_up) / len(sensor_series_up) sensor_data_up = {metric: {Statistics.SERIES: sensor_series_up, Statistics.AVERAGE: sensor_average_up}} sensor_series_down = [0, 1, 0] sensor_average_down = float(sum(sensor_series_down)) / len(sensor_series_down) sensor_data_down = {metric: {Statistics.SERIES: sensor_series_down, Statistics.AVERAGE: sensor_average_down}} de = SensorEngine() de.initialize(control, state, config) de.decide(control, state) self.assertEqual(control._launch_calls, 1) state = control.get_state() control.set_instance_sensor_data(sensor_data_up) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, 2) control.set_instance_sensor_data(sensor_data_up) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, 3) # We should see this stay at 3, since we hit max_instances control.set_instance_sensor_data(sensor_data_up) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, 3) # Now, change the sensor data to scale us down control.set_instance_sensor_data(sensor_data_down) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, 3) self.assertEqual(control._destroy_calls, 1) control.set_instance_sensor_data(sensor_data_down) state = control.get_state() de.decide(control, state) self.assertEqual(control._destroy_calls, 2) # We are now at min, so we shouldn't see any more scaling control.set_instance_sensor_data(sensor_data_down) state = control.get_state() de.decide(control, state) self.assertEqual(control._destroy_calls, 2)
def test_basic_sensor(self): control = MockControl() state = MockState() minimum_vms = 4 maximum_vms = 6 metric = "something" sample_function = "Average" scale_up_threshold = 2 scale_down_threshold = 0.5 scale_up_n_vms = 1 scale_down_n_vms = 1 cooldown_period = 0 cloud = make_cloud_conf('hotel', maximum_vms, 1) conf = make_sensor_conf([cloud, ], minimum_vms, maximum_vms, metric, sample_function, scale_up_threshold, scale_up_n_vms, scale_down_threshold, scale_down_n_vms, 'testdt', 'm1.small', cooldown_period) sensor_series_up = [1, 3, 5] sensor_average_up = sum(sensor_series_up) / len(sensor_series_up) sensor_data_up = {metric: {Statistics.SERIES: sensor_series_up, Statistics.AVERAGE: sensor_average_up}} sensor_series_down = [0, 1, 0] sensor_average_down = float(sum(sensor_series_down)) / len(sensor_series_down) sensor_data_down = {metric: {Statistics.SERIES: sensor_series_down, Statistics.AVERAGE: sensor_average_down}} de = PhantomMultiSiteOverflowEngine() de.initialize(control, state, conf) # after a start, we should see the DE start the minimum number of VMs state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, minimum_vms) previous_launch_calls = control._launch_calls # Now we add some sensor data, and we should see a scale up until we get to max VMs (n=5) control.set_instance_sensor_data(sensor_data_up) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, previous_launch_calls + scale_up_n_vms) previous_launch_calls = control._launch_calls # We should see one more (n=6) control.set_instance_sensor_data(sensor_data_up) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, previous_launch_calls + scale_up_n_vms) # Now we should be at max vms, and see no more starts control.set_instance_sensor_data(sensor_data_up) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, maximum_vms) # Now we scale down with some vms die control.set_instance_sensor_data(sensor_data_down) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, maximum_vms) self.assertEqual(control._destroy_calls, 1) # and another one control.set_instance_sensor_data(sensor_data_down) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls, maximum_vms) self.assertEqual(control._destroy_calls, 2) # and we should now be at minimum vms control.set_instance_sensor_data(sensor_data_down) state = control.get_state() de.decide(control, state) self.assertEqual(control._launch_calls - control._destroy_calls, minimum_vms)