github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/integration/e2e/scenario_test.go (about) 1 // +build requires_docker 2 3 package e2e_test 4 5 import ( 6 "bytes" 7 "context" 8 "io/ioutil" 9 "testing" 10 "time" 11 12 "github.com/go-kit/log" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 "github.com/thanos-io/thanos/pkg/objstore/s3" 16 "gopkg.in/yaml.v2" 17 18 "github.com/cortexproject/cortex/integration/e2e" 19 e2edb "github.com/cortexproject/cortex/integration/e2e/db" 20 ) 21 22 const bktName = "cheesecake" 23 24 func spinup(t *testing.T, networkName string) (*e2e.Scenario, *e2e.HTTPService, *e2e.HTTPService) { 25 s, err := e2e.NewScenario(networkName) 26 assert.NoError(t, err) 27 28 m1 := e2edb.NewMinio(9000, bktName) 29 m2 := e2edb.NewMinio(9001, bktName) 30 31 closePlease := true 32 defer func() { 33 if closePlease { 34 // You're welcome. 35 s.Close() 36 } 37 }() 38 require.NoError(t, s.StartAndWaitReady(m1, m2)) 39 require.Error(t, s.Start(m1)) 40 require.Error(t, s.Start(e2edb.NewMinio(9000, "cheescake"))) 41 42 closePlease = false 43 return s, m1, m2 44 } 45 46 func testMinioWorking(t *testing.T, m *e2e.HTTPService) { 47 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) 48 defer cancel() 49 50 b, err := yaml.Marshal(s3.Config{ 51 Endpoint: m.HTTPEndpoint(), 52 Bucket: bktName, 53 AccessKey: e2edb.MinioAccessKey, 54 SecretKey: e2edb.MinioSecretKey, 55 Insecure: true, // WARNING: Our secret cheesecake recipes might leak. 56 }) 57 require.NoError(t, err) 58 59 bkt, err := s3.NewBucket(log.NewNopLogger(), b, "test") 60 require.NoError(t, err) 61 62 require.NoError(t, bkt.Upload(ctx, "recipe", bytes.NewReader([]byte("Just go to Pastry Shop and buy.")))) 63 require.NoError(t, bkt.Upload(ctx, "mom/recipe", bytes.NewReader([]byte("https://www.bbcgoodfood.com/recipes/strawberry-cheesecake-4-easy-steps")))) 64 65 r, err := bkt.Get(ctx, "recipe") 66 require.NoError(t, err) 67 b, err = ioutil.ReadAll(r) 68 require.NoError(t, err) 69 require.Equal(t, "Just go to Pastry Shop and buy.", string(b)) 70 71 r, err = bkt.Get(ctx, "mom/recipe") 72 require.NoError(t, err) 73 b, err = ioutil.ReadAll(r) 74 require.NoError(t, err) 75 require.Equal(t, "https://www.bbcgoodfood.com/recipes/strawberry-cheesecake-4-easy-steps", string(b)) 76 } 77 78 func TestScenario(t *testing.T) { 79 t.Parallel() 80 81 s, m1, m2 := spinup(t, "e2e-scenario-test") 82 defer s.Close() 83 84 t.Run("minio is working", func(t *testing.T) { 85 testMinioWorking(t, m1) 86 testMinioWorking(t, m2) 87 }) 88 89 t.Run("concurrent nested scenario 1 is working just fine as well", func(t *testing.T) { 90 t.Parallel() 91 92 s, m1, m2 := spinup(t, "e2e-scenario-test1") 93 defer s.Close() 94 95 testMinioWorking(t, m1) 96 testMinioWorking(t, m2) 97 }) 98 t.Run("concurrent nested scenario 2 is working just fine as well", func(t *testing.T) { 99 t.Parallel() 100 101 s, m1, m2 := spinup(t, "e2e-scenario-test2") 102 defer s.Close() 103 104 testMinioWorking(t, m1) 105 testMinioWorking(t, m2) 106 }) 107 108 require.NoError(t, s.Stop(m1)) 109 110 // Expect m1 not working. 111 b, err := yaml.Marshal(s3.Config{ 112 Endpoint: m1.Name(), 113 Bucket: "cheescake", 114 AccessKey: e2edb.MinioAccessKey, 115 SecretKey: e2edb.MinioSecretKey, 116 }) 117 require.NoError(t, err) 118 bkt, err := s3.NewBucket(log.NewNopLogger(), b, "test") 119 require.NoError(t, err) 120 121 _, err = bkt.Get(context.Background(), "recipe") 122 require.Error(t, err) 123 124 testMinioWorking(t, m2) 125 126 require.Error(t, s.Stop(m1)) 127 // Should be noop. 128 require.NoError(t, m1.Stop()) 129 // I can run closes as many times I want. 130 s.Close() 131 s.Close() 132 s.Close() 133 134 // Expect m2 not working. 135 b, err = yaml.Marshal(s3.Config{ 136 Endpoint: m2.Name(), 137 Bucket: "cheescake", 138 AccessKey: e2edb.MinioAccessKey, 139 SecretKey: e2edb.MinioSecretKey, 140 }) 141 require.NoError(t, err) 142 bkt, err = s3.NewBucket(log.NewNopLogger(), b, "test") 143 require.NoError(t, err) 144 145 _, err = bkt.Get(context.Background(), "recipe") 146 require.Error(t, err) 147 }