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 }