MCPcopy Create free account
hub / github.com/containers/image / prepareInstanceCopies

Function prepareInstanceCopies

copy/multiple.go:102–157  ·  view source on GitHub ↗

prepareInstanceCopies prepares a list of instances which needs to copied to the manifest list.

(list internalManifest.List, instanceDigests []digest.Digest, options *Options)

Source from the content-addressed store, hash-verified

100
101// prepareInstanceCopies prepares a list of instances which needs to copied to the manifest list.
102func 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

Calls 9

platformCompressionMapFunction · 0.85
ContainsMethod · 0.80
InstanceMethod · 0.65
NameMethod · 0.65
CloneMethod · 0.65
AddMethod · 0.45

Used in the wild real call sites across dependent graphs

searching dependent graphs…