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 }