This commit is contained in:
2026-06-02 11:28:16 +03:00
parent af79f6ab3e
commit c734dcfff7
254 changed files with 10439 additions and 3751 deletions

View File

@@ -0,0 +1,36 @@
package hypervisors
import (
"context"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
)
func dataSourceHypervisorRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
hypervisor, err := utilityHypervisorCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
flattenHypervisorDataSource(d, hypervisor)
d.SetId(hypervisor.Name)
return nil
}
func DataSourceHypervisor() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceHypervisorRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceHypervisorSchemaMake(),
}
}

View File

@@ -0,0 +1,38 @@
package hypervisors
import (
"context"
"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
)
func dataSourceHypervisorListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
hypervisorList, err := utilityHypervisorListCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("items", flattenHypervisorListDataSource(hypervisorList))
return nil
}
func DataSourceHypervisorList() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceHypervisorListRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceHypervisorListSchemaMake(),
}
}

View File

@@ -0,0 +1,75 @@
package hypervisors
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/hypervisors"
)
func flattenHypervisorResource(d *schema.ResourceData, hypervisor *hypervisors.RecordHypervisor) {
d.Set("display_name", hypervisor.DisplayName)
d.Set("hostname", hypervisor.Hostname)
d.Set("ip", hypervisor.IP)
d.Set("name", hypervisor.Name)
d.Set("ports", flattenPorts(hypervisor.Ports))
d.Set("status", hypervisor.Status)
d.Set("created_at", hypervisor.CreatedAt)
d.Set("synced_at", hypervisor.SyncedAt)
}
func flattenHypervisorListDataSource(hypervisorList hypervisors.HypervisorsList) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(hypervisorList))
for _, v := range hypervisorList {
temp := map[string]interface{}{
"display_name": v.DisplayName,
"hostname": v.Hostname,
"ip": v.IP,
"name": v.Name,
"ports": flattenPorts(v.Ports),
"status": v.Status,
"created_at": v.CreatedAt,
"synced_at": v.SyncedAt,
}
res = append(res, temp)
}
return res
}
func flattenHypervisorDataSource(d *schema.ResourceData, hypervisor *hypervisors.RecordHypervisor) {
d.Set("display_name", hypervisor.DisplayName)
d.Set("hostname", hypervisor.Hostname)
d.Set("ip", hypervisor.IP)
d.Set("name", hypervisor.Name)
d.Set("ports", flattenPorts(hypervisor.Ports))
d.Set("status", hypervisor.Status)
d.Set("created_at", hypervisor.CreatedAt)
d.Set("synced_at", hypervisor.SyncedAt)
}
func flattenPorts(ports hypervisors.Ports) []map[string]interface{} {
final := make([]map[string]interface{}, 0)
res := map[string]interface{}{}
data := make([]map[string]interface{}, 0)
info := map[string]interface{}{}
for _, v := range ports.Data {
temp := map[string]interface{}{
"id": v.ID,
"unique_identifier": v.UniqueIdentifier,
"display_name": v.DisplayName,
"up": v.UP,
}
data = append(data, temp)
}
info["active_ports"] = ports.Info.ActivePorts
info["total_ports"] = ports.Info.TotalPorts
res["data"] = data
res["info"] = []interface{}{info}
final = append(final, res)
return final
}

View File

@@ -0,0 +1,87 @@
package hypervisors
import (
"context"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/hypervisors"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func resourceHypervisorCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
return diag.Errorf(
"It's impossible to create a hypervisor from terraform")
}
func resourceHypervisorRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
hypervisor, err := utilityHypervisorCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
flattenHypervisorResource(d, hypervisor)
d.SetId(hypervisor.Name)
return nil
}
func resourceHypervisorUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
c := m.(*controller.ControllerCfg)
req := hypervisors.UpdateDisplayNameRequest{
Name: d.Get("name").(string),
DisplayName: d.Get("display_name").(string),
}
_, err := c.SDN().Hypervisors().UpdateDisplayName(ctx, req)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
return resourceHypervisorRead(ctx, d, m)
}
func resourceHypervisorDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
c := m.(*controller.ControllerCfg)
req := hypervisors.DeleteRequest{
Name: d.Get("name").(string),
}
_, err := c.SDN().Hypervisors().Delete(ctx, req)
if err != nil {
return diag.FromErr(err)
}
d.SetId("")
return nil
}
func ResourceHypervisor() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
CreateContext: resourceHypervisorCreate,
ReadContext: resourceHypervisorRead,
UpdateContext: resourceHypervisorUpdate,
DeleteContext: resourceHypervisorDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Timeouts: &schema.ResourceTimeout{
Create: &constants.Timeout600s,
Read: &constants.Timeout300s,
Update: &constants.Timeout600s,
Delete: &constants.Timeout300s,
Default: &constants.Timeout300s,
},
Schema: resourceHypervisorSchemaMake(),
}
}

View File

