private static bool ArePlatformsEqual(PlatformData platformData, ImageData imageData, PlatformInfo platform, ImageInfo manifestImage) { PlatformData otherPlatform = PlatformData.FromPlatformInfo(platform, manifestImage); // We can't use PlatformData.CompareTo here because it relies on having its PlatformInfo and ImageInfo values fully populated // which is what this class is trying to make happen. return(!platformData.HasDifferentTagState(otherPlatform) && platformData.GetIdentifier(excludeProductVersion: true) == otherPlatform.GetIdentifier(excludeProductVersion: true) && AreProductVersionsEquivalent(imageData.ProductVersion, manifestImage.ProductVersion)); }
public void GetIdentifier(string productVersion, string expectedVersion) { PlatformData platform = new PlatformData { ImageInfo = CreateImage(productVersion), Architecture = "amd64", OsType = "linux", OsVersion = "focal", Dockerfile = "path" }; string identifier = platform.GetIdentifier(); Assert.Equal($"path-amd64-linux-focal-{expectedVersion}", identifier); }
public static ImageArtifactDetails LoadFromContent(string imageInfoContent, ManifestInfo manifest, bool skipManifestValidation = false) { ImageArtifactDetails imageArtifactDetails = JsonConvert.DeserializeObject <ImageArtifactDetails>(imageInfoContent); foreach (RepoData repoData in imageArtifactDetails.Repos) { RepoInfo manifestRepo = manifest.AllRepos.FirstOrDefault(repo => repo.Name == repoData.Repo); if (manifestRepo == null) { Console.WriteLine($"Image info repo not loaded: {repoData.Repo}"); continue; } foreach (ImageData imageData in repoData.Images) { PlatformData platformData = imageData.Platforms.FirstOrDefault(); if (platformData != null) { foreach (ImageInfo manifestImage in manifestRepo.AllImages) { PlatformInfo matchingManifestPlatform = manifestImage.AllPlatforms .FirstOrDefault(platform => platformData.Equals(platform)); if (matchingManifestPlatform != null) { imageData.ManifestImage = manifestImage; break; } } if (!skipManifestValidation && imageData.ManifestImage == null) { throw new InvalidOperationException( $"Unable to find matching platform in manifest for platform '{platformData.GetIdentifier()}'."); } } } } return(imageArtifactDetails); }
/// <summary> /// Loads image info string content as a parsed model. /// </summary> /// <param name="imageInfoContent">The image info content to load.</param> /// <param name="manifest">Representation of the manifest model.</param> /// <param name="skipManifestValidation"> /// Whether to skip validation if no associated manifest model item was found for a given image info model item. /// </param> /// <param name="useFilteredManifest">Whether to use the filtered content of the manifest for lookups.</param> public static ImageArtifactDetails LoadFromContent(string imageInfoContent, ManifestInfo manifest, bool skipManifestValidation = false, bool useFilteredManifest = false) { ImageArtifactDetails imageArtifactDetails = JsonConvert.DeserializeObject <ImageArtifactDetails>(imageInfoContent); foreach (RepoData repoData in imageArtifactDetails.Repos) { RepoInfo manifestRepo = (useFilteredManifest ? manifest.FilteredRepos : manifest.AllRepos) .FirstOrDefault(repo => repo.Name == repoData.Repo); if (manifestRepo == null) { Console.WriteLine($"Image info repo not loaded: {repoData.Repo}"); continue; } foreach (ImageData imageData in repoData.Images) { imageData.ManifestRepo = manifestRepo; foreach (PlatformData platformData in imageData.Platforms) { foreach (ImageInfo manifestImage in (useFilteredManifest ? manifestRepo.FilteredImages : manifestRepo.AllImages)) { PlatformInfo matchingManifestPlatform = (useFilteredManifest ? manifestImage.FilteredPlatforms : manifestImage.AllPlatforms) .FirstOrDefault(platform => ArePlatformsEqual(platformData, imageData, platform, manifestImage)); if (matchingManifestPlatform != null) { if (imageData.ManifestImage is null) { imageData.ManifestImage = manifestImage; } platformData.PlatformInfo = matchingManifestPlatform; platformData.ImageInfo = manifestImage; break; } } } PlatformData representativePlatform = imageData.Platforms.FirstOrDefault(); if (!skipManifestValidation && imageData.ManifestImage == null && representativePlatform != null) { throw new InvalidOperationException( $"Unable to find matching platform in manifest for platform '{representativePlatform.GetIdentifier()}'."); } } } return(imageArtifactDetails); }
private void RemoveUnchangedPlatforms(ImageArtifactDetails imageArtifactDetails) { for (int repoIndex = imageArtifactDetails.Repos.Count - 1; repoIndex >= 0; repoIndex--) { RepoData repo = imageArtifactDetails.Repos[repoIndex]; for (int imageIndex = repo.Images.Count - 1; imageIndex >= 0; imageIndex--) { ImageData image = repo.Images[imageIndex]; for (int i = image.Platforms.Count - 1; i >= 0; i--) { PlatformData platform = image.Platforms[i]; if (platform.IsUnchanged) { // Exclude the ProductVersion from the identifier because it requires the ImageInfo to be set on the platform. // But it's not set because we haven't used ImageInfoHelper to load it, we've just deserialized it directly. // Using ImageInfoHelper requires having the manifest but that seems unnecessary since it's not needed for the logic // of this command other than this simple logging statement. _loggerService.WriteMessage($"Removing unchanged platform '{platform.GetIdentifier(excludeProductVersion: true)}'"); image.Platforms.Remove(platform); } } if (!image.Platforms.Any()) { repo.Images.Remove(image); } } if (!repo.Images.Any()) { imageArtifactDetails.Repos.Remove(repo); } } }