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  }