@Override public void run() { while (true) { Element element = balanceQueue.take(id); if (element == null) { return; } try { tenantProvisionerService.rebalanceTenantWorkers(element.getValue()); balanceQueue.recordProgress(id, element.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "balanced"); } catch (CapacityException e) { LOG.error("Not enough capacity trying to balance workers for tenant {}", element.getValue(), e); // a failed status puts the element back in the queue, we don't want to consume this element again. // when another provisioner comes online, workers will get rebalanced once again. balanceQueue.recordProgress(id, element.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "not enough capacity"); } catch (IOException e) { LOG.error("Exception trying to balance workers for tenant {}", element.getValue(), e); balanceQueue.recordProgress(id, element.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "failed"); } } } }
@Override public void run() { try { barrier.await(); } catch (Exception e) { Throwables.propagate(e); } while (numTaken.get() < expectedNumElements) { Iterator<GroupElement> iter = queues.takeIterator(consumerId); while (iter.hasNext()) { GroupElement taken = iter.next(); numTaken.getAndIncrement(); elements.put(Integer.valueOf(taken.getElement().getValue()), Integer.valueOf(taken.getQueueName())); } try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { Throwables.propagate(e); } } latch.countDown(); } });
@Override public void run() { CallbackData callbackData = gson.fromJson(gElement.getElement().getValue(), CallbackData.class); CallbackContext callbackContext = new CallbackContext(clusterStoreService, userStore, callbackData.getCluster().getAccount()); switch (callbackData.getType()) { case START: onStart(callbackData, callbackContext); break; case SUCCESS: clusterCallback.onSuccess(callbackData, callbackContext); break; case FAILURE: clusterCallback.onFailure(callbackData, callbackContext); break; default: LOG.error("Unknown callback type {}", callbackData.getType()); } }
SolverRequest solverRequest = gson.fromJson(solveElement.getValue(), SolverRequest.class); try { solverJob.setJobStatus(ClusterJob.Status.RUNNING);
String queueName = gElement.getQueueName(); Element element = gElement.getElement(); String jobIdStr = element.getValue();
Cluster cluster = clusterStore.getCluster(clusterElement.getId()); ClusterJob job = clusterStore.getClusterJob(JobId.fromString(cluster.getLatestJobId())); ClusterAction clusterAction = ClusterAction.valueOf(clusterElement.getValue()); LOG.debug("Got cluster {} with action {}", cluster.getName(), clusterAction); try {
System.out.println("consumed: " + element.getId()); consumedCount++; consumedSum += Integer.valueOf(element.getValue());
HttpResponseStatus.OK); Assert.assertEquals(entry.getValue().name(), clusterQueues.take(cluster.getAccount().getTenantId(), "0").getValue()); cluster.setStatus(Cluster.Status.ACTIVE); clusterStore.writeCluster(cluster);
@Test public void testOnlyCorrectClustersAreCleaned() throws Exception { long now = System.currentTimeMillis(); for (int i = 0; i < 20; i++) { createCluster(String.valueOf(i), now - 1000, now - 100, Cluster.Status.ACTIVE); } String queueName = account.getTenantId(); ClusterCleanup clusterCleanup = new ClusterCleanup(clusterStore, clusterService, nodeService, taskService, jobQueues, provisionerQueues, -10, 3, 7); Assert.assertEquals(0, Iterators.size(clusterQueues.getQueued(queueName))); clusterCleanup.run(); // clusters 3, 10, and 17 should have been scheduled for deletion Assert.assertEquals(3, Iterators.size(clusterQueues.getQueued(queueName))); Element e1 = clusterQueues.take(queueName, "consumer1"); Element e2 = clusterQueues.take(queueName, "consumer1"); Element e3 = clusterQueues.take(queueName, "consumer1"); Assert.assertEquals(ImmutableSet.of("3", "10", "17"), ImmutableSet.of(e1.getId(), e2.getId(), e3.getId())); Assert.assertEquals(ClusterAction.CLUSTER_DELETE.name(), e1.getValue()); Assert.assertEquals(ClusterAction.CLUSTER_DELETE.name(), e2.getValue()); Assert.assertEquals(ClusterAction.CLUSTER_DELETE.name(), e3.getValue()); }
@Test public void testOneQueueAddTakeWithQueueName() { QueueGroup queues = getQueueGroup(QueueType.PROVISIONER); String queueName = "tenant1"; String consumerId = "worker.0"; queues.add(queueName, new Element("id", "val")); Element taken = queues.take(queueName, consumerId); Assert.assertEquals("id", taken.getId()); Assert.assertEquals("val", taken.getValue()); }
@Test public void testOneQueueAddTakeWithoutQueueName() { QueueGroup queues = getQueueGroup(QueueType.PROVISIONER); String queueName = "tenant1"; String consumerId = "worker.0"; queues.add(queueName, new Element("id", "val")); GroupElement taken = queues.takeIterator(consumerId).next(); Assert.assertEquals(queueName, taken.getQueueName()); Assert.assertEquals("id", taken.getElement().getId()); Assert.assertEquals("val", taken.getElement().getValue()); }
clusterTask = null; } else { SchedulableTask taskObject = gson.fromJson(task.getValue(), SchedulableTask.class); TaskConfig taskConfig = taskObject.getConfig();
@Test public void testAddClusterWithOptionalArgs() throws Exception { String clusterName = "my-cluster"; String tenantId = USER1_ACCOUNT.getTenantId(); ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName(clusterName) .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setProviderName("joyent") .setServiceNames(ImmutableSet.of("namenode", "datanode")) .setHardwareTypeName("large") .setImageTypeName("centos6") .setInitialLeaseDuration(-1L) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); // check there was an element added to the cluster queue for creating this cluster Element element = solverQueues.take(tenantId, "0"); SolverRequest request = gson.fromJson(element.getValue(), SolverRequest.class); ClusterCreateRequest createRequest = gson.fromJson(request.getJsonRequest(), ClusterCreateRequest.class); Assert.assertEquals("joyent", createRequest.getProvider()); Assert.assertEquals("centos6", createRequest.getImageType()); Assert.assertEquals("large", createRequest.getHardwareType()); Assert.assertEquals(ImmutableSet.of("namenode", "datanode"), createRequest.getServices()); }
@Test public void testChangesSeenAcrossInstances() throws Exception { QueueGroup instance1 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); QueueGroup instance2 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); instance1.startAndWait(); instance2.startAndWait(); // add a queue for tenant3 with 2 elements String tenant = "tenantX"; Set<String> expectedQueueNames = Sets.newHashSet(tenant); instance1.add(tenant, new Element("id3-1", "val1")); instance1.add(tenant, new Element("id3-2", "val2")); // check both instances see tenant3 Assert.assertEquals(expectedQueueNames, instance1.getQueueNames()); waitForQueueNames(expectedQueueNames, instance2); // make sure each instance gets an accurate picture of the queue Iterator<GroupElement> queuesIter1 = instance1.takeIterator("consumer1"); Iterator<GroupElement> queuesIter2 = instance1.takeIterator("consumer2"); GroupElement gelement = queuesIter1.next(); Assert.assertEquals(tenant, gelement.getQueueName()); Assert.assertEquals("id3-1", gelement.getElement().getId()); Assert.assertEquals("val1", gelement.getElement().getValue()); gelement = queuesIter2.next(); Assert.assertEquals(tenant, gelement.getQueueName()); Assert.assertEquals("id3-2", gelement.getElement().getId()); Assert.assertEquals("val2", gelement.getElement().getValue()); Assert.assertFalse(queuesIter1.hasNext()); Assert.assertFalse(queuesIter2.hasNext()); instance1.stop(); instance2.stop(); }
@Test public void testAddCluster() throws Exception { String clusterName = "my-cluster"; String tenantId = USER1_ACCOUNT.getTenantId(); ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName(clusterName) .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); String clusterId = getIdFromResponse(response); // check there was an element added to the cluster queue for creating this cluster Element element = solverQueues.take(tenantId, "0"); Assert.assertEquals(clusterId, element.getId()); ClusterCreateRequest expected = ClusterCreateRequest.builder() .setName(clusterName) .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setInitialLeaseDuration(-1L) .build(); SolverRequest expectedSolverRequest = new SolverRequest(SolverRequest.Type.CREATE_CLUSTER, gson.toJson(expected)); Assert.assertEquals(expectedSolverRequest, gson.fromJson(element.getValue(), SolverRequest.class)); }
String consumerId = "testJobScheduler"; Element jobQueueElement = jobQueues.take(tenantId, consumerId); String jobId = jobQueueElement.getValue(); jobQueues.add(tenantId, new Element(jobId)); JobScheduler jobScheduler = injector.getInstance(JobScheduler.class);
String consumerId = "testJobScheduler"; Element jobQueueElement = jobQueues.take(tenantId, consumerId); String jobId = jobQueueElement.getValue(); job = clusterStore.getClusterJob(JobId.fromString(jobId)); while (true) {