feat(iaas): add iaas network v2 alpha (#899)

* add experimental network v2
This commit is contained in:
Marcel Jacek 2025-07-07 13:25:54 +02:00 committed by GitHub
parent a00b0466d5
commit d9dc1d4495
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 3777 additions and 923 deletions

View file

@ -13,9 +13,11 @@ import (
const (
RoutingTablesExperiment = "routing-tables"
NetworkExperiment = "network"
IamExperiment = "iam"
)
var AvailableExperiments = []string{"iam", RoutingTablesExperiment}
var AvailableExperiments = []string{IamExperiment, RoutingTablesExperiment, NetworkExperiment}
// Check if an experiment is valid.
func ValidExperiment(experiment string, diags *diag.Diagnostics) bool {
@ -31,11 +33,21 @@ func ValidExperiment(experiment string, diags *diag.Diagnostics) bool {
// Check if an experiment is enabled.
func CheckExperimentEnabled(ctx context.Context, data *core.ProviderData, experiment, resourceName string, resourceType core.ResourceType, diags *diag.Diagnostics) {
if CheckExperimentEnabledWithoutError(ctx, data, experiment, resourceName, resourceType, diags) {
return
}
errTitle := fmt.Sprintf("%s is part of the %s experiment, which is currently disabled by default", resourceName, experiment)
errContent := fmt.Sprintf(`Enable the %s experiment by adding it into your provider block.`, experiment)
tflog.Error(ctx, fmt.Sprintf("%s | %s", errTitle, errContent))
diags.AddError(errTitle, errContent)
}
func CheckExperimentEnabledWithoutError(ctx context.Context, data *core.ProviderData, experiment, resourceName string, resourceType core.ResourceType, diags *diag.Diagnostics) bool {
if !ValidExperiment(experiment, diags) {
errTitle := fmt.Sprintf("The experiment %s does not exist.", experiment)
errContent := "This is a bug in the STACKIT Terraform Provider. Please open an issue here: https://github.com/stackitcloud/terraform-provider-stackit/issues"
diags.AddError(errTitle, errContent)
return
return false
}
experimentActive := slices.ContainsFunc(data.Experiments, func(e string) bool {
return strings.EqualFold(e, experiment)
@ -46,12 +58,9 @@ func CheckExperimentEnabled(ctx context.Context, data *core.ProviderData, experi
warnContent := fmt.Sprintf("This %s is part of the %s experiment and is likely going to undergo significant changes or be removed in the future. Use it at your own discretion.", resourceType, experiment)
tflog.Warn(ctx, fmt.Sprintf("%s | %s", warnTitle, warnContent))
diags.AddWarning(warnTitle, warnContent)
return
return true
}
errTitle := fmt.Sprintf("%s is part of the %s experiment, which is currently disabled by default", resourceName, experiment)
errContent := fmt.Sprintf(`Enable the %s experiment by adding it into your provider block.`, experiment)
tflog.Error(ctx, fmt.Sprintf("%s | %s", errTitle, errContent))
diags.AddError(errTitle, errContent)
return false
}
func AddExperimentDescription(description, experiment string, resourceType core.ResourceType) string {

View file

@ -21,7 +21,7 @@ func TestValidExperiment(t *testing.T) {
{
name: "valid",
args: args{
experiment: "iam",
experiment: IamExperiment,
diags: &diag.Diagnostics{},
},
want: true,
@ -64,9 +64,9 @@ func TestCheckExperimentEnabled(t *testing.T) {
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{"iam"},
Experiments: []string{IamExperiment},
},
experiment: "iam",
experiment: IamExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
@ -80,7 +80,7 @@ func TestCheckExperimentEnabled(t *testing.T) {
data: &core.ProviderData{
Experiments: []string{},
},
experiment: "iam",
experiment: IamExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
@ -92,7 +92,7 @@ func TestCheckExperimentEnabled(t *testing.T) {
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{"iam"},
Experiments: []string{IamExperiment},
},
experiment: "foobar",
resourceType: core.Resource,
@ -101,6 +101,34 @@ func TestCheckExperimentEnabled(t *testing.T) {
wantDiagsErr: true,
wantDiagsWarning: false,
},
{
name: "enabled multiple experiment",
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{IamExperiment, NetworkExperiment, RoutingTablesExperiment},
},
experiment: NetworkExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
wantDiagsErr: false,
wantDiagsWarning: true,
},
{
name: "enabled multiple experiment - without the required experiment",
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{IamExperiment, RoutingTablesExperiment},
},
experiment: NetworkExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
wantDiagsErr: true,
wantDiagsWarning: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@ -114,3 +142,111 @@ func TestCheckExperimentEnabled(t *testing.T) {
})
}
}
func TestCheckExperimentEnabledWithoutError(t *testing.T) {
type args struct {
ctx context.Context
data *core.ProviderData
experiment string
resourceName string
resourceType core.ResourceType
diags *diag.Diagnostics
}
tests := []struct {
name string
args args
wantEnabled bool
wantDiagsErr bool
wantDiagsWarning bool
}{
{
name: "enabled",
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{IamExperiment},
},
experiment: IamExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
wantEnabled: true,
wantDiagsErr: false,
wantDiagsWarning: true,
},
{
name: "disabled - no error",
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{},
},
experiment: NetworkExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
wantEnabled: false,
wantDiagsErr: false,
wantDiagsWarning: false,
},
{
name: "invalid experiment",
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{IamExperiment},
},
experiment: "foobar",
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
wantEnabled: false,
wantDiagsErr: true,
wantDiagsWarning: false,
},
{
name: "enabled multiple experiment",
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{IamExperiment, NetworkExperiment, RoutingTablesExperiment},
},
experiment: NetworkExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
wantEnabled: true,
wantDiagsErr: false,
wantDiagsWarning: true,
},
{
name: "enabled multiple experiment - without the required experiment",
args: args{
ctx: context.Background(),
data: &core.ProviderData{
Experiments: []string{IamExperiment, RoutingTablesExperiment},
},
experiment: NetworkExperiment,
resourceType: core.Resource,
diags: &diag.Diagnostics{},
},
wantEnabled: false,
wantDiagsErr: false,
wantDiagsWarning: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := CheckExperimentEnabledWithoutError(tt.args.ctx, tt.args.data, tt.args.experiment, tt.args.resourceName, tt.args.resourceType, tt.args.diags); got != tt.wantEnabled {
t.Errorf("CheckExperimentEnabledWithoutError() = %v, want %v", got, tt.wantEnabled)
}
if got := tt.args.diags.HasError(); got != tt.wantDiagsErr {
t.Errorf("CheckExperimentEnabled() diags.HasError() = %v, want %v", got, tt.wantDiagsErr)
}
if got := tt.args.diags.WarningsCount() > 0; got != tt.wantDiagsWarning {
t.Errorf("CheckExperimentEnabled() diags.WarningsCount() > 0 = %v, want %v", got, tt.wantDiagsErr)
}
})
}
}