From 6e259ce2ae8c39948b2881900eb9ddce66ab6583 Mon Sep 17 00:00:00 2001 From: Haishi Bai Date: Tue, 25 Nov 2025 14:15:25 -0800 Subject: [PATCH 1/3] evaluation expressions in config --- .../v1alpha1/managers/stage/stage-manager.go | 74 +++++++++++++++++++ .../managers/stage/stage-manager_test.go | 1 + 2 files changed, 75 insertions(+) diff --git a/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go b/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go index 3da207669..6b9d359c6 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{}) From 34433c83853ac93438c0aefffb9576134338369a Mon Sep 17 00:00:00 2001 From: Haishi Bai Date: Tue, 25 Nov 2025 16:07:07 -0800 Subject: [PATCH 2/3] deseralization fix --- api/pkg/apis/v1alpha1/managers/stage/stage-manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go b/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go index 6b9d359c6..044b6e5cb 100644 --- a/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go +++ b/api/pkg/apis/v1alpha1/managers/stage/stage-manager.go @@ -127,7 +127,7 @@ func (h *CampaignTaskHandler) HandleTask(ctx context.Context, task model.TaskSpe } configMap[k] = val } - err = mapToStruct(configMap, task.Config) + err = mapToStruct(configMap, &task.Config) if err != nil { return nil, err } From d6a2234db138c9e0a502933603eaf7b8732ed5a4 Mon Sep 17 00:00:00 2001 From: eclipse-symphoy-bot Date: Fri, 28 Nov 2025 05:52:24 +0000 Subject: [PATCH 3/3] Bump version to 0.48.44 --- .github/version/versions.txt | 2 +- cli/cmd/up.go | 2 +- packages/helm/symphony/Chart.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) 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/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"