prepareInstanceCopies prepares a list of instances which needs to copied to the manifest list.
(list internalManifest.List, instanceDigests []digest.Digest, options *Options)
| 100 | |
| 101 | // prepareInstanceCopies prepares a list of instances which needs to copied to the manifest list. |
| 102 | func prepareInstanceCopies(list internalManifest.List, instanceDigests []digest.Digest, options *Options) ([]instanceCopy, error) { |
| 103 | res := []instanceCopy{} |
| 104 | if options.ImageListSelection == CopySpecificImages && len(options.EnsureCompressionVariantsExist) > 0 { |
| 105 | // List can already contain compressed instance for a compression selected in `EnsureCompressionVariantsExist` |
| 106 | // It’s unclear what it means when `CopySpecificImages` includes an instance in options.Instances, |
| 107 | // EnsureCompressionVariantsExist asks for an instance with some compression, |
| 108 | // an instance with that compression already exists, but is not included in options.Instances. |
| 109 | // We might define the semantics and implement this in the future. |
| 110 | return res, fmt.Errorf("EnsureCompressionVariantsExist is not implemented for CopySpecificImages") |
| 111 | } |
| 112 | err := validateCompressionVariantExists(options.EnsureCompressionVariantsExist) |
| 113 | if err != nil { |
| 114 | return res, err |
| 115 | } |
| 116 | compressionsByPlatform, err := platformCompressionMap(list, instanceDigests) |
| 117 | if err != nil { |
| 118 | return nil, err |
| 119 | } |
| 120 | for i, instanceDigest := range instanceDigests { |
| 121 | if options.ImageListSelection == CopySpecificImages && |
| 122 | !slices.Contains(options.Instances, instanceDigest) { |
| 123 | logrus.Debugf("Skipping instance %s (%d/%d)", instanceDigest, i+1, len(instanceDigests)) |
| 124 | continue |
| 125 | } |
| 126 | instanceDetails, err := list.Instance(instanceDigest) |
| 127 | if err != nil { |
| 128 | return res, fmt.Errorf("getting details for instance %s: %w", instanceDigest, err) |
| 129 | } |
| 130 | forceCompressionFormat, err := shouldRequireCompressionFormatMatch(options) |
| 131 | if err != nil { |
| 132 | return nil, err |
| 133 | } |
| 134 | res = append(res, instanceCopy{ |
| 135 | op: instanceCopyCopy, |
| 136 | sourceDigest: instanceDigest, |
| 137 | copyForceCompressionFormat: forceCompressionFormat, |
| 138 | }) |
| 139 | platform := platformV1ToPlatformComparable(instanceDetails.ReadOnly.Platform) |
| 140 | compressionList := compressionsByPlatform[platform] |
| 141 | for _, compressionVariant := range options.EnsureCompressionVariantsExist { |
| 142 | if !compressionList.Contains(compressionVariant.Algorithm.Name()) { |
| 143 | res = append(res, instanceCopy{ |
| 144 | op: instanceCopyClone, |
| 145 | sourceDigest: instanceDigest, |
| 146 | cloneArtifactType: instanceDetails.ReadOnly.ArtifactType, |
| 147 | cloneCompressionVariant: compressionVariant, |
| 148 | clonePlatform: instanceDetails.ReadOnly.Platform, |
| 149 | cloneAnnotations: maps.Clone(instanceDetails.ReadOnly.Annotations), |
| 150 | }) |
| 151 | // add current compression to the list so that we don’t create duplicate clones |
| 152 | compressionList.Add(compressionVariant.Algorithm.Name()) |
| 153 | } |
| 154 | } |
| 155 | } |
| 156 | return res, nil |
| 157 | } |
| 158 | |
| 159 | // copyMultipleImages copies some or all of an image list's instances, using |
searching dependent graphs…