Skip to content
Open
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
105 changes: 94 additions & 11 deletions api/pkg/apis/v1alpha1/managers/campaigns/campaigns-manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"context"
"encoding/json"
"fmt"
"strconv"
"strings"

"github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model"
"github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2"
Expand All @@ -19,8 +21,11 @@ import (
observ_utils "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/observability/utils"
"github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers"
"github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers/states"
"github.com/eclipse-symphony/symphony/coa/pkg/logger"
)

var log = logger.NewLogger("coa.runtime")

type CampaignsManager struct {
managers.Manager
StateProvider states.IStateProvider
Expand Down Expand Up @@ -96,6 +101,37 @@ func (m *CampaignsManager) UpsertState(ctx context.Context, name string, state m
}
state.ObjectMeta.FixNames(name)

var rootResource string
var version string
var refreshLabels bool
log.Info(" M (Campaign manager): debug upsert state >>>>>>>>>>>>>>>>>>>> %v, %v, %v", state.Spec.Version, state.Spec.RootResource, name)

if state.Spec.Version != "" {
version = state.Spec.Version
}
if state.Spec.RootResource == "" && version != "" {
suffix := "-" + version
rootResource = strings.TrimSuffix(name, suffix)
} else {
rootResource = state.Spec.RootResource
}

if state.ObjectMeta.Labels == nil {
state.ObjectMeta.Labels = make(map[string]string)
}

_, versionLabelExists := state.ObjectMeta.Labels["version"]
_, rootLabelExists := state.ObjectMeta.Labels["rootResource"]
if (!versionLabelExists || !rootLabelExists) && version != "" && rootResource != "" {
log.Info(" M (Campaign manager): update labels to true >>>>>>>>>>>>>>>>>>>> %v, %v", rootResource, version)

state.ObjectMeta.Labels["rootResource"] = rootResource
state.ObjectMeta.Labels["version"] = version
refreshLabels = true
}
log.Info(" M (Campaign manager): update labels to versionLabelExists, rootLabelExists >>>>>>>>>>>>>>>>>>>> %v, %v", versionLabelExists, rootLabelExists)
log.Info(" M (Campaign manager): debug refresh >>>>>>>>>>>>>>>>>>>> %v", refreshLabels)

upsertRequest := states.UpsertRequest{
Value: states.StateEntry{
ID: name,
Expand All @@ -107,11 +143,13 @@ func (m *CampaignsManager) UpsertState(ctx context.Context, name string, state m
},
},
Metadata: map[string]interface{}{
"namespace": state.ObjectMeta.Namespace,
"group": model.WorkflowGroup,
"version": "v1",
"resource": "campaigns",
"kind": "Campaign",
"namespace": state.ObjectMeta.Namespace,
"group": model.WorkflowGroup,
"version": "v1",
"resource": "campaigns",
"kind": "Campaign",
"rootResource": rootResource,
"refreshLabels": strconv.FormatBool(refreshLabels),
},
}

Expand All @@ -126,14 +164,28 @@ func (m *CampaignsManager) DeleteState(ctx context.Context, name string, namespa
var err error = nil
defer observ_utils.CloseSpanWithError(span, &err)

var rootResource string
var version string
var id string
parts := strings.Split(name, ":")
if len(parts) == 2 {
rootResource = parts[0]
version = parts[1]
id = rootResource + "-" + version
} else {
id = name
}
log.Info(" M (Catalog manager): delete state >>>>>>>>>>>>>>>>>>>>parts %v, %v", rootResource, version)

err = m.StateProvider.Delete(ctx, states.DeleteRequest{
ID: name,
ID: id,
Metadata: map[string]interface{}{
"namespace": namespace,
"group": model.WorkflowGroup,
"version": "v1",
"resource": "campaigns",
"kind": "Campaign",
"namespace": namespace,
"group": model.WorkflowGroup,
"version": "v1",
"resource": "campaigns",
"kind": "Campaign",
"rootResource": rootResource,
},
})
return err
Expand Down Expand Up @@ -171,3 +223,34 @@ func (t *CampaignsManager) ListState(ctx context.Context, namespace string) ([]m
}
return ret, nil
}

func (t *CampaignsManager) GetLatestState(ctx context.Context, id string, namespace string) (model.CampaignState, error) {
ctx, span := observability.StartSpan("Solutions Manager", ctx, &map[string]string{
"method": "GetLatest",
})
var err error = nil
defer observ_utils.CloseSpanWithError(span, &err)

log.Info(" M (Campaign manager): debug get latest state >>>>>>>>>>>>>>>>>>>> %v, %v", id, namespace)

getRequest := states.GetRequest{
ID: id,
Metadata: map[string]interface{}{
"version": "v1",
"group": model.WorkflowGroup,
"resource": "campaigns",
"namespace": namespace,
"kind": "Campaign",
},
}
entry, err := t.StateProvider.GetLatest(ctx, getRequest)
if err != nil {
return model.CampaignState{}, err
}

ret, err := getCampaignState(entry.Body)
if err != nil {
return model.CampaignState{}, err
}
return ret, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func TestCreateGetDeleteCampaignSpec(t *testing.T) {
manager := CampaignsManager{
StateProvider: stateProvider,
}
err := manager.UpsertState(context.Background(), "test", model.CampaignState{})
err := manager.UpsertState(context.Background(), "test", model.CampaignState{Spec: &model.CampaignSpec{}})
assert.Nil(t, err)
spec, err := manager.GetState(context.Background(), "test", "default")
assert.Nil(t, err)
Expand Down
104 changes: 93 additions & 11 deletions api/pkg/apis/v1alpha1/managers/catalogs/catalogs-manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"context"
"encoding/json"
"fmt"
"strconv"
"strings"

"github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model"
"github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/providers/graph"
Expand Down Expand Up @@ -82,6 +84,37 @@ func (s *CatalogsManager) GetState(ctx context.Context, name string, namespace s
return ret, nil
}

func (t *CatalogsManager) GetLatestState(ctx context.Context, id string, namespace string) (model.CatalogState, error) {
ctx, span := observability.StartSpan("Catalogs Manager", ctx, &map[string]string{
"method": "GetLatest",
})
var err error = nil
defer observ_utils.CloseSpanWithError(span, &err)

log.Info(" M (Catalog manager): debug get latest state >>>>>>>>>>>>>>>>>>>> %v, %v", id, namespace)

getRequest := states.GetRequest{
ID: id,
Metadata: map[string]interface{}{
"version": "v1",
"group": model.FederationGroup,
"resource": "catalogs",
"namespace": namespace,
"kind": "Catalog",
},
}
entry, err := t.StateProvider.GetLatest(ctx, getRequest)
if err != nil {
return model.CatalogState{}, err
}

ret, err := getCatalogState(entry.Body, entry.ETag)
if err != nil {
return model.CatalogState{}, err
}
return ret, nil
}

func getCatalogState(body interface{}, etag string) (model.CatalogState, error) {
var catalogState model.CatalogState
bytes, _ := json.Marshal(body)
Expand Down Expand Up @@ -152,6 +185,37 @@ func (m *CatalogsManager) UpsertState(ctx context.Context, name string, state mo
return err
}

var rootResource string
var version string
var refreshLabels bool
log.Info(" M (Catalog manager): debug upsert state >>>>>>>>>>>>>>>>>>>> %v, %v, %v", state.Spec.Version, state.Spec.RootResource, name)

if state.Spec.Version != "" {
version = state.Spec.Version
}
if state.Spec.RootResource == "" && version != "" {
suffix := "-" + version
rootResource = strings.TrimSuffix(name, suffix)
} else {
rootResource = state.Spec.RootResource
}

if state.ObjectMeta.Labels == nil {
state.ObjectMeta.Labels = make(map[string]string)
}

_, versionLabelExists := state.ObjectMeta.Labels["version"]
_, rootLabelExists := state.ObjectMeta.Labels["rootResource"]
if (!versionLabelExists || !rootLabelExists) && version != "" && rootResource != "" {
log.Info(" M (Catalog manager): update labels to true >>>>>>>>>>>>>>>>>>>> %v, %v", rootResource, version)

state.ObjectMeta.Labels["rootResource"] = rootResource
state.ObjectMeta.Labels["version"] = version
refreshLabels = true
}
log.Info(" M (Catalog manager): update labels to versionLabelExists, rootLabelExists >>>>>>>>>>>>>>>>>>>> %v, %v", versionLabelExists, rootLabelExists)
log.Info(" M (Catalog manager): debug refresh >>>>>>>>>>>>>>>>>>>> %v", refreshLabels)

upsertRequest := states.UpsertRequest{
Value: states.StateEntry{
ID: name,
Expand All @@ -163,13 +227,16 @@ func (m *CatalogsManager) UpsertState(ctx context.Context, name string, state mo
},
},
Metadata: map[string]interface{}{
"namespace": state.ObjectMeta.Namespace,
"group": model.FederationGroup,
"version": "v1",
"resource": "catalogs",
"kind": "Catalog",
"namespace": state.ObjectMeta.Namespace,
"group": model.FederationGroup,
"version": "v1",
"resource": "catalogs",
"kind": "Catalog",
"rootResource": rootResource,
"refreshLabels": strconv.FormatBool(refreshLabels),
},
}

_, err = m.StateProvider.Upsert(ctx, upsertRequest)
if err != nil {
return err
Expand All @@ -194,15 +261,30 @@ func (m *CatalogsManager) DeleteState(ctx context.Context, name string, namespac
var err error = nil
defer observ_utils.CloseSpanWithError(span, &err)

var rootResource string
var version string
var id string
parts := strings.Split(name, ":")
if len(parts) == 2 {
rootResource = parts[0]
version = parts[1]
id = rootResource + "-" + version
} else {
id = name
}

log.Info(" M (Catalog manager): delete state >>>>>>>>>>>>>>>>>>>>parts %v, %v", rootResource, version)

//TODO: publish DELETE event
err = m.StateProvider.Delete(ctx, states.DeleteRequest{
ID: name,
ID: id,
Metadata: map[string]interface{}{
"namespace": namespace,
"group": model.FederationGroup,
"version": "v1",
"resource": "catalogs",
"kind": "Catalog",
"namespace": namespace,
"group": model.FederationGroup,
"version": "v1",
"resource": "catalogs",
"kind": "Catalog",
"rootResource": rootResource,
},
})
return err
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
var manager CatalogsManager
var catalogState = model.CatalogState{
ObjectMeta: model.ObjectMeta{
Name: "name1",
Name: "name1-v1",
},
Spec: &model.CatalogSpec{
Type: "catalog",
Expand Down Expand Up @@ -154,7 +154,7 @@ func TestUpsertAndGet(t *testing.T) {
err := json.Unmarshal(jData, &job)
assert.Nil(t, err)
assert.Equal(t, "catalog", event.Metadata["objectType"])
assert.Equal(t, "name1", job.Id)
assert.Equal(t, "name1-v1", job.Id)
assert.Equal(t, true, job.Action == v1alpha2.JobUpdate || job.Action == v1alpha2.JobDelete)
return nil
})
Expand Down
23 changes: 17 additions & 6 deletions api/pkg/apis/v1alpha1/managers/configs/configs-manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ func (s *ConfigsManager) Init(context *contexts.VendorContext, cfg managers.Mana
return nil
}
func (s *ConfigsManager) Get(object string, field string, overlays []string, localContext interface{}) (interface{}, error) {
if strings.Index(object, ":") > 0 {
log.Infof(" M (Config): Get %v, %d", object, len(s.ConfigProviders))
if strings.Index(object, ":") > 0 && len(s.ConfigProviders) > 1 {
parts := strings.Split(object, ":")
if len(parts) != 2 {
return "", v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid object: %s", object), v1alpha2.BadRequest)
Expand Down Expand Up @@ -122,7 +123,9 @@ func (s *ConfigsManager) getWithOverlay(provider config.IConfigProvider, object
}

func (s *ConfigsManager) GetObject(object string, overlays []string, localContext interface{}) (map[string]interface{}, error) {
if strings.Index(object, ":") > 0 {
log.Infof(" M (Config): GetObject %v, %d", object, len(s.ConfigProviders))

if strings.Index(object, ":") > 0 && len(s.ConfigProviders) > 1 {
parts := strings.Split(object, ":")
if len(parts) != 2 {
return nil, v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid object: %s", object), v1alpha2.BadRequest)
Expand Down Expand Up @@ -161,7 +164,9 @@ func (s *ConfigsManager) getObjectWithOverlay(provider config.IConfigProvider, o
return provider.ReadObject(object, localContext)
}
func (s *ConfigsManager) Set(object string, field string, value interface{}) error {
if strings.Index(object, ":") > 0 {
log.Infof(" M (Config): Set %v, %d", object, len(s.ConfigProviders))

if strings.Index(object, ":") > 0 && len(s.ConfigProviders) > 1 {
parts := strings.Split(object, ":")
if len(parts) != 2 {
return v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid object: %s", object), v1alpha2.BadRequest)
Expand All @@ -186,7 +191,9 @@ func (s *ConfigsManager) Set(object string, field string, value interface{}) err
return v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid config object or key: %s, %s", object, field), v1alpha2.BadRequest)
}
func (s *ConfigsManager) SetObject(object string, values map[string]interface{}) error {
if strings.Index(object, ":") > 0 {
log.Infof(" M (Config): SetObject %v, %d", object, len(s.ConfigProviders))

if strings.Index(object, ":") > 0 && len(s.ConfigProviders) > 1 {
parts := strings.Split(object, ":")
if len(parts) != 2 {
return v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid object: %s", object), v1alpha2.BadRequest)
Expand All @@ -211,7 +218,9 @@ func (s *ConfigsManager) SetObject(object string, values map[string]interface{})
return v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid config object: %s", object), v1alpha2.BadRequest)
}
func (s *ConfigsManager) Delete(object string, field string) error {
if strings.Index(object, ":") > 0 {
log.Infof(" M (Config): Delete %v, %d", object, len(s.ConfigProviders))

if strings.Index(object, ":") > 0 && len(s.ConfigProviders) > 1 {
parts := strings.Split(object, ":")
if len(parts) != 2 {
return v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid object: %s", object), v1alpha2.BadRequest)
Expand All @@ -236,7 +245,9 @@ func (s *ConfigsManager) Delete(object string, field string) error {
return v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid config object or key: %s, %s", object, field), v1alpha2.BadRequest)
}
func (s *ConfigsManager) DeleteObject(object string) error {
if strings.Index(object, ":") > 0 {
log.Infof(" M (Config): DeleteObject %v, %d", object, len(s.ConfigProviders))

if strings.Index(object, ":") > 0 && len(s.ConfigProviders) > 1 {
parts := strings.Split(object, ":")
if len(parts) != 2 {
return v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid object: %s", object), v1alpha2.BadRequest)
Expand Down
Loading