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  }