github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/vdccomputepolicy_v2_test.go (about) 1 //go:build vdc || functional || openapi || ALL 2 3 /* 4 * Copyright 2022 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 5 */ 6 7 package govcd 8 9 import ( 10 "fmt" 11 "net/url" 12 "strings" 13 14 "github.com/vmware/go-vcloud-director/v2/types/v56" 15 . "gopkg.in/check.v1" 16 ) 17 18 func (vcd *TestVCD) Test_VdcComputePoliciesV2(check *C) { 19 if vcd.skipAdminTests { 20 check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName())) 21 } 22 23 // Step 1 - Create a new VDC Compute Policy 24 newComputePolicy := &VdcComputePolicyV2{ 25 client: &vcd.client.Client, 26 VdcComputePolicyV2: &types.VdcComputePolicyV2{ 27 VdcComputePolicy: types.VdcComputePolicy{ 28 Name: check.TestName() + "_empty", 29 Description: addrOf("Empty policy created by test"), 30 }, 31 PolicyType: "VdcVmPolicy", 32 }, 33 } 34 35 createdPolicy, err := vcd.client.CreateVdcComputePolicyV2(newComputePolicy.VdcComputePolicyV2) 36 check.Assert(err, IsNil) 37 38 AddToCleanupList(createdPolicy.VdcComputePolicyV2.ID, "vdcComputePolicy", "", check.TestName()) 39 40 check.Assert(createdPolicy.VdcComputePolicyV2.Name, Equals, newComputePolicy.VdcComputePolicyV2.Name) 41 check.Assert(*createdPolicy.VdcComputePolicyV2.Description, Equals, *newComputePolicy.VdcComputePolicyV2.Description) 42 43 newComputePolicy2 := &VdcComputePolicyV2{ 44 client: &vcd.client.Client, 45 VdcComputePolicyV2: &types.VdcComputePolicyV2{ 46 VdcComputePolicy: types.VdcComputePolicy{ 47 Name: check.TestName(), 48 Description: addrOf("Not Empty policy created by test"), 49 CPUSpeed: addrOf(100), 50 CPUCount: addrOf(2), 51 CoresPerSocket: addrOf(1), 52 CPUReservationGuarantee: takeFloatAddress(0.26), 53 CPULimit: addrOf(200), 54 CPUShares: addrOf(5), 55 Memory: addrOf(1600), 56 MemoryReservationGuarantee: takeFloatAddress(0.5), 57 MemoryLimit: addrOf(1200), 58 MemoryShares: addrOf(500), 59 }, 60 PolicyType: "VdcVmPolicy", 61 }, 62 } 63 64 createdPolicy2, err := vcd.client.CreateVdcComputePolicyV2(newComputePolicy2.VdcComputePolicyV2) 65 check.Assert(err, IsNil) 66 67 AddToCleanupList(createdPolicy2.VdcComputePolicyV2.ID, "vdcComputePolicy", "", check.TestName()) 68 69 check.Assert(createdPolicy2.VdcComputePolicyV2.Name, Equals, newComputePolicy2.VdcComputePolicyV2.Name) 70 check.Assert(*createdPolicy2.VdcComputePolicyV2.CPUSpeed, Equals, 100) 71 check.Assert(*createdPolicy2.VdcComputePolicyV2.CPUCount, Equals, 2) 72 check.Assert(*createdPolicy2.VdcComputePolicyV2.CoresPerSocket, Equals, 1) 73 check.Assert(*createdPolicy2.VdcComputePolicyV2.CPUReservationGuarantee, Equals, 0.26) 74 check.Assert(*createdPolicy2.VdcComputePolicyV2.CPULimit, Equals, 200) 75 check.Assert(*createdPolicy2.VdcComputePolicyV2.CPUShares, Equals, 5) 76 check.Assert(*createdPolicy2.VdcComputePolicyV2.Memory, Equals, 1600) 77 check.Assert(*createdPolicy2.VdcComputePolicyV2.MemoryReservationGuarantee, Equals, 0.5) 78 check.Assert(*createdPolicy2.VdcComputePolicyV2.MemoryLimit, Equals, 1200) 79 check.Assert(*createdPolicy2.VdcComputePolicyV2.MemoryShares, Equals, 500) 80 81 // Step 2 - Update 82 createdPolicy2.VdcComputePolicyV2.Description = addrOf("Updated description") 83 updatedPolicy, err := createdPolicy2.Update() 84 check.Assert(err, IsNil) 85 check.Assert(updatedPolicy.VdcComputePolicyV2, DeepEquals, createdPolicy2.VdcComputePolicyV2) 86 87 // Step 3 - Get all VDC compute policies 88 allExistingPolicies, err := vcd.client.GetAllVdcComputePoliciesV2(nil) 89 check.Assert(err, IsNil) 90 check.Assert(allExistingPolicies, NotNil) 91 92 // Step 4 - Get all VDC compute policies using query filters 93 for _, onePolicy := range allExistingPolicies { 94 95 // Step 3.1 - Retrieve using FIQL filter 96 queryParams := url.Values{} 97 queryParams.Add("filter", "id=="+onePolicy.VdcComputePolicyV2.ID) 98 99 expectOnePolicyResultById, err := vcd.client.GetAllVdcComputePoliciesV2(queryParams) 100 check.Assert(err, IsNil) 101 check.Assert(len(expectOnePolicyResultById) == 1, Equals, true) 102 103 // Step 2.2 - Retrieve 104 exactItem, err := vcd.client.GetVdcComputePolicyV2ById(onePolicy.VdcComputePolicyV2.ID) 105 check.Assert(err, IsNil) 106 107 check.Assert(err, IsNil) 108 check.Assert(exactItem, NotNil) 109 110 // Step 2.3 - Compare struct retrieved by using filter and the one retrieved by exact ID 111 check.Assert(onePolicy, DeepEquals, expectOnePolicyResultById[0]) 112 113 } 114 115 // Step 5 - Delete 116 err = createdPolicy.Delete() 117 check.Assert(err, IsNil) 118 // Step 5 - Try to read deleted VDC computed policy should end up with error 'ErrorEntityNotFound' 119 deletedPolicy, err := vcd.client.GetVdcComputePolicyV2ById(createdPolicy.VdcComputePolicyV2.ID) 120 check.Assert(ContainsNotFound(err), Equals, true) 121 check.Assert(deletedPolicy, IsNil) 122 123 err = createdPolicy2.Delete() 124 check.Assert(err, IsNil) 125 deletedPolicy2, err := vcd.client.GetVdcComputePolicyV2ById(createdPolicy2.VdcComputePolicyV2.ID) 126 check.Assert(ContainsNotFound(err), Equals, true) 127 check.Assert(deletedPolicy2, IsNil) 128 } 129 130 func (vcd *TestVCD) Test_SetAssignedComputePoliciesV2(check *C) { 131 if vcd.skipAdminTests { 132 check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName())) 133 } 134 135 org, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name) 136 check.Assert(err, IsNil) 137 check.Assert(org, NotNil) 138 139 adminVdc, err := org.GetAdminVDCByName(vcd.vdc.Vdc.Name, false) 140 check.Assert(err, IsNil) 141 check.Assert(adminVdc, NotNil) 142 143 // Create a new VDC compute policies 144 newComputePolicy := &VdcComputePolicyV2{ 145 client: &vcd.client.Client, 146 VdcComputePolicyV2: &types.VdcComputePolicyV2{ 147 VdcComputePolicy: types.VdcComputePolicy{ 148 Name: check.TestName() + "1", 149 Description: addrOf("Policy created by Test_SetAssignedComputePolicies"), 150 CoresPerSocket: addrOf(1), 151 CPUReservationGuarantee: takeFloatAddress(0.26), 152 CPULimit: addrOf(200), 153 }, 154 PolicyType: "VdcVmPolicy", 155 }, 156 } 157 createdPolicy, err := vcd.client.CreateVdcComputePolicyV2(newComputePolicy.VdcComputePolicyV2) 158 check.Assert(err, IsNil) 159 AddToCleanupList(createdPolicy.VdcComputePolicyV2.ID, "vdcComputePolicy", "", check.TestName()) 160 161 newComputePolicy2 := &VdcComputePolicyV2{ 162 client: &vcd.client.Client, 163 VdcComputePolicyV2: &types.VdcComputePolicyV2{ 164 VdcComputePolicy: types.VdcComputePolicy{ 165 Name: check.TestName() + "2", 166 Description: addrOf("Policy created by Test_SetAssignedComputePolicies"), 167 CoresPerSocket: addrOf(2), 168 CPUReservationGuarantee: takeFloatAddress(0.52), 169 CPULimit: addrOf(400), 170 }, 171 PolicyType: "VdcVmPolicy", 172 }, 173 } 174 createdPolicy2, err := vcd.client.CreateVdcComputePolicyV2(newComputePolicy2.VdcComputePolicyV2) 175 check.Assert(err, IsNil) 176 AddToCleanupList(createdPolicy2.VdcComputePolicyV2.ID, "vdcComputePolicy", "", check.TestName()) 177 178 // Get default compute policy 179 allAssignedComputePolicies, err := adminVdc.GetAllAssignedVdcComputePoliciesV2(nil) 180 check.Assert(err, IsNil) 181 var defaultPolicyId string 182 for _, assignedPolicy := range allAssignedComputePolicies { 183 if assignedPolicy.VdcComputePolicyV2.ID == vcd.vdc.Vdc.DefaultComputePolicy.ID { 184 defaultPolicyId = assignedPolicy.VdcComputePolicyV2.ID 185 } 186 } 187 allAssignedComputePolicies, err = vcd.client.GetAllAssignedVdcComputePoliciesV2(adminVdc.AdminVdc.ID, nil) 188 check.Assert(err, IsNil) 189 for _, assignedPolicy := range allAssignedComputePolicies { 190 if assignedPolicy.VdcComputePolicyV2.ID == vcd.vdc.Vdc.DefaultComputePolicy.ID { 191 defaultPolicyId = assignedPolicy.VdcComputePolicyV2.ID 192 } 193 } 194 195 vdcComputePolicyHref, err := org.client.OpenApiBuildEndpoint(types.OpenApiPathVersion2_0_0, types.OpenApiEndpointVdcComputePolicies) 196 check.Assert(err, IsNil) 197 198 // Assign compute policies to VDC 199 policyReferences := types.VdcComputePolicyReferences{VdcComputePolicyReference: []*types.Reference{ 200 {HREF: vdcComputePolicyHref.String() + createdPolicy.VdcComputePolicyV2.ID}, 201 {HREF: vdcComputePolicyHref.String() + createdPolicy2.VdcComputePolicyV2.ID}, 202 {HREF: vdcComputePolicyHref.String() + defaultPolicyId}}} 203 204 assignedVdcComputePolicies, err := adminVdc.SetAssignedComputePolicies(policyReferences) 205 check.Assert(err, IsNil) 206 check.Assert(strings.SplitAfter(policyReferences.VdcComputePolicyReference[0].HREF, "vdcComputePolicy:")[1], Equals, 207 strings.SplitAfter(assignedVdcComputePolicies.VdcComputePolicyReference[0].HREF, "vdcComputePolicy:")[1]) 208 check.Assert(strings.SplitAfter(policyReferences.VdcComputePolicyReference[1].HREF, "vdcComputePolicy:")[1], Equals, 209 strings.SplitAfter(assignedVdcComputePolicies.VdcComputePolicyReference[1].HREF, "vdcComputePolicy:")[1]) 210 211 // Cleanup assigned compute policies 212 policyReferences = types.VdcComputePolicyReferences{VdcComputePolicyReference: []*types.Reference{ 213 {HREF: vdcComputePolicyHref.String() + defaultPolicyId}}} 214 215 _, err = adminVdc.SetAssignedComputePolicies(policyReferences) 216 check.Assert(err, IsNil) 217 218 err = createdPolicy.Delete() 219 check.Assert(err, IsNil) 220 err = createdPolicy2.Delete() 221 check.Assert(err, IsNil) 222 } 223 224 // Test_VdcVmPlacementPoliciesV2 is similar to Test_VdcComputePoliciesV2 but focused on VM Placement Policies 225 func (vcd *TestVCD) Test_VdcVmPlacementPoliciesV2(check *C) { 226 if vcd.skipAdminTests { 227 check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName())) 228 } 229 230 if vcd.config.VCD.NsxtProviderVdc.PlacementPolicyVmGroup == "" { 231 check.Skip("The configuration entry vcd.nsxt_provider_vdc.placementPolicyVmGroup is needed") 232 } 233 234 // We need the Provider VDC URN 235 pVdc, err := vcd.client.GetProviderVdcByName(vcd.config.VCD.NsxtProviderVdc.Name) 236 check.Assert(err, IsNil) 237 238 // We also need the VM Group to create a VM Placement Policy 239 vmGroup, err := vcd.client.GetVmGroupByNameAndProviderVdcUrn(vcd.config.VCD.NsxtProviderVdc.PlacementPolicyVmGroup, pVdc.ProviderVdc.ID) 240 check.Assert(err, IsNil) 241 check.Assert(vmGroup.VmGroup.Name, Equals, vcd.config.VCD.NsxtProviderVdc.PlacementPolicyVmGroup) 242 243 // We'll also use a Logical VM Group to create the VM Placement Policy 244 logicalVmGroup, err := vcd.client.CreateLogicalVmGroup(types.LogicalVmGroup{ 245 Name: check.TestName(), 246 NamedVmGroupReferences: types.OpenApiReferences{ 247 types.OpenApiReference{ 248 ID: fmt.Sprintf("%s:%s", vmGroupUrnPrefix, vmGroup.VmGroup.NamedVmGroupId), 249 Name: vmGroup.VmGroup.Name}, 250 }, 251 PvdcID: pVdc.ProviderVdc.ID, 252 }) 253 check.Assert(err, IsNil) 254 AddToCleanupList(logicalVmGroup.LogicalVmGroup.ID, "logicalVmGroup", "", check.TestName()) 255 256 // Create a new VDC Compute Policy (VM Placement Policy) 257 newComputePolicy := &VdcComputePolicyV2{ 258 client: &vcd.client.Client, 259 VdcComputePolicyV2: &types.VdcComputePolicyV2{ 260 VdcComputePolicy: types.VdcComputePolicy{ 261 Name: check.TestName() + "_empty", 262 Description: addrOf("VM Placement Policy created by " + check.TestName()), 263 }, 264 PolicyType: "VdcVmPolicy", 265 PvdcNamedVmGroupsMap: []types.PvdcNamedVmGroupsMap{ 266 { 267 NamedVmGroups: []types.OpenApiReferences{ 268 { 269 types.OpenApiReference{ 270 Name: vmGroup.VmGroup.Name, 271 ID: fmt.Sprintf("%s:%s", vmGroupUrnPrefix, vmGroup.VmGroup.NamedVmGroupId), 272 }, 273 }, 274 }, 275 Pvdc: types.OpenApiReference{ 276 Name: pVdc.ProviderVdc.Name, 277 ID: pVdc.ProviderVdc.ID, 278 }, 279 }, 280 }, 281 PvdcLogicalVmGroupsMap: []types.PvdcLogicalVmGroupsMap{ 282 { 283 LogicalVmGroups: types.OpenApiReferences{ 284 types.OpenApiReference{ 285 Name: logicalVmGroup.LogicalVmGroup.Name, 286 ID: logicalVmGroup.LogicalVmGroup.ID, 287 }, 288 }, 289 Pvdc: types.OpenApiReference{ 290 Name: pVdc.ProviderVdc.Name, 291 ID: pVdc.ProviderVdc.ID, 292 }, 293 }, 294 }, 295 }, 296 } 297 298 createdPolicy, err := vcd.client.CreateVdcComputePolicyV2(newComputePolicy.VdcComputePolicyV2) 299 check.Assert(err, IsNil) 300 301 AddToCleanupList(createdPolicy.VdcComputePolicyV2.ID, "vdcComputePolicy", "", check.TestName()) 302 303 check.Assert(createdPolicy.VdcComputePolicyV2.Name, Equals, newComputePolicy.VdcComputePolicyV2.Name) 304 check.Assert(*createdPolicy.VdcComputePolicyV2.Description, Equals, *newComputePolicy.VdcComputePolicyV2.Description) 305 check.Assert(createdPolicy.VdcComputePolicyV2.PvdcLogicalVmGroupsMap, DeepEquals, newComputePolicy.VdcComputePolicyV2.PvdcLogicalVmGroupsMap) 306 check.Assert(createdPolicy.VdcComputePolicyV2.PvdcNamedVmGroupsMap, DeepEquals, newComputePolicy.VdcComputePolicyV2.PvdcNamedVmGroupsMap) 307 308 // Update the VM Placement Policy 309 createdPolicy.VdcComputePolicyV2.Description = addrOf("Updated description") 310 updatedPolicy, err := createdPolicy.Update() 311 check.Assert(err, IsNil) 312 check.Assert(updatedPolicy.VdcComputePolicyV2, DeepEquals, createdPolicy.VdcComputePolicyV2) 313 314 // Delete the VM Placement Policy and check it doesn't exist anymore 315 err = createdPolicy.Delete() 316 check.Assert(err, IsNil) 317 deletedPolicy, err := vcd.client.GetVdcComputePolicyV2ById(createdPolicy.VdcComputePolicyV2.ID) 318 check.Assert(ContainsNotFound(err), Equals, true) 319 check.Assert(deletedPolicy, IsNil) 320 321 // Clean up 322 err = logicalVmGroup.Delete() 323 check.Assert(err, IsNil) 324 } 325 326 // Test_VdcDuplicatedVmPlacementPolicyGetsACleanError checks that when creating a duplicated VM Placement Policy, consumers 327 // of the SDK get a nicely formatted error. 328 // This test should not be needed once function `getFriendlyErrorIfVmPlacementPolicyAlreadyExists` is removed. 329 func (vcd *TestVCD) Test_VdcDuplicatedVmPlacementPolicyGetsACleanError(check *C) { 330 if vcd.client.Client.APIVCDMaxVersionIs(">= 37.2") { 331 check.Skip("The bug that this test checks for is fixed in 10.4.2") 332 } 333 if vcd.skipAdminTests { 334 check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName())) 335 } 336 337 if vcd.config.VCD.NsxtProviderVdc.PlacementPolicyVmGroup == "" { 338 check.Skip("The configuration entry vcd.nsxt_provider_vdc.placementPolicyVmGroup is needed") 339 } 340 341 // We need the Provider VDC URN 342 pVdc, err := vcd.client.GetProviderVdcByName(vcd.config.VCD.NsxtProviderVdc.Name) 343 check.Assert(err, IsNil) 344 345 // We also need the VM Group to create a VM Placement Policy 346 vmGroup, err := vcd.client.GetVmGroupByNameAndProviderVdcUrn(vcd.config.VCD.NsxtProviderVdc.PlacementPolicyVmGroup, pVdc.ProviderVdc.ID) 347 check.Assert(err, IsNil) 348 check.Assert(vmGroup.VmGroup.Name, Equals, vcd.config.VCD.NsxtProviderVdc.PlacementPolicyVmGroup) 349 350 // Create a new VDC Compute Policy (VM Placement Policy) 351 newComputePolicy := &VdcComputePolicyV2{ 352 client: &vcd.client.Client, 353 VdcComputePolicyV2: &types.VdcComputePolicyV2{ 354 VdcComputePolicy: types.VdcComputePolicy{ 355 Name: check.TestName(), 356 Description: addrOf("VM Placement Policy created by " + check.TestName()), 357 }, 358 PolicyType: "VdcVmPolicy", 359 PvdcNamedVmGroupsMap: []types.PvdcNamedVmGroupsMap{ 360 { 361 NamedVmGroups: []types.OpenApiReferences{ 362 { 363 types.OpenApiReference{ 364 Name: vmGroup.VmGroup.Name, 365 ID: fmt.Sprintf("%s:%s", vmGroupUrnPrefix, vmGroup.VmGroup.NamedVmGroupId), 366 }, 367 }, 368 }, 369 Pvdc: types.OpenApiReference{ 370 Name: pVdc.ProviderVdc.Name, 371 ID: pVdc.ProviderVdc.ID, 372 }, 373 }, 374 }, 375 }, 376 } 377 378 createdPolicy, err := vcd.client.CreateVdcComputePolicyV2(newComputePolicy.VdcComputePolicyV2) 379 check.Assert(err, IsNil) 380 check.Assert(createdPolicy, NotNil) 381 382 AddToCleanupList(createdPolicy.VdcComputePolicyV2.ID, "vdcComputePolicy", "", check.TestName()) 383 384 _, err = vcd.client.CreateVdcComputePolicyV2(newComputePolicy.VdcComputePolicyV2) 385 check.Assert(err, NotNil) 386 check.Assert(true, Equals, strings.Contains(err.Error(), "VM Placement Policy with name '"+check.TestName()+"' already exists")) 387 388 err = createdPolicy.Delete() 389 check.Assert(err, IsNil) 390 }