def test_no_machine_id(self): request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), duration=1, request_id='fake-id', ) lease_key = models.LeaseRequest( deduplication_checksum= models.LeaseRequest.compute_deduplication_checksum(request), owner=auth_testing.DEFAULT_MOCKED_IDENTITY, released=True, request=request, response=rpc_messages.LeaseResponse( client_request_id='fake-id', ), ).put() machine_key = models.CatalogMachineEntry( id='id', dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), ).put() handlers_cron.release_lease(lease_key) self.assertFalse(lease_key.get().response.lease_expiration_ts) self.assertFalse(lease_key.get().released) self.assertFalse(machine_key.get().lease_expiration_ts)
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_lease_not_found(self): machine_key = models.CatalogMachineEntry( id='id', dimensions=rpc_messages.Dimensions( os_family=rpc_messages.OSFamily.LINUX, ), ).put() handlers_cron.release_lease(ndb.Key(models.LeaseRequest, 'fake-request')) self.assertFalse(machine_key.get().lease_expiration_ts)
def test_get(self): models.CatalogMachineEntry( key=models.CatalogMachineEntry._generate_key('DUMMY', 'fake-host'), dimensions=rpc_messages.Dimensions(hostname='fake-host'), ).put() request = rpc_to_json( rpc_messages.CatalogMachineRetrievalRequest( hostname='fake-host', )) self.mock_get_current_backend() response = jsonish_dict_to_rpc( self.call_api('get', request).json, rpc_messages.CatalogMachineRetrievalResponse, ) self.assertEqual(response.dimensions.hostname, 'fake-host')
def test_exact_match(self): request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( disk_gb=100, num_cpus=2, os_family=rpc_messages.OSFamily.LINUX, ), ) entry = models.CatalogMachineEntry( dimensions=rpc_messages.Dimensions( disk_gb=100, num_cpus=2, os_family=rpc_messages.OSFamily.LINUX, ), ) self.assertTrue(handlers_cron.can_fulfill(entry, request))
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_mismatch(self): request = rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions( disk_gb=100, num_cpus=4, os_family=rpc_messages.OSFamily.LINUX, ), ) entry = models.CatalogMachineEntry( dimensions=rpc_messages.Dimensions( disk_gb=100, hostname='fake-host', memory_gb=8.0, num_cpus=2, os_family=rpc_messages.OSFamily.LINUX, ), ) self.assertFalse(handlers_cron.can_fulfill(entry, request))
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 _add_machine(self, request): """Handles datastore operations for CatalogMachineAdditionRequests.""" entry = models.CatalogMachineEntry.generate_key( request.dimensions).get() if entry: # Enforces per-backend hostname uniqueness. logging.warning('Hostname reuse:\nOriginally used for: \n%s', entry) return rpc_messages.CatalogManipulationResponse( error=rpc_messages.CatalogManipulationRequestError. HOSTNAME_REUSE, machine_addition_request=request, ) models.CatalogMachineEntry( key=models.CatalogMachineEntry.generate_key(request.dimensions), dimensions=request.dimensions, policies=request.policies, state=models.CatalogMachineEntryStates.AVAILABLE, ).put() return rpc_messages.CatalogManipulationResponse( machine_addition_request=request, )
def test_reclaimed(self): lease_key = models.LeaseRequest( id='fake-id', deduplication_checksum='checksum', machine_id='fake-host', owner=auth_testing.DEFAULT_MOCKED_IDENTITY, request=rpc_messages.LeaseRequest( dimensions=rpc_messages.Dimensions(), request_id='request-id', ), response=rpc_messages.LeaseResponse( client_request_id='request-id', hostname='fake-host', ), ).put() machine_key = models.CatalogMachineEntry( dimensions=rpc_messages.Dimensions(), lease_id=lease_key.id(), ).put() handlers_queues.reclaim(machine_key) self.assertFalse(lease_key.get().machine_id) self.assertFalse(lease_key.get().response.hostname) self.assertFalse(machine_key.get())