2017-02-15 09:31:00 +01:00
|
|
|
/*
|
2019-04-09 20:39:42 +02:00
|
|
|
* MinIO Cloud Storage, (C) 2017 MinIO, Inc.
|
2017-02-15 09:31:00 +01:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2020-07-23 17:03:31 +02:00
|
|
|
"encoding/hex"
|
2017-02-15 09:31:00 +01:00
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
2020-07-23 17:03:31 +02:00
|
|
|
"net/url"
|
2017-02-15 09:31:00 +01:00
|
|
|
"os"
|
|
|
|
"runtime"
|
2019-03-06 02:28:14 +01:00
|
|
|
"strings"
|
2017-02-15 09:31:00 +01:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2017-10-10 01:12:13 +02:00
|
|
|
func TestMinioVersionToReleaseTime(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
version string
|
|
|
|
isOfficial bool
|
|
|
|
}{
|
|
|
|
{"2017-09-29T19:16:56Z", true},
|
|
|
|
{"RELEASE.2017-09-29T19-16-56Z", false},
|
|
|
|
{"DEVELOPMENT.GOGET", false},
|
|
|
|
}
|
|
|
|
for i, testCase := range testCases {
|
|
|
|
_, err := minioVersionToReleaseTime(testCase.version)
|
|
|
|
if (err == nil) != testCase.isOfficial {
|
|
|
|
t.Errorf("Test %d: Expected %v but got %v",
|
|
|
|
i+1, testCase.isOfficial, err == nil)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestReleaseTagToNFromTimeConversion(t *testing.T) {
|
|
|
|
utcLoc, _ := time.LoadLocation("")
|
|
|
|
testCases := []struct {
|
|
|
|
t time.Time
|
|
|
|
tag string
|
|
|
|
errStr string
|
|
|
|
}{
|
|
|
|
{time.Date(2017, time.September, 29, 19, 16, 56, 0, utcLoc),
|
|
|
|
"RELEASE.2017-09-29T19-16-56Z", ""},
|
|
|
|
{time.Date(2017, time.August, 5, 0, 0, 53, 0, utcLoc),
|
|
|
|
"RELEASE.2017-08-05T00-00-53Z", ""},
|
|
|
|
{time.Now().UTC(), "2017-09-29T19:16:56Z",
|
|
|
|
"2017-09-29T19:16:56Z is not a valid release tag"},
|
|
|
|
{time.Now().UTC(), "DEVELOPMENT.GOGET",
|
|
|
|
"DEVELOPMENT.GOGET is not a valid release tag"},
|
|
|
|
}
|
|
|
|
for i, testCase := range testCases {
|
|
|
|
if testCase.errStr != "" {
|
|
|
|
got := releaseTimeToReleaseTag(testCase.t)
|
|
|
|
if got != testCase.tag && testCase.errStr == "" {
|
|
|
|
t.Errorf("Test %d: Expected %v but got %v", i+1, testCase.tag, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
tagTime, err := releaseTagToReleaseTime(testCase.tag)
|
|
|
|
if err != nil && err.Error() != testCase.errStr {
|
|
|
|
t.Errorf("Test %d: Expected %v but got %v", i+1, testCase.errStr, err.Error())
|
|
|
|
}
|
2020-08-24 21:11:20 +02:00
|
|
|
if err == nil && !tagTime.Equal(testCase.t) {
|
2017-10-10 01:12:13 +02:00
|
|
|
t.Errorf("Test %d: Expected %v but got %v", i+1, testCase.t, tagTime)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-06-09 11:42:12 +02:00
|
|
|
func TestDownloadURL(t *testing.T) {
|
2020-05-22 17:40:59 +02:00
|
|
|
sci := os.Getenv("MINIO_CI_CD")
|
2019-12-18 02:34:17 +01:00
|
|
|
|
2020-05-22 17:40:59 +02:00
|
|
|
os.Setenv("MINIO_CI_CD", "")
|
|
|
|
defer os.Setenv("MINIO_CI_CD", sci)
|
2019-12-18 02:34:17 +01:00
|
|
|
|
2017-10-10 01:12:13 +02:00
|
|
|
minioVersion1 := releaseTimeToReleaseTag(UTCNow())
|
2017-06-09 11:42:12 +02:00
|
|
|
durl := getDownloadURL(minioVersion1)
|
2019-03-06 02:28:14 +01:00
|
|
|
if IsDocker() {
|
|
|
|
if durl != "docker pull minio/minio:"+minioVersion1 {
|
|
|
|
t.Errorf("Expected %s, got %s", "docker pull minio/minio:"+minioVersion1, durl)
|
2017-06-09 11:42:12 +02:00
|
|
|
}
|
|
|
|
} else {
|
2019-03-06 02:28:14 +01:00
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
if durl != minioReleaseURL+"minio.exe" {
|
|
|
|
t.Errorf("Expected %s, got %s", minioReleaseURL+"minio.exe", durl)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if durl != minioReleaseURL+"minio" {
|
|
|
|
t.Errorf("Expected %s, got %s", minioReleaseURL+"minio", durl)
|
|
|
|
}
|
2017-06-09 11:42:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
os.Setenv("KUBERNETES_SERVICE_HOST", "10.11.148.5")
|
|
|
|
durl = getDownloadURL(minioVersion1)
|
|
|
|
if durl != kubernetesDeploymentDoc {
|
|
|
|
t.Errorf("Expected %s, got %s", kubernetesDeploymentDoc, durl)
|
|
|
|
}
|
2017-06-13 02:33:21 +02:00
|
|
|
os.Unsetenv("KUBERNETES_SERVICE_HOST")
|
|
|
|
|
|
|
|
os.Setenv("MESOS_CONTAINER_NAME", "mesos-1111")
|
|
|
|
durl = getDownloadURL(minioVersion1)
|
|
|
|
if durl != mesosDeploymentDoc {
|
|
|
|
t.Errorf("Expected %s, got %s", mesosDeploymentDoc, durl)
|
|
|
|
}
|
|
|
|
os.Unsetenv("MESOS_CONTAINER_NAME")
|
2017-06-09 11:42:12 +02:00
|
|
|
}
|
|
|
|
|
2017-06-13 02:33:21 +02:00
|
|
|
// Tests user agent string.
|
|
|
|
func TestUserAgent(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
envName string
|
|
|
|
envValue string
|
|
|
|
mode string
|
|
|
|
expectedStr string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
envName: "",
|
|
|
|
envValue: "",
|
|
|
|
mode: globalMinioModeFS,
|
2019-04-09 20:39:42 +02:00
|
|
|
expectedStr: fmt.Sprintf("MinIO (%s; %s; %s; source) MinIO/DEVELOPMENT.GOGET MinIO/DEVELOPMENT.GOGET MinIO/DEVELOPMENT.GOGET", runtime.GOOS, runtime.GOARCH, globalMinioModeFS),
|
2017-06-13 02:33:21 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
envName: "MESOS_CONTAINER_NAME",
|
|
|
|
envValue: "mesos-11111",
|
2020-06-13 05:04:01 +02:00
|
|
|
mode: globalMinioModeErasure,
|
|
|
|
expectedStr: fmt.Sprintf("MinIO (%s; %s; %s; %s; source) MinIO/DEVELOPMENT.GOGET MinIO/DEVELOPMENT.GOGET MinIO/DEVELOPMENT.GOGET MinIO/universe-%s", runtime.GOOS, runtime.GOARCH, globalMinioModeErasure, "dcos", "mesos-1111"),
|
2017-06-13 02:33:21 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
envName: "KUBERNETES_SERVICE_HOST",
|
|
|
|
envValue: "10.11.148.5",
|
2020-06-13 05:04:01 +02:00
|
|
|
mode: globalMinioModeErasure,
|
|
|
|
expectedStr: fmt.Sprintf("MinIO (%s; %s; %s; %s; source) MinIO/DEVELOPMENT.GOGET MinIO/DEVELOPMENT.GOGET MinIO/DEVELOPMENT.GOGET", runtime.GOOS, runtime.GOARCH, globalMinioModeErasure, "kubernetes"),
|
2017-06-13 02:33:21 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for i, testCase := range testCases {
|
2020-05-22 17:40:59 +02:00
|
|
|
sci := os.Getenv("MINIO_CI_CD")
|
|
|
|
os.Setenv("MINIO_CI_CD", "")
|
2019-12-18 02:34:17 +01:00
|
|
|
|
2017-06-13 02:33:21 +02:00
|
|
|
os.Setenv(testCase.envName, testCase.envValue)
|
|
|
|
if testCase.envName == "MESOS_CONTAINER_NAME" {
|
|
|
|
os.Setenv("MARATHON_APP_LABEL_DCOS_PACKAGE_VERSION", "mesos-1111")
|
|
|
|
}
|
|
|
|
str := getUserAgent(testCase.mode)
|
2019-03-06 02:28:14 +01:00
|
|
|
expectedStr := testCase.expectedStr
|
|
|
|
if IsDocker() {
|
|
|
|
expectedStr = strings.Replace(expectedStr, "; source", "; docker; source", -1)
|
|
|
|
}
|
|
|
|
if str != expectedStr {
|
|
|
|
t.Errorf("Test %d: expected: %s, got: %s", i+1, expectedStr, str)
|
2017-06-13 02:33:21 +02:00
|
|
|
}
|
2020-05-22 17:40:59 +02:00
|
|
|
os.Setenv("MINIO_CI_CD", sci)
|
2017-06-13 02:33:21 +02:00
|
|
|
os.Unsetenv("MARATHON_APP_LABEL_DCOS_PACKAGE_VERSION")
|
|
|
|
os.Unsetenv(testCase.envName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests if the environment we are running is in DCOS.
|
|
|
|
func TestIsDCOS(t *testing.T) {
|
2020-05-22 17:40:59 +02:00
|
|
|
sci := os.Getenv("MINIO_CI_CD")
|
|
|
|
os.Setenv("MINIO_CI_CD", "")
|
|
|
|
defer os.Setenv("MINIO_CI_CD", sci)
|
2019-12-18 02:34:17 +01:00
|
|
|
|
2017-06-13 02:33:21 +02:00
|
|
|
os.Setenv("MESOS_CONTAINER_NAME", "mesos-1111")
|
|
|
|
dcos := IsDCOS()
|
|
|
|
if !dcos {
|
|
|
|
t.Fatalf("Expected %t, got %t", true, dcos)
|
|
|
|
}
|
|
|
|
|
|
|
|
os.Unsetenv("MESOS_CONTAINER_NAME")
|
|
|
|
dcos = IsDCOS()
|
|
|
|
if dcos {
|
|
|
|
t.Fatalf("Expected %t, got %t", false, dcos)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-09 11:42:12 +02:00
|
|
|
// Tests if the environment we are running is in kubernetes.
|
|
|
|
func TestIsKubernetes(t *testing.T) {
|
2020-05-22 17:40:59 +02:00
|
|
|
sci := os.Getenv("MINIO_CI_CD")
|
|
|
|
os.Setenv("MINIO_CI_CD", "")
|
|
|
|
defer os.Setenv("MINIO_CI_CD", sci)
|
2019-12-18 02:34:17 +01:00
|
|
|
|
2017-06-09 11:42:12 +02:00
|
|
|
os.Setenv("KUBERNETES_SERVICE_HOST", "10.11.148.5")
|
|
|
|
kubernetes := IsKubernetes()
|
|
|
|
if !kubernetes {
|
|
|
|
t.Fatalf("Expected %t, got %t", true, kubernetes)
|
|
|
|
}
|
|
|
|
os.Unsetenv("KUBERNETES_SERVICE_HOST")
|
|
|
|
kubernetes = IsKubernetes()
|
|
|
|
if kubernetes {
|
|
|
|
t.Fatalf("Expected %t, got %t", false, kubernetes)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-24 22:17:28 +02:00
|
|
|
// Tests if the environment we are running is Helm chart.
|
|
|
|
func TestGetHelmVersion(t *testing.T) {
|
|
|
|
createTempFile := func(content string) string {
|
|
|
|
tmpfile, err := ioutil.TempFile("", "helm-testfile-")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Unable to create temporary file. %s", err)
|
|
|
|
}
|
|
|
|
if _, err = tmpfile.Write([]byte(content)); err != nil {
|
|
|
|
t.Fatalf("Unable to create temporary file. %s", err)
|
|
|
|
}
|
|
|
|
if err = tmpfile.Close(); err != nil {
|
|
|
|
t.Fatalf("Unable to create temporary file. %s", err)
|
|
|
|
}
|
|
|
|
return tmpfile.Name()
|
|
|
|
}
|
|
|
|
|
|
|
|
filename := createTempFile(
|
|
|
|
`app="virtuous-rat-minio"
|
|
|
|
chart="minio-0.1.3"
|
|
|
|
heritage="Tiller"
|
|
|
|
pod-template-hash="818089471"`)
|
|
|
|
|
|
|
|
defer os.Remove(filename)
|
|
|
|
|
|
|
|
testCases := []struct {
|
|
|
|
filename string
|
|
|
|
expectedResult string
|
|
|
|
}{
|
|
|
|
{"", ""},
|
|
|
|
{"/tmp/non-existing-file", ""},
|
|
|
|
{filename, "minio-0.1.3"},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
result := getHelmVersion(testCase.filename)
|
|
|
|
|
|
|
|
if testCase.expectedResult != result {
|
|
|
|
t.Fatalf("result: expected: %v, got: %v", testCase.expectedResult, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-15 09:31:00 +01:00
|
|
|
func TestDownloadReleaseData(t *testing.T) {
|
|
|
|
httpServer1 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
defer httpServer1.Close()
|
|
|
|
httpServer2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
fmt.Fprintln(w, "fbe246edbd382902db9a4035df7dce8cb441357d minio.RELEASE.2016-10-07T01-16-39Z")
|
|
|
|
}))
|
|
|
|
defer httpServer2.Close()
|
|
|
|
httpServer3 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
http.Error(w, "", http.StatusNotFound)
|
|
|
|
}))
|
|
|
|
defer httpServer3.Close()
|
|
|
|
|
|
|
|
testCases := []struct {
|
|
|
|
releaseChecksumURL string
|
|
|
|
expectedResult string
|
|
|
|
expectedErr error
|
|
|
|
}{
|
|
|
|
{httpServer1.URL, "", nil},
|
|
|
|
{httpServer2.URL, "fbe246edbd382902db9a4035df7dce8cb441357d minio.RELEASE.2016-10-07T01-16-39Z\n", nil},
|
|
|
|
{httpServer3.URL, "", fmt.Errorf("Error downloading URL " + httpServer3.URL + ". Response: 404 Not Found")},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, testCase := range testCases {
|
2020-07-23 17:03:31 +02:00
|
|
|
u, err := url.Parse(testCase.releaseChecksumURL)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
result, err := downloadReleaseURL(u, 1*time.Second, "")
|
2017-02-15 09:31:00 +01:00
|
|
|
if testCase.expectedErr == nil {
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error: expected: %v, got: %v", testCase.expectedErr, err)
|
|
|
|
}
|
|
|
|
} else if err == nil {
|
|
|
|
t.Fatalf("error: expected: %v, got: %v", testCase.expectedErr, err)
|
|
|
|
} else if testCase.expectedErr.Error() != err.Error() {
|
|
|
|
t.Fatalf("error: expected: %v, got: %v", testCase.expectedErr, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if testCase.expectedResult != result {
|
|
|
|
t.Fatalf("result: expected: %v, got: %v", testCase.expectedResult, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseReleaseData(t *testing.T) {
|
2017-10-10 01:12:13 +02:00
|
|
|
releaseTime, _ := releaseTagToReleaseTime("RELEASE.2016-10-07T01-16-39Z")
|
2017-02-15 09:31:00 +01:00
|
|
|
testCases := []struct {
|
2021-04-08 18:51:11 +02:00
|
|
|
data string
|
|
|
|
expectedResult time.Time
|
|
|
|
expectedSha256hex string
|
|
|
|
expectedReleaseInfo string
|
|
|
|
expectedErr bool
|
2017-02-15 09:31:00 +01:00
|
|
|
}{
|
2021-04-08 18:51:11 +02:00
|
|
|
{"more than two fields", time.Time{}, "", "", true},
|
|
|
|
{"more than", time.Time{}, "", "", true},
|
|
|
|
{"more than.two.fields", time.Time{}, "", "", true},
|
|
|
|
{"more minio.RELEASE.fields", time.Time{}, "", "", true},
|
|
|
|
{"more minio.RELEASE.2016-10-07T01-16-39Z", time.Time{}, "", "", true},
|
|
|
|
{"fbe246edbd382902db9a4035df7dce8cb441357d minio.RELEASE.2016-10-07T01-16-39Z\n", releaseTime, "fbe246edbd382902db9a4035df7dce8cb441357d",
|
|
|
|
"minio.RELEASE.2016-10-07T01-16-39Z", false},
|
|
|
|
{"fbe246edbd382902db9a4035df7dce8cb441357d minio.RELEASE.2016-10-07T01-16-39Z.customer-hotfix\n", releaseTime, "fbe246edbd382902db9a4035df7dce8cb441357d",
|
|
|
|
"minio.RELEASE.2016-10-07T01-16-39Z.customer-hotfix", false},
|
2017-02-15 09:31:00 +01:00
|
|
|
}
|
|
|
|
|
2017-10-10 01:12:13 +02:00
|
|
|
for i, testCase := range testCases {
|
2021-04-08 18:51:11 +02:00
|
|
|
sha256Sum, result, releaseInfo, err := parseReleaseData(testCase.data)
|
2020-07-23 17:03:31 +02:00
|
|
|
if !testCase.expectedErr {
|
2017-02-15 09:31:00 +01:00
|
|
|
if err != nil {
|
2020-07-23 17:03:31 +02:00
|
|
|
t.Errorf("error case %d: expected no error, got: %v", i+1, err)
|
2017-02-15 09:31:00 +01:00
|
|
|
}
|
|
|
|
} else if err == nil {
|
2020-07-23 17:03:31 +02:00
|
|
|
t.Errorf("error case %d: expected error got: %v", i+1, err)
|
2017-02-15 09:31:00 +01:00
|
|
|
}
|
2017-12-15 21:33:42 +01:00
|
|
|
if err == nil {
|
2020-07-23 17:03:31 +02:00
|
|
|
if hex.EncodeToString(sha256Sum) != testCase.expectedSha256hex {
|
|
|
|
t.Errorf("case %d: result: expected: %v, got: %x", i+1, testCase.expectedSha256hex, sha256Sum)
|
2017-12-15 21:33:42 +01:00
|
|
|
}
|
|
|
|
if !testCase.expectedResult.Equal(result) {
|
|
|
|
t.Errorf("case %d: result: expected: %v, got: %v", i+1, testCase.expectedResult, result)
|
|
|
|
}
|
2021-04-08 18:51:11 +02:00
|
|
|
if testCase.expectedReleaseInfo != releaseInfo {
|
|
|
|
t.Errorf("case %d: result: expected: %v, got: %v", i+1, testCase.expectedReleaseInfo, releaseInfo)
|
|
|
|
}
|
2017-02-15 09:31:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|