devtools/jiri-test: improvement to release automation.

Allow users to specify arbitrary snapshot timestamp (version)
to update services to.

Change-Id: I794cd44c9ec080aa31dcc343f649acb886f620ac
diff --git a/jiri-test/internal/test/release.go b/jiri-test/internal/test/release.go
index 375b9cc..cd09ddf 100644
--- a/jiri-test/internal/test/release.go
+++ b/jiri-test/internal/test/release.go
@@ -35,6 +35,7 @@
 	mounttableWaitRetryPeriod = 10 * time.Second
 	propertiesFile            = ".release_candidate_properties"
 	rcTimeFormat              = "2006-01-02.15:04"
+	snapshotTimestampEnvVar   = "SNAPSHOT_TIMESTAMP"
 	snapshotName              = "rc"
 	testsEnvVar               = "TESTS"
 )
@@ -429,11 +430,21 @@
 	}
 	defer u.jirix.NewSeq().RemoveAll(binDir)
 
-	// Make sure we got a release candidate today.
+	// Try to get the snapshot timestamp from SNAPSHOT_TIMESTAMP environment variable.
+	// If it is empty, get the timestamp from the gs://vanadium-release/latest file.
 	rcTimestamp := ""
-	if result, err := invoker(jirix, "Check release candidate status", func() error {
-		rcTimestamp, err = u.checkReleaseCandidateStatus()
-		return err
+	if result, err := invoker(jirix, "Get release candidate snapshot timestamp", func() error {
+		s := u.jirix.NewSeq()
+		if rcTimestamp = os.Getenv(snapshotTimestampEnvVar); rcTimestamp == "" {
+			args := []string{"cat", fmt.Sprintf("%s/latest", bucket)}
+			var out bytes.Buffer
+			if err := s.Capture(&out, nil).Last("gsutil", args...); err != nil {
+				return err
+			}
+			rcTimestamp = out.String()
+		}
+		fmt.Fprintf(jirix.Stdout(), "Timestamp: %s\n", rcTimestamp)
+		return nil
 	}); result != nil || err != nil {
 		return result, err
 	}
diff --git a/jiri-test/internal/test/release_kube.go b/jiri-test/internal/test/release_kube.go
index ed7b53a..d8c84ca 100644
--- a/jiri-test/internal/test/release_kube.go
+++ b/jiri-test/internal/test/release_kube.go
@@ -16,21 +16,20 @@
 )
 
 func vanadiumReleaseKubeStaging(jirix *jiri.X, testName string, opts ...Opt) (_ *test.Result, e error) {
-	manifestPath := os.Getenv("SNAPSHOT_MANIFEST")
+	manifestPath := os.Getenv(manifestEnvVar)
 	if manifestPath == "" {
-		return nil, fmt.Errorf("SNAPSHOT_MANIFEST environment variable not set")
+		return nil, fmt.Errorf("%s environment variable not set", manifestEnvVar)
 	}
-	// Remove all separators to make the version string look cleaner.
-	version := filepath.Base(manifestPath)
-	for _, s := range []string{"-", ".", ":"} {
-		version = strings.Replace(version, s, "", -1)
-	}
-	version = "manifest-" + version
+	version := cleanupVersionString(filepath.Base(manifestPath))
 	return vanadiumReleaseKubeCommon(jirix, testName, "staging", version)
 }
 
 func vanadiumReleaseKubeProduction(jirix *jiri.X, testName string, opts ...Opt) (_ *test.Result, e error) {
-	return vanadiumReleaseKubeCommon(jirix, testName, "production", "")
+	version := ""
+	if snapshotTimestamp := os.Getenv(snapshotTimestampEnvVar); snapshotTimestamp != "" {
+		version = cleanupVersionString(snapshotTimestamp)
+	}
+	return vanadiumReleaseKubeCommon(jirix, testName, "production", version)
 }
 
 func vanadiumReleaseKubeCommon(jirix *jiri.X, testName, updateType, version string) (_ *test.Result, e error) {
@@ -48,12 +47,18 @@
 	vprodupdaterBin := filepath.Join(jirix.Root, "infrastructure", "go", "bin", "vprodupdater")
 	args := []string{
 		fmt.Sprintf("-type=%s", updateType),
-	}
-	if version != "" {
-		args = append(args, fmt.Sprintf("-tag=%s", version))
+		fmt.Sprintf("-tag=%s", version),
 	}
 	if err := s.Capture(jirix.Stdout(), jirix.Stderr()).Last(vprodupdaterBin, args...); err != nil {
 		return nil, newInternalError(err, "Run vprodupdater")
 	}
 	return &test.Result{Status: test.Passed}, nil
 }
+
+func cleanupVersionString(version string) string {
+	// Remove all separators to make the version string look cleaner.
+	for _, s := range []string{"-", ".", ":"} {
+		version = strings.Replace(version, s, "", -1)
+	}
+	return "manifest-" + version
+}