class PullBaseImageStep implements Callable<ImagesAndRegistryClient> {

  @VisibleForTesting
  List<Image> getCachedBaseImages()
      throws IOException, CacheCorruptedException, BadContainerConfigurationFormatException,
          LayerCountMismatchException, UnlistedPlatformInManifestListException {
    ImageReference baseImage = buildContext.getBaseImageConfiguration().getImage();
    Optional<ImageMetadataTemplate> metadata =
        buildContext.getBaseImageLayersCache().retrieveMetadata(baseImage);
    if (!metadata.isPresent()) {
      return Collections.emptyList();
    }

    ManifestTemplate manifestList = metadata.get().getManifestList();
    List<ManifestAndConfigTemplate> manifestsAndConfigs = metadata.get().getManifestsAndConfigs();

    if (manifestList == null) {
      Verify.verify(manifestsAndConfigs.size() == 1);
      ManifestTemplate manifest = manifestsAndConfigs.get(0).getManifest();
      if (manifest instanceof V21ManifestTemplate) {
        return Collections.singletonList(
            JsonToImageTranslator.toImage((V21ManifestTemplate) manifest));
      }

      ContainerConfigurationTemplate containerConfig =
          Verify.verifyNotNull(manifestsAndConfigs.get(0).getConfig());
      PlatformChecker.checkManifestPlatform(buildContext, containerConfig);

      return Collections.singletonList(
          JsonToImageTranslator.toImage(
              (BuildableManifestTemplate) Verify.verifyNotNull(manifest), containerConfig));
    }

    // Manifest list cached. Identify matching platforms and check if all of them are cached.
    ImmutableList.Builder<Image> images = ImmutableList.builder();
    for (Platform platform : buildContext.getContainerConfiguration().getPlatforms()) {
      String manifestDigest =
          lookUpPlatformSpecificImageManifest((V22ManifestListTemplate) manifestList, platform);

      Optional<ManifestAndConfigTemplate> manifestAndConfigFound =
          manifestsAndConfigs
              .stream()
              .filter(entry -> manifestDigest.equals(entry.getManifestDigest()))
              .findFirst();
      if (!manifestAndConfigFound.isPresent()) {
        return Collections.emptyList();
      }

      ManifestTemplate manifest = Verify.verifyNotNull(manifestAndConfigFound.get().getManifest());
      ContainerConfigurationTemplate containerConfig =
          Verify.verifyNotNull(manifestAndConfigFound.get().getConfig());
      images.add(
          JsonToImageTranslator.toImage((BuildableManifestTemplate) manifest, containerConfig));
    }
    return images.build();
  }

    PullBaseImageStep(
      BuildContext buildContext, ProgressEventDispatcher.Factory progressEventDispatcherFactory);

}