/** * Get the provisioner for the given id for external display, with tenant ids mapped to tenant names, * or null if none exists. * * @param provisionerId Id of the provisioner to get * @return Provisioner for the given id with tenant ids mapped to tenant names, or null if none exists * @throws IOException */ public Provisioner getProvisioner(String provisionerId) throws IOException { return createExternalProvisioner(provisionerStore.getProvisioner(provisionerId)); }
/** * Delete the given provisioner, queueing a job to reassign its workers to different provisioners. * * @param provisionerId Id of the provisioner to delete * @throws IOException */ public void deleteProvisioner(String provisionerId) throws IOException { tenantLock.lock(); try { Provisioner provisioner = provisionerStore.getProvisioner(provisionerId); if (provisioner == null) { return; } deleteProvisioner(provisioner); } finally { tenantLock.unlock(); } }
/** * Handle the heartbeat of a provisioner, updating the last heartbeat time of the provisioner and updating the number * of live workers running on the provisioner for each tenant it is responsible for. * * @param provisionerId Id of the provisioner that sent the heartbeat * @param heartbeat The heartbeat containing live worker information * @throws IOException if there was an exception persisting the data * @throws MissingEntityException if there is no provisioner for the given id */ public void handleHeartbeat(String provisionerId, ProvisionerHeartbeat heartbeat) throws IOException, MissingEntityException { // no lock required here. Simply getting a provisioner and writing worker usage. Would only expect one provisioner // to be calling this at a time, and even if it is calling it concurrently for some reason, only the usage can // change and for that its ok for one of them to win. Provisioner provisioner = provisionerStore.getProvisioner(provisionerId); if (provisioner == null) { throw new MissingEntityException("Provisioner " + provisionerId + " not found."); } if (!provisioner.getUsage().equals(heartbeat.getUsage())) { provisioner.setUsage(heartbeat.getUsage()); provisionerStore.writeProvisioner(provisioner); } provisionerStore.setHeartbeat(provisionerId, System.currentTimeMillis()); }
@Test public void testWriteGetDeleteProvisioner() throws IOException { ProvisionerStore store = getProvisionerStore(); String id = provisioner1.getId(); Assert.assertNull(store.getProvisioner(id)); store.writeProvisioner(provisioner1); Assert.assertEquals(provisioner1, store.getProvisioner(id)); store.deleteProvisioner(id); Assert.assertNull(store.getProvisioner(id)); }
@Test public void testWriteWithTenantUpdate() throws IOException { ProvisionerStore store = getProvisionerStore(); store.writeProvisioner(provisioner1); Assert.assertEquals(provisioner1, store.getProvisioner(provisioner1.getId())); Provisioner updatedProvisioner1 = new Provisioner( provisioner1.getId(), provisioner1.getHost(), provisioner1.getPort(), 100, ImmutableMap.<String, Integer>of("tenantA", 50, "tenantY", 5, "tenantZ", 0), ImmutableMap.<String, Integer>of("tenantA", 50, "tenantY", 5, "tenantZ", 1) ); store.writeProvisioner(updatedProvisioner1); Assert.assertEquals(updatedProvisioner1, store.getProvisioner(provisioner1.getId())); Assert.assertEquals(0, store.getNumAssignedWorkers("tenantX")); Assert.assertEquals(44, store.getFreeCapacity()); for (Provisioner provisioner : store.getTenantProvisioners("tenantX")) { Assert.assertFalse(provisioner.getId().equals(provisioner1.getId())); } }
Provisioner provisioner = store.getProvisioner(provisionerId); Assert.assertTrue(provisioner.equals(pState1) || provisioner.equals(pState2) || provisioner.equals(pState3)); if (provisioner.equals(pState1)) {