snippet service_sample_spec
	apiVersion: v1
	kind: Service
	metadata:
	{{- if .Values.$1.service.annotations }}
	  annotations:
	{{ toYaml .Values.$1.service.annotations | indent 4 }}
	{{- end }}
	  labels:
	{{- if .Values.$1.service.labels }}
	{{ toYaml .Values.$1.service.labels | indent 4 }}
	{{- end }}
		app: {{ template "$2.name" . }}
		chart: {{ .Chart.Name }}-{{ .Chart.Version }}
		component: "{{ .Values.$1.name }}"
		heritage: {{ .Release.Service }}
		release: {{ .Release.Name }}
	  name: {{ template "$2.$1.fullname" . }}
	spec:
	  clusterIP: "{{ .Values.$1.service.clusterIP }}"
	{{- if .Values.$1.service.externalIPs }}
	  externalIPs:
	{{ toYaml .Values.$1.service.externalIPs | indent 4 }}
	{{- end }}
	{{- if .Values.$1.service.loadBalancerIP }}
	  loadBalancerIP: "{{ .Values.$1.service.loadBalancerIP }}"
	{{- end }}
	{{- if .Values.$1.service.loadBalancerSourceRanges }}
	  loadBalancerSourceRanges:
	{{ toYaml .Values.$1.service.loadBalancerSourceRanges | indent 4 }}
	{{- end }}
	  healthCheckNodePort: {{ .Values.$1.service.healthCheckNodePort }}
	  ports:
		- name: http
		  port: 80
		  protocol: TCP
		  targetPort: {{ .Values.$1.service.targetPorts.http }}
		  {{- if (and (eq .Values.$1.service.type "NodePort") (not (empty .Values.$1.service.nodePorts.http))) }}
		  nodePort: {{ .Values.$1.service.nodePorts.http }}
		  {{- end }}
		- name: https
		  port: 443
		  protocol: TCP
		  targetPort: {{ .Values.$1.service.targetPorts.https }}
		  {{- if (and (eq .Values.$1.service.type "NodePort") (not (empty .Values.$1.service.nodePorts.https))) }}
		  nodePort: {{ .Values.$1.service.nodePorts.https }}
		  {{- end }}
	  {{- range $key, $value := .Values.tcp }}
		- name: "{{ $key }}-tcp"
		  port: {{ $key }}
		  protocol: TCP
		  targetPort: "{{ $key }}-tcp"
	  {{- end }}
	  {{- range $key, $value := .Values.udp }}
		- name: "{{ $key }}-udp"
		  port: {{ $key }}
		  protocol: UDP
		  targetPort: "{{ $key }}-udp"
	  {{- end }}
	  selector:
		app: {{ template "${2:chartName}.name" . }}
		component: "{{ .Values.$1.name }}"
		release: {{ .Release.Name }}
	  type: "{{ .Values.${1:value_key}.service.type }}"

snippet service_spec
	apiVersion: v1
	kind: Service
	metadata:
	{{- if .Values.$1.service.annotations }}
	  annotations:
	{{ toYaml .Values.$1.service.annotations | indent 4 }}
	{{- end }}
	  labels:
	{{- if .Values.$1.service.labels }}
	{{ toYaml .Values.$1.service.labels | indent 4 }}
	{{- end }}
		app: {{ template "$2.name" . }}
		chart: {{ .Chart.Name }}-{{ .Chart.Version }}
		component: "{{ .Values.$1.name }}"
		heritage: {{ .Release.Service }}
		release: {{ .Release.Name }}
	  name: {{ template "${2:chartName}.${1:value_key}.fullname" . }}
	# spec
	${0}

snippet annotations_spec
	{{- if .Values.$1.service.annotations }}
	  annotations:
	{{ toYaml .Values.${1:value_key}.service.annotations | indent 4 }}
	{{- end }}
	${0}

snippet labels_spec
	 labels:
	{{- if .Values.$1.service.labels }}
	{{ toYaml .Values.$1.service.labels | indent 4 }}
	{{- end }}
		app: {{ template "$2.name" . }}
		chart: {{ .Chart.Name }}-{{ .Chart.Version }}
		component: "{{ .Values.$1.name }}"
		heritage: {{ .Release.Service }}
		release: {{ .Release.Name }}
	  name: {{ template "${2:chartName}.${1:value_key}.fullname" . }}
	${0}

