github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/internal/acceptance/openstack/image/v2/images_test.go (about)

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