// Clone clones the container using given arguments with specified backend. func (c *Container) Clone(name string, options CloneOptions) error { // FIXME: bdevdata, newsize and hookargs // // bdevdata: // zfs requires zfsroot // lvm requires lvname/vgname/thinpool as well as fstype and fssize // btrfs requires nothing // dir requires nothing // // newsize: for blockdev-backed backingstores // // hookargs: additional arguments to pass to the clone hook script if err := c.makeSure(isDefined | isNotRunning); err != nil { return err } c.mu.Lock() defer c.mu.Unlock() // use Directory backend if not set if options.Backend == 0 { options.Backend = Directory } var flags int if options.KeepName { flags |= C.LXC_CLONE_KEEPNAME } if options.KeepMAC { flags |= C.LXC_CLONE_KEEPMACADDR } if options.Snapshot { flags |= C.LXC_CLONE_SNAPSHOT } cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) cbackend := C.CString(options.Backend.String()) defer C.free(unsafe.Pointer(cbackend)) if options.ConfigPath != "" { clxcpath := C.CString(options.ConfigPath) defer C.free(unsafe.Pointer(clxcpath)) if !bool(C.go_lxc_clone(c.container, cname, clxcpath, C.int(flags), cbackend)) { return ErrCloneFailed } } else { if !bool(C.go_lxc_clone(c.container, cname, nil, C.int(flags), cbackend)) { return ErrCloneFailed } } return nil }
// CloneUsing clones the container using given arguments with specified backend. // // Additional flags to change the cloning behaviour: // CloneKeepName, CloneKeepMACAddr, CloneSnapshot and CloneMaybeSnapshot func (c *Container) CloneUsing(name string, backend BackendStore, flags CloneFlags) error { // FIXME: support lxcpath, bdevtype, bdevdata, newsize and hookargs // // bdevtypes: // "btrfs", "zfs", "lvm", "dir" "overlayfs" // // bdevdata: // zfs requires zfsroot // lvm requires lvname/vgname/thinpool as well as fstype and fssize // btrfs requires nothing // dir requires nothing // // newsize: for blockdev-backed backingstores // // hookargs: additional arguments to pass to the clone hook script if err := c.makeSure(isDefined | isNotRunning); err != nil { return err } c.mu.Lock() defer c.mu.Unlock() cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) cbackend := C.CString(backend.String()) defer C.free(unsafe.Pointer(cbackend)) if !bool(C.go_lxc_clone(c.container, cname, C.int(flags), cbackend)) { return ErrCloneFailed } return nil }