snippet service_spec
	spec:
	  type: "{{ .Values.$1.service.type }}"
	  clusterIP: "{{ .Values.$1.service.clusterIP }}"
	{{- if .Values.$1.service.externalIPs }}
	  externalIPs:
	{{ toYaml .Values.$1.service.externalIPs | indent 4 }}
	{{- end }}
	{{- if .Values.$1.service.loadBalancerIP }}
	  loadBalancerIP: "{{ .Values.$1.service.loadBalancerIP }}"
	{{- end }}
	{{- if .Values.$1.service.loadBalancerSourceRanges }}
	  loadBalancerSourceRanges:
	{{ toYaml .Values.$1.service.loadBalancerSourceRanges | indent 4 }}
	{{- end }}
	{{- if and (semverCompare ">=1.7-0" .Capabilities.KubeVersion.GitVersion) (.Values.$1.service.externalTrafficPolicy) }}
	  externalTrafficPolicy: "{{ .Values.$1.service.externalTrafficPolicy }}"
	{{- end }}
	{{- if and (semverCompare ">=1.7-0" .Capabilities.KubeVersion.GitVersion) (.Values.$1.service.healthCheckNodePort) }}
	  healthCheckNodePort: {{ .Values.${1:value_key}.service.healthCheckNodePort }}
	{{- end }}
	${0}

snippet ports_spec
	ports:
	${0}

snippet portHTTP_spec
	- name: http
	  port: 80
	  protocol: TCP
	  targetPort: {{ .Values.$1.service.targetPorts.http }}
	  {{- if (and (eq .Values.$1.service.type "NodePort") (not (empty .Values.$1.service.nodePorts.http))) }}
	  nodePort: {{ .Values.${1:value_key}.service.nodePorts.http }}
	  {{- end }}
	  ${0}

snippet portHTTPS_spec
	- name: https
	  port: 443
	  protocol: TCP
	  targetPort: {{ .Values.$1.service.targetPorts.https }}
	  {{- if (and (eq .Values.$1.service.type "NodePort") (not (empty .Values.$1.service.nodePorts.https))) }}
	  nodePort: {{ .Values.${1:value_key}.service.nodePorts.https }}
	  {{- end }}
	  ${0}

snippet portTCP_spec
	{{- range $key, $value := .Values.tcp }}
	  - name: "{{ $key }}-tcp"
		port: {{ $key }}
		protocol: TCP
		targetPort: "{{ $key }}-tcp"
	{{- end }}
	${0}

snippet portUDP_spec
	{{- range $key, $value := .Values.udp }}
	  - name: "{{ $key }}-udp"
		port: {{ $key }}
		protocol: UDP
		targetPort: "{{ $key }}-udp"
	{{- end }}
	${0}


snippet selector_spec
	selector:
	  app: {{ template "${2:chartName}.name" . }}
	  component: "{{ .Values.${1:value_key}.name }}"
	  release: {{ .Release.Name }}
	  ${0}


