def test_scaling_action_allowed_without_min_max_specified(self): self.service_dict[ self.service_name_1].service_config_details = MagicMock() self.service_dict[ self.service_name_1].service_config_details.max_instance = 5 self.service_dict[ self.service_name_1].service_config_details.min_instance = None self.service_dict[ self.service_name_2].service_config_details = MagicMock() self.service_dict[ self.service_name_2].service_config_details.max_instance = None self.service_dict[ self.service_name_2].service_config_details.min_instance = 1 registry = RunningServicesRegistry(self.service_dict) # service2 has 3 instances initially, max is undefined scaling_action_service2 = ScalingAction(self.service_name_2) scaling_action_service2.command = DynamiteScalingCommand.SCALE_UP result = registry.scaling_action_allowed(scaling_action_service2) assert result is True scaling_action_service2.command = DynamiteScalingCommand.SCALE_DOWN result = registry.scaling_action_allowed(scaling_action_service2) assert result is True # service1 has 2 instances initially, min is undefined scaling_action_service1 = ScalingAction(self.service_name_1) scaling_action_service1.command = DynamiteScalingCommand.SCALE_DOWN result = registry.scaling_action_allowed(scaling_action_service1) assert result is True scaling_action_service1.command = DynamiteScalingCommand.SCALE_UP result = registry.scaling_action_allowed(scaling_action_service1) assert result is True
def test_scaling_action_allowed_with_unknown_service(self): with pytest.raises(ValueError): registry = RunningServicesRegistry(self.service_dict) scaling_action_service1 = ScalingAction( self.non_existing_service_name) scaling_action_service1.command = DynamiteScalingCommand.SCALE_DOWN registry.scaling_action_allowed(scaling_action_service1)
def test_remove_running_service_none_running(self): with pytest.raises(ValueError): registry = RunningServicesRegistry({}) assert registry.number_of_running_instances_of_service( self.service_name_1) == 0 assert registry.number_of_running_instances_of_service( self.service_name_2) == 0 registry.remove_running_service(self.service_name_1)
def test_scaling_action_allowed_scale_below_zero(self): self.service_dict[ self.service_name_1].service_config_details = MagicMock() self.service_dict[ self.service_name_1].service_config_details.max_instance = None self.service_dict[ self.service_name_1].service_config_details.min_instance = 2 self.service_dict[self.service_name_1].fleet_service_instances = {} registry = RunningServicesRegistry(self.service_dict) scaling_action_service1 = ScalingAction(self.service_name_1) scaling_action_service1.command = DynamiteScalingCommand.SCALE_DOWN result = registry.scaling_action_allowed(scaling_action_service1) assert result is False
def test_add_running_service(self): registry = RunningServicesRegistry({}) assert registry.number_of_running_instances_of_service( self.service_name_1) == 0 registry.add_running_service(self.service_name_1) assert registry.number_of_running_instances_of_service( self.service_name_1) == 1 registry.add_running_service(self.service_name_1) assert registry.number_of_running_instances_of_service( self.service_name_1) == 2 assert registry.number_of_running_instances_of_service( self.service_name_2) == 0 registry.add_running_service(self.service_name_2) assert registry.number_of_running_instances_of_service( self.service_name_2) == 1
def __init__(self, configuration, exit_flag): self._exit_flag = exit_flag self._logger = logging.getLogger(__name__) self._logger.info("Initialized scaling engine with configuration %s", repr(configuration)) self._services_dictionary = configuration.services_dictionary self._metrics_receiver = configuration.metrics_receiver self._metrics = ScalingMetrics() self._rule_checker = RuleChecker(configuration.scaling_policies, configuration.services_dictionary) self._executed_tasks_receiver = configuration.executed_task_receiver self._scaling_action_sender = configuration.scaling_action_sender atexit.register(self._on_engine_shutdown) self._running_services_registry = RunningServicesRegistry( configuration.services_dictionary) instance_name_resolver = ServiceInstanceNameResolver( configuration.etcd_connection) self._service_instance_name_resolver = CachingServiceInstanceNameResolver( instance_name_resolver)
def test_add_running_service_non_existing(self): registry = RunningServicesRegistry({}) registry.add_running_service(self.non_existing_service_name) assert registry.number_of_running_instances_of_service( self.non_existing_service_name) == 1
def test_initialize_from_service_dictionary(self): registry = RunningServicesRegistry(self.service_dict) assert registry.number_of_running_instances_of_service("service1") == 2 assert registry.number_of_running_instances_of_service("service2") == 3
def test_scaling_action_allowed_with_invalid_command(self): with pytest.raises(ValueError): registry = RunningServicesRegistry(self.service_dict) scaling_action_service1 = ScalingAction(self.service_name_1) scaling_action_service1.command = "scale_UP" registry.scaling_action_allowed(scaling_action_service1)