github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagebuilder/builder/api.go (about) 1 package builder 2 3 import ( 4 "bytes" 5 "io" 6 "sync" 7 "time" 8 9 "github.com/Cloud-Foundations/Dominator/lib/filesystem/util" 10 "github.com/Cloud-Foundations/Dominator/lib/filter" 11 "github.com/Cloud-Foundations/Dominator/lib/image" 12 "github.com/Cloud-Foundations/Dominator/lib/log" 13 "github.com/Cloud-Foundations/Dominator/lib/slavedriver" 14 "github.com/Cloud-Foundations/Dominator/lib/srpc" 15 "github.com/Cloud-Foundations/Dominator/lib/triggers" 16 proto "github.com/Cloud-Foundations/Dominator/proto/imaginator" 17 ) 18 19 type buildLogger interface { 20 Bytes() []byte 21 io.Writer 22 } 23 24 type environmentGetter interface { 25 getenv() map[string]string 26 } 27 28 type imageBuilder interface { 29 build(b *Builder, client *srpc.Client, request proto.BuildImageRequest, 30 buildLog buildLogger) (*image.Image, error) 31 } 32 33 type bootstrapStream struct { 34 builder *Builder 35 name string 36 BootstrapCommand []string 37 *filter.Filter 38 imageFilter *filter.Filter 39 ImageFilterUrl string 40 imageTriggers *triggers.Triggers 41 ImageTriggersUrl string 42 PackagerType string 43 } 44 45 type buildResultType struct { 46 imageName string 47 startTime time.Time 48 finishTime time.Time 49 buildLog []byte 50 error error 51 } 52 53 type masterConfigurationType struct { 54 BindMounts []string `json:",omitempty"` 55 BootstrapStreams map[string]*bootstrapStream `json:",omitempty"` 56 ImageStreamsCheckInterval uint `json:",omitempty"` 57 ImageStreamsToAutoRebuild []string `json:",omitempty"` 58 ImageStreamsUrl string `json:",omitempty"` 59 PackagerTypes map[string]packagerType `json:",omitempty"` 60 } 61 62 type manifestConfigType struct { 63 SourceImage string 64 *filter.Filter 65 } 66 67 type manifestType struct { 68 filter *filter.Filter 69 sourceImageInfo *sourceImageInfoType 70 } 71 72 type imageStreamType struct { 73 builder *Builder 74 name string 75 BuilderGroups []string 76 ManifestUrl string 77 ManifestDirectory string 78 } 79 80 type imageStreamsConfigurationType struct { 81 Streams map[string]*imageStreamType `json:",omitempty"` 82 } 83 84 type argList []string 85 86 type listCommandType struct { 87 ArgList argList 88 SizeMultiplier uint64 89 } 90 91 type packagerType struct { 92 CleanCommand argList 93 InstallCommand argList 94 ListCommand listCommandType 95 RemoveCommand argList 96 UpdateCommand argList 97 UpgradeCommand argList 98 Verbatim []string 99 } 100 101 type sourceImageInfoType struct { 102 computedFiles []util.ComputedFile 103 filter *filter.Filter 104 triggers *triggers.Triggers 105 } 106 107 type Builder struct { 108 bindMounts []string 109 stateDir string 110 imageServerAddress string 111 logger log.Logger 112 imageStreamsUrl string 113 streamsLock sync.RWMutex 114 bootstrapStreams map[string]*bootstrapStream 115 imageStreams map[string]*imageStreamType 116 imageStreamsToAutoRebuild []string 117 slaveDriver *slavedriver.SlaveDriver 118 buildResultsLock sync.RWMutex 119 currentBuildLogs map[string]*bytes.Buffer // Key: stream name. 120 lastBuildResults map[string]buildResultType // Key: stream name. 121 packagerTypes map[string]packagerType 122 variables map[string]string 123 } 124 125 func Load(confUrl, variablesFile, stateDir, imageServerAddress string, 126 imageRebuildInterval time.Duration, slaveDriver *slavedriver.SlaveDriver, 127 logger log.DebugLogger) (*Builder, error) { 128 return load(confUrl, variablesFile, stateDir, imageServerAddress, 129 imageRebuildInterval, slaveDriver, logger) 130 } 131 132 func (b *Builder) BuildImage(request proto.BuildImageRequest, 133 authInfo *srpc.AuthInformation, 134 logWriter io.Writer) (*image.Image, string, error) { 135 return b.buildImage(request, authInfo, logWriter) 136 } 137 138 func (b *Builder) GetCurrentBuildLog(streamName string) ([]byte, error) { 139 return b.getCurrentBuildLog(streamName) 140 } 141 142 func (b *Builder) GetLatestBuildLog(streamName string) ([]byte, error) { 143 return b.getLatestBuildLog(streamName) 144 } 145 146 func (b *Builder) ShowImageStream(writer io.Writer, streamName string) { 147 b.showImageStream(writer, streamName) 148 } 149 150 func (b *Builder) ShowImageStreams(writer io.Writer) { 151 b.showImageStreams(writer) 152 } 153 154 func (b *Builder) WriteHtml(writer io.Writer) { 155 b.writeHtml(writer) 156 } 157 158 func BuildImageFromManifest(client *srpc.Client, manifestDir, streamName string, 159 expiresIn time.Duration, bindMounts []string, buildLog buildLogger, 160 logger log.Logger) ( 161 string, error) { 162 _, name, err := buildImageFromManifestAndUpload(client, manifestDir, 163 proto.BuildImageRequest{ 164 StreamName: streamName, 165 ExpiresIn: expiresIn, 166 }, 167 bindMounts, nil, buildLog) 168 return name, err 169 } 170 171 func BuildTreeFromManifest(client *srpc.Client, manifestDir string, 172 bindMounts []string, buildLog io.Writer, 173 logger log.Logger) (string, error) { 174 return buildTreeFromManifest(client, manifestDir, bindMounts, nil, buildLog) 175 } 176 177 func ProcessManifest(manifestDir, rootDir string, bindMounts []string, 178 buildLog io.Writer) error { 179 return processManifest(manifestDir, rootDir, bindMounts, nil, buildLog) 180 } 181 182 func UnpackImageAndProcessManifest(client *srpc.Client, manifestDir string, 183 rootDir string, bindMounts []string, buildLog io.Writer) error { 184 _, err := unpackImageAndProcessManifest(client, manifestDir, rootDir, 185 bindMounts, true, nil, buildLog) 186 return err 187 }