def test_to_json_string(self): scaling_response = DynamiteScalingResponse() scaling_response.command = DynamiteScalingCommand.SCALE_DOWN scaling_response.failure_counter = 4 scaling_response.service_instance_name = "apache_service_instance_name" scaling_response.service_name = "apache_service_name" scaling_response.success = False scaling_response.message_processed_callback = lambda: None result_json = scaling_response.to_json_string() result_response = DynamiteScalingResponse.from_json_string( result_json, scaling_response.message_processed_callback) assert result_response == scaling_response
def test_to_json_string(self): scaling_response = DynamiteScalingResponse() scaling_response.command = DynamiteScalingCommand.SCALE_DOWN scaling_response.failure_counter = 4 scaling_response.service_instance_name = "apache_service_instance_name" scaling_response.service_name = "apache_service_name" scaling_response.success = False scaling_response.message_processed_callback = lambda: None result_json = scaling_response.to_json_string() result_response = DynamiteScalingResponse.from_json_string(result_json, scaling_response.message_processed_callback) assert result_response == scaling_response
def test_message_processed_with_callback(self): callback = Mock() scaling_response = DynamiteScalingResponse.from_json_string( self.test_json, message_processed_callback=callback) scaling_response.message_processed() callback.assert_called_once_with()
def test_from_json_string(self): scaling_response = DynamiteScalingResponse.from_json_string(self.test_json) assert scaling_response.command == DynamiteScalingCommand.SCALE_DOWN assert scaling_response.service_instance_name == "apache_service_instance_name" assert scaling_response.service_name == "apache_service_name" assert scaling_response.failure_counter == 4 assert scaling_response.success is True
def _process_received_request(self, scaling_request, fail_count=0): scaling_success = False created_service_instance = None self._logger.info("Received request: %s", scaling_request) try: if scaling_request.command == DynamiteScalingCommand.SCALE_UP: service_name = scaling_request.service_name created_service_instance = self._dynamite_service_handler.add_new_fleet_service_instance(service_name) elif scaling_request.command == DynamiteScalingCommand.SCALE_DOWN: service_name = scaling_request.service_name service_instance_name = scaling_request.service_instance_name self._dynamite_service_handler.remove_fleet_service_instance(service_name, service_instance_name) scaling_success = True except FleetSubmissionError as fse: self._logger.error("Submitting fleet file failed!") raise FleetSubmissionError("Submission error on unit: {}" + service_name) from fse except FleetStartError as fse: self._logger.error("Starting fleet service failed!") if created_service_instance is not None: self._unload_unit(created_service_instance) raise FleetStartError ("Unit start error on unit: {}" + service_name) from fse except FleetDestroyError as fde: self._logger.error("Destroying fleet service failed!") raise FleetDestroyError ("Failed destroying unit: {}" + service_name) from fde except FleetCommunicationError as fce: self._logger.error("Communication with fleet failed!") raise FleetCommunicationError("Fleet communication error working on unit: {}" + service_name) from fce except: self._logger.exception("Unexpected error") scaling_response = DynamiteScalingResponse.from_scaling_request(scaling_request, scaling_success) self._scaling_response_sender.send_response(scaling_response) scaling_response.message_processed()
def test_from_json_string(self): scaling_response = DynamiteScalingResponse.from_json_string( self.test_json) assert scaling_response.command == DynamiteScalingCommand.SCALE_DOWN assert scaling_response.service_instance_name == "apache_service_instance_name" assert scaling_response.service_name == "apache_service_name" assert scaling_response.failure_counter == 4 assert scaling_response.success is True
def test_from_scaling_request(self): scaling_request = DynamiteScalingRequest() scaling_request.command = DynamiteScalingCommand.SCALE_DOWN scaling_request.failure_counter = 4 scaling_request.service_instance_name = "apache_service_instance_name" scaling_request.service_name = "apache_service_name" scaling_response = DynamiteScalingResponse.from_scaling_request(scaling_request, True) assert scaling_response.command == scaling_request.command assert scaling_response.service_instance_name == scaling_request.service_instance_name assert scaling_response.service_name == scaling_request.service_name assert scaling_response.failure_counter == scaling_request.failure_counter assert scaling_response.success is True
def test_from_scaling_request(self): scaling_request = DynamiteScalingRequest() scaling_request.command = DynamiteScalingCommand.SCALE_DOWN scaling_request.failure_counter = 4 scaling_request.service_instance_name = "apache_service_instance_name" scaling_request.service_name = "apache_service_name" scaling_response = DynamiteScalingResponse.from_scaling_request( scaling_request, True) assert scaling_response.command == scaling_request.command assert scaling_response.service_instance_name == scaling_request.service_instance_name assert scaling_response.service_name == scaling_request.service_name assert scaling_response.failure_counter == scaling_request.failure_counter assert scaling_response.success is True
def receive(self): messages = () if self._process_queue.empty(): return messages received_scaling_response_string = self._process_queue.get() scaling_response = DynamiteScalingResponse.from_json_string( received_scaling_response_string, message_processed_callback=lambda: None) self._logger.info("Received scaling response %s", repr(scaling_response)) messages = (scaling_response, ) return messages + self.receive()
def receive(self): messages = () if self._process_queue.empty(): return messages received_scaling_response_string = self._process_queue.get() scaling_response = DynamiteScalingResponse.from_json_string( received_scaling_response_string, message_processed_callback=lambda: None ) self._logger.info("Received scaling response %s", repr(scaling_response)) messages = (scaling_response,) return messages + self.receive()
def receive(self): messages = () method_frame, header_frame, message_body = self._queue_channel.basic_get(queue=self._queue_name, no_ack=False) if self._no_message_delivered(method_frame, header_frame): self._logger.debug("Received no message from executor response queue") return messages received_scaling_response_string = message_body.decode("utf-8") message_processed_callback = lambda: self._on_message_processed(method_frame.delivery_tag) scaling_response = DynamiteScalingResponse.from_json_string( received_scaling_response_string, message_processed_callback=message_processed_callback ) self._logger.info("Received scaling response %s", repr(scaling_response)) messages = (scaling_response,) return messages + self.receive()
def receive(self): messages = () method_frame, header_frame, message_body = self._queue_channel.basic_get( queue=self._queue_name, no_ack=False) if self._no_message_delivered(method_frame, header_frame): self._logger.debug( "Received no message from executor response queue") return messages received_scaling_response_string = message_body.decode("utf-8") message_processed_callback = lambda: self._on_message_processed( method_frame.delivery_tag) scaling_response = DynamiteScalingResponse.from_json_string( received_scaling_response_string, message_processed_callback=message_processed_callback) self._logger.info("Received scaling response %s", repr(scaling_response)) messages = (scaling_response, ) return messages + self.receive()
def _process_received_request(self, scaling_request, fail_count=0): scaling_success = False created_service_instance = None try: if scaling_request.command == DynamiteScalingCommand.SCALE_UP: service_name = scaling_request.service_name created_service_instance = self._dynamite_service_handler.add_new_fleet_service_instance(service_name) elif scaling_request.command == DynamiteScalingCommand.SCALE_DOWN: service_name = scaling_request.service_name service_instance_name = scaling_request.service_instance_name self._dynamite_service_handler.remove_fleet_service_instance(service_name, service_instance_name) scaling_success = True except FleetSubmissionError: self._logger.exception("Submitting fleet file failed!") retry_success = self._retry_processing_request(scaling_request, fail_count) if retry_success: return except FleetStartError: self._logger.exception("Starting fleet service failed!") if created_service_instance is not None: self._unload_unit(created_service_instance) retry_success = self._retry_processing_request(scaling_request, fail_count) if retry_success: return except FleetDestroyError: self._logger.exception("Destroying fleet service failed!") retry_success = self._retry_processing_request(scaling_request, fail_count) if retry_success: return except FleetCommunicationError: self._logger.exception("Communication with fleet failed!") scaling_response = DynamiteScalingResponse.from_scaling_request(scaling_request, scaling_success) self._scaling_response_sender.send_response(scaling_response) scaling_response.message_processed()
def test_message_processed_without_callback(self): scaling_response = DynamiteScalingResponse.from_json_string( self.test_json) scaling_response.message_processed()
def test_message_processed_with_callback(self): callback = Mock() scaling_response = DynamiteScalingResponse.from_json_string(self.test_json, message_processed_callback=callback) scaling_response.message_processed() callback.assert_called_once_with()
def test_message_processed_without_callback(self): scaling_response = DynamiteScalingResponse.from_json_string(self.test_json) scaling_response.message_processed()
def create_content(self): content = [] response = DynamiteScalingResponse() response.command = DynamiteScalingCommand.SCALE_DOWN response.failure_counter = 2 response.service_instance_name = "apache_service_instance_name" response.service_name = "apache_service_name" response.success = True content.append(response) response = DynamiteScalingResponse() response.command = DynamiteScalingCommand.SCALE_UP response.failure_counter = 0 response.service_instance_name = "apache_service_instance_name" response.service_name = "apache_service_name" response.success = False content.append(response) return content