Files
kustomize/functions/examples/template-go-nginx/image/main.go
2020-05-12 10:11:56 -07:00

152 lines
3.3 KiB
Go

// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package main
import (
"bytes"
"os"
"strconv"
"text/template"
"sigs.k8s.io/kustomize/kyaml/errors"
"sigs.k8s.io/kustomize/kyaml/fn/framework"
"sigs.k8s.io/kustomize/kyaml/kio/filters"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
// define the input API schema as a struct
type API struct {
Metadata struct {
// Name is the Deployment Resource and Container name
Name string `yaml:"name"`
} `yaml:"metadata"`
Spec struct {
// Replicas is the number of Deployment replicas
// Defaults to the REPLICAS env var, or 1
Replicas *int `yaml:"replicas"`
} `yaml:"spec"`
}
func main() {
functionConfig := &API{}
resourceList := &framework.ResourceList{FunctionConfig: functionConfig}
cmd := framework.Command(resourceList, func() error {
// initialize API defaults
if err := initAPI(functionConfig); err != nil {
return err
}
// execute the service template
buff := &bytes.Buffer{}
t := template.Must(template.New("nginx-service").Parse(serviceTemplate))
if err := t.Execute(buff, functionConfig); err != nil {
return err
}
s, err := yaml.Parse(buff.String())
if err != nil {
return err
}
// execute the deployment template
buff = &bytes.Buffer{}
t = template.Must(template.New("nginx-deployment").Parse(deploymentTemplate))
if err := t.Execute(buff, functionConfig); err != nil {
return err
}
d, err := yaml.Parse(buff.String())
if err != nil {
return err
}
// add the template generated Resources to the output -- these will get merged by the next
// filter
resourceList.Items = append(resourceList.Items, s, d)
// merge the new copies with the old copies of each resource
resourceList.Items, err = filters.MergeFilter{}.Filter(resourceList.Items)
if err != nil {
return err
}
// apply formatting
resourceList.Items, err = filters.FormatFilter{}.Filter(resourceList.Items)
if err != nil {
return err
}
return nil
})
if err := cmd.Execute(); err != nil {
os.Exit(1)
}
}
func initAPI(api *API) error {
// Default functionConfig values from environment variables if they are not set
// in the functionConfig
r := os.Getenv("REPLICAS")
if r != "" && api.Spec.Replicas == nil {
replicas, err := strconv.Atoi(r)
if err != nil {
return errors.Wrap(err)
}
api.Spec.Replicas = &replicas
}
if api.Spec.Replicas == nil {
r := 1
api.Spec.Replicas = &r
}
if api.Metadata.Name == "" {
return errors.Errorf("must specify metadata.name\n")
}
return nil
}
var serviceTemplate = `
apiVersion: v1
kind: Service
metadata:
name: {{ .Metadata.Name }}
labels:
app: nginx
instance: {{ .Metadata.Name }}
spec:
ports:
- port: 80
targetPort: 80
name: http
selector:
app: nginx
instance: {{ .Metadata.Name }}
`
var deploymentTemplate = `apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Metadata.Name }}
labels:
app: nginx
instance: {{ .Metadata.Name }}
spec:
replicas: {{ .Spec.Replicas }}
selector:
matchLabels:
app: nginx
instance: {{ .Metadata.Name }}
template:
metadata:
labels:
app: nginx
instance: {{ .Metadata.Name }}
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
`