This commit is contained in:
2025-08-04 16:11:16 +03:00
parent bae25296bb
commit 4b3f21d9be
239 changed files with 6585 additions and 784 deletions

View File

@@ -34,6 +34,7 @@ func flattenResourceAccount(d *schema.ResourceData, acc *account.RecordAccount)
d.Set("updated_time", acc.UpdatedTime)
d.Set("version", acc.Version)
d.Set("vins", acc.VINS)
d.Set("zone_ids", acc.ZoneIDs)
}
func flattenDataAccount(d *schema.ResourceData, acc *account.RecordAccount) {
@@ -54,12 +55,14 @@ func flattenDataAccount(d *schema.ResourceData, acc *account.RecordAccount) {
d.Set("displayname", acc.DisplayName)
d.Set("guid", acc.GUID)
d.Set("account_id", acc.ID)
d.Set("default_zone_id", acc.DefaultZoneID)
d.Set("account_name", acc.Name)
d.Set("resource_limits", flattenRgResourceLimits(acc.ResourceLimits))
d.Set("resource_types", acc.ResTypes)
d.Set("send_access_emails", acc.SendAccessEmails)
d.Set("status", acc.Status)
d.Set("uniq_pools", acc.UniqPools)
d.Set("zone_ids", flattenZones(acc.ZoneIDs))
d.Set("updated_time", acc.UpdatedTime)
d.Set("version", acc.Version)
d.Set("vins", acc.VINS)
@@ -144,10 +147,16 @@ func flattenAccResource(r account.Resource) []map[string]interface{} {
return res
}
func flattenAccAcl(acls []account.ACL) []map[string]interface{} {
func flattenAccAcl(acls []account.ACLWithEmails) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(acls))
for _, acls := range acls {
tempEmails := make([]string, 0, len(acls.Emails))
for _, email := range acls.Emails {
tempEmails = append(tempEmails, email)
}
temp := map[string]interface{}{
"emails": tempEmails,
"explicit": acls.Explicit,
"guid": acls.GUID,
"right": acls.Right,
@@ -220,6 +229,8 @@ func flattenListDeleted(al *account.ListAccounts) []map[string]interface{} {
"send_access_emails": acc.SendAccessEmails,
"status": acc.Status,
"uniq_pools": acc.UniqPools,
"default_zone_id": acc.DefaultZoneID,
"zone_ids": acc.ZoneIDs,
"updated_time": acc.UpdatedTime,
"version": acc.Version,
"vins": acc.VINS,
@@ -257,6 +268,8 @@ func flattenAccountList(al *account.ListAccounts) []map[string]interface{} {
"send_access_emails": acc.SendAccessEmails,
"status": acc.Status,
"uniq_pools": acc.UniqPools,
"default_zone_id": acc.DefaultZoneID,
"zone_ids": acc.ZoneIDs,
"updated_time": acc.UpdatedTime,
"version": acc.Version,
"vins": acc.VINS,
@@ -427,3 +440,15 @@ func flattenAccResourceConsumption(lrc *account.ListResources) []map[string]inte
func flattenEnabled(status string) bool {
return status == "CONFIRMED"
}
func flattenZones(zones []account.ZoneID) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, zone := range zones {
temp := map[string]interface{}{
"id": zone.ID,
"name": zone.Name,
}
res = append(res, temp)
}
return res
}

View File

@@ -33,12 +33,18 @@ package account
import (
"context"
"fmt"
"strings"
"time"
//"log"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/account"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
@@ -59,6 +65,10 @@ func resourceAccountCreate(ctx context.Context, d *schema.ResourceData, m interf
req.Description = desc.(string)
}
if zoneID, ok := d.GetOk("default_zone_id"); ok {
req.DefaultZoneID = uint64(zoneID.(int))
}
if emailaddress, ok := d.GetOk("emailaddress"); ok {
req.EmailAddress = emailaddress.(string)
}
@@ -74,6 +84,13 @@ func resourceAccountCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
if zones, ok := d.GetOk("zone_ids"); ok {
zones := zones.([]interface{})
for _, zone := range zones {
req.ZoneIDs = append(req.ZoneIDs, uint64(zone.(int)))
}
}
if resLimits, ok := d.GetOk("resource_limits"); ok {
resLimits := resLimits.([]interface{})[0]
resLimitsConv := resLimits.(map[string]interface{})
@@ -200,7 +217,6 @@ func resourceAccountCreate(ctx context.Context, d *schema.ResourceData, m interf
if !d.Get("enable").(bool) {
_, err := c.CloudBroker().Account().Disable(ctx, account.DisableRequest{
AccountID: accountId,
Reason: d.Get("reason").(string),
})
if err != nil {
@@ -245,14 +261,34 @@ func resourceAccountDelete(ctx context.Context, d *schema.ResourceData, m interf
AccountID: accountData.ID,
Permanently: d.Get("permanently").(bool),
Name: d.Get("account_name").(string),
Reason: d.Get("reason").(string),
}
_, err = c.CloudBroker().Account().Delete(ctx, req)
taskID, err := c.CloudBroker().Account().Delete(ctx, req)
if err != nil {
return diag.FromErr(err)
}
taskReq := tasks.GetRequest{
AuditID: strings.Trim(taskID, `"`),
}
for {
time.Sleep(time.Second * 5)
task, err := c.CloudBroker().Tasks().Get(ctx, taskReq)
if err != nil {
return diag.FromErr(err)
}
log.Debugf("resourceAccountDelete: delete account - %s", task.Stage)
if task.Completed {
if task.Error != "" {
return diag.FromErr(fmt.Errorf("cannot delete account: %v", task.Error))
}
break
}
}
d.SetId("")
return nil
@@ -282,14 +318,34 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("The account is in progress with status: %s", acc.Status)
case status.Deleted:
if d.Get("restore").(bool) {
_, err := c.CloudBroker().Account().Restore(ctx, account.RestoreRequest{
taskID, err := c.CloudBroker().Account().Restore(ctx, account.RestoreRequest{
AccountID: accountId,
Reason: d.Get("reason").(string),
})
if err != nil {
return diag.FromErr(err)
}
taskReq := tasks.GetRequest{
AuditID: strings.Trim(taskID, `"`),
}
for {
time.Sleep(time.Second * 5)
task, err := c.CloudBroker().Tasks().Get(ctx, taskReq)
if err != nil {
return diag.FromErr(err)
}
log.Debugf("resourceAccountUpdate: restore account - %s", task.Stage)
if task.Completed {
if task.Error != "" {
return diag.FromErr(fmt.Errorf("cannot restore account: %v", task.Error))
}
break
}
}
if _, ok := d.GetOk("enable"); ok {
if err := utilityAccountEnableUpdate(ctx, d, m, acc); err != nil {
return diag.FromErr(err)
@@ -316,7 +372,7 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
if d.HasChanges("account_name", "send_access_emails", "uniq_pools", "resource_limits", "desc") {
if d.HasChanges("account_name", "send_access_emails", "uniq_pools", "resource_limits", "desc", "default_zone_id") {
if err := utilityAccountUpdate(ctx, d, m); err != nil {
return diag.FromErr(err)
}
@@ -352,6 +408,21 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
if d.HasChange("zone_ids") {
old, new := d.GetChange("zone_ids")
//toAddSet := old.(*schema.Set).Difference(new.(*schema.Set))
toRemoveSet := new.(*schema.Set).Difference(old.(*schema.Set))
/*if err := utilityZoneIDsUpdate(ctx, d, m, toAddSet); err != nil {
return diag.FromErr(err)
}*/
if err := utilityZoneIDsRemove(ctx, d, m, toRemoveSet); err != nil {
return diag.FromErr(err)
}
}
return resourceAccountRead(ctx, d, m)
}

View File

@@ -27,12 +27,25 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
Optional: true,
Description: "email",
},
"default_zone_id": {
Type: schema.TypeInt,
Optional: true,
Description: "email",
},
"send_access_emails": {
Type: schema.TypeBool,
Optional: true,
Default: true,
Description: "if true send emails when a user is granted access to resources",
},
"zone_ids": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"uniq_pools": {
Type: schema.TypeList,
Optional: true,
@@ -77,11 +90,6 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
},
Description: "Share images with account",
},
"reason": {
Type: schema.TypeString,
Optional: true,
Description: "reason for restore or deactivation",
},
"restore": {
Type: schema.TypeBool,
Optional: true,
@@ -148,7 +156,7 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"}, true),
ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}, true),
},
},
"account_id": {
@@ -176,6 +184,13 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"emails": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"explicit": {
Type: schema.TypeBool,
Computed: true,
@@ -665,6 +680,10 @@ func dataSourceAccountListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"default_zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"uniq_pools": {
Type: schema.TypeList,
Computed: true,
@@ -672,6 +691,13 @@ func dataSourceAccountListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"zone_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"updated_time": {
Type: schema.TypeInt,
Computed: true,
@@ -1252,6 +1278,10 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"default_zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"account_name": {
Type: schema.TypeString,
Computed: true,
@@ -1314,6 +1344,13 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"zone_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"updated_time": {
Type: schema.TypeInt,
Computed: true,
@@ -1928,11 +1965,38 @@ func dataSourceAccountSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"default_zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"zone_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeInt,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"acl": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"emails": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"explicit": {
Type: schema.TypeBool,
Computed: true,

View File

@@ -226,6 +226,10 @@ func utilityAccountUpdate(ctx context.Context, d *schema.ResourceData, m interfa
req.SendAccessEmails = d.Get("send_access_emails").(bool)
}
if d.HasChange("default_zone_id") {
req.DefaultZoneID = uint64(d.Get("default_zone_id").(int))
}
if d.HasChange("uniq_pools") {
uniq_pools := d.Get("uniq_pools").([]interface{})
@@ -401,6 +405,56 @@ func utilityAccountComputeFeaturesUpdate(ctx context.Context, d *schema.Resource
return nil
}
func utilityZoneIDsAdd(ctx context.Context, d *schema.ResourceData, m interface{}, toUpdate *schema.Set) error {
c := m.(*controller.ControllerCfg)
accountId, _ := strconv.ParseUint(d.Id(), 10, 64)
zones := toUpdate.List()
compZones := make([]uint64, 0, len(zones))
for _, item := range zones {
compZones = append(compZones, uint64(item.(int)))
}
req := account.AddZoneRequest{
AccountID: accountId,
ZoneIDs: compZones,
}
_, err := c.CloudBroker().Account().AddZone(ctx, req)
if err != nil {
return err
}
return nil
}
func utilityZoneIDsRemove(ctx context.Context, d *schema.ResourceData, m interface{}, toRemove *schema.Set) error {
c := m.(*controller.ControllerCfg)
accountId, _ := strconv.ParseUint(d.Id(), 10, 64)
zones := toRemove.List()
compZones := make([]uint64, 0, len(zones))
for _, item := range zones {
compZones = append(compZones, uint64(item.(int)))
}
req := account.RemoveZoneRequest{
AccountID: accountId,
ZoneIDs: compZones,
}
_, err := c.CloudBroker().Account().RemoveZone(ctx, req)
if err != nil {
return err
}
return nil
}
func isContainsUser(els []interface{}, el interface{}) bool {
for _, elOld := range els {
elOldConv := elOld.(map[string]interface{})

View File

@@ -2002,7 +2002,7 @@ func resourceDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
Type: schema.TypeInt,
},
},
"iotune": {

View File

@@ -55,7 +55,7 @@ func flattenListExtnet(extList *extnet.ListExtNet) []map[string]interface{} {
"ipcidr": item.IPCIDR,
"milestones": item.Milestones,
"name": item.Name,
"network_id": item.NetworkID,
"network_ids": item.NetworkIDs,
"ovs_bridge": item.OVSBridge,
"pre_reservations_num": item.PreReservationsNum,
"pri_vnfdev_id": item.PriVNFDevID,
@@ -64,6 +64,10 @@ func flattenListExtnet(extList *extnet.ListExtNet) []map[string]interface{} {
"vlan_id": item.VLANID,
"check_ips": item.CheckIPs,
"vnfs": flattenExtnetVNFS(item.VNFs),
"zone_id": item.ZoneID,
"sec_vnfdev_id": item.SecVNFDevID,
"redundant": item.Redundant,
"mtu": item.MTU,
}
res = append(res, temp)
@@ -84,7 +88,7 @@ func flattenRecordExtnet(d *schema.ResourceData, recNet *extnet.RecordExtNet) {
d.Set("ipcidr", recNet.IPCIDR)
d.Set("milestones", recNet.Milestones)
d.Set("name", recNet.Name)
d.Set("network_id", recNet.NetworkID)
d.Set("network_ids", recNet.NetworkIDs)
d.Set("ntp", recNet.NTP)
d.Set("ovs_bridge", recNet.OVSBridge)
d.Set("pre_reservations_num", recNet.PreReservationsNum)
@@ -101,6 +105,11 @@ func flattenRecordExtnet(d *schema.ResourceData, recNet *extnet.RecordExtNet) {
d.Set("default_qos", flattenExtnetDefaultQos(recNet.DefaultQOS))
d.Set("vnfs", flattenExtnetVNFS(recNet.VNFs))
d.Set("reservations", flattenExtnetReservations(recNet.Reservations))
d.Set("zone_id", recNet.ZoneID)
d.Set("pre_reservations", flattenExtnetReservations(recNet.PreReservations))
d.Set("sec_vnfdev_id", recNet.SecVNFDevID)
d.Set("redundant", recNet.Redundant)
d.Set("mtu", recNet.MTU)
}
func flattenRecordExtnetResource(d *schema.ResourceData, recNet *extnet.RecordExtNet, staticRouteList *extnet.ListStaticRoutes) {
@@ -115,7 +124,7 @@ func flattenRecordExtnetResource(d *schema.ResourceData, recNet *extnet.RecordEx
d.Set("ipcidr", recNet.IPCIDR)
d.Set("milestones", recNet.Milestones)
d.Set("name", recNet.Name)
d.Set("network_id", recNet.NetworkID)
d.Set("network_ids", flattenNetworkIDs(recNet.NetworkIDs))
d.Set("ovs_bridge", recNet.OVSBridge)
d.Set("pre_reservations_num", recNet.PreReservationsNum)
d.Set("pri_vnfdev_id", recNet.PriVNFDevID)
@@ -127,11 +136,13 @@ func flattenRecordExtnetResource(d *schema.ResourceData, recNet *extnet.RecordEx
d.Set("excluded", flattenExtnetExcluded(recNet.Excluded))
d.Set("gateway", recNet.Gateway)
d.Set("network", recNet.Network)
d.Set("ntp", recNet.NTP)
d.Set("prefix", recNet.Prefix)
d.Set("default_qos", flattenExtnetDefaultQos(recNet.DefaultQOS))
d.Set("vnfs", flattenExtnetVNFS(recNet.VNFs))
d.Set("reservations", flattenExtnetReservations(recNet.Reservations))
d.Set("routes", flattenStaticRouteList(staticRouteList))
d.Set("zone_id", recNet.ZoneID)
}
func flattenExtnetExcluded(ers extnet.ListReservations) []map[string]interface{} {
@@ -245,3 +256,14 @@ func flattenExtnetReservedIp(el []extnet.RecordReservedIP) []map[string]interfac
}
return res
}
func flattenNetworkIDs(ex extnet.NetworkIDs) []map[string]interface{} {
res := make([]map[string]interface{}, 0, 1)
temp := map[string]interface{}{
"primary": ex.Primary,
"secondary": ex.Secondary,
}
res = append(res, temp)
return res
}

View File

@@ -100,6 +100,10 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
req.Virtual = virtual.(bool)
}
if zoneID, ok := d.GetOk("zone_id"); ok {
req.ZoneID = uint64(zoneID.(int))
}
if desc, ok := d.GetOk("desc"); ok {
req.Description = desc.(string)
}
@@ -112,10 +116,6 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
req.EndIP = end_ip.(string)
}
if vnfdev_ip, ok := d.GetOk("vnfdev_ip"); ok {
req.VNFDevIP = vnfdev_ip.(string)
}
if pre_reservations_num, ok := d.GetOk("pre_reservations_num"); ok {
req.PreReservationsNum = uint64(pre_reservations_num.(int))
}
@@ -124,6 +124,18 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
req.OVSBridge = ovs_bridge.(string)
}
if highly_available, ok := d.GetOk("highly_available"); ok {
req.HAMode = highly_available.(bool)
}
if sec_vnfdev_ip, ok := d.GetOk("sec_vnfdev_ip"); ok {
req.SecVNFDevIP = sec_vnfdev_ip.(string)
}
if mtu, ok := d.GetOk("mtu"); ok {
req.MTU = mtu.(uint)
}
log.Debugf("cloudbroker: Sent create request")
netID, err := c.CloudBroker().ExtNet().Create(ctx, req)
if err != nil {
@@ -331,6 +343,18 @@ func resourceExtnetUpdate(ctx context.Context, d *schema.ResourceData, m interfa
}
}
if d.HasChange("zone_id") {
if err := handleZoneIDUpdate(ctx, d, c, recNet); err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("highly_available") {
if err := handleHAUpdate(ctx, d, c, recNet); err != nil {
return diag.FromErr(err)
}
}
return resourceExtnetRead(ctx, d, m)
}

View File

@@ -86,6 +86,10 @@ func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"default_qos": {
Type: schema.TypeList,
Computed: true,
@@ -142,9 +146,21 @@ func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"network_id": {
Type: schema.TypeInt,
"network_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"primary": {
Type: schema.TypeInt,
Computed: true,
},
"secondary": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"ovs_bridge": {
Type: schema.TypeString,
@@ -192,6 +208,18 @@ func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"redundant": {
Type: schema.TypeBool,
Computed: true,
},
"sec_vnfdev_id": {
Type: schema.TypeInt,
Computed: true,
},
"mtu": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
@@ -351,6 +379,10 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"ipcidr": {
Type: schema.TypeString,
Computed: true,
@@ -363,9 +395,21 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"network_id": {
Type: schema.TypeInt,
"network_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"primary": {
Type: schema.TypeInt,
Computed: true,
},
"secondary": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"ovs_bridge": {
Type: schema.TypeString,
@@ -523,6 +567,62 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"redundant": {
Type: schema.TypeBool,
Computed: true,
},
"sec_vnfdev_id": {
Type: schema.TypeInt,
Computed: true,
},
"mtu": {
Type: schema.TypeInt,
Computed: true,
},
"pre_reservations": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"client_type": {
Type: schema.TypeString,
Computed: true,
},
"domain_name": {
Type: schema.TypeString,
Computed: true,
},
"hostname": {
Type: schema.TypeString,
Computed: true,
},
"desc": {
Type: schema.TypeString,
Computed: true,
},
"ip": {
Type: schema.TypeString,
Computed: true,
},
"mac": {
Type: schema.TypeString,
Computed: true,
},
"type": {
Type: schema.TypeString,
Computed: true,
},
"vm_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
}
}
@@ -595,6 +695,11 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "External network gateway IP address",
},
"zone_id": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"dns": {
Type: schema.TypeList,
Optional: true,
@@ -607,6 +712,7 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
"ntp": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
@@ -766,6 +872,21 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
},
},
},
"highly_available": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
"sec_vnfdev_ip": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"mtu": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"ckey": {
Type: schema.TypeString,
Computed: true,
@@ -798,9 +919,21 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"network_id": {
Type: schema.TypeInt,
"network_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"primary": {
Type: schema.TypeInt,
Computed: true,
},
"secondary": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"pri_vnfdev_id": {
Type: schema.TypeInt,

View File

@@ -118,6 +118,10 @@ func handleBasicUpdate(ctx context.Context, d *schema.ResourceData, c *controlle
basiUpdateReq.Description = d.Get("desc").(string)
doBasicUpdate = true
}
if d.HasChange("mtu") {
basiUpdateReq.MTU = d.Get("mtu").(uint64)
doBasicUpdate = true
}
if doBasicUpdate {
_, err := c.CloudBroker().ExtNet().Update(ctx, basiUpdateReq)
@@ -343,6 +347,38 @@ func handleMigrateUpdate(ctx context.Context, d *schema.ResourceData, c *control
return nil
}
func handleZoneIDUpdate(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, recNet *extnet.RecordExtNet) error {
zoneID := uint64(d.Get("zone_id").(int))
req := extnet.MigrateToZoneRequest{
NetID: recNet.ID,
ZoneID: zoneID,
}
_, err := c.CloudBroker().ExtNet().MigrateToZone(ctx, req)
if err != nil {
return err
}
return nil
}
func handleHAUpdate(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, recNet *extnet.RecordExtNet) error {
highlyAvailable := d.Get("highly_available").(bool)
req := extnet.SetHAModeRequest{
NetID: recNet.ID,
HAMode: highlyAvailable,
}
_, err := c.CloudBroker().ExtNet().SetHAMode(ctx, req)
if err != nil {
return err
}
return nil
}
func checkReserveIp(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) error {
var err error
if d.Get("reserved_ip").(*schema.Set).Len() > 0 {

View File

@@ -37,6 +37,7 @@ package flipgroup
import (
"context"
"fmt"
"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/cloudbroker/flipgroup"
@@ -58,16 +59,18 @@ func resourceFlipgroupCreate(ctx context.Context, d *schema.ResourceData, m inte
}
req := flipgroup.CreateRequest{
Name: d.Get("name").(string),
NetType: d.Get("net_type").(string),
ClientType: d.Get("client_type").(string),
AccountID: uint64(d.Get("account_id").(int)),
NetID: uint64(d.Get("net_id").(int)),
Name: d.Get("name").(string),
NetType: d.Get("net_type").(string),
AccountID: uint64(d.Get("account_id").(int)),
NetID: uint64(d.Get("net_id").(int)),
}
if IP, ok := d.GetOk("ip"); ok {
req.IP = IP.(string)
}
if clientType, ok := d.GetOk("client_type"); ok {
req.ClientType = clientType.(string)
}
if description, ok := d.GetOk("desc"); ok {
req.Description = description.(string)
}

View File

@@ -369,7 +369,8 @@ func resourceFlipgroupSchemaMake() map[string]*schema.Schema {
},
"client_type": {
Type: schema.TypeString,
Required: true,
Optional: true,
Default: "compute",
Description: "Type of client, 'compute' ('vins' will be later)",
ValidateFunc: validation.StringInSlice([]string{"compute"}, true),
},

View File

@@ -18,6 +18,9 @@ func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) {
d.Set("guid", grid.GUID)
d.Set("location_code", grid.LocationCode)
d.Set("id", grid.ID)
d.Set("network_modes", grid.NetworkModes)
d.Set("sdn_support", grid.SDNSupport)
}
func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
@@ -32,6 +35,8 @@ func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
"guid": item.GUID,
"location_code": item.LocationCode,
"id": item.ID,
"network_modes": item.NetworkModes,
"sdn_support": item.SDNSupport,
}
res = append(res, temp)
}

View File

@@ -51,6 +51,17 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"network_modes": {
Type: schema.TypeList,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Computed: true,
},
"sdn_support": {
Type: schema.TypeBool,
Computed: true,
},
}
}
@@ -246,6 +257,17 @@ func dataSourceGridListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"network_modes": {
Type: schema.TypeList,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Computed: true,
},
"sdn_support": {
Type: schema.TypeBool,
Computed: true,
},
},
},
},

View File

@@ -17,6 +17,7 @@ import (
cb_lb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/lb"
cb_rg "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/rg"
cb_stack "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/stack"
cb_trunk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
cb_vfpool "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vfpool"
cb_vins "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins"
@@ -318,6 +319,39 @@ func ExistDPDKNet(ctx context.Context, dpdkIds []uint64, c *controller.Controlle
return errs
}
func ExistTrunkNet(ctx context.Context, trunkIds []uint64, c *controller.ControllerCfg) []error {
var errs []error
if len(trunkIds) == 0 {
return errs
}
req := cb_trunk.ListRequest{}
trunkList, err := c.CloudBroker().Trunk().List(ctx, req)
if err != nil {
errs = append(errs, err)
return errs
}
for _, trunkId := range trunkIds {
found := false
for _, trunk := range trunkList.Data {
if trunkId == trunk.ID {
found = true
break
}
}
if !found {
errs = append(errs, fmt.Errorf("TRUNK Net with ID %v not found", trunkId))
}
}
return errs
}
func ExistExtNetInLb(ctx context.Context, extNetId uint64, c *controller.ControllerCfg) error {
if extNetId == 0 {
return nil

View File

@@ -73,9 +73,6 @@ func resourceCDROMImageCreate(ctx context.Context, d *schema.ResourceData, m int
if poolName, ok := d.GetOk("pool_name"); ok {
req.PoolName = poolName.(string)
}
if architecture, ok := d.GetOk("architecture"); ok {
req.Architecture = architecture.(string)
}
imageId, err := c.CloudBroker().Image().CreateCDROMImage(ctx, req)
if err != nil {

View File

@@ -33,13 +33,16 @@ package image
import (
"context"
"fmt"
"strconv"
"strings"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/image"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
@@ -54,26 +57,54 @@ func resourceImageCreate(ctx context.Context, d *schema.ResourceData, m interfac
c := m.(*controller.ControllerCfg)
syncMode := d.Get("sync_mode").(bool)
log.Debugf("resourceImageCreate: sync_mode = %t", d.Get("sync_mode").(bool))
var imageId uint64
req, err := CreateRequest(ctx, d, m, url.(string))
if syncMode {
req, err := SyncCreateRequest(ctx, d, m, url.(string))
if err != nil {
return diag.FromErr(err)
}
imageId, err = c.CloudBroker().Image().SyncCreate(ctx, req)
if err != nil {
return diag.FromErr(err)
}
} else {
req, err := CreateRequest(ctx, d, m, url.(string))
if err != nil {
return diag.FromErr(err)
}
imageId, err = c.CloudBroker().Image().CreateImage(ctx, req)
log.Debugf("resourceImageCreate: imageID = %d", imageId)
if err != nil {
return diag.FromErr(err)
}
} else {
if err != nil {
return diag.FromErr(err)
}
taskID, err := c.CloudBroker().Image().AsyncCreateImage(ctx, req)
if err != nil {
return diag.FromErr(err)
}
taskReq := tasks.GetRequest{
AuditID: strings.Trim(taskID, `"`),
}
for {
time.Sleep(time.Second * 15)
task, err := c.CloudBroker().Tasks().Get(ctx, taskReq)
if err != nil {
return diag.FromErr(err)
}
log.Debugf("resourceAccountDelete: delete account - %s", task.Stage)
if task.Completed {
if task.Error != "" {
return diag.FromErr(fmt.Errorf("cannot delete account: %v", task.Error))
}
id, err := task.Result.ID()
imageId = uint64(id)
if err != nil {
return diag.FromErr(err)
}
break
}
}
}
d.SetId(strconv.FormatUint(imageId, 10))

View File

@@ -59,12 +59,11 @@ func resourceImageFromPlatformDiskCreate(ctx context.Context, d *schema.Resource
}
req := disks.FromPlatformDiskRequest{
DiskID: uint64(d.Get("disk_id").(int)),
Name: d.Get("name").(string),
BootType: d.Get("boot_type").(string),
ImageType: d.Get("image_type").(string),
Architecture: d.Get("architecture").(string),
Bootable: d.Get("bootable").(bool), // default is true
DiskID: uint64(d.Get("disk_id").(int)),
Name: d.Get("name").(string),
BootType: d.Get("boot_type").(string),
ImageType: d.Get("image_type").(string),
Bootable: d.Get("bootable").(bool), // default is true
}
if username, ok := d.GetOk("username"); ok {

View File

@@ -1192,7 +1192,8 @@ func resourceImageSchemaMake() map[string]*schema.Schema {
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"KVM_X86"}, false),
},
Description: "List of types of compute suitable for image. Example: [ \"KVM_X86\" ]",
},
@@ -1253,7 +1254,6 @@ func resourceImageSchemaMake() map[string]*schema.Schema {
},
"architecture": {
Type: schema.TypeString,
Optional: true,
Computed: true,
Description: "binary architecture of this image, one of X86_64",
},
@@ -1991,13 +1991,6 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.StringInSlice([]string{"linux", "windows", "unknown"}, true),
Description: "Image type linux, windows or unknown",
},
"architecture": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"X86_64"}, true),
Description: "Image type linux, windows or other",
},
"username": {
Type: schema.TypeString,
Optional: true,
@@ -2016,6 +2009,10 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "AccountId to make the image exclusive",
},
"architecture": {
Type: schema.TypeString,
Computed: true,
},
"sep_id": {
Type: schema.TypeInt,
Computed: true,

View File

@@ -57,9 +57,6 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData,
if status, ok := d.GetOk("status"); ok {
req.Status = status.(string)
}
if architecture, ok := d.GetOk("architecture"); ok {
req.Architecture = architecture.(string)
}
if typeImage, ok := d.GetOk("type_image"); ok {
req.TypeImage = typeImage.(string)
}

View File

@@ -38,58 +38,6 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/image"
)
func SyncCreateRequest(ctx context.Context, d *schema.ResourceData, m interface{}, url string) (image.SyncCreateRequest, error) {
req := image.SyncCreateRequest{
Name: d.Get("name").(string),
URL: url,
BootType: d.Get("boot_type").(string),
ImageType: d.Get("image_type").(string),
}
if _, ok := d.GetOk("drivers"); ok {
drivers := []string{}
for _, driver := range d.Get("drivers").([]interface{}) {
drivers = append(drivers, driver.(string))
}
req.Drivers = drivers
}
if hotresize, ok := d.GetOk("hot_resize"); ok {
req.HotResize = hotresize.(bool)
}
if username, ok := d.GetOk("username"); ok {
req.Username = username.(string)
}
if password, ok := d.GetOk("password"); ok {
req.Password = password.(string)
}
if accountId, ok := d.GetOk("account_id"); ok {
req.AccountID = uint64(accountId.(int))
}
if usernameDL, ok := d.GetOk("username_dl"); ok {
req.UsernameDL = usernameDL.(string)
}
if passwordDL, ok := d.GetOk("password_dl"); ok {
req.PasswordDL = passwordDL.(string)
}
if sepId, ok := d.GetOk("sep_id"); ok {
req.SEPID = uint64(sepId.(int))
}
if poolName, ok := d.GetOk("pool_name"); ok {
req.PoolName = poolName.(string)
}
if architecture, ok := d.GetOk("architecture"); ok {
req.Architecture = architecture.(string)
}
if bootable, ok := d.GetOk("bootable"); ok {
req.Bootable = bootable.(bool)
}
if networkInterfaceNaming, ok := d.GetOk("network_interface_naming"); ok {
req.NetworkInterfaceNaming = networkInterfaceNaming.(string)
}
return req, nil
}
func CreateRequest(ctx context.Context, d *schema.ResourceData, m interface{}, url string) (image.CreateRequest, error) {
req := image.CreateRequest{
Name: d.Get("name").(string),
@@ -130,9 +78,6 @@ func CreateRequest(ctx context.Context, d *schema.ResourceData, m interface{}, u
if poolName, ok := d.GetOk("pool_name"); ok {
req.PoolName = poolName.(string)
}
if architecture, ok := d.GetOk("architecture"); ok {
req.Architecture = architecture.(string)
}
if bootable, ok := d.GetOk("bootable"); ok {
req.Bootable = bootable.(bool)
}

View File

@@ -68,6 +68,7 @@ func flattenResourceK8sCP(d *schema.ResourceData, k8s k8s.RecordK8S, masters []c
d.Set("highly_available_lb", k8s.HighlyAvailableLB)
d.Set("address_vip", flattenAddressVIP(k8s.AddressVIP))
d.Set("extnet_only", k8s.ExtnetOnly)
d.Set("zone_id", k8s.ZoneID)
flattenCPParams(d, k8s.K8SGroups.Masters, masters)
}
@@ -109,6 +110,7 @@ func flattenK8sData(d *schema.ResourceData, cluster *k8s.RecordK8S, masters []co
d.Set("address_vip", flattenAddressVIP(cluster.AddressVIP))
d.Set("extnet_only", cluster.ExtnetOnly)
d.Set("with_lb", cluster.WithLB)
d.Set("zone_id", cluster.ZoneID)
}
func flattenAddressVIP(addressVIP k8s.K8SAddressVIP) []map[string]interface{} {
@@ -295,6 +297,7 @@ func flattenK8sItems(k8sList *k8s.ListK8S) []map[string]interface{} {
"updated_by": item.UpdatedBy,
"updated_time": item.UpdatedTime,
"vins_id": item.VINSID,
"zone_id": item.ZoneID,
"workers_groups": flattenWorkersGroupList(item.WorkersGroup),
}

View File

@@ -114,6 +114,10 @@ func resourceK8sCPCreate(ctx context.Context, d *schema.ResourceData, m interfac
createReq.ExtNetID = 0
}
if zoneID, ok := d.GetOk("zone_id"); ok {
createReq.ZoneID = uint64(zoneID.(int))
}
if vins, ok := d.GetOk("vins_id"); ok {
createReq.VinsId = uint64(vins.(int))
} else {
@@ -398,6 +402,14 @@ func resourceK8sCPUpdate(ctx context.Context, d *schema.ResourceData, m interfac
}
}
if d.HasChange("zone_id") {
start := d.Get("start").(bool)
err := handleZoneID(ctx, c, k8sData.ID, uint64(d.Get("zone_id").(int)), start)
if err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("start") {
err := handleStart(ctx, c, d.Get("start").(bool), k8sData)
if err != nil {
@@ -588,6 +600,43 @@ func handleStart(ctx context.Context, c *controller.ControllerCfg, start bool, k
return nil
}
func handleZoneID(ctx context.Context, c *controller.ControllerCfg, k8sId uint64, zoneID uint64, start bool) error {
if start {
stopReq := k8s.StopRequest{
K8SID: k8sId,
}
_, err := c.CloudBroker().K8S().Stop(ctx, stopReq)
if err != nil {
return err
}
}
req := k8s.MigrateToZoneRequest{
K8SID: k8sId,
ZoneID: zoneID,
}
_, err := c.CloudBroker().K8S().MigrateToZone(ctx, req)
if err != nil {
return err
}
if start {
startReq := k8s.StartRequest{
K8SID: k8sId,
}
_, err := c.CloudBroker().K8S().Start(ctx, startReq)
if err != nil {
return err
}
}
return nil
}
func handleUpdateLbSysctlParams(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, k8sData *k8s.RecordK8S) error {
lbSysctlParams := d.Get("lb_sysctl_params").([]interface{})

View File

@@ -179,6 +179,10 @@ func dataSourceK8sListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"k8sci_id": {
Type: schema.TypeInt,
Computed: true,
@@ -491,6 +495,10 @@ func dataSourceK8sListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"k8sci_id": {
Type: schema.TypeInt,
Computed: true,
@@ -1017,6 +1025,10 @@ func dataSourceK8sSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"created_by": {
Type: schema.TypeString,
Computed: true,
@@ -1343,6 +1355,11 @@ func resourceK8sCPSchemaMake() map[string]*schema.Schema {
Description: "Network plugin to be used",
ValidateFunc: validation.StringInSlice([]string{"flannel", "weavenet", "calico"}, true),
},
"zone_id": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"num": {
Type: schema.TypeInt,
Optional: true,

View File

@@ -103,6 +103,7 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
d.Set("boot_type", computeRec.BootType)
d.Set("hot_resize", computeRec.HotResize)
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
d.Set("zone_id", computeRec.ZoneID)
return nil
}
@@ -161,7 +162,6 @@ func flattenOSUsers(users compute.ListOSUsers) []map[string]interface{} {
func flattenInterfaces(ifaces compute.ListInterfaces) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(ifaces))
for _, iface := range ifaces {
res = append(res, map[string]interface{}{
"bus_number": iface.BusNumber,
@@ -182,13 +182,14 @@ func flattenInterfaces(ifaces compute.ListInterfaces) []map[string]interface{} {
"node_id": iface.NodeID,
"pci_slot": iface.PCISlot,
"qos": flattenQOS(iface.QOS),
"sdn_interface_id": iface.SDNInterfaceID,
"target": iface.Target,
"type": iface.Type,
"trunk_tags": iface.TrunkTags,
"vnfs": iface.VNFs,
"libvirt_settings": flattenLibvirtSettings(iface.LibvirtSettings),
})
}
return res
}
@@ -290,6 +291,7 @@ func flattenAffinityRules(rules compute.ListRules) []map[string]interface{} {
func flattenComputeList(computes *compute.ListComputes) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(computes.Data))
for _, computeItem := range computes.Data {
customFields, _ := json.Marshal(computeItem.CustomFields)
devices, _ := json.Marshal(computeItem.Devices)
userData, _ := json.Marshal(computeItem.Userdata)
@@ -327,6 +329,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"cpu_pin": computeItem.CPUPin,
"image_id": computeItem.ImageID,
"interfaces": flattenInterfaces(computeItem.Interfaces),
"live_migration_job_id": computeItem.LiveMigrationJobID,
"lock_status": computeItem.LockStatus,
"manager_id": computeItem.ManagerID,
"manager_type": computeItem.ManagerType,
@@ -340,6 +343,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"os_users": flattenOSUsers(computeItem.OSUsers),
"pinned": computeItem.PinnedToStack,
"preferred_cpu": computeItem.PreferredCPU,
"qemu_guest": flattenQemuQuest(computeItem.QemuQuest),
"ram": computeItem.RAM,
"reference_id": computeItem.ReferenceID,
"registered": computeItem.Registered,
@@ -367,9 +371,11 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"boot_type": computeItem.BootType,
"hot_resize": computeItem.HotResize,
"network_interface_naming": computeItem.NetworkInterfaceNaming,
"zone_id": computeItem.ZoneID,
}
res = append(res, temp)
}
return res
}
@@ -452,6 +458,7 @@ func flattenDeletedComputeList(computes *compute.ListDeletedComputes) []map[stri
"boot_type": computeItem.BootType,
"hot_resize": computeItem.HotResize,
"network_interface_naming": computeItem.NetworkInterfaceNaming,
"zone_id": computeItem.ZoneID,
}
res = append(res, temp)
}
@@ -738,6 +745,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("image_id", compFacts.ImageID)
d.Set("image_name", compFacts.ImageName)
d.Set("interfaces", flattenInterfaces(compFacts.Interfaces))
d.Set("live_migration_job_id", compFacts.LiveMigrationJobID)
d.Set("lock_status", compFacts.LockStatus)
d.Set("manager_id", compFacts.ManagerID)
d.Set("manager_type", compFacts.ManagerType)
@@ -755,6 +763,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("os_users", flattenOSUsers(compFacts.OSUsers))
d.Set("pinned", compFacts.PinnedToStack)
d.Set("preferred_cpu", compFacts.PreferredCPU)
d.Set("qemu_guest", flattenQemuQuest(compFacts.QemuQuest))
d.Set("ram", compFacts.RAM)
d.Set("reference_id", compFacts.ReferenceID)
d.Set("registered", compFacts.Registered)
@@ -783,6 +792,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("boot_type", compFacts.BootType)
d.Set("hot_resize", compFacts.HotResize)
d.Set("network_interface_naming", compFacts.NetworkInterfaceNaming)
d.Set("zone_id", compFacts.ZoneID)
//extra fields setting
bootDisk := findBootDisk(compFacts.Disks)
if bootDisk != nil {
@@ -811,6 +821,7 @@ func parseComputeInterfacesToNetworks(networks []interface{}, ifaces compute.Lis
elem["ip_address"] = value.IPAddress
elem["mac"] = value.MAC
elem["mtu"] = value.MTU
elem["sdn_interface_id"] = value.SDNInterfaceID
elem["weight"] = flattenNetworkWeight(networks, value.NetID, value.NetType)
result = append(result, elem)
@@ -854,7 +865,6 @@ func flattenDisk(diskList compute.ListDisks) []map[string]interface{} {
"login": disk.Login,
"milestones": disk.Milestones,
"name": disk.Name,
"order": disk.Order,
"params": disk.Params,
"parent_id": disk.ParentID,
"passwd": disk.Password,
@@ -878,7 +888,6 @@ func flattenDisk(diskList compute.ListDisks) []map[string]interface{} {
"status": disk.Status,
"tech_status": disk.TechStatus,
"type": disk.Type,
"vmid": disk.VMID,
}
res = append(res, temp)
}
@@ -969,3 +978,19 @@ func flattenVGPUs(vgpus []compute.VGPUItem) []map[string]interface{} {
return res
}
func flattenQemuQuest(qemuQuest compute.QemuQuest) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
temp := map[string]interface{}{
"enabled": qemuQuest.Enabled,
"enabled_agent_features": qemuQuest.EnabledAgentFeatures,
"guid": qemuQuest.GUID,
"last_update": uint64(qemuQuest.LastUpdate),
"user": qemuQuest.User,
}
res = append(res, temp)
return res
}

View File

@@ -36,7 +36,9 @@ func checkParamsExistence(ctx context.Context, d *schema.ResourceData, c *contro
func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) []error {
var errs []error
var vinsIds, extNetIds, vfpoolIds, dpdkIds []uint64
var vinsIds, extNetIds, vfpoolIds, dpdkIds, trunkIds []uint64
//TODO
//var sdnIds []string
networksIface, ok := d.GetOk("network")
if !ok {
@@ -56,6 +58,12 @@ func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.Co
vfpoolIds = append(vfpoolIds, uint64(network["net_id"].(int)))
case "DPDK":
dpdkIds = append(dpdkIds, uint64(network["net_id"].(int)))
case "TRUNK":
trunkIds = append(trunkIds, uint64(network["net_id"].(int)))
//TODO
//case "SDN": sdnIds = append(sdnIds, network["sdn_interface_id"].(string))
default:
continue
}
@@ -77,5 +85,14 @@ func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.Co
errs = append(errs, dpdkErrs...)
}
if trunkErrs := ic.ExistTrunkNet(ctx, trunkIds, c); trunkErrs != nil {
errs = append(errs, trunkErrs...)
}
//TODO
//if sdnErrs := ic.ExistSDNNet(ctx, sdnIds, c); sdnErrs != nil {
// errs = append(errs, sdnErrs...)
//}
return errs
}

View File

@@ -87,6 +87,10 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
createReqX86.IS = IS.(string)
}
if zoneID, ok := d.GetOk("zone_id"); ok {
createReqX86.ZoneID = uint64(zoneID.(int))
}
createReqX86.Interfaces = make([]kvmx86.Interface, 0)
if networks, ok := d.GetOk("network"); ok {
@@ -112,7 +116,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
NetID: uint64(netInterfaceVal["net_id"].(int)),
}
if reqInterface.NetType == "DPDK" {
if reqInterface.NetType == "DPDK" || reqInterface.NetType == "EXTNET" {
reqInterface.MTU = uint64(netInterfaceVal["mtu"].(int))
}
@@ -126,6 +130,11 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
reqInterface.MAC = macaddr.(string)
}
sdnID, sdnSet := netInterfaceVal["sdn_interface_id"]
if sdnSet {
reqInterface.SDNInterfaceID = sdnID.(string)
}
interfacesX86 = append(interfacesX86, reqInterface)
}
createReqX86.Interfaces = interfacesX86
@@ -861,6 +870,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
if d.HasChange("zone_id") {
if err := utilityComputeUpdateZoneID(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
return append(resourceComputeRead(ctx, d, m), warnings.Get()...)
}

View File

@@ -32,7 +32,7 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
Type: schema.TypeString,
Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -366,10 +366,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"order": {
Type: schema.TypeInt,
Computed: true,
},
"params": {
Type: schema.TypeString,
Computed: true,
@@ -522,10 +518,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"vmid": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
@@ -702,6 +694,14 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"trunk_tags": {
Type: schema.TypeString,
Computed: true,
},
"sdn_interface_id": {
Type: schema.TypeString,
Computed: true,
},
"vnfs": {
Type: schema.TypeList,
Computed: true,
@@ -712,6 +712,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
},
},
},
"live_migration_job_id": {
Type: schema.TypeInt,
Computed: true,
},
"lock_status": {
Type: schema.TypeString,
Computed: true,
@@ -803,6 +807,37 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
"qemu_guest": {
Type: schema.TypeList,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"enabled": {
Type: schema.TypeBool,
Computed: true,
},
"enabled_agent_features": {
Type: schema.TypeList,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Computed: true,
},
"guid": {
Type: schema.TypeString,
Computed: true,
},
"last_update": {
Type: schema.TypeInt,
Computed: true,
},
"user": {
Type: schema.TypeString,
Computed: true,
},
},
},
Computed: true,
},
"ram": {
Type: schema.TypeInt,
Computed: true,
@@ -1047,6 +1082,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
}
return res
}
@@ -1146,7 +1185,6 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Default: false,
Description: "If set to true, ignores any VMs associated with any k8s cluster",
},
"items": {
Type: schema.TypeList,
Computed: true,
@@ -1158,7 +1196,7 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
Type: schema.TypeString,
Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -1519,6 +1557,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
},
},
},
"sdn_interface_id": {
Type: schema.TypeString,
Computed: true,
},
"target": {
Type: schema.TypeString,
Computed: true,
@@ -1527,6 +1569,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"trunk_tags": {
Type: schema.TypeString,
Computed: true,
},
"vnfs": {
Type: schema.TypeList,
Computed: true,
@@ -1537,6 +1583,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
},
},
},
"live_migration_job_id": {
Type: schema.TypeInt,
Computed: true,
},
"lock_status": {
Type: schema.TypeString,
Computed: true,
@@ -1612,6 +1662,37 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
"qemu_guest": {
Type: schema.TypeList,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"enabled": {
Type: schema.TypeBool,
Computed: true,
},
"enabled_agent_features": {
Type: schema.TypeList,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Computed: true,
},
"guid": {
Type: schema.TypeString,
Computed: true,
},
"last_update": {
Type: schema.TypeInt,
Computed: true,
},
"user": {
Type: schema.TypeString,
Computed: true,
},
},
},
Computed: true,
},
"ram": {
Type: schema.TypeInt,
Computed: true,
@@ -1762,6 +1843,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
@@ -1851,7 +1936,7 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
Type: schema.TypeString,
Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -2208,6 +2293,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
},
},
},
"sdn_interface_id": {
Type: schema.TypeString,
Computed: true,
},
"target": {
Type: schema.TypeString,
Computed: true,
@@ -2216,6 +2305,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"trunk_tags": {
Type: schema.TypeString,
Computed: true,
},
"vnfs": {
Type: schema.TypeList,
Computed: true,
@@ -2447,6 +2540,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
@@ -3133,7 +3230,7 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Required: true,
StateFunc: statefuncs.StateFuncToUpper,
ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating
ValidateFunc: validation.StringInSlice([]string{"KVM_X86"}, false), // observe case while validating
Description: "Hardware architecture of this compute instance.",
},
"cpu": {
@@ -3156,6 +3253,11 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Optional: true,
Description: "ID of the OS image to base this compute instance on.",
},
"zone_id": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"chipset": {
Type: schema.TypeString,
Optional: true,
@@ -3241,8 +3343,8 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Required: true,
StateFunc: statefuncs.StateFuncToUpper,
ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK"}, false), // observe case while validating
Description: "Type of the network for this connection, either EXTNET or VINS.",
ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "TRUNK"}, false), // observe case while validating
Description: "Type of the network for this connection",
},
"net_id": {
Type: schema.TypeInt,
@@ -3277,6 +3379,13 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.IntBetween(1, 9216),
Description: "Maximum transmission unit, used only for DPDK type, must be 1-9216",
},
"sdn_interface_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
DiffSuppressFunc: networkSubresIPAddreDiffSupperss,
Description: "unique_identifier of LogicalPort on SDN side",
},
},
},
Description: "Optional network connection(s) for this compute. You may specify several network blocks, one for each connection.",
@@ -3749,7 +3858,7 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
Type: schema.TypeString,
Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -3979,6 +4088,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
},
},
},
"sdn_interface_id": {
Type: schema.TypeString,
Computed: true,
},
"target": {
Type: schema.TypeString,
Computed: true,
@@ -3987,6 +4100,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"trunk_tags": {
Type: schema.TypeString,
Computed: true,
},
"vnfs": {
Type: schema.TypeList,
Computed: true,

View File

@@ -589,8 +589,7 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
oldList := oldSet.(*schema.Set).List()
newList := newSet.(*schema.Set).List()
detachMap, changeIpMap, changeMacMap, attachMap := differenceNetwork(oldList, newList)
detachMap, changeIpMap, changeMacMap, changeMTUMap, attachMap := differenceNetwork(oldList, newList)
apiErrCount := 0
var lastSavedError error
@@ -697,6 +696,14 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
req.MACAddr = netData["mac"].(string)
}
if req.NetType == "DPDK" {
req.MTU = uint64(netData["mtu"].(int))
}
if netData["sdn_interface_id"].(string) != "" {
req.SDNInterfaceID = netData["sdn_interface_id"].(string)
}
_, err := c.CloudBroker().Compute().NetAttach(ctx, req)
if err != nil {
log.Errorf("utilityComputeNetworksConfigure: failed to attach net ID %d of type %s to Compute ID %s: %s",
@@ -759,6 +766,24 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
}
}
log.Debugf("utilityComputeNetworksConfigure: changeMTU set has %d items for Compute ID %s", len(changeMTUMap), d.Id())
for _, netData := range changeMTUMap {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
req := compute.ChangeMTURequest{
ComputeID: computeId,
Interface: netData["mac"].(string),
MTU: uint64(netData["mtu"].(int)),
}
_, err := c.CloudBroker().Compute().ChangeMTU(ctx, req)
if err != nil {
log.Errorf("utilityComputeNetworksConfigure: failed to change MTU ID %d of type %s from Compute ID %s: %s",
netData["net_id"].(int), netData["net_type"].(string), d.Id(), err)
apiErrCount++
lastSavedError = err
}
}
if apiErrCount > 0 {
log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s",
apiErrCount, d.Id(), lastSavedError)
@@ -768,17 +793,18 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
return nil
}
func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, changeMacMap, attachMap []map[string]interface{}) {
func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, changeMacMap, changeMTUMap, attachMap []map[string]interface{}) {
attachMap = make([]map[string]interface{}, 0)
changeIpMap = make([]map[string]interface{}, 0)
changeMacMap = make([]map[string]interface{}, 0)
changeMTUMap = make([]map[string]interface{}, 0)
detachMap = make([]map[string]interface{}, 0)
for _, oldNetwork := range oldList {
oldMap := oldNetwork.(map[string]interface{})
found := false
for _, newNetwork := range newList {
newMap := newNetwork.(map[string]interface{})
if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
if compareNetwork(newMap, oldMap) {
found = true
if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && (newMap["ip_address"] != oldMap["ip_address"] && newMap["ip_address"].(string) != "") {
changeIpMap = append(changeIpMap, newMap)
@@ -787,6 +813,9 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
newMap["old_mac"] = oldMap["mac"]
changeMacMap = append(changeMacMap, newMap)
}
if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "DPDK") && (newMap["mtu"] != oldMap["mtu"] && newMap["mtu"].(int) != 0) {
changeMTUMap = append(changeMTUMap, newMap)
}
}
if found {
break
@@ -803,7 +832,7 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
found := false
for _, oldNetwork := range oldList {
oldMap := oldNetwork.(map[string]interface{})
if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
if compareNetwork(newMap, oldMap) {
found = true
break
}
@@ -817,6 +846,10 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
return
}
func compareNetwork(newMap, oldMap map[string]interface{}) bool {
return newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["sdn_interface_id"] == oldMap["sdn_interface_id"] && newMap["weight"] == oldMap["weight"]
}
func hasDPDKnetwork(networkAttachMap []map[string]interface{}) bool {
for _, elem := range networkAttachMap {
if elem["net_type"].(string) == "DPDK" {
@@ -1587,6 +1620,28 @@ func utilityComputeUpdateImage(ctx context.Context, d *schema.ResourceData, m in
return nil
}
func utilityComputeUpdateZoneID(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
req := compute.MigrateToZoneRequest{
ComputeID: computeId,
}
zoneID, ok := d.GetOk("zone_id")
if ok {
req.ZoneID = uint64(zoneID.(int))
}
_, err := c.CloudBroker().Compute().MigrateToZone(ctx, req)
if err != nil {
return err
}
return nil
}
func utilityComputeUpdateCustomFields(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)

View File

@@ -93,6 +93,7 @@ func flattenResourceLBBackend(d *schema.ResourceData, b *lb.ItemBackend, lbId in
}
func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) {
d.Set("account_id", lb.AccountID)
d.Set("ha_mode", lb.HAMode)
d.Set("ckey", lb.CKey)
d.Set("meta", flattens.FlattenMeta(lb.Meta))
@@ -121,6 +122,7 @@ func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) {
d.Set("tech_status", lb.TechStatus)
d.Set("user_managed", lb.UserManaged)
d.Set("vins_id", lb.VINSID)
d.Set("zone_id", lb.ZoneID)
}
func flattenNode(node lb.Node) []map[string]interface{} {
@@ -253,6 +255,7 @@ func flattenLBList(lbl *lb.ListLB) []map[string]interface{} {
"updated_time": lb.UpdatedTime,
"user_managed": lb.UserManaged,
"vins_id": lb.VINSID,
"zone_id": lb.ZoneID,
}
res = append(res, temp)
}

View File

@@ -67,6 +67,9 @@ func resourceLBCreate(ctx context.Context, d *schema.ResourceData, m interface{}
if desc, ok := d.GetOk("desc"); ok {
req.Description = desc.(string)
}
if zoneID, ok := d.GetOk("zone_id"); ok {
req.ZoneID = uint64(zoneID.(int))
}
if haMode, ok := d.GetOk("ha_mode"); ok {
req.HighlyAvailable = haMode.(bool)
}
@@ -303,6 +306,12 @@ func resourceLBUpdate(ctx context.Context, d *schema.ResourceData, m interface{}
}
}
if d.HasChange("zone_id") {
if err := resourceLbChangeZoneID(ctx, d, lbRec.ID, m); err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("sysctl_params") {
if err := resourceLbChangeSysctlParams(ctx, d, lbRec.ID, m); err != nil {
return diag.FromErr(err)
@@ -436,6 +445,46 @@ func resourceLbChangeHaMode(ctx context.Context, d *schema.ResourceData, lbId ui
return nil
}
func resourceLbChangeZoneID(ctx context.Context, d *schema.ResourceData, lbId uint64, m interface{}) error {
c := m.(*controller.ControllerCfg)
start := d.Get("start").(bool)
if start {
reqStop := lb.StopRequest{
LBID: uint64(d.Get("lb_id").(int)),
}
_, err := c.CloudBroker().LB().Stop(ctx, reqStop)
if err != nil {
return err
}
}
req := lb.MigrateToZoneRequest{
LBID: uint64(d.Get("lb_id").(int)),
ZoneID: uint64(d.Get("zone_id").(int)),
}
_, err := c.CloudBroker().LB().MigrateToZone(ctx, req)
if err != nil {
return err
}
if start {
reqStart := lb.StartRequest{
LBID: uint64(d.Get("lb_id").(int)),
}
_, err = c.CloudBroker().LB().Start(ctx, reqStart)
if err != nil {
return err
}
}
return nil
}
func resourceLbChangeStart(ctx context.Context, d *schema.ResourceData, lbId uint64, m interface{}) error {
c := m.(*controller.ControllerCfg)
start := d.Get("start").(bool)

View File

@@ -43,6 +43,10 @@ func dsLBSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Required: true,
},
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"ha_mode": {
Type: schema.TypeBool,
Computed: true,
@@ -51,6 +55,11 @@ func dsLBSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"meta": {
Type: schema.TypeList,
Computed: true,
@@ -456,6 +465,10 @@ func dsLBListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"backends": {
Type: schema.TypeList,
Computed: true,
@@ -473,6 +486,10 @@ func dsLBListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"server_default_settings": {
Type: schema.TypeList,
Computed: true,
@@ -885,6 +902,10 @@ func dsLBListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"backend_haip": {
Type: schema.TypeString,
Computed: true,
@@ -1258,6 +1279,11 @@ func lbResourceSchemaMake() map[string]*schema.Schema {
Optional: true,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"vins_id": {
Type: schema.TypeInt,
Optional: true,

View File

@@ -66,6 +66,7 @@ func flattenNode(d *schema.ResourceData, item *node.RecordNode) {
d.Set("to_maintenance", flattenRole(item.ToMaintenance))
d.Set("to_restricted", flattenRole(item.ToRestricted))
d.Set("version", item.Version)
d.Set("zone_id", item.ZoneID)
}
func flattenConsumption(info node.ConsumptionInfo) []map[string]interface{} {
@@ -113,46 +114,48 @@ func flattenNodeList(nodes *node.ListNodes) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(nodes.Data))
for _, item := range nodes.Data {
temp := map[string]interface{}{
"additional_pkgs": flattenNodeItem(item.AdditionalPkgs),
"cpu_info": flattenCpuInfo(item.CpuInfo),
"description": item.Description,
"dpdk": flattenDPDKItem(item.DPDK),
"gid": item.GID,
"guid": item.GUID,
"hostkey": item.HostKey,
"node_id": item.ID,
"ipaddr": item.IPAddr,
"isolated_cpus": flattenNodeItem(item.IsolatedCpus),
"lastcheck": item.LastCheck,
"machine_guid": item.MachineGUID,
"mainboard_sn": item.MainboardSN,
"memory": item.Memory,
"milestones": item.Milestones,
"model": item.Model,
"name": item.Name,
"need_reboot": item.NeedReboot,
"net_addr": flattenNetAddr(item.NetAddr),
"network_mode": item.NetworkMode,
"nic_info": flattenNicInfo(item.NicInfo),
"node_uuid": item.NodeUUID,
"numa_topology": flattenNumaTopology(item.NumaTopology),
"peer_backup": item.PeerBackup,
"peer_log": item.PeerLog,
"peer_stats": item.PeerStats,
"pgpus": item.Pgpus,
"public_keys": item.PublicKeys,
"release": item.Release,
"reserved_cpus": flattenNodeItem(item.ReservedCPUs),
"roles": item.Roles,
"seps": item.Seps,
"serial_num": item.SerialNum,
"sriov_enabled": item.SriovEnabled,
"stack_id": item.StackID,
"status": item.Status,
"tags": item.Tags,
"type": item.Type,
"uefi_firmware_file": item.UEFIFirmwareFile,
"version": item.Version,
"additional_pkgs": flattenNodeItem(item.AdditionalPkgs),
"cpu_info": flattenCpuInfo(item.CpuInfo),
"description": item.Description,
"dpdk": flattenDPDKItem(item.DPDK),
"gid": item.GID,
"guid": item.GUID,
"hostkey": item.HostKey,
"node_id": item.ID,
"ipaddr": item.IPAddr,
"isolated_cpus": flattenNodeItem(item.IsolatedCpus),
"lastcheck": item.LastCheck,
"machine_guid": item.MachineGUID,
"mainboard_sn": item.MainboardSN,
"memory": item.Memory,
"milestones": item.Milestones,
"model": item.Model,
"name": item.Name,
"need_reboot": item.NeedReboot,
"net_addr": flattenNetAddr(item.NetAddr),
"network_mode": item.NetworkMode,
"nic_info": flattenNicInfo(item.NicInfo),
"node_uuid": item.NodeUUID,
"numa_topology": flattenNumaTopology(item.NumaTopology),
"peer_backup": item.PeerBackup,
"peer_log": item.PeerLog,
"peer_stats": item.PeerStats,
"pgpus": item.Pgpus,
"public_keys": item.PublicKeys,
"release": item.Release,
"reserved_cpus": flattenNodeItem(item.ReservedCPUs),
"roles": item.Roles,
"sdn_hypervisor_name": item.SDNHypervisorName,
"seps": item.Seps,
"serial_num": item.SerialNum,
"sriov_enabled": item.SriovEnabled,
"stack_id": item.StackID,
"status": item.Status,
"tags": item.Tags,
"type": item.Type,
"uefi_firmware_file": item.UEFIFirmwareFile,
"version": item.Version,
"zone_id": item.ZoneID,
}
res = append(res, temp)
}

View File

@@ -409,6 +409,10 @@ func dataSourceNodeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
}
}
@@ -798,6 +802,10 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"sdn_hypervisor_name": {
Type: schema.TypeString,
Computed: true,
},
"seps": {
Type: schema.TypeList,
Computed: true,
@@ -840,6 +848,10 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},

View File

@@ -40,6 +40,7 @@ func flattenResgroup(d *schema.ResourceData, rgData *rg.RecordRG) {
d.Set("updated_time", rgData.UpdatedTime)
d.Set("vins", rgData.VINS)
d.Set("computes", rgData.VMs)
d.Set("sdn_access_group_id", rgData.SDNAccessGroupID)
}
func flattenRgAcl(rgACLs rg.ListACL) []map[string]interface{} {
@@ -411,6 +412,7 @@ func flattenRgList(rgl *rg.ListRG) []map[string]interface{} {
"updated_time": rg.UpdatedTime,
"vins": rg.VINS,
"vms": rg.VMs,
"sdn_access_group_id": rg.SDNAccessGroupID,
}
res = append(res, temp)
}
@@ -495,4 +497,5 @@ func flattenResourceRG(d *schema.ResourceData, rgData *rg.RecordRG) {
d.Set("updated_time", rgData.UpdatedTime)
d.Set("vins", rgData.VINS)
d.Set("vms", rgData.VMs)
d.Set("sdn_access_group_id", rgData.SDNAccessGroupID)
}

View File

@@ -137,6 +137,10 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
}
}
if sdnAccessGroupID, ok := d.GetOk("sdn_access_group_id"); ok {
req.SDNAccessGroupID = sdnAccessGroupID.(string)
}
rgID, err := c.CloudBroker().RG().Create(ctx, req)
if err != nil {
d.SetId("")

View File

@@ -199,6 +199,10 @@ func dataSourceRgSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
"sdn_access_group_id": {
Type: schema.TypeString,
Computed: true,
},
}
}
@@ -1967,6 +1971,10 @@ func dataSourceRgListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"sdn_access_group_id": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
@@ -2375,9 +2383,15 @@ func resourceRgSchemaMake() map[string]*schema.Schema {
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"}, true),
ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}, true),
},
},
"sdn_access_group_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
Description: "ID of the SDN access group",
},
"acl": {
Type: schema.TypeList,

View File

@@ -0,0 +1,45 @@
package trunk
import (
"context"
"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
)
func dataSourceTrunkRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("dataSourceTrunkRead: called with name %s", d.Get("name").(string))
w := dc.Warnings{}
trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
flattenTrunk(d, trunkItem)
return w.Get()
}
func DataSourceTrunk() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceTrunkRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceTrunkSchemaMake(),
}
}

View File

@@ -0,0 +1,43 @@
package trunk
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"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
)
func dataSourceTrunkListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
w := dc.Warnings{}
trunkList, err := utilityTrunkListCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("items", flattenTrunkList(trunkList))
d.Set("entry_count", trunkList.EntryCount)
return w.Get()
}
func DataSourceTrunkList() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceTrunkListRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceTrunkListSchemaMake(),
}
}

View File

@@ -0,0 +1,78 @@
package trunk
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
)
func flattenTrunkResource(d *schema.ResourceData, details *trunk.ItemTrunk) {
log.Debugf("flattenTrunk: decoded Trunk ID %s",
details.ID)
d.Set("trunk_id", details.ID)
d.Set("guid", details.GUID)
d.Set("name", details.Name)
d.Set("mac", details.MAC)
d.Set("description", details.Description)
d.Set("accountIds", details.AccountIDs)
d.Set("ovsBridge", details.OVSBridge)
d.Set("nativeVlanId", details.NativeVLANID)
d.Set("status", details.Status)
d.Set("trunkTags", details.TrunkTags)
d.Set("created_at", details.CreatedAt)
d.Set("created_by", details.CreatedBy)
d.Set("updated_at", details.UpdatedAt)
d.Set("updated_by", details.UpdatedBy)
d.Set("deleted_at", details.DeletedAt)
d.Set("deleted_by", details.DeletedBy)
}
func flattenTrunk(d *schema.ResourceData, trunkItem *trunk.ItemTrunk) {
log.Debugf("flattenTrunk: decoded Trunk ID %d",
trunkItem.ID)
d.Set("trunk_id", trunkItem.ID)
d.Set("guid", trunkItem.GUID)
d.Set("name", trunkItem.Name)
d.Set("mac", trunkItem.MAC)
d.Set("description", trunkItem.Description)
d.Set("account_ids", trunkItem.AccountIDs)
d.Set("ovs_bridge", trunkItem.OVSBridge)
d.Set("native_vlan_id", trunkItem.NativeVLANID)
d.Set("status", trunkItem.Status)
d.Set("trunk_tags", trunkItem.TrunkTags)
d.Set("created_at", trunkItem.CreatedAt)
d.Set("created_by", trunkItem.CreatedBy)
d.Set("updated_at", trunkItem.UpdatedAt)
d.Set("updated_by", trunkItem.UpdatedBy)
d.Set("deleted_at", trunkItem.DeletedAt)
d.Set("deleted_by", trunkItem.DeletedBy)
}
func flattenTrunkList(trunkList *trunk.ListTrunks) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(trunkList.Data))
for _, trunkItem := range trunkList.Data {
temp := map[string]interface{}{
"account_ids": trunkItem.AccountIDs,
"created_at": trunkItem.CreatedAt,
"created_by": trunkItem.CreatedBy,
"deleted_at": trunkItem.DeletedAt,
"deleted_by": trunkItem.DeletedBy,
"description": trunkItem.Description,
"guid": trunkItem.GUID,
"id": trunkItem.ID,
"mac": trunkItem.MAC,
"name": trunkItem.Name,
"native_vlan_id": trunkItem.NativeVLANID,
"ovs_bridge": trunkItem.OVSBridge,
"status": trunkItem.Status,
"trunk_tags": trunkItem.TrunkTags,
"updated_at": trunkItem.UpdatedAt,
"updated_by": trunkItem.UpdatedBy,
}
res = append(res, temp)
}
return res
}

