Exemple #1
0
  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)
Exemple #2
0
  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)
Exemple #3
0
  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)
Exemple #4
0
    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')
Exemple #5
0
  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))
Exemple #6
0
  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,
    )
Exemple #7
0
  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))
Exemple #8
0
  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'},
    )
Exemple #9
0
  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)
Exemple #10
0
 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())