snippet deploy_sample_spec
	{{- if .Values.$1.enabled }}
	apiVersion: extensions/v1beta1
	kind: Deployment
	metadata:
	  labels:
		app: {{ template "$2.name" . }}
		chart: {{ .Chart.Name }}-{{ .Chart.Version }}
		component: "{{ .Values.$1.name }}"
		heritage: {{ .Release.Service }}
		release: {{ .Release.Name }}
	  name: {{ template "$2.$1.fullname" . }}
	spec:
	  replicas: {{ .Values.$1.replicaCount }}
	  revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
	  template:
		metadata:
		{{- if .Values.$1.podAnnotations }}
		  annotations:
	{{ toYaml .Values.$1.podAnnotations | indent 8 }}
		{{- end }}
		  labels:
			app: {{ template "$2.name" . }}
			component: "{{ .Values.$1.name }}"
			release: {{ .Release.Name }}
			{{- if .Values.$1.podLabels }}
	{{ toYaml .Values.$1.podLabels | indent 8 }}
			{{- end }}
		spec:
		  {{- if .Values.imagePullSecrets }}
		  imagePullSecrets:
	{{ toYaml .Values.imagePullSecrets | indent 8 }}
		  {{- end }}
		  containers:
			- name: {{ template "${2:chartName}.name" . }}-{{ .Values.$1.name }}
			  image: "{{ .Values.$1.image.repository }}:{{ .Values.$1.image.tag }}"
			  imagePullPolicy: "{{ .Values.$1.image.pullPolicy }}"
			  args:
			  {{- range $key, $value := .Values.$1.extraArgs }}
				{{- if $value }}
				- --{{ $key }}={{ $value }}
				{{- else }}
				- --{{ $key }}
				{{- end }}
			  {{- end }}
			  livenessProbe:
				httpGet:
				  path: /healthz
				  port: 8080
				  scheme: HTTP
				initialDelaySeconds: 30
				timeoutSeconds: 5
			  ports:
				- name: http
				  containerPort: 8080
				  protocol: TCP
			  resources:
	{{ toYaml .Values.$1.resources | indent 12 }}
		{{- if .Values.$1.nodeSelector }}
		  nodeSelector:
	{{ toYaml .Values.$1.nodeSelector | indent 8 }}
		{{- end }}
		{{- if .Values.$1.tolerations }}
		  tolerations:
	{{ toYaml .Values.$1.tolerations | indent 8 }}
		{{- end }}
		{{- if .Values.$1.affinity }}
		  affinity:
	{{ toYaml .Values.${1:value_key}.affinity | indent 8 }}
		{{- end }}
		  terminationGracePeriodSeconds: 60
	{{- end }}



snippet deploy_spec
	{{- if .Values.$1.enabled }}
	apiVersion: extensions/v1beta1
	kind: Deployment
	metadata:
	  labels:
		app: {{ template "$2.name" . }}
		chart: {{ .Chart.Name }}-{{ .Chart.Version }}
		component: "{{ .Values.$1.name }}"
		heritage: {{ .Release.Service }}
		release: {{ .Release.Name }}
	  name: {{ template "${2:chartName}.${1:value_key}.fullname" . }}
	# spec
		# containers_spec
		# livenessProbe_spec
		# PersistentVolumeClaim_spec
		# initContainers_spec
		# resources_spec
		# nodeselector_spec
		# tolerations_spec
		# affinity_spec
	${0}

snippet spec_spec
	spec:
	  replicas: {{ .Values.$1.replicaCount }}
	  revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
	  template:
		metadata:
		{{- if .Values.$1.podAnnotations }}
		  annotations:
	{{ toYaml .Values.$1.podAnnotations | indent 8 }}
		{{- end }}
		  labels:
			app: {{ template "${2:chartName}.name" . }}
			component: "{{ .Values.$1.name }}"
			release: {{ .Release.Name }}
			{{- if .Values.$1.podLabels }}
	{{ toYaml .Values.${1:value_key}.podLabels | indent 8 }}
			{{- end }}
		spec:
		  {{- if .Values.imagePullSecrets }}
		  imagePullSecrets:
	{{ toYaml .Values.imagePullSecrets | indent 8 }}
		  {{- end }}
		  ${0}

snippet imagePullSecrets_spec
		  {{- if .Values.imagePullSecrets }}
		  imagePullSecrets:
	{{ toYaml .Values.imagePullSecrets | indent 8 }}
		  {{- end }}
	${0}

snippet imagePullPolicy_spec
	imagePullPolicy: ${1:imagePullPolicy}
	${0}

snippet containers_spec
	containers:
	  - name: {{ template "${2:chartName}.name" . }}-{{ .Values.$1.name }}
		image: "{{ .Values.$1.image.repository }}:{{ .Values.$1.image.tag }}"
		imagePullPolicy: "{{ .Values.${1:value_key}.image.pullPolicy }}"
	${0}