View File

@@ -0,0 +1,211 @@
package trunk
import (
"context"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
)
func resourceTrunkCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceTrunkCreate: called with name %s, trunk_tags %s, ovs_bridge %s", d.Get("name").(string), d.Get("trunk_tags").(string), d.Get("ovs_bridge").(string))
c := m.(*controller.ControllerCfg)
warnings := dc.Warnings{}
name := d.Get("name").(string)
trunkTags := d.Get("trunk_tags").(string)
ovsBridge := d.Get("ovs_bridge").(string)
createReq := trunk.CreateRequest{
Name: name,
TrunkTags: trunkTags,
OVSBridge: ovsBridge,
}
if description, ok := d.GetOk("description"); ok {
createReq.Description = description.(string)
}
accountIDs := make([]uint64, 0)
if accountAccess, ok := d.GetOk("account_ids"); ok {
IDs := accountAccess.(*schema.Set).List()
for _, ID := range IDs {
accountIDs = append(accountIDs, uint64(ID.(int)))
}
createReq.AccountIDs = accountIDs
}
if nativeVLANID, ok := d.GetOk("native_vlan_id"); ok {
createReq.NativeVLANID = uint64(nativeVLANID.(int))
}
trunkID, err := c.CloudBroker().Trunk().Create(ctx, createReq)
if err != nil {
return diag.FromErr(err)
}
d.SetId(strconv.FormatUint(trunkID, 10))
d.Set("trunk_id", trunkID)
if _, ok := d.GetOk("enable"); ok {
if err := handleTrunkEnabling(ctx, d, c, trunkID); err != nil {
warnings.Add(err)
}
}
return append(warnings.Get(), resourceTrunkRead(ctx, d, m)...)
}
func resourceTrunkRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceTrunkRead: called with name %s", d.Get("name").(string))
w := dc.Warnings{}
trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
flattenTrunkResource(d, trunkItem)
return w.Get()
}
func resourceTrunkUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceTrunkUpdate: called with id %s", d.Id())
c := m.(*controller.ControllerCfg)
trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id, err := strconv.ParseInt(d.Id(), 10, 64)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
if d.HasChanges("name", "trunk_tags", "description", "native_vlan_id") {
req := trunk.UpdateRequest{
TrunkID: uint64(id),
Name: d.Get("name").(string),
TrunkTags: d.Get("trunk_tags").(string),
}
if d.HasChange("description") {
description := d.Get("description").(string)
req.Description = description
}
if d.HasChange("native_vlan_id") {
nativeVLANID := uint64(d.Get("native_vlan_id").(int))
req.NativeVLANID = nativeVLANID
}
if _, err := c.CloudBroker().Trunk().Update(ctx, req); err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("enable") {
if err := handleTrunkEnabling(ctx, d, c, uint64(id)); err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("account_ids") {
if err := handleAccountAccessUpdate(ctx, d, c, trunkItem); err != nil {
return diag.FromErr(err)
}
}
return resourceTrunkRead(ctx, d, m)
}
func resourceTrunkDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceTrunkDelete: called with id %s", d.Id())
trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
c := m.(*controller.ControllerCfg)
req := trunk.DestroyRequest{
TrunkID: trunkItem.ID,
}
_, err = c.CloudBroker().Trunk().Destroy(ctx, req)
if err != nil {
return diag.FromErr(err)
}
d.SetId("")
return nil
}
func ResourceTrunk() *schema.Resource {
return &schema.Resource{
SchemaVersion: 2,
CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error {
if diff.HasChanges() || diff.HasChanges("name", "trunk_tags", "description", "native_vlan_id", "account_ids") {
diff.SetNewComputed("updated_time")
diff.SetNewComputed("updated_by")
}
if diff.HasChanges("enable") {
diff.SetNewComputed("status")
diff.SetNewComputed("updated_time")
diff.SetNewComputed("updated_by")
}
return nil
},
CreateContext: resourceTrunkCreate,
ReadContext: resourceTrunkRead,
UpdateContext: resourceTrunkUpdate,
DeleteContext: resourceTrunkDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Timeouts: &schema.ResourceTimeout{
Create: &constants.Timeout600s,
Read: &constants.Timeout600s,
Update: &constants.Timeout600s,
Delete: &constants.Timeout600s,
Default: &constants.Timeout600s,
},
Schema: resourceTrunkSchemaMake(),
}
}

