From 8759c794dd8eb74e62217186fbd772a47153727a Mon Sep 17 00:00:00 2001 From: sam Date: Thu, 12 Sep 2024 11:26:14 +0100 Subject: [PATCH] Add system acceptance tests --- internal/datasources/system/simulation.go | 12 ++ .../simulator/fixtures/systems/getByName.json | 1 + internal/simulator/system.go | 29 +++++ test/system/simulation.go | 9 ++ test/system/system_test.go | 121 ++++++++++++++++++ 5 files changed, 172 insertions(+) create mode 100644 internal/datasources/system/simulation.go create mode 100644 internal/simulator/fixtures/systems/getByName.json create mode 100644 internal/simulator/system.go create mode 100644 test/system/simulation.go create mode 100644 test/system/system_test.go diff --git a/internal/datasources/system/simulation.go b/internal/datasources/system/simulation.go new file mode 100644 index 0000000..b2cbaee --- /dev/null +++ b/internal/datasources/system/simulation.go @@ -0,0 +1,12 @@ +// (C) Copyright 2024 Hewlett Packard Enterprise Development LP +//go:build simulation + +package system + +import ( + "github.com/HewlettPackard/hpegl-pcbe-terraform-resources/internal/simulator" +) + +func init() { + simulator.System() +} diff --git a/internal/simulator/fixtures/systems/getByName.json b/internal/simulator/fixtures/systems/getByName.json new file mode 100644 index 0000000..8d425be --- /dev/null +++ b/internal/simulator/fixtures/systems/getByName.json @@ -0,0 +1 @@ +{"offset":0,"count":1,"items":[{"id":"126fd201-9e6e-5e31-9ffb-a766265b1fd3","generation":53033,"customerId":"bb20052ac81011ed895f7a6e2fba2c57","onPremAgentId":"AF-836032","name":"array-5305-grp","resourceUri":"/private-cloud-business/v1beta1/systems/126fd201-9e6e-5e31-9ffb-a766265b1fd3","type":"system","stackType":"DHCI","hypervisorClusters":[{"id":"acd4daea-e5e3-5f35-8be3-ce4a4b6d946c","name":"5305-CL","resourceUri":"/api/v1/hypervisor-clusters/acd4daea-e5e3-5f35-8be3-ce4a4b6d946c","hypervisorManagerId":"c47b89e9-3a66-4fb9-9a22-cdec3c51604d","hypervisorManagerName":"16.182.107.157","hypervisorManagerAddress":"16.182.107.157","hypervisorManagerAdminPasswordSecret":null},{"id":"87cb93a5-659b-5339-a91d-817459d482e3","name":"mclaren05","resourceUri":"/api/v1/hypervisor-clusters/87cb93a5-659b-5339-a91d-817459d482e3","hypervisorManagerId":"c47b89e9-3a66-4fb9-9a22-cdec3c51604d","hypervisorManagerName":"16.182.107.157","hypervisorManagerAddress":"16.182.107.157","hypervisorManagerAdminPasswordSecret":null},{"id":"298a299e-78f5-5acb-86ce-4e9fdc290ab7","name":"mclaren01","resourceUri":"/api/v1/hypervisor-clusters/298a299e-78f5-5acb-86ce-4e9fdc290ab7","hypervisorManagerId":"c47b89e9-3a66-4fb9-9a22-cdec3c51604d","hypervisorManagerName":"16.182.107.157","hypervisorManagerAddress":"16.182.107.157","hypervisorManagerAdminPasswordSecret":null},{"id":"7410577a-6503-5a2b-9cc7-523a7da4bcb9","name":"mclaren03","resourceUri":"/api/v1/hypervisor-clusters/7410577a-6503-5a2b-9cc7-523a7da4bcb9","hypervisorManagerId":"c47b89e9-3a66-4fb9-9a22-cdec3c51604d","hypervisorManagerName":"16.182.107.157","hypervisorManagerAddress":"16.182.107.157","hypervisorManagerAdminPasswordSecret":null},{"id":"71617591-2b06-5c9c-8393-dce7347ccb4a","name":"mclaren02","resourceUri":"/api/v1/hypervisor-clusters/71617591-2b06-5c9c-8393-dce7347ccb4a","hypervisorManagerId":"c47b89e9-3a66-4fb9-9a22-cdec3c51604d","hypervisorManagerName":"16.182.107.157","hypervisorManagerAddress":"16.182.107.157","hypervisorManagerAdminPasswordSecret":null},{"id":"ce08efe7-3ccf-56e7-95b0-7390d8f389a7","name":"mclaren04","resourceUri":"/api/v1/hypervisor-clusters/ce08efe7-3ccf-56e7-95b0-7390d8f389a7","hypervisorManagerId":"c47b89e9-3a66-4fb9-9a22-cdec3c51604d","hypervisorManagerName":"16.182.107.157","hypervisorManagerAddress":"16.182.107.157","hypervisorManagerAdminPasswordSecret":null},{"id":"fee25736-db8e-55a8-a2f3-06f5ae0e7923","name":"mclaren07","resourceUri":"/api/v1/hypervisor-clusters/fee25736-db8e-55a8-a2f3-06f5ae0e7923","hypervisorManagerId":"c47b89e9-3a66-4fb9-9a22-cdec3c51604d","hypervisorManagerName":"16.182.107.157","hypervisorManagerAddress":"16.182.107.157","hypervisorManagerAdminPasswordSecret":null}],"state":"ONLINE","health":{"servers":"WARNING","networks":"OK","storage":"CRITICAL","overallHealth":"CRITICAL"},"configAnalysisStatus":{"createdAt":"2024-07-30T08:08:13Z","nextScheduledRunTime":"2024-07-31T08:07:20.502Z","totalFailed":0,"totalPassed":66,"totalWarning":1,"createdBy":"ONPREM","ruleRunStartTime":"2024-07-30T08:07:20.484Z"},"softwareInfo":{"currentUpdateStatus":{"state":"NOT_READY"},"hypervisorClusters":[{"id":"acd4daea-e5e3-5f35-8be3-ce4a4b6d946c","name":"5305-CL","resourceUri":"/api/v1/hypervisor-clusters/acd4daea-e5e3-5f35-8be3-ce4a4b6d946c","type":"hypervisor-cluster","customerId":"bb20052ac81011ed895f7a6e2fba2c57","generation":1271,"currentUpdateStatus":{"state":"NOT_READY"},"currentSoftwareCatalog":{"version":"Unavailable","hypervisor":{"name":"ESXi","version":"8.0.1-21495797"},"hypervisorManager":{},"storageSoftware":{"name":"Nimble OS"},"serverFirmware":{},"storageConnectionManager":{"name":"HPE Storage Connection Manager","version":"7.0.2-700014"},"reasons":["Unable to fetch HPE Storage Software version. Cannot determine current catalog version"]},"unavailableSoftwareCatalogs":[{"version":"7.7.38.18.40","hypervisor":{"name":"ESXi 7U3 May 2024","releaseDate":"2024-05-29","version":"7.0.3-23794027","releaseNotesUrl":"https://support.hpe.com/hpesc/public/docDisplay?docId=sd00004409en_us\u0026docLocale=en_US"},"hypervisorManager":{},"storageSoftware":{"name":"Nimble OS","releaseDate":"2024-05-22","version":"6.1.2.500-1053701","releaseNotesUrl":"https://support.hpe.com/hpesc/public/docDisplay?docId=sd00004501en_us"},"serverFirmware":{"name":"Service Pack for ProLiant","releaseDate":"2024-05-27","version":"2024.04.00","releaseNotesUrl":"https://support.hpe.com/hpesc/public/docDisplay?docId=dp00004505en_us"},"storageConnectionManager":{"name":"Nimble Connection Manager","releaseDate":"2021-05-18","version":"7.0.2-700014","releaseNotesUrl":"https://infosight.hpe.com/InfoSight/media/cms/active/public/pubs_HPE_Storage_Connection_Manager_7_0_2_for_VMware_Release_Notes_7_0_2.pdf"},"releaseDate":"2024-06-06","reasons":["Current HPE Storage Software version has no direct update path to the version in the target catalog.","Current ESXi version has no direct update path to the version in the target catalog."]},{"version":"7.7.39.18.40","hypervisor":{"name":"ESXi 8U3 June 2024","releaseDate":"2024-06-24","version":"8.0.3-24022510","releaseNotesUrl":"https://support.hpe.com/hpesc/public/docDisplay?docId=sd00004661en_us\u0026docLocale=en_US"},"hypervisorManager":{},"storageSoftware":{"name":"Nimble OS","releaseDate":"2024-05-22","version":"6.1.2.500-1053701","releaseNotesUrl":"https://support.hpe.com/hpesc/public/docDisplay?docId=sd00004501en_us"},"serverFirmware":{"name":"Service Pack for ProLiant","releaseDate":"2024-05-27","version":"2024.04.00","releaseNotesUrl":"https://support.hpe.com/hpesc/public/docDisplay?docId=dp00004505en_us"},"storageConnectionManager":{"name":"Nimble Connection Manager","releaseDate":"2021-05-18","version":"7.0.2-700014","releaseNotesUrl":"https://infosight.hpe.com/InfoSight/media/cms/active/public/pubs_HPE_Storage_Connection_Manager_7_0_2_for_VMware_Release_Notes_7_0_2.pdf"},"releaseDate":"2024-06-25","reasons":["Current HPE Storage Software version has no direct update path to the version in the target catalog."]}]}],"precheckValidUntil":"0001-01-01T00:20:00Z"},"storageUsage":{"sizeInBytes":11522365489152,"usageInBytes":6855793},"storageSystem":{"id":"0072c65541fc2058ba000000000000000000000001","name":"array-5305-grp","resourceUri":"/api/v1/storage-systems/device-type2/0072c65541fc2058ba000000000000000000000001","groupName":"array-5305-grp","groupState":"initialized","groupLeaderName":"array-5305","groupLeaderSerialNumber":"AF-836032","dedupeRatio":3.9530692100524902,"compressionRatio":41.610069274902344,"serialNumber":"AF-836032","storageType":"Alletra","numberOfJbofs":0,"numberOfNodes":0,"numberOfCores":0},"associatedResourceCounts":{"hypervisorClusterCount":7,"datastoreCount":6,"vmCount":0,"serversCount":1,"switchesCount":0,"storageArrayCount":1},"computeUsage":{"cpuUsedMhz":178,"cpuCapacityMhz":63480,"memoryUsedBytes":6039797760,"memoryCapacityBytes":549481267200},"location":{"stateCode":"","zipCode":"","city":"","countryCode":"","latitude":"","longitude":""},"systemVms":null}],"total":1} diff --git a/internal/simulator/system.go b/internal/simulator/system.go new file mode 100644 index 0000000..c5981f5 --- /dev/null +++ b/internal/simulator/system.go @@ -0,0 +1,29 @@ +// (C) Copyright 2024 Hewlett Packard Enterprise Development LP + +package simulator + +import ( + _ "embed" + + "github.com/h2non/gock" +) + +// TODO: (API) Replace fake data with real data when possible +// +//go:embed fixtures/systems/getByName.json +var systemsByName string + +func simulateSystemGetByName() { + systemName := "array-5305-grp" + + gock.New("http://localhost"). + Get("/private-cloud-business/v1beta1/systems"). + MatchParam("filter", "name eq "+systemName). + Reply(200). + SetHeader("Content-Type", "application/json"). + BodyString(systemsByName) +} + +func System() { + simulateSystemGetByName() +} diff --git a/test/system/simulation.go b/test/system/simulation.go new file mode 100644 index 0000000..f8bc213 --- /dev/null +++ b/test/system/simulation.go @@ -0,0 +1,9 @@ +// (C) Copyright 2024 Hewlett Packard Enterprise Development LP +//go:build simulation +// +build simulation + +package acceptance + +func init() { + simulation = true +} diff --git a/test/system/system_test.go b/test/system/system_test.go new file mode 100644 index 0000000..872c409 --- /dev/null +++ b/test/system/system_test.go @@ -0,0 +1,121 @@ +// (C) Copyright 2024 Hewlett Packard Enterprise Development LP + +package acceptance + +import ( + "fmt" + "regexp" + "testing" + + "github.com/HewlettPackard/hpegl-pcbe-terraform-resources/internal/provider" + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-framework/providerserver" + "github.com/hashicorp/terraform-plugin-go/tfprotov6" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/terraform" +) + +const ( + providerConfig = ` +terraform { + required_providers { + hpegl = { + source = "github.com/HewlettPackard/hpegl-pcbe-terraform-resources" + } + } +} + +provider "hpegl" { + pc { + host = "http://localhost:8080" + token = "abcdefghijklmnopqrstuvwxyz-0123456789" + + http_dump = true + poll_interval = 0.001 + max_polls = 10 + } +} +` +) + +var simulation = false + +var testAccProtoV6ProviderFactories = map[string]func() ( + tfprotov6.ProviderServer, error, +){ + "scaffolding": providerserver.NewProtocol6WithError( + provider.New("test")(), + ), +} + +func checkUUIDAttr(resource string, attr string) func(*terraform.State) error { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resource] + if !ok { + return fmt.Errorf("resource not found: %s", resource) + } + + attrValue := rs.Primary.Attributes[attr] + _, err := uuid.Parse(attrValue) + + return err + } +} + +func TestAccSystemDataSource(t *testing.T) { + config := providerConfig + ` + data "hpegl_pc_system" "test" { + name = "array-5305-grp" + } + ` + + checks := []resource.TestCheckFunc{ + resource.TestCheckResourceAttr( + "data.hpegl_pc_system.test", + "name", + "array-5305-grp", + ), + checkUUIDAttr("data.hpegl_pc_system.test", "id"), + } + + if simulation { + // In simulation mode the ID value is known in advance + checks = append(checks, + resource.TestCheckResourceAttr( + "data.hpegl_pc_system.test", + "id", + "126fd201-9e6e-5e31-9ffb-a766265b1fd3", + ), + ) + } + + checkFn := resource.ComposeAggregateTestCheckFunc(checks...) + + resource.Test(t, resource.TestCase{ + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: []resource.TestStep{ + { + Config: config, + Check: checkFn, + }, + }, + }) +} + +func TestAccSystemDataSourceMissingName(t *testing.T) { + config := providerConfig + ` + data "hpegl_pc_system" "test" { + } + ` + expected := `The argument "name" is required, but no definition was found.` + resource.Test(t, resource.TestCase{ + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: []resource.TestStep{ + { + Config: config, + ExpectError: regexp.MustCompile(expected), + PlanOnly: true, + }, + }, + }) +}