diff --git a/internal/test/wem_directory_object_resource_test.go b/internal/test/wem_directory_object_resource_test.go new file mode 100644 index 0000000..410e645 --- /dev/null +++ b/internal/test/wem_directory_object_resource_test.go @@ -0,0 +1,89 @@ +// Copyright © 2024. Citrix Systems, Inc. + +package test + +import ( + "fmt" + "os" + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" +) + +func TestDirectoryObject(t *testing.T) { + zoneInput := os.Getenv("TEST_ZONE_INPUT_AZURE") + + resource.Test(t, resource.TestCase{ + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + PreCheck: func() { + TestProviderPreCheck(t) + TestHypervisorPreCheck_Azure(t) + TestHypervisorResourcePoolPreCheck_Azure(t) + TestMachineCatalogPreCheck_Azure(t) + TestWemSiteResourcePreCheck(t) + }, + Steps: []resource.TestStep{ + // Create and read test + { + Config: composeTestResourceTf( + BuildDirectoryObjectResource(t, wem_directory_object_test_resource), + BuildWemSiteResource(t), + BuildMachineCatalogResourceWorkgroup(t, machinecatalog_testResources_workgroup), + BuildHypervisorResourcePoolResourceAzure(t, hypervisor_resource_pool_testResource_azure), + BuildHypervisorResourceAzure(t, hypervisor_testResources), + BuildZoneResource(t, zoneInput, false), + ), + Check: resource.ComposeAggregateTestCheckFunc( + // Verify if the directory object is created and enabled + resource.TestCheckResourceAttr("citrix_wem_directory_object.test_wem_directory", "enabled", "true"), + ), + }, + // Import test + { + ResourceName: "citrix_wem_directory_object.test_wem_directory", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{}, + }, + // Update and Read test + { + Config: composeTestResourceTf( + BuildDirectoryObjectResource(t, wem_directory_object_test_resource_updated), + BuildWemSiteResource(t), + BuildMachineCatalogResourceWorkgroup(t, machinecatalog_testResources_workgroup), + BuildHypervisorResourcePoolResourceAzure(t, hypervisor_resource_pool_testResource_azure), + BuildHypervisorResourceAzure(t, hypervisor_testResources), + BuildZoneResource(t, zoneInput, false), + ), + Check: resource.ComposeAggregateTestCheckFunc( + // Verify if the directory object is disabled + resource.TestCheckResourceAttr("citrix_wem_directory_object.test_wem_directory", "enabled", "false"), + ), + }, + }, + }) +} + +func BuildDirectoryObjectResource(t *testing.T, directoryResource string) string { + return fmt.Sprintf(directoryResource) +} + +var ( + wem_directory_object_test_resource = ` + resource "citrix_wem_directory_object" "test_wem_directory" { + configuration_set_id = citrix_wem_configuration_set.test_wem_site.id + machine_catalog_id = citrix_machine_catalog.testMachineCatalog-WG.id + enabled = true + } + ` +) + +var ( + wem_directory_object_test_resource_updated = ` + resource "citrix_wem_directory_object" "test_wem_directory" { + configuration_set_id = citrix_wem_configuration_set.test_wem_site.id + machine_catalog_id = citrix_machine_catalog.testMachineCatalog-WG.id + enabled = false + } + ` +) diff --git a/internal/util/resource.go b/internal/util/resource.go index cdbde6a..c59cf24 100644 --- a/internal/util/resource.go +++ b/internal/util/resource.go @@ -47,7 +47,7 @@ func GetHypervisorResourcePool(ctx context.Context, client *citrixdaasclient.Cit } func GetMachineCatalog(ctx context.Context, client *citrixdaasclient.CitrixDaasClient, diagnostics *diag.Diagnostics, machineCatalogId string, addErrorToDiagnostics bool) (*citrixorchestration.MachineCatalogDetailResponseModel, error) { - getMachineCatalogRequest := client.ApiClient.MachineCatalogsAPIsDAAS.MachineCatalogsGetMachineCatalog(ctx, machineCatalogId).Fields("Id,Name,Description,ProvisioningType,Zone,AllocationType,SessionSupport,TotalCount,HypervisorConnection,ProvisioningScheme,RemotePCEnrollmentScopes,IsPowerManaged,MinimumFunctionalLevel,IsRemotePC,Metadata,Scopes,AdminScope") + getMachineCatalogRequest := client.ApiClient.MachineCatalogsAPIsDAAS.MachineCatalogsGetMachineCatalog(ctx, machineCatalogId).Fields("Id,Name,Description,ProvisioningType,Zone,AllocationType,SessionSupport,TotalCount,HypervisorConnection,ProvisioningScheme,RemotePCEnrollmentScopes,IsPowerManaged,MinimumFunctionalLevel,IsRemotePC,Metadata,Scopes,AdminFolder") catalog, httpResp, err := citrixdaasclient.ExecuteWithRetry[*citrixorchestration.MachineCatalogDetailResponseModel](getMachineCatalogRequest, client) if err != nil && addErrorToDiagnostics { diagnostics.AddError( diff --git a/internal/wem/wem_machine_ad_object/wem_directory_object_resource.go b/internal/wem/wem_machine_ad_object/wem_directory_object_resource.go index 81bc69f..881a805 100644 --- a/internal/wem/wem_machine_ad_object/wem_directory_object_resource.go +++ b/internal/wem/wem_machine_ad_object/wem_directory_object_resource.go @@ -169,7 +169,7 @@ func (w *wemDirectoryResource) Read(ctx context.Context, req resource.ReadReques } // Get WEM Directory object by ID - machineADObject, err := getMachineADObjectById(ctx, w.client, state.Id.ValueString()) + machineADObject, err := readDirectoryObject(ctx, w.client, resp, state.Id.ValueString()) if err != nil { return } diff --git a/internal/wem/wem_machine_ad_object/wem_directory_object_utils.go b/internal/wem/wem_machine_ad_object/wem_directory_object_utils.go index 532cdda..36f2068 100644 --- a/internal/wem/wem_machine_ad_object/wem_directory_object_utils.go +++ b/internal/wem/wem_machine_ad_object/wem_directory_object_utils.go @@ -11,11 +11,20 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource" ) +func readDirectoryObject(ctx context.Context, client *citrixdaasclient.CitrixDaasClient, resp *resource.ReadResponse, machineADObjectId string) (*citrixwemservice.MachineModel, error) { + idInt64, err := strconv.ParseInt(machineADObjectId, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid WEM Directory object ID: %v", err) + } + machineADObjectQueryRequest := client.WemClient.MachineADObjectDAAS.AdObjectQueryById(ctx, idInt64) + machineADObjectQueryResponse, _, err := util.ReadResource[*citrixwemservice.MachineModel](machineADObjectQueryRequest, ctx, client, resp, "Catalog Directory Object", machineADObjectId) + return machineADObjectQueryResponse, err +} + func getMachineADObjectBySid(ctx context.Context, client *citrixdaasclient.CitrixDaasClient, machineCatalogId string) (citrixwemservice.MachineModel, error) { - var resp *resource.ReadResponse machineADObjectQueryRequest := client.WemClient.MachineADObjectDAAS.AdObjectQuery(ctx) machineADObjectQueryRequest = machineADObjectQueryRequest.Sid(machineCatalogId) - machineADObjectQueryResponse, httpResp, err := util.ReadResource[*citrixwemservice.AdObjectQuery200Response](machineADObjectQueryRequest, ctx, client, resp, "Sid", machineCatalogId) + machineADObjectQueryResponse, httpResp, err := citrixdaasclient.ExecuteWithRetry[*citrixwemservice.AdObjectQuery200Response](machineADObjectQueryRequest, client) var machineADObject citrixwemservice.MachineModel machineADObjectList := machineADObjectQueryResponse.GetItems() @@ -36,13 +45,12 @@ func getMachineADObjectBySid(ctx context.Context, client *citrixdaasclient.Citri } func getMachineADObjectById(ctx context.Context, client *citrixdaasclient.CitrixDaasClient, machineADObjectId string) (*citrixwemservice.MachineModel, error) { - var resp *resource.ReadResponse idInt64, err := strconv.ParseInt(machineADObjectId, 10, 64) if err != nil { return nil, fmt.Errorf("invalid WEM Directory object ID: %v", err) } machineADObjectQueryRequest := client.WemClient.MachineADObjectDAAS.AdObjectQueryById(ctx, idInt64) - machineADObjectQueryResponse, httpResp, err := util.ReadResource[*citrixwemservice.MachineModel](machineADObjectQueryRequest, ctx, client, resp, "Id", machineADObjectId) + machineADObjectQueryResponse, httpResp, err := citrixdaasclient.ExecuteWithRetry[*citrixwemservice.MachineModel](machineADObjectQueryRequest, client) if err != nil { err = fmt.Errorf("TransactionId: " + citrixdaasclient.GetTransactionIdFromHttpResponse(httpResp) + "\nError message: " + util.ReadClientError(err)) diff --git a/internal/wem/wem_site/wem_site_service_resource.go b/internal/wem/wem_site/wem_site_service_resource.go index d413068..21486e0 100644 --- a/internal/wem/wem_site/wem_site_service_resource.go +++ b/internal/wem/wem_site/wem_site_service_resource.go @@ -168,7 +168,7 @@ func (w *wemSiteServiceResource) Read(ctx context.Context, req resource.ReadRequ } // Get site from remote using site Id - siteConfig, err := getSiteById(ctx, w.client, state) + siteConfig, err := readConfigurationSet(ctx, w.client, resp, state) if err != nil { return } diff --git a/internal/wem/wem_site/wem_site_service_utils.go b/internal/wem/wem_site/wem_site_service_utils.go index 52181a0..4bb1600 100644 --- a/internal/wem/wem_site/wem_site_service_utils.go +++ b/internal/wem/wem_site/wem_site_service_utils.go @@ -13,12 +13,21 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource" ) +func readConfigurationSet(ctx context.Context, client *citrixdaasclient.CitrixDaasClient, resp *resource.ReadResponse, wemResource WemSiteResourceModel) (*citrixwemservice.SiteModel, error) { + idInt64, err := strconv.ParseInt(wemResource.Id.ValueString(), 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid id: %v", err) + } + siteGetRequest := client.WemClient.SiteDAAS.SiteQueryById(ctx, idInt64) + siteGetResponse, _, err := util.ReadResource[*citrixwemservice.SiteModel](siteGetRequest, ctx, client, resp, "Configuration Set", wemResource.Name.ValueString()) + return siteGetResponse, err +} + func getSiteByName(ctx context.Context, client *citrixdaasclient.CitrixDaasClient, wemResource WemSiteResourceModel) (citrixwemservice.SiteModel, error) { - var resp *resource.ReadResponse siteName := wemResource.Name.ValueString() siteGetRequest := client.WemClient.SiteDAAS.SiteQuery(ctx) siteGetRequest = siteGetRequest.Name(siteName) - siteGetResponse, httpResp, err := util.ReadResource[*citrixwemservice.SiteQuery200Response](siteGetRequest, ctx, client, resp, "Name", siteName) + siteGetResponse, httpResp, err := citrixdaasclient.ExecuteWithRetry[*citrixwemservice.SiteQuery200Response](siteGetRequest, client) siteConfigList := siteGetResponse.GetItems() var siteConfig citrixwemservice.SiteModel @@ -38,14 +47,12 @@ func getSiteByName(ctx context.Context, client *citrixdaasclient.CitrixDaasClien } func getSiteById(ctx context.Context, client *citrixdaasclient.CitrixDaasClient, wemResource WemSiteResourceModel) (*citrixwemservice.SiteModel, error) { - var resp *resource.ReadResponse - siteId := wemResource.Id.ValueString() idInt64, err := strconv.ParseInt(wemResource.Id.ValueString(), 10, 64) if err != nil { return &citrixwemservice.SiteModel{}, fmt.Errorf("invalid id: %v", err) } siteGetRequest := client.WemClient.SiteDAAS.SiteQueryById(ctx, idInt64) - siteGetResponse, httpResp, err := util.ReadResource[*citrixwemservice.SiteModel](siteGetRequest, ctx, client, resp, "Id", siteId) + siteGetResponse, httpResp, err := citrixdaasclient.ExecuteWithRetry[*citrixwemservice.SiteModel](siteGetRequest, client) if err != nil { err = fmt.Errorf("TransactionId: " + citrixdaasclient.GetTransactionIdFromHttpResponse(httpResp) + "\nError message: " + util.ReadClientError(err))