View File

@@ -0,0 +1,336 @@
package trunk
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
)
func resourceTrunkSchemaMake() map[string]*schema.Schema {
log.Debugf("resourceTrunkSchemaMake: invoked")
return map[string]*schema.Schema{
"trunk_id": {
Type: schema.TypeInt,
Computed: true,
Description: "trunk id",
},
"name": {
Type: schema.TypeString,
Required: true,
Description: "Name of the trunk",
},
"trunk_tags": {
Type: schema.TypeString,
Required: true,
Description: "List of trunk tags (values between 1-4095)",
},
"ovs_bridge": {
Type: schema.TypeString,
Required: true,
Description: "OVS bridge name",
},
"description": {
Type: schema.TypeString,
Optional: true,
Description: "Description of the trunk",
},
"account_ids": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "List of account IDs with access to this trunk",
},
"native_vlan_id": {
Type: schema.TypeInt,
Optional: true,
Description: "Native VLAN ID",
},
"enable": {
Type: schema.TypeBool,
Optional: true,
Default: true,
Description: "Whether the trunk should be enabled",
},
"guid": {
Type: schema.TypeInt,
Computed: true,
Description: "GUID",
},
"mac": {
Type: schema.TypeString,
Computed: true,
Description: "MAC address",
},
"status": {
Type: schema.TypeString,
Computed: true,
Description: "if the trunk is enabled",
},
"created_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was created",
},
"created_by": {
Type: schema.TypeString,
Computed: true,
Description: "who created the trunk",
},
"updated_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was updated",
},
"updated_by": {
Type: schema.TypeString,
Computed: true,
Description: "who updated the trunk",
},
"deleted_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was updated",
},
"deleted_by": {
Type: schema.TypeString,
Computed: true,
Description: "who updated the trunk",
},
}
}
func dataSourceTrunkSchemaMake() map[string]*schema.Schema {
log.Debugf("dataSourceTrunkSchemaMake: invoked")
res := map[string]*schema.Schema{
"trunk_id": {
Type: schema.TypeInt,
Required: true,
Description: "trunk id",
},
"guid": {
Type: schema.TypeInt,
Computed: true,
Description: "GUID",
},
"name": {
Type: schema.TypeString,
Computed: true,
Description: "Name of the trunk",
},
"mac": {
Type: schema.TypeString,
Computed: true,
Description: "MAC address",
},
"description": {
Type: schema.TypeString,
Computed: true,
Description: "Description of the trunk",
},
"account_ids": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "List of account IDs with access to this trunk",
},
"ovs_bridge": {
Type: schema.TypeString,
Computed: true,
Description: "OVS bridge name",
},
"native_vlan_id": {
Type: schema.TypeInt,
Computed: true,
Description: "Native VLAN ID",
},
"status": {
Type: schema.TypeString,
Computed: true,
Description: "if the trunk is enabled",
},
"trunk_tags": {
Type: schema.TypeString,
Computed: true,
Description: "List of trunk tags (values between 1-4095)",
},
"created_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was created",
},
"created_by": {
Type: schema.TypeString,
Computed: true,
Description: "who created the trunk",
},
"updated_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was updated",
},
"updated_by": {
Type: schema.TypeString,
Computed: true,
Description: "who updated the trunk",
},
"deleted_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was updated",
},
"deleted_by": {
Type: schema.TypeString,
Computed: true,
Description: "who updated the trunk",
},
}
return res
}
func dataSourceTrunkListSchemaMake() map[string]*schema.Schema {
res := map[string]*schema.Schema{
"trunk_ids": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "ID of the trunk(s) to filter by",
},
"account_ids": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "Account access ID(s) to filter by",
},
"trunk_tags": {
Type: schema.TypeString,
Optional: true,
Description: "Trunk tags to filter by (value between 1-4095)",
},
"page": {
Type: schema.TypeInt,
Optional: true,
Description: "Page number.",
},
"size": {
Type: schema.TypeInt,
Optional: true,
Description: "Page size.",
},
"status": {
Type: schema.TypeString,
Optional: true,
Description: "find by status",
},
"sort_by": {
Type: schema.TypeString,
Optional: true,
Description: "Sort by one of supported fields, format ±<field>",
},
"items": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"account_ids": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "List of account IDs with access to this trunk",
},
"created_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was created",
},
"created_by": {
Type: schema.TypeString,
Computed: true,
Description: "who created the trunk",
},
"deleted_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was updated",
},
"deleted_by": {
Type: schema.TypeString,
Computed: true,
Description: "who updated the trunk",
},
"description": {
Type: schema.TypeString,
Computed: true,
Description: "Description of the trunk",
},
"guid": {
Type: schema.TypeInt,
Computed: true,
Description: "GUID",
},
"id": {
Type: schema.TypeInt,
Computed: true,
Description: "Trunk ID",
},
"mac": {
Type: schema.TypeString,
Computed: true,
Description: "MAC address",
},
"name": {
Type: schema.TypeString,
Computed: true,
Description: "Name of the trunk",
},
"native_vlan_id": {
Type: schema.TypeInt,
Computed: true,
Description: "Native VLAN ID",
},
"ovs_bridge": {
Type: schema.TypeString,
Computed: true,
Description: "OVS bridge name",
},
"status": {
Type: schema.TypeString,
Computed: true,
Description: "if the trunk is enabled",
},
"trunk_tags": {
Type: schema.TypeString,
Computed: true,
Description: "List of trunk tags (values between 1-4095)",
},
"updated_at": {
Type: schema.TypeInt,
Computed: true,
Description: "when the trunk was updated",
},
"updated_by": {
Type: schema.TypeString,
Computed: true,
Description: "who updated the trunk",
},
},
},
},
"entry_count": {
Type: schema.TypeInt,
Computed: true,
},
}
return res
}

