github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/builder-tool/manifest.go (about)

     1  // +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/fsutil"
    13  	"github.com/Cloud-Foundations/Dominator/lib/log"
    14  )
    15  
    16  const filePerms = syscall.S_IRUSR | syscall.S_IRGRP | syscall.S_IROTH
    17  
    18  type logWriterType struct {
    19  	buffer bytes.Buffer
    20  }
    21  
    22  func buildFromManifestSubcommand(args []string, logger log.DebugLogger) error {
    23  	srpcClient := getImageServerClient()
    24  	logWriter := &logWriterType{}
    25  	if *alwaysShowBuildLog {
    26  		fmt.Fprintln(os.Stderr, "Start of build log ==========================")
    27  	}
    28  	name, err := builder.BuildImageFromManifest(srpcClient, args[0], args[1],
    29  		*expiresIn, bindMounts, logWriter, logger)
    30  	if err != nil {
    31  		if !*alwaysShowBuildLog {
    32  			fmt.Fprintln(os.Stderr,
    33  				"Start of build log ==========================")
    34  			os.Stderr.Write(logWriter.Bytes())
    35  		}
    36  		fmt.Fprintln(os.Stderr, "End of build log ============================")
    37  		return fmt.Errorf("Error processing manifest: %s", err)
    38  	}
    39  	if *alwaysShowBuildLog {
    40  		fmt.Fprintln(os.Stderr, "End of build log ============================")
    41  	} else {
    42  		err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer,
    43  			uint64(logWriter.buffer.Len()))
    44  		if err != nil {
    45  			return fmt.Errorf("Error writing build log: %s", err)
    46  		}
    47  	}
    48  	fmt.Println(name)
    49  	return nil
    50  }
    51  
    52  func buildTreeFromManifestSubcommand(args []string,
    53  	logger log.DebugLogger) error {
    54  	srpcClient := getImageServerClient()
    55  	logWriter := &logWriterType{}
    56  	if *alwaysShowBuildLog {
    57  		fmt.Fprintln(os.Stderr, "Start of build log ==========================")
    58  	}
    59  	rootDir, err := builder.BuildTreeFromManifest(srpcClient, args[0],
    60  		bindMounts, logWriter, logger)
    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(rootDir)
    80  	return nil
    81  }
    82  
    83  func processManifestSubcommand(args []string, logger log.DebugLogger) error {
    84  	logWriter := &logWriterType{}
    85  	if *alwaysShowBuildLog {
    86  		fmt.Fprintln(os.Stderr, "Start of build log ==========================")
    87  	}
    88  	err := builder.ProcessManifest(args[0], args[1], bindMounts, logWriter)
    89  	if err != nil {
    90  		if !*alwaysShowBuildLog {
    91  			fmt.Fprintln(os.Stderr,
    92  				"Start of build log ==========================")
    93  			os.Stderr.Write(logWriter.Bytes())
    94  		}
    95  		fmt.Fprintln(os.Stderr, "End of build log ============================")
    96  		return fmt.Errorf("Error processing manifest: %s", err)
    97  	}
    98  	if *alwaysShowBuildLog {
    99  		fmt.Fprintln(os.Stderr, "End of build log ============================")
   100  	} else {
   101  		err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer,
   102  			uint64(logWriter.buffer.Len()))
   103  		if err != nil {
   104  			return fmt.Errorf("Error writing build log: %s", err)
   105  		}
   106  	}
   107  	return nil
   108  }
   109  
   110  func (w *logWriterType) Bytes() []byte {
   111  	return w.buffer.Bytes()
   112  }
   113  
   114  func (w *logWriterType) Write(p []byte) (int, error) {
   115  	if *alwaysShowBuildLog {
   116  		os.Stderr.Write(p)
   117  	}
   118  	return w.buffer.Write(p)
   119  }