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 }