View File

@@ -0,0 +1,104 @@
package trunk
import (
"context"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityTrunkCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*trunk.ItemTrunk, error) {
c := m.(*controller.ControllerCfg)
req := trunk.GetRequest{}
if d.Id() != "" {
id, err := strconv.ParseInt(d.Id(), 10, 64)
if err != nil {
return nil, err
}
req.TrunkID = uint64(id)
} else {
req.TrunkID = uint64(d.Get("trunk_id").(int))
}
trunkInfo, err := c.CloudBroker().Trunk().Get(ctx, req)
if err != nil {
return nil, err
}
return trunkInfo, nil
}
func handleAccountAccessUpdate(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, trnk *trunk.ItemTrunk) error {
oldSet, newSet := d.GetChange("account_ids")
revokeSet := oldSet.(*schema.Set).Difference(newSet.(*schema.Set))
if revokeSet.Len() > 0 {
accountIDs := make([]uint64, 0)
for _, revokeAccountID := range revokeSet.List() {
accountIDs = append(accountIDs, uint64(revokeAccountID.(int)))
}
log.Debugf("cloudbroker: revoking access from %d account IDs", revokeSet.Len())
req := trunk.AccessRevokeRequest{
TrunkID: trnk.ID,
AccountIDs: accountIDs,
}
_, err := c.CloudBroker().Trunk().AccessRevoke(ctx, req)
if err != nil {
return err
}
}
grantSet := newSet.(*schema.Set).Difference(oldSet.(*schema.Set))
if grantSet.Len() > 0 {
accountIDs := make([]uint64, 0)
for _, grantAccountID := range grantSet.List() {
accountIDs = append(accountIDs, uint64(grantAccountID.(int)))
}
log.Debugf("cloudbroker: granting access to %d account IDs", grantSet.Len())
req := trunk.AccessGrantRequest{
TrunkID: trnk.ID,
AccountIDs: accountIDs,
}
_, err := c.CloudBroker().Trunk().AccessGrant(ctx, req)
if err != nil {
return err
}
}
return nil
}
func handleTrunkEnabling(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, trunkID uint64) error {
if d.Get("enable").(bool) {
req := trunk.EnableRequest{
TrunkID: trunkID,
}
_, err := c.CloudBroker().Trunk().Enable(ctx, req)
if err != nil {
return err
}
} else {
req := trunk.DisableRequest{
TrunkID: trunkID,
}
_, err := c.CloudBroker().Trunk().Disable(ctx, req)
if err != nil {
return err
}
}
return nil
}

View File

@@ -0,0 +1,48 @@
package trunk
import (
"context"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityTrunkListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*trunk.ListTrunks, error) {
c := m.(*controller.ControllerCfg)
req := trunk.ListRequest{}
if trunkIDs, ok := d.GetOk("trunk_ids"); ok {
IDs := trunkIDs.([]interface{})
for _, id := range IDs {
req.IDs = append(req.IDs, uint64(id.(int)))
}
}
if accountIDs, ok := d.GetOk("account_ids"); ok {
IDs := accountIDs.([]interface{})
for _, id := range IDs {
req.AccountIDs = append(req.AccountIDs, uint64(id.(int)))
}
}
if trunkTags, ok := d.GetOk("trunk_tags"); ok {
req.TrunkTags = trunkTags.(string)
}
if sortBy, ok := d.GetOk("sort_by"); ok {
req.SortBy = sortBy.(string)
}
if page, ok := d.GetOk("page"); ok {
req.Page = uint64(page.(int))
}
if size, ok := d.GetOk("size"); ok {
req.Size = uint64(size.(int))
}
log.Debugf("utilityTrunkListCheckPresence: load trunk network list")
trunkList, err := c.CloudBroker().Trunk().List(ctx, req)
if err != nil {
return nil, err
}
return trunkList, nil
}

