Skip to content

Commit

Permalink
Merge pull request #262 from HewlettPackard/add_controller
Browse files Browse the repository at this point in the history
Add storage controller
  • Loading branch information
reubenur-rahman authored Oct 21, 2024
2 parents 8571fb5 + a0e4ef1 commit 6dbb76e
Show file tree
Hide file tree
Showing 14 changed files with 271 additions and 80 deletions.
6 changes: 6 additions & 0 deletions acc-testcases/data-sources/instance_storage_controller.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
acc:
- config: |
instance_id = 23989
controller_type = "scsi"
bus_number = 0
interface_number = 3
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# (C) Copyright 2024 Hewlett Packard Enterprise Development LP

variable "instance_id" {
type = number
default = 0
}
data "hpegl_vmaas_instance_storage_controller" "scsi3" {
instance_id = var.instance_id
controller_type = "scsi"
bus_number = 0
interface_number = 3
}
1 change: 1 addition & 0 deletions examples/resources/hpegl_vmaas_instance/all_options.tf
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ resource "hpegl_vmaas_instance" "tf_instance" {
size = 5
datastore_id = data.hpegl_vmaas_datastore.c_3par.id
storage_type = data.hpegl_vmaas_instance_disk_type.vmware_thin.id
controller = data.hpegl_vmaas_instance_storage_controller.scsi3.id
}

labels = ["test_label"]
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/HewlettPackard/hpegl-vmaas-terraform-resources
go 1.21

