Merge pull request #5542 from rhatdan/vendor
Vendor in containers/buildah v1.14.3
This commit is contained in:
		
						commit
						bd9386ddac
					
				
							
								
								
									
										2
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										2
									
								
								go.mod
								
								
								
								
							|  | @ -9,7 +9,7 @@ require ( | ||||||
| 	github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect | 	github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect | ||||||
| 	github.com/containernetworking/cni v0.7.2-0.20200304161608-4fae32b84921 | 	github.com/containernetworking/cni v0.7.2-0.20200304161608-4fae32b84921 | ||||||
| 	github.com/containernetworking/plugins v0.8.5 | 	github.com/containernetworking/plugins v0.8.5 | ||||||
| 	github.com/containers/buildah v1.14.3-0.20200313154200-d26f437b2a46 | 	github.com/containers/buildah v1.14.3 | ||||||
| 	github.com/containers/common v0.5.0 | 	github.com/containers/common v0.5.0 | ||||||
| 	github.com/containers/conmon v2.0.10+incompatible | 	github.com/containers/conmon v2.0.10+incompatible | ||||||
| 	github.com/containers/image/v5 v5.2.1 | 	github.com/containers/image/v5 v5.2.1 | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										4
									
								
								go.sum
								
								
								
								
							|  | @ -71,6 +71,8 @@ github.com/containers/buildah v1.14.3-0.20200313093807-c0e60d444696 h1:TCJsENYev | ||||||
| github.com/containers/buildah v1.14.3-0.20200313093807-c0e60d444696/go.mod h1:OCorIy7yUrQ2hIZY5z/LhJuPiH8bT8GUwC+9CarZK5o= | github.com/containers/buildah v1.14.3-0.20200313093807-c0e60d444696/go.mod h1:OCorIy7yUrQ2hIZY5z/LhJuPiH8bT8GUwC+9CarZK5o= | ||||||
| github.com/containers/buildah v1.14.3-0.20200313154200-d26f437b2a46 h1:Zw8xYI3HATHra5Csm1k5GOXNCietwGR6D2kQVP5zw2w= | github.com/containers/buildah v1.14.3-0.20200313154200-d26f437b2a46 h1:Zw8xYI3HATHra5Csm1k5GOXNCietwGR6D2kQVP5zw2w= | ||||||
| github.com/containers/buildah v1.14.3-0.20200313154200-d26f437b2a46/go.mod h1:OCorIy7yUrQ2hIZY5z/LhJuPiH8bT8GUwC+9CarZK5o= | github.com/containers/buildah v1.14.3-0.20200313154200-d26f437b2a46/go.mod h1:OCorIy7yUrQ2hIZY5z/LhJuPiH8bT8GUwC+9CarZK5o= | ||||||
|  | github.com/containers/buildah v1.14.3 h1:GYH/o3ME76CI0bvjFp++Fr9mOTrqvK5FLGtLkCBrKic= | ||||||
|  | github.com/containers/buildah v1.14.3/go.mod h1:OmsmT+HR5i1o2U/0qm81fvI+m71hjd57gyf02z1Q7YI= | ||||||
| github.com/containers/common v0.4.2 h1:O5d1gj/xdpQdZi0MEivRQ/7AeRaVeHdbSP/bvShw458= | github.com/containers/common v0.4.2 h1:O5d1gj/xdpQdZi0MEivRQ/7AeRaVeHdbSP/bvShw458= | ||||||
| github.com/containers/common v0.4.2/go.mod h1:m62kenckrWi5rZx32kaLje2Og0hpf6NsaTBn6+b+Oys= | github.com/containers/common v0.4.2/go.mod h1:m62kenckrWi5rZx32kaLje2Og0hpf6NsaTBn6+b+Oys= | ||||||
| github.com/containers/common v0.5.0 h1:ZAef7h3oO46PcbTyfooZf8XLHrYad+GkhSu3EhH6P24= | github.com/containers/common v0.5.0 h1:ZAef7h3oO46PcbTyfooZf8XLHrYad+GkhSu3EhH6P24= | ||||||
|  | @ -371,6 +373,8 @@ github.com/openshift/api v0.0.0-20200106203948-7ab22a2c8316 h1:enQG2QUGwug4fR1yM | ||||||
| github.com/openshift/api v0.0.0-20200106203948-7ab22a2c8316/go.mod h1:dv+J0b/HWai0QnMVb37/H0v36klkLBi2TNpPeWDxX10= | github.com/openshift/api v0.0.0-20200106203948-7ab22a2c8316/go.mod h1:dv+J0b/HWai0QnMVb37/H0v36klkLBi2TNpPeWDxX10= | ||||||
| github.com/openshift/imagebuilder v1.1.1 h1:KAUR31p8UBJdfVO42azWgb+LeMAed2zaKQ19e0C0X2I= | github.com/openshift/imagebuilder v1.1.1 h1:KAUR31p8UBJdfVO42azWgb+LeMAed2zaKQ19e0C0X2I= | ||||||
| github.com/openshift/imagebuilder v1.1.1/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | github.com/openshift/imagebuilder v1.1.1/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | ||||||
|  | github.com/openshift/imagebuilder v1.1.2 h1:vCO8hZQR/4uzo+j0PceBH5aKFcvCDM43UzUGOYQN+Go= | ||||||
|  | github.com/openshift/imagebuilder v1.1.2/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | ||||||
| github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= | github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= | ||||||
| github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | ||||||
| github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= | github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= | ||||||
|  |  | ||||||
|  | @ -0,0 +1,90 @@ | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package log | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"sync/atomic" | ||||||
|  | 
 | ||||||
|  | 	"github.com/sirupsen/logrus" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	// G is an alias for GetLogger.
 | ||||||
|  | 	//
 | ||||||
|  | 	// We may want to define this locally to a package to get package tagged log
 | ||||||
|  | 	// messages.
 | ||||||
|  | 	G = GetLogger | ||||||
|  | 
 | ||||||
|  | 	// L is an alias for the standard logger.
 | ||||||
|  | 	L = logrus.NewEntry(logrus.StandardLogger()) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ( | ||||||
|  | 	loggerKey struct{} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // TraceLevel is the log level for tracing. Trace level is lower than debug level,
 | ||||||
|  | // and is usually used to trace detailed behavior of the program.
 | ||||||
|  | const TraceLevel = logrus.Level(uint32(logrus.DebugLevel + 1)) | ||||||
|  | 
 | ||||||
|  | // RFC3339NanoFixed is time.RFC3339Nano with nanoseconds padded using zeros to
 | ||||||
|  | // ensure the formatted time is always the same number of characters.
 | ||||||
|  | const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" | ||||||
|  | 
 | ||||||
|  | // ParseLevel takes a string level and returns the Logrus log level constant.
 | ||||||
|  | // It supports trace level.
 | ||||||
|  | func ParseLevel(lvl string) (logrus.Level, error) { | ||||||
|  | 	if lvl == "trace" { | ||||||
|  | 		return TraceLevel, nil | ||||||
|  | 	} | ||||||
|  | 	return logrus.ParseLevel(lvl) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WithLogger returns a new context with the provided logger. Use in
 | ||||||
|  | // combination with logger.WithField(s) for great effect.
 | ||||||
|  | func WithLogger(ctx context.Context, logger *logrus.Entry) context.Context { | ||||||
|  | 	return context.WithValue(ctx, loggerKey{}, logger) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetLogger retrieves the current logger from the context. If no logger is
 | ||||||
|  | // available, the default logger is returned.
 | ||||||
|  | func GetLogger(ctx context.Context) *logrus.Entry { | ||||||
|  | 	logger := ctx.Value(loggerKey{}) | ||||||
|  | 
 | ||||||
|  | 	if logger == nil { | ||||||
|  | 		return L | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return logger.(*logrus.Entry) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Trace logs a message at level Trace with the log entry passed-in.
 | ||||||
|  | func Trace(e *logrus.Entry, args ...interface{}) { | ||||||
|  | 	level := logrus.Level(atomic.LoadUint32((*uint32)(&e.Logger.Level))) | ||||||
|  | 	if level >= TraceLevel { | ||||||
|  | 		e.Debug(args...) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Tracef logs a message at level Trace with the log entry passed-in.
 | ||||||
|  | func Tracef(e *logrus.Entry, format string, args ...interface{}) { | ||||||
|  | 	level := logrus.Level(atomic.LoadUint32((*uint32)(&e.Logger.Level))) | ||||||
|  | 	if level >= TraceLevel { | ||||||
|  | 		e.Debugf(format, args...) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,229 @@ | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package platforms | ||||||
|  | 
 | ||||||
|  | import specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
|  | 
 | ||||||
|  | // MatchComparer is able to match and compare platforms to
 | ||||||
|  | // filter and sort platforms.
 | ||||||
|  | type MatchComparer interface { | ||||||
|  | 	Matcher | ||||||
|  | 
 | ||||||
|  | 	Less(specs.Platform, specs.Platform) bool | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Only returns a match comparer for a single platform
 | ||||||
|  | // using default resolution logic for the platform.
 | ||||||
|  | //
 | ||||||
|  | // For ARMv8, will also match ARMv7, ARMv6 and ARMv5 (for 32bit runtimes)
 | ||||||
|  | // For ARMv7, will also match ARMv6 and ARMv5
 | ||||||
|  | // For ARMv6, will also match ARMv5
 | ||||||
|  | func Only(platform specs.Platform) MatchComparer { | ||||||
|  | 	platform = Normalize(platform) | ||||||
|  | 	if platform.Architecture == "arm" { | ||||||
|  | 		if platform.Variant == "v8" { | ||||||
|  | 			return orderedPlatformComparer{ | ||||||
|  | 				matchers: []Matcher{ | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: platform, | ||||||
|  | 					}, | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: specs.Platform{ | ||||||
|  | 							Architecture: platform.Architecture, | ||||||
|  | 							OS:           platform.OS, | ||||||
|  | 							OSVersion:    platform.OSVersion, | ||||||
|  | 							OSFeatures:   platform.OSFeatures, | ||||||
|  | 							Variant:      "v7", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: specs.Platform{ | ||||||
|  | 							Architecture: platform.Architecture, | ||||||
|  | 							OS:           platform.OS, | ||||||
|  | 							OSVersion:    platform.OSVersion, | ||||||
|  | 							OSFeatures:   platform.OSFeatures, | ||||||
|  | 							Variant:      "v6", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: specs.Platform{ | ||||||
|  | 							Architecture: platform.Architecture, | ||||||
|  | 							OS:           platform.OS, | ||||||
|  | 							OSVersion:    platform.OSVersion, | ||||||
|  | 							OSFeatures:   platform.OSFeatures, | ||||||
|  | 							Variant:      "v5", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if platform.Variant == "v7" { | ||||||
|  | 			return orderedPlatformComparer{ | ||||||
|  | 				matchers: []Matcher{ | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: platform, | ||||||
|  | 					}, | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: specs.Platform{ | ||||||
|  | 							Architecture: platform.Architecture, | ||||||
|  | 							OS:           platform.OS, | ||||||
|  | 							OSVersion:    platform.OSVersion, | ||||||
|  | 							OSFeatures:   platform.OSFeatures, | ||||||
|  | 							Variant:      "v6", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: specs.Platform{ | ||||||
|  | 							Architecture: platform.Architecture, | ||||||
|  | 							OS:           platform.OS, | ||||||
|  | 							OSVersion:    platform.OSVersion, | ||||||
|  | 							OSFeatures:   platform.OSFeatures, | ||||||
|  | 							Variant:      "v5", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if platform.Variant == "v6" { | ||||||
|  | 			return orderedPlatformComparer{ | ||||||
|  | 				matchers: []Matcher{ | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: platform, | ||||||
|  | 					}, | ||||||
|  | 					&matcher{ | ||||||
|  | 						Platform: specs.Platform{ | ||||||
|  | 							Architecture: platform.Architecture, | ||||||
|  | 							OS:           platform.OS, | ||||||
|  | 							OSVersion:    platform.OSVersion, | ||||||
|  | 							OSFeatures:   platform.OSFeatures, | ||||||
|  | 							Variant:      "v5", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return singlePlatformComparer{ | ||||||
|  | 		Matcher: &matcher{ | ||||||
|  | 			Platform: platform, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Ordered returns a platform MatchComparer which matches any of the platforms
 | ||||||
|  | // but orders them in order they are provided.
 | ||||||
|  | func Ordered(platforms ...specs.Platform) MatchComparer { | ||||||
|  | 	matchers := make([]Matcher, len(platforms)) | ||||||
|  | 	for i := range platforms { | ||||||
|  | 		matchers[i] = NewMatcher(platforms[i]) | ||||||
|  | 	} | ||||||
|  | 	return orderedPlatformComparer{ | ||||||
|  | 		matchers: matchers, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Any returns a platform MatchComparer which matches any of the platforms
 | ||||||
|  | // with no preference for ordering.
 | ||||||
|  | func Any(platforms ...specs.Platform) MatchComparer { | ||||||
|  | 	matchers := make([]Matcher, len(platforms)) | ||||||
|  | 	for i := range platforms { | ||||||
|  | 		matchers[i] = NewMatcher(platforms[i]) | ||||||
|  | 	} | ||||||
|  | 	return anyPlatformComparer{ | ||||||
|  | 		matchers: matchers, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // All is a platform MatchComparer which matches all platforms
 | ||||||
|  | // with preference for ordering.
 | ||||||
|  | var All MatchComparer = allPlatformComparer{} | ||||||
|  | 
 | ||||||
|  | type singlePlatformComparer struct { | ||||||
|  | 	Matcher | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c singlePlatformComparer) Less(p1, p2 specs.Platform) bool { | ||||||
|  | 	return c.Match(p1) && !c.Match(p2) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type orderedPlatformComparer struct { | ||||||
|  | 	matchers []Matcher | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c orderedPlatformComparer) Match(platform specs.Platform) bool { | ||||||
|  | 	for _, m := range c.matchers { | ||||||
|  | 		if m.Match(platform) { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c orderedPlatformComparer) Less(p1 specs.Platform, p2 specs.Platform) bool { | ||||||
|  | 	for _, m := range c.matchers { | ||||||
|  | 		p1m := m.Match(p1) | ||||||
|  | 		p2m := m.Match(p2) | ||||||
|  | 		if p1m && !p2m { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		if p1m || p2m { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type anyPlatformComparer struct { | ||||||
|  | 	matchers []Matcher | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c anyPlatformComparer) Match(platform specs.Platform) bool { | ||||||
|  | 	for _, m := range c.matchers { | ||||||
|  | 		if m.Match(platform) { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c anyPlatformComparer) Less(p1, p2 specs.Platform) bool { | ||||||
|  | 	var p1m, p2m bool | ||||||
|  | 	for _, m := range c.matchers { | ||||||
|  | 		if !p1m && m.Match(p1) { | ||||||
|  | 			p1m = true | ||||||
|  | 		} | ||||||
|  | 		if !p2m && m.Match(p2) { | ||||||
|  | 			p2m = true | ||||||
|  | 		} | ||||||
|  | 		if p1m && p2m { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// If one matches, and the other does, sort match first
 | ||||||
|  | 	return p1m && !p2m | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type allPlatformComparer struct{} | ||||||
|  | 
 | ||||||
|  | func (allPlatformComparer) Match(specs.Platform) bool { | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (allPlatformComparer) Less(specs.Platform, specs.Platform) bool { | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | @ -0,0 +1,117 @@ | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package platforms | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"os" | ||||||
|  | 	"runtime" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"github.com/containerd/containerd/errdefs" | ||||||
|  | 	"github.com/containerd/containerd/log" | ||||||
|  | 	"github.com/pkg/errors" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Present the ARM instruction set architecture, eg: v7, v8
 | ||||||
|  | var cpuVariant string | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	if isArmArch(runtime.GOARCH) { | ||||||
|  | 		cpuVariant = getCPUVariant() | ||||||
|  | 	} else { | ||||||
|  | 		cpuVariant = "" | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // For Linux, the kernel has already detected the ABI, ISA and Features.
 | ||||||
|  | // So we don't need to access the ARM registers to detect platform information
 | ||||||
|  | // by ourselves. We can just parse these information from /proc/cpuinfo
 | ||||||
|  | func getCPUInfo(pattern string) (info string, err error) { | ||||||
|  | 	if !isLinuxOS(runtime.GOOS) { | ||||||
|  | 		return "", errors.Wrapf(errdefs.ErrNotImplemented, "getCPUInfo for OS %s", runtime.GOOS) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cpuinfo, err := os.Open("/proc/cpuinfo") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	defer cpuinfo.Close() | ||||||
|  | 
 | ||||||
|  | 	// Start to Parse the Cpuinfo line by line. For SMP SoC, we parse
 | ||||||
|  | 	// the first core is enough.
 | ||||||
|  | 	scanner := bufio.NewScanner(cpuinfo) | ||||||
|  | 	for scanner.Scan() { | ||||||
|  | 		newline := scanner.Text() | ||||||
|  | 		list := strings.Split(newline, ":") | ||||||
|  | 
 | ||||||
|  | 		if len(list) > 1 && strings.EqualFold(strings.TrimSpace(list[0]), pattern) { | ||||||
|  | 			return strings.TrimSpace(list[1]), nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Check whether the scanner encountered errors
 | ||||||
|  | 	err = scanner.Err() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return "", errors.Wrapf(errdefs.ErrNotFound, "getCPUInfo for pattern: %s", pattern) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func getCPUVariant() string { | ||||||
|  | 	if runtime.GOOS == "windows" { | ||||||
|  | 		// Windows only supports v7 for ARM32 and v8 for ARM64 and so we can use
 | ||||||
|  | 		// runtime.GOARCH to determine the variants
 | ||||||
|  | 		var variant string | ||||||
|  | 		switch runtime.GOARCH { | ||||||
|  | 		case "arm64": | ||||||
|  | 			variant = "v8" | ||||||
|  | 		case "arm": | ||||||
|  | 			variant = "v7" | ||||||
|  | 		default: | ||||||
|  | 			variant = "unknown" | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return variant | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	variant, err := getCPUInfo("Cpu architecture") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.L.WithError(err).Error("failure getting variant") | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch variant { | ||||||
|  | 	case "8", "AArch64": | ||||||
|  | 		variant = "v8" | ||||||
|  | 	case "7", "7M", "?(12)", "?(13)", "?(14)", "?(15)", "?(16)", "?(17)": | ||||||
|  | 		variant = "v7" | ||||||
|  | 	case "6", "6TEJ": | ||||||
|  | 		variant = "v6" | ||||||
|  | 	case "5", "5T", "5TE", "5TEJ": | ||||||
|  | 		variant = "v5" | ||||||
|  | 	case "4", "4T": | ||||||
|  | 		variant = "v4" | ||||||
|  | 	case "3": | ||||||
|  | 		variant = "v3" | ||||||
|  | 	default: | ||||||
|  | 		variant = "unknown" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return variant | ||||||
|  | } | ||||||
|  | @ -0,0 +1,114 @@ | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package platforms | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"runtime" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // isLinuxOS returns true if the operating system is Linux.
 | ||||||
|  | //
 | ||||||
|  | // The OS value should be normalized before calling this function.
 | ||||||
|  | func isLinuxOS(os string) bool { | ||||||
|  | 	return os == "linux" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // These function are generated from https://golang.org/src/go/build/syslist.go.
 | ||||||
|  | //
 | ||||||
|  | // We use switch statements because they are slightly faster than map lookups
 | ||||||
|  | // and use a little less memory.
 | ||||||
|  | 
 | ||||||
|  | // isKnownOS returns true if we know about the operating system.
 | ||||||
|  | //
 | ||||||
|  | // The OS value should be normalized before calling this function.
 | ||||||
|  | func isKnownOS(os string) bool { | ||||||
|  | 	switch os { | ||||||
|  | 	case "aix", "android", "darwin", "dragonfly", "freebsd", "hurd", "illumos", "js", "linux", "nacl", "netbsd", "openbsd", "plan9", "solaris", "windows", "zos": | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // isArmArch returns true if the architecture is ARM.
 | ||||||
|  | //
 | ||||||
|  | // The arch value should be normalized before being passed to this function.
 | ||||||
|  | func isArmArch(arch string) bool { | ||||||
|  | 	switch arch { | ||||||
|  | 	case "arm", "arm64": | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // isKnownArch returns true if we know about the architecture.
 | ||||||
|  | //
 | ||||||
|  | // The arch value should be normalized before being passed to this function.
 | ||||||
|  | func isKnownArch(arch string) bool { | ||||||
|  | 	switch arch { | ||||||
|  | 	case "386", "amd64", "amd64p32", "arm", "armbe", "arm64", "arm64be", "ppc64", "ppc64le", "mips", "mipsle", "mips64", "mips64le", "mips64p32", "mips64p32le", "ppc", "riscv", "riscv64", "s390", "s390x", "sparc", "sparc64", "wasm": | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func normalizeOS(os string) string { | ||||||
|  | 	if os == "" { | ||||||
|  | 		return runtime.GOOS | ||||||
|  | 	} | ||||||
|  | 	os = strings.ToLower(os) | ||||||
|  | 
 | ||||||
|  | 	switch os { | ||||||
|  | 	case "macos": | ||||||
|  | 		os = "darwin" | ||||||
|  | 	} | ||||||
|  | 	return os | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // normalizeArch normalizes the architecture.
 | ||||||
|  | func normalizeArch(arch, variant string) (string, string) { | ||||||
|  | 	arch, variant = strings.ToLower(arch), strings.ToLower(variant) | ||||||
|  | 	switch arch { | ||||||
|  | 	case "i386": | ||||||
|  | 		arch = "386" | ||||||
|  | 		variant = "" | ||||||
|  | 	case "x86_64", "x86-64": | ||||||
|  | 		arch = "amd64" | ||||||
|  | 		variant = "" | ||||||
|  | 	case "aarch64", "arm64": | ||||||
|  | 		arch = "arm64" | ||||||
|  | 		switch variant { | ||||||
|  | 		case "8", "v8": | ||||||
|  | 			variant = "" | ||||||
|  | 		} | ||||||
|  | 	case "armhf": | ||||||
|  | 		arch = "arm" | ||||||
|  | 		variant = "v7" | ||||||
|  | 	case "armel": | ||||||
|  | 		arch = "arm" | ||||||
|  | 		variant = "v6" | ||||||
|  | 	case "arm": | ||||||
|  | 		switch variant { | ||||||
|  | 		case "", "7": | ||||||
|  | 			variant = "v7" | ||||||
|  | 		case "5", "6", "8": | ||||||
|  | 			variant = "v" + variant | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return arch, variant | ||||||
|  | } | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package platforms | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"runtime" | ||||||
|  | 
 | ||||||
|  | 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // DefaultString returns the default string specifier for the platform.
 | ||||||
|  | func DefaultString() string { | ||||||
|  | 	return Format(DefaultSpec()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DefaultSpec returns the current platform's default platform specification.
 | ||||||
|  | func DefaultSpec() specs.Platform { | ||||||
|  | 	return specs.Platform{ | ||||||
|  | 		OS:           runtime.GOOS, | ||||||
|  | 		Architecture: runtime.GOARCH, | ||||||
|  | 		// The Variant field will be empty if arch != ARM.
 | ||||||
|  | 		Variant: cpuVariant, | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								vendor/github.com/containerd/containerd/platforms/defaults_unix.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										24
									
								
								vendor/github.com/containerd/containerd/platforms/defaults_unix.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | // +build !windows
 | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package platforms | ||||||
|  | 
 | ||||||
|  | // Default returns the default matcher for the platform.
 | ||||||
|  | func Default() MatchComparer { | ||||||
|  | 	return Only(DefaultSpec()) | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								vendor/github.com/containerd/containerd/platforms/defaults_windows.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										31
									
								
								vendor/github.com/containerd/containerd/platforms/defaults_windows.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | // +build windows
 | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package platforms | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Default returns the default matcher for the platform.
 | ||||||
|  | func Default() MatchComparer { | ||||||
|  | 	return Ordered(DefaultSpec(), specs.Platform{ | ||||||
|  | 		OS:           "linux", | ||||||
|  | 		Architecture: "amd64", | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,279 @@ | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  | 
 | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | // Package platforms provides a toolkit for normalizing, matching and
 | ||||||
|  | // specifying container platforms.
 | ||||||
|  | //
 | ||||||
|  | // Centered around OCI platform specifications, we define a string-based
 | ||||||
|  | // specifier syntax that can be used for user input. With a specifier, users
 | ||||||
|  | // only need to specify the parts of the platform that are relevant to their
 | ||||||
|  | // context, providing an operating system or architecture or both.
 | ||||||
|  | //
 | ||||||
|  | // How do I use this package?
 | ||||||
|  | //
 | ||||||
|  | // The vast majority of use cases should simply use the match function with
 | ||||||
|  | // user input. The first step is to parse a specifier into a matcher:
 | ||||||
|  | //
 | ||||||
|  | //   m, err := Parse("linux")
 | ||||||
|  | //   if err != nil { ... }
 | ||||||
|  | //
 | ||||||
|  | // Once you have a matcher, use it to match against the platform declared by a
 | ||||||
|  | // component, typically from an image or runtime. Since extracting an images
 | ||||||
|  | // platform is a little more involved, we'll use an example against the
 | ||||||
|  | // platform default:
 | ||||||
|  | //
 | ||||||
|  | //   if ok := m.Match(Default()); !ok { /* doesn't match */ }
 | ||||||
|  | //
 | ||||||
|  | // This can be composed in loops for resolving runtimes or used as a filter for
 | ||||||
|  | // fetch and select images.
 | ||||||
|  | //
 | ||||||
|  | // More details of the specifier syntax and platform spec follow.
 | ||||||
|  | //
 | ||||||
|  | // Declaring Platform Support
 | ||||||
|  | //
 | ||||||
|  | // Components that have strict platform requirements should use the OCI
 | ||||||
|  | // platform specification to declare their support. Typically, this will be
 | ||||||
|  | // images and runtimes that should make these declaring which platform they
 | ||||||
|  | // support specifically. This looks roughly as follows:
 | ||||||
|  | //
 | ||||||
|  | //   type Platform struct {
 | ||||||
|  | //	   Architecture string
 | ||||||
|  | //	   OS           string
 | ||||||
|  | //	   Variant      string
 | ||||||
|  | //   }
 | ||||||
|  | //
 | ||||||
|  | // Most images and runtimes should at least set Architecture and OS, according
 | ||||||
|  | // to their GOARCH and GOOS values, respectively (follow the OCI image
 | ||||||
|  | // specification when in doubt). ARM should set variant under certain
 | ||||||
|  | // discussions, which are outlined below.
 | ||||||
|  | //
 | ||||||
|  | // Platform Specifiers
 | ||||||
|  | //
 | ||||||
|  | // While the OCI platform specifications provide a tool for components to
 | ||||||
|  | // specify structured information, user input typically doesn't need the full
 | ||||||
|  | // context and much can be inferred. To solve this problem, we introduced
 | ||||||
|  | // "specifiers". A specifier has the format
 | ||||||
|  | // `<os>|<arch>|<os>/<arch>[/<variant>]`.  The user can provide either the
 | ||||||
|  | // operating system or the architecture or both.
 | ||||||
|  | //
 | ||||||
|  | // An example of a common specifier is `linux/amd64`. If the host has a default
 | ||||||
|  | // of runtime that matches this, the user can simply provide the component that
 | ||||||
|  | // matters. For example, if a image provides amd64 and arm64 support, the
 | ||||||
|  | // operating system, `linux` can be inferred, so they only have to provide
 | ||||||
|  | // `arm64` or `amd64`. Similar behavior is implemented for operating systems,
 | ||||||
|  | // where the architecture may be known but a runtime may support images from
 | ||||||
|  | // different operating systems.
 | ||||||
|  | //
 | ||||||
|  | // Normalization
 | ||||||
|  | //
 | ||||||
|  | // Because not all users are familiar with the way the Go runtime represents
 | ||||||
|  | // platforms, several normalizations have been provided to make this package
 | ||||||
|  | // easier to user.
 | ||||||
|  | //
 | ||||||
|  | // The following are performed for architectures:
 | ||||||
|  | //
 | ||||||
|  | //   Value    Normalized
 | ||||||
|  | //   aarch64  arm64
 | ||||||
|  | //   armhf    arm
 | ||||||
|  | //   armel    arm/v6
 | ||||||
|  | //   i386     386
 | ||||||
|  | //   x86_64   amd64
 | ||||||
|  | //   x86-64   amd64
 | ||||||
|  | //
 | ||||||
|  | // We also normalize the operating system `macos` to `darwin`.
 | ||||||
|  | //
 | ||||||
|  | // ARM Support
 | ||||||
|  | //
 | ||||||
|  | // To qualify ARM architecture, the Variant field is used to qualify the arm
 | ||||||
|  | // version. The most common arm version, v7, is represented without the variant
 | ||||||
|  | // unless it is explicitly provided. This is treated as equivalent to armhf. A
 | ||||||
|  | // previous architecture, armel, will be normalized to arm/v6.
 | ||||||
|  | //
 | ||||||
|  | // While these normalizations are provided, their support on arm platforms has
 | ||||||
|  | // not yet been fully implemented and tested.
 | ||||||
|  | package platforms | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"regexp" | ||||||
|  | 	"runtime" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"github.com/containerd/containerd/errdefs" | ||||||
|  | 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
|  | 	"github.com/pkg/errors" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	specifierRe = regexp.MustCompile(`^[A-Za-z0-9_-]+$`) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Matcher matches platforms specifications, provided by an image or runtime.
 | ||||||
|  | type Matcher interface { | ||||||
|  | 	Match(platform specs.Platform) bool | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewMatcher returns a simple matcher based on the provided platform
 | ||||||
|  | // specification. The returned matcher only looks for equality based on os,
 | ||||||
|  | // architecture and variant.
 | ||||||
|  | //
 | ||||||
|  | // One may implement their own matcher if this doesn't provide the required
 | ||||||
|  | // functionality.
 | ||||||
|  | //
 | ||||||
|  | // Applications should opt to use `Match` over directly parsing specifiers.
 | ||||||
|  | func NewMatcher(platform specs.Platform) Matcher { | ||||||
|  | 	return &matcher{ | ||||||
|  | 		Platform: Normalize(platform), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type matcher struct { | ||||||
|  | 	specs.Platform | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *matcher) Match(platform specs.Platform) bool { | ||||||
|  | 	normalized := Normalize(platform) | ||||||
|  | 	return m.OS == normalized.OS && | ||||||
|  | 		m.Architecture == normalized.Architecture && | ||||||
|  | 		m.Variant == normalized.Variant | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *matcher) String() string { | ||||||
|  | 	return Format(m.Platform) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Parse parses the platform specifier syntax into a platform declaration.
 | ||||||
|  | //
 | ||||||
|  | // Platform specifiers are in the format `<os>|<arch>|<os>/<arch>[/<variant>]`.
 | ||||||
|  | // The minimum required information for a platform specifier is the operating
 | ||||||
|  | // system or architecture. If there is only a single string (no slashes), the
 | ||||||
|  | // value will be matched against the known set of operating systems, then fall
 | ||||||
|  | // back to the known set of architectures. The missing component will be
 | ||||||
|  | // inferred based on the local environment.
 | ||||||
|  | func Parse(specifier string) (specs.Platform, error) { | ||||||
|  | 	if strings.Contains(specifier, "*") { | ||||||
|  | 		// TODO(stevvooe): need to work out exact wildcard handling
 | ||||||
|  | 		return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: wildcards not yet supported", specifier) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	parts := strings.Split(specifier, "/") | ||||||
|  | 
 | ||||||
|  | 	for _, part := range parts { | ||||||
|  | 		if !specifierRe.MatchString(part) { | ||||||
|  | 			return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q is an invalid component of %q: platform specifier component must match %q", part, specifier, specifierRe.String()) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var p specs.Platform | ||||||
|  | 	switch len(parts) { | ||||||
|  | 	case 1: | ||||||
|  | 		// in this case, we will test that the value might be an OS, then look
 | ||||||
|  | 		// it up. If it is not known, we'll treat it as an architecture. Since
 | ||||||
|  | 		// we have very little information about the platform here, we are
 | ||||||
|  | 		// going to be a little more strict if we don't know about the argument
 | ||||||
|  | 		// value.
 | ||||||
|  | 		p.OS = normalizeOS(parts[0]) | ||||||
|  | 		if isKnownOS(p.OS) { | ||||||
|  | 			// picks a default architecture
 | ||||||
|  | 			p.Architecture = runtime.GOARCH | ||||||
|  | 			if p.Architecture == "arm" { | ||||||
|  | 				// TODO(stevvooe): Resolve arm variant, if not v6 (default)
 | ||||||
|  | 				return specs.Platform{}, errors.Wrapf(errdefs.ErrNotImplemented, "arm support not fully implemented") | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			return p, nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		p.Architecture, p.Variant = normalizeArch(parts[0], "") | ||||||
|  | 		if p.Architecture == "arm" && p.Variant == "v7" { | ||||||
|  | 			p.Variant = "" | ||||||
|  | 		} | ||||||
|  | 		if isKnownArch(p.Architecture) { | ||||||
|  | 			p.OS = runtime.GOOS | ||||||
|  | 			return p, nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: unknown operating system or architecture", specifier) | ||||||
|  | 	case 2: | ||||||
|  | 		// In this case, we treat as a regular os/arch pair. We don't care
 | ||||||
|  | 		// about whether or not we know of the platform.
 | ||||||
|  | 		p.OS = normalizeOS(parts[0]) | ||||||
|  | 		p.Architecture, p.Variant = normalizeArch(parts[1], "") | ||||||
|  | 		if p.Architecture == "arm" && p.Variant == "v7" { | ||||||
|  | 			p.Variant = "" | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return p, nil | ||||||
|  | 	case 3: | ||||||
|  | 		// we have a fully specified variant, this is rare
 | ||||||
|  | 		p.OS = normalizeOS(parts[0]) | ||||||
|  | 		p.Architecture, p.Variant = normalizeArch(parts[1], parts[2]) | ||||||
|  | 		if p.Architecture == "arm64" && p.Variant == "" { | ||||||
|  | 			p.Variant = "v8" | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return p, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: cannot parse platform specifier", specifier) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MustParse is like Parses but panics if the specifier cannot be parsed.
 | ||||||
|  | // Simplifies initialization of global variables.
 | ||||||
|  | func MustParse(specifier string) specs.Platform { | ||||||
|  | 	p, err := Parse(specifier) | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic("platform: Parse(" + strconv.Quote(specifier) + "): " + err.Error()) | ||||||
|  | 	} | ||||||
|  | 	return p | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Format returns a string specifier from the provided platform specification.
 | ||||||
|  | func Format(platform specs.Platform) string { | ||||||
|  | 	if platform.OS == "" { | ||||||
|  | 		return "unknown" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return joinNotEmpty(platform.OS, platform.Architecture, platform.Variant) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func joinNotEmpty(s ...string) string { | ||||||
|  | 	var ss []string | ||||||
|  | 	for _, s := range s { | ||||||
|  | 		if s == "" { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		ss = append(ss, s) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return strings.Join(ss, "/") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Normalize validates and translate the platform to the canonical value.
 | ||||||
|  | //
 | ||||||
|  | // For example, if "Aarch64" is encountered, we change it to "arm64" or if
 | ||||||
|  | // "x86_64" is encountered, it becomes "amd64".
 | ||||||
|  | func Normalize(platform specs.Platform) specs.Platform { | ||||||
|  | 	platform.OS = normalizeOS(platform.OS) | ||||||
|  | 	platform.Architecture, platform.Variant = normalizeArch(platform.Architecture, platform.Variant) | ||||||
|  | 
 | ||||||
|  | 	// these fields are deprecated, remove them
 | ||||||
|  | 	platform.OSFeatures = nil | ||||||
|  | 	platform.OSVersion = "" | ||||||
|  | 
 | ||||||
|  | 	return platform | ||||||
|  | } | ||||||
|  | @ -2,6 +2,22 @@ | ||||||
| 
 | 
 | ||||||
| # Changelog | # Changelog | ||||||
| 
 | 
 | ||||||
|  | ## v1.14.3 (2020-03-17) | ||||||
|  |     Update containers/storage to v1.16.5 | ||||||
|  |     Bump github.com/containers/storage from 1.16.2 to 1.16.4 | ||||||
|  |     Bump github.com/openshift/imagebuilder from 1.1.1 to 1.1.2 | ||||||
|  |     Update github.com/openshift/imagebuilder vendoring | ||||||
|  |     Update unshare man page to fix script example | ||||||
|  |     Fix compilation errors on non linux platforms | ||||||
|  |     Bump containers/common and opencontainers/selinux versions | ||||||
|  |     Add tests for volume ownership | ||||||
|  |     Preserve volume uid and gid through subsequent commands | ||||||
|  |     Fix FORWARD_NULL errors found by Coverity | ||||||
|  |     Bump github.com/containers/storage from 1.16.1 to 1.16.2 | ||||||
|  |     Fix errors found by codespell | ||||||
|  |     Bump back to v1.15.0-dev | ||||||
|  |     Add Pull Request Template | ||||||
|  | 
 | ||||||
| ## v1.14.2 (2020-03-03) | ## v1.14.2 (2020-03-03) | ||||||
|     Add Buildah pull request template |     Add Buildah pull request template | ||||||
|     Bump to containers/storage v1.16.1 |     Bump to containers/storage v1.16.1 | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ const ( | ||||||
| 	Package = "buildah" | 	Package = "buildah" | ||||||
| 	// Version for the Package.  Bump version in contrib/rpm/buildah.spec
 | 	// Version for the Package.  Bump version in contrib/rpm/buildah.spec
 | ||||||
| 	// too.
 | 	// too.
 | ||||||
| 	Version = "1.15.0-dev" | 	Version = "1.14.3" | ||||||
| 	// The value we use to identify what type of information, currently a
 | 	// The value we use to identify what type of information, currently a
 | ||||||
| 	// serialized Builder structure, we are using as per-container state.
 | 	// serialized Builder structure, we are using as per-container state.
 | ||||||
| 	// This should only be changed when we make incompatible changes to
 | 	// This should only be changed when we make incompatible changes to
 | ||||||
|  |  | ||||||
|  | @ -1,3 +1,19 @@ | ||||||
|  | - Changelog for v1.14.3 (2020-03-17) | ||||||
|  |   * Update containers/storage to v1.16.5 | ||||||
|  |   * Bump github.com/containers/storage from 1.16.2 to 1.16.4 | ||||||
|  |   * Bump github.com/openshift/imagebuilder from 1.1.1 to 1.1.2 | ||||||
|  |   * Update github.com/openshift/imagebuilder vendoring | ||||||
|  |   * Update unshare man page to fix script example | ||||||
|  |   * Fix compilation errors on non linux platforms | ||||||
|  |   * Bump containers/common and opencontainers/selinux versions | ||||||
|  |   * Add tests for volume ownership | ||||||
|  |   * Preserve volume uid and gid through subsequent commands | ||||||
|  |   * Fix FORWARD_NULL errors found by Coverity | ||||||
|  |   * Bump github.com/containers/storage from 1.16.1 to 1.16.2 | ||||||
|  |   * Fix errors found by codespell | ||||||
|  |   * Bump back to v1.15.0-dev | ||||||
|  |   * Add Pull Request Template | ||||||
|  | 
 | ||||||
| - Changelog for v1.14.2 (2020-03-03) | - Changelog for v1.14.2 (2020-03-03) | ||||||
|   * Add Buildah pull request template |   * Add Buildah pull request template | ||||||
|   * Bump to containers/storage v1.16.1 |   * Bump to containers/storage v1.16.1 | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ require ( | ||||||
| 	github.com/containernetworking/cni v0.7.2-0.20190904153231-83439463f784 | 	github.com/containernetworking/cni v0.7.2-0.20190904153231-83439463f784 | ||||||
| 	github.com/containers/common v0.5.0 | 	github.com/containers/common v0.5.0 | ||||||
| 	github.com/containers/image/v5 v5.2.1 | 	github.com/containers/image/v5 v5.2.1 | ||||||
| 	github.com/containers/storage v1.16.2 | 	github.com/containers/storage v1.16.5 | ||||||
| 	github.com/cyphar/filepath-securejoin v0.2.2 | 	github.com/cyphar/filepath-securejoin v0.2.2 | ||||||
| 	github.com/docker/distribution v2.7.1+incompatible | 	github.com/docker/distribution v2.7.1+incompatible | ||||||
| 	github.com/docker/go-metrics v0.0.1 // indirect | 	github.com/docker/go-metrics v0.0.1 // indirect | ||||||
|  | @ -27,7 +27,7 @@ require ( | ||||||
| 	github.com/opencontainers/runtime-tools v0.9.0 | 	github.com/opencontainers/runtime-tools v0.9.0 | ||||||
| 	github.com/opencontainers/selinux v1.4.0 | 	github.com/opencontainers/selinux v1.4.0 | ||||||
| 	github.com/openshift/api v0.0.0-20200106203948-7ab22a2c8316 | 	github.com/openshift/api v0.0.0-20200106203948-7ab22a2c8316 | ||||||
| 	github.com/openshift/imagebuilder v1.1.1 | 	github.com/openshift/imagebuilder v1.1.2 | ||||||
| 	github.com/pkg/errors v0.9.1 | 	github.com/pkg/errors v0.9.1 | ||||||
| 	github.com/seccomp/containers-golang v0.0.0-20190312124753-8ca8945ccf5f | 	github.com/seccomp/containers-golang v0.0.0-20190312124753-8ca8945ccf5f | ||||||
| 	github.com/seccomp/libseccomp-golang v0.9.1 | 	github.com/seccomp/libseccomp-golang v0.9.1 | ||||||
|  |  | ||||||
|  | @ -159,6 +159,12 @@ github.com/containers/storage v1.16.1 h1:gVLVqbqaoyopLJbcQ9PQdsnm8SzVy6Vw24fofwM | ||||||
| github.com/containers/storage v1.16.1/go.mod h1:toFp72SLn/iyJ6YbrnrZ0bW63aH2Qw3dA8JVwL4ADPo= | github.com/containers/storage v1.16.1/go.mod h1:toFp72SLn/iyJ6YbrnrZ0bW63aH2Qw3dA8JVwL4ADPo= | ||||||
| github.com/containers/storage v1.16.2 h1:S77Y+lmJcnGoPEZB2OOrTrRGyjT8viDCGyhVNNz78h8= | github.com/containers/storage v1.16.2 h1:S77Y+lmJcnGoPEZB2OOrTrRGyjT8viDCGyhVNNz78h8= | ||||||
| github.com/containers/storage v1.16.2/go.mod h1:/RNmsK01ajCL+VtMSi3W8kHzpBwN+Q5gLYWgfw5wlMg= | github.com/containers/storage v1.16.2/go.mod h1:/RNmsK01ajCL+VtMSi3W8kHzpBwN+Q5gLYWgfw5wlMg= | ||||||
|  | github.com/containers/storage v1.16.3 h1:bctiz1I+0TIivtXbrVmy02ZYlOA+IjKIJMzAMTBifj8= | ||||||
|  | github.com/containers/storage v1.16.3/go.mod h1:dNTv0+BaebIAOGgH34dPtwGPR+Km2fObcfOlFxYFwA0= | ||||||
|  | github.com/containers/storage v1.16.4 h1:+pEL9A1i11qy1j/MYvh8Y5vs79BBfA+hslyJq1iPOGc= | ||||||
|  | github.com/containers/storage v1.16.4/go.mod h1:SdysZeLKJOvfHYysUWg9OZUC3gdZWi5b2b7NC18VpPE= | ||||||
|  | github.com/containers/storage v1.16.5 h1:eHeWEhUEWX3VMIG1Vn1rEjfRoLHUQev3cwtA5zd89wk= | ||||||
|  | github.com/containers/storage v1.16.5/go.mod h1:SdysZeLKJOvfHYysUWg9OZUC3gdZWi5b2b7NC18VpPE= | ||||||
| github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= | github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= | ||||||
| github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | ||||||
| github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= | github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= | ||||||
|  | @ -380,10 +386,14 @@ github.com/klauspost/compress v1.10.0 h1:92XGj1AcYzA6UrVdd4qIIBrT8OroryvRvdmg/If | ||||||
| github.com/klauspost/compress v1.10.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | github.com/klauspost/compress v1.10.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | ||||||
| github.com/klauspost/compress v1.10.2 h1:Znfn6hXZAHaLPNnlqUYRrBSReFHYybslgv4PTiyz6P0= | github.com/klauspost/compress v1.10.2 h1:Znfn6hXZAHaLPNnlqUYRrBSReFHYybslgv4PTiyz6P0= | ||||||
| github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | ||||||
|  | github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= | ||||||
|  | github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | ||||||
| github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= | github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= | ||||||
| github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | ||||||
| github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM= | github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM= | ||||||
| github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | ||||||
|  | github.com/klauspost/pgzip v1.2.2 h1:8d4I0LDiieuGngsqlqOih9ker/NS0LX4V0i+EhiFWg0= | ||||||
|  | github.com/klauspost/pgzip v1.2.2/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | ||||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= | github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= | ||||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= | github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= | ||||||
|  | @ -516,6 +526,8 @@ github.com/openshift/imagebuilder v1.1.0 h1:oT704SkwMEzmIMU/+Uv1Wmvt+p10q3v2WuYM | ||||||
| github.com/openshift/imagebuilder v1.1.0/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | github.com/openshift/imagebuilder v1.1.0/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | ||||||
| github.com/openshift/imagebuilder v1.1.1 h1:KAUR31p8UBJdfVO42azWgb+LeMAed2zaKQ19e0C0X2I= | github.com/openshift/imagebuilder v1.1.1 h1:KAUR31p8UBJdfVO42azWgb+LeMAed2zaKQ19e0C0X2I= | ||||||
| github.com/openshift/imagebuilder v1.1.1/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | github.com/openshift/imagebuilder v1.1.1/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | ||||||
|  | github.com/openshift/imagebuilder v1.1.2 h1:vCO8hZQR/4uzo+j0PceBH5aKFcvCDM43UzUGOYQN+Go= | ||||||
|  | github.com/openshift/imagebuilder v1.1.2/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= | ||||||
| github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | ||||||
| github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= | github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= | ||||||
| github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= | github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= | ||||||
|  |  | ||||||
|  | @ -288,8 +288,12 @@ func NewBuilder(args map[string]string) *Builder { | ||||||
| 	for k, v := range builtinAllowedBuildArgs { | 	for k, v := range builtinAllowedBuildArgs { | ||||||
| 		allowed[k] = v | 		allowed[k] = v | ||||||
| 	} | 	} | ||||||
|  | 	provided := make(map[string]string) | ||||||
|  | 	for k, v := range args { | ||||||
|  | 		provided[k] = v | ||||||
|  | 	} | ||||||
| 	return &Builder{ | 	return &Builder{ | ||||||
| 		Args:        args, | 		Args:        provided, | ||||||
| 		AllowedArgs: allowed, | 		AllowedArgs: allowed, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -19,6 +19,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	docker "github.com/fsouza/go-dockerclient" | 	docker "github.com/fsouza/go-dockerclient" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/containerd/containerd/platforms" | ||||||
| 	"github.com/openshift/imagebuilder/signal" | 	"github.com/openshift/imagebuilder/signal" | ||||||
| 	"github.com/openshift/imagebuilder/strslice" | 	"github.com/openshift/imagebuilder/strslice" | ||||||
| ) | ) | ||||||
|  | @ -27,6 +28,27 @@ var ( | ||||||
| 	obRgex = regexp.MustCompile(`(?i)^\s*ONBUILD\s*`) | 	obRgex = regexp.MustCompile(`(?i)^\s*ONBUILD\s*`) | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var localspec = platforms.DefaultSpec() | ||||||
|  | 
 | ||||||
|  | // https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
 | ||||||
|  | var builtinBuildArgs = map[string]string{ | ||||||
|  | 	"TARGETPLATFORM": localspec.OS + "/" + localspec.Architecture, | ||||||
|  | 	"TARGETOS":       localspec.OS, | ||||||
|  | 	"TARGETARCH":     localspec.Architecture, | ||||||
|  | 	"TARGETVARIANT":  localspec.Variant, | ||||||
|  | 	"BUILDPLATFORM":  localspec.OS + "/" + localspec.Architecture, | ||||||
|  | 	"BUILDOS":        localspec.OS, | ||||||
|  | 	"BUILDARCH":      localspec.Architecture, | ||||||
|  | 	"BUILDVARIANT":   localspec.Variant, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	if localspec.Variant != "" { | ||||||
|  | 		builtinBuildArgs["TARGETPLATFORM"] = builtinBuildArgs["TARGETPLATFORM"] + "/" + localspec.Variant | ||||||
|  | 		builtinBuildArgs["BUILDPLATFORM"] = builtinBuildArgs["BUILDPLATFORM"] + "/" + localspec.Variant | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ENV foo bar
 | // ENV foo bar
 | ||||||
| //
 | //
 | ||||||
| // Sets the environment variable foo to bar, also makes interpolation
 | // Sets the environment variable foo to bar, also makes interpolation
 | ||||||
|  | @ -131,14 +153,16 @@ func add(b *Builder, args []string, attributes map[string]bool, flagArgs []strin | ||||||
| 	var chown string | 	var chown string | ||||||
| 	last := len(args) - 1 | 	last := len(args) - 1 | ||||||
| 	dest := makeAbsolute(args[last], b.RunConfig.WorkingDir) | 	dest := makeAbsolute(args[last], b.RunConfig.WorkingDir) | ||||||
| 	if len(flagArgs) > 0 { | 	for _, a := range flagArgs { | ||||||
| 		for _, arg := range flagArgs { | 		arg, err := ProcessWord(a, b.Env) | ||||||
| 			switch { | 		if err != nil { | ||||||
| 			case strings.HasPrefix(arg, "--chown="): | 			return err | ||||||
| 				chown = strings.TrimPrefix(arg, "--chown=") | 		} | ||||||
| 			default: | 		switch { | ||||||
| 				return fmt.Errorf("ADD only supports the --chown=<uid:gid> flag") | 		case strings.HasPrefix(arg, "--chown="): | ||||||
| 			} | 			chown = strings.TrimPrefix(arg, "--chown=") | ||||||
|  | 		default: | ||||||
|  | 			return fmt.Errorf("ADD only supports the --chown=<uid:gid> flag") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	b.PendingCopies = append(b.PendingCopies, Copy{Src: args[0:last], Dest: dest, Download: true, Chown: chown}) | 	b.PendingCopies = append(b.PendingCopies, Copy{Src: args[0:last], Dest: dest, Download: true, Chown: chown}) | ||||||
|  | @ -157,16 +181,18 @@ func dispatchCopy(b *Builder, args []string, attributes map[string]bool, flagArg | ||||||
| 	dest := makeAbsolute(args[last], b.RunConfig.WorkingDir) | 	dest := makeAbsolute(args[last], b.RunConfig.WorkingDir) | ||||||
| 	var chown string | 	var chown string | ||||||
| 	var from string | 	var from string | ||||||
| 	if len(flagArgs) > 0 { | 	for _, a := range flagArgs { | ||||||
| 		for _, arg := range flagArgs { | 		arg, err := ProcessWord(a, b.Env) | ||||||
| 			switch { | 		if err != nil { | ||||||
| 			case strings.HasPrefix(arg, "--chown="): | 			return err | ||||||
| 				chown = strings.TrimPrefix(arg, "--chown=") | 		} | ||||||
| 			case strings.HasPrefix(arg, "--from="): | 		switch { | ||||||
| 				from = strings.TrimPrefix(arg, "--from=") | 		case strings.HasPrefix(arg, "--chown="): | ||||||
| 			default: | 			chown = strings.TrimPrefix(arg, "--chown=") | ||||||
| 				return fmt.Errorf("COPY only supports the --chown=<uid:gid> and the --from=<image|stage> flags") | 		case strings.HasPrefix(arg, "--from="): | ||||||
| 			} | 			from = strings.TrimPrefix(arg, "--from=") | ||||||
|  | 		default: | ||||||
|  | 			return fmt.Errorf("COPY only supports the --chown=<uid:gid> and the --from=<image|stage> flags") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	b.PendingCopies = append(b.PendingCopies, Copy{From: from, Src: args[0:last], Dest: dest, Download: false, Chown: chown}) | 	b.PendingCopies = append(b.PendingCopies, Copy{From: from, Src: args[0:last], Dest: dest, Download: false, Chown: chown}) | ||||||
|  | @ -516,6 +542,8 @@ func healthcheck(b *Builder, args []string, attributes map[string]bool, flagArgs | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | var targetArgs = []string{"TARGETOS", "TARGETARCH", "TARGETVARIANT"} | ||||||
|  | 
 | ||||||
| // ARG name[=value]
 | // ARG name[=value]
 | ||||||
| //
 | //
 | ||||||
| // Adds the variable foo to the trusted list of variables that can be passed
 | // Adds the variable foo to the trusted list of variables that can be passed
 | ||||||
|  | @ -543,6 +571,26 @@ func arg(b *Builder, args []string, attributes map[string]bool, flagArgs []strin | ||||||
| 		name = parts[0] | 		name = parts[0] | ||||||
| 		value = parts[1] | 		value = parts[1] | ||||||
| 		hasDefault = true | 		hasDefault = true | ||||||
|  | 		if name == "TARGETPLATFORM" { | ||||||
|  | 			p, err := platforms.Parse(value) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return fmt.Errorf("error parsing TARGETPLATFORM argument") | ||||||
|  | 			} | ||||||
|  | 			for _, val := range targetArgs { | ||||||
|  | 				b.AllowedArgs[val] = true | ||||||
|  | 			} | ||||||
|  | 			b.Args["TARGETPLATFORM"] = p.OS + "/" + p.Architecture | ||||||
|  | 			b.Args["TARGETOS"] = p.OS | ||||||
|  | 			b.Args["TARGETARCH"] = p.Architecture | ||||||
|  | 			b.Args["TARGETVARIANT"] = p.Variant | ||||||
|  | 			if p.Variant != "" { | ||||||
|  | 				b.Args["TARGETPLATFORM"] = b.Args["TARGETPLATFORM"] + "/" + p.Variant | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} else if val, ok := builtinBuildArgs[arg]; ok { | ||||||
|  | 		name = arg | ||||||
|  | 		value = val | ||||||
|  | 		hasDefault = true | ||||||
| 	} else { | 	} else { | ||||||
| 		name = arg | 		name = arg | ||||||
| 		hasDefault = false | 		hasDefault = false | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| github.com/Azure/go-ansiterm d6e3b3328b783f23731bc4d058875b0371ff8109 | github.com/Azure/go-ansiterm d6e3b3328b783f23731bc4d058875b0371ff8109 | ||||||
|  | github.com/containerd/containerd v1.3.0 | ||||||
| github.com/containers/storage v1.2 | github.com/containers/storage v1.2 | ||||||
| github.com/docker/docker b68221c37ee597950364788204546f9c9d0e46a1 | github.com/docker/docker b68221c37ee597950364788204546f9c9d0e46a1 | ||||||
| github.com/docker/go-connections 97c2040d34dfae1d1b1275fa3a78dbdd2f41cf7e | github.com/docker/go-connections 97c2040d34dfae1d1b1275fa3a78dbdd2f41cf7e | ||||||
|  | @ -18,3 +19,7 @@ golang.org/x/crypto ff983b9c42bc9fbf91556e191cc8efb585c16908 | ||||||
| golang.org/x/net 45ffb0cd1ba084b73e26dee67e667e1be5acce83 | golang.org/x/net 45ffb0cd1ba084b73e26dee67e667e1be5acce83 | ||||||
| golang.org/x/sys 7fbe1cd0fcc20051e1fcb87fbabec4a1bacaaeba | golang.org/x/sys 7fbe1cd0fcc20051e1fcb87fbabec4a1bacaaeba | ||||||
| k8s.io/klog 8e90cee79f823779174776412c13478955131846 | k8s.io/klog 8e90cee79f823779174776412c13478955131846 | ||||||
|  | google.golang.org/grpc 6eaf6f47437a6b4e2153a190160ef39a92c7eceb # v1.23.0 | ||||||
|  | github.com/golang/protobuf v1.2.0 | ||||||
|  | google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944 | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,8 @@ github.com/checkpoint-restore/go-criu/rpc | ||||||
| github.com/containerd/cgroups/stats/v1 | github.com/containerd/cgroups/stats/v1 | ||||||
| # github.com/containerd/containerd v1.3.0 | # github.com/containerd/containerd v1.3.0 | ||||||
| github.com/containerd/containerd/errdefs | github.com/containerd/containerd/errdefs | ||||||
|  | github.com/containerd/containerd/log | ||||||
|  | github.com/containerd/containerd/platforms | ||||||
| # github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc | # github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc | ||||||
| github.com/containerd/continuity/fs | github.com/containerd/continuity/fs | ||||||
| github.com/containerd/continuity/syscallx | github.com/containerd/continuity/syscallx | ||||||
|  | @ -62,7 +64,7 @@ github.com/containernetworking/plugins/pkg/ns | ||||||
| github.com/containernetworking/plugins/pkg/utils/hwaddr | github.com/containernetworking/plugins/pkg/utils/hwaddr | ||||||
| github.com/containernetworking/plugins/plugins/ipam/host-local/backend | github.com/containernetworking/plugins/plugins/ipam/host-local/backend | ||||||
| github.com/containernetworking/plugins/plugins/ipam/host-local/backend/allocator | github.com/containernetworking/plugins/plugins/ipam/host-local/backend/allocator | ||||||
| # github.com/containers/buildah v1.14.3-0.20200313154200-d26f437b2a46 | # github.com/containers/buildah v1.14.3 | ||||||
| github.com/containers/buildah | github.com/containers/buildah | ||||||
| github.com/containers/buildah/bind | github.com/containers/buildah/bind | ||||||
| github.com/containers/buildah/chroot | github.com/containers/buildah/chroot | ||||||
|  | @ -413,7 +415,7 @@ github.com/opencontainers/selinux/go-selinux/label | ||||||
| github.com/opencontainers/selinux/pkg/pwalk | github.com/opencontainers/selinux/pkg/pwalk | ||||||
| # github.com/openshift/api v0.0.0-20200106203948-7ab22a2c8316 | # github.com/openshift/api v0.0.0-20200106203948-7ab22a2c8316 | ||||||
| github.com/openshift/api/config/v1 | github.com/openshift/api/config/v1 | ||||||
| # github.com/openshift/imagebuilder v1.1.1 | # github.com/openshift/imagebuilder v1.1.2 | ||||||
| github.com/openshift/imagebuilder | github.com/openshift/imagebuilder | ||||||
| github.com/openshift/imagebuilder/dockerfile/command | github.com/openshift/imagebuilder/dockerfile/command | ||||||
| github.com/openshift/imagebuilder/dockerfile/parser | github.com/openshift/imagebuilder/dockerfile/parser | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue