private void syncProvisionerResources(String tenantId, ResourceCollection resourceCollection) throws IOException { for (Provisioner provisioner : provisionerStore.getTenantProvisioners(tenantId)) { if (!provisionerRequestService.putTenant(provisioner, tenantId, resourceCollection)) { LOG.error("Could not write resource metadata for tenant {} to provisioner {}. " + "The provisioner appears broken, deleting it and rebalancing its tenant workers", tenantId, provisioner.getId()); deleteProvisioner(provisioner); } } }
@Test public void testGetTenantProvisioners() throws IOException { ProvisionerStore store = getProvisionerStore(); store.writeProvisioner(provisioner1); store.writeProvisioner(provisioner2); Assert.assertTrue(store.getTenantProvisioners("tenantB").isEmpty()); Assert.assertEquals(ImmutableSet.of(provisioner2), ImmutableSet.copyOf(store.getTenantProvisioners("tenantA"))); Assert.assertEquals(ImmutableSet.of(provisioner1), ImmutableSet.copyOf(store.getTenantProvisioners("tenantX"))); Assert.assertEquals(ImmutableSet.of(provisioner2), ImmutableSet.copyOf(store.getTenantProvisioners("tenantZ"))); Assert.assertEquals(ImmutableSet.of(provisioner1, provisioner2), ImmutableSet.copyOf(store.getTenantProvisioners("tenantY"))); }
private void removeWorkers(String tenantId, int numToRemove, ResourceCollection resources) throws IOException { // go through each provisioner, removing workers for the tenant until we've removed enough. for (Provisioner provisioner : provisionerStore.getTenantProvisioners(tenantId)) { int numRemoved = provisioner.tryRemoveTenantAssignments(tenantId, numToRemove); if (numRemoved > 0) { provisionerStore.writeProvisioner(provisioner); LOG.debug("Requesting provisioner {} to set workers to {} for tenant {} (removing {})", provisioner.getId(), provisioner.getAssignedWorkers(tenantId), tenantId, numRemoved); if (provisionerRequestService.putTenant(provisioner, tenantId, resources)) { numToRemove -= numRemoved; } else { // request failed with retries. something is wrong with the provisioner, delete it and rebalance its workers // TODO: what if this fails? LOG.error("Could not set workers for tenant {} to provisioner {}. " + "The provisioner appears broken, deleting it and rebalancing its tenant workers", tenantId, provisioner.getId()); deleteProvisioner(provisioner); } } } }
Assert.assertEquals(97, store.getFreeCapacity()); for (String tenant : pState1.getAssignedTenants()) { Collection<Provisioner> tenantProvisioners = store.getTenantProvisioners(tenant); Assert.assertEquals(1, tenantProvisioners.size()); Assert.assertEquals(provisioner, tenantProvisioners.iterator().next()); Assert.assertEquals(94, store.getFreeCapacity()); for (String tenant : pState2.getAssignedTenants()) { Collection<Provisioner> tenantProvisioners = store.getTenantProvisioners(tenant); Assert.assertEquals(1, tenantProvisioners.size()); Assert.assertEquals(provisioner, tenantProvisioners.iterator().next()); Assert.assertEquals(91, store.getFreeCapacity()); for (String tenant : pState3.getAssignedTenants()) { Collection<Provisioner> tenantProvisioners = store.getTenantProvisioners(tenant); Assert.assertEquals(1, tenantProvisioners.size()); Assert.assertEquals(provisioner, tenantProvisioners.iterator().next());
@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())); } }