require (
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.12
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.13-0.20241016094043-89a5da4e4709
github.com/golang/mock v1.6.0
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320
github.com/hashicorp/terraform-plugin-docs v0.9.0
Expand Down
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.12 h1:AVRTfWXyDYEa5FdTVSDBH2MHw7Fy5X3W4mv89cnAwHc=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.12/go.mod h1:tsKOAAbEQnpXAzqjcZUGzRiVp9QfRViKoTOdIltIMFI=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.13-0.20241016073418-78c0fcb75742 h1:qRP+rf594Bf5g0WBLW7N2C93erLu1dcbgNASPB4+++k=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.13-0.20241016073418-78c0fcb75742/go.mod h1:tsKOAAbEQnpXAzqjcZUGzRiVp9QfRViKoTOdIltIMFI=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.13-0.20241016092256-a5234ae572d2 h1:XpcPA8Uth4fJakF+5Rz1YuCdQckQFtenQw5IviUDvio=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.13-0.20241016092256-a5234ae572d2/go.mod h1:tsKOAAbEQnpXAzqjcZUGzRiVp9QfRViKoTOdIltIMFI=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.13-0.20241016094043-89a5da4e4709 h1:6Lf6eOzF4GvemTSc06E1pyoM7+mtgzddVVEEIZoxW48=
github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk v0.1.13-0.20241016094043-89a5da4e4709/go.mod h1:tsKOAAbEQnpXAzqjcZUGzRiVp9QfRViKoTOdIltIMFI=
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// (C) Copyright 2024 Hewlett Packard Enterprise Development LP

package acceptancetest

import (
"testing"

api_client "github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk/pkg/client"
"github.com/HewlettPackard/hpegl-vmaas-terraform-resources/pkg/atf"
)

func TestAccDataSourceInstanceStorageController(t *testing.T) {
acc := &atf.Acc{
PreCheck: testAccPreCheck,
Providers: testAccProviders,
ResourceName: "hpegl_vmaas_instance_storage_controller",
GetAPI: func(attr map[string]string) (interface{}, error) {
cl, cfg := getAPIClient()
iClient := api_client.InstancesAPIService{
Client: cl,
Cfg: cfg,
}

return iClient.GetStorageControllerMount(getAccContext(), toInt(attr["instance_id"]), attr["controller_type"], toInt(attr["bus_number"]), toInt(attr["interface_number"]))
},
}

acc.RunDataSourceTests(t)
}
14 changes: 8 additions & 6 deletions internal/cmp/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ type Client struct {
DSPoolMemeberGroup DataSource
DSDhcpServer DataSource
InstanceStorageType DataSource
InstanceStorageController DataSource
}

// NewClient returns configured client
Expand Down Expand Up @@ -109,11 +110,12 @@ func NewClient(client *apiClient.APIClient, cfg apiClient.Configuration) *Client
DSDhcpServer: newDHCPServerDS(
&apiClient.DhcpServerAPIService{Client: client, Cfg: cfg},
&apiClient.RouterAPIService{Client: client, Cfg: cfg}),
DSLBVirtualServerSslCert: newLBsslVirtualServerCertDS(&apiClient.LoadBalancerAPIService{Client: client, Cfg: cfg}),
DSDomain: newDomain(&apiClient.DomainAPIService{Client: client, Cfg: cfg}),
NetworkProxy: newNetworkProxy(&apiClient.NetworksAPIService{Client: client, Cfg: cfg}),
TransportZone: newTransportZone(&apiClient.RouterAPIService{Client: client, Cfg: cfg}),
EdgeCluster: newEdgeCluster(&apiClient.RouterAPIService{Client: client, Cfg: cfg}),
InstanceStorageType: newInstanceStorageType(&apiClient.InstancesAPIService{Client: client, Cfg: cfg}),
DSLBVirtualServerSslCert: newLBsslVirtualServerCertDS(&apiClient.LoadBalancerAPIService{Client: client, Cfg: cfg}),
DSDomain: newDomain(&apiClient.DomainAPIService{Client: client, Cfg: cfg}),
NetworkProxy: newNetworkProxy(&apiClient.NetworksAPIService{Client: client, Cfg: cfg}),
TransportZone: newTransportZone(&apiClient.RouterAPIService{Client: client, Cfg: cfg}),
EdgeCluster: newEdgeCluster(&apiClient.RouterAPIService{Client: client, Cfg: cfg}),
InstanceStorageType: newInstanceStorageType(&apiClient.InstancesAPIService{Client: client, Cfg: cfg}),
InstanceStorageController: newInstanceStorageController(&apiClient.InstancesAPIService{Client: client, Cfg: cfg}),
}
}
34 changes: 19 additions & 15 deletions internal/cmp/instance_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,11 +214,12 @@ func instanceGetVolume(volumes []map[string]interface{}) []models.CreateInstance
volumesModel := make([]models.CreateInstanceBodyVolumes, 0, len(volumes))
for i := range volumes {
volumesModel = append(volumesModel, models.CreateInstanceBodyVolumes{
ID: -1,
Name: volumes[i]["name"].(string),
Size: volumes[i]["size"].(int),
DatastoreID: volumes[i]["datastore_id"],
StorageType: volumes[i]["storage_type"].(int),
ID: -1,
Name: volumes[i]["name"].(string),
Size: volumes[i]["size"].(int),
DatastoreID: volumes[i]["datastore_id"],
StorageType: volumes[i]["storage_type"].(int),
ControllerMountPoint: volumes[i]["controller"].(string),
})
}
volumesModel[0].RootVolume = true
Expand All @@ -231,11 +232,12 @@ func instanceResizeVolume(volumes []map[string]interface{}) []models.ResizeInsta
volumesModel := make([]models.ResizeInstanceBodyInstanceVolumes, 0, len(volumes))
for i := range volumes {
volumesModel = append(volumesModel, models.ResizeInstanceBodyInstanceVolumes{
ID: utils.JSONNumber(volumes[i]["id"]),
Name: volumes[i]["name"].(string),
Size: volumes[i]["size"].(int),
DatastoreID: volumes[i]["datastore_id"],
StorageType: volumes[i]["storage_type"].(int),
ID: utils.JSONNumber(volumes[i]["id"]),
Name: volumes[i]["name"].(string),
Size: volumes[i]["size"].(int),
DatastoreID: volumes[i]["datastore_id"],
StorageType: volumes[i]["storage_type"].(int),
ControllerMountPoint: volumes[i]["controller"].(string),
})
}

Expand Down Expand Up @@ -281,6 +283,7 @@ func instanceSetVolume(volumes []models.GetInstanceResponseInstanceVolumes) []mo
DatastoreID: volumes[i].DatastoreID.(string),
Root: volumes[i].RootVolume,
StorageType: volumes[i].StorageType,
Controller: volumes[i].ControllerMountPoint,
})
}

