github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/getImage.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/Cloud-Foundations/Dominator/lib/filesystem" 8 "github.com/Cloud-Foundations/Dominator/lib/filesystem/util" 9 "github.com/Cloud-Foundations/Dominator/lib/format" 10 "github.com/Cloud-Foundations/Dominator/lib/log" 11 "github.com/Cloud-Foundations/Dominator/lib/log/nulllogger" 12 "github.com/Cloud-Foundations/Dominator/lib/objectserver" 13 objectclient "github.com/Cloud-Foundations/Dominator/lib/objectserver/client" 14 ) 15 16 func getImageSubcommand(args []string, logger log.DebugLogger) error { 17 _, objectClient := getClients() 18 err := getImageAndWrite(objectClient, args[0], args[1], logger) 19 if err != nil { 20 return fmt.Errorf("error getting image: %s", err) 21 } 22 return nil 23 } 24 25 func getImageAndWrite(objectClient *objectclient.ObjectClient, name, 26 dirname string, logger log.DebugLogger) error { 27 startTime := time.Now() 28 fs, objectsGetter, err := getImageForUnpack(objectClient, name) 29 if err != nil { 30 return err 31 } 32 logger.Debugf(0, "Got image: %s in %s\n", 33 name, format.Duration(time.Since(startTime))) 34 startTime = time.Now() 35 err = util.Unpack(fs, objectsGetter, dirname, nulllogger.New()) 36 if err != nil { 37 return err 38 } 39 duration := time.Since(startTime) 40 speed := uint64(float64(fs.TotalDataBytes) / duration.Seconds()) 41 logger.Debugf(0, "Downloaded and unpacked %d objects (%s) in %s (%s/s)\n", 42 fs.NumRegularInodes, format.FormatBytes(fs.TotalDataBytes), 43 format.Duration(duration), format.FormatBytes(speed)) 44 return util.WriteImageName(dirname, name) 45 } 46 47 func getImageForUnpack(objectClient *objectclient.ObjectClient, name string) ( 48 *filesystem.FileSystem, objectserver.ObjectsGetter, error) { 49 fs, err := getTypedFileSystem(name) 50 if err != nil { 51 return nil, nil, err 52 } 53 if *computedFilesRoot == "" { 54 return fs, objectClient, nil 55 } 56 objectsGetter, err := util.ReplaceComputedFiles(fs, 57 &util.ComputedFilesData{RootDirectory: *computedFilesRoot}, 58 objectClient) 59 if err != nil { 60 return nil, nil, err 61 } 62 return fs, objectsGetter, nil 63 }