snippet args_spec
	args:
	{{- range $key, $value := .Values.${1:value_key}.extraArgs }}
	  {{- if $value }}
	  - --{{ $key }}={{ $value }}
	  {{- else }}
	  - --{{ $key }}
	  {{- end }}
	{{- end }}
	${0}
snippet livenessProbe_spec
	livenessProbe:
	  httpGet:
		path: /healthz
		port: 8080
		scheme: HTTP
	  initialDelaySeconds: 30
	  timeoutSeconds: 5
	${0}
snippet readinessProbe_spec
	readinessProbe:
	  httpGet:
		path: /go/api/v1/health
		port: 8153
	  initialDelaySeconds: {{ .Values.$1.healthCheck.initialDelaySeconds }}
	  periodSeconds: {{ .Values.$1.healthCheck.periodSeconds }}
	  failureThreshold: {{ .Values.$1.healthCheck.failureThreshold }}
	${0}
snippet resources_spec
	resources:
	{{ toYaml .Values.${1:value_key}.resources | indent 12 }}
	${0}
snippet nodeselector_spec
	{{- if .Values.$1.nodeSelector }}
	  nodeSelector:
	{{ toYaml .Values.${1:value_key}.nodeSelector | indent 8 }}
	{{- end }}
	${0}
snippet tolerations_spec
	{{- if .Values.$1.tolerations }}
	  tolerations:
	{{ toYaml .Values.${1:value_key}.tolerations | indent 8 }}
	{{- end }}
	${0}
snippet affinity_spec
	{{- if .Values.$1.affinity }}
	  affinity:
	{{ toYaml .Values.${1:value_key}.affinity | indent 8 }}
	{{- end }}
	  terminationGracePeriodSeconds: 60
	{{- end }}
	${0}

snippet PersistentVolumeClaim_spec
	kind: PersistentVolumeClaim
	apiVersion: v1
	metadata:
	  name: {{ template "${2}.$1.fullname" . }}
	  labels:
		app: {{ template "${2:chartName}.name" . }}
		chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
		release: "{{ .Release.Name }}"
		heritage: "{{ .Release.Service }}"
	spec:
	  accessModes:
		- {{ .Values.$1.persistence.accessMode | quote }}
	  resources:
		requests:
		  storage: {{ .Values.$1.persistence.size | quote }}
	{{- if .Values.$1.persistence.storageClass }}
	{{- if (eq "-" .Values.$1.persistence.storageClass) }}
	  storageClassName: ""
	{{- else }}
	  storageClassName: "{{ .Values.${1:value_key}.persistence.storageClass }}"
	{{- end }}
	{{- end }}
	{{- end }}
	{{- end }}
	${0}

snippet configMap_spec
	{{- if .Values.artifactory.enabled -}}
	  apiVersion: v1
	  kind: ConfigMap
	  metadata:
		name: {{ template "${2:chartName}.fullname" . }}-${1:value_key}-config
		labels:
		  app: {{ template "${2}.name" . }}
		  chart: {{ .Chart.Name }}-{{ .Chart.Version }}
		  heritage: {{ .Release.Service }}
		  release: {{ .Release.Name }}
	  data:
		${3:nameOfConfigFile}.conf: |
		  # data goes here
	{{- end -}}
	${0}

snippet initContainers_spec
	{{- if .Values.$1.initContainers }}
		  initContainers:
		  - name: wait-workers
			image: "{{ .Values.$1.image.repository }}:{{ .Values.$1.image.tag }}"
			imagePullPolicy: {{ .Values.${1:value_key}.image.pullPolicy }}
			# env
			command:
			  - sh
			  - -c
			  - |
				until printf "." && nc -z -w 2 {{ template "${2:chartName}.fullname" . }} {{ .Values.postgresql.service.port }}; do
					sleep 2;
				done;

				echo 'PostgreSQL OK ✓'
			# args
	{{- end }}
	${0}

