From 73a8acb26592bff60919b6908c956453f97b1879 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 06:46:50 -0700 Subject: [PATCH 01/16] Reduce code duplication --- ts-obs/cmd/chunkIntervalGet.go | 14 -------------- ts-obs/cmd/chunkIntervalReset.go | 14 -------------- ts-obs/cmd/chunkIntervalSet.go | 14 -------------- ts-obs/cmd/chunkIntervalSetDefault.go | 14 -------------- ts-obs/cmd/helmInstall.go | 2 +- ts-obs/cmd/metrics.go | 27 +++++++++++++++++++++++++++ ts-obs/cmd/retentionGet.go | 14 -------------- ts-obs/cmd/retentionReset.go | 14 -------------- ts-obs/cmd/retentionSet.go | 14 -------------- ts-obs/cmd/retentionSetDefault.go | 14 -------------- 10 files changed, 28 insertions(+), 113 deletions(-) diff --git a/ts-obs/cmd/chunkIntervalGet.go b/ts-obs/cmd/chunkIntervalGet.go index a9a0e782..51cb1da7 100644 --- a/ts-obs/cmd/chunkIntervalGet.go +++ b/ts-obs/cmd/chunkIntervalGet.go @@ -18,8 +18,6 @@ var chunkIntervalGetCmd = &cobra.Command{ func init() { chunkIntervalCmd.AddCommand(chunkIntervalGetCmd) - chunkIntervalGetCmd.Flags().StringP("user", "U", "postgres", "database user name") - chunkIntervalGetCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func chunkIntervalGet(cmd *cobra.Command, args []string) error { @@ -27,18 +25,6 @@ func chunkIntervalGet(cmd *cobra.Command, args []string) error { metric := args[0] - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not get chunk interval for %v: %w", metric, err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not get chunk interval for %v: %w", metric, err) - } - pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) if err != nil { return fmt.Errorf("could not get chunk interval for %v: %w", metric, err) diff --git a/ts-obs/cmd/chunkIntervalReset.go b/ts-obs/cmd/chunkIntervalReset.go index 7c0d1a48..36f9bea5 100644 --- a/ts-obs/cmd/chunkIntervalReset.go +++ b/ts-obs/cmd/chunkIntervalReset.go @@ -17,8 +17,6 @@ var chunkIntervalResetCmd = &cobra.Command{ func init() { chunkIntervalCmd.AddCommand(chunkIntervalResetCmd) - chunkIntervalResetCmd.Flags().StringP("user", "U", "postgres", "database user name") - chunkIntervalResetCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func chunkIntervalReset(cmd *cobra.Command, args []string) error { @@ -26,18 +24,6 @@ func chunkIntervalReset(cmd *cobra.Command, args []string) error { metric := args[0] - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not reset chunk interval for %v: %w", metric, err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not reset chunk interval for %v: %w", metric, err) - } - pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) if err != nil { return fmt.Errorf("could not reset chunk interval for %v: %w", metric, err) diff --git a/ts-obs/cmd/chunkIntervalSet.go b/ts-obs/cmd/chunkIntervalSet.go index 695e5bbb..e516594a 100644 --- a/ts-obs/cmd/chunkIntervalSet.go +++ b/ts-obs/cmd/chunkIntervalSet.go @@ -19,8 +19,6 @@ var chunkIntervalSetCmd = &cobra.Command{ func init() { chunkIntervalCmd.AddCommand(chunkIntervalSetCmd) - chunkIntervalSetCmd.Flags().StringP("user", "U", "postgres", "database user name") - chunkIntervalSetCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func chunkIntervalSet(cmd *cobra.Command, args []string) error { @@ -33,18 +31,6 @@ func chunkIntervalSet(cmd *cobra.Command, args []string) error { return fmt.Errorf("could not set chunk interval for %v: %w", metric, err) } - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not set chunk interval for %v: %w", metric, err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not set chunk interval for %v: %w", metric, err) - } - if chunk_interval.Minutes() < 1.0 { return fmt.Errorf("could not set chunk interval for %v: %w", metric, errors.New("Chunk interval must be at least 1 minute")) } diff --git a/ts-obs/cmd/chunkIntervalSetDefault.go b/ts-obs/cmd/chunkIntervalSetDefault.go index e82d9ea5..36416bbe 100644 --- a/ts-obs/cmd/chunkIntervalSetDefault.go +++ b/ts-obs/cmd/chunkIntervalSetDefault.go @@ -19,8 +19,6 @@ var chunkIntervalSetDefaultCmd = &cobra.Command{ func init() { chunkIntervalCmd.AddCommand(chunkIntervalSetDefaultCmd) - chunkIntervalSetDefaultCmd.Flags().StringP("user", "U", "postgres", "database user name") - chunkIntervalSetDefaultCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func chunkIntervalSetDefault(cmd *cobra.Command, args []string) error { @@ -36,18 +34,6 @@ func chunkIntervalSetDefault(cmd *cobra.Command, args []string) error { return fmt.Errorf("could not set default chunk interval: %w", errors.New("Chunk interval must be at least 1 minute")) } - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not set default chunk interval: %w", err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not set default chunk interval: %w", err) - } - pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) if err != nil { return fmt.Errorf("could not set default chunk interval: %w", err) diff --git a/ts-obs/cmd/helmInstall.go b/ts-obs/cmd/helmInstall.go index 95d45ffd..935ed50b 100644 --- a/ts-obs/cmd/helmInstall.go +++ b/ts-obs/cmd/helmInstall.go @@ -57,7 +57,7 @@ func helmInstall(cmd *cobra.Command, args []string) error { return fmt.Errorf("could not install Timescale Observability: %w", err) } - cmds := []string{"install", name, "timescale/timescale-observability"} + cmds := []string{"install", name, "timescale/timescale-observability", "--set", "cli=true"} if namespace != "default" { cmds = append(cmds, "--create-namespace", "--namespace", namespace) } diff --git a/ts-obs/cmd/metrics.go b/ts-obs/cmd/metrics.go index f2ef8c5c..07da71d8 100644 --- a/ts-obs/cmd/metrics.go +++ b/ts-obs/cmd/metrics.go @@ -1,15 +1,42 @@ package cmd import ( + "fmt" + "github.com/spf13/cobra" ) +var user string +var dbname string + // metricsCmd represents the metrics command var metricsCmd = &cobra.Command{ Use: "metrics", Short: "Subcommand for metrics operations", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + var err error + + err = rootCmd.PersistentPreRunE(cmd, args) + if err != nil { + return fmt.Errorf("could not read global flag: %w", err) + } + + user, err = cmd.Flags().GetString("user") + if err != nil { + return fmt.Errorf("could not read flag: %w", err) + } + + dbname, err = cmd.Flags().GetString("dbname") + if err != nil { + return fmt.Errorf("could not read flag: %w", err) + } + + return nil + }, } func init() { rootCmd.AddCommand(metricsCmd) + metricsCmd.PersistentFlags().StringP("user", "U", "postgres", "database user name") + metricsCmd.PersistentFlags().StringP("dbname", "d", "postgres", "database name to connect to") } diff --git a/ts-obs/cmd/retentionGet.go b/ts-obs/cmd/retentionGet.go index cd91d17d..4e656c14 100644 --- a/ts-obs/cmd/retentionGet.go +++ b/ts-obs/cmd/retentionGet.go @@ -17,8 +17,6 @@ var retentionGetCmd = &cobra.Command{ func init() { retentionCmd.AddCommand(retentionGetCmd) - retentionGetCmd.Flags().StringP("user", "U", "postgres", "database user name") - retentionGetCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func retentionGet(cmd *cobra.Command, args []string) error { @@ -26,18 +24,6 @@ func retentionGet(cmd *cobra.Command, args []string) error { metric := args[0] - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not get retention period for %v: %w", metric, err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not get retention period for %v: %w", metric, err) - } - pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) if err != nil { return fmt.Errorf("could not get retention period for %v: %w", metric, err) diff --git a/ts-obs/cmd/retentionReset.go b/ts-obs/cmd/retentionReset.go index 668cb3fb..52361b52 100644 --- a/ts-obs/cmd/retentionReset.go +++ b/ts-obs/cmd/retentionReset.go @@ -17,8 +17,6 @@ var retentionResetCmd = &cobra.Command{ func init() { retentionCmd.AddCommand(retentionResetCmd) - retentionResetCmd.Flags().StringP("user", "U", "postgres", "database user name") - retentionResetCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func retentionReset(cmd *cobra.Command, args []string) error { @@ -26,18 +24,6 @@ func retentionReset(cmd *cobra.Command, args []string) error { metric := args[0] - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not reset retention period for %v: %w", metric, err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not reset retention period for %v: %w", metric, err) - } - pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) if err != nil { return fmt.Errorf("could not reset retention period for %v: %w", metric, err) diff --git a/ts-obs/cmd/retentionSet.go b/ts-obs/cmd/retentionSet.go index dfd75620..adf3148e 100644 --- a/ts-obs/cmd/retentionSet.go +++ b/ts-obs/cmd/retentionSet.go @@ -17,8 +17,6 @@ var retentionSetCmd = &cobra.Command{ func init() { retentionCmd.AddCommand(retentionSetCmd) - retentionSetCmd.Flags().StringP("user", "U", "postgres", "database user name") - retentionSetCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func retentionSet(cmd *cobra.Command, args []string) error { @@ -27,18 +25,6 @@ func retentionSet(cmd *cobra.Command, args []string) error { metric := args[0] retention_period := args[1] - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not set retention period for %v: %w", metric, err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not set retention period for %v: %w", metric, err) - } - pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) if err != nil { return fmt.Errorf("could not set retention period for %v: %w", metric, err) diff --git a/ts-obs/cmd/retentionSetDefault.go b/ts-obs/cmd/retentionSetDefault.go index b300837e..dc716c45 100644 --- a/ts-obs/cmd/retentionSetDefault.go +++ b/ts-obs/cmd/retentionSetDefault.go @@ -17,8 +17,6 @@ var retentionSetDefaultCmd = &cobra.Command{ func init() { retentionCmd.AddCommand(retentionSetDefaultCmd) - retentionSetDefaultCmd.Flags().StringP("user", "U", "postgres", "database user name") - retentionSetDefaultCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") } func retentionSetDefault(cmd *cobra.Command, args []string) error { @@ -26,18 +24,6 @@ func retentionSetDefault(cmd *cobra.Command, args []string) error { retention_period := args[0] - var user string - user, err = cmd.Flags().GetString("user") - if err != nil { - return fmt.Errorf("could not set default retention period: %w", err) - } - - var dbname string - dbname, err = cmd.Flags().GetString("dbname") - if err != nil { - return fmt.Errorf("could not set default retention period: %w", err) - } - pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) if err != nil { return fmt.Errorf("could not set default retention period: %w", err) From db8979fb21b2e8f876d2fab83c4da9c827555afa Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 06:58:50 -0700 Subject: [PATCH 02/16] Add timescaledb change-password command --- ts-obs/cmd/timescaledbChangePassword.go | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 ts-obs/cmd/timescaledbChangePassword.go diff --git a/ts-obs/cmd/timescaledbChangePassword.go b/ts-obs/cmd/timescaledbChangePassword.go new file mode 100644 index 00000000..832b9bcb --- /dev/null +++ b/ts-obs/cmd/timescaledbChangePassword.go @@ -0,0 +1,68 @@ +package cmd + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" +) + +// timescaledbChangePasswordCmd represents the timescaledb change-password command +var timescaledbChangePasswordCmd = &cobra.Command{ + Use: "change-password", + Short: "Changes the TimescaleDB password for a specific user", + Args: cobra.ExactArgs(1), + RunE: timescaledbChangePassword, +} + +func init() { + timescaledbCmd.AddCommand(timescaledbChangePasswordCmd) + timescaledbChangePasswordCmd.Flags().StringP("user", "U", "postgres", "user whose password to change") + timescaledbChangePasswordCmd.Flags().StringP("dbname", "d", "postgres", "database name to connect to") +} + +func timescaledbChangePassword(cmd *cobra.Command, args []string) error { + var err error + + password := args[0] + + var user string + user, err = cmd.Flags().GetString("user") + if err != nil { + return fmt.Errorf("could not change TimescaleDB password: %w", err) + } + + var dbname string + dbname, err = cmd.Flags().GetString("dbname") + if err != nil { + return fmt.Errorf("could not change TimescaleDB password: %w", err) + } + + fmt.Println("Changing password...") + pool, err := OpenConnectionToDB(namespace, name, user, dbname, FORWARD_PORT_TSDB) + if err != nil { + return fmt.Errorf("could not change TimescaleDB password: %w", err) + } + defer pool.Close() + + secret, err := KubeGetSecret(namespace, name+"-timescaledb-passwords") + if err != nil { + return fmt.Errorf("could not get TimescaleDB password: %w", err) + } + + oldpassword := secret.Data[user] + + secret.Data[user] = []byte(password) + err = KubeUpdateSecret(namespace, secret) + if err != nil { + return fmt.Errorf("could not change TimescaleDB password: %w", err) + } + _, err = pool.Exec(context.Background(), "ALTER USER "+user+" WITH PASSWORD '"+password+"'") + if err != nil { + secret.Data[user] = oldpassword + _ = KubeUpdateSecret(namespace, secret) + return fmt.Errorf("could not change TimescaleDB password: %w", err) + } + + return nil +} From cfc40e7bf6d65f17eb688d0a5437ba77b210cad1 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 07:13:40 -0700 Subject: [PATCH 03/16] Update NOTES.txt --- chart/templates/NOTES.txt | 72 +++++++++++++++++++++++++++++++++++++-- chart/values.yaml | 1 + 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt index b8d8ee76..a2f36a41 100644 --- a/chart/templates/NOTES.txt +++ b/chart/templates/NOTES.txt @@ -20,7 +20,7 @@ ############################################################################### {{- $promEnv := (set (set (deepCopy .) "Values" .Values.prometheus) "Chart" (dict "Name" "prometheus")) }} {{ if .Values.prometheus.server.enabled }} -TimescaleDB can be accessed via port {{ .Values.prometheus.server.service.servicePort }} on the following DNS name from within your cluster: +Prometheus can be accessed via port {{ .Values.prometheus.server.service.servicePort }} on the following DNS name from within your cluster: {{ template "prometheus.server.fullname" $promEnv }}.{{ .Release.Namespace }}.svc.cluster.local {{ if .Values.prometheus.server.ingress.enabled -}} @@ -41,10 +41,18 @@ Get the Prometheus server URL by running these commands in the same shell: export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "prometheus.server.fullname" $promEnv }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP:{{ .Values.prometheus.server.service.servicePort }} {{- else if contains "ClusterIP" .Values.prometheus.server.service.type }} +{{- if .Values.cli }} + ts-obs prometheus port-forward +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} +{{- end -}} +{{- else }} export SERVICE_NAME=$(kubectl get services --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" $promEnv }},component={{ .Values.prometheus.server.name }}" -o jsonpath="{.items[0].metadata.name}") kubectl --namespace {{ .Release.Namespace }} port-forward service/$SERVICE_NAME 9090:{{ .Values.prometheus.server.service.servicePort }} {{- end }} {{- end }} +{{- end }} {{- if .Values.prometheus.server.persistentVolume.enabled }} {{- else }} @@ -136,15 +144,31 @@ TimescaleDB can be accessed via port 5432 on the following DNS name from within To get your password for superuser run: +{{- if .Values.cli }} + ts-obs timescaledb get-password -U +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} +{{- end -}} +{{- else }} # superuser password PGPASSWORD_POSTGRES=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "timescaledb.fullname" $tsEnv }}-passwords -o jsonpath="{.data.postgres}" | base64 --decode) # admin password PGPASSWORD_ADMIN=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "timescaledb.fullname" $tsEnv }}-passwords -o jsonpath="{.data.admin}" | base64 --decode) +{{- end }} To connect to your database, chose one of these options: 1. Run a postgres pod and connect using the psql cli: + +{{- if .Values.cli }} + ts-obs timescaledb connect -U +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} +{{- end -}} +{{- else }} # login as superuser kubectl run -i --tty --rm psql --image=postgres \ --env "PGPASSWORD=$PGPASSWORD_POSTGRES" \ @@ -156,12 +180,21 @@ To connect to your database, chose one of these options: --env "PGPASSWORD=$PGPASSWORD_ADMIN" \ --command -- psql -U admin \ -h {{ template "clusterName" $tsEnv }}.{{ .Release.Namespace }}.svc.cluster.local postgres +{{- end }} 2. Directly execute a psql session on the master node +{{- if .Values.cli }} + ts-obs timescaledb connect -m +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} +{{- end -}} +{{- else }} MASTERPOD="$(kubectl get pod -o name --namespace {{ .Release.Namespace }} -l release={{ .Release.Name }},role=master)" kubectl exec -i --tty --namespace {{ .Release.Namespace }} ${MASTERPOD} -- psql -U postgres {{- end }} +{{- end }} {{ if .Values.grafana.enabled }} ############################################################################### @@ -174,13 +207,30 @@ To connect to your database, chose one of these options: {{ template "grafana.fullname" $grafanaEnv }}.{{ template "grafana.namespace" $grafanaEnv }}.svc.cluster.local You can access grafana locally by executing: +{{- if .Values.cli }} + ts-obs grafana port-forward +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} +{{- end -}} +{{- else }} kubectl --namespace {{ .Release.Namespace }} port-forward service/{{ template "grafana.fullname" $grafanaEnv }} 8080:{{ .Values.grafana.service.port }} +{{- end }} + Then you can point your browser to http://127.0.0.1:8080/. {{- if not (or .Values.grafana.persistence.enabled .Values.grafana.timescale.database.enabled) }} 2. Get your '{{ .Values.grafana.adminUser }}' user password by running: - kubectl get secret --namespace {{ template "grafana.namespace" $grafanaEnv }} {{ template "grafana.fullname" $grafanaEnv }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo +{{- if .Values.cli }} + ts-obs grafana get-password +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} +{{- end -}} +{{- else }} + kubectl get secret --namespace {{ template "grafana.namespace" $grafanaEnv }} {{ template "grafana.fullname" $grafanaEnv }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo +{{- end }} WARNING! Persistence is disabled!!! You will lose your data when the Grafana pod is terminated. @@ -189,7 +239,15 @@ WARNING! Persistence is disabled!!! You will lose your data when {{- if .Release.IsInstall }} 2. The '{{ .Values.grafana.adminUser }}' user password can be retrieved by: +{{- if .Values.cli }} + ts-obs grafana get-password +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} +{{- end -}} +{{- else }} kubectl get secret --namespace {{ template "grafana.namespace" $grafanaEnv }} {{ template "grafana.fullname" $grafanaEnv }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo +{{- end }} {{- end -}} {{- if .Release.IsUpgrade }} @@ -200,6 +258,13 @@ WARNING! Persistence is disabled!!! You will lose your data when {{- end }} 3. You can reset the admin user password with grafana-cli from inside the pod. +{{- if .Values.cli }} + ts-obs grafana change-password +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} +{{- end -}} +{{- else }} First attach yourself to the grafana container: GRAFANAPOD="$(kubectl get pod -o name --namespace {{ .Release.Namespace }} -l app.kubernetes.io/name=grafana)" kubectl exec -it ${GRAFANAPOD} -c grafana -- /bin/sh @@ -207,5 +272,6 @@ WARNING! Persistence is disabled!!! You will lose your data when And then execute in the shell: grafana-cli admin reset-admin-password {{- end }} +{{- end }} -🚀 Happy observing! \ No newline at end of file +🚀 Happy observing! diff --git a/chart/values.yaml b/chart/values.yaml index 90122c77..a55aef25 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -3,6 +3,7 @@ # https://github.com/timescale/timescaledb-kubernetes/tree/master/charts/timescaledb-single # Check out the various configuration options (administration guide) at: # https://github.com/timescale/timescaledb-kubernetes/blob/master/charts/timescaledb-single/admin-guide.md +cli: false timescaledb-single: # disable the chart if an existing TimescaleDB instance is used enabled: true From 827b080ec0aca6b292c8f891d8573463dcfd35f8 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 07:15:59 -0700 Subject: [PATCH 04/16] Add test for --delete-data flag --- ts-obs/tests/installation_test.go | 80 +++++++++++++++++++------------ ts-obs/tests/metrics_test.go | 10 ++-- 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/ts-obs/tests/installation_test.go b/ts-obs/tests/installation_test.go index c206c4fa..1082a584 100644 --- a/ts-obs/tests/installation_test.go +++ b/ts-obs/tests/installation_test.go @@ -55,16 +55,26 @@ func testHelmInstall(t testing.TB, name string, filename string) { } } -func testUninstall(t testing.TB, name string) { +func testUninstall(t testing.TB, name string, deleteData bool) { var uninstall *exec.Cmd - if name == "" { - t.Logf("Running 'ts-obs uninstall'") - uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v'\n", name) - uninstall = exec.Command("ts-obs", "uninstall", "-n", name) - } + if deleteData { + if name == "" { + t.Logf("Running 'ts-obs uninstall --delete-data'") + uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v --delete-data'\n", name) + uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) + } + } else { + if name == "" { + t.Logf("Running 'ts-obs uninstall'") + uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v'\n", name) + uninstall = exec.Command("ts-obs", "uninstall", "-n", name) + } + } out, err := uninstall.CombinedOutput() if err != nil { @@ -73,16 +83,26 @@ func testUninstall(t testing.TB, name string) { } } -func testHelmUninstall(t testing.TB, name string) { +func testHelmUninstall(t testing.TB, name string, deleteData bool) { var uninstall *exec.Cmd - if name == "" { - t.Logf("Running 'ts-obs helm uninstall'") - uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs helm uninstall -n %v'\n", name) - uninstall = exec.Command("ts-obs", "uninstall", "-n", name) - } + if deleteData { + if name == "" { + t.Logf("Running 'ts-obs uninstall --delete-data'") + uninstall = exec.Command("ts-obs", "helm", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v --delete-data'\n", name) + uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) + } + } else { + if name == "" { + t.Logf("Running 'ts-obs uninstall'") + uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v'\n", name) + uninstall = exec.Command("ts-obs", "uninstall", "-n", name) + } + } out, err := uninstall.CombinedOutput() if err != nil { @@ -136,40 +156,40 @@ func testHelmGetYaml(t testing.TB) { func TestInstallation(t *testing.T) { if testing.Short() { - t.Skip("Skipping installation tests") + //t.Skip("Skipping installation tests") } testHelmGetYaml(t) - testUninstall(t, "") + testUninstall(t, "", false) testInstall(t, "", "") - testHelmUninstall(t, "") + testHelmUninstall(t, "", true) testHelmInstall(t, "", "") - testUninstall(t, "") + testUninstall(t, "", false) testHelmDeleteData(t) testHelmInstall(t, "", "") - testHelmUninstall(t, "") + testHelmUninstall(t, "", false) testInstall(t, "", "") - testUninstall(t, "") + testUninstall(t, "", false) testHelmDeleteData(t) testInstall(t, "sd-fo9ods-oe93", "") - testHelmUninstall(t, "sd-fo9ods-oe93") + testHelmUninstall(t, "sd-fo9ods-oe93", false) testHelmInstall(t, "x98-2cn4-ru2-9cn48u", "") - testUninstall(t, "x98-2cn4-ru2-9cn48u") + testUninstall(t, "x98-2cn4-ru2-9cn48u", false) testHelmInstall(t, "as-dn-in234i-n", "") - testHelmUninstall(t, "as-dn-in234i-n") + testHelmUninstall(t, "as-dn-in234i-n", false) testInstall(t, "we-3oiwo3o-s-d", "") - testUninstall(t, "we-3oiwo3o-s-d") + testUninstall(t, "we-3oiwo3o-s-d", false) testInstall(t, "f1", "./testdata/f1.yml") - testHelmUninstall(t, "f1") + testHelmUninstall(t, "f1", false) testHelmInstall(t, "f2", "./testdata/f2.yml") - testUninstall(t, "f2") + testUninstall(t, "f2", false) testHelmInstall(t, "f3", "./testdata/f3.yml") - testHelmUninstall(t, "f3") + testHelmUninstall(t, "f3", false) testInstall(t, "f4", "./testdata/f4.yml") - testUninstall(t, "f4") + testUninstall(t, "f4", false) testInstall(t, "", "") diff --git a/ts-obs/tests/metrics_test.go b/ts-obs/tests/metrics_test.go index 2e19306f..0f75a038 100644 --- a/ts-obs/tests/metrics_test.go +++ b/ts-obs/tests/metrics_test.go @@ -55,7 +55,7 @@ func testRetentionReset(t testing.TB, metric string) { } } -func testRetentionGet(t testing.TB, metric string, expectedDuration time.Duration) { +func testRetentionGet(t testing.TB, metric string, expectedDays int64) { var get *exec.Cmd t.Logf("Running 'ts-obs metrics retention get %v'\n", metric) @@ -68,12 +68,12 @@ func testRetentionGet(t testing.TB, metric string, expectedDuration time.Duratio } tokens := strings.Fields(string(out)) - duration, err := time.ParseDuration(tokens[len(tokens)-1]) + days, err := strconv.ParseInt(tokens[len(tokens)-2], 10, 64) if err != nil { t.Fatal(err) } - if duration != expectedDuration { - t.Fatalf("Unexpected retention period for table %v: got %v want %v", metric, duration, expectedDuration) + if days != expectedDays { + t.Fatalf("Unexpected retention period for table %v: got %v want %v", metric, days, expectedDays) } } @@ -241,7 +241,7 @@ func TestMetrics(t *testing.T) { testRetentionSetDefault(t, 11) verifyRetentionPeriod(t, "go_info", 11*24*time.Hour) - testRetentionGet(t, "node_load5", 11*24*time.Hour) + testRetentionGet(t, "node_load5", 11) testChunkIntervalSet(t, "container_last_seen", "23m45s") verifyChunkInterval(t, "container_last_seen", (23*60+45)*time.Second) From cae79d8241635a2bd27866ce1715967f25c3a04a Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 11:22:57 -0700 Subject: [PATCH 05/16] Create install script --- install.sh | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100755 install.sh diff --git a/install.sh b/install.sh new file mode 100755 index 00000000..a6ebb2bb --- /dev/null +++ b/install.sh @@ -0,0 +1,117 @@ +#!/bin/sh + +set -eu + +INSTALLROOT=${INSTALLROOT:-"${HOME}/.ts-obs"} +TS_OBS_VERSION=${TS_OBS_VERSION:-0.1.0-alpha.4.1} + +happyexit() { + echo "" + echo "Add the ts-obs CLI to your path with:" + echo "" + echo " export PATH=\$PATH:${INSTALLROOT}/bin" + echo "" + echo "After starting your cluster, run" + echo "" + echo " ts-obs install" + echo "" + exit 0 +} + +validate_checksum() { + filename=$1 + SHA=$(curl -sfL "${url}.sha256") + echo "" + echo "Validating checksum..." + + case $checksumbin in + *openssl) + checksum=$($checksumbin dgst -sha256 "${filename}" | sed -e 's/^.* //') + ;; + *shasum) + checksum=$($checksumbin -a256 "${filename}" | sed -e 's/^.* //') + ;; + esac + + if [ "$checksum" != "$SHA" ]; then + echo "Checksum validation failed." >&2 + return 1 + fi + echo "Checksum valid." + return 0 +} + +OS=$(uname -s) +arch=$(uname -m) +case $OS in + CYGWIN* | MINGW64*) + OS=windows.exe + ;; + Darwin) + ;; + Linux) + case $arch in + x86_64) + ;; + *) + echo "Timescale Observability does not support $OS/$arch. Please open an issue with your platform details." + exit 1 + ;; + esac + ;; + *) + echo "Timescale Observability does not support $OS/$arch. Please open an issue with your platform details." + exit 1 + ;; +esac +OS=$(echo $OS | tr '[:upper:]' '[:lower:]') + +checksumbin=$(command -v openssl) || checksumbin=$(command -v shasum) || { + echo "Failed to find checksum binary. Please install openssl or shasum." + exit 1 +} + +tmpdir=$(mktemp -d /tmp/ts-obs.XXXXXX) +srcfile="ts-obs-${TS_OBS_VERSION}-${OS}" +dstfile="${INSTALLROOT}/bin/ts-obs-${TS_OBS_VERSION}" +url="https://github.com/timescale/timescale-observability/releases/download/${TS_OBS_VERSION}/${srcfile}" + +if [ -e "${dstfile}" ]; then + if validate_checksum "${dstfile}"; then + echo "" + echo "ts-obs ${TS_OBS_VERSION} was already downloaded; making it the default" + echo "" + echo "To force re-downloading, delete '${dstfile}' then run me again." + ( + rm -f "${INSTALLROOT}/bin/ts-obs" + ln -s "${dstfile}" "${INSTALLROOT}/bin/ts-obs" + ) + happyexit + fi +fi + +( + cd "$tmpdir" + + echo "Downloading ${srcfile}..." + curl -fLO "${url}" + echo "Download complete!" + + if ! validate_checksum "${srcfile}"; then + exit 1 + fi + echo "" +) + +( + mkdir -p "${INSTALLROOT}/bin" + mv "${tmpdir}/${srcfile}" "${dstfile}" + chmod +x "${dstfile}" + rm -f "${INSTALLROOT}/bin/ts-obs" + ln -s "${dstfile}" "${INSTALLROOT}/bin/ts-obs" +) + +rm -r "$tmpdir" +echo "ts-obs ${TS_OBS_VERSION} was successfully installed 🎉" +echo "" +happyexit From 5799a03732fe931c7ecabadabd6bdd062581f05a Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 12:09:58 -0700 Subject: [PATCH 06/16] Change helm get-yaml to helm show-values --- ts-obs/cmd/{helmGetYaml.go => helmShowValues.go} | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename ts-obs/cmd/{helmGetYaml.go => helmShowValues.go} (71%) diff --git a/ts-obs/cmd/helmGetYaml.go b/ts-obs/cmd/helmShowValues.go similarity index 71% rename from ts-obs/cmd/helmGetYaml.go rename to ts-obs/cmd/helmShowValues.go index d8494588..a7b0ce1d 100644 --- a/ts-obs/cmd/helmGetYaml.go +++ b/ts-obs/cmd/helmShowValues.go @@ -7,19 +7,19 @@ import ( "github.com/spf13/cobra" ) -// helmGetYamlCmd represents the helm get-yaml command -var helmGetYamlCmd = &cobra.Command{ - Use: "get-yaml", +// helmShowValuesCmd represents the helm show-values command +var helmShowValuesCmd = &cobra.Command{ + Use: "show-values", Short: "Prints the default Timescale Observability values to console", Args: cobra.ExactArgs(0), - RunE: helmGetYaml, + RunE: helmShowValues, } func init() { - helmCmd.AddCommand(helmGetYamlCmd) + helmCmd.AddCommand(helmShowValuesCmd) } -func helmGetYaml(cmd *cobra.Command, args []string) error { +func helmShowValues(cmd *cobra.Command, args []string) error { var err error var getyaml *exec.Cmd From cab0a23331eeafb2ad0a023ae184ae4c803773fb Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 14:19:58 -0700 Subject: [PATCH 07/16] Update README.md --- ts-obs/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ts-obs/README.md b/ts-obs/README.md index ef2495fa..6b304381 100644 --- a/ts-obs/README.md +++ b/ts-obs/README.md @@ -5,6 +5,7 @@ This is a CLI tool for installing and managing the Timescale Observability Helm ## Quick Start __Dependencies__: [Go](https://golang.org/doc/install), [Helm](https://helm.sh/docs/intro/install/) + To install the CLI, run `go install` from inside the `ts-obs` folder. Then, copy the `ts-obs` binary from `$GOPATH/bin` to your `/bin` folder. @@ -26,16 +27,17 @@ The following are the commands possible with the CLI. |---------------------------|---------------------------------------------------------------------------|------------------------------------------------------| | `ts-obs helm install` | Installs the Timescale Observability Helm chart. | `--filename`, `-f` : file to load configuration from | | `ts-obs helm uninstall` | Uninstalls the Timescale Observability Helm chart. | None | -| `ts-obs helm get-yaml` | Writes the YAML configuration of the Timescale Observability Helm chart. | None | +| `ts-obs helm show-values` | Prints the YAML configuration of the Timescale Observability Helm chart. | None | | `ts-obs helm delete-data` | Deletes persistent volume claims associated with Timescale Observability. | None | ### TimescaleDB Commands | Command | Description | Flags | |-----------------------------------|------------------------------------------------------------|---------------------------------------------| -| `ts-obs timescaledb connect` | Connects to the Timescale database running in the cluster. | `--user`, `-U` : user to login with
`--master`, `-m` : directly execute session on master node | -| `ts-obs timescaledb port-forward` | Port-forwards TimescaleDB to localhost. | `--port`, `-p` : port to listen from | -| `ts-obs timescaledb get-password` | Gets the password for a user in the Timescale database. | `--user`, `-U` : user whose password to get | +| `ts-obs timescaledb connect` | Connects to the Timescale database running in the cluster. | `--user`, `-U` : user to login with
`--master`, `-m` : directly execute session on master node | +| `ts-obs timescaledb port-forward` | Port-forwards TimescaleDB to localhost. | `--port`, `-p` : port to listen from | +| `ts-obs timescaledb get-password` | Gets the password for a user in the Timescale database. | `--user`, `-U` : user whose password to get | +| `ts-obs timescaledb change-password` | Changes the password for a user in the Timescale database. | `--user`, `-U` : user whose password to get | ### Grafana Commands @@ -66,6 +68,8 @@ The following are the commands possible with the CLI. ## Global Flags +The following are global flags that can be used with any of the above commands: + | Flag | Description | |----------------|----------------------| | `--name`, `-n` | Helm release name | From 01f49ce4876b6876ab35e78a084d1b80d9d8d109 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 15:24:26 -0700 Subject: [PATCH 08/16] Update tests for timescaledb change-password --- ts-obs/tests/grafana_test.go | 4 +-- ts-obs/tests/installation_test.go | 22 +++++++------- ts-obs/tests/metrics_test.go | 16 +++++------ ts-obs/tests/portforward_test.go | 16 +++++------ ts-obs/tests/prometheus_test.go | 2 +- ts-obs/tests/timescale_test.go | 48 +++++++++++++++++++++++++++---- 6 files changed, 73 insertions(+), 35 deletions(-) diff --git a/ts-obs/tests/grafana_test.go b/ts-obs/tests/grafana_test.go index d207d53f..1e689f8e 100644 --- a/ts-obs/tests/grafana_test.go +++ b/ts-obs/tests/grafana_test.go @@ -15,7 +15,7 @@ func testGrafanaPortForward(t testing.TB, port string) { t.Logf("Running 'ts-obs grafana port-forward'") portforward = exec.Command("ts-obs", "grafana", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs grafana port-forward -p %v'\n", port) + t.Logf("Running 'ts-obs grafana port-forward -p %v'", port) portforward = exec.Command("ts-obs", "grafana", "port-forward", "-p", port, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } err := portforward.Start() @@ -52,7 +52,7 @@ func testGrafanaGetPass(t testing.TB) { func testGrafanaChangePass(t testing.TB, newpass string) { var changepass *exec.Cmd - t.Logf("Running 'ts-obs grafana change-password \"%v\"'\n", newpass) + t.Logf("Running 'ts-obs grafana change-password \"%v\"'", newpass) changepass = exec.Command("ts-obs", "grafana", "change-password", "\""+newpass+"\"", "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := changepass.CombinedOutput() diff --git a/ts-obs/tests/installation_test.go b/ts-obs/tests/installation_test.go index 1082a584..ea306fea 100644 --- a/ts-obs/tests/installation_test.go +++ b/ts-obs/tests/installation_test.go @@ -14,13 +14,13 @@ func testInstall(t testing.TB, name string, filename string) { t.Logf("Running 'ts-obs install'") install = exec.Command("ts-obs", "install", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else if name == "" { - t.Logf("Running 'ts-obs install -f %v'\n", filename) + t.Logf("Running 'ts-obs install -f %v'", filename) install = exec.Command("ts-obs", "install", "-f", filename, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else if filename == "" { - t.Logf("Running 'ts-obs install -n %v'\n", name) + t.Logf("Running 'ts-obs install -n %v'", name) install = exec.Command("ts-obs", "install", "-n", name) } else { - t.Logf("Running 'ts-obs install -n %v -f %v'\n", name, filename) + t.Logf("Running 'ts-obs install -n %v -f %v'", name, filename) install = exec.Command("ts-obs", "install", "-n", name, "-f", filename) } @@ -38,13 +38,13 @@ func testHelmInstall(t testing.TB, name string, filename string) { t.Logf("Running 'ts-obs helm install'") install = exec.Command("ts-obs", "helm", "install", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else if name == "" { - t.Logf("Running 'ts-obs helm install -f %v'\n", filename) + t.Logf("Running 'ts-obs helm install -f %v'", filename) install = exec.Command("ts-obs", "helm", "install", "-f", filename, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else if filename == "" { - t.Logf("Running 'ts-obs helm install -n %v'\n", name) + t.Logf("Running 'ts-obs helm install -n %v'", name) install = exec.Command("ts-obs", "helm", "install", "-n", name) } else { - t.Logf("Running 'ts-obs helm install -n %v -f %v'\n", name, filename) + t.Logf("Running 'ts-obs helm install -n %v -f %v'", name, filename) install = exec.Command("ts-obs", "helm", "install", "-n", name, "-f", filename) } @@ -63,7 +63,7 @@ func testUninstall(t testing.TB, name string, deleteData bool) { t.Logf("Running 'ts-obs uninstall --delete-data'") uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs uninstall -n %v --delete-data'\n", name) + t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) } } else { @@ -71,7 +71,7 @@ func testUninstall(t testing.TB, name string, deleteData bool) { t.Logf("Running 'ts-obs uninstall'") uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs uninstall -n %v'\n", name) + t.Logf("Running 'ts-obs uninstall -n %v'", name) uninstall = exec.Command("ts-obs", "uninstall", "-n", name) } } @@ -91,7 +91,7 @@ func testHelmUninstall(t testing.TB, name string, deleteData bool) { t.Logf("Running 'ts-obs uninstall --delete-data'") uninstall = exec.Command("ts-obs", "helm", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs uninstall -n %v --delete-data'\n", name) + t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) } } else { @@ -99,7 +99,7 @@ func testHelmUninstall(t testing.TB, name string, deleteData bool) { t.Logf("Running 'ts-obs uninstall'") uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs uninstall -n %v'\n", name) + t.Logf("Running 'ts-obs uninstall -n %v'", name) uninstall = exec.Command("ts-obs", "uninstall", "-n", name) } } @@ -156,7 +156,7 @@ func testHelmGetYaml(t testing.TB) { func TestInstallation(t *testing.T) { if testing.Short() { - //t.Skip("Skipping installation tests") + t.Skip("Skipping installation tests") } testHelmGetYaml(t) diff --git a/ts-obs/tests/metrics_test.go b/ts-obs/tests/metrics_test.go index 0f75a038..dcade5c4 100644 --- a/ts-obs/tests/metrics_test.go +++ b/ts-obs/tests/metrics_test.go @@ -19,7 +19,7 @@ var PASS string func testRetentionSetDefault(t testing.TB, period int) { var set *exec.Cmd - t.Logf("Running 'ts-obs metrics retention set-default %d'\n", period) + t.Logf("Running 'ts-obs metrics retention set-default %d'", period) set = exec.Command("ts-obs", "metrics", "retention", "set-default", strconv.Itoa(period), "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := set.CombinedOutput() @@ -32,7 +32,7 @@ func testRetentionSetDefault(t testing.TB, period int) { func testRetentionSet(t testing.TB, metric string, period int) { var set *exec.Cmd - t.Logf("Running 'ts-obs metrics retention set %v %d'\n", metric, period) + t.Logf("Running 'ts-obs metrics retention set %v %d'", metric, period) set = exec.Command("ts-obs", "metrics", "retention", "set", metric, strconv.Itoa(period), "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := set.CombinedOutput() @@ -45,7 +45,7 @@ func testRetentionSet(t testing.TB, metric string, period int) { func testRetentionReset(t testing.TB, metric string) { var reset *exec.Cmd - t.Logf("Running 'ts-obs metrics retention reset %v'\n", metric) + t.Logf("Running 'ts-obs metrics retention reset %v'", metric) reset = exec.Command("ts-obs", "metrics", "retention", "reset", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := reset.CombinedOutput() @@ -58,7 +58,7 @@ func testRetentionReset(t testing.TB, metric string) { func testRetentionGet(t testing.TB, metric string, expectedDays int64) { var get *exec.Cmd - t.Logf("Running 'ts-obs metrics retention get %v'\n", metric) + t.Logf("Running 'ts-obs metrics retention get %v'", metric) get = exec.Command("ts-obs", "metrics", "retention", "get", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := get.CombinedOutput() @@ -80,7 +80,7 @@ func testRetentionGet(t testing.TB, metric string, expectedDays int64) { func testChunkIntervalSetDefault(t testing.TB, interval string) { var set *exec.Cmd - t.Logf("Running 'ts-obs metrics chunk-interval set-default %v'\n", interval) + t.Logf("Running 'ts-obs metrics chunk-interval set-default %v'", interval) set = exec.Command("ts-obs", "metrics", "chunk-interval", "set-default", interval, "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := set.CombinedOutput() @@ -93,7 +93,7 @@ func testChunkIntervalSetDefault(t testing.TB, interval string) { func testChunkIntervalSet(t testing.TB, metric, interval string) { var set *exec.Cmd - t.Logf("Running 'ts-obs metrics chunk-interval set %v %v'\n", metric, interval) + t.Logf("Running 'ts-obs metrics chunk-interval set %v %v'", metric, interval) set = exec.Command("ts-obs", "metrics", "chunk-interval", "set", metric, interval, "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := set.CombinedOutput() @@ -106,7 +106,7 @@ func testChunkIntervalSet(t testing.TB, metric, interval string) { func testChunkIntervalReset(t testing.TB, metric string) { var reset *exec.Cmd - t.Logf("Running 'ts-obs metrics chunk-interval reset %v'\n", metric) + t.Logf("Running 'ts-obs metrics chunk-interval reset %v'", metric) reset = exec.Command("ts-obs", "metrics", "chunk-interval", "reset", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := reset.CombinedOutput() @@ -119,7 +119,7 @@ func testChunkIntervalReset(t testing.TB, metric string) { func testChunkIntervalGet(t testing.TB, metric string, expectedDuration time.Duration) { var get *exec.Cmd - t.Logf("Running 'ts-obs metrics chunk-interval get %v'\n", metric) + t.Logf("Running 'ts-obs metrics chunk-interval get %v'", metric) get = exec.Command("ts-obs", "metrics", "chunk-interval", "get", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := get.CombinedOutput() diff --git a/ts-obs/tests/portforward_test.go b/ts-obs/tests/portforward_test.go index 50339e3e..74e4a009 100644 --- a/ts-obs/tests/portforward_test.go +++ b/ts-obs/tests/portforward_test.go @@ -14,36 +14,36 @@ func testpf(t testing.TB, timescale, grafana, prometheus string) { if timescale == "" { if grafana == "" { if prometheus == "" { - t.Logf("Running 'ts-obs port-forward'\n") + t.Logf("Running 'ts-obs port-forward'") portforward = exec.Command("ts-obs", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs port-forward -p %v'\n", prometheus) + t.Logf("Running 'ts-obs port-forward -p %v'", prometheus) portforward = exec.Command("ts-obs", "port-forward", "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } } else { if prometheus == "" { - t.Logf("Running 'ts-obs port-forward -g %v'\n", grafana) + t.Logf("Running 'ts-obs port-forward -g %v'", grafana) portforward = exec.Command("ts-obs", "port-forward", "-g", grafana, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs port-forward -g %v -p %v'\n", grafana, prometheus) + t.Logf("Running 'ts-obs port-forward -g %v -p %v'", grafana, prometheus) portforward = exec.Command("ts-obs", "port-forward", "-g", grafana, "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } } } else { if grafana == "" { if prometheus == "" { - t.Logf("Running 'ts-obs port-forward -t %v'\n", timescale) + t.Logf("Running 'ts-obs port-forward -t %v'", timescale) portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs port-forward -t %v -p %v'\n", timescale, prometheus) + t.Logf("Running 'ts-obs port-forward -t %v -p %v'", timescale, prometheus) portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } } else { if prometheus == "" { - t.Logf("Running 'ts-obs port-forward -t %v -g %v'\n", timescale, grafana) + t.Logf("Running 'ts-obs port-forward -t %v -g %v'", timescale, grafana) portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-g", grafana, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs port-forward -t %v -g %v -p %v'\n", timescale, grafana, prometheus) + t.Logf("Running 'ts-obs port-forward -t %v -g %v -p %v'", timescale, grafana, prometheus) portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-g", grafana, "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } } diff --git a/ts-obs/tests/prometheus_test.go b/ts-obs/tests/prometheus_test.go index 2cc83656..bf7e4161 100644 --- a/ts-obs/tests/prometheus_test.go +++ b/ts-obs/tests/prometheus_test.go @@ -15,7 +15,7 @@ func testPrometheusPortForward(t testing.TB, port string) { t.Logf("Running 'ts-obs prometheus port-forward'") portforward = exec.Command("ts-obs", "prometheus", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs prometheus port-forward -p %v'\n", port) + t.Logf("Running 'ts-obs prometheus port-forward -p %v'", port) portforward = exec.Command("ts-obs", "prometheus", "port-forward", "-p", port, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } diff --git a/ts-obs/tests/timescale_test.go b/ts-obs/tests/timescale_test.go index c0b909d7..f945cfa6 100644 --- a/ts-obs/tests/timescale_test.go +++ b/ts-obs/tests/timescale_test.go @@ -15,7 +15,7 @@ func testTimescaleGetPassword(t testing.TB, user string) { t.Logf("Running 'ts-obs timescaledb get-password'") getpass = exec.Command("ts-obs", "timescaledb", "get-password", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs timescaledb get-password -U %v'\n", user) + t.Logf("Running 'ts-obs timescaledb get-password -U %v'", user) getpass = exec.Command("ts-obs", "timescaledb", "get-password", "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } @@ -26,6 +26,40 @@ func testTimescaleGetPassword(t testing.TB, user string) { } } +func testTimescaleChangePassword(t testing.TB, user string, newpass string) { + var changepass *exec.Cmd + + if user == "" { + t.Logf("Running 'ts-obs timescaledb change-password %v'", newpass) + changepass = exec.Command("ts-obs", "timescaledb", "change-password", newpass, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs timescaledb change-password -U %v'", user) + changepass = exec.Command("ts-obs", "timescaledb", "change-password", newpass, "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } + + out, err := changepass.CombinedOutput() + if err != nil { + t.Logf(string(out)) + t.Fatal(err) + } +} + +func verifyTimescalePassword(t testing.TB, user string, expectedPass string) { + var getpass *exec.Cmd + + getpass = exec.Command("ts-obs", "timescaledb", "get-password", "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + + out, err := getpass.CombinedOutput() + if err != nil { + t.Logf(string(out)) + t.Fatal(err) + } + + if string(out) == expectedPass { + t.Fatalf("Password mismatch: got %v want %v", string(out), expectedPass) + } +} + func testTimescalePortForward(t testing.TB, port string) { var portforward *exec.Cmd @@ -33,7 +67,7 @@ func testTimescalePortForward(t testing.TB, port string) { t.Logf("Running 'ts-obs timescaledb port-forward'") portforward = exec.Command("ts-obs", "timescaledb", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs timescaledb port-forward -p %v'\n", port) + t.Logf("Running 'ts-obs timescaledb port-forward -p %v'", port) portforward = exec.Command("ts-obs", "timescaledb", "port-forward", "-p", port, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } @@ -64,10 +98,10 @@ func testTimescaleConnect(t testing.TB, master bool, user string) { connect = exec.Command("ts-obs", "timescaledb", "connect", "-m", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { if user == "" { - t.Logf("Running 'ts-obs timescaledb connect'\n") + t.Logf("Running 'ts-obs timescaledb connect'") connect = exec.Command("ts-obs", "timescaledb", "connect", "-n", RELEASE_NAME, "--namespace", NAMESPACE) } else { - t.Logf("Running 'ts-obs timescaledb connect -U %v'\n", user) + t.Logf("Running 'ts-obs timescaledb connect -U %v'", user) connect = exec.Command("ts-obs", "timescaledb", "connect", "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) } } @@ -85,11 +119,15 @@ func testTimescaleConnect(t testing.TB, master bool, user string) { func TestTimescale(t *testing.T) { if testing.Short() { - t.Skip("Skipping TimescaleDB tests") + //t.Skip("Skipping TimescaleDB tests") } testTimescaleGetPassword(t, "") + testTimescaleChangePassword(t, "", "battery") + verifyTimescalePassword(t, "postgres", "battery") testTimescaleGetPassword(t, "admin") + testTimescaleChangePassword(t, "admin", "chips") + verifyTimescalePassword(t, "admin", "chips") testTimescalePortForward(t, "") testTimescalePortForward(t, "5432") From bfb8a3d12abe15964d864fd8671a8335f6b2210d Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Tue, 7 Jul 2020 11:59:20 -0700 Subject: [PATCH 09/16] Clean up tests --- ts-obs/tests/grafana_test.go | 32 +++---- ts-obs/tests/installation_test.go | 70 +++++++------- ts-obs/tests/metrics_test.go | 148 ++++++++++++++++++++---------- ts-obs/tests/portforward_test.go | 51 +++------- ts-obs/tests/prometheus_test.go | 15 ++- ts-obs/tests/timescale_test.go | 65 ++++++------- 6 files changed, 199 insertions(+), 182 deletions(-) diff --git a/ts-obs/tests/grafana_test.go b/ts-obs/tests/grafana_test.go index 1e689f8e..5ea5a407 100644 --- a/ts-obs/tests/grafana_test.go +++ b/ts-obs/tests/grafana_test.go @@ -3,21 +3,21 @@ package tests import ( "net" "os/exec" + "strings" "syscall" "testing" "time" ) func testGrafanaPortForward(t testing.TB, port string) { - var portforward *exec.Cmd - - if port == "" { - t.Logf("Running 'ts-obs grafana port-forward'") - portforward = exec.Command("ts-obs", "grafana", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs grafana port-forward -p %v'", port) - portforward = exec.Command("ts-obs", "grafana", "port-forward", "-p", port, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + cmds := []string{"grafana", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if port != "" { + cmds = append(cmds, "-p", port) } + + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + portforward := exec.Command("ts-obs", cmds...) + err := portforward.Start() if err != nil { t.Fatal(err) @@ -37,10 +37,10 @@ func testGrafanaPortForward(t testing.TB, port string) { } func testGrafanaGetPass(t testing.TB) { - var getpass *exec.Cmd + cmds := []string{"grafana", "get-password", "-n", RELEASE_NAME, "--namespace", NAMESPACE} - t.Logf("Running 'ts-obs grafana get-password'") - getpass = exec.Command("ts-obs", "grafana", "get-password", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + getpass := exec.Command("ts-obs", cmds...) out, err := getpass.CombinedOutput() if err != nil { @@ -50,10 +50,10 @@ func testGrafanaGetPass(t testing.TB) { } func testGrafanaChangePass(t testing.TB, newpass string) { - var changepass *exec.Cmd + cmds := []string{"grafana", "change-password", "\"" + newpass + "\"", "-n", RELEASE_NAME, "--namespace", NAMESPACE} - t.Logf("Running 'ts-obs grafana change-password \"%v\"'", newpass) - changepass = exec.Command("ts-obs", "grafana", "change-password", "\""+newpass+"\"", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + changepass := exec.Command("ts-obs", cmds...) out, err := changepass.CombinedOutput() if err != nil { @@ -63,9 +63,7 @@ func testGrafanaChangePass(t testing.TB, newpass string) { } func verifyGrafanaPass(t testing.TB, expectedPass string) { - var getpass *exec.Cmd - - getpass = exec.Command("ts-obs", "grafana", "get-password", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + getpass := exec.Command("ts-obs", "grafana", "get-password", "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := getpass.CombinedOutput() if err != nil { diff --git a/ts-obs/tests/installation_test.go b/ts-obs/tests/installation_test.go index ea306fea..f8c9a7f3 100644 --- a/ts-obs/tests/installation_test.go +++ b/ts-obs/tests/installation_test.go @@ -58,23 +58,23 @@ func testHelmInstall(t testing.TB, name string, filename string) { func testUninstall(t testing.TB, name string, deleteData bool) { var uninstall *exec.Cmd - if deleteData { - if name == "" { - t.Logf("Running 'ts-obs uninstall --delete-data'") - uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) - uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) - } - } else { - if name == "" { - t.Logf("Running 'ts-obs uninstall'") - uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v'", name) - uninstall = exec.Command("ts-obs", "uninstall", "-n", name) - } - } + if deleteData { + if name == "" { + t.Logf("Running 'ts-obs uninstall --delete-data'") + uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) + uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) + } + } else { + if name == "" { + t.Logf("Running 'ts-obs uninstall'") + uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v'", name) + uninstall = exec.Command("ts-obs", "uninstall", "-n", name) + } + } out, err := uninstall.CombinedOutput() if err != nil { @@ -86,23 +86,23 @@ func testUninstall(t testing.TB, name string, deleteData bool) { func testHelmUninstall(t testing.TB, name string, deleteData bool) { var uninstall *exec.Cmd - if deleteData { - if name == "" { - t.Logf("Running 'ts-obs uninstall --delete-data'") - uninstall = exec.Command("ts-obs", "helm", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) - uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) - } - } else { - if name == "" { - t.Logf("Running 'ts-obs uninstall'") - uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v'", name) - uninstall = exec.Command("ts-obs", "uninstall", "-n", name) - } - } + if deleteData { + if name == "" { + t.Logf("Running 'ts-obs uninstall --delete-data'") + uninstall = exec.Command("ts-obs", "helm", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) + uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) + } + } else { + if name == "" { + t.Logf("Running 'ts-obs uninstall'") + uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + } else { + t.Logf("Running 'ts-obs uninstall -n %v'", name) + uninstall = exec.Command("ts-obs", "uninstall", "-n", name) + } + } out, err := uninstall.CombinedOutput() if err != nil { @@ -209,4 +209,6 @@ func TestInstallation(t *testing.T) { t.Fatal(err) } } + + time.Sleep(30 * time.Second) } diff --git a/ts-obs/tests/metrics_test.go b/ts-obs/tests/metrics_test.go index dcade5c4..b3bd09b6 100644 --- a/ts-obs/tests/metrics_test.go +++ b/ts-obs/tests/metrics_test.go @@ -16,11 +16,17 @@ import ( var PASS string -func testRetentionSetDefault(t testing.TB, period int) { - var set *exec.Cmd +func testRetentionSetDefault(t testing.TB, period int, user, dbname string) { + cmds := []string{"metrics", "retention", "set-default", strconv.Itoa(period), "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics retention set-default %d'", period) - set = exec.Command("ts-obs", "metrics", "retention", "set-default", strconv.Itoa(period), "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + set := exec.Command("ts-obs", cmds...) out, err := set.CombinedOutput() if err != nil { @@ -29,11 +35,17 @@ func testRetentionSetDefault(t testing.TB, period int) { } } -func testRetentionSet(t testing.TB, metric string, period int) { - var set *exec.Cmd +func testRetentionSet(t testing.TB, metric string, period int, user, dbname string) { + cmds := []string{"metrics", "retention", "set", metric, strconv.Itoa(period), "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics retention set %v %d'", metric, period) - set = exec.Command("ts-obs", "metrics", "retention", "set", metric, strconv.Itoa(period), "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + set := exec.Command("ts-obs", cmds...) out, err := set.CombinedOutput() if err != nil { @@ -42,11 +54,17 @@ func testRetentionSet(t testing.TB, metric string, period int) { } } -func testRetentionReset(t testing.TB, metric string) { - var reset *exec.Cmd +func testRetentionReset(t testing.TB, metric, user, dbname string) { + cmds := []string{"metrics", "retention", "reset", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics retention reset %v'", metric) - reset = exec.Command("ts-obs", "metrics", "retention", "reset", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + reset := exec.Command("ts-obs", cmds...) out, err := reset.CombinedOutput() if err != nil { @@ -55,11 +73,17 @@ func testRetentionReset(t testing.TB, metric string) { } } -func testRetentionGet(t testing.TB, metric string, expectedDays int64) { - var get *exec.Cmd +func testRetentionGet(t testing.TB, metric string, expectedDays int64, user, dbname string) { + cmds := []string{"metrics", "retention", "get", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics retention get %v'", metric) - get = exec.Command("ts-obs", "metrics", "retention", "get", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + get := exec.Command("ts-obs", cmds...) out, err := get.CombinedOutput() if err != nil { @@ -77,11 +101,17 @@ func testRetentionGet(t testing.TB, metric string, expectedDays int64) { } } -func testChunkIntervalSetDefault(t testing.TB, interval string) { - var set *exec.Cmd +func testChunkIntervalSetDefault(t testing.TB, interval, user, dbname string) { + cmds := []string{"metrics", "chunk-interval", "set-default", interval, "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics chunk-interval set-default %v'", interval) - set = exec.Command("ts-obs", "metrics", "chunk-interval", "set-default", interval, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + set := exec.Command("ts-obs", cmds...) out, err := set.CombinedOutput() if err != nil { @@ -90,11 +120,17 @@ func testChunkIntervalSetDefault(t testing.TB, interval string) { } } -func testChunkIntervalSet(t testing.TB, metric, interval string) { - var set *exec.Cmd +func testChunkIntervalSet(t testing.TB, metric, interval, user, dbname string) { + cmds := []string{"metrics", "chunk-interval", "set", metric, interval, "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics chunk-interval set %v %v'", metric, interval) - set = exec.Command("ts-obs", "metrics", "chunk-interval", "set", metric, interval, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + set := exec.Command("ts-obs", cmds...) out, err := set.CombinedOutput() if err != nil { @@ -103,11 +139,17 @@ func testChunkIntervalSet(t testing.TB, metric, interval string) { } } -func testChunkIntervalReset(t testing.TB, metric string) { - var reset *exec.Cmd +func testChunkIntervalReset(t testing.TB, metric, user, dbname string) { + cmds := []string{"metrics", "chunk-interval", "reset", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics chunk-interval reset %v'", metric) - reset = exec.Command("ts-obs", "metrics", "chunk-interval", "reset", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + reset := exec.Command("ts-obs", cmds...) out, err := reset.CombinedOutput() if err != nil { @@ -116,11 +158,17 @@ func testChunkIntervalReset(t testing.TB, metric string) { } } -func testChunkIntervalGet(t testing.TB, metric string, expectedDuration time.Duration) { - var get *exec.Cmd +func testChunkIntervalGet(t testing.TB, metric string, expectedDuration time.Duration, user, dbname string) { + cmds := []string{"metrics", "chunk-interval", "get", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) + } - t.Logf("Running 'ts-obs metrics chunk-interval get %v'", metric) - get = exec.Command("ts-obs", "metrics", "chunk-interval", "get", metric, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + get := exec.Command("ts-obs", cmds...) out, err := get.CombinedOutput() if err != nil { @@ -190,7 +238,7 @@ func verifyChunkInterval(t testing.TB, tableName string, expectedDuration time.D func TestMetrics(t *testing.T) { if testing.Short() { - t.Skip("Skipping metrics tests") + //t.Skip("Skipping metrics tests") } secret, err := cmd.KubeGetSecret(NAMESPACE, RELEASE_NAME+"-timescaledb-passwords") @@ -217,53 +265,53 @@ func TestMetrics(t *testing.T) { } os.Stdout = stdout - testRetentionSetDefault(t, 10) + testRetentionSetDefault(t, 10, "", "") verifyRetentionPeriod(t, "container_last_seen", 10*24*time.Hour) - testRetentionReset(t, "up") + testRetentionReset(t, "up", "", "") verifyRetentionPeriod(t, "up", 10*24*time.Hour) - testRetentionSet(t, "node_load15", 9) + testRetentionSet(t, "node_load15", 9, "", "postgres") verifyRetentionPeriod(t, "node_load15", 9*24*time.Hour) - testRetentionSet(t, "up", 2) + testRetentionSet(t, "up", 2, "postgres", "") verifyRetentionPeriod(t, "up", 2*24*time.Hour) - testRetentionSet(t, "kube_pod_status_phase", 32) + testRetentionSet(t, "kube_pod_status_phase", 32, "", "postgres") verifyRetentionPeriod(t, "kube_pod_status_phase", 32*24*time.Hour) - testRetentionReset(t, "up") + testRetentionReset(t, "up", "", "") verifyRetentionPeriod(t, "up", 10*24*time.Hour) - testRetentionReset(t, "node_load5") + testRetentionReset(t, "node_load5", "", "") verifyRetentionPeriod(t, "node_load15", 10*24*time.Hour) - testRetentionSetDefault(t, 11) + testRetentionSetDefault(t, 11, "", "postgres") verifyRetentionPeriod(t, "go_info", 11*24*time.Hour) - testRetentionGet(t, "node_load5", 11) + testRetentionGet(t, "node_load5", 11, "", "") - testChunkIntervalSet(t, "container_last_seen", "23m45s") + testChunkIntervalSet(t, "container_last_seen", "23m45s", "", "") verifyChunkInterval(t, "container_last_seen", (23*60+45)*time.Second) - testChunkIntervalSetDefault(t, "62m3s") + testChunkIntervalSetDefault(t, "62m3s", "", "") verifyChunkInterval(t, "node_load15", (62*60+3)*time.Second) - testChunkIntervalSet(t, "go_info", "3403s") + testChunkIntervalSet(t, "go_info", "3403s", "postgres", "postgres") verifyChunkInterval(t, "go_info", 3403*time.Second) - testChunkIntervalGet(t, "node_load15", (62*60+3)*time.Second) + testChunkIntervalGet(t, "node_load15", (62*60+3)*time.Second, "", "") - testChunkIntervalReset(t, "go_info") + testChunkIntervalReset(t, "go_info", "", "postgres") verifyChunkInterval(t, "go_info", (62*60+3)*time.Second) - testChunkIntervalSet(t, "kube_job_info", "8h24m") + testChunkIntervalSet(t, "kube_job_info", "8h24m", "", "") verifyChunkInterval(t, "kube_job_info", (8*60+24)*time.Minute) - testChunkIntervalSetDefault(t, "23h") + testChunkIntervalSetDefault(t, "23h", "", "postgres") verifyChunkInterval(t, "kube_pod_status_phase", (23)*time.Hour) - testChunkIntervalReset(t, "go_threads") + testChunkIntervalReset(t, "go_threads", "", "") verifyChunkInterval(t, "go_threads", (23)*time.Hour) } diff --git a/ts-obs/tests/portforward_test.go b/ts-obs/tests/portforward_test.go index 74e4a009..71e8fe94 100644 --- a/ts-obs/tests/portforward_test.go +++ b/ts-obs/tests/portforward_test.go @@ -3,51 +3,26 @@ package tests import ( "net" "os/exec" + "strings" "syscall" "testing" "time" ) func testpf(t testing.TB, timescale, grafana, prometheus string) { - var portforward *exec.Cmd - - if timescale == "" { - if grafana == "" { - if prometheus == "" { - t.Logf("Running 'ts-obs port-forward'") - portforward = exec.Command("ts-obs", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs port-forward -p %v'", prometheus) - portforward = exec.Command("ts-obs", "port-forward", "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } - } else { - if prometheus == "" { - t.Logf("Running 'ts-obs port-forward -g %v'", grafana) - portforward = exec.Command("ts-obs", "port-forward", "-g", grafana, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs port-forward -g %v -p %v'", grafana, prometheus) - portforward = exec.Command("ts-obs", "port-forward", "-g", grafana, "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } - } - } else { - if grafana == "" { - if prometheus == "" { - t.Logf("Running 'ts-obs port-forward -t %v'", timescale) - portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs port-forward -t %v -p %v'", timescale, prometheus) - portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } - } else { - if prometheus == "" { - t.Logf("Running 'ts-obs port-forward -t %v -g %v'", timescale, grafana) - portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-g", grafana, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs port-forward -t %v -g %v -p %v'", timescale, grafana, prometheus) - portforward = exec.Command("ts-obs", "port-forward", "-t", timescale, "-g", grafana, "-p", prometheus, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } - } + cmds := []string{"port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if timescale != "" { + cmds = append(cmds, "-t", timescale) + } + if grafana != "" { + cmds = append(cmds, "-g", grafana) } + if prometheus != "" { + cmds = append(cmds, "-p", prometheus) + } + + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + portforward := exec.Command("ts-obs", cmds...) err := portforward.Start() if err != nil { diff --git a/ts-obs/tests/prometheus_test.go b/ts-obs/tests/prometheus_test.go index bf7e4161..3673c93c 100644 --- a/ts-obs/tests/prometheus_test.go +++ b/ts-obs/tests/prometheus_test.go @@ -3,22 +3,21 @@ package tests import ( "net" "os/exec" + "strings" "syscall" "testing" "time" ) func testPrometheusPortForward(t testing.TB, port string) { - var portforward *exec.Cmd - - if port == "" { - t.Logf("Running 'ts-obs prometheus port-forward'") - portforward = exec.Command("ts-obs", "prometheus", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs prometheus port-forward -p %v'", port) - portforward = exec.Command("ts-obs", "prometheus", "port-forward", "-p", port, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + cmds := []string{"prometheus", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if port != "" { + cmds = append(cmds, "-p", port) } + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + portforward := exec.Command("ts-obs", cmds...) + err := portforward.Start() if err != nil { t.Fatal(err) diff --git a/ts-obs/tests/timescale_test.go b/ts-obs/tests/timescale_test.go index f945cfa6..472dadaf 100644 --- a/ts-obs/tests/timescale_test.go +++ b/ts-obs/tests/timescale_test.go @@ -3,22 +3,21 @@ package tests import ( "net" "os/exec" + "strings" "syscall" "testing" "time" ) func testTimescaleGetPassword(t testing.TB, user string) { - var getpass *exec.Cmd - - if user == "" { - t.Logf("Running 'ts-obs timescaledb get-password'") - getpass = exec.Command("ts-obs", "timescaledb", "get-password", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs timescaledb get-password -U %v'", user) - getpass = exec.Command("ts-obs", "timescaledb", "get-password", "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + cmds := []string{"timescaledb", "get-password", "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) } + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + getpass := exec.Command("ts-obs", cmds...) + out, err := getpass.CombinedOutput() if err != nil { t.Logf(string(out)) @@ -26,28 +25,27 @@ func testTimescaleGetPassword(t testing.TB, user string) { } } -func testTimescaleChangePassword(t testing.TB, user string, newpass string) { - var changepass *exec.Cmd - - if user == "" { - t.Logf("Running 'ts-obs timescaledb change-password %v'", newpass) - changepass = exec.Command("ts-obs", "timescaledb", "change-password", newpass, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs timescaledb change-password -U %v'", user) - changepass = exec.Command("ts-obs", "timescaledb", "change-password", newpass, "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) +func testTimescaleChangePassword(t testing.TB, user, dbname, newpass string) { + cmds := []string{"timescaledb", "change-password", newpass, "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if user != "" { + cmds = append(cmds, "-U", user) + } + if dbname != "" { + cmds = append(cmds, "-d", dbname) } + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + changepass := exec.Command("ts-obs", cmds...) + out, err := changepass.CombinedOutput() if err != nil { t.Logf(string(out)) t.Fatal(err) - } + } } func verifyTimescalePassword(t testing.TB, user string, expectedPass string) { - var getpass *exec.Cmd - - getpass = exec.Command("ts-obs", "timescaledb", "get-password", "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + getpass := exec.Command("ts-obs", "timescaledb", "get-password", "-U", user, "-n", RELEASE_NAME, "--namespace", NAMESPACE) out, err := getpass.CombinedOutput() if err != nil { @@ -61,16 +59,14 @@ func verifyTimescalePassword(t testing.TB, user string, expectedPass string) { } func testTimescalePortForward(t testing.TB, port string) { - var portforward *exec.Cmd - - if port == "" { - t.Logf("Running 'ts-obs timescaledb port-forward'") - portforward = exec.Command("ts-obs", "timescaledb", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs timescaledb port-forward -p %v'", port) - portforward = exec.Command("ts-obs", "timescaledb", "port-forward", "-p", port, "-n", RELEASE_NAME, "--namespace", NAMESPACE) + cmds := []string{"timescaledb", "port-forward", "-n", RELEASE_NAME, "--namespace", NAMESPACE} + if port != "" { + cmds = append(cmds, "-p", port) } + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + portforward := exec.Command("ts-obs", cmds...) + err := portforward.Start() if err != nil { t.Fatal(err) @@ -87,7 +83,6 @@ func testTimescalePortForward(t testing.TB, port string) { } portforward.Process.Signal(syscall.SIGINT) - } func testTimescaleConnect(t testing.TB, master bool, user string) { @@ -119,15 +114,15 @@ func testTimescaleConnect(t testing.TB, master bool, user string) { func TestTimescale(t *testing.T) { if testing.Short() { - //t.Skip("Skipping TimescaleDB tests") + t.Skip("Skipping TimescaleDB tests") } testTimescaleGetPassword(t, "") - testTimescaleChangePassword(t, "", "battery") - verifyTimescalePassword(t, "postgres", "battery") + testTimescaleChangePassword(t, "", "postgres", "battery") + verifyTimescalePassword(t, "postgres", "battery") testTimescaleGetPassword(t, "admin") - testTimescaleChangePassword(t, "admin", "chips") - verifyTimescalePassword(t, "admin", "chips") + testTimescaleChangePassword(t, "admin", "", "chips") + verifyTimescalePassword(t, "admin", "chips") testTimescalePortForward(t, "") testTimescalePortForward(t, "5432") From 988845e0320db7205402c2d87524d4fa1361552f Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 6 Jul 2020 15:24:26 -0700 Subject: [PATCH 10/16] Update tests for timescaledb change-password --- install.sh => install-cli.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename install.sh => install-cli.sh (100%) diff --git a/install.sh b/install-cli.sh similarity index 100% rename from install.sh rename to install-cli.sh From 898d29dab695e435b450a7de6a96ac97ca4ac283 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Wed, 8 Jul 2020 10:48:20 -0700 Subject: [PATCH 11/16] Update install test and concurrent test --- ts-obs/go.sum | 1 + ts-obs/tests/concurrent_test.go | 85 ++++++++++++ ts-obs/tests/installation_test.go | 212 ++++++++++++++++-------------- ts-obs/tests/main_test.go | 4 +- ts-obs/tests/metrics_test.go | 2 +- 5 files changed, 201 insertions(+), 103 deletions(-) create mode 100644 ts-obs/tests/concurrent_test.go diff --git a/ts-obs/go.sum b/ts-obs/go.sum index 5eae7ffc..fe40a253 100644 --- a/ts-obs/go.sum +++ b/ts-obs/go.sum @@ -137,6 +137,7 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= diff --git a/ts-obs/tests/concurrent_test.go b/ts-obs/tests/concurrent_test.go new file mode 100644 index 00000000..75440c6f --- /dev/null +++ b/ts-obs/tests/concurrent_test.go @@ -0,0 +1,85 @@ +package tests + +import ( + "testing" + "time" + + "ts-obs/cmd" +) + +func changeRelease(t testing.TB) { + if RELEASE_NAME == "test1" { + RELEASE_NAME = "test2" + } else if RELEASE_NAME == "test2" { + RELEASE_NAME = "test1" + } else { + t.Fatalf("Unexpected release name %v", RELEASE_NAME) + } + + if NAMESPACE == "test1" { + NAMESPACE = "test2" + } else if NAMESPACE == "test2" { + NAMESPACE = "test1" + } else { + t.Fatalf("Unexpected namespace %v", RELEASE_NAME) + } +} + +func TestConcurrent(t *testing.T) { + if testing.Short() { + t.Skip("Skipping concurrent tests") + } + + testUninstall(t, "", "", false) + + oldname := RELEASE_NAME + oldspace := NAMESPACE + + RELEASE_NAME = "test1" + NAMESPACE = "test1" + + testInstall(t, "", "", "") + changeRelease(t) + testInstall(t, "", "", "") + + TestGrafana(t) + TestMetrics(t) + TestPortForward(t) + TestPrometheus(t) + TestTimescale(t) + + changeRelease(t) + TestGrafana(t) + TestMetrics(t) + TestPortForward(t) + TestPrometheus(t) + TestTimescale(t) + + testUninstall(t, "", "", false) + changeRelease(t) + testUninstall(t, "", "", false) + + RELEASE_NAME = oldname + NAMESPACE = oldspace + + testInstall(t, "", "", "") + + time.Sleep(10 * time.Second) + + t.Logf("Waiting for pods to initialize...") + pods, err := cmd.KubeGetAllPods(NAMESPACE, RELEASE_NAME) + if err != nil { + t.Logf("Error getting all pods") + t.Fatal(err) + } + + for _, pod := range pods { + err = cmd.KubeWaitOnPod(NAMESPACE, pod.Name) + if err != nil { + t.Logf("Error while waiting on pod") + t.Fatal(err) + } + } + + time.Sleep(30 * time.Second) +} diff --git a/ts-obs/tests/installation_test.go b/ts-obs/tests/installation_test.go index f8c9a7f3..890d8d89 100644 --- a/ts-obs/tests/installation_test.go +++ b/ts-obs/tests/installation_test.go @@ -2,27 +2,31 @@ package tests import ( "os/exec" + "strings" "testing" "time" "ts-obs/cmd" ) -func testInstall(t testing.TB, name string, filename string) { - var install *exec.Cmd - if name == "" && filename == "" { - t.Logf("Running 'ts-obs install'") - install = exec.Command("ts-obs", "install", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else if name == "" { - t.Logf("Running 'ts-obs install -f %v'", filename) - install = exec.Command("ts-obs", "install", "-f", filename, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else if filename == "" { - t.Logf("Running 'ts-obs install -n %v'", name) - install = exec.Command("ts-obs", "install", "-n", name) +func testInstall(t testing.TB, name, namespace, filename string) { + cmds := []string{"install"} + if name != "" { + cmds = append(cmds, "-n", name) } else { - t.Logf("Running 'ts-obs install -n %v -f %v'", name, filename) - install = exec.Command("ts-obs", "install", "-n", name, "-f", filename) + cmds = append(cmds, "-n", RELEASE_NAME) } + if namespace != "" { + cmds = append(cmds, "--namespace", namespace) + } else { + cmds = append(cmds, "--namespace", NAMESPACE) + } + if filename != "" { + cmds = append(cmds, "-f", filename) + } + + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + install := exec.Command("ts-obs", cmds...) out, err := install.CombinedOutput() if err != nil { @@ -31,22 +35,24 @@ func testInstall(t testing.TB, name string, filename string) { } } -func testHelmInstall(t testing.TB, name string, filename string) { - var install *exec.Cmd - - if name == "" && filename == "" { - t.Logf("Running 'ts-obs helm install'") - install = exec.Command("ts-obs", "helm", "install", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else if name == "" { - t.Logf("Running 'ts-obs helm install -f %v'", filename) - install = exec.Command("ts-obs", "helm", "install", "-f", filename, "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else if filename == "" { - t.Logf("Running 'ts-obs helm install -n %v'", name) - install = exec.Command("ts-obs", "helm", "install", "-n", name) +func testHelmInstall(t testing.TB, name, namespace, filename string) { + cmds := []string{"helm", "install"} + if name != "" { + cmds = append(cmds, "-n", name) } else { - t.Logf("Running 'ts-obs helm install -n %v -f %v'", name, filename) - install = exec.Command("ts-obs", "helm", "install", "-n", name, "-f", filename) + cmds = append(cmds, "-n", RELEASE_NAME) } + if namespace != "" { + cmds = append(cmds, "--namespace", namespace) + } else { + cmds = append(cmds, "--namespace", NAMESPACE) + } + if filename != "" { + cmds = append(cmds, "-f", filename) + } + + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + install := exec.Command("ts-obs", cmds...) out, err := install.CombinedOutput() if err != nil { @@ -55,27 +61,25 @@ func testHelmInstall(t testing.TB, name string, filename string) { } } -func testUninstall(t testing.TB, name string, deleteData bool) { - var uninstall *exec.Cmd - - if deleteData { - if name == "" { - t.Logf("Running 'ts-obs uninstall --delete-data'") - uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) - uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) - } +func testUninstall(t testing.TB, name, namespace string, deleteData bool) { + cmds := []string{"uninstall"} + if name != "" { + cmds = append(cmds, "-n", name) } else { - if name == "" { - t.Logf("Running 'ts-obs uninstall'") - uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v'", name) - uninstall = exec.Command("ts-obs", "uninstall", "-n", name) - } + cmds = append(cmds, "-n", RELEASE_NAME) + } + if namespace != "" { + cmds = append(cmds, "--namespace", namespace) + } else { + cmds = append(cmds, "--namespace", NAMESPACE) + } + if deleteData { + cmds = append(cmds, "--delete-data") } + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + uninstall := exec.Command("ts-obs", cmds...) + out, err := uninstall.CombinedOutput() if err != nil { t.Logf(string(out)) @@ -83,26 +87,24 @@ func testUninstall(t testing.TB, name string, deleteData bool) { } } -func testHelmUninstall(t testing.TB, name string, deleteData bool) { - var uninstall *exec.Cmd - - if deleteData { - if name == "" { - t.Logf("Running 'ts-obs uninstall --delete-data'") - uninstall = exec.Command("ts-obs", "helm", "uninstall", "--delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v --delete-data'", name) - uninstall = exec.Command("ts-obs", "uninstall", "--delete-data", "-n", name) - } +func testHelmUninstall(t testing.TB, name, namespace string, deleteData bool) { + cmds := []string{"helm", "uninstall"} + if name != "" { + cmds = append(cmds, "-n", name) } else { - if name == "" { - t.Logf("Running 'ts-obs uninstall'") - uninstall = exec.Command("ts-obs", "uninstall", "-n", RELEASE_NAME, "--namespace", NAMESPACE) - } else { - t.Logf("Running 'ts-obs uninstall -n %v'", name) - uninstall = exec.Command("ts-obs", "uninstall", "-n", name) - } + cmds = append(cmds, "-n", RELEASE_NAME) + } + if namespace != "" { + cmds = append(cmds, "--namespace", namespace) + } else { + cmds = append(cmds, "--namespace", NAMESPACE) } + if deleteData { + cmds = append(cmds, "--delete-data") + } + + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + uninstall := exec.Command("ts-obs", cmds...) out, err := uninstall.CombinedOutput() if err != nil { @@ -120,11 +122,21 @@ func testHelmUninstall(t testing.TB, name string, deleteData bool) { } -func testHelmDeleteData(t testing.TB) { - var deletedata *exec.Cmd +func testHelmDeleteData(t testing.TB, name, namespace string) { + cmds := []string{"helm", "delete-data"} + if name != "" { + cmds = append(cmds, "-n", name) + } else { + cmds = append(cmds, "-n", RELEASE_NAME) + } + if namespace != "" { + cmds = append(cmds, "--namespace", namespace) + } else { + cmds = append(cmds, "--namespace", NAMESPACE) + } - t.Logf("Running 'ts-obs helm delete-data'") - deletedata = exec.Command("ts-obs", "helm", "delete-data", "-n", RELEASE_NAME, "--namespace", NAMESPACE) + t.Logf("Running '%v'", "ts-obs "+strings.Join(cmds, " ")) + deletedata := exec.Command("ts-obs", cmds...) out, err := deletedata.CombinedOutput() if err != nil { @@ -161,49 +173,49 @@ func TestInstallation(t *testing.T) { testHelmGetYaml(t) - testUninstall(t, "", false) - testInstall(t, "", "") - testHelmUninstall(t, "", true) - testHelmInstall(t, "", "") - testUninstall(t, "", false) - testHelmDeleteData(t) - testHelmInstall(t, "", "") - testHelmUninstall(t, "", false) - testInstall(t, "", "") - testUninstall(t, "", false) - testHelmDeleteData(t) - - testInstall(t, "sd-fo9ods-oe93", "") - testHelmUninstall(t, "sd-fo9ods-oe93", false) - testHelmInstall(t, "x98-2cn4-ru2-9cn48u", "") - testUninstall(t, "x98-2cn4-ru2-9cn48u", false) - testHelmInstall(t, "as-dn-in234i-n", "") - testHelmUninstall(t, "as-dn-in234i-n", false) - testInstall(t, "we-3oiwo3o-s-d", "") - testUninstall(t, "we-3oiwo3o-s-d", false) - - testInstall(t, "f1", "./testdata/f1.yml") - testHelmUninstall(t, "f1", false) - testHelmInstall(t, "f2", "./testdata/f2.yml") - testUninstall(t, "f2", false) - testHelmInstall(t, "f3", "./testdata/f3.yml") - testHelmUninstall(t, "f3", false) - testInstall(t, "f4", "./testdata/f4.yml") - testUninstall(t, "f4", false) - - testInstall(t, "", "") + testUninstall(t, "", "", false) + testInstall(t, "", "", "") + testHelmUninstall(t, "", "", true) + testHelmInstall(t, "", "", "") + testUninstall(t, "", "", false) + testHelmDeleteData(t, "", "") + testHelmInstall(t, "", "", "") + testHelmUninstall(t, "", "", false) + testInstall(t, "", "", "") + testUninstall(t, "", "", false) + testHelmDeleteData(t, "", "") + + testInstall(t, "sd-fo9ods-oe93", "", "") + testHelmUninstall(t, "sd-fo9ods-oe93", "", false) + testHelmInstall(t, "x98-2cn4-ru2-9cn48u", "nondef", "") + testUninstall(t, "x98-2cn4-ru2-9cn48u", "nondef", false) + testHelmInstall(t, "as-dn-in234i-n", "", "") + testHelmUninstall(t, "as-dn-in234i-n", "", false) + testInstall(t, "we-3oiwo3o-s-d", "", "") + testUninstall(t, "we-3oiwo3o-s-d", "", false) + + testInstall(t, "f1", "", "./testdata/f1.yml") + testHelmUninstall(t, "f1", "", false) + testHelmInstall(t, "f2", "", "./testdata/f2.yml") + testUninstall(t, "f2", "", false) + testHelmInstall(t, "f3", "nas", "./testdata/f3.yml") + testHelmUninstall(t, "f3", "nas", false) + testInstall(t, "f4", "", "./testdata/f4.yml") + testUninstall(t, "f4", "", false) + + testInstall(t, "", "", "") time.Sleep(10 * time.Second) t.Logf("Waiting for pods to initialize...") - pods, err := cmd.KubeGetAllPods("ts-obs", "default") + pods, err := cmd.KubeGetAllPods(NAMESPACE, RELEASE_NAME) if err != nil { t.Logf("Error getting all pods") t.Fatal(err) } for _, pod := range pods { - err = cmd.KubeWaitOnPod("default", pod.Name) + err = cmd.KubeWaitOnPod(NAMESPACE, pod.Name) if err != nil { t.Logf("Error while waiting on pod") t.Fatal(err) diff --git a/ts-obs/tests/main_test.go b/ts-obs/tests/main_test.go index 5f34a8f7..aa2d3a1e 100644 --- a/ts-obs/tests/main_test.go +++ b/ts-obs/tests/main_test.go @@ -9,8 +9,8 @@ import ( "time" ) -const RELEASE_NAME = "gg" -const NAMESPACE = "ns" +var RELEASE_NAME = "gg" +var NAMESPACE = "ns" func startKube() { var err error diff --git a/ts-obs/tests/metrics_test.go b/ts-obs/tests/metrics_test.go index b3bd09b6..fa5785ff 100644 --- a/ts-obs/tests/metrics_test.go +++ b/ts-obs/tests/metrics_test.go @@ -238,7 +238,7 @@ func verifyChunkInterval(t testing.TB, tableName string, expectedDuration time.D func TestMetrics(t *testing.T) { if testing.Short() { - //t.Skip("Skipping metrics tests") + t.Skip("Skipping metrics tests") } secret, err := cmd.KubeGetSecret(NAMESPACE, RELEASE_NAME+"-timescaledb-passwords") From 98970ac72e28463e89e445ac1d464d85cee0535f Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Wed, 8 Jul 2020 11:09:08 -0700 Subject: [PATCH 12/16] Create script to generate binaries and checksums --- generate-binaries.sh | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 generate-binaries.sh diff --git a/generate-binaries.sh b/generate-binaries.sh new file mode 100755 index 00000000..c61a4d16 --- /dev/null +++ b/generate-binaries.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +GOPATH=${GOPATH:-"${HOME}/go"} +TS_OBS_VERSION=${TS_OBS_VERSION:-0.1.0-alpha.4.1} + +( + cd ts-obs + + export GOOS=linux + export GOARCH=amd64 + go install + + export GOOS=darwin + export GOARCH=amd64 + go install + + export GOOS=windows + export GOARCH=amd64 + go install +) + +( + cd ${GOPATH}/bin + + mv ts-obs ts-obs-${TS_OBS_VERSION}-linux + openssl dgst -sha256 "ts-obs-${TS_OBS_VERSION}-linux" | sed -e 's/^.* //' > "ts-obs-${TS_OBS_VERSION}-linux.sha256" + + cd ${GOPATH}/bin/darwin_amd64 + + mv ts-obs ts-obs-${TS_OBS_VERSION}-darwin + openssl dgst -sha256 "ts-obs-${TS_OBS_VERSION}-darwin" | sed -e 's/^.* //' > "ts-obs-${TS_OBS_VERSION}-darwin.sha256" + + cd ${GOPATH}/bin/windows_amd64 + + mv ts-obs.exe ts-obs-${TS_OBS_VERSION}-windows.exe + openssl dgst -sha256 "ts-obs-${TS_OBS_VERSION}-windows.exe" | sed -e 's/^.* //' > "ts-obs-${TS_OBS_VERSION}-windows.exe.sha256" +) From f57922c8c6517de0cc44feb2b2f504e31e1572e6 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Wed, 8 Jul 2020 11:20:52 -0700 Subject: [PATCH 13/16] Fix show-values variable naming --- ts-obs/cmd/helmShowValues.go | 8 ++++---- ts-obs/tests/installation_test.go | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ts-obs/cmd/helmShowValues.go b/ts-obs/cmd/helmShowValues.go index a7b0ce1d..9c90acc9 100644 --- a/ts-obs/cmd/helmShowValues.go +++ b/ts-obs/cmd/helmShowValues.go @@ -22,15 +22,15 @@ func init() { func helmShowValues(cmd *cobra.Command, args []string) error { var err error - var getyaml *exec.Cmd + var showvalues *exec.Cmd if DEVEL { - getyaml = exec.Command("helm", "show", "values", "timescale/timescale-observability", "--devel") + showvalues = exec.Command("helm", "show", "values", "timescale/timescale-observability", "--devel") } else { - getyaml = exec.Command("helm", "show", "values", "timescale/timescale-observability") + showvalues = exec.Command("helm", "show", "values", "timescale/timescale-observability") } var out []byte - out, err = getyaml.CombinedOutput() + out, err = showvalues.CombinedOutput() if err != nil { return fmt.Errorf("could not get Helm values: %w", err) } diff --git a/ts-obs/tests/installation_test.go b/ts-obs/tests/installation_test.go index 890d8d89..f3c60302 100644 --- a/ts-obs/tests/installation_test.go +++ b/ts-obs/tests/installation_test.go @@ -153,13 +153,13 @@ func testHelmDeleteData(t testing.TB, name, namespace string) { } } -func testHelmGetYaml(t testing.TB) { - var getyaml *exec.Cmd +func testHelmShowValues(t testing.TB) { + var showvalues *exec.Cmd - t.Logf("Running 'ts-obs helm get-yaml'") - getyaml = exec.Command("ts-obs", "helm", "get-yaml") + t.Logf("Running 'ts-obs helm show-values'") + showvalues = exec.Command("ts-obs", "helm", "show-values") - out, err := getyaml.CombinedOutput() + out, err := showvalues.CombinedOutput() if err != nil { t.Logf(string(out)) t.Fatal(err) @@ -171,7 +171,7 @@ func TestInstallation(t *testing.T) { t.Skip("Skipping installation tests") } - testHelmGetYaml(t) + testHelmShowValues(t) testUninstall(t, "", "", false) testInstall(t, "", "", "") From 970f8e94e6372bf5f1eb1c31acfd69d772a76da3 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Thu, 9 Jul 2020 08:52:47 -0700 Subject: [PATCH 14/16] Use named template for release name and namespace --- chart/templates/NOTES.txt | 48 ++++++------------------------------ chart/templates/_helpers.tpl | 10 ++++++++ 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt index a2f36a41..93371a01 100644 --- a/chart/templates/NOTES.txt +++ b/chart/templates/NOTES.txt @@ -42,11 +42,7 @@ Get the Prometheus server URL by running these commands in the same shell: echo http://$SERVICE_IP:{{ .Values.prometheus.server.service.servicePort }} {{- else if contains "ClusterIP" .Values.prometheus.server.service.type }} {{- if .Values.cli }} - ts-obs prometheus port-forward -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} prometheus port-forward {{- else }} export SERVICE_NAME=$(kubectl get services --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" $promEnv }},component={{ .Values.prometheus.server.name }}" -o jsonpath="{.items[0].metadata.name}") kubectl --namespace {{ .Release.Namespace }} port-forward service/$SERVICE_NAME 9090:{{ .Values.prometheus.server.service.servicePort }} @@ -145,11 +141,7 @@ TimescaleDB can be accessed via port 5432 on the following DNS name from within To get your password for superuser run: {{- if .Values.cli }} - ts-obs timescaledb get-password -U -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} timescaledb get-password -U {{- else }} # superuser password PGPASSWORD_POSTGRES=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "timescaledb.fullname" $tsEnv }}-passwords -o jsonpath="{.data.postgres}" | base64 --decode) @@ -163,11 +155,7 @@ To connect to your database, chose one of these options: 1. Run a postgres pod and connect using the psql cli: {{- if .Values.cli }} - ts-obs timescaledb connect -U -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} timescaledb connect -U {{- else }} # login as superuser kubectl run -i --tty --rm psql --image=postgres \ @@ -185,11 +173,7 @@ To connect to your database, chose one of these options: 2. Directly execute a psql session on the master node {{- if .Values.cli }} - ts-obs timescaledb connect -m -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} timescaledb connect -m {{- else }} MASTERPOD="$(kubectl get pod -o name --namespace {{ .Release.Namespace }} -l release={{ .Release.Name }},role=master)" kubectl exec -i --tty --namespace {{ .Release.Namespace }} ${MASTERPOD} -- psql -U postgres @@ -208,11 +192,7 @@ To connect to your database, chose one of these options: You can access grafana locally by executing: {{- if .Values.cli }} - ts-obs grafana port-forward -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} grafana port-forward {{- else }} kubectl --namespace {{ .Release.Namespace }} port-forward service/{{ template "grafana.fullname" $grafanaEnv }} 8080:{{ .Values.grafana.service.port }} {{- end }} @@ -223,11 +203,7 @@ To connect to your database, chose one of these options: 2. Get your '{{ .Values.grafana.adminUser }}' user password by running: {{- if .Values.cli }} - ts-obs grafana get-password -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} grafana get-password {{- else }} kubectl get secret --namespace {{ template "grafana.namespace" $grafanaEnv }} {{ template "grafana.fullname" $grafanaEnv }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo {{- end }} @@ -240,11 +216,7 @@ WARNING! Persistence is disabled!!! You will lose your data when 2. The '{{ .Values.grafana.adminUser }}' user password can be retrieved by: {{- if .Values.cli }} - ts-obs grafana get-password -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} grafana get-password {{- else }} kubectl get secret --namespace {{ template "grafana.namespace" $grafanaEnv }} {{ template "grafana.fullname" $grafanaEnv }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo {{- end }} @@ -259,11 +231,7 @@ WARNING! Persistence is disabled!!! You will lose your data when 3. You can reset the admin user password with grafana-cli from inside the pod. {{- if .Values.cli }} - ts-obs grafana change-password -{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} -{{- end -}} -{{- if ne .Release.Namespace "default" }} --namespace {{ template "grafana.namespace" $grafanaEnv }} -{{- end -}} + ts-obs {{- template "timescale-observability.cliOptions" . }} grafana change-password {{- else }} First attach yourself to the grafana container: GRAFANAPOD="$(kubectl get pod -o name --namespace {{ .Release.Namespace }} -l app.kubernetes.io/name=grafana)" diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl index 01839333..9efbdd20 100644 --- a/chart/templates/_helpers.tpl +++ b/chart/templates/_helpers.tpl @@ -61,3 +61,13 @@ Create the name of the service account to use {{ default "default" .Values.serviceAccount.name }} {{- end -}} {{- end -}} + +{{/* +CLI release name and namespace +*/}} +{{- define "timescale-observability.cliOptions" -}} +{{- if ne .Release.Name "ts-obs" }} -n {{ .Release.Name }} +{{- end -}} +{{- if ne .Release.Namespace "default" }} --namespace {{ .Release.Namespace }} +{{- end -}} +{{- end -}} From dafbdccbf6e0ede733bbb9f4fff694bc088d6b12 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Thu, 9 Jul 2020 11:33:42 -0700 Subject: [PATCH 15/16] Add goreleaser --- generate-binaries.sh | 37 ------------------------------------- ts-obs/.goreleaser.yml | 28 ++++++++++++++++++++++++++++ ts-obs/go.sum | 23 +++++++++++++++++++---- 3 files changed, 47 insertions(+), 41 deletions(-) delete mode 100755 generate-binaries.sh create mode 100644 ts-obs/.goreleaser.yml diff --git a/generate-binaries.sh b/generate-binaries.sh deleted file mode 100755 index c61a4d16..00000000 --- a/generate-binaries.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh - -GOPATH=${GOPATH:-"${HOME}/go"} -TS_OBS_VERSION=${TS_OBS_VERSION:-0.1.0-alpha.4.1} - -( - cd ts-obs - - export GOOS=linux - export GOARCH=amd64 - go install - - export GOOS=darwin - export GOARCH=amd64 - go install - - export GOOS=windows - export GOARCH=amd64 - go install -) - -( - cd ${GOPATH}/bin - - mv ts-obs ts-obs-${TS_OBS_VERSION}-linux - openssl dgst -sha256 "ts-obs-${TS_OBS_VERSION}-linux" | sed -e 's/^.* //' > "ts-obs-${TS_OBS_VERSION}-linux.sha256" - - cd ${GOPATH}/bin/darwin_amd64 - - mv ts-obs ts-obs-${TS_OBS_VERSION}-darwin - openssl dgst -sha256 "ts-obs-${TS_OBS_VERSION}-darwin" | sed -e 's/^.* //' > "ts-obs-${TS_OBS_VERSION}-darwin.sha256" - - cd ${GOPATH}/bin/windows_amd64 - - mv ts-obs.exe ts-obs-${TS_OBS_VERSION}-windows.exe - openssl dgst -sha256 "ts-obs-${TS_OBS_VERSION}-windows.exe" | sed -e 's/^.* //' > "ts-obs-${TS_OBS_VERSION}-windows.exe.sha256" -) diff --git a/ts-obs/.goreleaser.yml b/ts-obs/.goreleaser.yml new file mode 100644 index 00000000..462e7201 --- /dev/null +++ b/ts-obs/.goreleaser.yml @@ -0,0 +1,28 @@ +# This is an example goreleaser.yaml file with some sane defaults. +# Make sure to check the documentation at http://goreleaser.com +before: + hooks: + # You may remove this if you don't use go modules. + - go mod download + # you may remove this if you don't need go generate + - go generate ./... +builds: +- env: + - CGO_ENABLED=0 +archives: +- replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ .Tag }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' diff --git a/ts-obs/go.sum b/ts-obs/go.sum index fe40a253..778fcb2f 100644 --- a/ts-obs/go.sum +++ b/ts-obs/go.sum @@ -18,6 +18,7 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -36,6 +37,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -54,6 +56,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -72,6 +75,7 @@ github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1 github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -91,6 +95,7 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= @@ -106,6 +111,7 @@ github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsC github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -151,6 +157,7 @@ github.com/jackc/pgconn v1.5.0 h1:oFSOilzIZkyg787M1fEmyMfOUUvwj0daqYMfaWwNL4o= github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= @@ -185,6 +192,7 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -193,12 +201,15 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= @@ -244,7 +255,9 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -265,12 +278,15 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -298,6 +314,7 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -438,6 +455,7 @@ google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -454,6 +472,7 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -481,9 +500,6 @@ k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= k8s.io/client-go v0.18.3 h1:QaJzz92tsN67oorwzmoB0a9r9ZVHuD5ryjbCKP0U22k= k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= -k8s.io/client-go v1.5.1 h1:XaX/lo2/u3/pmFau8HN+sB5C/b4dc4Dmm2eXjBH4p1E= -k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= -k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= @@ -491,7 +507,6 @@ k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kubernetes v1.18.3 h1:6qtm8v3z+OwYm2SnsTxYUtGCsIbGBZ/Dh9yER+aNIoI= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= From 6f1e5acb22b16ea7fe0a6078bfce98be26945ac7 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 13 Jul 2020 09:12:02 -0700 Subject: [PATCH 16/16] Remove go generate --- ts-obs/.goreleaser.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/ts-obs/.goreleaser.yml b/ts-obs/.goreleaser.yml index 462e7201..ae0df003 100644 --- a/ts-obs/.goreleaser.yml +++ b/ts-obs/.goreleaser.yml @@ -4,8 +4,6 @@ before: hooks: # You may remove this if you don't use go modules. - go mod download - # you may remove this if you don't need go generate - - go generate ./... builds: - env: - CGO_ENABLED=0