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  }