github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/caas/kubernetes/provider/template.go (about)

     1  // Copyright 2019 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package provider
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  	"text/template"
    10  
    11  	"github.com/juju/errors"
    12  	"gopkg.in/yaml.v2"
    13  )
    14  
    15  var containerTemplate = `
    16  - name: {{.Name}}
    17    {{if .Ports}}
    18    ports:
    19    {{- range .Ports }}
    20      - containerPort: {{.ContainerPort}}
    21        {{if .Name}}name: {{.Name}}{{end}}
    22        {{if .Protocol}}protocol: {{.Protocol}}{{end}}
    23    {{- end}}
    24    {{end}}
    25    {{if .Command}}
    26    command: 
    27  {{ toYaml .Command | indent 4 }}
    28    {{end}}
    29    {{if .Args}}
    30    args: 
    31  {{ toYaml .Args | indent 4 }}
    32    {{end}}
    33    {{if .WorkingDir}}
    34    workingDir: {{.WorkingDir}}
    35    {{end}}`[1:]
    36  
    37  var defaultPodTemplateStr = fmt.Sprintf(`
    38  {{if .Containers}}
    39  containers:
    40  {{- range .Containers }}
    41  %s
    42  {{- end}}
    43  {{end}}
    44  {{if .InitContainers}}
    45  initContainers:
    46  {{- range .InitContainers }}
    47  %s
    48  {{- end}}
    49  {{end}}
    50  `[1:], containerTemplate, containerTemplate)
    51  
    52  var defaultPodTemplate = template.Must(template.New("").Funcs(templateAddons).Parse(defaultPodTemplateStr))
    53  
    54  func toYaml(val interface{}) (string, error) {
    55  	data, err := yaml.Marshal(val)
    56  	if err != nil {
    57  		return "", errors.Annotatef(err, "marshalling to yaml for %v", val)
    58  	}
    59  	return string(data), nil
    60  }
    61  
    62  func indent(n int, str string) string {
    63  	out := ""
    64  	prefix := strings.Repeat(" ", n)
    65  	for _, line := range strings.Split(str, "\n") {
    66  		out += prefix + line + "\n"
    67  	}
    68  	return out
    69  }
    70  
    71  var templateAddons = template.FuncMap{
    72  	"toYaml": toYaml,
    73  	"indent": indent,
    74  }