From 27e1e11f079e37b8277fe88574dda29d2ebeabf1 Mon Sep 17 00:00:00 2001 From: Tsuki124 <63626545+Tsuki124@users.noreply.github.com> Date: Thu, 29 Dec 2022 18:26:36 +0800 Subject: [PATCH] feat(layer): add whiteout (#55) * feat(layer): add whiteout * chore: file format --- go/docker/docker.go | 8 ++++++ go/package.go | 2 ++ go/pkg/binding/functions.go | 54 +++++++++++++++++++++++++++++++++++++ go/remote/remote.go | 8 ++++++ go/tarball/image.go | 14 +++++++--- python3/veinmind/docker.py | 20 ++++++++++++++ python3/veinmind/remote.py | 23 ++++++++++++++-- python3/veinmind/tarball.py | 24 ++++++++++++++++- 8 files changed, 147 insertions(+), 6 deletions(-) diff --git a/go/docker/docker.go b/go/docker/docker.go index da9ef7a..5003597 100644 --- a/go/docker/docker.go +++ b/go/docker/docker.go @@ -201,3 +201,11 @@ func (l *Layer) Image() *Image { func (l *Layer) ID() string { return l.layer.DockerLayerID() } + +func (l *Layer) Opaques() ([]string, error) { + return l.layer.DockerLayerOpaques() +} + +func (l *Layer) Whiteouts() ([]string, error) { + return l.layer.DockerLayerWhiteouts() +} diff --git a/go/package.go b/go/package.go index 6c26189..fb7d485 100644 --- a/go/package.go +++ b/go/package.go @@ -25,6 +25,8 @@ type Layer interface { Close() error ID() string + Opaques() ([]string, error) + Whiteouts() ([]string, error) } // Image is the open image object from a runtime. diff --git a/go/pkg/binding/functions.go b/go/pkg/binding/functions.go index 3e2a01e..67aca23 100644 --- a/go/pkg/binding/functions.go +++ b/go/pkg/binding/functions.go @@ -584,6 +584,24 @@ func (h Handle) DockerLayerID() string { return result.String() } +func (h Handle) DockerLayerOpaques() ([]string, error) { + var result Handle + if err := handleError(C.veinmind_DockerLayerOpaques(result.Ptr(), h.ID())); err != nil { + return nil, err + } + defer result.Free() + return result.StringArray(), nil +} + +func (h Handle) DockerLayerWhiteouts() ([]string, error) { + var result Handle + if err := handleError(C.veinmind_DockerLayerWhiteouts(result.Ptr(), h.ID())); err != nil { + return nil, err + } + defer result.Free() + return result.StringArray(), nil +} + func ContainerdMakeNewOptionList() Handle { var result Handle assertNoError(C.veinmind_ContainerdMakeNewOptionList(result.Ptr())) @@ -686,6 +704,24 @@ func (h Handle) TarballLayerId() string { return result.String() } +func (h Handle) TarballLayerOpaques() ([]string, error) { + var result Handle + if err := handleError(C.veinmind_TarballLayerOpaques(result.Ptr(), h.ID())); err != nil { + return nil, err + } + defer result.Free() + return result.StringArray(), nil +} + +func (h Handle) TarballLayerWhiteouts() ([]string, error) { + var result Handle + if err := handleError(C.veinmind_TarballLayerWhiteouts(result.Ptr(), h.ID())); err != nil { + return nil, err + } + defer result.Free() + return result.StringArray(), nil +} + func RemoteNew(root string) (Handle, error) { var result Handle rootStr := NewString(root) @@ -735,3 +771,21 @@ func (h Handle) RemoteLayerId() string { defer result.Free() return result.String() } + +func (h Handle) RemoteLayerOpaques() ([]string, error) { + var result Handle + if err := handleError(C.veinmind_RemoteLayerOpaques(result.Ptr(), h.ID())); err != nil { + return nil, err + } + defer result.Free() + return result.StringArray(), nil +} + +func (h Handle) RemoteLayerWhiteouts() ([]string, error) { + var result Handle + if err := handleError(C.veinmind_RemoteLayerWhiteouts(result.Ptr(), h.ID())); err != nil { + return nil, err + } + defer result.Free() + return result.StringArray(), nil +} diff --git a/go/remote/remote.go b/go/remote/remote.go index a23c4bb..1839f14 100644 --- a/go/remote/remote.go +++ b/go/remote/remote.go @@ -66,3 +66,11 @@ func (t *Runtime) Load(imageRef string, opts ...LoadOption) ([]string, error) { func (t *Runtime) Close() error { return t.runtime.Close() } + +func (l *Layer) Opaques() ([]string, error) { + return l.layer.RemoteLayerOpaques() +} + +func (l *Layer) Whiteouts() ([]string, error) { + return l.layer.RemoteLayerWhiteouts() +} diff --git a/go/tarball/image.go b/go/tarball/image.go index bd4cef8..3f8ab26 100644 --- a/go/tarball/image.go +++ b/go/tarball/image.go @@ -37,10 +37,10 @@ func (i *Image) OpenLayer(index int) (api.Layer, error) { } return &Layer{ - Closer: behaviour.NewCloser(&h), + Closer: behaviour.NewCloser(&h), FileSystem: behaviour.NewFileSystem(&h), - layer: h, - image: i, + layer: h, + image: i, }, nil } @@ -51,3 +51,11 @@ func (l *Layer) ID() string { func (l *Layer) Image() *Image { return l.image } + +func (l *Layer) Opaques() ([]string, error) { + return l.layer.TarballLayerOpaques() +} + +func (l *Layer) Whiteouts() ([]string, error) { + return l.layer.TarballLayerWhiteouts() +} diff --git a/python3/veinmind/docker.py b/python3/veinmind/docker.py index 18be6e1..410b59c 100644 --- a/python3/veinmind/docker.py +++ b/python3/veinmind/docker.py @@ -111,6 +111,26 @@ def id(self): with handle as handle: return handle.str() + _opaques = binding.lookup(b"veinmind_DockerLayerOpaques", b"VEINMIND_1.5") + def opaques(self): + "Retrieve the opaques of the docker layer." + + handle = binding.Handle() + binding.handle_error(Layer._opaques( + handle.ptr(), self.__handle__().val())) + with handle as handle: + return handle.str_list() + + _whiteouts = binding.lookup(b"veinmind_DockerLayerWhiteouts", b"VEINMIND_1.5") + def whiteouts(self): + "Retrieve the whiteouts of the docker layer." + + handle = binding.Handle() + binding.handle_error(Layer._whiteouts( + handle.ptr(), self.__handle__().val())) + with handle as handle: + return handle.str_list() + class Image(image.Image): "Image refers to a docker specific image." diff --git a/python3/veinmind/remote.py b/python3/veinmind/remote.py index cf5c304..30427ce 100644 --- a/python3/veinmind/remote.py +++ b/python3/veinmind/remote.py @@ -46,9 +46,8 @@ def __init__(self, handle): super(Layer, self).__init__(handle=handle) _id = binding.lookup(b"veinmind_RemoteLayerID", b"VEINMIND_1.4") - def id(self): - "Retrieve the diff ID of the docker layer." + "Retrieve the diff ID of the remote layer." handle = binding.Handle() binding.handle_error(Layer._id( @@ -56,6 +55,26 @@ def id(self): with handle as handle: return handle.str() + _opaques = binding.lookup(b"veinmind_RemoteLayerOpaques", b"VEINMIND_1.5") + def opaques(self): + "Retrieve the opaques of the remote layer." + + handle = binding.Handle() + binding.handle_error(Layer._opaques( + handle.ptr(), self.__handle__().val())) + with handle as handle: + return handle.str_list() + + _whiteouts = binding.lookup(b"veinmind_RemoteLayerWhiteouts", b"VEINMIND_1.5") + def whiteouts(self): + "Retrieve the whiteouts of the remote layer." + + handle = binding.Handle() + binding.handle_error(Layer._whiteouts( + handle.ptr(), self.__handle__().val())) + with handle as handle: + return handle.str_list() + class Image(image.Image): _open_layer = binding.lookup( diff --git a/python3/veinmind/tarball.py b/python3/veinmind/tarball.py index 4d256e2..0e527e0 100644 --- a/python3/veinmind/tarball.py +++ b/python3/veinmind/tarball.py @@ -82,4 +82,26 @@ def num_layers(self): result = C.c_size_t() binding.handle_error(Image._num_layers( C.pointer(result), self.__handle__().val())) - return result.value \ No newline at end of file + return result.value + + _opaques = binding.lookup( + b"veinmind_TarballLayerOpaques", b"VEINMIND_1.5") + def opaques(self): + "Retrieve the opaques of the tarball layer." + + handle = binding.Handle() + binding.handle_error(Layer._opaques( + handle.ptr(), self.__handle__().val())) + with handle as handle: + return handle.str_list() + + _whiteouts = binding.lookup( + b"veinmind_TarballLayerWhiteouts", b"VEINMIND_1.5") + def whiteouts(self): + "Retrieve the whiteouts of the tarball layer." + + handle = binding.Handle() + binding.handle_error(Layer._whiteouts( + handle.ptr(), self.__handle__().val())) + with handle as handle: + return handle.str_list() \ No newline at end of file