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 }