github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/imageservice/v2/images_test.go (about)

     1  //go:build acceptance || imageservice || images
     2  // +build acceptance imageservice images
     3  
     4  package v2
     5  
     6  import (
     7  	"sort"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    12  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    13  	"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
    14  	"github.com/gophercloud/gophercloud/pagination"
    15  	th "github.com/gophercloud/gophercloud/testhelper"
    16  )
    17  
    18  func TestImagesListEachPage(t *testing.T) {
    19  	client, err := clients.NewImageServiceV2Client()
    20  	th.AssertNoErr(t, err)
    21  
    22  	listOpts := images.ListOpts{
    23  		Limit: 1,
    24  	}
    25  
    26  	pager := images.List(client, listOpts)
    27  	err = pager.EachPage(func(page pagination.Page) (bool, error) {
    28  		images, err := images.ExtractImages(page)
    29  		if err != nil {
    30  			t.Fatalf("Unable to extract images: %v", err)
    31  		}
    32  
    33  		for _, image := range images {
    34  			tools.PrintResource(t, image)
    35  			tools.PrintResource(t, image.Properties)
    36  		}
    37  
    38  		return true, nil
    39  	})
    40  }
    41  
    42  func TestImagesListAllPages(t *testing.T) {
    43  	client, err := clients.NewImageServiceV2Client()
    44  	th.AssertNoErr(t, err)
    45  
    46  	image, err := CreateEmptyImage(t, client)
    47  	th.AssertNoErr(t, err)
    48  	defer DeleteImage(t, client, image)
    49  
    50  	listOpts := images.ListOpts{}
    51  
    52  	allPages, err := images.List(client, listOpts).AllPages()
    53  	th.AssertNoErr(t, err)
    54  
    55  	allImages, err := images.ExtractImages(allPages)
    56  	th.AssertNoErr(t, err)
    57  
    58  	var found bool
    59  	for _, i := range allImages {
    60  		tools.PrintResource(t, i)
    61  		tools.PrintResource(t, i.Properties)
    62  
    63  		if i.Name == image.Name {
    64  			found = true
    65  		}
    66  	}
    67  
    68  	th.AssertEquals(t, found, true)
    69  }
    70  
    71  func TestImagesListByDate(t *testing.T) {
    72  	client, err := clients.NewImageServiceV2Client()
    73  	th.AssertNoErr(t, err)
    74  
    75  	date := time.Date(2014, 1, 1, 1, 1, 1, 0, time.UTC)
    76  	listOpts := images.ListOpts{
    77  		Limit: 1,
    78  		CreatedAtQuery: &images.ImageDateQuery{
    79  			Date:   date,
    80  			Filter: images.FilterGTE,
    81  		},
    82  	}
    83  
    84  	allPages, err := images.List(client, listOpts).AllPages()
    85  	th.AssertNoErr(t, err)
    86  
    87  	allImages, err := images.ExtractImages(allPages)
    88  	th.AssertNoErr(t, err)
    89  
    90  	if len(allImages) == 0 {
    91  		t.Fatalf("Query resulted in no results")
    92  	}
    93  
    94  	for _, image := range allImages {
    95  		tools.PrintResource(t, image)
    96  		tools.PrintResource(t, image.Properties)
    97  	}
    98  
    99  	date = time.Date(2049, 1, 1, 1, 1, 1, 0, time.UTC)
   100  	listOpts = images.ListOpts{
   101  		Limit: 1,
   102  		CreatedAtQuery: &images.ImageDateQuery{
   103  			Date:   date,
   104  			Filter: images.FilterGTE,
   105  		},
   106  	}
   107  
   108  	allPages, err = images.List(client, listOpts).AllPages()
   109  	th.AssertNoErr(t, err)
   110  
   111  	allImages, err = images.ExtractImages(allPages)
   112  	th.AssertNoErr(t, err)
   113  
   114  	if len(allImages) > 0 {
   115  		t.Fatalf("Expected 0 images, got %d", len(allImages))
   116  	}
   117  }
   118  
   119  func TestImagesFilter(t *testing.T) {
   120  	client, err := clients.NewImageServiceV2Client()
   121  	th.AssertNoErr(t, err)
   122  
   123  	image, err := CreateEmptyImage(t, client)
   124  	th.AssertNoErr(t, err)
   125  	defer DeleteImage(t, client, image)
   126  
   127  	listOpts := images.ListOpts{
   128  		Tags:            []string{"foo", "bar"},
   129  		ContainerFormat: "bare",
   130  		DiskFormat:      "qcow2",
   131  	}
   132  
   133  	allPages, err := images.List(client, listOpts).AllPages()
   134  	th.AssertNoErr(t, err)
   135  
   136  	allImages, err := images.ExtractImages(allPages)
   137  	th.AssertNoErr(t, err)
   138  
   139  	if len(allImages) == 0 {
   140  		t.Fatalf("Query resulted in no results")
   141  	}
   142  }
   143  
   144  func TestImagesUpdate(t *testing.T) {
   145  	client, err := clients.NewImageServiceV2Client()
   146  	th.AssertNoErr(t, err)
   147  
   148  	image, err := CreateEmptyImage(t, client)
   149  	th.AssertNoErr(t, err)
   150  	defer DeleteImage(t, client, image)
   151  
   152  	newTags := []string{"foo", "bar"}
   153  
   154  	updateOpts := images.UpdateOpts{
   155  		images.ReplaceImageName{NewName: image.Name + "foo"},
   156  		images.ReplaceImageTags{NewTags: newTags},
   157  		images.ReplaceImageMinDisk{NewMinDisk: 21},
   158  		images.ReplaceImageProtected{NewProtected: true},
   159  		images.UpdateImageProperty{
   160  			Op:    images.AddOp,
   161  			Name:  "hw_disk_bus",
   162  			Value: "scsi",
   163  		},
   164  		images.UpdateImageProperty{
   165  			Op:   images.RemoveOp,
   166  			Name: "architecture",
   167  		},
   168  	}
   169  
   170  	newImage, err := images.Update(client, image.ID, updateOpts).Extract()
   171  	th.AssertNoErr(t, err)
   172  
   173  	tools.PrintResource(t, newImage)
   174  	tools.PrintResource(t, newImage.Properties)
   175  
   176  	th.AssertEquals(t, newImage.Name, image.Name+"foo")
   177  	th.AssertEquals(t, newImage.Protected, true)
   178  
   179  	sort.Strings(newTags)
   180  	sort.Strings(newImage.Tags)
   181  	th.AssertDeepEquals(t, newImage.Tags, newTags)
   182  
   183  	// Because OpenStack is now adding additional properties automatically,
   184  	// it's not possible to do an easy AssertDeepEquals.
   185  	th.AssertEquals(t, newImage.Properties["hw_disk_bus"], "scsi")
   186  
   187  	if _, ok := newImage.Properties["architecture"]; ok {
   188  		t.Fatal("architecture property still exists")
   189  	}
   190  
   191  	// Now change image protection back to false or delete will fail
   192  	updateOpts = images.UpdateOpts{
   193  		images.ReplaceImageProtected{NewProtected: false},
   194  	}
   195  	_, err = images.Update(client, image.ID, updateOpts).Extract()
   196  	th.AssertNoErr(t, err)
   197  }