snippet pvc_spec
	kind: PersistentVolumeClaim
	apiVersion: v1
	metadata:
	  name: {{ template "$2.fullname" . }}
	  labels:
		chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
		release: "{{ .Release.Name }}"
		heritage: "{{ .Release.Service }}"
		app: {{ template "${2:chartName}.fullname" . }}
	spec:
	  accessModes:
		- {{ .Values.persistence.accessMode | quote }}
	  resources:
		requests:
		  storage: {{ .Values.persistence.size | quote }}
	{{- if .Values.persistence.storageClass }}
	{{- if (eq "-" .Values.persistence.storageClass) }}
	  storageClassName: ""
	{{- else }}
	  storageClassName: "{{ .Values.persistence.storageClass }}"
	{{- end }}
	{{- end }}
	{{- end }}
	${0}

snippet pv_nfs_spec
	apiVersion: v1
	kind: PersistentVolume
	metadata:
	  name: {{ template "$2.fullname" . }}-data-pv
	  labels:
		app: {{ template "$2.name" . }}
		chart: {{ .Chart.Name }}-{{ .Chart.Version }}
		heritage: {{ .Release.Service }}
		release: {{ .Release.Name }}
		id: {{ template "${2:chartName}.name" . }}-data-pv
		type: nfs-volume
	spec:
	  capacity:
		storage: {{ .Values.$1.persistence.nfs.capacity }}
	  accessModes:
	  - ReadWriteOnce
	  persistentVolumeReclaimPolicy: Retain
	  nfs:
		server: {{ .Values.$1.persistence.nfs.ip }}
		path: "{{ .Values.${1:value_key}.persistence.nfs.haDataMount }}"
		readOnly: false
	${0}

snippet pvc_hostpath_spec
	{{- if and .Values.persistence.enabled .Values.persistence.$1.hostPath (not
	.Values.persistence.$1.existingClaim) -}}
	apiVersion: v1
	kind: PersistentVolume
	metadata:
	  name: {{ template "${2:chartName}.fullname" . }}-$1
	spec:
	  accessModes:
		- {{ .Values.persistence.$1.accessMode | quote }}
	  capacity:
		storage: {{ .Values.persistence.$1.size | quote }}
	  hostPath:
		path: {{ .Values.persistence.${1:value_key}.hostPath | quote }}
	{{- end -}}
	${0}

snippet deploy_values
	$1:
	  name: ${1:value_key}
	  image:
		repository: 
		tag: 
		pullPolicy: IfNotPresent
	  hostNetwork: false
	  dnsPolicy: ClusterFirst
	  daemonset:
		useHostPort: false
	  podLabels: {}
	  scope:
		enabled: false
		namespace: ""   # defaults to .Release.Namespace
	  extraArgs: {}
	  extraEnvs: []
	  kind: Deployment
	  updateStrategy: {}
	  minReadySeconds: 0
	  tolerations: []
	  affinity: {}
	  nodeSelector: {}
	  podAnnotations: {}
	  replicaCount: 1
	  minAvailable: 1
	  resources: {}
	  autoscaling:
		enabled: false
	  extraContainers: {}
	  extraVolumeMounts: {}
	  extraVolumes: {}
	  extraInitContainers: []
	  lifecycle: {}
	revisionHistoryLimit: 10
	${0}

snippet rbac_values
	${1:value_key}:
	rbac:
	  create: true
	serviceAccount:
	  create: true
	  name:
	imagePullSecrets: []
	${0}

snippet service_values
	${1:value_key}:
	  service:
		annotations: {}
		labels: {}
		clusterIP: ""
		externalIPs: []
		loadBalancerIP: ""
		loadBalancerSourceRanges: []
		externalTrafficPolicy: ""
		healthCheckNodePort: 0
		targetPorts:
		  http: http
		  https: https
		type: LoadBalancer
		nodePorts:
		  http: ""
		  https: ""
	${0}

snippet readinessProbe_values
	${1:value_key}:
	  readinessProbe:
		failureThreshold: 3
		initialDelaySeconds: 10
		periodSeconds: 10
		successThreshold: 1
		timeoutSeconds: 1
		port: 10254
	${0}

snippet livenessProbe_values
	${1:value_key}:
	  livenessProbe:
		failureThreshold: 3
		initialDelaySeconds: 10
		periodSeconds: 10
		successThreshold: 1
		timeoutSeconds: 1
		port: 10254
	${0}