View File

@@ -53,6 +53,7 @@ func flattenUserDataSource(d *schema.ResourceData, details *user.ItemUser) {
d.Set("active", details.Active)
d.Set("authkey", details.AuthKey)
d.Set("auth_keys", flattenItemUser(details.AuthKeys))
d.Set("blocked", details.Blocked)
d.Set("data", details.Data)
d.Set("description", details.Description)
d.Set("domain", details.Domain)
@@ -80,6 +81,7 @@ func flattenUserResource(d *schema.ResourceData, details *user.ItemUser) {
d.Set("active", details.Active)
d.Set("authkey", details.AuthKey)
d.Set("auth_keys", flattenItemUser(details.AuthKeys))
d.Set("blocked", details.Blocked)
d.Set("data", details.Data)
d.Set("description", details.Description)
d.Set("domain", details.Domain)
@@ -144,6 +146,7 @@ func flattenUserList(users *user.ListUsers) []map[string]interface{} {
"active": item.Active,
"authkey": item.AuthKey,
"authkeys": flattenItemUser(item.AuthKeys),
"blocked": item.Blocked,
"data": item.Data,
"description": item.Description,
"domain": item.Domain,

View File

@@ -38,6 +38,10 @@ func resourceUserCreate(ctx context.Context, d *schema.ResourceData, m interface
createReq.Password = passwd.(string)
}
if provider, ok := d.GetOk("provider_name"); ok {
createReq.Provider = provider.(string)
}
if aa, ok := d.GetOk("apiaccess"); ok {
apiaccess := aa.(*schema.Set)
@@ -48,14 +52,6 @@ func resourceUserCreate(ctx context.Context, d *schema.ResourceData, m interface
}
}
if groups, ok := d.GetOk("groups"); ok {
for _, v := range groups.([]interface{}) {
createReq.Groups = append(createReq.Groups, v.(string))
}
}
_, err := c.CloudBroker().User().Create(ctx, createReq)
if err != nil {
return diag.FromErr(err)
@@ -90,10 +86,33 @@ func resourceUserUpdate(ctx context.Context, d *schema.ResourceData, m interface
err := utilityUserAPIAccessGroupsConfigure(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
}
c := m.(*controller.ControllerCfg)
if d.HasChange("blocked") {
blocked := d.Get("blocked").(bool)
if blocked {
req := user.BlockRequest{
UserID: d.Id(),
}
if _, err := c.CloudBroker().User().Block(ctx, req); err != nil {
return diag.FromErr(err)
}
} else {
req := user.UnblockRequest{
UserID: d.Id(),
}
if _, err := c.CloudBroker().User().Unblock(ctx, req); err != nil {
return diag.FromErr(err)
}
}
}
return resourceUserRead(ctx, d, m)
}

View File

@@ -2,6 +2,7 @@ package user
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
log "github.com/sirupsen/logrus"
)
@@ -51,6 +52,11 @@ func dataSourceUserSchemaMake() map[string]*schema.Schema {
},
Description: "authkeys",
},
"blocked": {
Type: schema.TypeBool,
Computed: true,
Description: "is the user blocked",
},
"data": {
Type: schema.TypeString,
Computed: true,
@@ -225,6 +231,11 @@ func dataSourceUserListSchemaMake() map[string]*schema.Schema {
Optional: true,
Description: "find by active. True or False",
},
"email": {
Type: schema.TypeString,
Optional: true,
Description: "find by email",
},
"service_account": {
Type: schema.TypeBool,
Optional: true,
@@ -290,6 +301,11 @@ func dataSourceUserListSchemaMake() map[string]*schema.Schema {
},
Description: "authkeys",
},
"blocked": {
Type: schema.TypeBool,
Computed: true,
Description: "is the user blocked",
},
"data": {
Type: schema.TypeString,
Computed: true,
@@ -409,12 +425,18 @@ func resourceUserSchemaMake() map[string]*schema.Schema {
},
"password": {
Type: schema.TypeString,
Default: "strongpassword",
Optional: true,
Description: "password of user",
},
"provider_name": {
Type: schema.TypeString,
Optional: true,
Description: "provider",
ValidateFunc: validation.StringInSlice([]string{"bvs", "decs3o"}, false),
},
"groups": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
@@ -448,6 +470,12 @@ func resourceUserSchemaMake() map[string]*schema.Schema {
},
Description: "list of apiaccess groups this user belongs to",
},
"blocked": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
Description: "is the user blocked",
},
"authkey": {
Type: schema.TypeString,
Computed: true,

View File

@@ -52,6 +52,10 @@ func utilityUserListCheckPresence(ctx context.Context, d *schema.ResourceData, m
req.Active = active.(bool)
}
if email, ok := d.GetOk("email"); ok {
req.Email = email.(string)
}
if serviceAccount, ok := d.GetOk("service_account"); ok {
req.ServiceAccount = serviceAccount.(bool)
}

View File

@@ -73,6 +73,7 @@ func flattenVins(d *schema.ResourceData, vinsRecord *vins.RecordVINS) {
d.Set("vxlan_id", vinsRecord.VXLANID)
d.Set("nat_rule", flattenRuleBlock(vinsRecord.VNFs.NAT.Config.Rules))
d.Set("computes", flattenComputes(vinsRecord.Computes))
d.Set("zone_id", vinsRecord.ZoneID)
}
func flattenVinsData(d *schema.ResourceData, vinsRecord *vins.RecordVINS) {
@@ -111,6 +112,7 @@ func flattenVinsData(d *schema.ResourceData, vinsRecord *vins.RecordVINS) {
d.Set("vnfs", flattenVinsRecordVNFs(vinsRecord.VNFs))
d.Set("vxlan_id", vinsRecord.VXLANID)
d.Set("computes", flattenComputes(vinsRecord.Computes))
d.Set("zone_id", vinsRecord.ZoneID)
}
@@ -223,7 +225,6 @@ func flattenVinsRecordGW(rg vins.RecordGW) []map[string]interface{} {
"owner_id": rg.OwnerID,
"owner_type": rg.OwnerType,
"pure_virtual": rg.PureVirtual,
"routes": flattenVinsRoutes(rg.Routes),
"status": rg.Status,
"tech_status": rg.TechStatus,
"type": rg.Type,
@@ -249,7 +250,6 @@ func flattenVinsRecordNAT(rn vins.RecordNAT) []map[string]interface{} {
"owner_id": rn.OwnerID,
"owner_type": rn.OwnerType,
"pure_virtual": rn.PureVirtual,
"routes": flattenVinsRoutes(rn.Routes),
"status": rn.Status,
"tech_status": rn.TechStatus,
"type": rn.Type,
@@ -439,6 +439,7 @@ func flattenVinsListInterfaces(i vins.ListInterfaces) []map[string]interface{} {
"pci_slot": v.PCISlot,
"bus_number": v.BusNumber,
"qos": flattenVinsQOS(v.QOS),
"sdn_interface_id": v.SDNInterfaceID,
"target": v.Target,
"type": v.Type,
"vnfs": v.VNFs,
@@ -487,6 +488,7 @@ func flattenVinsList(vl *vins.ListVINS) []map[string]interface{} {
"user_managed": v.UserManaged,
"vnfs": flattenVinsVNFs(v.VNFs),
"vxlan_id": v.VXLANID,
"zone_id": v.ZoneID,
}
res = append(res, temp)
}
@@ -529,6 +531,7 @@ func flattenVinsListDeleted(vl *vins.ListVINS) []map[string]interface{} {
"user_managed": v.UserManaged,
"vnfs": flattenVinsVNFs(v.VNFs),
"vxlan_id": v.VXLANID,
"zone_id": v.ZoneID,
}
res = append(res, temp)
}

View File

@@ -84,6 +84,10 @@ func createVinsInAcc(ctx context.Context, d *schema.ResourceData, m interface{},
}
}
if zoneID, ok := d.GetOk("zone_id"); ok {
req.ZoneID = uint64(zoneID.(int))
}
return req, nil
}
@@ -135,6 +139,10 @@ func createVinsInRG(ctx context.Context, d *schema.ResourceData, m interface{},
}
}
if zoneID, ok := d.GetOk("zone_id"); ok {
req.ZoneID = uint64(zoneID.(int))
}
return req, nil
}

View File

@@ -320,6 +320,12 @@ func resourceVinsUpdate(ctx context.Context, d *schema.ResourceData, m interface
}
}
if d.HasChange("zone_id") {
if err := resourceVinsChangeZoneID(ctx, d, m); err != nil {
warnings.Add(err)
}
}
return append(warnings.Get(), dataSourceVinsRead(ctx, d, m)...)
}
@@ -772,6 +778,21 @@ func resourceVinsChangeVnfStartStop(ctx context.Context, d *schema.ResourceData,
return err
}
func resourceVinsChangeZoneID(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)
vinsId := uint64(d.Get("vins_id").(int))
zoneID := uint64(d.Get("zone_id").(int))
req := vins.MigrateToZoneRequest{
VINSID: vinsId,
ZoneID: zoneID,
}
_, err := c.CloudBroker().VINS().MigrateToZone(ctx, req)
return err
}
func ResourceVins() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,

