github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/builder-tool/manifest.go (about)

     1  //go:build linux
     2  
     3  package main
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"os"
     9  	"syscall"
    10  
    11  	"github.com/Cloud-Foundations/Dominator/imagebuilder/builder"
    12  	"github.com/Cloud-Foundations/Dominator/lib/decoders"
    13  	"github.com/Cloud-Foundations/Dominator/lib/filter"
    14  	"github.com/Cloud-Foundations/Dominator/lib/fsutil"
    15  	"github.com/Cloud-Foundations/Dominator/lib/log"
    16  )
    17  
    18  const filePerms = syscall.S_IRUSR | syscall.S_IRGRP | syscall.S_IROTH
    19  
    20  type logWriterType struct {
    21  	buffer bytes.Buffer
    22  }
    23  
    24  func buildFromManifestSubcommand(args []string, logger log.DebugLogger) error {
    25  	return buildFromManifest(args[0], args[1], logger)
    26  }
    27  
    28  func buildFromManifest(manifestDirectory, streamName string,
    29  	logger log.DebugLogger) error {
    30  	srpcClient := getImageServerClient()
    31  	logWriter := &logWriterType{}
    32  	if *alwaysShowBuildLog {
    33  		fmt.Fprintln(os.Stderr, "Start of build log ==========================")
    34  	}
    35  	var mtimesCopyFilter *filter.Filter
    36  	if *mtimesCopyFilterFile != "" {
    37  		var err error
    38  		mtimesCopyFilter, err = filter.Load(*mtimesCopyFilterFile)
    39  		if err != nil {
    40  			return err
    41  		}
    42  	}
    43  	var variables map[string]string
    44  	if *variablesFilename != "" {
    45  		err := decoders.DecodeFile(*variablesFilename, &variables)
    46  		if err != nil {
    47  			return err
    48  		}
    49  	}
    50  	name, err := builder.BuildImageFromManifestWithOptions(
    51  		srpcClient,
    52  		builder.BuildLocalOptions{
    53  			BindMounts:        bindMounts,
    54  			ManifestDirectory: manifestDirectory,
    55  			MtimesCopyFilter:  mtimesCopyFilter,
    56  			Variables:         variables,
    57  		},
    58  		streamName,
    59  		*expiresIn,
    60  		logWriter)
    61  	if err != nil {
    62  		if !*alwaysShowBuildLog {
    63  			fmt.Fprintln(os.Stderr,
    64  				"Start of build log ==========================")
    65  			os.Stderr.Write(logWriter.Bytes())
    66  		}
    67  		fmt.Fprintln(os.Stderr, "End of build log ============================")
    68  		return fmt.Errorf("error processing manifest: %s", err)
    69  	}
    70  	if *alwaysShowBuildLog {
    71  		fmt.Fprintln(os.Stderr, "End of build log ============================")
    72  	} else {
    73  		err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer,
    74  			uint64(logWriter.buffer.Len()))
    75  		if err != nil {
    76  			return fmt.Errorf("error writing build log: %s", err)
    77  		}
    78  	}
    79  	fmt.Println(name)
    80  	return nil
    81  }
    82  
    83  func buildTreeFromManifestSubcommand(args []string,
    84  	logger log.DebugLogger) error {
    85  	srpcClient := getImageServerClient()
    86  	logWriter := &logWriterType{}
    87  	if *alwaysShowBuildLog {
    88  		fmt.Fprintln(os.Stderr, "Start of build log ==========================")
    89  	}
    90  	var variables map[string]string
    91  	if *variablesFilename != "" {
    92  		err := decoders.DecodeFile(*variablesFilename, &variables)
    93  		if err != nil {
    94  			return err
    95  		}
    96  	}
    97  	rootDir, err := builder.BuildTreeFromManifestWithOptions(
    98  		srpcClient,
    99  		builder.BuildLocalOptions{
   100  			BindMounts:        bindMounts,
   101  			ManifestDirectory: args[0],
   102  			Variables:         variables,
   103  		},
   104  		logWriter)
   105  	if err != nil {
   106  		if !*alwaysShowBuildLog {
   107  			fmt.Fprintln(os.Stderr,
   108  				"Start of build log ==========================")
   109  			os.Stderr.Write(logWriter.Bytes())
   110  		}
   111  		fmt.Fprintln(os.Stderr, "End of build log ============================")
   112  		return fmt.Errorf("error processing manifest: %s", err)
   113  	}
   114  	if *alwaysShowBuildLog {
   115  		fmt.Fprintln(os.Stderr, "End of build log ============================")
   116  	} else {
   117  		err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer,
   118  			uint64(logWriter.buffer.Len()))
   119  		if err != nil {
   120  			return fmt.Errorf("error writing build log: %s", err)
   121  		}
   122  	}
   123  	fmt.Println(rootDir)
   124  	return nil
   125  }
   126  
   127  func processManifestSubcommand(args []string, logger log.DebugLogger) error {
   128  	logWriter := &logWriterType{}
   129  	if *alwaysShowBuildLog {
   130  		fmt.Fprintln(os.Stderr, "Start of build log ==========================")
   131  	}
   132  	var variables map[string]string
   133  	if *variablesFilename != "" {
   134  		err := decoders.DecodeFile(*variablesFilename, &variables)
   135  		if err != nil {
   136  			return err
   137  		}
   138  	}
   139  	err := builder.ProcessManifestWithOptions(
   140  		builder.BuildLocalOptions{
   141  			BindMounts:        bindMounts,
   142  			ManifestDirectory: args[0],
   143  			Variables:         variables,
   144  		},
   145  		args[1], logWriter)
   146  	if err != nil {
   147  		if !*alwaysShowBuildLog {
   148  			fmt.Fprintln(os.Stderr,
   149  				"Start of build log ==========================")
   150  			os.Stderr.Write(logWriter.Bytes())
   151  		}
   152  		fmt.Fprintln(os.Stderr, "End of build log ============================")
   153  		return fmt.Errorf("error processing manifest: %s", err)
   154  	}
   155  	if *alwaysShowBuildLog {
   156  		fmt.Fprintln(os.Stderr, "End of build log ============================")
   157  	} else {
   158  		err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer,
   159  			uint64(logWriter.buffer.Len()))
   160  		if err != nil {
   161  			return fmt.Errorf("error writing build log: %s", err)
   162  		}
   163  	}
   164  	return nil
   165  }
   166  
   167  func (w *logWriterType) Bytes() []byte {
   168  	return w.buffer.Bytes()
   169  }
   170  
   171  func (w *logWriterType) Write(p []byte) (int, error) {
   172  	if *alwaysShowBuildLog {
   173  		os.Stderr.Write(p)
   174  	}
   175  	return w.buffer.Write(p)
   176  }