Expand Down Expand Up @@ -402,11 +405,12 @@ func instanceCloneCompareVolume(
// convert schema volume to model
for _, vol := range vSchemas {
newVolumes = append(newVolumes, models.CreateInstanceBodyVolumes{
ID: -1,
Size: vol["size"].(int),
Name: vol["name"].(string),
DatastoreID: vol["datastore_id"],
StorageType: vol["storage_type"].(int),
ID: -1,
Size: vol["size"].(int),
Name: vol["name"].(string),
DatastoreID: vol["datastore_id"],
StorageType: vol["storage_type"].(int),
ControllerMountPoint: vol["controller"].(string),
})
}

Expand Down
52 changes: 52 additions & 0 deletions internal/cmp/instance_storage_controller_data_source.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// (C) Copyright 2024 Hewlett Packard Enterprise Development LP

package cmp

import (
"context"
"fmt"
"log"
"slices"
"strings"

"github.com/HewlettPackard/hpegl-vmaas-cmp-go-sdk/pkg/client"
"github.com/HewlettPackard/hpegl-vmaas-terraform-resources/internal/utils"
)

type instanceStorageController struct {
iClient *client.InstancesAPIService
}

func newInstanceStorageController(instanceClient *client.InstancesAPIService) *instanceStorageController {
return &instanceStorageController{iClient: instanceClient}
}

func (i *instanceStorageController) Read(ctx context.Context, d *utils.Data, meta interface{}) error {
setMeta(meta, i.iClient.Client)
log.Printf("[DEBUG] Get Instance Storage Controller")
instanceID := d.GetInt("instance_id")
if instanceID == 0 {
return nil
}
controllerType := d.GetString("controller_type")
busNumber := d.GetInt("bus_number")
unitNumber := d.GetInt("interface_number")

// Pre check
if err := d.Error(); err != nil {
return err
}
controllerType = strings.TrimSpace(strings.ToLower(controllerType))
supportedControllerType := []string{"ide", "scsi"}
if !slices.Contains(supportedControllerType, controllerType) {
err := fmt.Errorf("storage controller '%s' is not supported", controllerType)
return err
}
controllerMount, err := i.iClient.GetStorageControllerMount(ctx, instanceID, controllerType, busNumber, unitNumber)
if err != nil {
return err
}
d.SetID(controllerMount)

return nil
}
57 changes: 29 additions & 28 deletions internal/resources/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,35 @@ package resources

const (
// datasource key
DSNetwork = "hpegl_vmaas_network"
DSNetworkType = "hpegl_vmaas_network_type"
DSNetworkPool = "hpegl_vmaas_network_pool"
DSNetworkProxy = "hpegl_vmaas_network_proxy"
DSNetworkDomain = "hpegl_vmaas_network_domain"
DSLayout = "hpegl_vmaas_layout"
DSGroup = "hpegl_vmaas_group"
DSPlan = "hpegl_vmaas_plan"
DSCloud = "hpegl_vmaas_cloud"
DSResourcePool = "hpegl_vmaas_resource_pool"
DSDatastore = "hpegl_vmaas_datastore"
DSPowerSchedule = "hpegl_vmaas_power_schedule"
DSTemplate = "hpegl_vmaas_template"
DSEnvironment = "hpegl_vmaas_environment"
DSNetworkInterface = "hpegl_vmaas_network_interface"
DSCloudFolder = "hpegl_vmaas_cloud_folder"
DSRouter = "hpegl_vmaas_router"
DSEdgeCluster = "hpegl_vmaas_edge_cluster"
DSTransportZone = "hpegl_vmaas_transport_zone"
DSLoadBalancer = "hpegl_vmaas_load_balancer"
DSPoolMemeberGroup = "hpegl_vmaas_lb_pool_member_group"
DSLBMonitor = "hpegl_vmaas_load_balancer_monitor"
DSLBProfile = "hpegl_vmaas_load_balancer_profile"
DSLBPool = "hpegl_vmaas_load_balancer_pool"
DSLBVirtualServer = "hpegl_vmaas_load_balancer_virtual_server"
DSLBVirtualServerSslCert = "hpegl_vmaas_load_balancer_virtual_server_ssl_cert"
DSDhcpServer = "hpegl_vmaas_dhcp_server"
DSInstanceStorageType = "hpegl_vmaas_instance_disk_type"
DSNetwork = "hpegl_vmaas_network"
DSNetworkType = "hpegl_vmaas_network_type"
DSNetworkPool = "hpegl_vmaas_network_pool"
DSNetworkProxy = "hpegl_vmaas_network_proxy"
DSNetworkDomain = "hpegl_vmaas_network_domain"
DSLayout = "hpegl_vmaas_layout"
DSGroup = "hpegl_vmaas_group"
DSPlan = "hpegl_vmaas_plan"
DSCloud = "hpegl_vmaas_cloud"
DSResourcePool = "hpegl_vmaas_resource_pool"
DSDatastore = "hpegl_vmaas_datastore"
DSPowerSchedule = "hpegl_vmaas_power_schedule"
DSTemplate = "hpegl_vmaas_template"
DSEnvironment = "hpegl_vmaas_environment"
DSNetworkInterface = "hpegl_vmaas_network_interface"
DSCloudFolder = "hpegl_vmaas_cloud_folder"
DSRouter = "hpegl_vmaas_router"
DSEdgeCluster = "hpegl_vmaas_edge_cluster"
DSTransportZone = "hpegl_vmaas_transport_zone"
DSLoadBalancer = "hpegl_vmaas_load_balancer"
DSPoolMemeberGroup = "hpegl_vmaas_lb_pool_member_group"
DSLBMonitor = "hpegl_vmaas_load_balancer_monitor"
DSLBProfile = "hpegl_vmaas_load_balancer_profile"
DSLBPool = "hpegl_vmaas_load_balancer_pool"
DSLBVirtualServer = "hpegl_vmaas_load_balancer_virtual_server"
DSLBVirtualServerSslCert = "hpegl_vmaas_load_balancer_virtual_server_ssl_cert"
DSDhcpServer = "hpegl_vmaas_dhcp_server"
DSInstanceStorageType = "hpegl_vmaas_instance_disk_type"
DSInstanceStorageController = "hpegl_vmaas_instance_storage_controller"

DSMorpheusDataSource = "hpegl_vmaas_morpheus_details"

Expand Down
63 changes: 63 additions & 0 deletions internal/resources/data_source_instance_storage_controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// (C) Copyright 2024 Hewlett Packard Enterprise Development LP

package resources

import (
"context"

"github.com/HewlettPackard/hpegl-vmaas-terraform-resources/internal/utils"
"github.com/HewlettPackard/hpegl-vmaas-terraform-resources/pkg/client"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func ReadInstanceStorageController() *schema.Resource {
return &schema.Resource{
Schema: map[string]*schema.Schema{
"instance_id": {
Type: schema.TypeInt,
Required: true,
Description: "Unique ID to identify an instance",
},
"controller_type": {
Type: schema.TypeString,
Required: true,
Description: "The storage controller name displayed in an instance. Supported values are `IDE`, `SCSI`",
},
"bus_number": {
Type: schema.TypeInt,
Required: true,
Description: "The Bus sequence for a storage controller type",
},
"interface_number": {
Type: schema.TypeInt,
Required: true,
Description: "The interface number to be allocated",
},
},
ReadContext: readInstanceStorageControllerContext,
Description: `The ` + DSInstanceStorageController + ` data source can be used to discover the ID of a storage controller mount.
This can then be used with resources or data sources that require a ` + DSInstanceStorageType + `,
such as the ` + ResInstance + ` resource.`,
SchemaVersion: 0,
StateUpgraders: nil,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
}
}

func readInstanceStorageControllerContext(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
c, err := client.GetClientFromMetaMap(meta)
if err != nil {
return diag.FromErr(err)
}

data := utils.NewData(d)
err = c.CmpClient.InstanceStorageController.Read(ctx, data, meta)
if err != nil {
return diag.FromErr(err)
}

return nil
}
9 changes: 8 additions & 1 deletion internal/resources/resource_instances_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,14 @@ func getInstanceDefaultSchema(isClone bool) *schema.Resource {
Optional: true,
Description: `Storage type ID can be obtained from hpegl_vmaas_instance_disk_type
data source.`,
DiffSuppressFunc: utils.SkipField(),
DiffSuppressFunc: utils.SkipEmptyField(),
},
"controller": {
Type: schema.TypeString,
Optional: true,
Description: `Storage controller ID can be obtained from hpegl_vmaas_instance_storage_controller
data source.`,
DiffSuppressFunc: utils.SkipEmptyField(),
},
"id": {
Computed: true,
Expand Down
9 changes: 8 additions & 1 deletion internal/utils/validate.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package utils

// (C) Copyright 2021 Hewlett Packard Enterprise Development LP
// (C) Copyright 2021-2024 Hewlett Packard Enterprise Development LP

import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand All @@ -11,3 +11,10 @@ func SkipField() schema.SchemaDiffSuppressFunc {
return old != ""
}
}

// SkipEmptyField it to skip diff check when user didn't set any attribute in tf file but state file is updated
func SkipEmptyField() schema.SchemaDiffSuppressFunc {
return func(k, old, new string, d *schema.ResourceData) bool {
return new == "" || new == "0"
}
}
Loading

0 comments on commit 6dbb76e

Please sign in to comment.