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 }