github.com/pachyderm/pachyderm@v1.13.4/src/server/pkg/deploy/cmds/cmds_test.go (about)

     1  package cmds
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/base64"
     6  	"encoding/json"
     7  	"fmt"
     8  	"io"
     9  	"io/ioutil"
    10  	"os"
    11  	"os/exec"
    12  	"strings"
    13  	"testing"
    14  
    15  	"github.com/pachyderm/pachyderm/src/client/pkg/errors"
    16  	"github.com/pachyderm/pachyderm/src/client/pkg/require"
    17  	tu "github.com/pachyderm/pachyderm/src/server/pkg/testutil"
    18  )
    19  
    20  const FakeAWSAccessKeyID = "MADEUPAWSACCESSKEYID"
    21  const FakeAWSSecret = "YIUo7lLijgheOTbSR57DCv8eGVklj8UHUQb9aTDf"
    22  
    23  func TestDashImageExists(t *testing.T) {
    24  	if os.Getenv("RUN_BAD_TESTS") == "" {
    25  		t.Skip("Skipping because RUN_BAD_TESTS was empty")
    26  	}
    27  	c := exec.Command("docker", "pull", fmt.Sprintf("%s:%s", defaultDashImage, defaultDashVersion))
    28  	require.NoError(t, c.Run())
    29  }
    30  
    31  func TestWarnInvalidAmazonCreds(t *testing.T) {
    32  	c := tu.Cmd("pachctl", "deploy", "amazon", "bucket", "us-west-1", "10",
    33  		"--credentials=lol,wat",
    34  		"--dynamic-etcd-nodes=1", "--dry-run")
    35  	var warningMsg bytes.Buffer
    36  	c.Stdin = strings.NewReader(strings.Repeat("y\n", 10))
    37  	c.Stderr = &warningMsg
    38  	c.Stdout = ioutil.Discard
    39  	err := c.Run()
    40  	require.NoError(t, err)
    41  	require.Matches(t, "seems invalid", warningMsg.String())
    42  }
    43  
    44  func TestWarnBadRegion(t *testing.T) {
    45  	c := tu.Cmd("pachctl", "deploy", "amazon", "bucket", "bad-region", "10",
    46  		fmt.Sprintf("--credentials=%s,%s", FakeAWSAccessKeyID, FakeAWSSecret),
    47  		"--dynamic-etcd-nodes=1", "--dry-run")
    48  	var warningMsg bytes.Buffer
    49  	c.Stdin = strings.NewReader(strings.Repeat("y\n", 10))
    50  	c.Stderr = &warningMsg
    51  	c.Stdout = ioutil.Discard
    52  	err := c.Run()
    53  	require.NoError(t, err)
    54  	require.Matches(t, "seems invalid", warningMsg.String())
    55  }
    56  
    57  func TestStripS3Prefix(t *testing.T) {
    58  	c := tu.Cmd("pachctl", "deploy", "amazon", "s3://bucket", "us-west-1", "10",
    59  		fmt.Sprintf("--credentials=%s,%s", FakeAWSAccessKeyID, FakeAWSSecret),
    60  		"--dynamic-etcd-nodes=1", "--dry-run")
    61  	var k8sManifest bytes.Buffer
    62  	c.Stdout = &k8sManifest
    63  	err := c.Run()
    64  	require.NoError(t, err)
    65  
    66  	var manifestPiece struct {
    67  		Data struct {
    68  			AmazonBucket string `json:"amazon-bucket"`
    69  		} `json:"data"`
    70  	}
    71  
    72  	// k8s manifest is a stream of json objects. We can't unmarshal the whole
    73  	// thing (json.Unmarshal yields an error), so unmarshal objects from the
    74  	// stream one at a time until we find & validate the storage secret
    75  	d := json.NewDecoder(&k8sManifest)
    76  	for {
    77  		// decode next object
    78  		if err := d.Decode(&manifestPiece); err != nil {
    79  			if errors.Is(err, io.EOF) {
    80  				t.Fatalf("never found S3 bucket name in kubernetes manifest")
    81  			}
    82  			t.Fatalf("could not deserialize json object: %v", err)
    83  		}
    84  
    85  		// figure out if the object was the storage secret--if so, make sure the
    86  		// bucket name is right
    87  		bucketName64 := manifestPiece.Data.AmazonBucket
    88  		if bucketName64 != "" {
    89  			bucketName, err := base64.RawStdEncoding.DecodeString(bucketName64)
    90  			require.NoError(t, err)
    91  			require.Equal(t, "bucket", string(bucketName)) // "s3://" removed
    92  
    93  			return // done--success
    94  		}
    95  	}
    96  }