Skip to content

Commit

Permalink
Merge branch 'main' into features/refactored-hap-doc
Browse files Browse the repository at this point in the history
  • Loading branch information
ralikio authored Jan 28, 2025
2 parents b9afbd5 + 16190c9 commit b020638
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 33 deletions.
53 changes: 50 additions & 3 deletions internal/process/operation_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package process
import (
"fmt"
"log/slog"
"sync"
"time"

"github.com/kyma-project/kyma-environment-broker/common/orchestration"
Expand All @@ -17,10 +18,38 @@ type OperationManager struct {
storage storage.Operations
component kebErr.Component
step string

// stores timestamp to calculate timeout in retry* methods, the key is the operation.ID
retryTimestamps map[string]time.Time
mu sync.RWMutex
}

func NewOperationManager(storage storage.Operations, step string, component kebErr.Component) *OperationManager {
return &OperationManager{storage: storage, component: component, step: step}
op := &OperationManager{storage: storage, component: component, step: step, retryTimestamps: make(map[string]time.Time)}
go func() {
ticker := time.NewTicker(time.Hour)
defer ticker.Stop()
for {
<-ticker.C
runTimestampGC(op, step)
}
}()
return op
}

func runTimestampGC(op *OperationManager, step string) {
numberOfDeletions := 0
op.mu.Lock()
for opId, ts := range op.retryTimestamps {
if time.Since(ts) > 48*time.Hour {
delete(op.retryTimestamps, opId)
numberOfDeletions++
}
}
op.mu.Unlock()
if numberOfDeletions > 0 {
slog.Info("Operation Manager for step %s has deleted %d old timestamps", step, numberOfDeletions)
}
}

// OperationSucceeded marks the operation as succeeded and returns status of the operation's update
Expand Down Expand Up @@ -69,9 +98,12 @@ func (om *OperationManager) OperationCanceled(operation internal.Operation, desc
func (om *OperationManager) RetryOperation(operation internal.Operation, errorMessage string, err error, retryInterval time.Duration, maxTime time.Duration, log *slog.Logger) (internal.Operation, time.Duration, error) {
log.Info(fmt.Sprintf("Retry Operation was triggered with message: %s", errorMessage))
log.Info(fmt.Sprintf("Retrying for %s in %s steps", maxTime.String(), retryInterval.String()))
if time.Since(operation.UpdatedAt) < maxTime {

om.storeTimestampIfMissing(operation.ID)
if !om.isTimeoutOccurred(operation.ID, maxTime) {
return operation, retryInterval, nil
}

log.Error(fmt.Sprintf("Aborting after %s of failing retries", maxTime.String()))
op, retry, err := om.OperationFailed(operation, errorMessage, err, log)
if err == nil {
Expand All @@ -90,7 +122,8 @@ func (om *OperationManager) RetryOperationWithoutFail(operation internal.Operati
}

log.Info(fmt.Sprintf("retrying for %s in %s steps", maxTime.String(), retryInterval.String()))
if time.Since(operation.UpdatedAt) < maxTime {
om.storeTimestampIfMissing(operation.ID)
if !om.isTimeoutOccurred(operation.ID, maxTime) {
return operation, retryInterval, nil
}
// update description to track failed steps
Expand Down Expand Up @@ -166,3 +199,17 @@ func (om *OperationManager) update(operation internal.Operation, state domain.La
operation.Description = description
}, log)
}

func (om *OperationManager) storeTimestampIfMissing(id string) {
om.mu.Lock()
defer om.mu.Unlock()
if om.retryTimestamps[id].IsZero() {
om.retryTimestamps[id] = time.Now()
}
}

func (om *OperationManager) isTimeoutOccurred(id string, maxTime time.Duration) bool {
om.mu.RLock()
defer om.mu.RUnlock()
return !om.retryTimestamps[id].IsZero() && time.Since(om.retryTimestamps[id]) > maxTime
}
6 changes: 2 additions & 4 deletions internal/process/operation_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func Test_OperationManager_RetryOperationOnce(t *testing.T) {
opManager := NewOperationManager(operations, "some_step", kebErr.ProvisionerDependency)
op := internal.Operation{}
op.UpdatedAt = time.Now()
retryInterval := time.Hour
retryInterval := time.Millisecond
errMsg := fmt.Errorf("ups ... ")

// this is required to avoid storage retries (without this statement there will be an error => retry)
Expand All @@ -37,9 +37,7 @@ func Test_OperationManager_RetryOperationOnce(t *testing.T) {
assert.Nil(t, err)

// then - second call
t.Log(op.UpdatedAt.String())
op.UpdatedAt = op.UpdatedAt.Add(-retryInterval - time.Second) // simulate wait of first retry
t.Log(op.UpdatedAt.String())
time.Sleep(time.Millisecond * 2)
op, when, err = opManager.RetryOperationOnce(op, errMsg.Error(), errMsg, retryInterval, fixLogger())

// when - second call => no retry
Expand Down
4 changes: 2 additions & 2 deletions resources/keb/Chart.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apiVersion: v2
appVersion: "1.11.18"
appVersion: "1.11.19"
name: keb
description:
description: Kyma Environment Broker Helm chart for Kubernetes
version: 1.11.18
version: 1.11.19
type: application
20 changes: 10 additions & 10 deletions resources/keb/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,34 @@ global:
path: europe-docker.pkg.dev/kyma-project/prod
kyma_environment_broker:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_broker_schema_migrator:
dir:
version: 1.11.18
version: 1.11.19
kyma_environments_subaccount_cleanup_job:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_trial_cleanup_job:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_expirator_job:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_deprovision_retrigger_job:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_runtime_reconciler:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_subaccount_sync:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_globalaccounts:
dir:
version: "1.11.18"
version: "1.11.19"
kyma_environment_service_binding_cleanup_job:
dir:
version: 1.11.18
version: 1.11.19

kyma_environment_broker:
serviceAccountName: "kcp-kyma-environment-broker"
Expand Down
24 changes: 12 additions & 12 deletions sec-scanners-config.yaml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
module-name: kyma-environment-broker
rc-tag: 1.11.18
rc-tag: 1.11.19
protecode:
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-broker:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-deprovision-retrigger-job:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environments-cleanup-job:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-runtime-reconciler:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-archiver-job:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-expirator-job:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-subaccount-cleanup-job:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-subaccount-sync:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-broker-globalaccounts:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-broker-schema-migrator:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-service-binding-cleanup-job:1.11.18
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-broker:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-deprovision-retrigger-job:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environments-cleanup-job:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-runtime-reconciler:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-archiver-job:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-expirator-job:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-subaccount-cleanup-job:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-subaccount-sync:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-broker-globalaccounts:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-broker-schema-migrator:1.11.19
- europe-docker.pkg.dev/kyma-project/prod/kyma-environment-service-binding-cleanup-job:1.11.19
whitesource:
language: golang-mod
subprojects: false
Expand Down
5 changes: 5 additions & 0 deletions testing/e2e/skr-tester/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# SKR Tester

SKR Tester is used for integration testing of Kyma Environment Broker.

For more details on how to use SKR Tester, see the built-in CLI documentation.
2 changes: 1 addition & 1 deletion utils/archiver/kyma-environment-broker-archiver.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,4 @@ spec:
template:
spec:
containers:
- image: europe-docker.pkg.dev/kyma-project/prod/kyma-environment-archiver-job:1.11.18
- image: europe-docker.pkg.dev/kyma-project/prod/kyma-environment-archiver-job:1.11.19
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ spec:
containers:
- name: kyma-environments-cleanup
command: ["/bin/main"]
image: europe-docker.pkg.dev/kyma-project/prod/kyma-environments-cleanup-job:1.11.18
image: europe-docker.pkg.dev/kyma-project/prod/kyma-environments-cleanup-job:1.11.19
imagePullPolicy: IfNotPresent
env:
- name: DATABASE_EMBEDDED
Expand Down

0 comments on commit b020638

Please sign in to comment.