Signed-off-by: John Howard <jhoward@microsoft.com>
| ... | ... |
@@ -26,6 +26,7 @@ type mockLayer struct {
|
| 26 | 26 |
diffID layer.DiffID |
| 27 | 27 |
chainID layer.ChainID |
| 28 | 28 |
parent layer.Layer |
| 29 |
+ platform layer.Platform |
|
| 29 | 30 |
} |
| 30 | 31 |
|
| 31 | 32 |
func (ml *mockLayer) TarStream() (io.ReadCloser, error) {
|
| ... | ... |
@@ -56,6 +57,10 @@ func (ml *mockLayer) DiffSize() (size int64, err error) {
|
| 56 | 56 |
return 0, nil |
| 57 | 57 |
} |
| 58 | 58 |
|
| 59 |
+func (ml *mockLayer) Platform() layer.Platform {
|
|
| 60 |
+ return ml.platform |
|
| 61 |
+} |
|
| 62 |
+ |
|
| 59 | 63 |
func (ml *mockLayer) Metadata() (map[string]string, error) {
|
| 60 | 64 |
return make(map[string]string), nil |
| 61 | 65 |
} |
| ... | ... |
@@ -55,6 +55,10 @@ func (el *emptyLayer) Metadata() (map[string]string, error) {
|
| 55 | 55 |
return make(map[string]string), nil |
| 56 | 56 |
} |
| 57 | 57 |
|
| 58 |
+func (el *emptyLayer) Platform() Platform {
|
|
| 59 |
+ return "" |
|
| 60 |
+} |
|
| 61 |
+ |
|
| 58 | 62 |
// IsEmpty returns true if the layer is an EmptyLayer |
| 59 | 63 |
func IsEmpty(diffID DiffID) bool {
|
| 60 | 64 |
return diffID == DigestSHA256EmptyTar |
| 61 | 65 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,13 @@ |
| 0 |
+// +build !windows |
|
| 1 |
+ |
|
| 2 |
+package layer |
|
| 3 |
+ |
|
| 4 |
+// SetPlatform writes the "platform" file to the layer filestore |
|
| 5 |
+func (fm *fileMetadataTransaction) SetPlatform(platform Platform) error {
|
|
| 6 |
+ return nil |
|
| 7 |
+} |
|
| 8 |
+ |
|
| 9 |
+// GetPlatform reads the "platform" file from the layer filestore |
|
| 10 |
+func (fms *fileMetadataStore) GetPlatform(layer ChainID) (Platform, error) {
|
|
| 11 |
+ return "", nil |
|
| 12 |
+} |
| 0 | 13 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,35 @@ |
| 0 |
+package layer |
|
| 1 |
+ |
|
| 2 |
+import ( |
|
| 3 |
+ "fmt" |
|
| 4 |
+ "io/ioutil" |
|
| 5 |
+ "os" |
|
| 6 |
+ "strings" |
|
| 7 |
+) |
|
| 8 |
+ |
|
| 9 |
+// SetPlatform writes the "platform" file to the layer filestore |
|
| 10 |
+func (fm *fileMetadataTransaction) SetPlatform(platform Platform) error {
|
|
| 11 |
+ if platform == "" {
|
|
| 12 |
+ return nil |
|
| 13 |
+ } |
|
| 14 |
+ return fm.ws.WriteFile("platform", []byte(platform), 0644)
|
|
| 15 |
+} |
|
| 16 |
+ |
|
| 17 |
+// GetPlatform reads the "platform" file from the layer filestore |
|
| 18 |
+func (fms *fileMetadataStore) GetPlatform(layer ChainID) (Platform, error) {
|
|
| 19 |
+ contentBytes, err := ioutil.ReadFile(fms.getLayerFilename(layer, "platform")) |
|
| 20 |
+ if err != nil {
|
|
| 21 |
+ // For backwards compatibility, the platform file may not exist. Default to "windows" if missing. |
|
| 22 |
+ if os.IsNotExist(err) {
|
|
| 23 |
+ return "windows", nil |
|
| 24 |
+ } |
|
| 25 |
+ return "", err |
|
| 26 |
+ } |
|
| 27 |
+ content := strings.TrimSpace(string(contentBytes)) |
|
| 28 |
+ |
|
| 29 |
+ if content != "windows" && content != "linux" {
|
|
| 30 |
+ return "", fmt.Errorf("invalid platform value: %s", content)
|
|
| 31 |
+ } |
|
| 32 |
+ |
|
| 33 |
+ return Platform(content), nil |
|
| 34 |
+} |
| ... | ... |
@@ -64,6 +64,14 @@ func (id ChainID) String() string {
|
| 64 | 64 |
return string(id) |
| 65 | 65 |
} |
| 66 | 66 |
|
| 67 |
+// Platform is the platform of a layer |
|
| 68 |
+type Platform string |
|
| 69 |
+ |
|
| 70 |
+// String returns a string rendition of layers target platform |
|
| 71 |
+func (id Platform) String() string {
|
|
| 72 |
+ return string(id) |
|
| 73 |
+} |
|
| 74 |
+ |
|
| 67 | 75 |
// DiffID is the hash of an individual layer tar. |
| 68 | 76 |
type DiffID digest.Digest |
| 69 | 77 |
|
| ... | ... |
@@ -99,6 +107,9 @@ type Layer interface {
|
| 99 | 99 |
// Parent returns the next layer in the layer chain. |
| 100 | 100 |
Parent() Layer |
| 101 | 101 |
|
| 102 |
+ // Platform returns the platform of the layer |
|
| 103 |
+ Platform() Platform |
|
| 104 |
+ |
|
| 102 | 105 |
// Size returns the size of the entire layer chain. The size |
| 103 | 106 |
// is calculated from the total size of all files in the layers. |
| 104 | 107 |
Size() (int64, error) |
| ... | ... |
@@ -208,6 +219,7 @@ type MetadataTransaction interface {
|
| 208 | 208 |
SetDiffID(DiffID) error |
| 209 | 209 |
SetCacheID(string) error |
| 210 | 210 |
SetDescriptor(distribution.Descriptor) error |
| 211 |
+ SetPlatform(Platform) error |
|
| 211 | 212 |
TarSplitWriter(compressInput bool) (io.WriteCloser, error) |
| 212 | 213 |
|
| 213 | 214 |
Commit(ChainID) error |
| ... | ... |
@@ -228,6 +240,7 @@ type MetadataStore interface {
|
| 228 | 228 |
GetDiffID(ChainID) (DiffID, error) |
| 229 | 229 |
GetCacheID(ChainID) (string, error) |
| 230 | 230 |
GetDescriptor(ChainID) (distribution.Descriptor, error) |
| 231 |
+ GetPlatform(ChainID) (Platform, error) |
|
| 231 | 232 |
TarSplitReader(ChainID) (io.ReadCloser, error) |
| 232 | 233 |
|
| 233 | 234 |
SetMountID(string, string) error |
| ... | ... |
@@ -144,6 +144,11 @@ func (ls *layerStore) loadLayer(layer ChainID) (*roLayer, error) {
|
| 144 | 144 |
return nil, fmt.Errorf("failed to get descriptor for %s: %s", layer, err)
|
| 145 | 145 |
} |
| 146 | 146 |
|
| 147 |
+ platform, err := ls.store.GetPlatform(layer) |
|
| 148 |
+ if err != nil {
|
|
| 149 |
+ return nil, fmt.Errorf("failed to get platform for %s: %s", layer, err)
|
|
| 150 |
+ } |
|
| 151 |
+ |
|
| 147 | 152 |
cl = &roLayer{
|
| 148 | 153 |
chainID: layer, |
| 149 | 154 |
diffID: diff, |
| ... | ... |
@@ -152,6 +157,7 @@ func (ls *layerStore) loadLayer(layer ChainID) (*roLayer, error) {
|
| 152 | 152 |
layerStore: ls, |
| 153 | 153 |
references: map[Layer]struct{}{},
|
| 154 | 154 |
descriptor: descriptor, |
| 155 |
+ platform: platform, |
|
| 155 | 156 |
} |
| 156 | 157 |
|
| 157 | 158 |
if parent != "" {
|
| ... | ... |
@@ -16,6 +16,7 @@ type roLayer struct {
|
| 16 | 16 |
size int64 |
| 17 | 17 |
layerStore *layerStore |
| 18 | 18 |
descriptor distribution.Descriptor |
| 19 |
+ platform Platform |
|
| 19 | 20 |
|
| 20 | 21 |
referenceCount int |
| 21 | 22 |
references map[Layer]struct{}
|
| ... | ... |
@@ -142,6 +143,9 @@ func storeLayer(tx MetadataTransaction, layer *roLayer) error {
|
| 142 | 142 |
return err |
| 143 | 143 |
} |
| 144 | 144 |
} |
| 145 |
+ if err := tx.SetPlatform(layer.platform); err != nil {
|
|
| 146 |
+ return err |
|
| 147 |
+ } |
|
| 145 | 148 |
|
| 146 | 149 |
return nil |
| 147 | 150 |
} |
| ... | ... |
@@ -433,6 +433,10 @@ func (l *mockLayer) DiffSize() (int64, error) {
|
| 433 | 433 |
return 0, nil |
| 434 | 434 |
} |
| 435 | 435 |
|
| 436 |
+func (l *mockLayer) Platform() layer.Platform {
|
|
| 437 |
+ return "" |
|
| 438 |
+} |
|
| 439 |
+ |
|
| 436 | 440 |
func (l *mockLayer) Metadata() (map[string]string, error) {
|
| 437 | 441 |
return nil, nil |
| 438 | 442 |
} |