@@ -0,0 +1,320 @@
package hypervisors
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceHypervisorSchemaMake() map[string]*schema.Schema {
res := map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"display_name": {
Type: schema.TypeString,
Required: true,
},
"hostname": {
Type: schema.TypeString,
Computed: true,
},
"ip": {
Type: schema.TypeString,
Computed: true,
},
"ports": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"data": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
},
"unique_identifier": {
Type: schema.TypeString,
Computed: true,
},
"display_name": {
Type: schema.TypeString,
Computed: true,
},
"up": {
Type: schema.TypeBool,
Computed: true,
},
},
},
},
"info": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"active_ports": {
Type: schema.TypeInt,
Computed: true,
},
"total_ports": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"created_at": {
Type: schema.TypeString,
Computed: true,
},
"synced_at": {
Type: schema.TypeString,
Computed: true,
},
}
return res
}
func dataSourceHypervisorListSchemaMake() map[string]*schema.Schema {
res := map[string]*schema.Schema{
"page": {
Type: schema.TypeInt,
Optional: true,
},
"per_page": {
Type: schema.TypeInt,
Optional: true,
},
"sort_by": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"name", "hostname", "last_sync",
"display_name", "ip", "created_at", "updated_at"}, false),
},
"sort_order": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"asc", "desc"}, false),
},
"port_info": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"detailed", "general"}, false),
},
"hostname": {
Type: schema.TypeString,
Optional: true,
},
"display_name": {
Type: schema.TypeString,
Optional: true,
},
"ip": {
Type: schema.TypeString,
Optional: true,
},
"created_from": {
Type: schema.TypeString,
Optional: true,
},
"created_to": {
Type: schema.TypeString,
Optional: true,
},
"updated_from": {
Type: schema.TypeString,
Optional: true,
},
"updated_to": {
Type: schema.TypeString,
Optional: true,
},
"items": {
Type: schema.TypeList,
Computed: true,
Description: "List of hypervisors",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"display_name": {
Type: schema.TypeString,
Computed: true,
},
"hostname": {
Type: schema.TypeString,
Computed: true,
},
"ip": {
Type: schema.TypeString,
Computed: true,
},
"ports": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"data": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
},
"unique_identifier": {
Type: schema.TypeString,
Computed: true,
},
"display_name": {
Type: schema.TypeString,
Computed: true,
},
"up": {
Type: schema.TypeBool,
Computed: true,
},
},
},
},
"info": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"active_ports": {
Type: schema.TypeInt,
Computed: true,
},
"total_ports": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"created_at": {
Type: schema.TypeString,
Computed: true,
},
"synced_at": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
}
return res
}
func dataSourceHypervisorSchemaMake() map[string]*schema.Schema {
res := map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"port_info": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"detailed", "general"}, false),
},
"display_name": {
Type: schema.TypeString,
Computed: true,
},
"hostname": {
Type: schema.TypeString,
Computed: true,
},
"ip": {
Type: schema.TypeString,
Computed: true,
},
"ports": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"data": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
},
"unique_identifier": {
Type: schema.TypeString,
Computed: true,
},
"display_name": {
Type: schema.TypeString,
Computed: true,
},
"up": {
Type: schema.TypeBool,
Computed: true,
},
},
},
},
"info": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"active_ports": {
Type: schema.TypeInt,
Computed: true,
},
"total_ports": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"created_at": {
Type: schema.TypeString,
Computed: true,
},
"synced_at": {
Type: schema.TypeString,
Computed: true,
},
}
return res
}

View File

@@ -0,0 +1,32 @@
package hypervisors
import (
"context"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/hypervisors"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityHypervisorCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*hypervisors.RecordHypervisor, error) {
c := m.(*controller.ControllerCfg)
req := hypervisors.GetRequest{}
if d.Id() != "" {
req.Name = d.Id()
} else {
req.Name = d.Get("name").(string)
}
if portInfo, ok := d.GetOk("port_info"); ok {
req.PortInfo = portInfo.(string)
}
hypervisor, err := c.SDN().Hypervisors().Get(ctx, req)
if err != nil {
return nil, err
}
return hypervisor, nil
}

View File

@@ -0,0 +1,69 @@
package hypervisors
import (
"context"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/hypervisors"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityHypervisorListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (hypervisors.HypervisorsList, error) {
c := m.(*controller.ControllerCfg)
req := hypervisors.ListRequest{}
if page, ok := d.GetOk("page"); ok {
req.Page = uint64(page.(int))
}
if perPage, ok := d.GetOk("per_page"); ok {
req.PerPage = uint64(perPage.(int))
}
if sortBy, ok := d.GetOk("sort_by"); ok {
req.SortBy = sortBy.(string)
}
if sortOrder, ok := d.GetOk("sort_order"); ok {
req.SortOrder = sortOrder.(string)
}
if portInfo, ok := d.GetOk("port_info"); ok {
req.PortInfo = portInfo.(string)
}
if hostname, ok := d.GetOk("hostname"); ok {
req.Hostname = hostname.(string)
}
if displayName, ok := d.GetOk("display_name"); ok {
req.DisplayName = displayName.(string)
}
if ip, ok := d.GetOk("ip"); ok {
req.IP = ip.(string)
}
if createdFrom, ok := d.GetOk("created_from"); ok {
req.CreatedFrom = createdFrom.(string)
}
if createdTo, ok := d.GetOk("created_to"); ok {
req.CreatedTo = createdTo.(string)
}
if updatedFrom, ok := d.GetOk("updated_from"); ok {
req.UpdatedFrom = updatedFrom.(string)
}
if updatedTo, ok := d.GetOk("updated_to"); ok {
req.UpdatedTo = updatedTo.(string)
}
hypervisorList, err := c.SDN().Hypervisors().List(ctx, req)
if err != nil {
return nil, err
}
return hypervisorList, nil
}