Skip to content

Commit 03aa2a5

Browse files
authored
Merge pull request #65 from wunderio/feature/es-init-removal-script
release diff; es init container removal script
2 parents 531f6f5 + 85ef2a5 commit 03aa2a5

File tree

3 files changed

+499
-0
lines changed

3 files changed

+499
-0
lines changed

cmd/ciReleaseDiff.go

Lines changed: 373 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,373 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"os/exec"
8+
"strings"
9+
10+
"github.com/spf13/cobra"
11+
"github.com/wunderio/silta-cli/internal/common"
12+
)
13+
14+
// ciReleaseDiffCmd represents the ciReleaseDiff command
15+
var ciReleaseDiffCmd = &cobra.Command{
16+
Use: "diff",
17+
Short: "Diff release resources",
18+
Long: `Release diff command is used to compare the resources of a release with the current state of the cluster.
19+
20+
* Chart allows prepending extra configuration (to helm --values line) via
21+
"SILTA_<chart_name>_CONFIG_VALUES" environment variable. It has to be a
22+
base64 encoded string of a silta configuration yaml file.
23+
`,
24+
Run: func(cmd *cobra.Command, args []string) {
25+
26+
releaseName, _ := cmd.Flags().GetString("release-name")
27+
releaseSuffix, _ := cmd.Flags().GetString("release-suffix")
28+
namespace, _ := cmd.Flags().GetString("namespace")
29+
siltaEnvironmentName, _ := cmd.Flags().GetString("silta-environment-name")
30+
branchname, _ := cmd.Flags().GetString("branchname")
31+
dbRootPass, _ := cmd.Flags().GetString("db-root-pass")
32+
dbUserPass, _ := cmd.Flags().GetString("db-user-pass")
33+
vpnIP, _ := cmd.Flags().GetString("vpn-ip")
34+
vpcNative, _ := cmd.Flags().GetString("vpc-native")
35+
clusterType, _ := cmd.Flags().GetString("cluster-type")
36+
chartVersion, _ := cmd.Flags().GetString("chart-version")
37+
phpImageUrl, _ := cmd.Flags().GetString("php-image-url")
38+
nginxImageUrl, _ := cmd.Flags().GetString("nginx-image-url")
39+
shellImageUrl, _ := cmd.Flags().GetString("shell-image-url")
40+
repositoryUrl, _ := cmd.Flags().GetString("repository-url")
41+
gitAuthUsername, _ := cmd.Flags().GetString("gitauth-username")
42+
gitAuthPassword, _ := cmd.Flags().GetString("gitauth-password")
43+
clusterDomain, _ := cmd.Flags().GetString("cluster-domain")
44+
chartName, _ := cmd.Flags().GetString("chart-name")
45+
chartRepository, _ := cmd.Flags().GetString("chart-repository")
46+
siltaConfig, _ := cmd.Flags().GetString("silta-config")
47+
helmFlags, _ := cmd.Flags().GetString("helm-flags")
48+
49+
// Use environment variables as fallback
50+
if useEnv {
51+
if len(dbRootPass) == 0 {
52+
dbRootPass = os.Getenv("DB_ROOT_PASS")
53+
}
54+
if len(dbUserPass) == 0 {
55+
dbUserPass = os.Getenv("DB_USER_PASS")
56+
}
57+
if len(vpnIP) == 0 {
58+
vpnIP = os.Getenv("VPN_IP")
59+
}
60+
if len(vpcNative) == 0 {
61+
vpcNative = os.Getenv("VPC_NATIVE")
62+
}
63+
if len(clusterType) == 0 {
64+
clusterType = os.Getenv("CLUSTER_TYPE")
65+
}
66+
if len(siltaEnvironmentName) == 0 {
67+
siltaEnvironmentName = os.Getenv("SILTA_ENVIRONMENT_NAME")
68+
}
69+
if len(siltaEnvironmentName) == 0 {
70+
siltaEnvironmentName = common.SiltaEnvironmentName(branchname, releaseSuffix)
71+
}
72+
if len(repositoryUrl) == 0 {
73+
repositoryUrl = os.Getenv("CIRCLE_REPOSITORY_URL")
74+
}
75+
if len(gitAuthUsername) == 0 {
76+
gitAuthUsername = os.Getenv("GITAUTH_USERNAME")
77+
}
78+
if len(gitAuthPassword) == 0 {
79+
gitAuthPassword = os.Getenv("GITAUTH_PASSWORD")
80+
}
81+
if len(clusterDomain) == 0 {
82+
clusterDomain = os.Getenv("CLUSTER_DOMAIN")
83+
}
84+
}
85+
86+
// Uses PrependChartConfigOverrides from "SILTA_<CHART_NAME>_CONFIG_VALUES"
87+
// environment variable and prepends it to configuration
88+
chartOverrideFile := common.CreateChartConfigurationFile(chartName)
89+
if chartOverrideFile != "" {
90+
defer os.Remove(chartOverrideFile)
91+
siltaConfig = common.PrependChartConfigOverrides(chartOverrideFile, siltaConfig)
92+
}
93+
94+
// Chart value overrides
95+
96+
// Override Database credentials if specified
97+
dbRootPassOverride := ""
98+
if len(dbRootPass) > 0 {
99+
dbRootPassOverride = fmt.Sprintf("--set mariadb.rootUser.password='%s'", dbRootPass)
100+
}
101+
dbUserPassOverride := ""
102+
if len(dbUserPass) > 0 {
103+
dbUserPassOverride = fmt.Sprintf("--set mariadb.db.password='%s'", dbUserPass)
104+
}
105+
106+
// Skip basic auth for internal VPN if defined in environment
107+
extraNoAuthIPs := ""
108+
if len(vpnIP) > 0 {
109+
extraNoAuthIPs = fmt.Sprintf("--set nginx.noauthips.vpn='%s/32'", vpnIP)
110+
}
111+
112+
// Pass VPC-native setting if defined in environment
113+
vpcNativeOverride := ""
114+
if len(vpcNative) > 0 {
115+
vpcNativeOverride = fmt.Sprintf("--set cluster.vpcNative='%s'", vpcNative)
116+
}
117+
118+
// Add cluster type if defined in environment
119+
extraClusterType := ""
120+
if len(clusterType) > 0 {
121+
extraClusterType = fmt.Sprintf("--set cluster.type='%s'", clusterType)
122+
}
123+
124+
// Allow pinning a specific chart version
125+
chartVersionOverride := ""
126+
if len(chartVersion) > 0 {
127+
chartVersionOverride = fmt.Sprintf("--version '%s'", chartVersion)
128+
}
129+
130+
// TODO: Create namespace if it doesn't exist
131+
// & tag the namespace if it isn't already tagged.
132+
// TODO: Rewrite
133+
134+
if !debug {
135+
// Add helm repositories
136+
command := fmt.Sprintf("helm repo add '%s' '%s'", "wunderio", chartRepository)
137+
exec.Command("bash", "-c", command).Run()
138+
139+
// Make sure repositories are up to date
140+
command = "helm repo update"
141+
exec.Command("bash", "-c", command).Run()
142+
}
143+
144+
if chartName == "simple" || strings.HasSuffix(chartName, "/simple") {
145+
146+
if len(nginxImageUrl) == 0 {
147+
log.Fatal("Nginx image url required (nginx-image-url)")
148+
}
149+
150+
_, errDir := os.Stat(common.ExtendedFolder + "/simple")
151+
if !os.IsNotExist(errDir) {
152+
chartName = common.ExtendedFolder + "/simple"
153+
}
154+
155+
fmt.Printf("Diffing %s helm release %s in %s namespace\n", chartName, releaseName, namespace)
156+
157+
// helm release
158+
command := fmt.Sprintf(`
159+
set -Eeuo pipefail
160+
161+
RELEASE_NAME='%s'
162+
CHART_NAME='%s'
163+
CHART_REPOSITORY='%s'
164+
EXTRA_CHART_VERSION='%s'
165+
SILTA_ENVIRONMENT_NAME='%s'
166+
BRANCHNAME='%s'
167+
NGINX_IMAGE_URL='%s'
168+
CLUSTER_DOMAIN='%s'
169+
EXTRA_NOAUTHIPS='%s'
170+
EXTRA_VPCNATIVE='%s'
171+
EXTRA_CLUSTERTYPE='%s'
172+
NAMESPACE='%s'
173+
SILTA_CONFIG='%s'
174+
EXTRA_HELM_FLAGS='%s'
175+
176+
helm diff upgrade --install "${RELEASE_NAME}" "${CHART_NAME}" \
177+
--repo "${CHART_REPOSITORY}" \
178+
${EXTRA_CHART_VERSION} \
179+
--set environmentName="${SILTA_ENVIRONMENT_NAME}" \
180+
--set silta-release.branchName="${BRANCHNAME}" \
181+
--set nginx.image="${NGINX_IMAGE_URL}" \
182+
--set clusterDomain="${CLUSTER_DOMAIN}" \
183+
${EXTRA_NOAUTHIPS} \
184+
${EXTRA_VPCNATIVE} \
185+
${EXTRA_CLUSTERTYPE} \
186+
--namespace="${NAMESPACE}" \
187+
--values "${SILTA_CONFIG}" \
188+
${EXTRA_HELM_FLAGS}`,
189+
releaseName, chartName, chartRepository, chartVersionOverride,
190+
siltaEnvironmentName, branchname, nginxImageUrl,
191+
clusterDomain, extraNoAuthIPs, vpcNativeOverride, extraClusterType,
192+
namespace, siltaConfig, helmFlags)
193+
pipedExec(command, "", "ERROR: ", debug)
194+
195+
} else if chartName == "frontend" || strings.HasSuffix(chartName, "/frontend") {
196+
197+
fmt.Printf("Diffing %s helm release %s in %s namespace\n", chartName, releaseName, namespace)
198+
199+
_, errDir := os.Stat(common.ExtendedFolder + "/frontend")
200+
if !os.IsNotExist(errDir) {
201+
chartName = common.ExtendedFolder + "/frontend"
202+
}
203+
204+
// helm release
205+
command := fmt.Sprintf(`
206+
set -Eeuo pipefail
207+
208+
RELEASE_NAME='%s'
209+
CHART_NAME='%s'
210+
CHART_REPOSITORY='%s'
211+
EXTRA_CHART_VERSION='%s'
212+
SILTA_ENVIRONMENT_NAME='%s'
213+
BRANCHNAME='%s'
214+
GIT_REPOSITORY_URL='%s'
215+
GITAUTH_USERNAME='%s'
216+
GITAUTH_PASSWORD='%s'
217+
CLUSTER_DOMAIN='%s'
218+
NAMESPACE='%s'
219+
EXTRA_NOAUTHIPS='%s'
220+
EXTRA_VPCNATIVE='%s'
221+
EXTRA_CLUSTERTYPE='%s'
222+
EXTRA_DB_ROOT_PASS='%s'
223+
EXTRA_DB_USER_PASS='%s'
224+
SILTA_CONFIG='%s'
225+
EXTRA_HELM_FLAGS='%s'
226+
227+
helm diff upgrade --install "${RELEASE_NAME}" "${CHART_NAME}" \
228+
--repo "${CHART_REPOSITORY}" \
229+
${EXTRA_CHART_VERSION} \
230+
--set environmentName="${SILTA_ENVIRONMENT_NAME}" \
231+
--set silta-release.branchName="${BRANCHNAME}" \
232+
--set shell.gitAuth.repositoryUrl="${GIT_REPOSITORY_URL}" \
233+
--set shell.gitAuth.keyserver.username="${GITAUTH_USERNAME}" \
234+
--set shell.gitAuth.keyserver.password="${GITAUTH_PASSWORD}" \
235+
--set clusterDomain="${CLUSTER_DOMAIN}" \
236+
--namespace="${NAMESPACE}" \
237+
${EXTRA_NOAUTHIPS} \
238+
${EXTRA_VPCNATIVE} \
239+
${EXTRA_CLUSTERTYPE} \
240+
${EXTRA_DB_ROOT_PASS} \
241+
${EXTRA_DB_USER_PASS} \
242+
--values "${SILTA_CONFIG}" \
243+
${EXTRA_HELM_FLAGS}`,
244+
releaseName, chartName, chartRepository, chartVersionOverride,
245+
siltaEnvironmentName, branchname,
246+
repositoryUrl, gitAuthUsername, gitAuthPassword,
247+
clusterDomain, namespace,
248+
extraNoAuthIPs, vpcNativeOverride, extraClusterType,
249+
dbRootPassOverride, dbUserPassOverride,
250+
siltaConfig, helmFlags)
251+
pipedExec(command, "", "ERROR: ", debug)
252+
253+
} else if chartName == "drupal" || strings.HasSuffix(chartName, "/drupal") {
254+
255+
if len(phpImageUrl) == 0 {
256+
log.Fatal("PHP image url required (php-image-url)")
257+
}
258+
if len(nginxImageUrl) == 0 {
259+
log.Fatal("Nginx image url required (nginx-image-url)")
260+
}
261+
if len(shellImageUrl) == 0 {
262+
log.Fatal("Shell image url required (shell-image-url)")
263+
}
264+
265+
_, errDir := os.Stat(common.ExtendedFolder + "/drupal")
266+
if os.IsNotExist(errDir) == false {
267+
chartName = common.ExtendedFolder + "/drupal"
268+
}
269+
270+
// Disable reference data if the required volume is not present.
271+
referenceDataOverride := ""
272+
if debug == false {
273+
command := fmt.Sprintf("kubectl get persistentvolume | grep --extended-regexp '%s/.*-reference-data'", namespace)
274+
err := exec.Command("bash", "-c", command).Run()
275+
if err != nil {
276+
referenceDataOverride = "--set referenceData.skipMount=true"
277+
}
278+
}
279+
280+
fmt.Printf("Diffing %s helm release %s in %s namespace\n", chartName, releaseName, namespace)
281+
282+
command := fmt.Sprintf(`
283+
set -Eeuo pipefail
284+
285+
RELEASE_NAME='%s'
286+
CHART_NAME='%s'
287+
CHART_REPOSITORY='%s'
288+
EXTRA_CHART_VERSION='%s'
289+
SILTA_ENVIRONMENT_NAME='%s'
290+
BRANCHNAME='%s'
291+
PHP_IMAGE_URL='%s'
292+
NGINX_IMAGE_URL='%s'
293+
SHELL_IMAGE_URL='%s'
294+
GIT_REPOSITORY_URL='%s'
295+
GITAUTH_USERNAME='%s'
296+
GITAUTH_PASSWORD='%s'
297+
CLUSTER_DOMAIN='%s'
298+
EXTRA_NOAUTHIPS='%s'
299+
EXTRA_VPCNATIVE='%s'
300+
EXTRA_CLUSTERTYPE='%s'
301+
EXTRA_DB_ROOT_PASS='%s'
302+
EXTRA_DB_USER_PASS='%s'
303+
EXTRA_REFERENCE_DATA='%s'
304+
NAMESPACE='%s'
305+
SILTA_CONFIG='%s'
306+
EXTRA_HELM_FLAGS='%s'
307+
308+
helm diff upgrade --install "${RELEASE_NAME}" "${CHART_NAME}" \
309+
--repo "${CHART_REPOSITORY}" \
310+
${EXTRA_CHART_VERSION} \
311+
--set environmentName="${SILTA_ENVIRONMENT_NAME}" \
312+
--set silta-release.branchName="${BRANCHNAME}" \
313+
--set php.image="${PHP_IMAGE_URL}" \
314+
--set nginx.image="${NGINX_IMAGE_URL}" \
315+
--set shell.image="${SHELL_IMAGE_URL}" \
316+
--set shell.gitAuth.repositoryUrl="${GIT_REPOSITORY_URL}" \
317+
--set shell.gitAuth.keyserver.username="${GITAUTH_USERNAME}" \
318+
--set shell.gitAuth.keyserver.password="${GITAUTH_PASSWORD}" \
319+
--set clusterDomain="${CLUSTER_DOMAIN}" \
320+
${EXTRA_NOAUTHIPS} \
321+
${EXTRA_VPCNATIVE} \
322+
${EXTRA_CLUSTERTYPE} \
323+
${EXTRA_DB_ROOT_PASS} \
324+
${EXTRA_DB_USER_PASS} \
325+
${EXTRA_REFERENCE_DATA} \
326+
--namespace="${NAMESPACE}" \
327+
--values "${SILTA_CONFIG}" \
328+
${EXTRA_HELM_FLAGS}`,
329+
releaseName, chartName, chartRepository, chartVersionOverride,
330+
siltaEnvironmentName, branchname,
331+
phpImageUrl, nginxImageUrl, shellImageUrl,
332+
repositoryUrl, gitAuthUsername, gitAuthPassword,
333+
clusterDomain, extraNoAuthIPs, vpcNativeOverride, extraClusterType,
334+
dbRootPassOverride, dbUserPassOverride, referenceDataOverride, namespace,
335+
siltaConfig, helmFlags)
336+
pipedExec(command, "", "ERROR: ", debug)
337+
338+
} else {
339+
fmt.Printf("Chart name %s does not match preselected names (drupal, frontend, simple), helm diff step was skipped\n", chartName)
340+
}
341+
},
342+
}
343+
344+
func init() {
345+
ciReleaseCmd.AddCommand(ciReleaseDiffCmd)
346+
347+
ciReleaseDiffCmd.Flags().String("release-name", "", "Release name")
348+
ciReleaseDiffCmd.Flags().String("release-suffix", "", "Release name suffix for environment name creation")
349+
ciReleaseDiffCmd.Flags().String("namespace", "", "Project name (namespace, i.e. \"drupal-project\")")
350+
ciReleaseDiffCmd.Flags().String("silta-environment-name", "", "Environment name override based on branchname and release-suffix. Used in some helm charts.")
351+
ciReleaseDiffCmd.Flags().String("branchname", "", "Repository branchname that will be used for release name and environment name creation")
352+
ciReleaseDiffCmd.Flags().String("db-root-pass", "", "Database password for root account")
353+
ciReleaseDiffCmd.Flags().String("db-user-pass", "", "Database password for user account")
354+
ciReleaseDiffCmd.Flags().String("vpn-ip", "", "VPN IP for basic auth allow list")
355+
ciReleaseDiffCmd.Flags().String("vpc-native", "", "VPC-native cluster (GKE specific)")
356+
ciReleaseDiffCmd.Flags().String("cluster-type", "", "Cluster type (i.e. gke, aws, aks, other)")
357+
ciReleaseDiffCmd.Flags().String("chart-version", "", "Diff a specific chart version")
358+
ciReleaseDiffCmd.Flags().String("php-image-url", "", "PHP image url")
359+
ciReleaseDiffCmd.Flags().String("nginx-image-url", "", "PHP image url")
360+
ciReleaseDiffCmd.Flags().String("shell-image-url", "", "PHP image url")
361+
ciReleaseDiffCmd.Flags().String("repository-url", "", "Repository url (i.e. git@github.com:wunderio/silta.git)")
362+
ciReleaseDiffCmd.Flags().String("gitauth-username", "", "Gitauth server username")
363+
ciReleaseDiffCmd.Flags().String("gitauth-password", "", "Gitauth server password")
364+
ciReleaseDiffCmd.Flags().String("cluster-domain", "", "Base domain for cluster urls (i.e. dev.example.com)")
365+
ciReleaseDiffCmd.Flags().String("chart-name", "", "Chart name")
366+
ciReleaseDiffCmd.Flags().String("chart-repository", "https://storage.googleapis.com/charts.wdr.io", "Chart repository")
367+
ciReleaseDiffCmd.Flags().String("silta-config", "", "Silta release helm chart values")
368+
ciReleaseDiffCmd.Flags().String("helm-flags", "", "Extra flags for helm release")
369+
370+
ciReleaseDiffCmd.MarkFlagRequired("release-name")
371+
ciReleaseDiffCmd.MarkFlagRequired("namespace")
372+
ciReleaseDiffCmd.MarkFlagRequired("chart-name")
373+
}

cmd/ciScripts.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/spf13/cobra"
7+
)
8+
9+
var ciScriptsCmd = &cobra.Command{
10+
Use: "scripts",
11+
Short: "Convenience scripts for silta",
12+
Run: func(cmd *cobra.Command, args []string) {
13+
fmt.Println(cmd.Usage())
14+
},
15+
}
16+
17+
func init() {
18+
rootCmd.AddCommand(ciScriptsCmd)
19+
}

0 commit comments

Comments
 (0)