package core.aws.remote.ec2; import core.aws.client.AWS; import core.aws.remote.EnvTag; import core.aws.remote.Loader; import core.aws.resource.Resources; import core.aws.resource.image.Image; import core.aws.util.Maps; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /** * @author neo */ public class ImageLoader extends Loader { public ImageLoader(Resources resources, List<EnvTag> tags) { super(resources, tags); } @Override public void load() { Map<String, com.amazonaws.services.ec2.model.Image> remoteImages = loadRemoteImages(); all(Image.class).forEach(tag -> { Optional<Image> image = resources.find(Image.class, tag.resourceId()); if (image.isPresent()) { image.get().foundInRemote(); com.amazonaws.services.ec2.model.Image remoteImage = remoteImages.get(tag.remoteResourceId); if (remoteImage != null) { image.get().remoteImages.put(tag.version(), remoteImage); } else { logger.warn("ami is inconsistent with tag, please check aws, resourceId={}, version={}, amiId={}", tag.resourceId(), tag.version(), tag.remoteResourceId); } } else { logger.warn("found unused image, name={}, version={}", tag.resourceId(), tag.version()); } }); } private Map<String, com.amazonaws.services.ec2.model.Image> loadRemoteImages() { Map<String, com.amazonaws.services.ec2.model.Image> remoteImages = Maps.newHashMap(); List<String> remoteImageIds = all(Image.class).map(tag -> tag.remoteResourceId).collect(Collectors.toList()); if (!remoteImageIds.isEmpty()) { // check if the env has any remote image List<com.amazonaws.services.ec2.model.Image> images = AWS.ec2.describeImages(remoteImageIds); for (com.amazonaws.services.ec2.model.Image image : images) { remoteImages.put(image.getImageId(), image); } } return remoteImages; } }