Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions internal/provider/cloud_node_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -339,12 +339,12 @@ func (r *cloudNodeResource) Update(ctx context.Context, req resource.UpdateReque
Name: plan.Name.ValueString(),
}

// Update existing workspace
// Update existing cloud node
node, err := r.client.UpdateNode(ctx, payload, plan.WorkspaceID.ValueString(), plan.ID.ValueString())
if err != nil {
resp.Diagnostics.AddError(
"Error Updating Workspace",
fmt.Sprintf("Could not update Autonomi workspace: "+plan.ID.ValueString())+": error: "+err.Error(),
"Error Updating Cloud Node",
fmt.Sprintf("Could not update Autonomi cloud node: "+plan.ID.ValueString())+": error: "+err.Error(),
)
return
}
Expand Down
106 changes: 105 additions & 1 deletion internal/provider/transport_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package provider
import (
"context"
"fmt"
"strings"
"time"

"github.com/hashicorp/terraform-plugin-framework/attr"
Expand Down Expand Up @@ -229,7 +230,7 @@ func (r *transportResource) Create(ctx context.Context, req resource.CreateReque
}
plan.ConnectionID = types.StringValue(transport.ConnectionID)

// set trnasportVlans object
// set transportVlans object
vlansObject, diag := types.ObjectValue(
transportVlans,
map[string]attr.Value{
Expand Down Expand Up @@ -308,7 +309,110 @@ func (r *transportResource) Read(ctx context.Context, req resource.ReadRequest,
}

func (r *transportResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
// Retrieve values from plan
var plan transportResourceModel
diags := req.Plan.Get(ctx, &plan)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}

// Generate API request body from plan
payload := models.UpdateElement{
Name: plan.Name.ValueString(),
}

// Update existing workspace
transport, err := r.client.UpdateTransport(ctx, payload, plan.WorkspaceID.ValueString(), plan.ID.ValueString())
if err != nil {
resp.Diagnostics.AddError(
"Error Updating Transport",
fmt.Sprintf("Could not update Autonomi transport: "+plan.ID.ValueString())+": error: "+err.Error(),
)
return
}

// Update resource state with updated items and timestamp
plan.ID = types.StringValue(transport.ID.String())
plan.Name = types.StringValue(transport.Name)
plan.CreatedAt = types.StringValue(transport.CreatedAt.String())
plan.UpdatedAt = types.StringValue(transport.UpdatedAt.String())
if transport.DeployedAt != nil {
plan.DeployedAt = types.StringValue(transport.DeployedAt.String())
}
plan.State = types.StringValue(transport.State.String())
plan.Product = product{
SKU: types.StringValue(transport.Product.SKU),
}
plan.ConnectionID = types.StringValue(transport.ConnectionID)

// set transportVlans object
vlansObject, diag := types.ObjectValue(
transportVlans,
map[string]attr.Value{
"a_vlan": types.Int64Value(transport.TransportVlans.AVlan),
"z_vlan": types.Int64Value(transport.TransportVlans.ZVlan),
},
)
plan.Vlans = vlansObject

// Check for errors
if diag.HasError() {
resp.Diagnostics.Append(diag...)
return
}

diags = resp.State.Set(ctx, plan)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
}

func (r *transportResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
// Retrieve values from state
var state transportResourceModel
diags := req.State.Get(ctx, &state)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}

// Delete existing node
_, err := r.client.DeleteTransport(ctx, state.WorkspaceID.ValueString(), state.ID.ValueString())
if err != nil {
resp.Diagnostics.AddError(
"Error Deleting transport",
"Could not delete transport, unexpected error: "+err.Error(),
)
return
}

// Poll the node until it's deleted - @TODO: use terraform function if possible
const maxRetries = 30
const retryInterval = 20 * time.Second

for i := 0; i < maxRetries; i++ {
transport, err := r.client.GetTransport(ctx, state.WorkspaceID.ValueString(), state.ID.ValueString())
if err != nil {
if strings.Contains(err.Error(), "status: 404") {
// Handle 404 error specifically
break
}
resp.Diagnostics.AddError(
"Error getting transport status",
"Could not get transport status, unexpected error: "+err.Error(),
)
return
}
if transport.State == models.AdministrativeStateDeleteError {
resp.Diagnostics.AddError(
"Error while deleting transport",
"Could not delete transport, error: code:"+transport.Error.Code+" msg: "+transport.Error.Msg,
)
return
}

time.Sleep(retryInterval)
}
}