def test_add_duplicate(self): request_1 = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies(), )) request_2 = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies(), )) self.mock_get_current_backend() response_1 = jsonish_dict_to_rpc( self.call_api('add_machine', request_1).json, rpc_messages.CatalogManipulationResponse, ) response_2 = jsonish_dict_to_rpc( self.call_api('add_machine', request_2).json, rpc_messages.CatalogManipulationResponse, ) self.failIf(response_1.error) self.assertEqual( response_2.error, rpc_messages.CatalogManipulationRequestError.HOSTNAME_REUSE, )
def test_delete_invalid(self): request_1 = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host-1', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), )) request_2 = rpc_to_json( rpc_messages.CatalogMachineDeletionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host-2', os_family=rpc_messages.OSFamily.LINUX, ), )) request_3 = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host-1', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), )) self.mock_get_current_backend() response_1 = jsonish_dict_to_rpc( self.call_api('add_machine', request_1).json, rpc_messages.CatalogManipulationResponse, ) response_2 = jsonish_dict_to_rpc( self.call_api('delete_machine', request_2).json, rpc_messages.CatalogManipulationResponse, ) response_3 = jsonish_dict_to_rpc( self.call_api('add_machine', request_3).json, rpc_messages.CatalogManipulationResponse, ) self.failIf(response_1.error) self.assertEqual( response_2.error, rpc_messages.CatalogManipulationRequestError.ENTRY_NOT_FOUND, ) self.assertEqual( response_3.error, rpc_messages.CatalogManipulationRequestError.HOSTNAME_REUSE, )
def test_no_expiration_ts(self): self.mock(utils, 'enqueue_task', lambda *args, **kwargs: True) request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), duration=1, request_id='fake-id', ) lease_request_key = models.LeaseRequest( id='id', deduplication_checksum= models.LeaseRequest.compute_deduplication_checksum(request), owner=auth_testing.DEFAULT_MOCKED_IDENTITY, request=request, response=rpc_messages.LeaseResponse( client_request_id='fake-id', hostname='fake-host', ), ).put() machine_key = models.CatalogMachineEntry( dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), lease_id=lease_request_key.id(), policies=rpc_messages.Policies( machine_service_account='fake-service-account', ), ).put() handlers_cron.reclaim_machine(machine_key, utils.utcnow()) self.assertTrue(lease_request_key.get().response.hostname)
def test_one_request_one_matching_machine_entry(self): request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), duration=1, request_id='fake-id', ) models.LeaseRequest( deduplication_checksum=models.LeaseRequest. compute_deduplication_checksum(request, ), key=models.LeaseRequest.generate_key( auth_testing.DEFAULT_MOCKED_IDENTITY.to_bytes(), request, ), owner=auth_testing.DEFAULT_MOCKED_IDENTITY, request=request, response=rpc_messages.LeaseResponse(client_request_id='fake-id', ), ).put() models.CatalogMachineEntry.create_and_put( rpc_messages.Dimensions( backend=rpc_messages.Backend.DUMMY, hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), models.CatalogMachineEntryStates.AVAILABLE, ) self.app.get( '/internal/cron/process-lease-requests', headers={'X-AppEngine-Cron': 'true'}, )
def test_add_batch(self): request = rpc_to_json( rpc_messages.CatalogMachineBatchAdditionRequest(requests=[ rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host-1', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), ), rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host-2', os_family=rpc_messages.OSFamily.WINDOWS, ), policies=rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), ), rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host-1', os_family=rpc_messages.OSFamily.OSX, ), policies=rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), ), ], )) self.mock_get_current_backend() response = jsonish_dict_to_rpc( self.call_api('add_machines', request).json, rpc_messages.CatalogBatchManipulationResponse, ) self.assertEqual(len(response.responses), 3) self.failIf(response.responses[0].error) self.failIf(response.responses[1].error) self.assertEqual( response.responses[2].error, rpc_messages.CatalogManipulationRequestError.HOSTNAME_REUSE, )
def test_delete(self): request_1 = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), )) request_2 = rpc_to_json( rpc_messages.CatalogMachineDeletionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), )) request_3 = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.WINDOWS, ), policies=rpc_messages.Policies( backend_project='fake-project', backend_topic='fake-topic', ), )) self.mock_get_current_backend() response_1 = jsonish_dict_to_rpc( self.call_api('add_machine', request_1).json, rpc_messages.CatalogManipulationResponse, ) response_2 = jsonish_dict_to_rpc( self.call_api('delete_machine', request_2).json, rpc_messages.CatalogManipulationResponse, ) response_3 = jsonish_dict_to_rpc( self.call_api('add_machine', request_3).json, rpc_messages.CatalogManipulationResponse, ) self.failIf(response_1.error) self.failIf(response_2.error) self.failIf(response_3.error)
def test_add(self): request = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies(), )) self.mock_get_current_backend() response = jsonish_dict_to_rpc( self.call_api('add_machine', request).json, rpc_messages.CatalogManipulationResponse, ) self.failIf(response.error)
def test_add_no_hostname(self): request = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies(), )) self.mock_get_current_backend() response = jsonish_dict_to_rpc( self.call_api('add_machine', request).json, rpc_messages.CatalogManipulationResponse, ) self.assertEqual( response.error, rpc_messages.CatalogManipulationRequestError.UNSPECIFIED_HOSTNAME, )
def test_leased_task_failed(self): self.mock(utils, 'enqueue_task', lambda *args, **kwargs: False) machine_key = models.CatalogMachineEntry( id='machine-id', dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies( machine_service_account='service-account', ), state=models.CatalogMachineEntryStates.AVAILABLE, ).put() request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), duration=1, request_id='request-id', ) lease_request_key = models.LeaseRequest( id='lease-id', deduplication_checksum= models.LeaseRequest.compute_deduplication_checksum(request), owner=auth_testing.DEFAULT_MOCKED_IDENTITY, request=request, response=rpc_messages.LeaseResponse( client_request_id='client-request-id', state=rpc_messages.LeaseRequestState.UNTRIAGED, ), ).put() with self.assertRaises(handlers_cron.TaskEnqueuingError): handlers_cron.lease_machine(machine_key, lease_request_key.get()) self.assertFalse(lease_request_key.get().machine_id) self.assertEqual( lease_request_key.get().response.state, rpc_messages.LeaseRequestState.UNTRIAGED, ) self.assertFalse(machine_key.get().lease_id) self.assertEqual( machine_key.get().state, models.CatalogMachineEntryStates.AVAILABLE, )
def test_add_project_without_topic(self): request = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies(pubsub_project='my-project', ), )) self.mock_get_current_backend() response = jsonish_dict_to_rpc( self.call_api('add_machine', request).json, rpc_messages.CatalogManipulationResponse, ) self.assertEqual( response.error, rpc_messages.CatalogManipulationRequestError.UNSPECIFIED_TOPIC, )
def test_reclaim_immediately(self): request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), duration=0, request_id='fake-id', ) lease = models.LeaseRequest( deduplication_checksum= models.LeaseRequest.compute_deduplication_checksum(request), key=models.LeaseRequest.generate_key( auth_testing.DEFAULT_MOCKED_IDENTITY.to_bytes(), request, ), owner=auth_testing.DEFAULT_MOCKED_IDENTITY, request=request, response=rpc_messages.LeaseResponse( client_request_id='fake-id', ), ) dimensions = rpc_messages.Dimensions( backend=rpc_messages.Backend.DUMMY, hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ) machine = models.CatalogMachineEntry( dimensions=dimensions, key=models.CatalogMachineEntry.generate_key(dimensions), lease_id=lease.key.id(), lease_expiration_ts=datetime.datetime.utcfromtimestamp(1), policies=rpc_messages.Policies( machine_service_account='fake-service-account', ), state=models.CatalogMachineEntryStates.AVAILABLE, ).put() lease.machine_id = machine.id() lease.put() self.app.get( '/internal/cron/process-machine-reclamations', headers={'X-AppEngine-Cron': 'true'}, )
def test_one_request_one_matching_machine_entry_lease_expiration_ts(self): ts = int(utils.time_time()) request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), lease_expiration_ts=ts, request_id='fake-id', ) key = models.LeaseRequest( deduplication_checksum= models.LeaseRequest.compute_deduplication_checksum(request), key=models.LeaseRequest.generate_key( auth_testing.DEFAULT_MOCKED_IDENTITY.to_bytes(), request, ), owner=auth_testing.DEFAULT_MOCKED_IDENTITY, request=request, response=rpc_messages.LeaseResponse( client_request_id='fake-id', state=rpc_messages.LeaseRequestState.UNTRIAGED, ), ).put() dimensions = rpc_messages.Dimensions( backend=rpc_messages.Backend.DUMMY, hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ) models.CatalogMachineEntry( key=models.CatalogMachineEntry.generate_key(dimensions), dimensions=dimensions, policies=rpc_messages.Policies( machine_service_account='fake-service-account', ), state=models.CatalogMachineEntryStates.AVAILABLE, ).put() self.app.get( '/internal/cron/process-lease-requests', headers={'X-AppEngine-Cron': 'true'}, ) self.assertEqual(key.get().response.lease_expiration_ts, ts)
def test_add_invalid_topic(self): request = rpc_to_json( rpc_messages.CatalogMachineAdditionRequest( dimensions=rpc_messages.Dimensions( hostname='fake-host', os_family=rpc_messages.OSFamily.LINUX, ), policies=rpc_messages.Policies( pubsub_topic='../../a-different-project/topics/my-topic', ), )) self.mock_get_current_backend() response = jsonish_dict_to_rpc( self.call_api('add_machine', request).json, rpc_messages.CatalogManipulationResponse, ) self.assertEqual( response.error, rpc_messages.CatalogManipulationRequestError.INVALID_TOPIC, )