github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imaginator/slaveDriver.go (about)

     1  //go:build linux
     2  
     3  package main
     4  
     5  import (
     6  	"path/filepath"
     7  	"time"
     8  
     9  	"github.com/Cloud-Foundations/Dominator/lib/fsutil"
    10  	"github.com/Cloud-Foundations/Dominator/lib/json"
    11  	"github.com/Cloud-Foundations/Dominator/lib/log"
    12  	"github.com/Cloud-Foundations/Dominator/lib/slavedriver"
    13  	"github.com/Cloud-Foundations/Dominator/lib/slavedriver/smallstack"
    14  	"github.com/Cloud-Foundations/Dominator/proto/hypervisor"
    15  )
    16  
    17  type slaveDriverConfiguration struct {
    18  	CreateTimeoutInSeconds  uint64
    19  	DestroyTimeoutInSeconds uint64
    20  	HypervisorAddress       string
    21  	MaximumIdleSlaves       uint
    22  	MinimumIdleSlaves       uint
    23  	ImageIdentifier         string
    24  	MemoryInMiB             uint64
    25  	MilliCPUs               uint
    26  	PreferMemoryVolume      bool
    27  	OverlayDirectory        string
    28  	VirtualCPUs             uint
    29  }
    30  
    31  func createSlaveDriver(logger log.DebugLogger) (
    32  	*slavedriver.SlaveDriver, time.Duration, error) {
    33  	if *slaveDriverConfigurationFile == "" {
    34  		return nil, 0, nil
    35  	}
    36  	var configuration slaveDriverConfiguration
    37  	err := json.ReadFromFile(*slaveDriverConfigurationFile, &configuration)
    38  	if err != nil {
    39  		return nil, 0, err
    40  	}
    41  	createVmRequest := hypervisor.CreateVmRequest{
    42  		DhcpTimeout:      time.Minute,
    43  		MinimumFreeBytes: 256 << 20,
    44  		SkipBootloader:   true,
    45  		VmInfo: hypervisor.VmInfo{
    46  			ImageName:   configuration.ImageIdentifier,
    47  			MemoryInMiB: configuration.MemoryInMiB,
    48  			MilliCPUs:   configuration.MilliCPUs,
    49  			VirtualCPUs: configuration.VirtualCPUs,
    50  		},
    51  	}
    52  	if configuration.PreferMemoryVolume {
    53  		createVmRequest.VmInfo.Volumes = []hypervisor.Volume{
    54  			{Type: hypervisor.VolumeTypeMemory},
    55  		}
    56  	}
    57  	if configuration.OverlayDirectory != "" {
    58  		overlayFiles, err := fsutil.ReadFileTree(configuration.OverlayDirectory,
    59  			"/")
    60  		if err != nil {
    61  			return nil, 0, err
    62  		}
    63  		createVmRequest.OverlayFiles = overlayFiles
    64  	}
    65  	slaveTrader, err := smallstack.NewSlaveTraderWithOptions(
    66  		smallstack.SlaveTraderOptions{
    67  			CreateRequest: createVmRequest,
    68  			CreateTimeout: time.Second * time.Duration(
    69  				configuration.CreateTimeoutInSeconds),
    70  			DestroyTimeout: time.Second * time.Duration(
    71  				configuration.DestroyTimeoutInSeconds),
    72  			HypervisorAddress: configuration.HypervisorAddress,
    73  		},
    74  		logger)
    75  	if err != nil {
    76  		return nil, 0, err
    77  	}
    78  	slaveDriver, err := slavedriver.NewSlaveDriver(
    79  		slavedriver.SlaveDriverOptions{
    80  			DatabaseFilename:  filepath.Join(*stateDir, "build-slaves.json"),
    81  			MaximumIdleSlaves: configuration.MaximumIdleSlaves,
    82  			MinimumIdleSlaves: configuration.MinimumIdleSlaves,
    83  			PortNumber:        *portNum,
    84  			Purpose:           "building",
    85  		},
    86  		slaveTrader, logger)
    87  	if err != nil {
    88  		return nil, 0, err
    89  	}
    90  	return slaveDriver,
    91  		time.Second * time.Duration(configuration.CreateTimeoutInSeconds),
    92  		nil
    93  }