func removeImgWorkdir(d *Daemon, builddir string) { vgname, _, err := getServerConfigValue(d, "core.lvm_vg_name") if err != nil { shared.Debugf("Error checking server config: %v", err) } matches, _ := filepath.Glob(fmt.Sprintf("%s/*.lv", builddir)) if len(matches) > 0 { if len(matches) > 1 { shared.Debugf("Unexpected - more than one .lv file in builddir. using first: %v", matches) } lvsymlink := matches[0] if lvpath, err := os.Readlink(lvsymlink); err != nil { shared.Debugf("Error reading target of symlink '%s'", lvsymlink) } else { err = shared.LVMRemoveLV(vgname, filepath.Base(lvpath)) if err != nil { shared.Debugf("Error removing LV '%s': %v", lvpath, err) } } } if d.BackingFs == "btrfs" { /* cannot rm -rf /a if /a/b is a subvolume, so first delete subvolumes */ /* todo: find the .btrfs file under dir */ fnamelist, _ := shared.ReadDir(builddir) for _, fname := range fnamelist { subvol := filepath.Join(builddir, fname) btrfsDeleteSubvol(subvol) } } if remErr := os.RemoveAll(builddir); remErr != nil { shared.Debugf("Error deleting temporary directory: %s", remErr) } }
func imageDelete(d *Daemon, r *http.Request) Response { fingerprint := mux.Vars(r)["fingerprint"] imgInfo, err := dbImageGet(d.db, fingerprint, false) if err != nil { return SmartError(err) } fname := shared.VarPath("images", imgInfo.Fingerprint) err = os.Remove(fname) if err != nil { shared.Debugf("Error deleting image file %s: %s\n", fname, err) } fmetaname := shared.VarPath("images", imgInfo.Fingerprint+".rootfs") if shared.PathExists(fmetaname) { err = os.Remove(fmetaname) if err != nil { shared.Debugf("Error deleting image file %s: %s\n", fmetaname, err) } } vgname, vgnameIsSet, err := getServerConfigValue(d, "core.lvm_vg_name") if err != nil { return InternalError(fmt.Errorf("Error checking server config: %v", err)) } if vgnameIsSet { err = shared.LVMRemoveLV(vgname, imgInfo.Fingerprint) if err != nil { return InternalError(fmt.Errorf("Failed to remove deleted image LV: %v", err)) } lvsymlink := fmt.Sprintf("%s.lv", fname) err = os.Remove(lvsymlink) if err != nil { return InternalError(fmt.Errorf("Failed to remove symlink to deleted image LV: '%s': %v", lvsymlink, err)) } } else if d.BackingFs == "btrfs" { subvol := fmt.Sprintf("%s.btrfs", fname) btrfsDeleteSubvol(subvol) } tx, err := dbBegin(d.db) if err != nil { return InternalError(err) } _, _ = tx.Exec("DELETE FROM images_aliases WHERE image_id=?", imgInfo.Id) _, _ = tx.Exec("DELETE FROM images_properties WHERE image_id?", imgInfo.Id) _, _ = tx.Exec("DELETE FROM images WHERE id=?", imgInfo.Id) if err := txCommit(tx); err != nil { return InternalError(err) } return EmptySyncResponse }
func removeContainerPath(d *Daemon, name string) error { cpath := shared.VarPath("lxc", name) backingFs, err := shared.GetFilesystem(cpath) if err != nil { if os.IsNotExist(err) { return nil } shared.Debugf("Error cleaning up %s: %s\n", cpath, err) return err } vgname, vgnameIsSet, err := getServerConfigValue(d, "core.lvm_vg_name") if err != nil { return fmt.Errorf("Error checking server config: %v", err) } if vgnameIsSet { err = shared.LVMRemoveLV(vgname, name) if err != nil { return fmt.Errorf("failed to remove deleted container LV: %v", err) } } else if backingFs == "btrfs" && btrfsIsSubvolume(cpath) { if err := btrfsDeleteSubvol(cpath); err != nil { return err } } err = os.RemoveAll(cpath) if err != nil { shared.Debugf("Error cleaning up %s: %s\n", cpath, err) return err } return nil }