Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide KIM integration for freemium #983

Merged
merged 3 commits into from
Aug 6, 2024
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
25 changes: 12 additions & 13 deletions internal/process/provisioning/create_runtime_resource_step.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,14 @@ func (s *CreateRuntimeResourceStep) Run(operation internal.Operation, log logrus

func (s *CreateRuntimeResourceStep) updateRuntimeResourceObject(runtime *imv1.Runtime, operation internal.Operation, runtimeName, kymaName, kymaNamespace string) error {

runtime.ObjectMeta.Name = runtimeName
runtime.ObjectMeta.Namespace = kymaNamespace
runtime.ObjectMeta.Labels = s.createLabelsForRuntime(operation, kymaName)

// get plan specific values (like zones, default machine type etc.
values, err := s.providerValues(&operation)
if err != nil {
return err
}
runtime.ObjectMeta.Name = runtimeName
runtime.ObjectMeta.Namespace = kymaNamespace
runtime.ObjectMeta.Labels = s.createLabelsForRuntime(operation, kymaName, values.Region)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sometimes region is not provided in provisioning parameters,


providerObj, err := s.createShootProvider(&operation, values)
if err != nil {
Expand All @@ -144,7 +143,7 @@ func (s *CreateRuntimeResourceStep) updateRuntimeResourceObject(runtime *imv1.Ru
return nil
}

func (s *CreateRuntimeResourceStep) createLabelsForRuntime(operation internal.Operation, kymaName string) map[string]string {
func (s *CreateRuntimeResourceStep) createLabelsForRuntime(operation internal.Operation, kymaName string, region string) map[string]string {
labels := map[string]string{
"kyma-project.io/instance-id": operation.InstanceID,
"kyma-project.io/runtime-id": operation.RuntimeID,
Expand All @@ -153,7 +152,7 @@ func (s *CreateRuntimeResourceStep) createLabelsForRuntime(operation internal.Op
"kyma-project.io/global-account-id": operation.ProvisioningParameters.ErsContext.GlobalAccountID,
"kyma-project.io/subaccount-id": operation.ProvisioningParameters.ErsContext.SubAccountID,
"kyma-project.io/shoot-name": operation.ShootName,
"kyma-project.io/region": *operation.ProvisioningParameters.Parameters.Region,
"kyma-project.io/region": region,
"operator.kyma-project.io/kyma-name": kymaName,
}
if s.kimConfig.ViewOnly {
Expand Down Expand Up @@ -229,19 +228,19 @@ func (s *CreateRuntimeResourceStep) providerValues(operation *internal.Operation
ProvisioningParameters: operation.ProvisioningParameters,
}
case broker.FreemiumPlanID:
var freemiumProvider internal.CloudProvider
if operation.ProvisioningParameters.Parameters.Provider == nil {
return provider.Values{}, fmt.Errorf("provider not defined for freemium plan")
}
freemiumProvider = *operation.ProvisioningParameters.Parameters.Provider
switch freemiumProvider {
switch operation.ProvisioningParameters.PlatformProvider {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provider comes from the kind of a BTP account, not a parameter set by a customer

case internal.AWS:
p = &provider.AWSFreemiumInputProvider{
UseSmallerMachineTypes: s.useSmallerMachineTypes,
ProvisioningParameters: operation.ProvisioningParameters,
}
case internal.Azure:
p = &provider.AzureFreemiumInputProvider{
UseSmallerMachineTypes: s.useSmallerMachineTypes,
ProvisioningParameters: operation.ProvisioningParameters,
}
default:
return provider.Values{}, fmt.Errorf("freemium provider for %s not yet implemented", freemiumProvider)
return provider.Values{}, fmt.Errorf("freemium provider for '%s' is not supported", operation.ProvisioningParameters.PlatformProvider)
}

case broker.TrialPlanID:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"strings"
"testing"

"github.com/pivotal-cf/brokerapi/v8/domain"

"github.com/kyma-project/kyma-environment-broker/internal/networking"

gardener "github.com/gardener/gardener/pkg/apis/core/v1beta1"
Expand Down Expand Up @@ -664,6 +666,57 @@ func TestCreateRuntimeResourceStep_Defaults_GCP_MultiZone_ActualCreation(t *test

_, err = memoryStorage.Instances().GetByID(operation.InstanceID)
assert.NoError(t, err)
}

func TestCreateRuntimeResourceStep_Defaults_Freemium(t *testing.T) {

for _, testCase := range []struct {
name string
gotProvider internal.CloudProvider
expectedProvider string
expectedMachineType string
expectedRegion string
possibleZones []string
}{
{"azure", internal.Azure, "azure", "Standard_D4s_v5", "westeurope", []string{"1", "2", "3"}},
{"aws", internal.AWS, "aws", "m5.xlarge", "westeurope", []string{"eu-central-1a", "eu-central-1b", "eu-central-1c"}},
} {
t.Run(testCase.name, func(t *testing.T) {
log := logrus.New()
memoryStorage := storage.NewMemoryStorage()
err := imv1.AddToScheme(scheme.Scheme)
assert.NoError(t, err)
instance, operation := fixInstanceAndOperation(broker.FreemiumPlanID, "", "platform-region")
operation.ProvisioningParameters.PlatformProvider = testCase.gotProvider
assertInsertions(t, memoryStorage, instance, operation)
kimConfig := fixKimConfig("free", false)

cli := getClientForTests(t)
inputConfig := input.Config{MultiZoneCluster: true}
step := NewCreateRuntimeResourceStep(memoryStorage.Operations(), memoryStorage.Instances(), cli, kimConfig, inputConfig, nil, false)

// when
entry := log.WithFields(logrus.Fields{"step": "TEST"})
gotOperation, repeat, err := step.Run(operation, entry)

// then
assert.NoError(t, err)
assert.Zero(t, repeat)
assert.Equal(t, domain.InProgress, gotOperation.State)

runtime := imv1.Runtime{}
err = cli.Get(context.Background(), client.ObjectKey{
Namespace: "kyma-system",
Name: operation.RuntimeID,
}, &runtime)
assert.NoError(t, err)
assert.Equal(t, operation.RuntimeID, runtime.Name)
assert.Equal(t, "runtime-58f8c703-1756-48ab-9299-a847974d1fee", runtime.Labels["operator.kyma-project.io/kyma-name"])
assert.Equal(t, testCase.expectedProvider, runtime.Spec.Shoot.Provider.Type)
assertWorkers(t, runtime.Spec.Shoot.Provider.Workers, testCase.expectedMachineType, 1, 1, 1, 0, 1, testCase.possibleZones)

})
}

}

Expand Down Expand Up @@ -772,20 +825,26 @@ func fixInstanceAndOperation(planID, region, platformRegion string) (internal.In
}

func fixOperationForCreateRuntimeResourceStep(operationID, instanceID, planID, region, platformRegion string) internal.Operation {
var regionToSet *string
if region != "" {
regionToSet = &region

}
provisioningParameters := internal.ProvisioningParameters{
PlanID: planID,
ServiceID: fixture.ServiceId,
ErsContext: fixture.FixERSContext(operationID),
Parameters: internal.ProvisioningParametersDTO{
Name: "cluster-test",
Region: ptr.String(region),
Region: regionToSet,
RuntimeAdministrators: runtimeAdministrators,
TargetSecret: ptr.String(SecretBindingName),
},
PlatformRegion: platformRegion,
}

operation := fixture.FixProvisioningOperationWithProvisioningParameters(operationID, instanceID, provisioningParameters)
operation.State = domain.InProgress
operation.KymaTemplate = `
apiVersion: operator.kyma-project.io/v1beta2
kind: Kyma
Expand Down
30 changes: 30 additions & 0 deletions internal/provider/azure.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ type (
UseSmallerMachineTypes bool
ProvisioningParameters internal.ProvisioningParameters
}
AzureFreemiumInputProvider struct {
UseSmallerMachineTypes bool
ProvisioningParameters internal.ProvisioningParameters
}
)

func (p *AzureInputProvider) Provide() Values {
Expand Down Expand Up @@ -129,3 +133,29 @@ func (p *AzureLiteInputProvider) region() string {
}
return DefaultAzureRegion
}

func (p *AzureFreemiumInputProvider) Provide() Values {
machineType := DefaultOldAzureTrialMachineType
if p.UseSmallerMachineTypes {
machineType = DefaultAzureMachineType
}
zones := p.zones()
region := DefaultAzureRegion
if p.ProvisioningParameters.Parameters.Region != nil {
region = *p.ProvisioningParameters.Parameters.Region
}
return Values{
DefaultAutoScalerMax: 1,
DefaultAutoScalerMin: 1,
ZonesCount: 1,
Zones: zones,
ProviderType: "azure",
DefaultMachineType: machineType,
Region: region,
Purpose: PurposeEvaluation,
}
}

func (p *AzureFreemiumInputProvider) zones() []string {
return GenerateAzureZones(1)
}
Loading