updated app resource

This commit is contained in:
Manuel Ganter 2025-11-11 16:20:36 +01:00
parent 728b27146e
commit 6c7a34d68a
No known key found for this signature in database
2 changed files with 88 additions and 132 deletions

View file

@ -27,20 +27,16 @@ type AppResource struct {
}
type AppResourceModel struct {
Id types.String `tfsdk:"id"`
Name types.String `tfsdk:"name"`
AppVersion types.String `tfsdk:"app_version"`
Organization types.String `tfsdk:"organization"`
Manifest types.String `tfsdk:"manifest"`
InfraTemplate []InfraTemplateModel `tfsdk:"infra_template"`
}
type InfraTemplateModel struct {
Region types.String `tfsdk:"region"`
CloudletOrg types.String `tfsdk:"cloudlet_org"`
CloudletName types.String `tfsdk:"cloudlet_name"`
FlavorName types.String `tfsdk:"flavor_name"`
Network *NetworkModel `tfsdk:"network"`
Id types.String `tfsdk:"id"`
Name types.String `tfsdk:"name"`
AppVersion types.String `tfsdk:"app_version"`
Organization types.String `tfsdk:"organization"`
Manifest types.String `tfsdk:"manifest"`
Region types.String `tfsdk:"region"`
CloudletOrg types.String `tfsdk:"cloudlet_org"`
CloudletName types.String `tfsdk:"cloudlet_name"`
FlavorName types.String `tfsdk:"flavor_name"`
Network *NetworkModel `tfsdk:"network"`
}
type NetworkModel struct {
@ -86,54 +82,46 @@ func (r *AppResource) Schema(ctx context.Context, req resource.SchemaRequest, re
MarkdownDescription: "Kubernetes manifest YAML content",
Required: true,
},
"infra_template": schema.ListNestedAttribute{
MarkdownDescription: "Infrastructure template configurations",
"region": schema.StringAttribute{
MarkdownDescription: "Region (e.g., US, EU)",
Required: true,
NestedObject: schema.NestedAttributeObject{
Attributes: map[string]schema.Attribute{
"region": schema.StringAttribute{
MarkdownDescription: "Region (e.g., US, EU)",
Required: true,
},
"cloudlet_org": schema.StringAttribute{
MarkdownDescription: "Cloudlet organization",
Required: true,
},
"cloudlet_name": schema.StringAttribute{
MarkdownDescription: "Cloudlet name",
Required: true,
},
"flavor_name": schema.StringAttribute{
MarkdownDescription: "Flavor name",
Required: true,
},
"network": schema.SingleNestedAttribute{
MarkdownDescription: "Network configuration",
Optional: true,
},
"cloudlet_org": schema.StringAttribute{
MarkdownDescription: "Cloudlet organization",
Required: true,
},
"cloudlet_name": schema.StringAttribute{
MarkdownDescription: "Cloudlet name",
Required: true,
},
"flavor_name": schema.StringAttribute{
MarkdownDescription: "Flavor name",
Required: true,
},
"network": schema.SingleNestedAttribute{
MarkdownDescription: "Network configuration",
Optional: true,
Attributes: map[string]schema.Attribute{
"outbound_connections": schema.ListNestedAttribute{
MarkdownDescription: "Outbound connection rules",
Optional: true,
NestedObject: schema.NestedAttributeObject{
Attributes: map[string]schema.Attribute{
"outbound_connections": schema.ListNestedAttribute{
MarkdownDescription: "Outbound connection rules",
Optional: true,
NestedObject: schema.NestedAttributeObject{
Attributes: map[string]schema.Attribute{
"protocol": schema.StringAttribute{
MarkdownDescription: "Protocol (tcp, udp, icmp)",
Required: true,
},
"port_range_min": schema.Int64Attribute{
MarkdownDescription: "Minimum port number",
Required: true,
},
"port_range_max": schema.Int64Attribute{
MarkdownDescription: "Maximum port number",
Required: true,
},
"remote_cidr": schema.StringAttribute{
MarkdownDescription: "Remote CIDR (e.g., 0.0.0.0/0)",
Required: true,
},
},
},
"protocol": schema.StringAttribute{
MarkdownDescription: "Protocol (tcp, udp, icmp)",
Required: true,
},
"port_range_min": schema.Int64Attribute{
MarkdownDescription: "Minimum port number",
Required: true,
},
"port_range_max": schema.Int64Attribute{
MarkdownDescription: "Maximum port number",
Required: true,
},
"remote_cidr": schema.StringAttribute{
MarkdownDescription: "Remote CIDR (e.g., 0.0.0.0/0)",
Required: true,
},
},
},
@ -172,29 +160,21 @@ func (r *AppResource) Create(ctx context.Context, req resource.CreateRequest, re
return
}
// Build outbound connections from all infra templates
// Build outbound connections from network
var outboundConnections []edgeclient.SecurityRule
for _, infraTemplate := range data.InfraTemplate {
if infraTemplate.Network != nil && len(infraTemplate.Network.OutboundConnections) > 0 {
for _, conn := range infraTemplate.Network.OutboundConnections {
outboundConnections = append(outboundConnections, edgeclient.SecurityRule{
Protocol: conn.Protocol.ValueString(),
PortRangeMin: int(conn.PortRangeMin.ValueInt64()),
PortRangeMax: int(conn.PortRangeMax.ValueInt64()),
RemoteCIDR: conn.RemoteCIDR.ValueString(),
})
}
if data.Network != nil && len(data.Network.OutboundConnections) > 0 {
for _, conn := range data.Network.OutboundConnections {
outboundConnections = append(outboundConnections, edgeclient.SecurityRule{
Protocol: conn.Protocol.ValueString(),
PortRangeMin: int(conn.PortRangeMin.ValueInt64()),
PortRangeMax: int(conn.PortRangeMax.ValueInt64()),
RemoteCIDR: conn.RemoteCIDR.ValueString(),
})
}
}
// Use the first infra template's region as the deployment region
region := "default"
if len(data.InfraTemplate) > 0 {
region = data.InfraTemplate[0].Region.ValueString()
}
appInput := &edgeclient.NewAppInput{
Region: region,
Region: data.Region.ValueString(),
App: edgeclient.App{
Key: edgeclient.AppKey{
Organization: data.Organization.ValueString(),
@ -236,13 +216,7 @@ func (r *AppResource) Read(ctx context.Context, req resource.ReadRequest, resp *
Version: data.AppVersion.ValueString(),
}
// Use the first infra template's region for the query
region := "default"
if len(data.InfraTemplate) > 0 {
region = data.InfraTemplate[0].Region.ValueString()
}
app, err := r.client.ShowApp(ctx, appKey, region)
app, err := r.client.ShowApp(ctx, appKey, data.Region.ValueString())
if err != nil {
resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to read app %s, got error: %s", data.Id.ValueString(), err))
return
@ -254,10 +228,8 @@ func (r *AppResource) Read(ctx context.Context, req resource.ReadRequest, resp *
data.Organization = types.StringValue(app.Key.Organization)
data.Manifest = types.StringValue(app.DeploymentManifest)
// Reconstruct infra templates from outbound connections if available
// Note: The API returns RequiredOutboundConnections but not the full infra template details
// We preserve the existing infra template from state since the API doesn't return it
// The outbound connections can be compared if needed
// Note: The API returns RequiredOutboundConnections but not the full infrastructure details
// We preserve the existing region, cloudlet, flavor, and network from state since the API doesn't return them
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
}
@ -271,29 +243,21 @@ func (r *AppResource) Update(ctx context.Context, req resource.UpdateRequest, re
return
}
// Build outbound connections from all infra templates
// Build outbound connections from network
var outboundConnections []edgeclient.SecurityRule
for _, infraTemplate := range data.InfraTemplate {
if infraTemplate.Network != nil && len(infraTemplate.Network.OutboundConnections) > 0 {
for _, conn := range infraTemplate.Network.OutboundConnections {
outboundConnections = append(outboundConnections, edgeclient.SecurityRule{
Protocol: conn.Protocol.ValueString(),
PortRangeMin: int(conn.PortRangeMin.ValueInt64()),
PortRangeMax: int(conn.PortRangeMax.ValueInt64()),
RemoteCIDR: conn.RemoteCIDR.ValueString(),
})
}
if data.Network != nil && len(data.Network.OutboundConnections) > 0 {
for _, conn := range data.Network.OutboundConnections {
outboundConnections = append(outboundConnections, edgeclient.SecurityRule{
Protocol: conn.Protocol.ValueString(),
PortRangeMin: int(conn.PortRangeMin.ValueInt64()),
PortRangeMax: int(conn.PortRangeMax.ValueInt64()),
RemoteCIDR: conn.RemoteCIDR.ValueString(),
})
}
}
// Use the first infra template's region as the deployment region
region := "default"
if len(data.InfraTemplate) > 0 {
region = data.InfraTemplate[0].Region.ValueString()
}
updateInput := &edgeclient.UpdateAppInput{
Region: region,
Region: data.Region.ValueString(),
App: edgeclient.App{
Key: edgeclient.AppKey{
Organization: data.Organization.ValueString(),
@ -331,13 +295,7 @@ func (r *AppResource) Delete(ctx context.Context, req resource.DeleteRequest, re
Version: data.AppVersion.ValueString(),
}
// Use the first infra template's region for deletion
region := "default"
if len(data.InfraTemplate) > 0 {
region = data.InfraTemplate[0].Region.ValueString()
}
err := r.client.DeleteApp(ctx, appKey, region)
err := r.client.DeleteApp(ctx, appKey, data.Region.ValueString())
if err != nil {
resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete app, got error: %s", err))
return