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  }