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  }