diff --git a/.github/version/versions.txt b/.github/version/versions.txt index d0043c5b4..5c15f2909 100644 --- a/.github/version/versions.txt +++ b/.github/version/versions.txt @@ -1 +1 @@ -0.48.43 +0.48.44 diff --git a/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go b/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go index 3da207669..044b6e5cb 100644 --- a/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go +++ b/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go @@ -76,6 +76,26 @@ func NewCampaignTaskHandler(manager *StageManager, triggerData v1alpha2.Activati } } +func structToMap(v any) (map[string]interface{}, error) { + b, err := json.Marshal(v) + if err != nil { + return nil, err + } + var m map[string]interface{} + if err := json.Unmarshal(b, &m); err != nil { + return nil, err + } + return m, nil +} + +func mapToStruct(m map[string]interface{}, dst any) error { + b, err := json.Marshal(m) + if err != nil { + return err + } + return json.Unmarshal(b, dst) +} + func (h *CampaignTaskHandler) HandleTask(ctx context.Context, task model.TaskSpec, inputs map[string]interface{}, siteName string) (map[string]interface{}, error) { // Create task-specific inputs taskInputs := utils.MergeCollection_StringAny(inputs, task.Inputs) @@ -94,6 +114,25 @@ func (h *CampaignTaskHandler) HandleTask(ctx context.Context, task model.TaskSpe taskInputs[k] = val } + if task.Config != nil { + configMap, err := structToMap(task.Config) + if err != nil { + return nil, err + } + for k, v := range configMap { + var val interface{} + val, err := h.manager.traceValue(ctx, v, h.triggerData.Namespace, taskInputs, h.triggers, h.triggerData.Outputs) + if err != nil { + return nil, err + } + configMap[k] = val + } + err = mapToStruct(configMap, &task.Config) + if err != nil { + return nil, err + } + } + // Create task provider factory := symproviders.SymphonyProviderFactory{} taskProvider, err := factory.CreateProvider(task.Provider, task.Config) @@ -859,6 +898,41 @@ func (s *StageManager) HandleTriggerEvent(ctx context.Context, campaign model.Ca // 5. If campaign.provider exists, initialize a provider var provider providers.IProvider if triggerData.Provider != "" { + + if triggerData.Config != nil { + //evaluate config expressions + configMap, err := structToMap(triggerData.Config) + if err != nil { + status.Status = v1alpha2.InternalError + status.StatusMessage = v1alpha2.InternalError.String() + status.ErrorMessage = err.Error() + status.IsActive = false + log.ErrorfCtx(ctx, " M (Stage): failed to convert config to map: %v", err) + return status, activationData + } + for k, v := range configMap { + var val interface{} + val, err = s.traceValue(ctx, v, triggerData.Namespace, snapshotInputs, triggers, triggerData.Outputs) + if err != nil { + status.Status = v1alpha2.InternalError + status.StatusMessage = v1alpha2.InternalError.String() + status.ErrorMessage = err.Error() + status.IsActive = false + log.ErrorfCtx(ctx, " M (Stage): failed to evaluate config: %v", err) + return status, activationData + } + configMap[k] = val + } + err = mapToStruct(configMap, &triggerData.Config) + if err != nil { + status.Status = v1alpha2.InternalError + status.StatusMessage = v1alpha2.InternalError.String() + status.ErrorMessage = err.Error() + status.IsActive = false + log.ErrorfCtx(ctx, " M (Stage): failed to convert config map to struct: %v", err) + return status, activationData + } + } factory := symproviders.SymphonyProviderFactory{} provider, err = factory.CreateProvider(triggerData.Provider, triggerData.Config) if err != nil { diff --git a/api/pkg/apis/v1alpha1/managers/stage/stage-manager_test.go b/api/pkg/apis/v1alpha1/managers/stage/stage-manager_test.go index ef19c34a0..2ab6fda32 100644 --- a/api/pkg/apis/v1alpha1/managers/stage/stage-manager_test.go +++ b/api/pkg/apis/v1alpha1/managers/stage/stage-manager_test.go @@ -88,6 +88,7 @@ func TestCampaignWithSingleMockStageLoop(t *testing.T) { // assert.Equal(t, "test", status.Outputs["__stage"]) // assert.Equal(t, "fake", status.Outputs["__site"]) } + func TestCampaignWithSingleCounterStageLoop(t *testing.T) { stateProvider := &memorystate.MemoryStateProvider{} stateProvider.Init(memorystate.MemoryStateProviderConfig{}) diff --git a/cli/cmd/up.go b/cli/cmd/up.go index 6c8d4bc9a..b30f6ff4c 100644 --- a/cli/cmd/up.go +++ b/cli/cmd/up.go @@ -22,7 +22,7 @@ import ( ) // The version is auto updated by the release pipeline, do not change it manually -const SymphonyAPIVersion = "0.48.43" +const SymphonyAPIVersion = "0.48.44" const KANPortalVersion = "0.39.0-main-603f4b9-amd64" var ( diff --git a/packages/helm/symphony/Chart.yaml b/packages/helm/symphony/Chart.yaml index 395e03de4..33bf9a0ac 100644 --- a/packages/helm/symphony/Chart.yaml +++ b/packages/helm/symphony/Chart.yaml @@ -3,9 +3,9 @@ name: symphony description: A Helm chart for Symphony control plane type: application # The version is auto updated by the release pipeline, do not change it manually -version: "0.48.43" +version: "0.48.44" # The version is auto updated by the release pipeline, do not change it manually -appVersion: "0.48.43" +appVersion: "0.48.44" dependencies: - name: cert-manager version: "1.13.1"