1package main 2 3import ( 4 "errors" 5 "fmt" 6 "os" 7 "path/filepath" 8 9 "github.com/Microsoft/hcsshim" 10 "github.com/Microsoft/hcsshim/internal/appargs" 11 "github.com/urfave/cli" 12) 13 14var mountCommand = cli.Command{ 15 Name: "mount", 16 Usage: "mounts a scratch", 17 ArgsUsage: "<scratch path>", 18 Flags: []cli.Flag{ 19 cli.StringSliceFlag{ 20 Name: "layer, l", 21 Usage: "paths to the parent layers for this layer", 22 }, 23 }, 24 Action: func(context *cli.Context) (err error) { 25 if context.NArg() != 1 { 26 return errors.New("invalid usage") 27 } 28 path, err := filepath.Abs(context.Args().First()) 29 if err != nil { 30 return err 31 } 32 33 layers, err := normalizeLayers(context.StringSlice("layer"), true) 34 if err != nil { 35 return err 36 } 37 38 err = hcsshim.ActivateLayer(driverInfo, path) 39 if err != nil { 40 return err 41 } 42 defer func() { 43 if err != nil { 44 hcsshim.DeactivateLayer(driverInfo, path) 45 } 46 }() 47 48 err = hcsshim.PrepareLayer(driverInfo, path, layers) 49 if err != nil { 50 return err 51 } 52 defer func() { 53 if err != nil { 54 hcsshim.UnprepareLayer(driverInfo, path) 55 } 56 }() 57 58 mountPath, err := hcsshim.GetLayerMountPath(driverInfo, path) 59 if err != nil { 60 return err 61 } 62 _, err = fmt.Println(mountPath) 63 return err 64 }, 65} 66 67var unmountCommand = cli.Command{ 68 Name: "unmount", 69 Usage: "unmounts a scratch", 70 ArgsUsage: "<layer path>", 71 Before: appargs.Validate(appargs.NonEmptyString), 72 Action: func(context *cli.Context) (err error) { 73 path, err := filepath.Abs(context.Args().First()) 74 if err != nil { 75 return err 76 } 77 78 err = hcsshim.UnprepareLayer(driverInfo, path) 79 if err != nil { 80 fmt.Fprintln(os.Stderr, err) 81 } 82 err = hcsshim.DeactivateLayer(driverInfo, path) 83 if err != nil { 84 return err 85 } 86 return nil 87 }, 88} 89