def test_setup_kube_deployments_rate_limit(): with mock.patch( "paasta_tools.setup_kubernetes_job.create_application_object", autospec=True, ) as mock_create_application_object, mock.patch( "paasta_tools.setup_kubernetes_job.list_all_deployments", autospec=True), mock.patch("paasta_tools.setup_kubernetes_job.log", autospec=True) as mock_log_obj: mock_client = mock.Mock() mock_service_instances = ["kurupt.fm", "kurupt.garage", "kurupt.radio"] fake_app = mock.Mock(create=mock.Mock()) mock_create_application_object.return_value = (True, fake_app) # Rate limit: 2 calls allowed setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", rate_limit=2, ) assert fake_app.create.call_count == 2 mock_log_obj.info.assert_any_call( "Not doing any further updates as we reached the limit (2)") # No rate limit fake_app.reset_mock() setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", rate_limit=0, ) assert fake_app.create.call_count == 3
def test_setup_kube_deployment_invalid_job_name(): with mock.patch( "paasta_tools.setup_kubernetes_job.create_application_object", autospec=True) as mock_create_application_object, mock.patch( "paasta_tools.setup_kubernetes_job.list_all_deployments", autospec=True) as mock_list_all_deployments, mock.patch( "paasta_tools.setup_kubernetes_job.log", autospec=True): mock_client = mock.Mock() mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="f_m", git_sha="", image_version=None, config_sha="", replicas=0, ) ] mock_service_instances = ["kuruptf_m"] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert mock_create_application_object.call_count == 0
def test_setup_kube_deployments_skip_malformed_apps(): with mock.patch( "paasta_tools.setup_kubernetes_job.create_application_object", autospec=True, ) as mock_create_application_object, mock.patch( "paasta_tools.setup_kubernetes_job.list_all_deployments", autospec=True), mock.patch("paasta_tools.setup_kubernetes_job.log", autospec=True) as mock_log_obj: mock_client = mock.Mock() mock_service_instances = ["fake.instance", "mock.instance"] fake_app = mock.Mock(create=mock.Mock()) fake_app.create = mock.Mock( side_effect=[Exception("Kaboom!"), mock.Mock(create=mock.Mock())]) fake_app.__str__ = mock.Mock(return_value="fake_app") mock_create_application_object.return_value = (True, fake_app) setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", rate_limit=0, ) assert fake_app.create.call_count == 2 assert len(mock_log_obj.exception.call_args_list) == 1 assert mock_log_obj.exception.call_args_list[0] == mock.call( "Error while processing: fake_app")
def test_setup_kube_deployment(): with mock.patch( 'paasta_tools.setup_kubernetes_job.reconcile_kubernetes_deployment', autospec=True, ) as mock_reconcile_kubernetes_deployment, mock.patch( 'paasta_tools.setup_kubernetes_job.list_all_deployments', autospec=True, ) as mock_list_all_deployments: mock_client = mock.Mock() mock_service_instances: Sequence[str] = [] assert setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir='/nail/blah', ) is True mock_reconcile_kubernetes_deployment.return_value = (0, 0) mock_service_instances = ['kurupt.fm', 'kurupt.garage'] assert setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir='/nail/blah', ) is True mock_reconcile_kubernetes_deployment.assert_has_calls([ mock.call( kube_client=mock_client, service='kurupt', instance='fm', kube_deployments=mock_list_all_deployments.return_value, soa_dir='/nail/blah', ), mock.call( kube_client=mock_client, service='kurupt', instance='garage', kube_deployments=mock_list_all_deployments.return_value, soa_dir='/nail/blah', ), ]) mock_reconcile_kubernetes_deployment.return_value = (1, 0) assert setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir='/nail/blah', ) is False
def test_setup_kube_deployment_create_update(): fake_create = mock.MagicMock() fake_update = mock.MagicMock() fake_update_related_api_objects = mock.MagicMock() def simple_create_application_object( kube_client, service, instance, cluster, soa_dir ): fake_app = mock.MagicMock(spec=Application) fake_app.kube_deployment = KubeDeployment( service=service, instance=instance, git_sha="1", config_sha="1", replicas=1 ) fake_app.create = fake_create fake_app.update = fake_update fake_app.update_related_api_objects = fake_update_related_api_objects fake_app.item = None fake_app.soa_config = None fake_app.__str__ = lambda app: "fake_app" return True, fake_app with mock.patch( "paasta_tools.setup_kubernetes_job.create_application_object", autospec=True, side_effect=simple_create_application_object, ) as mock_create_application_object, mock.patch( "paasta_tools.setup_kubernetes_job.list_all_deployments", autospec=True ) as mock_list_all_deployments, mock.patch( "paasta_tools.setup_kubernetes_job.log", autospec=True ) as mock_log_obj: mock_client = mock.Mock() # No instances created mock_service_instances: Sequence[str] = [] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert mock_create_application_object.call_count == 0 mock_log_obj.info.assert_called_once_with('{"service_instance_updated": []}') mock_log_obj.info.reset_mock() # Create a new instance mock_service_instances = ["kurupt.fm"] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_create.call_count == 1 assert fake_update.call_count == 0 mock_log_obj.info.assert_called_with( '{"service_instance_updated": ["fake_app"]}' ) mock_log_obj.info.reset_mock() # Update when gitsha changed fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="fm", git_sha="2", config_sha="1", replicas=1 ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 mock_log_obj.info.assert_called_with( '{"service_instance_updated": ["fake_app"]}' ) mock_log_obj.info.reset_mock() # Update when configsha changed fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="fm", git_sha="1", config_sha="2", replicas=1 ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 mock_log_obj.info.assert_called_with( '{"service_instance_updated": ["fake_app"]}' ) mock_log_obj.info.reset_mock() # Update when replica changed fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="fm", git_sha="1", config_sha="1", replicas=2 ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 mock_log_obj.info.assert_called_with( '{"service_instance_updated": ["fake_app"]}' ) mock_log_obj.info.reset_mock() # Update one and Create One fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm", "kurupt.garage"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="garage", git_sha="2", config_sha="2", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 1 mock_log_obj.info.assert_called_with( '{"service_instance_updated": ["fake_app", "fake_app"]}' ) mock_log_obj.info.reset_mock() # Always attempt to update related API objects fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.garage"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="garage", git_sha="1", config_sha="1", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 0 assert fake_create.call_count == 0 assert fake_update_related_api_objects.call_count == 1 mock_log_obj.info.assert_called_with( '{"service_instance_updated": ["fake_app"]}' )
def test_setup_kube_deployment_create_update(): fake_create = mock.MagicMock() fake_update = mock.MagicMock() def simple_create_application_object(kube_client, service, instance, soa_dir): fake_app = mock.MagicMock(spec=Application) fake_app.kube_deployment = KubeDeployment(service=service, instance=instance, git_sha="1", config_sha="1", replicas=1) fake_app.create = fake_create fake_app.update = fake_update return True, fake_app with mock.patch( "paasta_tools.setup_kubernetes_job.create_application_object", autospec=True, side_effect=simple_create_application_object, ) as mock_create_application_object, mock.patch( "paasta_tools.setup_kubernetes_job.list_all_deployments", autospec=True) as mock_list_all_deployments: mock_client = mock.Mock() # No instances created mock_service_instances: Sequence[str] = [] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir="/nail/blah", ) assert mock_create_application_object.call_count == 0 # Create a new instance mock_service_instances = ["kurupt.fm"] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir="/nail/blah", ) assert fake_create.call_count == 1 assert fake_update.call_count == 0 # Update when gitsha changed fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment(service="kurupt", instance="fm", git_sha="2", config_sha="1", replicas=1) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 # Update when configsha changed fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment(service="kurupt", instance="fm", git_sha="1", config_sha="2", replicas=1) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 # Update when replica changed fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment(service="kurupt", instance="fm", git_sha="1", config_sha="1", replicas=2) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 # Update one and Create One fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.fm", "kurupt.garage"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="garage", git_sha="2", config_sha="2", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 1 # not create existing instances fake_create.reset_mock() fake_update.reset_mock() mock_service_instances = ["kurupt.garage"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="garage", git_sha="1", config_sha="1", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, soa_dir="/nail/blah", ) assert fake_update.call_count == 0 assert fake_create.call_count == 0
def test_setup_kube_deployment_create_update(): fake_create = mock.MagicMock() fake_update = mock.MagicMock() fake_update_related_api_objects = mock.MagicMock() def simple_create_application_object(kube_client, service, instance, cluster, soa_dir): fake_app = mock.MagicMock(spec=Application) fake_app.kube_deployment = KubeDeployment( service=service, instance=instance, git_sha="1", image_version="extrastuff-1", config_sha="1", replicas=1, ) fake_app.create = fake_create fake_app.update = fake_update fake_app.update_related_api_objects = fake_update_related_api_objects fake_app.item = None fake_app.soa_config = None fake_app.__str__ = lambda app: "fake_app" return True, fake_app with mock.patch( "paasta_tools.setup_kubernetes_job.create_application_object", autospec=True, side_effect=simple_create_application_object, ) as mock_create_application_object, mock.patch( "paasta_tools.setup_kubernetes_job.list_all_deployments", autospec=True) as mock_list_all_deployments, mock.patch( "paasta_tools.setup_kubernetes_job.log", autospec=True) as mock_log_obj, mock.patch( "paasta_tools.setup_kubernetes_job.metrics_lib.NoMetrics", autospec=True) as mock_no_metrics: mock_client = mock.Mock() # No instances created mock_service_instances: Sequence[str] = [] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert mock_create_application_object.call_count == 0 assert fake_update.call_count == 0 assert fake_update_related_api_objects.call_count == 0 assert mock_log_obj.info.call_count == 0 mock_log_obj.info.reset_mock() # Create a new instance mock_service_instances = ["kurupt.fm"] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", metrics_interface=mock_no_metrics, ) assert fake_create.call_count == 1 assert fake_update.call_count == 0 assert fake_update_related_api_objects.call_count == 1 assert mock_no_metrics.emit_event.call_count == 1 mock_log_obj.info.reset_mock() mock_no_metrics.reset_mock() # Update when gitsha changed fake_create.reset_mock() fake_update.reset_mock() fake_update_related_api_objects.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="fm", git_sha="2", image_version="extrastuff-1", config_sha="1", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", metrics_interface=mock_no_metrics, ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 assert fake_update_related_api_objects.call_count == 1 mock_no_metrics.emit_event.assert_called_with( name="deploy", dimensions={ "paasta_cluster": "fake_cluster", "paasta_service": "kurupt", "paasta_instance": "fm", "deploy_event": "update", }, ) mock_log_obj.info.reset_mock() mock_no_metrics.reset_mock() # Update when image_version changed fake_create.reset_mock() fake_update.reset_mock() fake_update_related_api_objects.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="fm", git_sha="1", image_version="extrastuff-2", config_sha="1", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 assert fake_update_related_api_objects.call_count == 1 mock_log_obj.info.reset_mock() # Update when configsha changed fake_create.reset_mock() fake_update.reset_mock() fake_update_related_api_objects.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="fm", git_sha="1", image_version="extrastuff-1", config_sha="2", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 assert fake_update_related_api_objects.call_count == 1 mock_log_obj.info.reset_mock() # Update when replica changed fake_create.reset_mock() fake_update.reset_mock() fake_update_related_api_objects.reset_mock() mock_service_instances = ["kurupt.fm"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="fm", git_sha="1", image_version="extrastuff-1", config_sha="1", replicas=2, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 0 assert fake_update_related_api_objects.call_count == 1 mock_log_obj.info.reset_mock() # Update one and Create One fake_create.reset_mock() fake_update.reset_mock() fake_update_related_api_objects.reset_mock() mock_service_instances = ["kurupt.fm", "kurupt.garage"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="garage", git_sha="2", image_version="extrastuff-1", config_sha="2", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 1 assert fake_create.call_count == 1 assert fake_update_related_api_objects.call_count == 2 mock_log_obj.info.reset_mock() # Always attempt to update related API objects fake_create.reset_mock() fake_update.reset_mock() fake_update_related_api_objects.reset_mock() mock_service_instances = ["kurupt.garage"] mock_list_all_deployments.return_value = [ KubeDeployment( service="kurupt", instance="garage", git_sha="1", image_version="extrastuff-1", config_sha="1", replicas=1, ) ] setup_kube_deployments( kube_client=mock_client, service_instances=mock_service_instances, cluster="fake_cluster", soa_dir="/nail/blah", ) assert fake_update.call_count == 0 assert fake_create.call_count == 0 assert fake_update_related_api_objects.call_count == 1 assert mock_log_obj.info.call_args_list[0] == mock.call( "fake_app is up-to-date!")