github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/objectstorage/v1/containers_test.go (about) 1 //go:build acceptance 2 // +build acceptance 3 4 package v1 5 6 import ( 7 "strings" 8 "testing" 9 10 "github.com/gophercloud/gophercloud/internal/acceptance/clients" 11 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 12 "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/containers" 13 "github.com/gophercloud/gophercloud/pagination" 14 th "github.com/gophercloud/gophercloud/testhelper" 15 ) 16 17 // numContainers is the number of containers to create for testing. 18 var numContainers = 2 19 20 func TestContainers(t *testing.T) { 21 client, err := clients.NewObjectStorageV1Client() 22 if err != nil { 23 t.Fatalf("Unable to create client: %v", err) 24 } 25 26 // Create a slice of random container names. 27 cNames := make([]string, numContainers) 28 for i := 0; i < numContainers; i++ { 29 cNames[i] = tools.RandomString("gophercloud-test-container-", 8) 30 } 31 32 // Create numContainers containers. 33 for i := 0; i < len(cNames); i++ { 34 res := containers.Create(client, cNames[i], nil) 35 th.AssertNoErr(t, res.Err) 36 } 37 // Delete the numContainers containers after function completion. 38 defer func() { 39 for i := 0; i < len(cNames); i++ { 40 res := containers.Delete(client, cNames[i]) 41 th.AssertNoErr(t, res.Err) 42 } 43 }() 44 45 // List the numContainer names that were just created. To just list those, 46 // the 'prefix' parameter is used. 47 err = containers.List(client, &containers.ListOpts{Full: true, Prefix: "gophercloud-test-container-"}).EachPage(func(page pagination.Page) (bool, error) { 48 containerList, err := containers.ExtractInfo(page) 49 th.AssertNoErr(t, err) 50 51 for _, n := range containerList { 52 t.Logf("Container: Name [%s] Count [%d] Bytes [%d]", 53 n.Name, n.Count, n.Bytes) 54 } 55 56 return true, nil 57 }) 58 th.AssertNoErr(t, err) 59 60 // List the info for the numContainer containers that were created. 61 err = containers.List(client, &containers.ListOpts{Full: false, Prefix: "gophercloud-test-container-"}).EachPage(func(page pagination.Page) (bool, error) { 62 containerList, err := containers.ExtractNames(page) 63 th.AssertNoErr(t, err) 64 for _, n := range containerList { 65 t.Logf("Container: Name [%s]", n) 66 } 67 68 return true, nil 69 }) 70 th.AssertNoErr(t, err) 71 72 // Update one of the numContainer container metadata. 73 metadata := map[string]string{ 74 "Gophercloud-Test": "containers", 75 } 76 read := ".r:*,.rlistings" 77 write := "*:*" 78 iTrue := true 79 empty := "" 80 opts := &containers.UpdateOpts{ 81 Metadata: metadata, 82 ContainerRead: &read, 83 ContainerWrite: &write, 84 DetectContentType: new(bool), 85 ContainerSyncTo: &empty, 86 ContainerSyncKey: &empty, 87 } 88 89 updateres := containers.Update(client, cNames[0], opts) 90 th.AssertNoErr(t, updateres.Err) 91 // After the tests are done, delete the metadata that was set. 92 defer func() { 93 temp := []string{} 94 for k := range metadata { 95 temp = append(temp, k) 96 } 97 empty := "" 98 opts = &containers.UpdateOpts{ 99 RemoveMetadata: temp, 100 ContainerRead: &empty, 101 ContainerWrite: &empty, 102 DetectContentType: &iTrue, 103 } 104 res := containers.Update(client, cNames[0], opts) 105 th.AssertNoErr(t, res.Err) 106 107 // confirm the metadata was removed 108 getOpts := containers.GetOpts{ 109 Newest: true, 110 } 111 112 resp := containers.Get(client, cNames[0], getOpts) 113 cm, err := resp.ExtractMetadata() 114 th.AssertNoErr(t, err) 115 for k := range metadata { 116 if _, ok := cm[k]; ok { 117 t.Errorf("Unexpected custom metadata with key: %s", k) 118 } 119 } 120 container, err := resp.Extract() 121 th.AssertNoErr(t, err) 122 th.AssertEquals(t, empty, strings.Join(container.Read, ",")) 123 th.AssertEquals(t, empty, strings.Join(container.Write, ",")) 124 }() 125 126 // Retrieve a container's metadata. 127 getOpts := containers.GetOpts{ 128 Newest: true, 129 } 130 131 resp := containers.Get(client, cNames[0], getOpts) 132 cm, err := resp.ExtractMetadata() 133 th.AssertNoErr(t, err) 134 for k := range metadata { 135 if cm[k] != metadata[strings.Title(k)] { 136 t.Errorf("Expected custom metadata with key: %s", k) 137 } 138 } 139 container, err := resp.Extract() 140 th.AssertNoErr(t, err) 141 th.AssertEquals(t, read, strings.Join(container.Read, ",")) 142 th.AssertEquals(t, write, strings.Join(container.Write, ",")) 143 144 // Retrieve a container's timestamp 145 cHeaders, err := containers.Get(client, cNames[0], getOpts).Extract() 146 th.AssertNoErr(t, err) 147 t.Logf("Container: Name [%s] Timestamp: [%f]\n", cNames[0], cHeaders.Timestamp) 148 } 149 150 func TestListAllContainers(t *testing.T) { 151 client, err := clients.NewObjectStorageV1Client() 152 if err != nil { 153 t.Fatalf("Unable to create client: %v", err) 154 } 155 156 numContainers := 20 157 158 // Create a slice of random container names. 159 cNames := make([]string, numContainers) 160 for i := 0; i < numContainers; i++ { 161 cNames[i] = tools.RandomString("gophercloud-test-container-", 8) 162 } 163 164 // Create numContainers containers. 165 for i := 0; i < len(cNames); i++ { 166 res := containers.Create(client, cNames[i], nil) 167 th.AssertNoErr(t, res.Err) 168 } 169 // Delete the numContainers containers after function completion. 170 defer func() { 171 for i := 0; i < len(cNames); i++ { 172 res := containers.Delete(client, cNames[i]) 173 th.AssertNoErr(t, res.Err) 174 } 175 }() 176 177 // List all the numContainer names that were just created. To just list those, 178 // the 'prefix' parameter is used. 179 allPages, err := containers.List(client, &containers.ListOpts{Full: true, Limit: 5, Prefix: "gophercloud-test-container-"}).AllPages() 180 th.AssertNoErr(t, err) 181 containerInfoList, err := containers.ExtractInfo(allPages) 182 th.AssertNoErr(t, err) 183 for _, n := range containerInfoList { 184 t.Logf("Container: Name [%s] Count [%d] Bytes [%d]", 185 n.Name, n.Count, n.Bytes) 186 } 187 th.AssertEquals(t, numContainers, len(containerInfoList)) 188 189 // List the info for all the numContainer containers that were created. 190 allPages, err = containers.List(client, &containers.ListOpts{Full: false, Limit: 2, Prefix: "gophercloud-test-container-"}).AllPages() 191 th.AssertNoErr(t, err) 192 containerNamesList, err := containers.ExtractNames(allPages) 193 th.AssertNoErr(t, err) 194 for _, n := range containerNamesList { 195 t.Logf("Container: Name [%s]", n) 196 } 197 th.AssertEquals(t, numContainers, len(containerNamesList)) 198 } 199 200 func TestBulkDeleteContainers(t *testing.T) { 201 client, err := clients.NewObjectStorageV1Client() 202 if err != nil { 203 t.Fatalf("Unable to create client: %v", err) 204 } 205 206 numContainers := 20 207 208 // Create a slice of random container names. 209 cNames := make([]string, numContainers) 210 for i := 0; i < numContainers; i++ { 211 cNames[i] = tools.RandomString("gophercloud-test-container-", 8) 212 } 213 214 // Create numContainers containers. 215 for i := 0; i < len(cNames); i++ { 216 res := containers.Create(client, cNames[i], nil) 217 th.AssertNoErr(t, res.Err) 218 } 219 220 expectedResp := containers.BulkDeleteResponse{ 221 ResponseStatus: "200 OK", 222 Errors: [][]string{}, 223 NumberDeleted: numContainers, 224 } 225 226 resp, err := containers.BulkDelete(client, cNames).Extract() 227 th.AssertNoErr(t, err) 228 tools.PrintResource(t, *resp) 229 th.AssertDeepEquals(t, *resp, expectedResp) 230 231 for _, c := range cNames { 232 _, err = containers.Get(client, c, nil).Extract() 233 th.AssertErr(t, err) 234 } 235 }