github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/vm_affinity_rule_test.go (about)

     1  //go:build vdc || affinity || functional || ALL
     2  
     3  /*
     4   * Copyright 2020 VMware, Inc.  All rights reserved.  Licensed under the Apache v2 License.
     5   */
     6  
     7  package govcd
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  
    13  	. "gopkg.in/check.v1"
    14  
    15  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    16  )
    17  
    18  // testGetVmAffinityRuleList tests that we can retrieve a list of VM affinity rules
    19  func testGetVmAffinityRuleList(vdc *Vdc, check *C) {
    20  	fmt.Printf("Running: test_GetVmAffinityRuleList\n")
    21  	_, err := vdc.GetAllVmAffinityRuleList()
    22  	check.Assert(err, IsNil)
    23  }
    24  
    25  // testGetVmAffinityRule tests VmAffinityRule retrieval by name, by ID, and by a combination of name and ID
    26  func (vcd *TestVCD) testGetVmAffinityRule(vdc *Vdc, check *C) {
    27  	fmt.Printf("Running: testGetVmAffinityRule \n")
    28  
    29  	affinityRuleName := ""
    30  	list, err := vdc.GetAllVmAffinityRuleList()
    31  	check.Assert(err, IsNil)
    32  	if len(list) == 0 {
    33  		check.Skip("No affinity rules found")
    34  		return
    35  	}
    36  	affinityRuleName = list[0].Name
    37  
    38  	getByName := func(name string, refresh bool) (genericEntity, error) {
    39  		rules, err := vdc.GetVmAffinityRulesByName(name, "")
    40  		if err != nil {
    41  			return genericEntity(nil), err
    42  		}
    43  		if len(rules) == 0 {
    44  			return genericEntity(nil), ErrorEntityNotFound
    45  		}
    46  		if len(rules) > 1 {
    47  			return genericEntity(nil), fmt.Errorf("more than one item found with this name")
    48  		}
    49  		gRule := VmAffinityRule(*rules[0])
    50  		return &gRule, nil
    51  	}
    52  	getById := func(id string, refresh bool) (genericEntity, error) {
    53  		rule, err := vdc.GetVmAffinityRuleById(id)
    54  		if err != nil {
    55  			return genericEntity(nil), err
    56  		}
    57  		gRule := VmAffinityRule(*rule)
    58  		return &gRule, nil
    59  	}
    60  	getByNameOrId := func(id string, refresh bool) (genericEntity, error) {
    61  		rule, err := vdc.GetVmAffinityRuleByNameOrId(id)
    62  		if err != nil {
    63  			return genericEntity(nil), err
    64  		}
    65  		gRule := VmAffinityRule(*rule)
    66  		return &gRule, nil
    67  	}
    68  
    69  	var def = getterTestDefinition{
    70  		parentType:    "Vdc",
    71  		parentName:    vdc.Vdc.Name,
    72  		entityType:    "VmAffinityRule",
    73  		entityName:    affinityRuleName,
    74  		getByName:     getByName,
    75  		getById:       getById,
    76  		getByNameOrId: getByNameOrId,
    77  	}
    78  	vcd.testFinderGetGenericEntity(def, check)
    79  }
    80  
    81  type affinityRuleData struct {
    82  	name        string
    83  	polarity    string
    84  	creationVms []*types.Vm
    85  	updateVms   []*types.Vm
    86  }
    87  
    88  // testCRUDVmAffinityRule tests creation, update, deletion, and read for VM affinity rules
    89  func (vcd *TestVCD) testCRUDVmAffinityRule(orgName string, vdc *Vdc, data affinityRuleData, check *C) {
    90  	fmt.Printf("Running: testCRUDVmAffinityRule (%s-%s-%d)\n", data.name, data.polarity, len(data.creationVms))
    91  
    92  	var vmReferences []*types.Reference
    93  
    94  	for _, vm := range data.creationVms {
    95  		vmReferences = append(vmReferences, &types.Reference{HREF: vm.HREF})
    96  		if testVerbose {
    97  			fmt.Printf("rule %s %s: %s\n", data.polarity, data.name, vm.Name)
    98  		}
    99  	}
   100  	affinityRuleDef := &types.VmAffinityRule{
   101  		Name:        data.name,
   102  		IsEnabled:   addrOf(true),
   103  		IsMandatory: addrOf(true),
   104  		Polarity:    data.polarity,
   105  		VmReferences: []*types.VMs{
   106  			&types.VMs{
   107  				VMReference: vmReferences,
   108  			},
   109  		},
   110  	}
   111  	vmAffinityRule, err := vdc.CreateVmAffinityRule(affinityRuleDef)
   112  	check.Assert(err, IsNil)
   113  	AddToCleanupList(vmAffinityRule.VmAffinityRule.ID, "affinity_rule", orgName+"|"+vdc.Vdc.Name, "testCRUDVmAffinityRule")
   114  
   115  	// Update with VM replacement
   116  	for i, vm := range data.updateVms {
   117  		if i >= len(data.creationVms) {
   118  			break
   119  		}
   120  		vmAffinityRule.VmAffinityRule.VmReferences[0].VMReference[i].HREF = vm.HREF
   121  		if testVerbose {
   122  			fmt.Printf("rule %s: update %s\n", data.polarity, vm.Name)
   123  		}
   124  	}
   125  
   126  	vmAffinityRule.VmAffinityRule.Name = data.name + "-with-change"
   127  	err = vmAffinityRule.Update()
   128  	check.Assert(err, IsNil)
   129  	vmAffinityRule, err = vdc.GetVmAffinityRuleByHref(vmAffinityRule.VmAffinityRule.HREF)
   130  	check.Assert(err, IsNil)
   131  	check.Assert(vmAffinityRule.VmAffinityRule.Name, Equals, data.name+"-with-change")
   132  
   133  	// Update with VM removal
   134  	if len(data.creationVms) > 2 {
   135  		if testVerbose {
   136  			fmt.Printf("removing %s\n", vmAffinityRule.VmAffinityRule.VmReferences[0].VMReference[0].HREF)
   137  		}
   138  		vmAffinityRule.VmAffinityRule.Name = data.name + "-with-removal"
   139  		vmAffinityRule.VmAffinityRule.VmReferences[0].VMReference[0] = nil
   140  		err = vmAffinityRule.Update()
   141  		check.Assert(err, IsNil)
   142  		vmAffinityRule, err = vdc.GetVmAffinityRuleByHref(vmAffinityRule.VmAffinityRule.HREF)
   143  		check.Assert(err, IsNil)
   144  		check.Assert(vmAffinityRule.VmAffinityRule.Name, Equals, data.name+"-with-removal")
   145  	}
   146  
   147  	err = vmAffinityRule.SetEnabled(false)
   148  	check.Assert(err, IsNil)
   149  	vmAffinityRule, err = vdc.GetVmAffinityRuleByHref(vmAffinityRule.VmAffinityRule.HREF)
   150  	check.Assert(err, IsNil)
   151  	check.Assert(*vmAffinityRule.VmAffinityRule.IsEnabled, Equals, false)
   152  	check.Assert(*vmAffinityRule.VmAffinityRule.IsMandatory, Equals, true)
   153  
   154  	err = vmAffinityRule.SetMandatory(false)
   155  	check.Assert(err, IsNil)
   156  	vmAffinityRule, err = vdc.GetVmAffinityRuleByHref(vmAffinityRule.VmAffinityRule.HREF)
   157  	check.Assert(err, IsNil)
   158  	check.Assert(*vmAffinityRule.VmAffinityRule.IsMandatory, Equals, false)
   159  
   160  	err = vmAffinityRule.SetEnabled(true)
   161  	check.Assert(err, IsNil)
   162  	vmAffinityRule, err = vdc.GetVmAffinityRuleByHref(vmAffinityRule.VmAffinityRule.HREF)
   163  	check.Assert(err, IsNil)
   164  	check.Assert(*vmAffinityRule.VmAffinityRule.IsEnabled, Equals, true)
   165  	check.Assert(*vmAffinityRule.VmAffinityRule.IsMandatory, Equals, false)
   166  
   167  	err = vmAffinityRule.SetMandatory(true)
   168  	check.Assert(err, IsNil)
   169  	vmAffinityRule, err = vdc.GetVmAffinityRuleByHref(vmAffinityRule.VmAffinityRule.HREF)
   170  	check.Assert(err, IsNil)
   171  	check.Assert(*vmAffinityRule.VmAffinityRule.IsMandatory, Equals, true)
   172  	check.Assert(*vmAffinityRule.VmAffinityRule.IsEnabled, Equals, true)
   173  
   174  	// Read
   175  	testGetVmAffinityRuleList(vdc, check)
   176  	vcd.testGetVmAffinityRule(vdc, check)
   177  
   178  	// Delete
   179  	err = vmAffinityRule.Delete()
   180  	check.Assert(err, IsNil)
   181  	if testVerbose {
   182  		fmt.Println()
   183  	}
   184  }
   185  
   186  // Test_VmAffinityRule prepares the environment for testing VM affinity rules
   187  // After creating appropriate VMs, it runs the CRUD test for several combination of affinity rules
   188  func (vcd *TestVCD) Test_VmAffinityRule(check *C) {
   189  	fmt.Printf("Running: %s\n", check.TestName())
   190  
   191  	if vcd.config.VCD.Org == "" {
   192  		check.Skip("Test_VmAffinityRule: Org name not given")
   193  		return
   194  	}
   195  	if vcd.config.VCD.Vdc == "" {
   196  		check.Skip("Test_VmAffinityRule: VDC name not given")
   197  		return
   198  	}
   199  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
   200  	check.Assert(err, IsNil)
   201  	check.Assert(org, NotNil)
   202  
   203  	vdc, err := org.GetVDCByName(vcd.config.VCD.Vdc, false)
   204  	check.Assert(err, IsNil)
   205  	check.Assert(vdc, NotNil)
   206  
   207  	vappDefinition := map[string][]string{
   208  		"Test_EmptyVmVapp1": []string{"Test_EmptyVm1a", "Test_EmptyVm1b"},
   209  		"Test_EmptyVmVapp2": []string{"Test_EmptyVm2a", "Test_EmptyVm2b"},
   210  		"Test_EmptyVmVapp3": []string{"Test_EmptyVm3a", "Test_EmptyVm3b"},
   211  	}
   212  	vappList, err := makeVappGroup("TestVdc_CreateVmAffinityRule", vcd.vdc, vappDefinition)
   213  	check.Assert(err, IsNil)
   214  
   215  	defer func() {
   216  		if os.Getenv("GOVCD_KEEP_TEST_OBJECTS") != "" {
   217  			if testVerbose {
   218  				fmt.Printf("Skipping vApp removal: GOVCD_KEEP_TEST_OBJECTS was set \n")
   219  			}
   220  			return
   221  		}
   222  		for _, vapp := range vappList {
   223  			if testVerbose {
   224  				fmt.Printf("Removing vApp %s\n", vapp.VApp.Name)
   225  			}
   226  			task, err := vapp.Delete()
   227  			if err == nil {
   228  				_ = task.WaitTaskCompletion()
   229  			}
   230  		}
   231  	}()
   232  	check.Assert(len(vappList), Equals, len(vappDefinition))
   233  
   234  	vcd.testCRUDVmAffinityRule(org.Org.Name, vdc, affinityRuleData{
   235  		name:     "Test_VmAffinityRule1",
   236  		polarity: types.PolarityAffinity,
   237  		creationVms: []*types.Vm{
   238  			vappList[0].VApp.Children.VM[0],
   239  			vappList[0].VApp.Children.VM[1],
   240  		},
   241  		updateVms: []*types.Vm{
   242  			vappList[1].VApp.Children.VM[0],
   243  			vappList[1].VApp.Children.VM[1],
   244  		},
   245  	}, check)
   246  
   247  	vcd.testCRUDVmAffinityRule(org.Org.Name, vdc, affinityRuleData{
   248  		name:     "Test_VmAffinityRule2",
   249  		polarity: types.PolarityAffinity,
   250  		creationVms: []*types.Vm{
   251  			vappList[0].VApp.Children.VM[0],
   252  			vappList[0].VApp.Children.VM[1],
   253  			vappList[1].VApp.Children.VM[0],
   254  		},
   255  		updateVms: []*types.Vm{
   256  			vappList[2].VApp.Children.VM[0],
   257  			vappList[2].VApp.Children.VM[1],
   258  		},
   259  	}, check)
   260  
   261  	vcd.testCRUDVmAffinityRule(org.Org.Name, vdc, affinityRuleData{
   262  		name:     "Test_VmAffinityRule3",
   263  		polarity: types.PolarityAntiAffinity,
   264  		creationVms: []*types.Vm{
   265  			vappList[0].VApp.Children.VM[0],
   266  			vappList[1].VApp.Children.VM[0],
   267  		},
   268  		updateVms: []*types.Vm{
   269  			vappList[2].VApp.Children.VM[0],
   270  		},
   271  	}, check)
   272  
   273  }