github.com/1and1/oneandone-cloudserver-sdk-go@v1.4.1/images_test.go (about) 1 package oneandone 2 3 import ( 4 "fmt" 5 "math/rand" 6 "strings" 7 "sync" 8 "testing" 9 "time" 10 ) 11 12 var ( 13 set_image sync.Once 14 image_name string 15 image_desc string 16 test_image *Image 17 image_serv *Server 18 img_numb = 1 19 ) 20 21 const ( 22 img_freq = "WEEKLY" 23 ) 24 25 // Helper functions 26 27 func create_image(ser_id string) *Image { 28 rand.Seed(time.Now().UnixNano()) 29 ri := rand.Intn(1000) 30 image_name = fmt.Sprintf("TestServerImage_%d", ri) 31 image_desc = fmt.Sprintf("TestServerImage_%d description", ri) 32 req := ImageRequest{ 33 Name: image_name, 34 Description: image_desc, 35 ServerId: ser_id, 36 Frequency: img_freq, 37 NumImages: Int2Pointer(img_numb), 38 } 39 fmt.Printf("Creating image '%s'...\n", image_name) 40 img_id, img, err := api.CreateImage(&req) 41 if err != nil { 42 fmt.Printf("Unable to create new image. Error: %s", err.Error()) 43 return nil 44 } 45 if img_id == "" || img.Id == "" { 46 fmt.Printf("Unable to create image '%s'.", image_name) 47 return nil 48 } 49 api.WaitForState(img, "ENABLED", 10, 90) 50 return img 51 } 52 53 func setup_image() { 54 _, image_serv, _ = create_test_server(true) 55 api.WaitForState(image_serv, "POWERED_ON", 10, 180) 56 test_image = create_image(image_serv.Id) 57 } 58 59 // /images tests 60 61 func TestCreateImage(t *testing.T) { 62 set_image.Do(setup_image) 63 64 if test_image == nil { 65 t.Errorf("CreateImage failed.") 66 return 67 } 68 if test_image.Id == "" { 69 t.Errorf("Missing image ID.") 70 } 71 if !strings.Contains(test_image.Name, image_name) { 72 t.Errorf("Wrong image name.") 73 } 74 if test_image.Description != image_desc { 75 t.Errorf("Wrong image description.") 76 } 77 } 78 79 func TestGetImage(t *testing.T) { 80 set_image.Do(setup_image) 81 82 fmt.Printf("Getting image '%s'...\n", test_image.Name) 83 img, err := api.GetImage(test_image.Id) 84 85 if err != nil { 86 t.Errorf("GetImage failed. Error: " + err.Error()) 87 return 88 } 89 if img.Name != test_image.Name { 90 t.Errorf("Wrong image name.") 91 } 92 if img.Type != test_image.Type { 93 t.Errorf("Wrong image type.") 94 } 95 if img.Architecture != nil && *img.Architecture != *test_image.Architecture { 96 t.Errorf("Wrong image architecture.") 97 } 98 if img.Description != test_image.Description { 99 t.Errorf("Wrong image description.") 100 } 101 if img.ServerId != image_serv.Id { 102 t.Errorf("Wrong server ID in image '%s'.", test_image.Name) 103 } 104 if img.Frequency != img_freq { 105 t.Errorf("Wrong image frequency.") 106 } 107 if *img.NumImages != img_numb { 108 t.Errorf("Wrong number of images in image '%s'.", test_image.Name) 109 } 110 } 111 112 func TestListImages(t *testing.T) { 113 set_image.Do(setup_image) 114 fmt.Println("Listing all images...") 115 116 imgs, err := api.ListImages() 117 if err != nil { 118 t.Errorf("ListImages failed. Error: " + err.Error()) 119 } 120 if len(imgs) == 0 { 121 t.Errorf("No image found.") 122 } 123 124 imgs, err = api.ListImages(1, 3, "name", "", "id,name,type") 125 if err != nil { 126 t.Errorf("ListImages with parameter options failed. Error: " + err.Error()) 127 return 128 } 129 if len(imgs) == 0 { 130 t.Errorf("No image found.") 131 } 132 if len(imgs) > 3 { 133 t.Errorf("Wrong number of objects per page.") 134 } 135 if imgs[0].Id == "" { 136 t.Errorf("Filtering parameters failed.") 137 } 138 if imgs[0].Name == "" { 139 t.Errorf("Filtering parameters failed.") 140 } 141 if imgs[0].State != "" { 142 t.Errorf("Filtering parameters failed.") 143 } 144 if len(imgs) >= 2 && imgs[0].Name > imgs[1].Name { 145 t.Errorf("Sorting parameters failed.") 146 } 147 148 imgs, err = api.ListImages(0, 0, "", test_image.Name, "") 149 if err != nil { 150 t.Errorf("ListImages with parameter options failed. Error: " + err.Error()) 151 return 152 } 153 if len(imgs) != 1 { 154 t.Errorf("Search parameter failed.") 155 } 156 if imgs[0].Name != test_image.Name { 157 t.Errorf("Search parameter failed.") 158 } 159 } 160 161 func TestListImageOs(t *testing.T) { 162 fmt.Println("Listing all image Operating Systems...") 163 imgOses, err := api.ListImageOs() 164 if err != nil { 165 t.Errorf("ListImageOs failed. Error: " + err.Error()) 166 } 167 if len(imgOses) == 0 { 168 t.Errorf("No image OS found.") 169 } 170 } 171 172 func TestUpdateImage(t *testing.T) { 173 set_image.Do(setup_image) 174 175 fmt.Printf("Updating image '%s'...\n", test_image.Name) 176 new_name := test_image.Name + " updated" 177 new_desc := test_image.Name + " updated" 178 179 imageUpdated := UpdateImageRequest{ 180 Name: new_name, 181 Description: new_desc, 182 Frequency: "ONCE", 183 } 184 185 img, err := api.UpdateImage(test_image.Id, &imageUpdated) 186 187 if err != nil { 188 t.Errorf("UpdateImage failed. Error: " + err.Error()) 189 return 190 } 191 api.WaitForState(img, "ACTIVE", 10, 30) 192 193 if img.Id != test_image.Id { 194 t.Errorf("Wrong image ID.") 195 } 196 if img.Name != new_name { 197 t.Errorf("Unable to update image '%s' name.", img.Name) 198 } 199 if img.Description != new_desc { 200 t.Errorf("Unable to update image '%s' description.", img.Name) 201 } 202 if img.Frequency != "ONCE" { 203 t.Errorf("Unable to update image '%s' frequency.", img.Name) 204 } 205 } 206 207 func TestDeleteImage(t *testing.T) { 208 set_image.Do(setup_image) 209 210 fmt.Printf("Deleting image '%s'...\n", test_image.Name) 211 img, err := api.DeleteImage(test_image.Id) 212 213 if err != nil { 214 t.Errorf("DeleteImage failed. Error: " + err.Error()) 215 return 216 } else { 217 api.WaitUntilDeleted(img) 218 } 219 220 img, _ = api.GetImage(test_image.Id) 221 222 if img != nil { 223 t.Errorf("Unable to delete the image.") 224 } else { 225 test_image = nil 226 } 227 // Delete test server 228 api.DeleteServer(image_serv.Id, false) 229 api.WaitUntilDeleted(image_serv) 230 image_serv, _ = api.GetServer(image_serv.Id) 231 }