View File

@@ -290,6 +290,10 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
},
},
},
"sdn_interface_id": {
Type: schema.TypeString,
Computed: true,
},
"target": {
Type: schema.TypeString,
Computed: true,
@@ -907,42 +911,6 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
"routes": {
Type: schema.TypeList,
Computed: true,
Description: "routes",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"compute_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"route_id": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeString,
Computed: true,
},
"destination": {
Type: schema.TypeString,
Computed: true,
},
"netmask": {
Type: schema.TypeString,
Computed: true,
},
"gateway": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
@@ -1127,42 +1095,6 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
"routes": {
Type: schema.TypeList,
Computed: true,
Description: "routes",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"compute_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"route_id": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeString,
Computed: true,
},
"destination": {
Type: schema.TypeString,
Computed: true,
},
"netmask": {
Type: schema.TypeString,
Computed: true,
},
"gateway": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
@@ -1189,6 +1121,10 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "vxlan id",
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
}
return rets
@@ -1441,6 +1377,10 @@ func dataSourceVinsListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
@@ -1681,6 +1621,10 @@ func dataSourceVinsListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
@@ -1948,6 +1892,12 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Optional: true,
Computed: true,
},
"zone_id": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
Description: "zone id",
},
"gid": {
Type: schema.TypeInt,
Optional: true,
@@ -2801,47 +2751,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "prune virtual",
},
"routes": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"compute_ids": {
Type: schema.TypeList,
Computed: true,
Description: "compute ids",
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"route_id": {
Type: schema.TypeInt,
Computed: true,
Description: "route id",
},
"guid": {
Type: schema.TypeString,
Computed: true,
Description: "guid",
},
"destination": {
Type: schema.TypeString,
Computed: true,
Description: "destination",
},
"netmask": {
Type: schema.TypeString,
Computed: true,
Description: "net mask",
},
"gateway": {
Type: schema.TypeString,
Computed: true,
Description: "gateway",
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
@@ -3012,42 +2921,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
"routes": {
Type: schema.TypeList,
Computed: true,
Description: "routes",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"compute_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"route_id": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeString,
Computed: true,
},
"destination": {
Type: schema.TypeString,
Computed: true,
},
"netmask": {
Type: schema.TypeString,
Computed: true,
},
"gateway": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
@@ -3232,42 +3105,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
"routes": {
Type: schema.TypeList,
Computed: true,
Description: "routes",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"compute_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"route_id": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeString,
Computed: true,
},
"destination": {
Type: schema.TypeString,
Computed: true,
},
"netmask": {
Type: schema.TypeString,
Computed: true,
},
"gateway": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,

View File

@@ -0,0 +1,116 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
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.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"strconv"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func dataSourceZoneRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
zone, err := utilityZoneCheckPresence(ctx, d, m)
if err != nil {
d.SetId("") // ensure ID is empty in this case
return diag.FromErr(err)
}
d.SetId(strconv.Itoa(d.Get("zone_id").(int)))
flattenZone(d, zone)
return nil
}
func dataSourceZoneSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeInt,
Required: true,
},
"guid": {
Type: schema.TypeInt,
Computed: true,
},
"gid": {
Type: schema.TypeInt,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
"description": {
Type: schema.TypeString,
Computed: true,
},
"deletable": {
Type: schema.TypeBool,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"created_time": {
Type: schema.TypeInt,
Computed: true,
},
"updated_time": {
Type: schema.TypeInt,
Computed: true,
},
"node_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
}
}
func DataSourceZone() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceZoneRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceZoneSchemaMake(),
}
}

