提交 68d3ec00 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!4 adapt to isulad 2.0.5

Merge pull request !4 from wangkang101/master
...@@ -74,7 +74,7 @@ func main() { ...@@ -74,7 +74,7 @@ func main() {
func start(ctx *cli.Context) error { func start(ctx *cli.Context) error {
logInit(ctx) logInit(ctx)
if err := transformInit(ctx); err != nil { if err := transformInit(); err != nil {
return cli.NewExitError(err.Error(), exitInitErr) return cli.NewExitError(err.Error(), exitInitErr)
} }
return doTransform(ctx) return doTransform(ctx)
...@@ -110,39 +110,31 @@ func transLogLevel(lvl string) logrus.Level { ...@@ -110,39 +110,31 @@ func transLogLevel(lvl string) logrus.Level {
return logrus.InfoLevel return logrus.InfoLevel
} }
func transformInit(ctx *cli.Context) error { func transformInit() error {
var iSuladCfg = struct { var conf = isulad.DaemonConfig{}
Graph string `json:"graph"`
State string `json:"state"`
Runtime string `json:"default-runtime"`
LogLevel string `json:"log-level"`
LogDriver string `json:"log-driver"`
StorageDriver string `json:"storage-driver"`
ImageServer string `json:"image-server-sock-addr"`
}{}
if err := utils.CheckFileValid(isuladConfFIle); err != nil { if err := utils.CheckFileValid(isuladConfFIle); err != nil {
return errors.Wrapf(err, "check isulad daemon config failed") return errors.Wrapf(err, "check isulad daemon config failed")
} }
iSuladCfgData, err := ioutil.ReadFile(isuladConfFIle) confData, err := ioutil.ReadFile(isuladConfFIle)
if err != nil { if err != nil {
logrus.Errorf("read isulad daemon config failed: %v, file path: %s", err, isuladConfFIle) logrus.Errorf("read isulad daemon config failed: %v, file path: %s", err, isuladConfFIle)
return errors.Wrapf(err, "read isulad daemon config failed") return errors.Wrapf(err, "read isulad daemon config failed")
} }
err = json.Unmarshal(iSuladCfgData, &iSuladCfg) err = json.Unmarshal(confData, &conf)
if err != nil { if err != nil {
logrus.Errorf("unmarshal isulad daemon config failed: %v, file path: %s", err, isuladConfFIle) logrus.Errorf("unmarshal isulad daemon config failed: %v, file path: %s", err, isuladConfFIle)
return errors.Wrapf(err, "unmarshal isulad daemon config failed") return errors.Wrapf(err, "unmarshal isulad daemon config failed")
} }
logrus.Debugf("isulad daemon config: %+v", iSuladCfg) logrus.Debugf("isulad daemon config: %+v", conf)
err = isulad.InitIsuladTool(iSuladCfg.Graph, iSuladCfg.Runtime, iSuladCfg.StorageDriver, iSuladCfg.ImageServer) err = isulad.InitIsuladTool(&conf)
if err != nil { if err != nil {
return errors.Wrapf(err, "transform init failed") return errors.Wrapf(err, "transform init failed")
} }
if iSuladCfg.LogDriver != "file" { if conf.LogDriver != "file" {
logrus.Infof("isula daemon log driver is %s, can't redirect to file", iSuladCfg.LogDriver) logrus.Infof("isula daemon log driver is %s, can't redirect to file", conf.LogDriver)
} else { } else {
isulad.LcrLogInit(iSuladCfg.State, iSuladCfg.Runtime, iSuladCfg.LogLevel) isulad.LcrLogInit(conf.State, conf.Runtime, conf.LogLevel)
} }
return nil return nil
} }
......
/*
* Copyright (c) 2020 Huawei Technologies Co., Ltd.
* isula-transform is licensed under the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
* Create: 2020-09-04
*/
#include "isuladimg.h"
char *util_strdup_s(const char *src)
{
char *dst = NULL;
if (src == NULL)
{
return NULL;
}
dst = strdup(src);
if (dst == NULL)
{
abort();
}
return dst;
}
int init_isulad_image_module(char *graph, char *state, char *driver, char **opts, size_t len, int check)
{
int ret = -1;
isulad_daemon_configs *conf = NULL;
char **storage_opts;
size_t i = 0;
if (graph == NULL || state == NULL || driver == NULL)
{
return -1;
}
conf = safe_malloc(sizeof(isulad_daemon_configs));
conf->graph = util_strdup_s(graph);
conf->state = util_strdup_s(state);
conf->storage_driver = util_strdup_s(driver);
storage_opts = malloc(sizeof(char *) * len);
for (i = 0; i < len; i++)
{
storage_opts[i] = util_strdup_s(opts[i]);
}
conf->storage_opts = storage_opts;
conf->storage_opts_len = len;
if (check == 1)
{
conf->image_layer_check = true;
}
else
{
conf->image_layer_check = false;
}
ret = image_module_init(conf);
free_isulad_daemon_configs(conf);
return ret;
}
char *isulad_img_prepare_rootfs(char *type, char *id, char *name)
{
char *real_rootfs = NULL;
im_prepare_request *req = NULL;
if (type == NULL || id == NULL || name == NULL)
{
return NULL;
}
req = safe_malloc(sizeof(im_prepare_request));
req->container_id = util_strdup_s(id);
req->image_type = util_strdup_s(type);
req->image_name = util_strdup_s(name);
if (im_prepare_container_rootfs(req, &real_rootfs) != 0)
{
real_rootfs = NULL;
}
free_im_prepare_request(req);
return real_rootfs;
}
\ No newline at end of file
/*
* Copyright (c) 2020 Huawei Technologies Co., Ltd.
* isula-transform is licensed under the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
* Create: 2020-09-04
*/
package isuladimg
/*
#cgo LDFLAGS: -lisulad_img -lisula_libutils
#include "isuladimg.h"
*/
import "C"
import (
"unsafe"
"github.com/pkg/errors"
)
var (
imageTypeOCI string = "oci"
)
type Operation int
const (
RemoveOp Operation = iota
MountOp
UmountOp
)
// InitLib initializes the dynamic link library of libisulad_img
func InitLib(graph, state, driverType string, driverOpts []string, check bool) error {
var imageLayerCheck C.int
cGraph := C.CString(graph)
defer C.free(unsafe.Pointer(cGraph))
cState := C.CString(state)
defer C.free(unsafe.Pointer(cState))
cStorageDriver := C.CString(driverType)
defer C.free(unsafe.Pointer(cStorageDriver))
opts := make([]*C.char, len(driverOpts))
for i := range driverOpts {
opts[i] = C.CString(driverOpts[i])
defer C.free(unsafe.Pointer(opts[i]))
}
var cOpts **C.char
if len(driverOpts) == 0 {
cOpts = nil
} else {
cOpts = (**C.char)(unsafe.Pointer(&opts[0]))
}
if check {
imageLayerCheck = C.int(1)
} else {
imageLayerCheck = C.int(0)
}
if ret := C.init_isulad_image_module(cGraph, cState, cStorageDriver,
cOpts, C.size_t(len(driverOpts)), imageLayerCheck); ret != 0 {
return errors.Errorf("init libisulad_img.so get ret code: %d", ret)
}
return nil
}
// PrepareRootfs calls isulad_img_prepare_rootfs to prepare container rootfs
func PrepareRootfs(id, image string) string {
imageType := C.CString(imageTypeOCI)
defer C.free(unsafe.Pointer(imageType))
containerID := C.CString(id)
defer C.free(unsafe.Pointer(containerID))
imageName := C.CString(image)
defer C.free(unsafe.Pointer(imageName))
realRootfs := C.isulad_img_prepare_rootfs(imageType, containerID, imageName)
mountPoint := C.GoString(realRootfs)
return mountPoint
}
// SwitchOperation choose different Operation for container rootfs
func SwitchOperation(op Operation, id, image string) C.int {
imageType := C.CString(imageTypeOCI)
defer C.free(unsafe.Pointer(imageType))
containerID := C.CString(id)
defer C.free(unsafe.Pointer(containerID))
imageName := C.CString(image)
defer C.free(unsafe.Pointer(imageName))
switch op {
case RemoveOp:
return C.im_remove_container_rootfs(imageType, containerID)
case MountOp:
return C.im_mount_container_rootfs(imageType, imageName, containerID)
case UmountOp:
return C.im_umount_container_rootfs(imageType, imageName, containerID)
}
return -1
}
/*
* Copyright (c) 2020 Huawei Technologies Co., Ltd.
* isula-transform is licensed under the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
* Create: 2020-09-04
*/
#include <isulad/image_api.h>
extern int init_isulad_image_module(char *graph, char *state, char *driver, char **opts, size_t len, int check);
extern char *isulad_img_prepare_rootfs(char *type, char *id, char *name);
\ No newline at end of file
...@@ -24,6 +24,7 @@ import ( ...@@ -24,6 +24,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"isula.org/isula-transform/pkg/isulad/internal/isuladimg"
"isula.org/isula-transform/transform" "isula.org/isula-transform/transform"
"isula.org/isula-transform/types" "isula.org/isula-transform/types"
) )
...@@ -36,19 +37,32 @@ const ( ...@@ -36,19 +37,32 @@ const (
initMask int = 0022 initMask int = 0022
defaultISuladGraphPath = "/var/lib/isulad" defaultIsuladGraphPath = "/var/lib/isulad"
defaultIsuladStatePath = "/var/run/isulad"
defaultRuntime = "lcr" defaultRuntime = "lcr"
defaultStorageDriver = "overlay2" defaultStorageDriver = "overlay2"
) )
var ( var (
commonTool *IsuladTool commonTool *Tool
) )
// IsuladTool contains the common functions used by transformer // DaemonConfig maps the daemon config of isulad
type IsuladTool struct { type DaemonConfig struct {
graphRoot string Graph string `json:"graph"`
runtime string State string `json:"state"`
Runtime string `json:"default-runtime"`
LogLevel string `json:"log-level"`
LogDriver string `json:"log-driver"`
StorageDriver string `json:"storage-driver"`
StorageOpts []string `json:"storage-opts"`
ImageLayerCheck bool `json:"image-layer-check"`
}
// Tool contains the common functions used by transformer
type Tool struct {
graph string
runtime string
// storage // storage
storageType transform.StorageType storageType transform.StorageType
...@@ -60,20 +74,23 @@ func init() { ...@@ -60,20 +74,23 @@ func init() {
} }
// InitIsuladTool initializes the global iSuladCfgTool with the given parameters // InitIsuladTool initializes the global iSuladCfgTool with the given parameters
func InitIsuladTool(graphRoot, runtime, storageDriver, imageSrvAddr string) error { func InitIsuladTool(conf *DaemonConfig) error {
if graphRoot == "" { if conf.Graph == "" {
graphRoot = defaultISuladGraphPath conf.Graph = defaultIsuladGraphPath
}
if conf.State == "" {
conf.State = defaultIsuladStatePath
} }
if runtime == "" { if conf.Runtime == "" {
runtime = defaultRuntime conf.Runtime = defaultRuntime
} }
if storageDriver == "" { if conf.StorageDriver == "" {
storageDriver = defaultStorageDriver conf.StorageDriver = defaultStorageDriver
} }
commonTool = &IsuladTool{ commonTool = &Tool{
graphRoot: graphRoot, graph: conf.Graph,
runtime: runtime, runtime: conf.Runtime,
storageType: transform.StorageType(storageDriver), storageType: transform.StorageType(conf.StorageDriver),
} }
if err := checkToolConfigValid(); err != nil { if err := checkToolConfigValid(); err != nil {
...@@ -81,30 +98,31 @@ func InitIsuladTool(graphRoot, runtime, storageDriver, imageSrvAddr string) erro ...@@ -81,30 +98,31 @@ func InitIsuladTool(graphRoot, runtime, storageDriver, imageSrvAddr string) erro
return errors.Wrap(err, "config of iSuladTool is invalid") return errors.Wrap(err, "config of iSuladTool is invalid")
} }
if err := initBaseStorageDriver(imageSrvAddr); err != nil { if err := isuladimg.InitLib(conf.Graph, conf.State,
logrus.Errorf("init global base storage driver failed: %v", err) conf.StorageDriver, conf.StorageOpts, conf.ImageLayerCheck); err != nil {
return errors.Wrap(err, "init global base storage driver failed") logrus.Errorf("init base storage driver failed: %v", err)
return errors.Wrap(err, "init base storage driver failed")
} }
commonTool.storageDriver = globalIsuladStorageDriver commonTool.storageDriver = &isuladStorageDriver{}
return nil return nil
} }
// GetIsuladCfgTool returns the global isuladtool // GetIsuladTool returns the global isuladtool
func GetIsuladTool() *IsuladTool { func GetIsuladTool() *Tool {
return commonTool return commonTool
} }
func checkToolConfigValid() error { func checkToolConfigValid() error {
g := GetIsuladTool() g := GetIsuladTool()
// runtime
switch g.runtime { switch g.runtime {
case defaultRuntime: case defaultRuntime:
default: default:
return fmt.Errorf("not support runtime: %s", g.runtime) return fmt.Errorf("not support runtime: %s", g.runtime)
} }
// storage driver
switch g.storageType { switch g.storageType {
case transform.Overlay2, transform.DeviceMapper: case transform.Overlay2, transform.DeviceMapper:
default: default:
...@@ -114,27 +132,27 @@ func checkToolConfigValid() error { ...@@ -114,27 +132,27 @@ func checkToolConfigValid() error {
} }
// StorageType returns the storage type of isulad // StorageType returns the storage type of isulad
func (ict *IsuladTool) StorageType() transform.StorageType { func (ict *Tool) StorageType() transform.StorageType {
return ict.storageType return ict.storageType
} }
// BaseStorageDriver returns the global base storage driver tool // BaseStorageDriver returns the global base storage driver tool
func (ict *IsuladTool) BaseStorageDriver() transform.BaseStorageDriver { func (ict *Tool) BaseStorageDriver() transform.BaseStorageDriver {
return ict.storageDriver return ict.storageDriver
} }
// Runtime returns the runtime of isulad used // Runtime returns the runtime of isulad used
func (ict *IsuladTool) Runtime() string { func (ict *Tool) Runtime() string {
return ict.runtime return ict.runtime
} }
// GetRuntimePath returns the default runtime path of isulad // GetRuntimePath returns the default runtime path of isulad
func (ict *IsuladTool) GetRuntimePath() string { func (ict *Tool) GetRuntimePath() string {
return filepath.Join(ict.graphRoot, "engines", ict.runtime) return filepath.Join(ict.graph, "engines", ict.runtime)
} }
// PrepareBundleDir creates runtime root dir of the container // PrepareBundleDir creates runtime root dir of the container
func (ict *IsuladTool) PrepareBundleDir(id string) error { func (ict *Tool) PrepareBundleDir(id string) error {
path := filepath.Join(ict.GetRuntimePath(), id) path := filepath.Join(ict.GetRuntimePath(), id)
_, err := os.Stat(path) _, err := os.Stat(path)
if err == nil || os.IsExist(err) { if err == nil || os.IsExist(err) {
...@@ -144,22 +162,22 @@ func (ict *IsuladTool) PrepareBundleDir(id string) error { ...@@ -144,22 +162,22 @@ func (ict *IsuladTool) PrepareBundleDir(id string) error {
} }
// GetHostCfgPath returns path of hostconfig.json // GetHostCfgPath returns path of hostconfig.json
func (ict *IsuladTool) GetHostCfgPath(id string) string { func (ict *Tool) GetHostCfgPath(id string) string {
return filepath.Join(ict.GetRuntimePath(), id, types.Hostconfig) return filepath.Join(ict.GetRuntimePath(), id, types.Hostconfig)
} }
// GetConfigV2Path returns path of config.v2.json // GetConfigV2Path returns path of config.v2.json
func (ict *IsuladTool) GetConfigV2Path(id string) string { func (ict *Tool) GetConfigV2Path(id string) string {
return filepath.Join(ict.GetRuntimePath(), id, types.V2config) return filepath.Join(ict.GetRuntimePath(), id, types.V2config)
} }
// GetOciConfigPath returns path of config.json // GetOciConfigPath returns path of config.json
func (ict *IsuladTool) GetOciConfigPath(id string) string { func (ict *Tool) GetOciConfigPath(id string) string {
return filepath.Join(ict.GetRuntimePath(), id, types.Ociconfig) return filepath.Join(ict.GetRuntimePath(), id, types.Ociconfig)
} }
// GetNetworkFilePath returns the path specified file in host, hostname and resolv.conf // GetNetworkFilePath returns the path specified file in host, hostname and resolv.conf
func (ict *IsuladTool) GetNetworkFilePath(id, file string) string { func (ict *Tool) GetNetworkFilePath(id, file string) string {
return filepath.Join(ict.GetRuntimePath(), id, file) return filepath.Join(ict.GetRuntimePath(), id, file)
} }
...@@ -170,7 +188,7 @@ type ReadData func(src interface{}) ([]byte, error) ...@@ -170,7 +188,7 @@ type ReadData func(src interface{}) ([]byte, error)
type FilePath func(string) string type FilePath func(string) string
// SaveConfig allows isuladTool to save data to file // SaveConfig allows isuladTool to save data to file
func (ict *IsuladTool) SaveConfig(id string, src interface{}, read ReadData, getPath FilePath) error { func (ict *Tool) SaveConfig(id string, src interface{}, read ReadData, getPath FilePath) error {
path := getPath(id) path := getPath(id)
_, err := os.Stat(path) _, err := os.Stat(path)
...@@ -200,18 +218,18 @@ func (ict *IsuladTool) SaveConfig(id string, src interface{}, read ReadData, get ...@@ -200,18 +218,18 @@ func (ict *IsuladTool) SaveConfig(id string, src interface{}, read ReadData, get
} }
// MarshalIndent formats the json bytes with indent // MarshalIndent formats the json bytes with indent
func (ict *IsuladTool) MarshalIndent(src interface{}) (bytes []byte, e error) { func (ict *Tool) MarshalIndent(src interface{}) (bytes []byte, e error) {
return json.MarshalIndent(src, "", "\t") return json.MarshalIndent(src, "", "\t")
} }
// Cleanup remove runtime root dir of the container // Cleanup remove runtime root dir of the container
func (ict *IsuladTool) Cleanup(id string) error { func (ict *Tool) Cleanup(id string) error {
path := filepath.Join(ict.GetRuntimePath(), id) path := filepath.Join(ict.GetRuntimePath(), id)
return os.RemoveAll(path) return os.RemoveAll(path)
} }
// PrepareShm creates sharm shm mount point for container // PrepareShm creates sharm shm mount point for container
func (ict *IsuladTool) PrepareShm(path string, size int64) error { func (ict *Tool) PrepareShm(path string, size int64) error {
err := os.MkdirAll(path, mountsDirMode) err := os.MkdirAll(path, mountsDirMode)
if err != nil { if err != nil {
return err return err
...@@ -225,6 +243,6 @@ func (ict *IsuladTool) PrepareShm(path string, size int64) error { ...@@ -225,6 +243,6 @@ func (ict *IsuladTool) PrepareShm(path string, size int64) error {
} }
// LcrCreate calls lcr interface to init isulad container // LcrCreate calls lcr interface to init isulad container
func (ict *IsuladTool) LcrCreate(id string, spec []byte) error { func (ict *Tool) LcrCreate(id string, spec []byte) error {
return lcrCreate(id, ict.GetRuntimePath(), spec) return lcrCreate(id, ict.GetRuntimePath(), spec)
} }
...@@ -26,8 +26,8 @@ import ( ...@@ -26,8 +26,8 @@ import (
const itTestCtrID = "isulatransformittestctr" const itTestCtrID = "isulatransformittestctr"
var testIsuladTool = &IsuladTool{ var testIsuladTool = &Tool{
graphRoot: "/var/lib/isulad", graph: "/var/lib/isulad",
runtime: "lcr", runtime: "lcr",
storageType: transform.Overlay2, storageType: transform.Overlay2,
} }
...@@ -35,20 +35,24 @@ var testIsuladTool = &IsuladTool{ ...@@ -35,20 +35,24 @@ var testIsuladTool = &IsuladTool{
func TestInitIsuladTool(t *testing.T) { func TestInitIsuladTool(t *testing.T) {
Convey("TestInitIsuladTool", t, func() { Convey("TestInitIsuladTool", t, func() {
Convey("wrong container runtime", func() { Convey("wrong container runtime", func() {
err := InitIsuladTool("", "kata", "", "") err := InitIsuladTool(&DaemonConfig{
Runtime: "kata",
})
So(err, ShouldNotBeNil) So(err, ShouldNotBeNil)
So(err.Error(), ShouldContainSubstring, "not support runtime") So(err.Error(), ShouldContainSubstring, "not support runtime")
}) })
Convey("wrong storage driver", func() { Convey("wrong storage driver", func() {
err := InitIsuladTool("", "", "aufs", "") err := InitIsuladTool(&DaemonConfig{
StorageDriver: "aufs",
})
So(err, ShouldNotBeNil) So(err, ShouldNotBeNil)
So(err.Error(), ShouldContainSubstring, "not support storage driver") So(err.Error(), ShouldContainSubstring, "not support storage driver")
}) })
Convey("default init", func() { Convey("default init", func() {
So(InitIsuladTool("", "", "", ""), ShouldBeNil) So(InitIsuladTool(&DaemonConfig{}), ShouldBeNil)
So(GetIsuladTool().graphRoot, ShouldEqual, testIsuladTool.graphRoot) So(GetIsuladTool().graph, ShouldEqual, testIsuladTool.graph)
So(GetIsuladTool().runtime, ShouldEqual, testIsuladTool.runtime) So(GetIsuladTool().runtime, ShouldEqual, testIsuladTool.runtime)
So(GetIsuladTool().storageType, ShouldEqual, testIsuladTool.storageType) So(GetIsuladTool().storageType, ShouldEqual, testIsuladTool.storageType)
So(GetIsuladTool().storageDriver, ShouldNotBeNil) So(GetIsuladTool().storageDriver, ShouldNotBeNil)
......
...@@ -13,133 +13,39 @@ ...@@ -13,133 +13,39 @@
package isulad package isulad
import ( import (
"context" "github.com/pkg/errors"
"fmt"
"net"
"strings"
"time"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"google.golang.org/grpc" "isula.org/isula-transform/pkg/isulad/internal/isuladimg"
"isula.org/isula-transform/api/isula"
"isula.org/isula-transform/transform"
)
const (
defaultAddress = "unix:///var/run/isuald/isula_image.sock"
isuladImgTimeout = 10 * time.Second
) )
var ( type isuladStorageDriver struct{}
globalIsuladStorageDriver transform.BaseStorageDriver
)
type isuladStorageDriver struct {
imgClient isula.ImageServiceClient
}
func initBaseStorageDriver(addr string) error {
client, err := newIsuladImgClient(addr)
if err != nil {
return err
}
globalIsuladStorageDriver = &isuladStorageDriver{imgClient: client}
return nil
}
// GenerateRootFs returns a new rootfs path of container
func (sd *isuladStorageDriver) GenerateRootFs(id, image string) (string, error) { func (sd *isuladStorageDriver) GenerateRootFs(id, image string) (string, error) {
req := &isula.ContainerPrepareRequest{ mountPoint := isuladimg.PrepareRootfs(id, image)
Image: image, if mountPoint == "" {
Id: id, return "", errors.New("isuladimg returns nil rootfs")
Name: id,
} }
resp, err := sd.imgClient.ContainerPrepare(context.Background(), req) return mountPoint, nil
if err != nil {
return "", err
}
if msg := resp.GetErrmsg(); msg != "" {
removeReq := &isula.ContainerRemoveRequest{
NameId: id,
}
rResp, rErr := sd.imgClient.ContainerRemove(context.Background(), removeReq)
logrus.Infof("isulad-img remove container: %v, err: %v", rResp, rErr)
return "", fmt.Errorf("isulad-img prepare failed: %s", msg)
}
return resp.MountPoint, nil
} }
// CleanupRootFs cleans up container data storaged in the isulad
func (sd *isuladStorageDriver) CleanupRootFs(id string) { func (sd *isuladStorageDriver) CleanupRootFs(id string) {
req := &isula.ContainerRemoveRequest{ if ret := isuladimg.SwitchOperation(isuladimg.RemoveOp, id, ""); ret != 0 {
NameId: id, logrus.Warnf("remove container %s's rootfs get code: %d", id, ret)
}
// During the rollback, only information is collected
_, err := sd.imgClient.ContainerRemove(context.Background(), req)
if err != nil {
logrus.Warnf("isulad-img remove container %s: %v", id, err)
} else { } else {
logrus.Infof("isulad-img remove container %s successful", id) logrus.Infof("remove container %s's rootfs successful", id)
} }
} }
// MountRootFs mounts the rw layer of container func (sd *isuladStorageDriver) MountRootFs(id, image string) error {
func (sd *isuladStorageDriver) MountRootFs(id string) error { if ret := isuladimg.SwitchOperation(isuladimg.MountOp, id, image); ret != 0 {
req := &isula.ContainerMountRequest{ return errors.Errorf("mount container %s's rootfs get ret code: %d", id, ret)
NameId: id,
}
resp, err := sd.imgClient.ContainerMount(context.Background(), req)
if err != nil {
return err
}
if msg := resp.GetErrmsg(); msg != "" {
return fmt.Errorf("isulad-img mount failed: %s", msg)
} }
return nil return nil
} }
// UmountRootFs umounts the rw layer of container func (sd *isuladStorageDriver) UmountRootFs(id, image string) error {
func (sd *isuladStorageDriver) UmountRootFs(id string) error { if ret := isuladimg.SwitchOperation(isuladimg.UmountOp, id, image); ret != 0 {
req := &isula.ContainerUmountRequest{ return errors.Errorf("umount container %s's rootfs get ret code: %d", id, ret)
NameId: id,
}
resp, err := sd.imgClient.ContainerUmount(context.Background(), req)
if err != nil {
return err
}
if msg := resp.GetErrmsg(); msg != "" {
req.Force = true
fResp, fErr := sd.imgClient.ContainerUmount(context.Background(), req)
logrus.Infof("isulad-img force umount container: %v, err: %v", fResp, fErr)
if fErr == nil && fResp.GetErrmsg() == "" {
return nil
}
return fmt.Errorf("isulad-img umount failed: %s", msg)
} }
return nil return nil
} }
func dialOpt(ctx context.Context, addr string) (net.Conn, error) {
// dialer to support unix dial
dialer := func(addr string, timeout time.Duration) (net.Conn, error) {
proto, address := "unix", strings.TrimPrefix(addr, "unix://")
return net.DialTimeout(proto, address, timeout)
}
if deadline, ok := ctx.Deadline(); ok {
return dialer(addr, time.Until(deadline))
}
return dialer(addr, isuladImgTimeout)
}
func newIsuladImgClient(addr string, opts ...grpc.DialOption) (isula.ImageServiceClient, error) {
if addr == "" {
addr = defaultAddress
}
opts = append(opts, grpc.WithInsecure(), grpc.WithContextDialer(dialOpt))
conn, err := grpc.Dial(addr, opts...)
if err != nil {
return nil, err
}
return isula.NewImageServiceClient(conn), nil
}
/*
* Copyright (c) 2020 Huawei Technologies Co., Ltd.
* isula-transform is licensed under the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
* Create: 2020-04-24
*/
package isulad
import (
"context"
"fmt"
"testing"
. "github.com/smartystreets/goconvey/convey"
"google.golang.org/grpc"
"isula.org/isula-transform/api/isula"
)
const (
bsdTestCtrID = "isulatransformbsdtestcontainer"
bsdTestCtrImage = "isulatransformbsdtestimage"
)
func TestBaseStorageDriverCreate(t *testing.T) {
ic := new(mockImgClient)
sd := isuladStorageDriver{imgClient: ic}
ic.remove = func(ctx context.Context, in *isula.ContainerRemoveRequest, opts ...grpc.CallOption) (*isula.ContainerRemoveResponse, error) {
return &isula.ContainerRemoveResponse{Errmsg: "remove no error"}, nil
}
Convey("TestBaseStorageDriver_GenerateRootFs", t, func() {
Convey("prepare return err", func() {
ic.prepare = func(ctx context.Context, in *isula.ContainerPrepareRequest, opts ...grpc.CallOption) (*isula.ContainerPrepareResponse, error) {
return nil, fmt.Errorf("err: image client prepare failed")
}
rootfs, err := sd.GenerateRootFs(bsdTestCtrID, bsdTestCtrImage)
So(err, ShouldBeError)
So(rootfs, ShouldBeBlank)
})
Convey("prepare return err msg", func() {
ic.prepare = func(ctx context.Context, in *isula.ContainerPrepareRequest, opts ...grpc.CallOption) (*isula.ContainerPrepareResponse, error) {
return &isula.ContainerPrepareResponse{Errmsg: "errMsg: image client prepare failed"}, nil
}
rootfs, err := sd.GenerateRootFs(bsdTestCtrID, bsdTestCtrImage)
So(err, ShouldBeError)
So(rootfs, ShouldBeBlank)
})
Convey("successfully prepare", func() {
testRootPath := "/test/rootfs"
ic.prepare = func(ctx context.Context, in *isula.ContainerPrepareRequest, opts ...grpc.CallOption) (*isula.ContainerPrepareResponse, error) {
return &isula.ContainerPrepareResponse{MountPoint: testRootPath}, nil
}
rootfs, err := sd.GenerateRootFs(bsdTestCtrID, bsdTestCtrImage)
So(err, ShouldBeNil)
So(rootfs, ShouldEqual, testRootPath)
})
})
Convey("TestBaseStorageDriver_CleanupRootFs", t, func() {
sd.CleanupRootFs(bsdTestCtrID)
})
}
func TestBaseStorageDriver_MountRootFs(t *testing.T) {
ic := new(mockImgClient)
sd := isuladStorageDriver{imgClient: ic}
Convey("TestBaseStorageDriver_MountRootFs", t, func() {
Convey("mount return err", func() {
errContent := "err: image client mount failed"
ic.mount = func(ctx context.Context, in *isula.ContainerMountRequest, opts ...grpc.CallOption) (*isula.ContainerMountResponse, error) {
return nil, fmt.Errorf(errContent)
}
err := sd.MountRootFs(bsdTestCtrID)
So(err, ShouldBeError)
So(err.Error(), ShouldContainSubstring, errContent)
})
Convey("mount return err msg", func() {
errMsgContent := "errMsg: image client mount failed"
ic.mount = func(ctx context.Context, in *isula.ContainerMountRequest, opts ...grpc.CallOption) (*isula.ContainerMountResponse, error) {
return &isula.ContainerMountResponse{Errmsg: errMsgContent}, nil
}
err := sd.MountRootFs(bsdTestCtrID)
So(err, ShouldBeError)
So(err.Error(), ShouldContainSubstring, errMsgContent)
})
Convey("mount successfully", func() {
ic.mount = func(ctx context.Context, in *isula.ContainerMountRequest, opts ...grpc.CallOption) (*isula.ContainerMountResponse, error) {
return nil, nil
}
err := sd.MountRootFs(bsdTestCtrID)
So(err, ShouldBeNil)
})
})
}
func TestBaseStorageDriver_UmountRootFs(t *testing.T) {
ic := new(mockImgClient)
sd := isuladStorageDriver{imgClient: ic}
Convey("TestBaseStorageDriver_UmountRootFs", t, func() {
Convey("umount return err", func() {
errContent := "err: image client umount failed"
ic.umount = func(ctx context.Context, in *isula.ContainerUmountRequest, opts ...grpc.CallOption) (*isula.ContainerUmountResponse, error) {
return nil, fmt.Errorf(errContent)
}
err := sd.UmountRootFs(bsdTestCtrID)
So(err, ShouldBeError)
So(err.Error(), ShouldContainSubstring, errContent)
})
Convey("umount return err msg", func() {
errMsgContent := "errMsg: image client umount failed"
Convey("force umount successfully", func() {
ic.umount = func(ctx context.Context, in *isula.ContainerUmountRequest, opts ...grpc.CallOption) (*isula.ContainerUmountResponse, error) {
if in.Force {
return nil, nil
}
return &isula.ContainerUmountResponse{Errmsg: errMsgContent}, nil
}
err := sd.UmountRootFs(bsdTestCtrID)
So(err, ShouldBeNil)
})
Convey("force umount return err", func() {
ic.umount = func(ctx context.Context, in *isula.ContainerUmountRequest, opts ...grpc.CallOption) (*isula.ContainerUmountResponse, error) {
return &isula.ContainerUmountResponse{Errmsg: errMsgContent}, nil
}
err := sd.UmountRootFs(bsdTestCtrID)
So(err, ShouldBeError)
So(err.Error(), ShouldContainSubstring, errMsgContent)
})
})
})
}
type mockImgClient struct {
prepare func(ctx context.Context, in *isula.ContainerPrepareRequest, opts ...grpc.CallOption) (*isula.ContainerPrepareResponse, error)
remove func(ctx context.Context, in *isula.ContainerRemoveRequest, opts ...grpc.CallOption) (*isula.ContainerRemoveResponse, error)
mount func(ctx context.Context, in *isula.ContainerMountRequest, opts ...grpc.CallOption) (*isula.ContainerMountResponse, error)
umount func(ctx context.Context, in *isula.ContainerUmountRequest, opts ...grpc.CallOption) (*isula.ContainerUmountResponse, error)
}
// create rootfs for container
func (mic *mockImgClient) ContainerPrepare(ctx context.Context, in *isula.ContainerPrepareRequest, opts ...grpc.CallOption) (*isula.ContainerPrepareResponse, error) {
return mic.prepare(ctx, in, opts...)
}
// remove rootfs of container
func (mic *mockImgClient) ContainerRemove(ctx context.Context, in *isula.ContainerRemoveRequest, opts ...grpc.CallOption) (*isula.ContainerRemoveResponse, error) {
return mic.remove(ctx, in, opts...)
}
// mount rwlayer for container
func (mic *mockImgClient) ContainerMount(ctx context.Context, in *isula.ContainerMountRequest, opts ...grpc.CallOption) (*isula.ContainerMountResponse, error) {
return mic.mount(ctx, in, opts...)
}
// umount rwlayer of container
func (mic *mockImgClient) ContainerUmount(ctx context.Context, in *isula.ContainerUmountRequest, opts ...grpc.CallOption) (*isula.ContainerUmountResponse, error) {
return mic.umount(ctx, in, opts...)
}
// ListImages lists existing images.
func (mic *mockImgClient) ListImages(ctx context.Context, in *isula.ListImagesRequest, opts ...grpc.CallOption) (*isula.ListImagesResponse, error) {
panic("not implemented") // TODO: Implement
}
// ImageStatus returns the status of the image. If the image is not
// present, returns a response with ImageStatusResponse.Image set to
// nil.
func (mic *mockImgClient) ImageStatus(ctx context.Context, in *isula.ImageStatusRequest, opts ...grpc.CallOption) (*isula.ImageStatusResponse, error) {
panic("not implemented") // TODO: Implement
}
// Get image information
func (mic *mockImgClient) ImageInfo(ctx context.Context, in *isula.ImageInfoRequest, opts ...grpc.CallOption) (*isula.ImageInfoResponse, error) {
panic("not implemented") // TODO: Implement
}
// PullImage pulls an image with authentication config.
func (mic *mockImgClient) PullImage(ctx context.Context, in *isula.PullImageRequest, opts ...grpc.CallOption) (*isula.PullImageResponse, error) {
panic("not implemented") // TODO: Implement
}
// RemoveImage removes the image.
// This call is idempotent, and must not return an error if the image has
// already been removed.
func (mic *mockImgClient) RemoveImage(ctx context.Context, in *isula.RemoveImageRequest, opts ...grpc.CallOption) (*isula.RemoveImageResponse, error) {
panic("not implemented") // TODO: Implement
}
// ImageFSInfo returns information of the filesystem that is used to store images.
func (mic *mockImgClient) ImageFsInfo(ctx context.Context, in *isula.ImageFsInfoRequest, opts ...grpc.CallOption) (*isula.ImageFsInfoResponse, error) {
panic("not implemented") // TODO: Implement
}
// Load image from file
func (mic *mockImgClient) LoadImage(ctx context.Context, in *isula.LoadImageRequest, opts ...grpc.CallOption) (*isula.LoadImageResponose, error) {
panic("not implemented") // TODO: Implement
}
// Import rootfs to be image
func (mic *mockImgClient) Import(ctx context.Context, in *isula.ImportRequest, opts ...grpc.CallOption) (*isula.ImportResponose, error) {
panic("not implemented") // TODO: Implement
}
// isulad image services
// get all Container rootfs
func (mic *mockImgClient) ListContainers(ctx context.Context, in *isula.ListContainersRequest, opts ...grpc.CallOption) (*isula.ListContainersResponse, error) {
panic("not implemented") // TODO: Implement
}
// export container rootfs
func (mic *mockImgClient) ContainerExport(ctx context.Context, in *isula.ContainerExportRequest, opts ...grpc.CallOption) (*isula.ContainerExportResponse, error) {
panic("not implemented") // TODO: Implement
}
// get filesystem usage of container
func (mic *mockImgClient) ContainerFsUsage(ctx context.Context, in *isula.ContainerFsUsageRequest, opts ...grpc.CallOption) (*isula.ContainerFsUsageResponse, error) {
panic("not implemented") // TODO: Implement
}
// get status of graphdriver
func (mic *mockImgClient) GraphdriverStatus(ctx context.Context, in *isula.GraphdriverStatusRequest, opts ...grpc.CallOption) (*isula.GraphdriverStatusResponse, error) {
panic("not implemented") // TODO: Implement
}
// get metadata of graphdriver
func (mic *mockImgClient) GraphdriverMetadata(ctx context.Context, in *isula.GraphdriverMetadataRequest, opts ...grpc.CallOption) (*isula.GraphdriverMetadataResponse, error) {
panic("not implemented") // TODO: Implement
}
// login registry
func (mic *mockImgClient) Login(ctx context.Context, in *isula.LoginRequest, opts ...grpc.CallOption) (*isula.LoginResponse, error) {
panic("not implemented") // TODO: Implement
}
// logout registry
func (mic *mockImgClient) Logout(ctx context.Context, in *isula.LogoutRequest, opts ...grpc.CallOption) (*isula.LogoutResponse, error) {
panic("not implemented") // TODO: Implement
}
// health check service
func (mic *mockImgClient) HealthCheck(ctx context.Context, in *isula.HealthCheckRequest, opts ...grpc.CallOption) (*isula.HealthCheckResponse, error) {
panic("not implemented") // TODO: Implement
}
// Add a tag to the image
func (mic *mockImgClient) TagImage(ctx context.Context, in *isula.TagImageRequest, opts ...grpc.CallOption) (*isula.TagImageResponse, error) {
panic("not implemented") // TODO: Implement
}
...@@ -33,7 +33,6 @@ const ( ...@@ -33,7 +33,6 @@ const (
) )
type diffNode struct { type diffNode struct {
// parent *diffNode
children map[string]*diffNode children map[string]*diffNode
operation uint8 operation uint8
path string path string
...@@ -113,18 +112,15 @@ func (dm *deviceMapperDriver) GenerateRootFs(id, image string) (string, error) { ...@@ -113,18 +112,15 @@ func (dm *deviceMapperDriver) GenerateRootFs(id, image string) (string, error) {
} }
func (dm *deviceMapperDriver) TransformRWLayer(ctr *types.IsuladV2Config, oldRootFs string) error { func (dm *deviceMapperDriver) TransformRWLayer(ctr *types.IsuladV2Config, oldRootFs string) error {
// mount if err := dm.BaseStorageDriver.MountRootFs(ctr.CommonConfig.ID, ctr.Image); err != nil {
if err := dm.BaseStorageDriver.MountRootFs(ctr.CommonConfig.ID); err != nil {
return err return err
} }
// umount
defer func() { defer func() {
if err := dm.BaseStorageDriver.UmountRootFs(ctr.CommonConfig.ID); err != nil { if err := dm.BaseStorageDriver.UmountRootFs(ctr.CommonConfig.ID, ctr.Image); err != nil {
logrus.Infof("device mapper umount rootfs failed: %v", err) logrus.Infof("device mapper umount rootfs failed: %v", err)
} }
}() }()
// get diff
diff, err := dm.client.ContainerDiff(context.Background(), ctr.CommonConfig.ID) diff, err := dm.client.ContainerDiff(context.Background(), ctr.CommonConfig.ID)
if err != nil { if err != nil {
return err return err
...@@ -136,14 +132,12 @@ func (dm *deviceMapperDriver) TransformRWLayer(ctr *types.IsuladV2Config, oldRoo ...@@ -136,14 +132,12 @@ func (dm *deviceMapperDriver) TransformRWLayer(ctr *types.IsuladV2Config, oldRoo
dest := ctr.CommonConfig.BaseFs + changes[idx].Path dest := ctr.CommonConfig.BaseFs + changes[idx].Path
switch changes[idx].Kind { switch changes[idx].Kind {
case addItem, changeItem: case addItem, changeItem:
// cp
destRoot := filepath.Dir(dest) destRoot := filepath.Dir(dest)
if err := exec.Command("cp", "-ra", src, destRoot).Run(); err != nil { if err := exec.Command("cp", "-ra", src, destRoot).Run(); err != nil {
logrus.Errorf("device mapper copy %s to %s filed: %v", src, dest, err) logrus.Errorf("device mapper copy %s to %s filed: %v", src, dest, err)
return err return err
} }
case delItem: case delItem:
// delete
if err := os.RemoveAll(dest); err != nil { if err := os.RemoveAll(dest); err != nil {
logrus.Errorf("device mapper remover %s filed: %v", dest, err) logrus.Errorf("device mapper remover %s filed: %v", dest, err)
return err return err
...@@ -167,7 +161,6 @@ note: filter path which match bind mount in container ...@@ -167,7 +161,6 @@ note: filter path which match bind mount in container
*/ */
func (dm *deviceMapperDriver) changesFilter(changes []container.ContainerChangeResponseItem, func (dm *deviceMapperDriver) changesFilter(changes []container.ContainerChangeResponseItem,
mounts map[string]types.Mount) []container.ContainerChangeResponseItem { mounts map[string]types.Mount) []container.ContainerChangeResponseItem {
// create trie
t := newTrie() t := newTrie()
for _, change := range changes { for _, change := range changes {
if _, ok := mounts[change.Path]; ok { if _, ok := mounts[change.Path]; ok {
......
...@@ -301,7 +301,6 @@ func (t *dockerTransformer) transformHostConfig(id string) (*types.IsuladHostCon ...@@ -301,7 +301,6 @@ func (t *dockerTransformer) transformHostConfig(id string) (*types.IsuladHostCon
&l, &l,
} }
// load
hostCfgPath := filepath.Join(t.GraphRoot, "containers", id, types.Hostconfig) hostCfgPath := filepath.Join(t.GraphRoot, "containers", id, types.Hostconfig)
err := utils.CheckFileValid(hostCfgPath) err := utils.CheckFileValid(hostCfgPath)
if err != nil { if err != nil {
...@@ -315,14 +314,12 @@ func (t *dockerTransformer) transformHostConfig(id string) (*types.IsuladHostCon ...@@ -315,14 +314,12 @@ func (t *dockerTransformer) transformHostConfig(id string) (*types.IsuladHostCon
return nil, nil, errors.Wrap(err, "read hostconfig.json") return nil, nil, errors.Wrap(err, "read hostconfig.json")
} }
// Unmarshal to types.IsuladHostConfig
err = json.Unmarshal(data, &hostCfg) err = json.Unmarshal(data, &hostCfg)
if err != nil { if err != nil {
logrus.Errorf("can't unmarshal container %s's host config to iSulad type: %v", id, err) logrus.Errorf("can't unmarshal container %s's host config to iSulad type: %v", id, err)
return nil, nil, errors.Wrap(err, "unmarshal host config data") return nil, nil, errors.Wrap(err, "unmarshal host config data")
} }
// reconcile and save
iSulad := isulad.GetIsuladTool() iSulad := isulad.GetIsuladTool()
reconcileHostConfig(&isuladHostCfg, iSulad.Runtime()) reconcileHostConfig(&isuladHostCfg, iSulad.Runtime())
err = iSulad.SaveConfig(id, &isuladHostCfg, iSulad.MarshalIndent, iSulad.GetHostCfgPath) err = iSulad.SaveConfig(id, &isuladHostCfg, iSulad.MarshalIndent, iSulad.GetHostCfgPath)
...@@ -371,7 +368,6 @@ func (t *dockerTransformer) transformV2Config(id string, opts ...v2ConfigReconci ...@@ -371,7 +368,6 @@ func (t *dockerTransformer) transformV2Config(id string, opts ...v2ConfigReconci
iSulad = isulad.GetIsuladTool() iSulad = isulad.GetIsuladTool()
) )
// load
ctr, err := t.loadV2Config(id) ctr, err := t.loadV2Config(id)
if err != nil { if err != nil {
logrus.Errorf("load container %s's v2 config failed: %v", id, err) logrus.Errorf("load container %s's v2 config failed: %v", id, err)
...@@ -415,7 +411,6 @@ func (t *dockerTransformer) transformV2Config(id string, opts ...v2ConfigReconci ...@@ -415,7 +411,6 @@ func (t *dockerTransformer) transformV2Config(id string, opts ...v2ConfigReconci
return nil, errors.Wrap(err, "generate new rootfs") return nil, errors.Wrap(err, "generate new rootfs")
} }
// save
err = iSulad.SaveConfig(id, &iSuladV2Cfg, iSulad.MarshalIndent, iSulad.GetConfigV2Path) err = iSulad.SaveConfig(id, &iSuladV2Cfg, iSulad.MarshalIndent, iSulad.GetConfigV2Path)
if err != nil { if err != nil {
logrus.Errorf("save v2 config to file %s failed", iSulad.GetConfigV2Path(id)) logrus.Errorf("save v2 config to file %s failed", iSulad.GetConfigV2Path(id))
......
...@@ -360,9 +360,11 @@ func Test_dockerConfigEngine_transformOciConfig(t *testing.T) { ...@@ -360,9 +360,11 @@ func Test_dockerConfigEngine_transformOciConfig(t *testing.T) {
func Test_dockerTransformer_initStorageDriver(t *testing.T) { func Test_dockerTransformer_initStorageDriver(t *testing.T) {
dt := &dockerTransformer{} dt := &dockerTransformer{}
Convey("Test_dockerTransformer_initStorageDriver", t, func() { SkipConvey("Test_dockerTransformer_initStorageDriver", t, func() {
Convey("overlay2 driver", func() { Convey("overlay2 driver", func() {
err := isulad.InitIsuladTool("", "", "overlay2", "") err := isulad.InitIsuladTool(&isulad.DaemonConfig{
StorageDriver: "overlay2",
})
So(err, ShouldBeNil) So(err, ShouldBeNil)
ol, err := dt.initStorageDriver() ol, err := dt.initStorageDriver()
So(err, ShouldBeNil) So(err, ShouldBeNil)
...@@ -371,7 +373,14 @@ func Test_dockerTransformer_initStorageDriver(t *testing.T) { ...@@ -371,7 +373,14 @@ func Test_dockerTransformer_initStorageDriver(t *testing.T) {
}) })
Convey("devicemapper driver", func() { Convey("devicemapper driver", func() {
err := isulad.InitIsuladTool("", "", "devicemapper", "") err := isulad.InitIsuladTool(&isulad.DaemonConfig{
StorageDriver: "devicemapper",
StorageOpts: []string{
"dm.thinpooldev=/dev/mapper/isulad-thinpool",
"dm.fs=ext4",
"dm.min_free_space=10%",
},
})
So(err, ShouldBeNil) So(err, ShouldBeNil)
ol, err := dt.initStorageDriver() ol, err := dt.initStorageDriver()
So(err, ShouldBeNil) So(err, ShouldBeNil)
...@@ -501,7 +510,9 @@ func initDockerTransformTest(repalceVar, id, src, dest string, initIsuladTool bo ...@@ -501,7 +510,9 @@ func initDockerTransformTest(repalceVar, id, src, dest string, initIsuladTool bo
} }
if initIsuladTool { if initIsuladTool {
graph := filepath.Join(repalceVar + "/lib/isulad") graph := filepath.Join(repalceVar + "/lib/isulad")
_ = isulad.InitIsuladTool(graph, "", "", "") _ = isulad.InitIsuladTool(&isulad.DaemonConfig{
Graph: graph,
})
return isulad.GetIsuladTool().PrepareBundleDir(id) return isulad.GetIsuladTool().PrepareBundleDir(id)
} }
return nil return nil
......
// Code generated by MockGen. DO NOT EDIT.
// Source: isula.org/isula-transform/transform (interfaces: StorageDriver)
// Package docker is a generated GoMock package.
package docker
import (
gomock "github.com/golang/mock/gomock"
types "isula.org/isula-transform/types"
reflect "reflect"
)
// MockStorageDriver is a mock of StorageDriver interface
type MockStorageDriver struct {
ctrl *gomock.Controller
recorder *MockStorageDriverMockRecorder
}
// MockStorageDriverMockRecorder is the mock recorder for MockStorageDriver
type MockStorageDriverMockRecorder struct {
mock *MockStorageDriver
}
// NewMockStorageDriver creates a new mock instance
func NewMockStorageDriver(ctrl *gomock.Controller) *MockStorageDriver {
mock := &MockStorageDriver{ctrl: ctrl}
mock.recorder = &MockStorageDriverMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockStorageDriver) EXPECT() *MockStorageDriverMockRecorder {
return m.recorder
}
// Cleanup mocks base method
func (m *MockStorageDriver) Cleanup(arg0 string) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "Cleanup", arg0)
}
// Cleanup indicates an expected call of Cleanup
func (mr *MockStorageDriverMockRecorder) Cleanup(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cleanup", reflect.TypeOf((*MockStorageDriver)(nil).Cleanup), arg0)
}
// GenerateRootFs mocks base method
func (m *MockStorageDriver) GenerateRootFs(arg0, arg1 string) (string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GenerateRootFs", arg0, arg1)
ret0, _ := ret[0].(string)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GenerateRootFs indicates an expected call of GenerateRootFs
func (mr *MockStorageDriverMockRecorder) GenerateRootFs(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateRootFs", reflect.TypeOf((*MockStorageDriver)(nil).GenerateRootFs), arg0, arg1)
}
// TransformRWLayer mocks base method
func (m *MockStorageDriver) TransformRWLayer(arg0 *types.IsuladV2Config, arg1 string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "TransformRWLayer", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// TransformRWLayer indicates an expected call of TransformRWLayer
func (mr *MockStorageDriverMockRecorder) TransformRWLayer(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TransformRWLayer", reflect.TypeOf((*MockStorageDriver)(nil).TransformRWLayer), arg0, arg1)
}
...@@ -13,8 +13,6 @@ ...@@ -13,8 +13,6 @@
package transform package transform
import ( import (
"time"
"isula.org/isula-transform/types" "isula.org/isula-transform/types"
) )
...@@ -23,10 +21,8 @@ type StorageType string ...@@ -23,10 +21,8 @@ type StorageType string
// support storage driver // support storage driver
const ( const (
Overlay2 StorageType = "overlay2" Overlay2 StorageType = "overlay2"
DeviceMapper StorageType = "devicemapper" DeviceMapper StorageType = "devicemapper"
defaultAddress = "unix:///var/run/isuald/isula_image.sock"
isuladImgTimeout = 10 * time.Second
) )
// StorageDriver defines methods for creating and rolling storage resources // StorageDriver defines methods for creating and rolling storage resources
...@@ -43,6 +39,6 @@ type StorageDriver interface { ...@@ -43,6 +39,6 @@ type StorageDriver interface {
type BaseStorageDriver interface { type BaseStorageDriver interface {
GenerateRootFs(id, image string) (string, error) GenerateRootFs(id, image string) (string, error)
CleanupRootFs(id string) CleanupRootFs(id string)
MountRootFs(id string) error MountRootFs(id, image string) error
UmountRootFs(id string) error UmountRootFs(id, image string) error
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册