github.com/flanksource/konfigadm@v0.12.0/pkg/phases/containers.go (about)

     1  package phases
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/flanksource/konfigadm/pkg/types"
     8  )
     9  
    10  var Containers types.Phase = containers{}
    11  
    12  type containers struct{}
    13  
    14  func (p containers) ApplyPhase(sys *types.Config, ctx *types.SystemContext) ([]types.Command, types.Filesystem, error) {
    15  	var commands []types.Command
    16  	files := types.Filesystem{}
    17  	for _, c := range sys.Containers {
    18  
    19  		sys.Services[c.Name()] = types.Service{
    20  			Name:      c.Name(),
    21  			ExecStart: exec(sys, c),
    22  			Extra:     types.DefaultSystemdService(c.Name()),
    23  		}
    24  		if len(c.Env) > 0 {
    25  			files["/etc/environment."+c.Name()] = types.File{Content: toEnvironmentFile(ctx, c)}
    26  		}
    27  
    28  	}
    29  	return commands, files, nil
    30  }
    31  
    32  func (p containers) Verify(cfg *types.Config, results *types.VerifyResults, flags ...types.Flag) bool {
    33  	verify := true
    34  	for f := range cfg.Files {
    35  
    36  		if _, err := os.Stat(f); err != nil {
    37  			verify = false
    38  			results.Fail("%s does not exist", f)
    39  		} else {
    40  			results.Pass("%s exists", f)
    41  		}
    42  	}
    43  
    44  	for f := range cfg.Templates {
    45  		if _, err := os.Stat(f); err != nil {
    46  			verify = false
    47  			results.Fail("%s does not exist", f)
    48  		} else {
    49  			results.Pass("%s exists", f)
    50  		}
    51  	}
    52  
    53  	return verify
    54  }
    55  
    56  func toEnvironmentFile(ctx *types.SystemContext, c types.Container) string {
    57  	s := ""
    58  	for k, v := range c.Env {
    59  		s += fmt.Sprintf("%s=%s\n", k, v)
    60  	}
    61  	return s
    62  }
    63  
    64  func exec(sys *types.Config, c types.Container) string {
    65  	exec := c.DockerOpts
    66  	if len(c.Env) > 0 {
    67  		exec += fmt.Sprintf(" --env-file /etc/environment.%s", c.Name())
    68  	}
    69  	if c.Network != "" {
    70  		exec += " --network " + c.Network
    71  	}
    72  
    73  	for _, v := range c.Volumes {
    74  		exec += fmt.Sprintf(" -v %s", v)
    75  	}
    76  
    77  	for _, p := range c.Ports {
    78  		exec += fmt.Sprintf(" -p %d:%d", p.Port, p.Target)
    79  	}
    80  
    81  	return fmt.Sprintf("%s run --rm --name %s %s %s %s", sys.ContainerRuntime.GetCLI(), c.Name(), exec, c.Image, c.Args)
    82  }