Browse code

LCOW: Rework after 33454 merged which refactored daemon/builder interface

Signed-off-by: John Howard <jhoward@microsoft.com>

John Howard authored on 2017/06/21 02:34:55
Showing 5 changed files
... ...
@@ -43,7 +43,7 @@ type Backend interface {
43 43
 	// ContainerCreateWorkdir creates the workdir
44 44
 	ContainerCreateWorkdir(containerID string) error
45 45
 
46
-	CreateImage(config []byte, parent string) (Image, error)
46
+	CreateImage(config []byte, parent string, platform string) (Image, error)
47 47
 
48 48
 	ImageCacheBuilder
49 49
 }
... ...
@@ -100,6 +100,6 @@ type Image interface {
100 100
 type ReleaseableLayer interface {
101 101
 	Release() error
102 102
 	Mount() (string, error)
103
-	Commit() (ReleaseableLayer, error)
103
+	Commit(platform string) (ReleaseableLayer, error)
104 104
 	DiffID() layer.DiffID
105 105
 }
... ...
@@ -65,7 +65,7 @@ func (b *Builder) commitContainer(dispatchState *dispatchState, id string, conta
65 65
 }
66 66
 
67 67
 func (b *Builder) exportImage(state *dispatchState, imageMount *imageMount, runConfig *container.Config) error {
68
-	newLayer, err := imageMount.Layer().Commit()
68
+	newLayer, err := imageMount.Layer().Commit(b.platform)
69 69
 	if err != nil {
70 70
 		return err
71 71
 	}
... ...
@@ -93,7 +93,7 @@ func (b *Builder) exportImage(state *dispatchState, imageMount *imageMount, runC
93 93
 		return errors.Wrap(err, "failed to encode image config")
94 94
 	}
95 95
 
96
-	exportedImage, err := b.docker.CreateImage(config, state.imageID)
96
+	exportedImage, err := b.docker.CreateImage(config, state.imageID, parentImage.OS)
97 97
 	if err != nil {
98 98
 		return errors.Wrapf(err, "failed to export image")
99 99
 	}
... ...
@@ -78,7 +78,7 @@ func (m *MockBackend) MakeImageCache(cacheFrom []string, platform string) builde
78 78
 	return nil
79 79
 }
80 80
 
81
-func (m *MockBackend) CreateImage(config []byte, parent string) (builder.Image, error) {
81
+func (m *MockBackend) CreateImage(config []byte, parent string, platform string) (builder.Image, error) {
82 82
 	return nil, nil
83 83
 }
84 84
 
... ...
@@ -121,7 +121,7 @@ func (l *mockLayer) Mount() (string, error) {
121 121
 	return "mountPath", nil
122 122
 }
123 123
 
124
-func (l *mockLayer) Commit() (builder.ReleaseableLayer, error) {
124
+func (l *mockLayer) Commit(string) (builder.ReleaseableLayer, error) {
125 125
 	return nil, nil
126 126
 }
127 127
 
... ...
@@ -2,6 +2,7 @@ package daemon
2 2
 
3 3
 import (
4 4
 	"io"
5
+	"runtime"
5 6
 
6 7
 	"github.com/Sirupsen/logrus"
7 8
 	"github.com/docker/distribution/reference"
... ...
@@ -39,7 +40,7 @@ func (rl *releaseableLayer) Mount() (string, error) {
39 39
 	return rl.rwLayer.Mount("")
40 40
 }
41 41
 
42
-func (rl *releaseableLayer) Commit() (builder.ReleaseableLayer, error) {
42
+func (rl *releaseableLayer) Commit(platform string) (builder.ReleaseableLayer, error) {
43 43
 	var chainID layer.ChainID
44 44
 	if rl.roLayer != nil {
45 45
 		chainID = rl.roLayer.ChainID()
... ...
@@ -50,7 +51,7 @@ func (rl *releaseableLayer) Commit() (builder.ReleaseableLayer, error) {
50 50
 		return nil, err
51 51
 	}
52 52
 
53
-	newLayer, err := rl.layerStore.Register(stream, chainID)
53
+	newLayer, err := rl.layerStore.Register(stream, chainID, layer.Platform(platform))
54 54
 	if err != nil {
55 55
 		return nil, err
56 56
 	}
... ...
@@ -139,7 +140,7 @@ func (daemon *Daemon) pullForBuilder(ctx context.Context, name string, authConfi
139 139
 // leaking of layers.
140 140
 func (daemon *Daemon) GetImageAndReleasableLayer(ctx context.Context, refOrID string, opts backend.GetImageAndLayerOptions) (builder.Image, builder.ReleaseableLayer, error) {
141 141
 	if refOrID == "" {
142
-		layer, err := newReleasableLayerForImage(nil, daemon.layerStore)
142
+		layer, err := newReleasableLayerForImage(nil, daemon.stores[opts.Platform].layerStore)
143 143
 		return nil, layer, err
144 144
 	}
145 145
 
... ...
@@ -163,19 +164,22 @@ func (daemon *Daemon) GetImageAndReleasableLayer(ctx context.Context, refOrID st
163 163
 // CreateImage creates a new image by adding a config and ID to the image store.
164 164
 // This is similar to LoadImage() except that it receives JSON encoded bytes of
165 165
 // an image instead of a tar archive.
166
-func (daemon *Daemon) CreateImage(config []byte, parent string) (builder.Image, error) {
167
-	id, err := daemon.imageStore.Create(config)
166
+func (daemon *Daemon) CreateImage(config []byte, parent string, platform string) (builder.Image, error) {
167
+	if platform == "" {
168
+		platform = runtime.GOOS
169
+	}
170
+	id, err := daemon.stores[platform].imageStore.Create(config)
168 171
 	if err != nil {
169 172
 		return nil, errors.Wrapf(err, "failed to create image")
170 173
 	}
171 174
 
172 175
 	if parent != "" {
173
-		if err := daemon.imageStore.SetParent(id, image.ID(parent)); err != nil {
176
+		if err := daemon.stores[platform].imageStore.SetParent(id, image.ID(parent)); err != nil {
174 177
 			return nil, errors.Wrapf(err, "failed to set parent %s", parent)
175 178
 		}
176 179
 	}
177 180
 
178
-	return daemon.imageStore.Get(id)
181
+	return daemon.stores[platform].imageStore.Get(id)
179 182
 }
180 183
 
181 184
 // IDMappings returns uid/gid mappings for the builder
... ...
@@ -170,7 +170,7 @@ func (daemon *Daemon) Commit(name string, c *backend.ContainerCommitConfig) (str
170 170
 		}
171 171
 	}
172 172
 
173
-	l, err := daemon.stores[container.Platform].layerStore.Register(rwTar, rootFS.ChainID(), layer.Platform(container.Platform))
173
+	l, err := daemon.stores[container.Platform].layerStore.Register(rwTar, parent.RootFS.ChainID(), layer.Platform(container.Platform))
174 174
 	if err != nil {
175 175
 		return "", err
176 176
 	}