use of com.google.cloud.tools.jib.event.EventHandlers in project jib by google.
the class PushImageStep method makeListForManifestList.
static ImmutableList<PushImageStep> makeListForManifestList(BuildContext buildContext, ProgressEventDispatcher.Factory progressEventDispatcherFactory, RegistryClient registryClient, ManifestTemplate manifestList, boolean manifestListAlreadyExists) throws IOException {
Set<String> tags = buildContext.getAllTargetImageTags();
EventHandlers eventHandlers = buildContext.getEventHandlers();
try (TimerEventDispatcher ignored = new TimerEventDispatcher(eventHandlers, "Preparing manifest list pushers");
ProgressEventDispatcher progressEventDispatcher = progressEventDispatcherFactory.create("launching manifest list pushers", tags.size())) {
boolean singlePlatform = buildContext.getContainerConfiguration().getPlatforms().size() == 1;
if (singlePlatform) {
// single image; no need to push a manifest list
return ImmutableList.of();
}
if (JibSystemProperties.skipExistingImages() && manifestListAlreadyExists) {
eventHandlers.dispatch(LogEvent.info("Skipping pushing manifest list; already exists."));
return ImmutableList.of();
}
DescriptorDigest manifestListDigest = Digests.computeJsonDigest(manifestList);
return tags.stream().map(tag -> new PushImageStep(buildContext, progressEventDispatcher.newChildProducer(), registryClient, manifestList, tag, manifestListDigest, // return value and type.
manifestListDigest)).collect(ImmutableList.toImmutableList());
}
}
use of com.google.cloud.tools.jib.event.EventHandlers in project jib by google.
the class TimerEventDispatcherTest method testLogging.
@Test
public void testLogging() {
EventHandlers eventHandlers = EventHandlers.builder().add(TimerEvent.class, timerEventQueue::add).build();
Mockito.when(mockClock.instant()).thenReturn(Instant.EPOCH);
try (TimerEventDispatcher parentTimerEventDispatcher = new TimerEventDispatcher(eventHandlers, "description", mockClock, null)) {
Mockito.when(mockClock.instant()).thenReturn(Instant.EPOCH.plusMillis(1));
parentTimerEventDispatcher.lap();
Mockito.when(mockClock.instant()).thenReturn(Instant.EPOCH.plusMillis(1).plusNanos(1));
try (TimerEventDispatcher ignored = parentTimerEventDispatcher.subTimer("child description")) {
Mockito.when(mockClock.instant()).thenReturn(Instant.EPOCH.plusMillis(2));
// Laps on close.
}
}
TimerEvent timerEvent = getNextTimerEvent();
verifyNoParent(timerEvent);
verifyStartState(timerEvent);
verifyDescription(timerEvent, "description");
TimerEvent.Timer parentTimer = timerEvent.getTimer();
timerEvent = getNextTimerEvent();
verifyNoParent(timerEvent);
verifyStateFirstLap(timerEvent, State.LAP);
verifyDescription(timerEvent, "description");
timerEvent = getNextTimerEvent();
verifyParent(timerEvent, parentTimer);
verifyStartState(timerEvent);
verifyDescription(timerEvent, "child description");
timerEvent = getNextTimerEvent();
verifyParent(timerEvent, parentTimer);
verifyStateFirstLap(timerEvent, State.FINISHED);
verifyDescription(timerEvent, "child description");
timerEvent = getNextTimerEvent();
verifyNoParent(timerEvent);
verifyStateNotFirstLap(timerEvent, State.FINISHED);
verifyDescription(timerEvent, "description");
Assert.assertTrue(timerEventQueue.isEmpty());
}
use of com.google.cloud.tools.jib.event.EventHandlers in project jib by google.
the class ProgressEventTest method testSmoke.
@Test
public void testSmoke() {
Consumer<ProgressEvent> progressEventConsumer = progressEvent -> {
Allocation allocation = progressEvent.getAllocation();
long units = progressEvent.getUnits();
updateCompletionMap(allocation, units);
};
EventHandlers eventHandlers = makeEventHandlers(progressEventConsumer);
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child1Child, 50));
Assert.assertEquals(1, allocationCompletionMap.size());
Assert.assertEquals(50, allocationCompletionMap.get(AllocationTree.child1Child).longValue());
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child1Child, 50));
Assert.assertEquals(3, allocationCompletionMap.size());
Assert.assertEquals(100, allocationCompletionMap.get(AllocationTree.child1Child).longValue());
Assert.assertEquals(1, allocationCompletionMap.get(AllocationTree.child1).longValue());
Assert.assertEquals(1, allocationCompletionMap.get(AllocationTree.root).longValue());
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child2, 200));
Assert.assertEquals(4, allocationCompletionMap.size());
Assert.assertEquals(100, allocationCompletionMap.get(AllocationTree.child1Child).longValue());
Assert.assertEquals(1, allocationCompletionMap.get(AllocationTree.child1).longValue());
Assert.assertEquals(200, allocationCompletionMap.get(AllocationTree.child2).longValue());
Assert.assertEquals(2, allocationCompletionMap.get(AllocationTree.root).longValue());
}
use of com.google.cloud.tools.jib.event.EventHandlers in project jib by google.
the class ProgressEventTest method testType.
@Test
public void testType() {
// Used to test whether or not progress event was consumed
boolean[] called = new boolean[] { false };
Consumer<ProgressEvent> buildImageConsumer = progressEvent -> {
called[0] = true;
};
EventHandlers eventHandlers = makeEventHandlers(buildImageConsumer);
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child1, 50));
Assert.assertTrue(called[0]);
}
use of com.google.cloud.tools.jib.event.EventHandlers in project jib by google.
the class ProgressEventHandlerTest method testAccept.
@Test
public void testAccept() throws ExecutionException, InterruptedException, IOException {
try (MultithreadedExecutor multithreadedExecutor = new MultithreadedExecutor()) {
DoubleAccumulator maxProgress = new DoubleAccumulator(Double::max, 0);
ProgressEventHandler progressEventHandler = new ProgressEventHandler(update -> maxProgress.accumulate(update.getProgress()));
EventHandlers eventHandlers = EventHandlers.builder().add(ProgressEvent.class, progressEventHandler).build();
// Adds root, child1, and child1Child.
multithreadedExecutor.invoke(() -> {
eventHandlers.dispatch(new ProgressEvent(AllocationTree.root, 0L));
return null;
});
multithreadedExecutor.invoke(() -> {
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child1, 0L));
return null;
});
multithreadedExecutor.invoke(() -> {
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child1Child, 0L));
return null;
});
Assert.assertEquals(0.0, maxProgress.get(), DOUBLE_ERROR_MARGIN);
// Adds 50 to child1Child and 100 to child2.
List<Callable<Void>> callables = new ArrayList<>(150);
callables.addAll(Collections.nCopies(50, () -> {
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child1Child, 1L));
return null;
}));
callables.addAll(Collections.nCopies(100, () -> {
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child2, 1L));
return null;
}));
multithreadedExecutor.invokeAll(callables);
Assert.assertEquals(1.0 / 2 / 100 * 50 + 1.0 / 2 / 200 * 100, maxProgress.get(), DOUBLE_ERROR_MARGIN);
// 0 progress doesn't do anything.
multithreadedExecutor.invokeAll(Collections.nCopies(100, () -> {
eventHandlers.dispatch(new ProgressEvent(AllocationTree.child1, 0L));
return null;
}));
Assert.assertEquals(1.0 / 2 / 100 * 50 + 1.0 / 2 / 200 * 100, maxProgress.get(), DOUBLE_ERROR_MARGIN);
// Adds 50 to child1Child and 100 to child2 to finish it up.
multithreadedExecutor.invokeAll(callables);
Assert.assertEquals(1.0, maxProgress.get(), DOUBLE_ERROR_MARGIN);
}
}
Aggregations