diff --git a/decort/data_source_vgpu.go b/decort/data_source_vgpu.go new file mode 100644 index 0000000..b1cf22b --- /dev/null +++ b/decort/data_source_vgpu.go @@ -0,0 +1,111 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Petr Krutov, + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceVGPURead(d *schema.ResourceData, m interface{}) error { + vgpu, err := utilityVGPUCheckPresence(d, m) + if vgpu == nil { + d.SetId("") + return err + } + + d.SetId(strconv.Itoa(vgpu.ID)) + d.Set("vgpu_id", vgpu.ID) + d.Set("account_id", vgpu.AccountID) + d.Set("mode", vgpu.Mode) + d.Set("pgpu", vgpu.PgpuID) + d.Set("profile_id", vgpu.ProfileID) + d.Set("ram", vgpu.RAM) + d.Set("status", vgpu.Status) + d.Set("type", vgpu.Type) + d.Set("vm_id", vgpu.VmID) + + return nil +} + +func dataSourceVGPUSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "vgpu_id": { + Type: schema.TypeInt, + Required: true, + }, + + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + + "mode": { + Type: schema.TypeString, + Computed: true, + }, + + "pgpu": { + Type: schema.TypeInt, + Computed: true, + }, + + "profile_id": { + Type: schema.TypeInt, + Computed: true, + }, + + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + + "status": { + Type: schema.TypeString, + Computed: true, + }, + + "type": { + Type: schema.TypeString, + Computed: true, + }, + + "vm_id": { + Type: schema.TypeInt, + Computed: true, + }, + } +} + +func dataSourceVGPU() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceVGPURead, + + Schema: dataSourceVGPUSchemaMake(), + } +} diff --git a/decort/models_api.go b/decort/models_api.go index 578dc81..ee1e5e3 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -836,6 +836,24 @@ type Snapshot struct { type SnapshotList []Snapshot +//////////////// +/// VGPU API /// +//////////////// + +const vgpuListAPI = "/restmachine/cloudbroker/vgpu/list" + +type VGPU struct { + AccountID int `json:"accountId"` + ID int `json:"id"` + Mode string `json:"mode"` + PgpuID int `json:"pgpuid"` + ProfileID int `json:"profileId"` + RAM int `json:"ram"` + Status string `json:"status"` + Type string `json:"type"` + VmID int `json:"vmid"` +} + ///////////////////////////// // PCIDEVICE // ///////////////////////////// diff --git a/decort/provider.go b/decort/provider.go index 4119219..c2a4aa1 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -128,6 +128,7 @@ func Provider() *schema.Provider { "decort_image_list": dataSourceImageList(), "decort_image_list_stacks": dataSourceImageListStacks(), "decort_snapshot_list": dataSourceSnapshotList(), + "decort_vgpu": dataSourceVGPU(), "decort_pcidevice": dataSourcePcidevice(), "decort_pcidevice_list": dataSourcePcideviceList(), "decort_sep_list": dataSourceSepList(), diff --git a/decort/utility_vgpu.go b/decort/utility_vgpu.go new file mode 100644 index 0000000..a35ca71 --- /dev/null +++ b/decort/utility_vgpu.go @@ -0,0 +1,74 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Petr Krutov, + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityVGPUCheckPresence(d *schema.ResourceData, m interface{}) (*VGPU, error) { + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("size", "50") + + var vgpuId int + var err error + + if vId, ok := d.GetOk("vgpu_id"); ok { + vgpuId = vId.(int) + } else { + vgpuId, err = strconv.Atoi(d.Id()) + if err != nil { + return nil, err + } + } + + for page := 1; ; page++ { + urlValues.Set("page", strconv.Itoa(page)) + resp, err := controller.decortAPICall("POST", vgpuListAPI, urlValues) + if err != nil { + return nil, err + } + + if resp == "[]" { + return nil, nil + } + + var vgpus []VGPU + if err := json.Unmarshal([]byte(resp), &vgpus); err != nil { + return nil, err + } + + for _, vgpu := range vgpus { + if vgpu.ID == vgpuId { + return &vgpu, nil + } + } + } +}