Skip to content

Commit 3512f1b

Browse files
jeanjean
authored andcommitted
feat: Add service_offering_details support for GPU configuration
- Add service_offering_details attribute to cloudstack_service_offering resource - Support for GPU configuration with pciDevice and vgpuType parameters - Include comprehensive test coverage and documentation - Add practical examples for GPU service offerings - Addresses issue #246
1 parent e53f30c commit 3512f1b

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

cloudstack/resource_cloudstack_service_offering.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,15 @@ func resourceCloudStackServiceOffering() *schema.Resource {
140140
Type: schema.TypeString,
141141
Optional: true,
142142
},
143+
"service_offering_details": {
144+
Description: "Service offering details for GPU configuration and other advanced settings",
145+
Type: schema.TypeMap,
146+
Optional: true,
147+
ForceNew: true,
148+
Elem: &schema.Schema{
149+
Type: schema.TypeString,
150+
},
151+
},
143152
},
144153
}
145154
}
@@ -216,6 +225,14 @@ func resourceCloudStackServiceOfferingCreate(d *schema.ResourceData, meta interf
216225
p.SetTags(v.(string))
217226
}
218227

228+
if details, ok := d.GetOk("service_offering_details"); ok {
229+
serviceOfferingDetails := make(map[string]string)
230+
for k, v := range details.(map[string]interface{}) {
231+
serviceOfferingDetails[k] = v.(string)
232+
}
233+
p.SetServiceofferingdetails(serviceOfferingDetails)
234+
}
235+
219236
log.Printf("[DEBUG] Creating Service Offering %s", name)
220237
s, err := cs.ServiceOffering.CreateServiceOffering(p)
221238

@@ -264,6 +281,7 @@ func resourceCloudStackServiceOfferingRead(d *schema.ResourceData, meta interfac
264281
"max_memory": getIntFromDetails(s.Serviceofferingdetails, "maxmemory"),
265282
"encrypt_root": s.Encryptroot,
266283
"storage_tags": s.Storagetags,
284+
"service_offering_details": getServiceOfferingDetails(s.Serviceofferingdetails),
267285
}
268286

269287
for k, v := range fields {
@@ -381,3 +399,28 @@ func getIntFromDetails(details map[string]string, key string) interface{} {
381399
}
382400
return nil
383401
}
402+
403+
// getServiceOfferingDetails extracts custom service offering details while excluding
404+
// built-in details that are handled as separate schema fields
405+
func getServiceOfferingDetails(details map[string]string) map[string]interface{} {
406+
if details == nil {
407+
return make(map[string]interface{})
408+
}
409+
410+
// List of built-in details that are handled as separate schema fields
411+
builtInKeys := map[string]bool{
412+
"mincpunumber": true,
413+
"maxcpunumber": true,
414+
"minmemory": true,
415+
"maxmemory": true,
416+
}
417+
418+
result := make(map[string]interface{})
419+
for k, v := range details {
420+
if !builtInKeys[k] {
421+
result[k] = v
422+
}
423+
}
424+
425+
return result
426+
}

cloudstack/resource_cloudstack_service_offering_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,39 @@ resource "cloudstack_service_offering" "custom" {
122122
storage_tags = "production,ssd"
123123
}
124124
`
125+
126+
func TestAccCloudStackServiceOffering_gpu(t *testing.T) {
127+
var so cloudstack.ServiceOffering
128+
resource.Test(t, resource.TestCase{
129+
PreCheck: func() { testAccPreCheck(t) },
130+
Providers: testAccProviders,
131+
Steps: []resource.TestStep{
132+
{
133+
Config: testAccCloudStackServiceOffering_gpu,
134+
Check: resource.ComposeTestCheckFunc(
135+
testAccCheckCloudStackServiceOfferingExists("cloudstack_service_offering.gpu", &so),
136+
resource.TestCheckResourceAttr("cloudstack_service_offering.gpu", "name", "gpu_service_offering"),
137+
resource.TestCheckResourceAttr("cloudstack_service_offering.gpu", "display_text", "GPU Test"),
138+
resource.TestCheckResourceAttr("cloudstack_service_offering.gpu", "cpu_number", "4"),
139+
resource.TestCheckResourceAttr("cloudstack_service_offering.gpu", "memory", "16384"),
140+
resource.TestCheckResourceAttr("cloudstack_service_offering.gpu", "service_offering_details.pciDevice", "Group of NVIDIA A6000 GPUs"),
141+
resource.TestCheckResourceAttr("cloudstack_service_offering.gpu", "service_offering_details.vgpuType", "A6000-8A"),
142+
),
143+
},
144+
},
145+
})
146+
}
147+
148+
const testAccCloudStackServiceOffering_gpu = `
149+
resource "cloudstack_service_offering" "gpu" {
150+
name = "gpu_service_offering"
151+
display_text = "GPU Test"
152+
cpu_number = 4
153+
memory = 16384
154+
155+
service_offering_details = {
156+
pciDevice = "Group of NVIDIA A6000 GPUs"
157+
vgpuType = "A6000-8A"
158+
}
159+
}
160+
`

0 commit comments

Comments
 (0)