/*
Copyright 2020 The Flux authors
Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package install
import (
“bufio”
“bytes”
“io”
“os”
“text/template”
)
var kustomizationTmpl = `—
{{- $eventsAddr := .EventsAddr }}
{{- $watchAllNamespaces := .WatchAllNamespaces }}
{{- $registry := .Registry }}
{{- $logLevel := .LogLevel }}
{{- $clusterDomain := .ClusterDomain }}
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: {{.Namespace}}
transformers:
resources:
- namespace.yaml
{{- if .NetworkPolicy }}
- policies.yaml
{{- end }}
- roles
{{- range .Components }}
- {{.}}.yaml
{{- end }}
patches:
- path: node-selector.yaml
target:
kind: Deployment
{{- range $i, $component := .Components }}
{{- if eq $component “notification-controller” }}
- target:
group: apps
version: v1
kind: Deployment
name: {{$component}}
patch: |-
- op: replace
path: /spec/template/spec/containers/0/args/0
value: –watch-all-namespaces={{$watchAllNamespaces}}
- op: replace
path: /spec/template/spec/containers/0/args/1
value: –log-level={{$logLevel}}
{{- else if eq $component “source-controller” }}
- target:
group: apps
version: v1
kind: Deployment
name: {{$component}}
patch: |-
- op: replace
path: /spec/template/spec/containers/0/args/0
value: –events-addr={{$eventsAddr}}
- op: replace
path: /spec/template/spec/containers/0/args/1
value: –watch-all-namespaces={{$watchAllNamespaces}}
- op: replace
path: /spec/template/spec/containers/0/args/2
value: –log-level={{$logLevel}}
- op: replace
path: /spec/template/spec/containers/0/args/6
value: –storage-adv-addr=source-controller.$(RUNTIME_NAMESPACE).svc.{{$clusterDomain}}.
{{- else }}
- target:
group: apps
version: v1
kind: Deployment
name: {{$component}}
patch: |-
- op: replace
path: /spec/template/spec/containers/0/args/0
value: –events-addr={{$eventsAddr}}
- op: replace
path: /spec/template/spec/containers/0/args/1
value: –watch-all-namespaces={{$watchAllNamespaces}}
- op: replace
path: /spec/template/spec/containers/0/args/2
value: –log-level={{$logLevel}}
{{- end }}
{{- end }}
{{- if $registry }}
images:
{{- range $i, $component := .Components }}
- name: fluxcd/{{$component}}
newName: {{$registry}}/{{$component}}
{{- end }}
{{- end }}
`
var kustomizationRolesTmpl = `—
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: {{.Namespace}}
resources:
- rbac.yaml
nameSuffix: -{{.Namespace}}
`
var nodeSelectorTmpl = --- apiVersion: apps/v1 kind: Deployment metadata: name: all spec: template: spec: nodeSelector: kubernetes.io/os: linux {{- if .ImagePullSecret }} imagePullSecrets: - name: {{.ImagePullSecret}} {{- end }} {{ if gt (len .TolerationKeys) 0 }} tolerations: {{- range $i, $key := .TolerationKeys }} - key: "{{$key}}" operator: "Exists" {{- end }} {{- end }}
var labelsTmpl = `—
apiVersion: builtin
kind: LabelTransformer
metadata:
name: labels
labels:
app.kubernetes.io/instance: {{.Namespace}}
app.kubernetes.io/version: “{{.Version}}”
app.kubernetes.io/part-of: flux
fieldSpecs:
- path: metadata/labels
create: true
`
var namespaceTmpl = --- apiVersion: v1 kind: Namespace metadata: name: {{.Namespace}} labels: pod-security.kubernetes.io/warn: restricted pod-security.kubernetes.io/warn-version: latest
func execTemplate(obj interface{}, tmpl, filename string) error {
t, err := template.New(“tmpl”).Parse(tmpl)
if err != nil {
return err
}
var data bytes.Buffer
writer := bufio.NewWriter(&data)
if err := t.Execute(writer, obj); err != nil {
return err
}
if err := writer.Flush(); err != nil {
return err
}
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
_, err = io.WriteString(file, data.String())
if err != nil {
return err
}
return file.Sync()
}
func copyFile(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
if err != nil {
return err
}
return out.Close()
}