View File

@@ -0,0 +1,182 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
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.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func dataSourceZoneListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
zoneList, err := utilityZoneListCheckPresence(ctx, d, m)
if err != nil {
d.SetId("") // ensure ID is empty in this case
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("items", flattenZoneList(zoneList))
d.Set("entry_count", zoneList.EntryCount)
return nil
}
func dataSourceZoneListSchemaMake() map[string]*schema.Schema {
res := map[string]*schema.Schema{
"by_id": {
Type: schema.TypeInt,
Optional: true,
Description: "Find by ID",
},
"gid": {
Type: schema.TypeInt,
Optional: true,
Description: "Find by Grid ID",
},
"name": {
Type: schema.TypeString,
Optional: true,
Description: "Find by name",
},
"description": {
Type: schema.TypeString,
Optional: true,
Description: "Find by description",
},
"status": {
Type: schema.TypeString,
Optional: true,
Description: "Find by status",
},
"deletable": {
Type: schema.TypeBool,
Optional: true,
Description: "Find by deletable",
},
"node_id": {
Type: schema.TypeInt,
Optional: true,
Description: "Find by nodeId",
},
"sort_by": {
Type: schema.TypeString,
Optional: true,
Description: "sort by one of supported fields, format +|-(field)",
},
"page": {
Type: schema.TypeInt,
Optional: true,
Description: "Page number",
},
"size": {
Type: schema.TypeInt,
Optional: true,
Description: "Page size",
},
"items": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeInt,
Required: true,
},
"guid": {
Type: schema.TypeInt,
Computed: true,
},
"gid": {
Type: schema.TypeInt,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
"description": {
Type: schema.TypeString,
Computed: true,
},
"deletable": {
Type: schema.TypeBool,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"created_time": {
Type: schema.TypeInt,
Computed: true,
},
"updated_time": {
Type: schema.TypeInt,
Computed: true,
},
"node_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
},
},
},
"entry_count": {
Type: schema.TypeInt,
Computed: true,
},
}
return res
}
func DataSourceZoneList() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceZoneListRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceZoneListSchemaMake(),
}
}

View File

@@ -0,0 +1,82 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
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.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
)
func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error {
log.Debugf("flattenZone: start decoding RecordZone name %q / ID %d",
item.Name, item.ID)
d.Set("zone_id", int(item.ID))
d.Set("guid", int(item.GUID))
d.Set("gid", int(item.GID))
d.Set("name", item.Name)
d.Set("description", item.Description)
d.Set("deletable", item.Deletable)
d.Set("status", item.Status)
d.Set("created_time", item.CreatedTime)
d.Set("updated_time", item.UpdatedTime)
d.Set("node_ids", item.NodeIDs)
log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete",
item.Name, item.ID)
return nil
}
func flattenZoneList(zone *zone.ListZones) []map[string]interface{} {
log.Debugf("flattenZoneList start")
res := make([]map[string]interface{}, 0, len(zone.Data))
for _, zone := range zone.Data {
temp := map[string]interface{}{
"zone_id": int(zone.ID),
"guid": int(zone.GUID),
"gid": int(zone.GID),
"name": zone.Name,
"description": zone.Description,
"deletable": zone.Deletable,
"status": zone.Status,
"created_time": zone.CreatedTime,
"updated_time": zone.UpdatedTime,
"node_ids": zone.NodeIDs,
}
res = append(res, temp)
}
log.Debugf("flattenZoneList end")
return res
}

View File

@@ -0,0 +1,229 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
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.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
)
func resourceZoneCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
zoneName := d.Get("name").(string)
log.Debugf("resourceZoneCreate: called Zone with name %s", zoneName)
c := m.(*controller.ControllerCfg)
req := zone.CreateRequest{
Name: zoneName,
}
if desc, ok := d.GetOk("description"); ok {
req.Description = desc.(string)
}
zoneID, err := c.CloudBroker().Zone().Create(ctx, req)
if err != nil {
return diag.FromErr(err)
}
d.SetId(strconv.FormatUint(zoneID, 10))
warnings := dc.Warnings{}
if nodeIDs, ok := d.GetOk("node_ids"); ok {
nodeIDsArr := nodeIDs.([]interface{})
if len(nodeIDsArr) > 0 {
addedUint := make([]uint64, len(nodeIDsArr))
for i, v := range nodeIDsArr {
addedUint[i] = uint64(v.(int))
}
req := zone.AddNodeRequest{
ID: zoneID,
NodeIDs: addedUint,
}
if _, err := c.CloudBroker().Zone().AddNode(ctx, req); err != nil {
warnings.Add(err)
}
}
}
log.Debugf("resourceZoneCreate: create Zone with ID: %d, complete", zoneID)
return append(resourceZoneRead(ctx, d, m), warnings.Get()...)
}
func resourceZoneRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceZoneRead: called Zone with id %s", d.Id())
zone, err := utilityZoneCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
flattenZone(d, zone)
log.Debugf("resourceZoneRead: read Zone with id %s, complete", d.Id())
return nil
}
func resourceZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
zoneID, _ := strconv.ParseUint(d.Id(), 10, 64)
log.Debugf("resourceZoneUpdate: called Zone with id %d", zoneID)
if d.HasChanges("name,", "description", "node_ids") {
if err := utilityZoneUpdate(ctx, d, m, zoneID); err != nil {
return diag.FromErr(err)
}
}
log.Debugf("resourceZoneUpdate: update Zone with id %d, complete", zoneID)
return resourceZoneRead(ctx, d, m)
}
func resourceZoneDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceZoneDelete: called Zone with id %s", d.Id())
zoneItem, err := utilityZoneCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
c := m.(*controller.ControllerCfg)
req := zone.DeleteRequest{
ID: zoneItem.ID,
}
_, err = c.CloudBroker().Zone().Delete(ctx, req)
if err != nil {
return diag.FromErr(err)
}
d.SetId("")
return nil
}
func ResourceZone() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
CreateContext: resourceZoneCreate,
ReadContext: resourceZoneRead,
UpdateContext: resourceZoneUpdate,
DeleteContext: resourceZoneDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Timeouts: &schema.ResourceTimeout{
Create: &constants.Timeout20m,
Read: &constants.Timeout20m,
Update: &constants.Timeout20m,
Delete: &constants.Timeout20m,
Default: &constants.Timeout20m,
},
Schema: resourceZoneSchemaMake(),
}
}
func resourceZoneSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"description": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"node_ids": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeInt,
Computed: true,
},
"gid": {
Type: schema.TypeInt,
Computed: true,
},
"deletable": {
Type: schema.TypeBool,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"created_time": {
Type: schema.TypeInt,
Computed: true,
},
"updated_time": {
Type: schema.TypeInt,
Computed: true,
},
"id": {
Type: schema.TypeString,
Computed: true,
},
}
}

View File

@@ -0,0 +1,155 @@
/*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
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.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
)
func utilityZoneCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.RecordZone, error) {
c := m.(*controller.ControllerCfg)
req := zone.GetRequest{}
if d.Id() != "" {
zoneId, _ := strconv.ParseUint(d.Id(), 10, 64)
req.ID = zoneId
} else {
req.ID = uint64(d.Get("zone_id").(int))
}
zoneData, err := c.CloudBroker().Zone().Get(ctx, req)
if err != nil {
return nil, err
}
return zoneData, nil
}
func utilityZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, zoneID uint64) error {
c := m.(*controller.ControllerCfg)
if d.HasChanges("name,", "description") {
req := zone.UpdateRequest{
ID: zoneID,
}
if d.HasChange("name") {
req.Name = d.Get("name").(string)
}
if d.HasChange("description") {
req.Description = d.Get("description").(string)
}
_, err := c.CloudBroker().Zone().Update(ctx, req)
if err != nil {
return err
}
log.Debugf("utilityZoneUpdate: update zone with ID: %d, complete with params=%v", zoneID, req)
}
addedNodes := make([]interface{}, 0)
removedNodes := make([]interface{}, 0)
old_set, new_set := d.GetChange("node_ids")
oldSlice := old_set.([]interface{})
newSlice := new_set.([]interface{})
for _, oldElem := range oldSlice {
if !containsNodes(newSlice, oldElem) {
removedNodes = append(removedNodes, oldElem)
}
}
for _, newElem := range newSlice {
if !containsNodes(oldSlice, newElem) {
addedNodes = append(addedNodes, newElem)
}
}
log.Debugf("Found node_ids change with %v deletion(s) and %v addition(s) [zoneID=%v]", len(removedNodes), len(addedNodes), zoneID)
if len(addedNodes) > 0 {
addedUint := make([]uint64, len(addedNodes))
for i, v := range addedNodes {
addedUint[i] = uint64(v.(int))
}
req := zone.AddNodeRequest{
ID: zoneID,
NodeIDs: addedUint,
}
if _, err := c.CloudBroker().Zone().AddNode(ctx, req); err != nil {
return err
}
}
if len(removedNodes) > 0 {
removedUint := make([]uint64, len(removedNodes))
for i, v := range removedNodes {
removedUint[i] = uint64(v.(int))
}
req := zone.DelNodeRequest{
ID: zoneID,
NodeIDs: removedUint,
}
log.Debug("del")
log.Debug(req.NodeIDs)
if _, err := c.CloudBroker().Zone().DelNode(ctx, req); err != nil {
return err
}
}
return nil
}
func containsNodes(set []interface{}, check interface{}) bool {
for _, elem := range set {
elemConv := elem.(int)
checkConv := check.(int)
if elemConv == checkConv {
return true
}
}
return false
}

View File

@@ -0,0 +1,85 @@
/*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
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.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func utilityZoneListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListZones, error) {
c := m.(*controller.ControllerCfg)
req := zone.ListRequest{}
if byId, ok := d.GetOk("by_id"); ok {
req.ByID = uint64(byId.(int))
}
if gid, ok := d.GetOk("gid"); ok {
req.GID = uint64(gid.(int))
}
if name, ok := d.GetOk("name"); ok {
req.Name = name.(string)
}
if description, ok := d.GetOk("description"); ok {
req.Description = description.(string)
}
if status, ok := d.GetOk("status"); ok {
req.Status = status.(string)
}
if deletable, ok := d.GetOk("deletable"); ok {
req.Deletable = deletable.(bool)
}
if nodeID, ok := d.GetOk("nodeId"); ok {
req.NodeID = uint64(nodeID.(int))
}
if sortBy, ok := d.GetOk("sort_by"); ok {
req.SortBy = sortBy.(string)
}
if size, ok := d.GetOk("size"); ok {
req.Size = uint64(size.(int))
}
if page, ok := d.GetOk("page"); ok {
req.Page = uint64(page.(int))
}
zoneList, err := c.CloudBroker().Zone().List(ctx, req)
if err != nil {
return nil, err
}
return zoneList, nil
}