diff --git a/api/deployment/pai-cluster-role.yaml b/api/deployment/pai-cluster-role.yaml index cd942f441..c930e7038 100644 --- a/api/deployment/pai-cluster-role.yaml +++ b/api/deployment/pai-cluster-role.yaml @@ -11,5 +11,5 @@ metadata: app: symphony-api rules: - apiGroups: ["*", "symphony.microsoft.com","solution.symphony", "ai.symphony", "fabric.symphony", "workflow.symphony", "federation.symphony", "apps", "", "policy", "apiextensions.k8s.io", "rbac.authorization.k8s.io", "admissionregistration.k8s.io"] # "" indicates the core API group - resources: ["*", "validatingwebhookconfigurations", "mutatingwebhookconfigurations", "rolebindings", "roles", "clusterrolebindings", "clusterroles", "secrets", "serviceaccounts", "poddisruptionbudgets", "podsecuritypolicies", "resourcequotas", "customresourcedefinitions", "targets", "skills", "models", "skillpackages", "sites/status", "activations/status", "campaigns", "activations", "sites", "catalogs", "devices", "instances", "solutions", "deployments", "services", "devices/status", "instances/status", "targets/status", "solutions/status", "catalogs/status", "campaigns/status", "namespaces", "targetcontainers", "solutioncontainers", "instancecontainers", "catalogcontainers", "campaigncontainers", "targetcontainers/status", "solutioncontainers/status", "instancecontainers/status", "catalogcontainers/status", "campaigncontainers/status"] + resources: ["*", "validatingwebhookconfigurations", "mutatingwebhookconfigurations", "rolebindings", "roles", "clusterrolebindings", "clusterroles", "secrets", "serviceaccounts", "poddisruptionbudgets", "podsecuritypolicies", "resourcequotas", "customresourcedefinitions", "targets", "skills", "models", "skillpackages", "sites/status", "activations/status", "campaigns", "activations", "sites", "catalogs", "devices", "instances", "solutions", "deployments", "services", "devices/status", "instances/status", "targets/status", "solutions/status", "catalogs/status", "campaigns/status", "namespaces", "solutioncontainers", "catalogcontainers", "campaigncontainers", "solutioncontainers/status", "catalogcontainers/status", "campaigncontainers/status"] verbs: ["*", "get", "list", "watch", "create", "update", "patch", "delete"] \ No newline at end of file diff --git a/api/pkg/apis/v1alpha1/managers/instancecontainers/instance-container-manager.go b/api/pkg/apis/v1alpha1/managers/instancecontainers/instance-container-manager.go deleted file mode 100644 index e4facb776..000000000 --- a/api/pkg/apis/v1alpha1/managers/instancecontainers/instance-container-manager.go +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package instancecontainers - -import ( - "context" - "encoding/json" - "fmt" - - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/contexts" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/managers" - "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" - - observability "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/observability" - observ_utils "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/observability/utils" -) - -var log = logger.NewLogger("coa.runtime") - -type InstanceContainersManager struct { - managers.Manager - StateProvider states.IStateProvider -} - -func (s *InstanceContainersManager) Init(context *contexts.VendorContext, config managers.ManagerConfig, providers map[string]providers.IProvider) error { - err := s.Manager.Init(context, config, providers) - if err != nil { - return err - } - stateprovider, err := managers.GetPersistentStateProvider(config, providers) - if err == nil { - s.StateProvider = stateprovider - } else { - return err - } - return nil -} - -func (t *InstanceContainersManager) DeleteState(ctx context.Context, name string, namespace string) error { - ctx, span := observability.StartSpan("InstanceContainersManager", ctx, &map[string]string{ - "method": "DeleteState", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - err = t.StateProvider.Delete(ctx, states.DeleteRequest{ - ID: name, - Metadata: map[string]interface{}{ - "namespace": namespace, - "group": model.SolutionGroup, - "version": "v1", - "resource": "instancecontainers", - "kind": "InstanceContainer", - }, - }) - return err -} - -func (t *InstanceContainersManager) UpsertState(ctx context.Context, name string, state model.InstanceContainerState) error { - ctx, span := observability.StartSpan("InstanceContainersManager", ctx, &map[string]string{ - "method": "UpsertState", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - if state.ObjectMeta.Name != "" && state.ObjectMeta.Name != name { - return v1alpha2.NewCOAError(nil, fmt.Sprintf("Name in metadata (%s) does not match name in request (%s)", state.ObjectMeta.Name, name), v1alpha2.BadRequest) - } - state.ObjectMeta.FixNames(name) - - body := map[string]interface{}{ - "apiVersion": model.SolutionGroup + "/v1", - "kind": "InstanceContainer", - "metadata": state.ObjectMeta, - "spec": state.Spec, - } - - upsertRequest := states.UpsertRequest{ - Value: states.StateEntry{ - ID: name, - Body: body, - ETag: "", - }, - Metadata: map[string]interface{}{ - "namespace": state.ObjectMeta.Namespace, - "group": model.SolutionGroup, - "version": "v1", - "resource": "instancecontainers", - "kind": "InstanceContainer", - }, - } - _, err = t.StateProvider.Upsert(ctx, upsertRequest) - if err != nil { - return err - } - return nil -} - -func (t *InstanceContainersManager) ListState(ctx context.Context, namespace string) ([]model.InstanceContainerState, error) { - ctx, span := observability.StartSpan("InstanceContainersManager", ctx, &map[string]string{ - "method": "ListState", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - listRequest := states.ListRequest{ - Metadata: map[string]interface{}{ - "version": "v1", - "group": model.SolutionGroup, - "resource": "instancecontainers", - "namespace": namespace, - "kind": "InstanceContainer", - }, - } - var instanceContainers []states.StateEntry - instanceContainers, _, err = t.StateProvider.List(ctx, listRequest) - if err != nil { - return nil, err - } - ret := make([]model.InstanceContainerState, 0) - for _, t := range instanceContainers { - var rt model.InstanceContainerState - rt, err = getInstanceContainerState(t.Body, t.ETag) - if err != nil { - return nil, err - } - ret = append(ret, rt) - } - return ret, nil -} - -func getInstanceContainerState(body interface{}, etag string) (model.InstanceContainerState, error) { - var InstanceContainerState model.InstanceContainerState - bytes, _ := json.Marshal(body) - err := json.Unmarshal(bytes, &InstanceContainerState) - if err != nil { - return model.InstanceContainerState{}, err - } - if InstanceContainerState.Spec == nil { - InstanceContainerState.Spec = &model.InstanceContainerSpec{} - } - return InstanceContainerState, nil -} - -func (t *InstanceContainersManager) GetState(ctx context.Context, id string, namespace string) (model.InstanceContainerState, error) { - ctx, span := observability.StartSpan("InstanceContainersManager", ctx, &map[string]string{ - "method": "GetSpec", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - getRequest := states.GetRequest{ - ID: id, - Metadata: map[string]interface{}{ - "version": "v1", - "group": model.SolutionGroup, - "resource": "instancecontainers", - "namespace": namespace, - "kind": "InstanceContainer", - }, - } - var instance states.StateEntry - instance, err = t.StateProvider.Get(ctx, getRequest) - if err != nil { - return model.InstanceContainerState{}, err - } - var ret model.InstanceContainerState - ret, err = getInstanceContainerState(instance.Body, instance.ETag) - if err != nil { - return model.InstanceContainerState{}, err - } - return ret, nil -} diff --git a/api/pkg/apis/v1alpha1/managers/instancecontainers/instance-container-manager_test.go b/api/pkg/apis/v1alpha1/managers/instancecontainers/instance-container-manager_test.go deleted file mode 100644 index 33ac74caa..000000000 --- a/api/pkg/apis/v1alpha1/managers/instancecontainers/instance-container-manager_test.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package instancecontainers - -import ( - "context" - "testing" - - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers/states/memorystate" - "github.com/stretchr/testify/assert" -) - -// write test case to create a InstanceContainerSpec using the manager -func TestCreateGetDeleteInstanceContainersState(t *testing.T) { - stateProvider := &memorystate.MemoryStateProvider{} - stateProvider.Init(memorystate.MemoryStateProviderConfig{}) - manager := InstanceContainersManager{ - StateProvider: stateProvider, - } - err := manager.UpsertState(context.Background(), "test", model.InstanceContainerState{}) - assert.Nil(t, err) - spec, err := manager.GetState(context.Background(), "test", "default") - assert.Nil(t, err) - assert.Equal(t, "test", spec.ObjectMeta.Name) - specLists, err := manager.ListState(context.Background(), "default") - assert.Nil(t, err) - assert.Equal(t, 1, len(specLists)) - assert.Equal(t, "test", specLists[0].ObjectMeta.Name) - err = manager.DeleteState(context.Background(), "test", "default") - assert.Nil(t, err) - spec, err = manager.GetState(context.Background(), "test", "default") - assert.NotNil(t, err) -} diff --git a/api/pkg/apis/v1alpha1/managers/managerfactory.go b/api/pkg/apis/v1alpha1/managers/managerfactory.go index 2485ad71e..63a9f26d3 100644 --- a/api/pkg/apis/v1alpha1/managers/managerfactory.go +++ b/api/pkg/apis/v1alpha1/managers/managerfactory.go @@ -14,7 +14,6 @@ import ( "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/catalogs" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/configs" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/devices" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/instancecontainers" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/instances" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/jobs" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/models" @@ -28,7 +27,6 @@ import ( "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/staging" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/sync" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/target" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/targetcontainers" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/targets" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/trails" "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/users" @@ -58,8 +56,6 @@ func (c *SymphonyManagerFactory) CreateManager(config cm.ManagerConfig) (cm.IMan manager = &target.TargetManager{} case "managers.symphony.targets": manager = &targets.TargetsManager{} - case "managers.symphony.targetcontainers": - manager = &targetcontainers.TargetContainersManager{} case "managers.symphony.devices": manager = &devices.DevicesManager{} case "managers.symphony.solutions": @@ -68,8 +64,6 @@ func (c *SymphonyManagerFactory) CreateManager(config cm.ManagerConfig) (cm.IMan manager = &solutioncontainers.SolutionContainersManager{} case "managers.symphony.instances": manager = &instances.InstancesManager{} - case "managers.symphony.instancecontainers": - manager = &instancecontainers.InstanceContainersManager{} case "managers.symphony.users": manager = &users.UsersManager{} case "managers.symphony.jobs": diff --git a/api/pkg/apis/v1alpha1/managers/targetcontainers/target-container-manager.go b/api/pkg/apis/v1alpha1/managers/targetcontainers/target-container-manager.go deleted file mode 100644 index f3bf914f4..000000000 --- a/api/pkg/apis/v1alpha1/managers/targetcontainers/target-container-manager.go +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package targetcontainers - -import ( - "context" - "encoding/json" - "fmt" - - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/contexts" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/managers" - "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" - - observability "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/observability" - observ_utils "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/observability/utils" -) - -var log = logger.NewLogger("coa.runtime") - -type TargetContainersManager struct { - managers.Manager - StateProvider states.IStateProvider -} - -func (s *TargetContainersManager) Init(context *contexts.VendorContext, config managers.ManagerConfig, providers map[string]providers.IProvider) error { - err := s.Manager.Init(context, config, providers) - if err != nil { - return err - } - stateprovider, err := managers.GetPersistentStateProvider(config, providers) - if err == nil { - s.StateProvider = stateprovider - } else { - return err - } - return nil -} - -func (t *TargetContainersManager) DeleteState(ctx context.Context, name string, namespace string) error { - ctx, span := observability.StartSpan("TargetContainersManager", ctx, &map[string]string{ - "method": "DeleteState", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - err = t.StateProvider.Delete(ctx, states.DeleteRequest{ - ID: name, - Metadata: map[string]interface{}{ - "namespace": namespace, - "group": model.FabricGroup, - "version": "v1", - "resource": "targetcontainers", - "kind": "TargetContainer", - }, - }) - return err -} - -func (t *TargetContainersManager) UpsertState(ctx context.Context, name string, state model.TargetContainerState) error { - ctx, span := observability.StartSpan("TargetContainersManager", ctx, &map[string]string{ - "method": "UpsertState", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - if state.ObjectMeta.Name != "" && state.ObjectMeta.Name != name { - return v1alpha2.NewCOAError(nil, fmt.Sprintf("Name in metadata (%s) does not match name in request (%s)", state.ObjectMeta.Name, name), v1alpha2.BadRequest) - } - state.ObjectMeta.FixNames(name) - - body := map[string]interface{}{ - "apiVersion": model.FabricGroup + "/v1", - "kind": "TargetContainer", - "metadata": state.ObjectMeta, - "spec": state.Spec, - } - - upsertRequest := states.UpsertRequest{ - Value: states.StateEntry{ - ID: name, - Body: body, - ETag: "", - }, - Metadata: map[string]interface{}{ - "namespace": state.ObjectMeta.Namespace, - "group": model.FabricGroup, - "version": "v1", - "resource": "targetcontainers", - "kind": "TargetContainer", - }, - } - _, err = t.StateProvider.Upsert(ctx, upsertRequest) - if err != nil { - return err - } - return nil -} - -func (t *TargetContainersManager) ListState(ctx context.Context, namespace string) ([]model.TargetContainerState, error) { - ctx, span := observability.StartSpan("TargetContainersManager", ctx, &map[string]string{ - "method": "ListState", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - listRequest := states.ListRequest{ - Metadata: map[string]interface{}{ - "version": "v1", - "group": model.FabricGroup, - "resource": "targetcontainers", - "namespace": namespace, - "kind": "TargetContainer", - }, - } - var targetcontainers []states.StateEntry - targetcontainers, _, err = t.StateProvider.List(ctx, listRequest) - if err != nil { - return nil, err - } - ret := make([]model.TargetContainerState, 0) - for _, t := range targetcontainers { - var rt model.TargetContainerState - rt, err = getTargetContainerState(t.Body, t.ETag) - if err != nil { - return nil, err - } - ret = append(ret, rt) - } - return ret, nil -} - -func getTargetContainerState(body interface{}, etag string) (model.TargetContainerState, error) { - var TargetContainerState model.TargetContainerState - bytes, _ := json.Marshal(body) - err := json.Unmarshal(bytes, &TargetContainerState) - if err != nil { - return model.TargetContainerState{}, err - } - if TargetContainerState.Spec == nil { - TargetContainerState.Spec = &model.TargetContainerSpec{} - } - return TargetContainerState, nil -} - -func (t *TargetContainersManager) GetState(ctx context.Context, id string, namespace string) (model.TargetContainerState, error) { - ctx, span := observability.StartSpan("TargetContainersManager", ctx, &map[string]string{ - "method": "GetSpec", - }) - var err error = nil - defer observ_utils.CloseSpanWithError(span, &err) - - getRequest := states.GetRequest{ - ID: id, - Metadata: map[string]interface{}{ - "version": "v1", - "group": model.FabricGroup, - "resource": "targetcontainers", - "namespace": namespace, - "kind": "TargetContainer", - }, - } - var Target states.StateEntry - Target, err = t.StateProvider.Get(ctx, getRequest) - if err != nil { - return model.TargetContainerState{}, err - } - var ret model.TargetContainerState - ret, err = getTargetContainerState(Target.Body, Target.ETag) - if err != nil { - return model.TargetContainerState{}, err - } - return ret, nil -} diff --git a/api/pkg/apis/v1alpha1/managers/targetcontainers/target-container-manager_test.go b/api/pkg/apis/v1alpha1/managers/targetcontainers/target-container-manager_test.go deleted file mode 100644 index 48feb46b4..000000000 --- a/api/pkg/apis/v1alpha1/managers/targetcontainers/target-container-manager_test.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package targetcontainers - -import ( - "context" - "testing" - - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers/states/memorystate" - "github.com/stretchr/testify/assert" -) - -// write test case to create a TargetContainerSpec using the manager -func TestCreateGetDeleteTargetContainerState(t *testing.T) { - stateProvider := &memorystate.MemoryStateProvider{} - stateProvider.Init(memorystate.MemoryStateProviderConfig{}) - manager := TargetContainersManager{ - StateProvider: stateProvider, - } - err := manager.UpsertState(context.Background(), "test", model.TargetContainerState{}) - assert.Nil(t, err) - spec, err := manager.GetState(context.Background(), "test", "default") - assert.Nil(t, err) - assert.Equal(t, "test", spec.ObjectMeta.Name) - specLists, err := manager.ListState(context.Background(), "default") - assert.Nil(t, err) - assert.Equal(t, 1, len(specLists)) - assert.Equal(t, "test", specLists[0].ObjectMeta.Name) - err = manager.DeleteState(context.Background(), "test", "default") - assert.Nil(t, err) - spec, err = manager.GetState(context.Background(), "test", "default") - assert.NotNil(t, err) -} diff --git a/api/pkg/apis/v1alpha1/model/instance.go b/api/pkg/apis/v1alpha1/model/instance.go index 1e862007e..1f854cb37 100644 --- a/api/pkg/apis/v1alpha1/model/instance.go +++ b/api/pkg/apis/v1alpha1/model/instance.go @@ -23,16 +23,14 @@ type ( // InstanceSpec defines the spec property of the InstanceState // +kubebuilder:object:generate=true InstanceSpec struct { - DisplayName string `json:"displayName,omitempty"` - Scope string `json:"scope,omitempty"` - Parameters map[string]string `json:"parameters,omitempty"` //TODO: Do we still need this? - Metadata map[string]string `json:"metadata,omitempty"` - Solution string `json:"solution"` - Target TargetSelector `json:"target,omitempty"` - Topologies []TopologySpec `json:"topologies,omitempty"` - Pipelines []PipelineSpec `json:"pipelines,omitempty"` - Version string `json:"version,omitempty"` - RootResource string `json:"rootResource,omitempty"` + DisplayName string `json:"displayName,omitempty"` + Scope string `json:"scope,omitempty"` + Parameters map[string]string `json:"parameters,omitempty"` //TODO: Do we still need this? + Metadata map[string]string `json:"metadata,omitempty"` + Solution string `json:"solution"` + Target TargetSelector `json:"target,omitempty"` + Topologies []TopologySpec `json:"topologies,omitempty"` + Pipelines []PipelineSpec `json:"pipelines,omitempty"` } // TargertRefSpec defines the target the instance will deploy to diff --git a/api/pkg/apis/v1alpha1/model/instancecontainer.go b/api/pkg/apis/v1alpha1/model/instancecontainer.go deleted file mode 100644 index fab36c5f0..000000000 --- a/api/pkg/apis/v1alpha1/model/instancecontainer.go +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package model - -import ( - "errors" -) - -type InstanceContainerState struct { - ObjectMeta ObjectMeta `json:"metadata,omitempty"` - Spec *InstanceContainerSpec `json:"spec,omitempty"` - Status *InstanceContainerStatus `json:"status,omitempty"` -} - -type InstanceContainerSpec struct { -} - -type InstanceContainerStatus struct { - Properties map[string]string `json:"properties"` -} - -func (c InstanceContainerSpec) DeepEquals(other IDeepEquals) (bool, error) { - return true, nil -} - -func (c InstanceContainerState) DeepEquals(other IDeepEquals) (bool, error) { - otherC, ok := other.(InstanceContainerState) - if !ok { - return false, errors.New("parameter is not a InstanceContainerState type") - } - - equal, err := c.ObjectMeta.DeepEquals(otherC.ObjectMeta) - if err != nil || !equal { - return equal, err - } - - equal, err = c.Spec.DeepEquals(*otherC.Spec) - if err != nil || !equal { - return equal, err - } - - return true, nil -} diff --git a/api/pkg/apis/v1alpha1/model/target.go b/api/pkg/apis/v1alpha1/model/target.go index 0105c8ef6..44a83496a 100644 --- a/api/pkg/apis/v1alpha1/model/target.go +++ b/api/pkg/apis/v1alpha1/model/target.go @@ -30,8 +30,6 @@ type ( Constraints string `json:"constraints,omitempty"` Topologies []TopologySpec `json:"topologies,omitempty"` ForceRedeploy bool `json:"forceRedeploy,omitempty"` - Version string `json:"version,omitempty"` - RootResource string `json:"rootResource,omitempty"` } ) diff --git a/api/pkg/apis/v1alpha1/model/targetcontainer.go b/api/pkg/apis/v1alpha1/model/targetcontainer.go deleted file mode 100644 index ecd25c7a3..000000000 --- a/api/pkg/apis/v1alpha1/model/targetcontainer.go +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package model - -import ( - "errors" -) - -type TargetContainerState struct { - ObjectMeta ObjectMeta `json:"metadata,omitempty"` - Spec *TargetContainerSpec `json:"spec,omitempty"` - Status *TargetContainerStatus `json:"status,omitempty"` -} - -type TargetContainerSpec struct { -} - -type TargetContainerStatus struct { - Properties map[string]string `json:"properties"` -} - -func (c TargetContainerSpec) DeepEquals(other IDeepEquals) (bool, error) { - return true, nil -} - -func (c TargetContainerState) DeepEquals(other IDeepEquals) (bool, error) { - otherC, ok := other.(TargetContainerState) - if !ok { - return false, errors.New("parameter is not a TargetContainerState type") - } - - equal, err := c.ObjectMeta.DeepEquals(otherC.ObjectMeta) - if err != nil || !equal { - return equal, err - } - - equal, err = c.Spec.DeepEquals(*otherC.Spec) - if err != nil || !equal { - return equal, err - } - - return true, nil -} diff --git a/api/pkg/apis/v1alpha1/providers/stage/materialize/materialize.go b/api/pkg/apis/v1alpha1/providers/stage/materialize/materialize.go index 8a985c93d..9f7dfffff 100644 --- a/api/pkg/apis/v1alpha1/providers/stage/materialize/materialize.go +++ b/api/pkg/apis/v1alpha1/providers/stage/materialize/materialize.go @@ -187,32 +187,6 @@ func (i *MaterializeStageProvider) Process(ctx context.Context, mgrContext conte return outputs, false, v1alpha2.NewCOAError(nil, fmt.Sprintf("Empty instance name: catalog - %s", name), v1alpha2.BadRequest) } - instanceName := instanceState.ObjectMeta.Name - parts := strings.Split(instanceName, ":") - if len(parts) == 2 { - instanceState.Spec.RootResource = parts[0] - instanceState.Spec.Version = parts[1] - } else { - mLog.Errorf("Instance name is invalid: instance - %s, catalog - %s", instanceName, name) - return outputs, false, v1alpha2.NewCOAError(nil, fmt.Sprintf("Instance name is invalid: catalog - %s", name), v1alpha2.BadRequest) - } - - mLog.Debugf(" P (Materialize Processor): check instance contains %v, namespace %s", instanceState.ObjectMeta.Name, namespace) - _, err := i.ApiClient.GetInstanceContainer(ctx, instanceState.Spec.RootResource, namespace, i.Config.User, i.Config.Password) - if err != nil && strings.Contains(err.Error(), constants.NotFound) { - mLog.Debugf("Instance container %s doesn't exist: %s", instanceState.Spec.RootResource, err.Error()) - instanceContainerState := model.InstanceContainerState{ObjectMeta: model.ObjectMeta{Name: instanceState.Spec.RootResource, Namespace: namespace, Labels: instanceState.ObjectMeta.Labels}} - containerObjectData, _ := json.Marshal(instanceContainerState) - err = i.ApiClient.CreateInstanceContainer(ctx, instanceState.Spec.RootResource, containerObjectData, namespace, i.Config.User, i.Config.Password) - if err != nil { - mLog.Errorf("Failed to create instance container %s: %s", instanceState.Spec.RootResource, err.Error()) - return outputs, false, err - } - } else if err != nil { - mLog.Errorf("Failed to get instance container %s: %s", instanceState.Spec.RootResource, err.Error()) - return outputs, false, err - } - instanceState.ObjectMeta = updateObjectMeta(instanceState.ObjectMeta, inputs) objectData, _ := json.Marshal(instanceState) mLog.Debugf(" P (Materialize Processor): materialize instance %v to namespace %s", instanceState.ObjectMeta.Name, instanceState.ObjectMeta.Namespace) @@ -283,32 +257,6 @@ func (i *MaterializeStageProvider) Process(ctx context.Context, mgrContext conte return outputs, false, v1alpha2.NewCOAError(nil, fmt.Sprintf("Empty target name: catalog - %s", name), v1alpha2.BadRequest) } - targetName := targetState.ObjectMeta.Name - parts := strings.Split(targetName, ":") - if len(parts) == 2 { - targetState.Spec.RootResource = parts[0] - targetState.Spec.Version = parts[1] - } else { - mLog.Errorf("Target name is invalid: target - %s, catalog - %s", targetName, name) - return outputs, false, v1alpha2.NewCOAError(nil, fmt.Sprintf("Invalid target name: %s", name), v1alpha2.BadRequest) - } - - mLog.Debugf(" P (Materialize Processor): check target contains %v, namespace %s", targetState.Spec.RootResource, namespace) - _, err := i.ApiClient.GetTargetContainer(ctx, targetState.Spec.RootResource, namespace, i.Config.User, i.Config.Password) - if err != nil && strings.Contains(err.Error(), constants.NotFound) { - mLog.Debugf("Target container %s doesn't exist: %s", targetState.Spec.RootResource, err.Error()) - targetContainerState := model.TargetContainerState{ObjectMeta: model.ObjectMeta{Name: targetState.Spec.RootResource, Namespace: namespace, Labels: targetState.ObjectMeta.Labels}} - containerObjectData, _ := json.Marshal(targetContainerState) - err = i.ApiClient.CreateTargetContainer(ctx, targetState.Spec.RootResource, containerObjectData, namespace, i.Config.User, i.Config.Password) - if err != nil { - mLog.Errorf("Failed to create target container %s: %s", targetState.Spec.RootResource, err.Error()) - return outputs, false, err - } - } else if err != nil { - mLog.Errorf("Failed to get target container %s: %s", targetState.Spec.RootResource, err.Error()) - return outputs, false, err - } - targetState.ObjectMeta = updateObjectMeta(targetState.ObjectMeta, inputs) objectData, _ := json.Marshal(targetState) mLog.Debugf(" P (Materialize Processor): materialize target %v to namespace %s", targetState.ObjectMeta.Name, targetState.ObjectMeta.Namespace) diff --git a/api/pkg/apis/v1alpha1/utils/apiclient.go b/api/pkg/apis/v1alpha1/utils/apiclient.go index b42bf6636..5c371af79 100644 --- a/api/pkg/apis/v1alpha1/utils/apiclient.go +++ b/api/pkg/apis/v1alpha1/utils/apiclient.go @@ -82,15 +82,9 @@ type ( SyncActivationStatus(ctx context.Context, status model.ActivationStatus, user string, password string) error SendVisualizationPacket(ctx context.Context, payload []byte, user string, password string) error ReportCatalogs(ctx context.Context, instance string, components []model.ComponentSpec, user string, password string) error - CreateInstanceContainer(ctx context.Context, instanceContainer string, payload []byte, namespace string, user string, password string) error - DeleteInstanceContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) error - GetInstanceContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) (model.InstanceContainerState, error) CreateSolutionContainer(ctx context.Context, instanceContainer string, payload []byte, namespace string, user string, password string) error DeleteSolutionContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) error GetSolutionContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) (model.SolutionContainerState, error) - CreateTargetContainer(ctx context.Context, instanceContainer string, payload []byte, namespace string, user string, password string) error - DeleteTargetContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) error - GetTargetContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) (model.TargetContainerState, error) CreateCatalogContainer(ctx context.Context, instanceContainer string, payload []byte, namespace string, user string, password string) error DeleteCatalogContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) error GetCatalogContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) (model.CatalogContainerState, error) @@ -800,55 +794,6 @@ func (a *apiClient) callRestAPI(ctx context.Context, route string, method string return bodyBytes, nil } -func (a *apiClient) CreateInstanceContainer(ctx context.Context, instanceContainer string, payload []byte, namespace string, user string, password string) error { - token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) - if err != nil { - return err - } - //use proper url encoding in the following statement - _, err = a.callRestAPI(ctx, "instancecontainers/"+url.QueryEscape(instanceContainer)+"?namespace="+url.QueryEscape(namespace), "POST", payload, token) - if err != nil { - return err - } - - return nil -} - -func (a *apiClient) DeleteInstanceContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) error { - token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) - if err != nil { - return err - } - - _, err = a.callRestAPI(ctx, "instancecontainers/"+url.QueryEscape(instanceContainer)+"?direct=true&namespace="+url.QueryEscape(namespace), "DELETE", nil, token) - if err != nil { - return err - } - - return nil -} - -func (a *apiClient) GetInstanceContainer(ctx context.Context, instanceContainer string, namespace string, user string, password string) (model.InstanceContainerState, error) { - ret := model.InstanceContainerState{} - token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) - - if err != nil { - return ret, err - } - - response, err := a.callRestAPI(ctx, "instancecontainers/"+url.QueryEscape(instanceContainer)+"?namespace="+url.QueryEscape(namespace), "GET", nil, token) - if err != nil { - return ret, err - } - - err = json.Unmarshal(response, &ret) - if err != nil { - return ret, err - } - - return ret, nil -} - func (a *apiClient) CreateSolutionContainer(ctx context.Context, solutionContainer string, payload []byte, namespace string, user string, password string) error { token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) if err != nil { @@ -898,55 +843,6 @@ func (a *apiClient) GetSolutionContainer(ctx context.Context, solutionContainer return ret, nil } -func (a *apiClient) CreateTargetContainer(ctx context.Context, targetContainer string, payload []byte, namespace string, user string, password string) error { - token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) - if err != nil { - return err - } - - _, err = a.callRestAPI(ctx, "targetcontainers/"+url.QueryEscape(targetContainer)+"?namespace="+url.QueryEscape(namespace), "POST", payload, token) - if err != nil { - return err - } - - return nil -} - -func (a *apiClient) DeleteTargetContainer(ctx context.Context, targetContainer string, namespace string, user string, password string) error { - token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) - if err != nil { - return err - } - - _, err = a.callRestAPI(ctx, "targetcontainers/"+url.QueryEscape(targetContainer)+"?direct=true&namespace="+url.QueryEscape(namespace), "DELETE", nil, token) - if err != nil { - return err - } - - return nil -} - -func (a *apiClient) GetTargetContainer(ctx context.Context, targetContainer string, namespace string, user string, password string) (model.TargetContainerState, error) { - ret := model.TargetContainerState{} - token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) - - if err != nil { - return ret, err - } - - response, err := a.callRestAPI(ctx, "targetcontainers/"+url.QueryEscape(targetContainer)+"?namespace="+url.QueryEscape(namespace), "GET", nil, token) - if err != nil { - return ret, err - } - - err = json.Unmarshal(response, &ret) - if err != nil { - return ret, err - } - - return ret, nil -} - func (a *apiClient) CreateCatalogContainer(ctx context.Context, catalogContainer string, payload []byte, namespace string, user string, password string) error { token, err := a.tokenProvider(ctx, a.baseUrl, a.client, user, password) if err != nil { diff --git a/api/pkg/apis/v1alpha1/vendors/instances-container-vendor.go b/api/pkg/apis/v1alpha1/vendors/instances-container-vendor.go deleted file mode 100644 index a50b49421..000000000 --- a/api/pkg/apis/v1alpha1/vendors/instances-container-vendor.go +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package vendors - -import ( - "encoding/json" - - "github.com/eclipse-symphony/symphony/api/constants" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/instancecontainers" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/utils" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/managers" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/observability" - 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/pubsub" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/vendors" - "github.com/eclipse-symphony/symphony/coa/pkg/logger" - "github.com/valyala/fasthttp" -) - -var icLog = logger.NewLogger("coa.runtime") - -type InstanceContainersVendor struct { - vendors.Vendor - InstanceContainersManager *instancecontainers.InstanceContainersManager -} - -func (o *InstanceContainersVendor) GetInfo() vendors.VendorInfo { - return vendors.VendorInfo{ - Version: o.Vendor.Version, - Name: "InstanceContainers", - Producer: "Microsoft", - } -} - -func (e *InstanceContainersVendor) Init(config vendors.VendorConfig, factories []managers.IManagerFactroy, providers map[string]map[string]providers.IProvider, pubsubProvider pubsub.IPubSubProvider) error { - err := e.Vendor.Init(config, factories, providers, pubsubProvider) - if err != nil { - return err - } - for _, m := range e.Managers { - if c, ok := m.(*instancecontainers.InstanceContainersManager); ok { - e.InstanceContainersManager = c - } - } - if e.InstanceContainersManager == nil { - return v1alpha2.NewCOAError(nil, "instance container manager is not supplied", v1alpha2.MissingConfig) - } - return nil -} - -func (o *InstanceContainersVendor) GetEndpoints() []v1alpha2.Endpoint { - route := "instancecontainers" - if o.Route != "" { - route = o.Route - } - return []v1alpha2.Endpoint{ - { - Methods: []string{fasthttp.MethodGet, fasthttp.MethodPost, fasthttp.MethodDelete}, - Route: route, - Version: o.Version, - Handler: o.onInstanceContainers, - Parameters: []string{"name?"}, - }, - } -} - -func (c *InstanceContainersVendor) onInstanceContainers(request v1alpha2.COARequest) v1alpha2.COAResponse { - pCtx, span := observability.StartSpan("onInstanceContainers", request.Context, &map[string]string{ - "method": "onInstanceContainers", - }) - defer span.End() - icLog.Infof("V (InstanceContainers): onInstanceContainers, method: %s, traceId: %s", request.Method, span.SpanContext().TraceID().String()) - - id := request.Parameters["__name"] - namespace, exist := request.Parameters["namespace"] - if !exist { - namespace = constants.DefaultScope - } - - icLog.Infof("V (InstanceContainers): onInstanceContainers, method: %s, traceId: %s", string(request.Method), span.SpanContext().TraceID().String()) - switch request.Method { - case fasthttp.MethodGet: - ctx, span := observability.StartSpan("onInstanceContainers-GET", pCtx, nil) - var err error - var state interface{} - isArray := false - if id == "" { - // Change partition back to empty to indicate ListSpec need to query all namespaces - if !exist { - namespace = "" - } - state, err = c.InstanceContainersManager.ListState(ctx, namespace) - isArray = true - } else { - state, err = c.InstanceContainersManager.GetState(ctx, id, namespace) - } - if err != nil { - icLog.Errorf("V (InstanceContainers): onInstanceContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - jData, _ := utils.FormatObject(state, isArray, request.Parameters["path"], request.Parameters["doc-type"]) - resp := observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.OK, - Body: jData, - ContentType: "application/json", - }) - if request.Parameters["doc-type"] == "yaml" { - resp.ContentType = "application/text" - } - return resp - case fasthttp.MethodPost: - ctx, span := observability.StartSpan("onInstanceContainers-POST", pCtx, nil) - var instanceContainer model.InstanceContainerState - err := json.Unmarshal(request.Body, &instanceContainer) - if err != nil { - iLog.Errorf("V (Instances): onInstanceContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - instanceContainer.ObjectMeta.Name = id - instanceContainer.ObjectMeta.Namespace = namespace - instanceContainer.Spec = &model.InstanceContainerSpec{} - - err = c.InstanceContainersManager.UpsertState(ctx, id, instanceContainer) - if err != nil { - icLog.Errorf("V (InstanceContainers): onInstanceContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.OK, - }) - case fasthttp.MethodDelete: - ctx, span := observability.StartSpan("onInstanceContainers-DELETE", pCtx, nil) - err := c.InstanceContainersManager.DeleteState(ctx, id, namespace) - if err != nil { - icLog.Errorf("V (InstanceContainers): onInstanceContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.OK, - }) - } - icLog.Infof("V (InstanceContainers): onInstanceContainers failed - 405 method not allowed, traceId: %s", span.SpanContext().TraceID().String()) - resp := v1alpha2.COAResponse{ - State: v1alpha2.MethodNotAllowed, - Body: []byte("{\"result\":\"405 - method not allowed\"}"), - ContentType: "application/json", - } - observ_utils.UpdateSpanStatusFromCOAResponse(span, resp) - return resp -} diff --git a/api/pkg/apis/v1alpha1/vendors/instances-container-vendor_test.go b/api/pkg/apis/v1alpha1/vendors/instances-container-vendor_test.go deleted file mode 100644 index fd0b92ce7..000000000 --- a/api/pkg/apis/v1alpha1/vendors/instances-container-vendor_test.go +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package vendors - -import ( - "context" - "encoding/json" - "testing" - - sym_mgr "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/contexts" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/managers" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers/pubsub/memory" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers/states/memorystate" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/vendors" - "github.com/stretchr/testify/assert" - "github.com/valyala/fasthttp" -) - -func TestInstanceContainersEndpoints(t *testing.T) { - vendor := createInstanceContainersVendor() - vendor.Route = "instancecontainers" - endpoints := vendor.GetEndpoints() - assert.Equal(t, 1, len(endpoints)) -} - -func TestInstanceContainersInfo(t *testing.T) { - vendor := createInstanceContainersVendor() - vendor.Version = "1.0" - info := vendor.GetInfo() - assert.NotNil(t, info) - assert.Equal(t, "1.0", info.Version) -} - -func createInstanceContainersVendor() InstanceContainersVendor { - stateProvider := memorystate.MemoryStateProvider{} - stateProvider.Init(memorystate.MemoryStateProviderConfig{}) - vendor := InstanceContainersVendor{} - vendor.Init(vendors.VendorConfig{ - Properties: map[string]string{ - "test": "true", - }, - Managers: []managers.ManagerConfig{ - { - Name: "instance-container-manager", - Type: "managers.symphony.instancecontainers", - Properties: map[string]string{ - "providers.persistentstate": "mem-state", - }, - Providers: map[string]managers.ProviderConfig{ - "mem-state": { - Type: "providers.state.memory", - Config: memorystate.MemoryStateProviderConfig{}, - }, - }, - }, - }, - }, []managers.IManagerFactroy{ - &sym_mgr.SymphonyManagerFactory{}, - }, map[string]map[string]providers.IProvider{ - "instance-container-manager": { - "mem-state": &stateProvider, - }, - }, nil) - return vendor -} - -func TestOnInstanceContainers(t *testing.T) { - vendor := createInstanceContainersVendor() - vendor.Context = &contexts.VendorContext{} - vendor.Context.SiteInfo = v1alpha2.SiteInfo{ - SiteId: "fake", - } - pubSubProvider := memory.InMemoryPubSubProvider{} - pubSubProvider.Init(memory.InMemoryPubSubConfig{Name: "test"}) - vendor.Context.Init(&pubSubProvider) - instance := model.InstanceContainerState{ - Spec: &model.InstanceContainerSpec{}, - ObjectMeta: model.ObjectMeta{ - Name: "instance1", - Namespace: "scope1", - }, - } - data, _ := json.Marshal(instance) - resp := vendor.onInstanceContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodPost, - Body: data, - Parameters: map[string]string{ - "__name": "instance1", - "namespace": "scope1", - }, - Context: context.Background(), - }) - assert.Equal(t, v1alpha2.OK, resp.State) - - resp = vendor.onInstanceContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodGet, - Parameters: map[string]string{ - "__name": "instance1", - "namespace": "scope1", - }, - Context: context.Background(), - }) - var instances model.InstanceContainerState - assert.Equal(t, v1alpha2.OK, resp.State) - err := json.Unmarshal(resp.Body, &instances) - assert.Nil(t, err) - assert.Equal(t, "instance1", instances.ObjectMeta.Name) - assert.Equal(t, "scope1", instances.ObjectMeta.Namespace) - - resp = vendor.onInstanceContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodGet, - Parameters: map[string]string{ - "namespace": "scope1", - }, - Context: context.Background(), - }) - assert.Equal(t, v1alpha2.OK, resp.State) - var instancesList []model.InstanceContainerState - err = json.Unmarshal(resp.Body, &instancesList) - assert.Nil(t, err) - assert.Equal(t, 1, len(instancesList)) - assert.Equal(t, "instance1", instancesList[0].ObjectMeta.Name) - assert.Equal(t, "scope1", instancesList[0].ObjectMeta.Namespace) - - resp = vendor.onInstanceContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodDelete, - Parameters: map[string]string{ - "__name": "instance1", - "namespace": "scope1", - }, - Context: context.Background(), - }) - assert.Equal(t, v1alpha2.OK, resp.State) -} diff --git a/api/pkg/apis/v1alpha1/vendors/targets-container-vendor.go b/api/pkg/apis/v1alpha1/vendors/targets-container-vendor.go deleted file mode 100644 index a1b77d62e..000000000 --- a/api/pkg/apis/v1alpha1/vendors/targets-container-vendor.go +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package vendors - -import ( - "encoding/json" - - "github.com/eclipse-symphony/symphony/api/constants" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers/targetcontainers" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/utils" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/managers" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/observability" - 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/pubsub" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/vendors" - "github.com/eclipse-symphony/symphony/coa/pkg/logger" - "github.com/valyala/fasthttp" -) - -var tcLog = logger.NewLogger("coa.runtime") - -type TargetContainersVendor struct { - vendors.Vendor - TargetContainersManager *targetcontainers.TargetContainersManager -} - -func (o *TargetContainersVendor) GetInfo() vendors.VendorInfo { - return vendors.VendorInfo{ - Version: o.Vendor.Version, - Name: "TargetContainers", - Producer: "Microsoft", - } -} - -func (e *TargetContainersVendor) Init(config vendors.VendorConfig, factories []managers.IManagerFactroy, providers map[string]map[string]providers.IProvider, pubsubProvider pubsub.IPubSubProvider) error { - err := e.Vendor.Init(config, factories, providers, pubsubProvider) - if err != nil { - return err - } - for _, m := range e.Managers { - if c, ok := m.(*targetcontainers.TargetContainersManager); ok { - e.TargetContainersManager = c - } - } - if e.TargetContainersManager == nil { - return v1alpha2.NewCOAError(nil, "target container manager is not supplied", v1alpha2.MissingConfig) - } - return nil -} - -func (o *TargetContainersVendor) GetEndpoints() []v1alpha2.Endpoint { - route := "targetcontainers" - if o.Route != "" { - route = o.Route - } - return []v1alpha2.Endpoint{ - { - Methods: []string{fasthttp.MethodGet, fasthttp.MethodPost, fasthttp.MethodDelete}, - Route: route, - Version: o.Version, - Handler: o.onTargetContainers, - Parameters: []string{"name?"}, - }, - } -} - -func (c *TargetContainersVendor) onTargetContainers(request v1alpha2.COARequest) v1alpha2.COAResponse { - pCtx, span := observability.StartSpan("onTargetContainers", request.Context, &map[string]string{ - "method": "onTargetContainers", - }) - defer span.End() - tcLog.Infof("V (TargetContainers): onTargetContainers, method: %s, traceId: %s", request.Method, span.SpanContext().TraceID().String()) - - id := request.Parameters["__name"] - namespace, exist := request.Parameters["namespace"] - if !exist { - namespace = constants.DefaultScope - } - - tcLog.Infof("V (TargetContainers): onTargetContainers, method: %s, traceId: %s", string(request.Method), span.SpanContext().TraceID().String()) - switch request.Method { - case fasthttp.MethodGet: - ctx, span := observability.StartSpan("onTargetContainers-GET", pCtx, nil) - var err error - var state interface{} - isArray := false - if id == "" { - // Change partition back to empty to indicate ListSpec need to query all namespaces - if !exist { - namespace = "" - } - state, err = c.TargetContainersManager.ListState(ctx, namespace) - isArray = true - } else { - state, err = c.TargetContainersManager.GetState(ctx, id, namespace) - } - if err != nil { - tcLog.Errorf("V (TargetContainers): onTargetContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - jData, _ := utils.FormatObject(state, isArray, request.Parameters["path"], request.Parameters["doc-type"]) - resp := observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.OK, - Body: jData, - ContentType: "application/json", - }) - if request.Parameters["doc-type"] == "yaml" { - resp.ContentType = "application/text" - } - return resp - case fasthttp.MethodPost: - ctx, span := observability.StartSpan("onTargetContainers-POST", pCtx, nil) - var targetContainer model.TargetContainerState - err := json.Unmarshal(request.Body, &targetContainer) - if err != nil { - iLog.Errorf("V (Instances): onTargetContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - targetContainer.ObjectMeta.Name = id - targetContainer.ObjectMeta.Namespace = namespace - targetContainer.Spec = &model.TargetContainerSpec{} - - err = c.TargetContainersManager.UpsertState(ctx, id, targetContainer) - if err != nil { - tcLog.Errorf("V (TargetContainers): onTargetContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.OK, - }) - case fasthttp.MethodDelete: - ctx, span := observability.StartSpan("onTargetContainers-DELETE", pCtx, nil) - err := c.TargetContainersManager.DeleteState(ctx, id, namespace) - if err != nil { - tcLog.Errorf("V (TargetContainers): onTargetContainers failed - %s, traceId: %s", err.Error(), span.SpanContext().TraceID().String()) - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.InternalError, - Body: []byte(err.Error()), - }) - } - return observ_utils.CloseSpanWithCOAResponse(span, v1alpha2.COAResponse{ - State: v1alpha2.OK, - }) - } - tcLog.Infof("V (TargetContainers): onTargetContainers failed - 405 method not allowed, traceId: %s", span.SpanContext().TraceID().String()) - resp := v1alpha2.COAResponse{ - State: v1alpha2.MethodNotAllowed, - Body: []byte("{\"result\":\"405 - method not allowed\"}"), - ContentType: "application/json", - } - observ_utils.UpdateSpanStatusFromCOAResponse(span, resp) - return resp -} diff --git a/api/pkg/apis/v1alpha1/vendors/targets-container-vendor_test.go b/api/pkg/apis/v1alpha1/vendors/targets-container-vendor_test.go deleted file mode 100644 index 00f8d7abd..000000000 --- a/api/pkg/apis/v1alpha1/vendors/targets-container-vendor_test.go +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package vendors - -import ( - "context" - "encoding/json" - "testing" - - sym_mgr "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/managers" - "github.com/eclipse-symphony/symphony/api/pkg/apis/v1alpha1/model" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/contexts" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/managers" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers/pubsub/memory" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/providers/states/memorystate" - "github.com/eclipse-symphony/symphony/coa/pkg/apis/v1alpha2/vendors" - "github.com/stretchr/testify/assert" - "github.com/valyala/fasthttp" -) - -func TestTargetContainersEndpoints(t *testing.T) { - vendor := createTargetContainersVendor() - vendor.Route = "targetcontainers" - endpoints := vendor.GetEndpoints() - assert.Equal(t, 1, len(endpoints)) -} - -func TestTargetContainersInfo(t *testing.T) { - vendor := createTargetContainersVendor() - vendor.Version = "1.0" - info := vendor.GetInfo() - assert.NotNil(t, info) - assert.Equal(t, "1.0", info.Version) -} - -func createTargetContainersVendor() TargetContainersVendor { - stateProvider := memorystate.MemoryStateProvider{} - stateProvider.Init(memorystate.MemoryStateProviderConfig{}) - vendor := TargetContainersVendor{} - vendor.Init(vendors.VendorConfig{ - Properties: map[string]string{ - "test": "true", - }, - Managers: []managers.ManagerConfig{ - { - Name: "target-container-manager", - Type: "managers.symphony.targetcontainers", - Properties: map[string]string{ - "providers.persistentstate": "mem-state", - }, - Providers: map[string]managers.ProviderConfig{ - "mem-state": { - Type: "providers.state.memory", - Config: memorystate.MemoryStateProviderConfig{}, - }, - }, - }, - }, - }, []managers.IManagerFactroy{ - &sym_mgr.SymphonyManagerFactory{}, - }, map[string]map[string]providers.IProvider{ - "target-container-manager": { - "mem-state": &stateProvider, - }, - }, nil) - return vendor -} - -func TestOnTargetContainers(t *testing.T) { - vendor := createTargetContainersVendor() - vendor.Context = &contexts.VendorContext{} - vendor.Context.SiteInfo = v1alpha2.SiteInfo{ - SiteId: "fake", - } - pubSubProvider := memory.InMemoryPubSubProvider{} - pubSubProvider.Init(memory.InMemoryPubSubConfig{Name: "test"}) - vendor.Context.Init(&pubSubProvider) - target := model.TargetContainerState{ - Spec: &model.TargetContainerSpec{}, - ObjectMeta: model.ObjectMeta{ - Name: "target1", - Namespace: "scope1", - }, - } - data, _ := json.Marshal(target) - resp := vendor.onTargetContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodPost, - Body: data, - Parameters: map[string]string{ - "__name": "target1", - "namespace": "scope1", - }, - Context: context.Background(), - }) - assert.Equal(t, v1alpha2.OK, resp.State) - - resp = vendor.onTargetContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodGet, - Parameters: map[string]string{ - "__name": "target1", - "namespace": "scope1", - }, - Context: context.Background(), - }) - var targets model.TargetContainerState - assert.Equal(t, v1alpha2.OK, resp.State) - err := json.Unmarshal(resp.Body, &targets) - assert.Nil(t, err) - assert.Equal(t, "target1", targets.ObjectMeta.Name) - assert.Equal(t, "scope1", targets.ObjectMeta.Namespace) - - resp = vendor.onTargetContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodGet, - Parameters: map[string]string{ - "namespace": "scope1", - }, - Context: context.Background(), - }) - assert.Equal(t, v1alpha2.OK, resp.State) - var targetsList []model.TargetContainerState - err = json.Unmarshal(resp.Body, &targetsList) - assert.Nil(t, err) - assert.Equal(t, 1, len(targetsList)) - assert.Equal(t, "target1", targetsList[0].ObjectMeta.Name) - assert.Equal(t, "scope1", targetsList[0].ObjectMeta.Namespace) - - resp = vendor.onTargetContainers(v1alpha2.COARequest{ - Method: fasthttp.MethodDelete, - Parameters: map[string]string{ - "__name": "target1", - "namespace": "scope1", - }, - Context: context.Background(), - }) - assert.Equal(t, v1alpha2.OK, resp.State) -} diff --git a/api/pkg/apis/v1alpha1/vendors/vendorfactory.go b/api/pkg/apis/v1alpha1/vendors/vendorfactory.go index dc1c40358..e8e975762 100644 --- a/api/pkg/apis/v1alpha1/vendors/vendorfactory.go +++ b/api/pkg/apis/v1alpha1/vendors/vendorfactory.go @@ -23,12 +23,8 @@ func (c SymphonyVendorFactory) CreateVendor(config vendors.VendorConfig) (vendor return &AgentVendor{}, nil case "vendors.targets": return &TargetsVendor{}, nil - case "vendors.targetcontainers": - return &TargetContainersVendor{}, nil case "vendors.instances": return &InstancesVendor{}, nil - case "vendors.instancecontainers": - return &InstanceContainersVendor{}, nil case "vendors.devices": return &DevicesVendor{}, nil case "vendors.solutions": diff --git a/api/symphony-api-dev-console-trace.json b/api/symphony-api-dev-console-trace.json index d21928b3c..5d1548a98 100644 --- a/api/symphony-api-dev-console-trace.json +++ b/api/symphony-api-dev-console-trace.json @@ -80,28 +80,6 @@ } } ] - }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": false, - "configType": "path" - } - } - } - } - ] }, { "type": "vendors.solutioncontainers", @@ -124,28 +102,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": false, - "configType": "path" - } - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api-dev-zipkin-trace.json b/api/symphony-api-dev-zipkin-trace.json index 6bf90469a..962bcb1e2 100644 --- a/api/symphony-api-dev-zipkin-trace.json +++ b/api/symphony-api-dev-zipkin-trace.json @@ -79,28 +79,6 @@ } } ] - }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": false, - "configType": "path" - } - } - } - } - ] }, { "type": "vendors.solutioncontainers", @@ -123,28 +101,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": false, - "configType": "path" - } - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api-dev.json b/api/symphony-api-dev.json index 7afc53365..39377bd06 100644 --- a/api/symphony-api-dev.json +++ b/api/symphony-api-dev.json @@ -79,28 +79,6 @@ } } ] - }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": false, - "configType": "path" - } - } - } - } - ] }, { "type": "vendors.solutioncontainers", @@ -123,28 +101,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": false, - "configType": "path" - } - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api-no-k8s-munchen.json b/api/symphony-api-no-k8s-munchen.json index 081319af2..e5482fc8f 100644 --- a/api/symphony-api-no-k8s-munchen.json +++ b/api/symphony-api-no-k8s-munchen.json @@ -267,25 +267,6 @@ "properties": { "useJobManager": "true" } - }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] }, { "type": "vendors.solutioncontainers", @@ -305,25 +286,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api-no-k8s-new-york.json b/api/symphony-api-no-k8s-new-york.json index 8981913f6..0a280ab17 100644 --- a/api/symphony-api-no-k8s-new-york.json +++ b/api/symphony-api-no-k8s-new-york.json @@ -266,26 +266,7 @@ "useJobManager": "true" } }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] - }, - { + { "type": "vendors.solutioncontainers", "route": "solutioncontainers", "managers": [ @@ -303,25 +284,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api-no-k8s-tokyo.json b/api/symphony-api-no-k8s-tokyo.json index 9775d8c3c..ef3672258 100644 --- a/api/symphony-api-no-k8s-tokyo.json +++ b/api/symphony-api-no-k8s-tokyo.json @@ -266,26 +266,7 @@ "useJobManager": "true" } }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] - }, - { + { "type": "vendors.solutioncontainers", "route": "solutioncontainers", "managers": [ @@ -303,25 +284,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api-no-k8s.json b/api/symphony-api-no-k8s.json index 92eb8f154..3199d4496 100644 --- a/api/symphony-api-no-k8s.json +++ b/api/symphony-api-no-k8s.json @@ -278,25 +278,6 @@ "properties": { "useJobManager": "true" } - }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] }, { "type": "vendors.solutioncontainers", @@ -316,25 +297,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.memory", - "config": {} - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api-production.json b/api/symphony-api-production.json index 7a1fba39c..904bf9d6a 100644 --- a/api/symphony-api-production.json +++ b/api/symphony-api-production.json @@ -295,27 +295,6 @@ } } ] - }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": true - } - } - } - } - ] }, { "type": "vendors.solutioncontainers", @@ -337,27 +316,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": true - } - } - } - } - ] }, { "type": "vendors.devices", diff --git a/api/symphony-api.json b/api/symphony-api.json index 6ede7dd2e..7cfebe159 100644 --- a/api/symphony-api.json +++ b/api/symphony-api.json @@ -280,27 +280,6 @@ } } ] - }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": true - } - } - } - } - ] }, { "type": "vendors.solutioncontainers", @@ -322,27 +301,6 @@ } } ] - }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": true - } - } - } - } - ] }, { "type": "vendors.devices", diff --git a/k8s/PROJECT b/k8s/PROJECT index 2270c0fb1..6d256a3fe 100644 --- a/k8s/PROJECT +++ b/k8s/PROJECT @@ -152,15 +152,6 @@ resources: defaulting: true validation: true webhookVersion: v1 -- api: - crdVersion: v1 - namespaced: true - controller: true - domain: symphony - group: solution - kind: InstanceContainer - path: gopls-workspace/apis/solution/v1 - version: v1 - api: crdVersion: v1 namespaced: true @@ -170,15 +161,6 @@ resources: kind: SolutionContainer path: gopls-workspace/apis/solution/v1 version: v1 -- api: - crdVersion: v1 - namespaced: true - controller: true - domain: symphony - group: fabric - kind: TargetContainer - path: gopls-workspace/apis/fabric/v1 - version: v1 - api: crdVersion: v1 namespaced: true diff --git a/k8s/apis/fabric/v1/target_webhook.go b/k8s/apis/fabric/v1/target_webhook.go index 65ca3a09a..9f03d5206 100644 --- a/k8s/apis/fabric/v1/target_webhook.go +++ b/k8s/apis/fabric/v1/target_webhook.go @@ -17,7 +17,6 @@ import ( configutils "gopls-workspace/configutils" apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" @@ -41,10 +40,6 @@ func (r *Target) SetupWebhookWithManager(mgr ctrl.Manager) error { target := rawObj.(*Target) return []string{target.Spec.DisplayName} }) - mgr.GetFieldIndexer().IndexField(context.Background(), &Target{}, ".spec.rootResource", func(rawObj client.Object) []string { - target := rawObj.(*Target) - return []string{target.Spec.RootResource} - }) dict, _ := configutils.GetValidationPoilicies() if v, ok := dict["target"]; ok { @@ -86,25 +81,6 @@ func (r *Target) Default() { if r.Spec.ReconciliationPolicy != nil && r.Spec.ReconciliationPolicy.State == "" { r.Spec.ReconciliationPolicy.State = v1.ReconciliationPolicy_Active } - - if r.Spec.RootResource != "" { - var targetContainer TargetContainer - err := myTargetClient.Get(context.Background(), client.ObjectKey{Name: r.Spec.RootResource, Namespace: r.Namespace}, &targetContainer) - if err != nil { - targetlog.Error(err, "failed to get target container", "name", r.Spec.RootResource) - } else { - ownerReference := metav1.OwnerReference{ - APIVersion: targetContainer.APIVersion, - Kind: targetContainer.Kind, - Name: targetContainer.Name, - UID: targetContainer.UID, - } - - if !configutils.CheckOwnerReferenceAlreadySet(r.OwnerReferences, ownerReference) { - r.OwnerReferences = append(r.OwnerReferences, ownerReference) - } - } - } } // TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation. @@ -183,12 +159,6 @@ func (r *Target) validateCreateTarget() error { if err := r.validateReconciliationPolicy(); err != nil { allErrs = append(allErrs, err) } - if err := r.validateNameOnCreate(); err != nil { - allErrs = append(allErrs, err) - } - if err := r.validateRootResource(); err != nil { - allErrs = append(allErrs, err) - } if len(allErrs) == 0 { return nil @@ -266,24 +236,6 @@ func (r *Target) validateReconciliationPolicy() *field.Error { return nil } -func (r *Target) validateNameOnCreate() *field.Error { - return configutils.ValidateObjectName(r.ObjectMeta.Name, r.Spec.RootResource) -} - -func (r *Target) validateRootResource() *field.Error { - var targetContainer TargetContainer - err := myTargetClient.Get(context.Background(), client.ObjectKey{Name: r.Spec.RootResource, Namespace: r.Namespace}, &targetContainer) - if err != nil { - return field.Invalid(field.NewPath("spec").Child("rootResource"), r.Spec.RootResource, "rootResource must be a valid target container") - } - - if len(r.ObjectMeta.OwnerReferences) == 0 { - return field.Invalid(field.NewPath("metadata").Child("ownerReference"), len(r.ObjectMeta.OwnerReferences), "ownerReference must be set") - } - - return nil -} - func (r *Target) validateUpdateTarget() error { var allErrs field.ErrorList if err := r.validateUniqueNameOnUpdate(); err != nil { diff --git a/k8s/apis/fabric/v1/targetcontainer_types.go b/k8s/apis/fabric/v1/targetcontainer_types.go deleted file mode 100644 index 18085f127..000000000 --- a/k8s/apis/fabric/v1/targetcontainer_types.go +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package v1 - -import ( - k8smodel "github.com/eclipse-symphony/symphony/k8s/apis/model/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// TargetContainerStatus defines the observed state of Target -type TargetContainerStatus struct { - // Important: Run "make" to regenerate code after modifying this file - Properties map[string]string `json:"properties,omitempty"` -} - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status -// TargetContainer is the Schema for the TargetContainers API -type TargetContainer struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec k8smodel.TargetContainerSpec `json:"spec,omitempty"` - Status TargetContainerStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true -// TargetContainerList contains a list of TargetContainer -type TargetContainerList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []TargetContainer `json:"items"` -} - -func init() { - SchemeBuilder.Register(&TargetContainer{}, &TargetContainerList{}) -} diff --git a/k8s/apis/fabric/v1/targetcontainer_webhook.go b/k8s/apis/fabric/v1/targetcontainer_webhook.go deleted file mode 100644 index c9cec6ca4..000000000 --- a/k8s/apis/fabric/v1/targetcontainer_webhook.go +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package v1 - -import ( - "context" - "fmt" - "gopls-workspace/apis/metrics/v1" - "time" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" -) - -// log is for logging in this package. -var targetcontainerlog = logf.Log.WithName("targetcontainer-resource") -var myTargetContainerClient client.Client -var targetContainerWebhookValidationMetrics *metrics.Metrics - -func (r *TargetContainer) SetupWebhookWithManager(mgr ctrl.Manager) error { - myTargetContainerClient = mgr.GetClient() - mgr.GetFieldIndexer().IndexField(context.Background(), &TargetContainer{}, ".metadata.name", func(rawObj client.Object) []string { - target := rawObj.(*TargetContainer) - return []string{target.Name} - }) - - // initialize the controller operation metrics - if targetContainerWebhookValidationMetrics == nil { - metrics, err := metrics.New() - if err != nil { - return err - } - targetContainerWebhookValidationMetrics = metrics - } - - return ctrl.NewWebhookManagedBy(mgr). - For(r). - Complete() -} - -// TODO(user): EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! - -//+kubebuilder:webhook:path=/mutate-fabric-symphony-v1-targetcontainer,mutating=true,failurePolicy=fail,sideEffects=None,groups=fabric.symphony,resources=targetcontainers,verbs=create;update,versions=v1,name=mtargetcontainer.kb.io,admissionReviewVersions=v1 - -var _ webhook.Defaulter = &TargetContainer{} - -// Default implements webhook.Defaulter so a webhook will be registered for the type -func (r *TargetContainer) Default() { - targetcontainerlog.Info("default", "name", r.Name) -} - -// TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation. - -//+kubebuilder:webhook:path=/validate-fabric-symphony-v1-targetcontainer,mutating=false,failurePolicy=fail,sideEffects=None,groups=fabric.symphony,resources=targetcontainers,verbs=create;update;delete,versions=v1,name=vtargetcontainer.kb.io,admissionReviewVersions=v1 - -var _ webhook.Validator = &TargetContainer{} - -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *TargetContainer) ValidateCreate() (admission.Warnings, error) { - targetcontainerlog.Info("validate create", "name", r.Name) - - return nil, nil -} - -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *TargetContainer) ValidateUpdate(old runtime.Object) (admission.Warnings, error) { - targetcontainerlog.Info("validate update", "name", r.Name) - - return nil, nil -} - -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *TargetContainer) ValidateDelete() (admission.Warnings, error) { - targetcontainerlog.Info("validate delete", "name", r.Name) - - validateDeleteTime := time.Now() - validationError := r.validateDeleteTargetContainer() - if validationError != nil { - targetContainerWebhookValidationMetrics.ControllerValidationLatency( - validateDeleteTime, - metrics.CreateOperationType, - metrics.InvalidResource, - metrics.CatalogResourceType) - } else { - targetContainerWebhookValidationMetrics.ControllerValidationLatency( - validateDeleteTime, - metrics.CreateOperationType, - metrics.ValidResource, - metrics.CatalogResourceType) - } - - return nil, validationError -} - -func (r *TargetContainer) validateDeleteTargetContainer() error { - return r.validateTargets() -} - -func (r *TargetContainer) validateTargets() error { - var target TargetList - err := myTargetContainerClient.List(context.Background(), &target, client.InNamespace(r.Namespace), client.MatchingFields{".spec.rootResource": r.Name}) - if err != nil { - targetcontainerlog.Error(err, "could not list targets", "name", r.Name) - return apierrors.NewBadRequest(fmt.Sprintf("could not list targets for target container %s.", r.Name)) - } - - if len(target.Items) != 0 { - targetcontainerlog.Error(err, "targets are not empty", "name", r.Name) - return apierrors.NewBadRequest(fmt.Sprintf("targets with root resource '%s' are not empty", r.Name)) - } - - return nil -} diff --git a/k8s/apis/fabric/v1/zz_generated.deepcopy.go b/k8s/apis/fabric/v1/zz_generated.deepcopy.go index 02e8c46bf..7a4d724a3 100644 --- a/k8s/apis/fabric/v1/zz_generated.deepcopy.go +++ b/k8s/apis/fabric/v1/zz_generated.deepcopy.go @@ -122,87 +122,6 @@ func (in *Target) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TargetContainer) DeepCopyInto(out *TargetContainer) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TargetContainer. -func (in *TargetContainer) DeepCopy() *TargetContainer { - if in == nil { - return nil - } - out := new(TargetContainer) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TargetContainer) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TargetContainerList) DeepCopyInto(out *TargetContainerList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]TargetContainer, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TargetContainerList. -func (in *TargetContainerList) DeepCopy() *TargetContainerList { - if in == nil { - return nil - } - out := new(TargetContainerList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TargetContainerList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TargetContainerStatus) DeepCopyInto(out *TargetContainerStatus) { - *out = *in - if in.Properties != nil { - in, out := &in.Properties, &out.Properties - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TargetContainerStatus. -func (in *TargetContainerStatus) DeepCopy() *TargetContainerStatus { - if in == nil { - return nil - } - out := new(TargetContainerStatus) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TargetList) DeepCopyInto(out *TargetList) { *out = *in diff --git a/k8s/apis/model/v1/common_types.go b/k8s/apis/model/v1/common_types.go index 195c21a3f..0a8bf4d29 100644 --- a/k8s/apis/model/v1/common_types.go +++ b/k8s/apis/model/v1/common_types.go @@ -75,8 +75,6 @@ type TargetSpec struct { Constraints string `json:"constraints,omitempty"` Topologies []model.TopologySpec `json:"topologies,omitempty"` ForceRedeploy bool `json:"forceRedeploy,omitempty"` - Version string `json:"version,omitempty"` - RootResource string `json:"rootResource,omitempty"` // Optional ReconcilicationPolicy to specify how target controller should reconcile. // Now only periodic reconciliation is supported. If the interval is 0, it will only reconcile @@ -86,16 +84,14 @@ type TargetSpec struct { // +kubebuilder:object:generate=true type InstanceSpec struct { - DisplayName string `json:"displayName,omitempty"` - Scope string `json:"scope,omitempty"` - Parameters map[string]string `json:"parameters,omitempty"` //TODO: Do we still need this? - Metadata map[string]string `json:"metadata,omitempty"` - Solution string `json:"solution"` - Target model.TargetSelector `json:"target,omitempty"` - Topologies []model.TopologySpec `json:"topologies,omitempty"` - Pipelines []model.PipelineSpec `json:"pipelines,omitempty"` - Version string `json:"version,omitempty"` - RootResource string `json:"rootResource,omitempty"` + DisplayName string `json:"displayName,omitempty"` + Scope string `json:"scope,omitempty"` + Parameters map[string]string `json:"parameters,omitempty"` //TODO: Do we still need this? + Metadata map[string]string `json:"metadata,omitempty"` + Solution string `json:"solution"` + Target model.TargetSelector `json:"target,omitempty"` + Topologies []model.TopologySpec `json:"topologies,omitempty"` + Pipelines []model.PipelineSpec `json:"pipelines,omitempty"` // Optional ReconcilicationPolicy to specify how target controller should reconcile. // Now only periodic reconciliation is supported. If the interval is 0, it will only reconcile @@ -103,14 +99,6 @@ type InstanceSpec struct { ReconciliationPolicy *ReconciliationPolicySpec `json:"reconciliationPolicy,omitempty"` } -// +kubebuilder:object:generate=true -type TargetContainerSpec struct { -} - -// +kubebuilder:object:generate=true -type InstanceContainerSpec struct { -} - // +kubebuilder:object:generate=true type SolutionSpec struct { DisplayName string `json:"displayName,omitempty"` diff --git a/k8s/apis/model/v1/zz_generated.deepcopy.go b/k8s/apis/model/v1/zz_generated.deepcopy.go index 7e5bea3a2..3f1d76f44 100644 --- a/k8s/apis/model/v1/zz_generated.deepcopy.go +++ b/k8s/apis/model/v1/zz_generated.deepcopy.go @@ -177,21 +177,6 @@ func (in *DeployableStatus) DeepCopy() *DeployableStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InstanceContainerSpec) DeepCopyInto(out *InstanceContainerSpec) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstanceContainerSpec. -func (in *InstanceContainerSpec) DeepCopy() *InstanceContainerSpec { - if in == nil { - return nil - } - out := new(InstanceContainerSpec) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *InstanceSpec) DeepCopyInto(out *InstanceSpec) { *out = *in @@ -338,21 +323,6 @@ func (in *StageSpec) DeepCopy() *StageSpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TargetContainerSpec) DeepCopyInto(out *TargetContainerSpec) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TargetContainerSpec. -func (in *TargetContainerSpec) DeepCopy() *TargetContainerSpec { - if in == nil { - return nil - } - out := new(TargetContainerSpec) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TargetSpec) DeepCopyInto(out *TargetSpec) { *out = *in diff --git a/k8s/apis/solution/v1/instance_webhook.go b/k8s/apis/solution/v1/instance_webhook.go index 3c2bd2268..9956898be 100644 --- a/k8s/apis/solution/v1/instance_webhook.go +++ b/k8s/apis/solution/v1/instance_webhook.go @@ -11,11 +11,9 @@ import ( "fmt" "gopls-workspace/apis/metrics/v1" v1 "gopls-workspace/apis/model/v1" - "gopls-workspace/configutils" "time" apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" @@ -41,10 +39,6 @@ func (r *Instance) SetupWebhookWithManager(mgr ctrl.Manager) error { instance := rawObj.(*Instance) return []string{instance.Spec.Solution} }) - mgr.GetFieldIndexer().IndexField(context.Background(), &Instance{}, ".spec.rootResource", func(rawObj client.Object) []string { - instance := rawObj.(*Instance) - return []string{instance.Spec.RootResource} - }) // initialize the controller operation metrics if instanceWebhookValidationMetrics == nil { @@ -77,25 +71,6 @@ func (r *Instance) Default() { if r.Spec.ReconciliationPolicy != nil && r.Spec.ReconciliationPolicy.State == "" { r.Spec.ReconciliationPolicy.State = v1.ReconciliationPolicy_Active } - - if r.Spec.RootResource != "" { - var instanceContainer InstanceContainer - err := myInstanceClient.Get(context.Background(), client.ObjectKey{Name: r.Spec.RootResource, Namespace: r.Namespace}, &instanceContainer) - if err != nil { - instancelog.Error(err, "failed to get instance container", "name", r.Spec.RootResource) - } else { - ownerReference := metav1.OwnerReference{ - APIVersion: instanceContainer.APIVersion, - Kind: instanceContainer.Kind, - Name: instanceContainer.Name, - UID: instanceContainer.UID, - } - - if !configutils.CheckOwnerReferenceAlreadySet(r.OwnerReferences, ownerReference) { - r.OwnerReferences = append(r.OwnerReferences, ownerReference) - } - } - } } // TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation. @@ -171,12 +146,6 @@ func (r *Instance) validateCreateInstance() error { if err := r.validateReconciliationPolicy(); err != nil { allErrs = append(allErrs, err) } - if err := r.validateNameOnCreate(); err != nil { - allErrs = append(allErrs, err) - } - if err := r.validateRootResource(); err != nil { - allErrs = append(allErrs, err) - } if len(allErrs) == 0 { return nil @@ -246,21 +215,3 @@ func (r *Instance) validateReconciliationPolicy() *field.Error { return nil } - -func (r *Instance) validateNameOnCreate() *field.Error { - return configutils.ValidateObjectName(r.ObjectMeta.Name, r.Spec.RootResource) -} - -func (r *Instance) validateRootResource() *field.Error { - var instanceContainer InstanceContainer - err := myInstanceClient.Get(context.Background(), client.ObjectKey{Name: r.Spec.RootResource, Namespace: r.Namespace}, &instanceContainer) - if err != nil { - return field.Invalid(field.NewPath("spec").Child("rootResource"), r.Spec.RootResource, "rootResource must be a valid instance container") - } - - if len(r.ObjectMeta.OwnerReferences) == 0 { - return field.Invalid(field.NewPath("metadata").Child("ownerReference"), len(r.ObjectMeta.OwnerReferences), "ownerReference must be set") - } - - return nil -} diff --git a/k8s/apis/solution/v1/instancecontainer_types.go b/k8s/apis/solution/v1/instancecontainer_types.go deleted file mode 100644 index de0843cc8..000000000 --- a/k8s/apis/solution/v1/instancecontainer_types.go +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package v1 - -import ( - k8smodel "github.com/eclipse-symphony/symphony/k8s/apis/model/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -type InstanceContainerStatus struct { - Properties map[string]string `json:"properties"` -} - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status -// InstanceContainer is the Schema for the InstanceContainers API -type InstanceContainer struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec k8smodel.InstanceContainerSpec `json:"spec,omitempty"` - Status InstanceContainerStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true -// InstanceContainer1List contains a list of InstanceContainer -type InstanceContainerList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []InstanceContainer `json:"items"` -} - -func init() { - SchemeBuilder.Register(&InstanceContainer{}, &InstanceContainerList{}) -} diff --git a/k8s/apis/solution/v1/instancecontainer_webhook.go b/k8s/apis/solution/v1/instancecontainer_webhook.go deleted file mode 100644 index 0c74d6aee..000000000 --- a/k8s/apis/solution/v1/instancecontainer_webhook.go +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package v1 - -import ( - "context" - "fmt" - "gopls-workspace/apis/metrics/v1" - "time" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" -) - -// log is for logging in this package. -var instancecontainerlog = logf.Log.WithName("instancecontainer-resource") -var myInstanceContainerClient client.Client -var instanceContainerWebhookValidationMetrics *metrics.Metrics - -func (r *InstanceContainer) SetupWebhookWithManager(mgr ctrl.Manager) error { - myInstanceContainerClient = mgr.GetClient() - mgr.GetFieldIndexer().IndexField(context.Background(), &InstanceContainer{}, ".metadata.name", func(rawObj client.Object) []string { - instance := rawObj.(*InstanceContainer) - return []string{instance.Name} - }) - - // initialize the controller operation metrics - if instanceContainerWebhookValidationMetrics == nil { - metrics, err := metrics.New() - if err != nil { - return err - } - instanceContainerWebhookValidationMetrics = metrics - } - - return ctrl.NewWebhookManagedBy(mgr). - For(r). - Complete() -} - -// TODO(user): EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! - -//+kubebuilder:webhook:path=/mutate-solution-symphony-v1-instancecontainer,mutating=true,failurePolicy=fail,sideEffects=None,groups=solution.symphony,resources=instancecontainers,verbs=create;update,versions=v1,name=minstancecontainer.kb.io,admissionReviewVersions=v1 - -var _ webhook.Defaulter = &InstanceContainer{} - -// Default implements webhook.Defaulter so a webhook will be registered for the type -func (r *InstanceContainer) Default() { - instancecontainerlog.Info("default", "name", r.Name) -} - -// TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation. - -//+kubebuilder:webhook:path=/validate-solution-symphony-v1-instancecontainer,mutating=false,failurePolicy=fail,sideEffects=None,groups=solution.symphony,resources=instancecontainers,verbs=create;update;delete,versions=v1,name=vinstancecontainer.kb.io,admissionReviewVersions=v1 - -var _ webhook.Validator = &InstanceContainer{} - -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *InstanceContainer) ValidateCreate() (admission.Warnings, error) { - instancecontainerlog.Info("validate create", "name", r.Name) - - return nil, nil -} - -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *InstanceContainer) ValidateUpdate(old runtime.Object) (admission.Warnings, error) { - instancecontainerlog.Info("validate update", "name", r.Name) - - return nil, nil -} - -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *InstanceContainer) ValidateDelete() (admission.Warnings, error) { - instancecontainerlog.Info("validate delete", "name", r.Name) - - validateDeleteTime := time.Now() - validationError := r.validateDeleteInstanceContainer() - if validationError != nil { - instanceContainerWebhookValidationMetrics.ControllerValidationLatency( - validateDeleteTime, - metrics.CreateOperationType, - metrics.InvalidResource, - metrics.CatalogResourceType) - } else { - instanceContainerWebhookValidationMetrics.ControllerValidationLatency( - validateDeleteTime, - metrics.CreateOperationType, - metrics.ValidResource, - metrics.CatalogResourceType) - } - - return nil, validationError -} - -func (r *InstanceContainer) validateDeleteInstanceContainer() error { - return r.validateInstances() -} - -func (r *InstanceContainer) validateInstances() error { - var instance InstanceList - err := myInstanceContainerClient.List(context.Background(), &instance, client.InNamespace(r.Namespace), client.MatchingFields{".spec.rootResource": r.Name}) - if err != nil { - instancecontainerlog.Error(err, "could not list instances", "name", r.Name) - return apierrors.NewBadRequest(fmt.Sprintf("could not list instances for instance container %s.", r.Name)) - } - - if len(instance.Items) != 0 { - instancecontainerlog.Error(err, "instances are not empty", "name", r.Name) - return apierrors.NewBadRequest(fmt.Sprintf("instances with root resource '%s' are not empty", r.Name)) - } - - return nil -} diff --git a/k8s/apis/solution/v1/zz_generated.deepcopy.go b/k8s/apis/solution/v1/zz_generated.deepcopy.go index 16c7615cc..ac50b38b6 100644 --- a/k8s/apis/solution/v1/zz_generated.deepcopy.go +++ b/k8s/apis/solution/v1/zz_generated.deepcopy.go @@ -41,87 +41,6 @@ func (in *Instance) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InstanceContainer) DeepCopyInto(out *InstanceContainer) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstanceContainer. -func (in *InstanceContainer) DeepCopy() *InstanceContainer { - if in == nil { - return nil - } - out := new(InstanceContainer) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *InstanceContainer) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InstanceContainerList) DeepCopyInto(out *InstanceContainerList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]InstanceContainer, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstanceContainerList. -func (in *InstanceContainerList) DeepCopy() *InstanceContainerList { - if in == nil { - return nil - } - out := new(InstanceContainerList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *InstanceContainerList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InstanceContainerStatus) DeepCopyInto(out *InstanceContainerStatus) { - *out = *in - if in.Properties != nil { - in, out := &in.Properties, &out.Properties - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstanceContainerStatus. -func (in *InstanceContainerStatus) DeepCopy() *InstanceContainerStatus { - if in == nil { - return nil - } - out := new(InstanceContainerStatus) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *InstanceList) DeepCopyInto(out *InstanceList) { *out = *in diff --git a/k8s/config/oss/crd/bases/fabric.symphony_targetcontainers.yaml b/k8s/config/oss/crd/bases/fabric.symphony_targetcontainers.yaml deleted file mode 100644 index a79f86ddd..000000000 --- a/k8s/config/oss/crd/bases/fabric.symphony_targetcontainers.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.15.0 - name: targetcontainers.fabric.symphony -spec: - group: fabric.symphony - names: - kind: TargetContainer - listKind: TargetContainerList - plural: targetcontainers - singular: targetcontainer - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: TargetContainer is the Schema for the TargetContainers API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - type: object - status: - description: TargetContainerStatus defines the observed state of Target - properties: - properties: - additionalProperties: - type: string - description: 'Important: Run "make" to regenerate code after modifying - this file' - type: object - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/k8s/config/oss/crd/bases/fabric.symphony_targets.yaml b/k8s/config/oss/crd/bases/fabric.symphony_targets.yaml index 0ba749786..5cabbe8e6 100644 --- a/k8s/config/oss/crd/bases/fabric.symphony_targets.yaml +++ b/k8s/config/oss/crd/bases/fabric.symphony_targets.yaml @@ -146,8 +146,6 @@ spec: required: - state type: object - rootResource: - type: string scope: type: string topologies: @@ -179,8 +177,6 @@ spec: type: object type: object type: array - version: - type: string type: object status: properties: diff --git a/k8s/config/oss/crd/bases/solution.symphony_instancecontainers.yaml b/k8s/config/oss/crd/bases/solution.symphony_instancecontainers.yaml deleted file mode 100644 index 39b2e358d..000000000 --- a/k8s/config/oss/crd/bases/solution.symphony_instancecontainers.yaml +++ /dev/null @@ -1,54 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.15.0 - name: instancecontainers.solution.symphony -spec: - group: solution.symphony - names: - kind: InstanceContainer - listKind: InstanceContainerList - plural: instancecontainers - singular: instancecontainer - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: InstanceContainer is the Schema for the InstanceContainers API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - type: object - status: - properties: - properties: - additionalProperties: - type: string - type: object - required: - - properties - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/k8s/config/oss/crd/bases/solution.symphony_instances.yaml b/k8s/config/oss/crd/bases/solution.symphony_instances.yaml index 5c69cddbf..629514068 100644 --- a/k8s/config/oss/crd/bases/solution.symphony_instances.yaml +++ b/k8s/config/oss/crd/bases/solution.symphony_instances.yaml @@ -92,8 +92,6 @@ spec: required: - state type: object - rootResource: - type: string scope: type: string solution: @@ -138,8 +136,6 @@ spec: type: object type: object type: array - version: - type: string required: - solution type: object diff --git a/k8s/config/oss/crd/kustomization.yaml b/k8s/config/oss/crd/kustomization.yaml index c94d5490c..2f0cb2d43 100644 --- a/k8s/config/oss/crd/kustomization.yaml +++ b/k8s/config/oss/crd/kustomization.yaml @@ -22,8 +22,6 @@ resources: - bases/federation.symphony_catalogs.yaml - bases/solution.symphony_solutioncontainers.yaml - bases/workflow.symphony_campaigncontainers.yaml -- bases/solution.symphony_instancecontainers.yaml -- bases/fabric.symphony_targetcontainers.yaml - bases/federation.symphony_catalogcontainers.yaml #+kubebuilder:scaffold:crdkustomizeresource diff --git a/k8s/config/oss/crd/patches/cainjection_in_fabric_targetcontainers.yaml b/k8s/config/oss/crd/patches/cainjection_in_fabric_targetcontainers.yaml deleted file mode 100644 index 0dda628e8..000000000 --- a/k8s/config/oss/crd/patches/cainjection_in_fabric_targetcontainers.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: targetcontainers.fabric.symphony diff --git a/k8s/config/oss/crd/patches/cainjection_in_solution_instancecontainers.yaml b/k8s/config/oss/crd/patches/cainjection_in_solution_instancecontainers.yaml deleted file mode 100644 index 8cd79147b..000000000 --- a/k8s/config/oss/crd/patches/cainjection_in_solution_instancecontainers.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: instancecontainers.solution.symphony diff --git a/k8s/config/oss/crd/patches/webhook_in_fabric_targetcontainers.yaml b/k8s/config/oss/crd/patches/webhook_in_fabric_targetcontainers.yaml deleted file mode 100644 index f14432749..000000000 --- a/k8s/config/oss/crd/patches/webhook_in_fabric_targetcontainers.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# The following patch enables a conversion webhook for the CRD -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: targetcontainers.fabric.symphony -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - namespace: system - name: webhook-service - path: /convert - conversionReviewVersions: - - v1 diff --git a/k8s/config/oss/crd/patches/webhook_in_solution_instancecontainers.yaml b/k8s/config/oss/crd/patches/webhook_in_solution_instancecontainers.yaml deleted file mode 100644 index 1a776d61e..000000000 --- a/k8s/config/oss/crd/patches/webhook_in_solution_instancecontainers.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# The following patch enables a conversion webhook for the CRD -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: instancecontainers.solution.symphony -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - namespace: system - name: webhook-service - path: /convert - conversionReviewVersions: - - v1 diff --git a/k8s/config/oss/rbac/fabric_targetcontainer_editor_role.yaml b/k8s/config/oss/rbac/fabric_targetcontainer_editor_role.yaml deleted file mode 100644 index 89421d54b..000000000 --- a/k8s/config/oss/rbac/fabric_targetcontainer_editor_role.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# permissions for end users to edit targetcontainers. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: targetcontainer-editor-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: symphony-k8s - app.kubernetes.io/part-of: symphony-k8s - app.kubernetes.io/managed-by: kustomize - name: targetcontainer-editor-role -rules: -- apiGroups: - - fabric.symphony - resources: - - targetcontainers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - fabric.symphony - resources: - - targetcontainers/status - verbs: - - get diff --git a/k8s/config/oss/rbac/fabric_targetcontainer_viewer_role.yaml b/k8s/config/oss/rbac/fabric_targetcontainer_viewer_role.yaml deleted file mode 100644 index e18885874..000000000 --- a/k8s/config/oss/rbac/fabric_targetcontainer_viewer_role.yaml +++ /dev/null @@ -1,33 +0,0 @@ -## -## Copyright (c) Microsoft Corporation. -## Licensed under the MIT license. -## SPDX-License-Identifier: MIT -## - -# permissions for end users to view targetcontainers. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: targetcontainer-viewer-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: symphony-k8s - app.kubernetes.io/part-of: symphony-k8s - app.kubernetes.io/managed-by: kustomize - name: targetcontainer-viewer-role -rules: -- apiGroups: - - fabric.symphony - resources: - - targetcontainers - verbs: - - get - - list - - watch -- apiGroups: - - fabric.symphony - resources: - - targetcontainers/status - verbs: - - get diff --git a/k8s/config/oss/rbac/role.yaml b/k8s/config/oss/rbac/role.yaml index 4e68b4698..63e13e4d1 100644 --- a/k8s/config/oss/rbac/role.yaml +++ b/k8s/config/oss/rbac/role.yaml @@ -400,32 +400,6 @@ rules: - get - patch - update -- apiGroups: - - solution.symphony - resources: - - instancecontainers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - solution.symphony - resources: - - instancecontainers/finalizers - verbs: - - update -- apiGroups: - - solution.symphony - resources: - - instancecontainers/status - verbs: - - get - - patch - - update - apiGroups: - solution.symphony resources: @@ -452,32 +426,6 @@ rules: - get - patch - update -- apiGroups: - - fabric.symphony - resources: - - targetcontainers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - fabric.symphony - resources: - - targetcontainers/finalizers - verbs: - - update -- apiGroups: - - fabric.symphony - resources: - - targetcontainers/status - verbs: - - get - - patch - - update - apiGroups: - federation.symphony resources: diff --git a/k8s/config/oss/rbac/solution_instancecontainer_editor_role.yaml b/k8s/config/oss/rbac/solution_instancecontainer_editor_role.yaml deleted file mode 100644 index d61c6a749..000000000 --- a/k8s/config/oss/rbac/solution_instancecontainer_editor_role.yaml +++ /dev/null @@ -1,37 +0,0 @@ -## -## Copyright (c) Microsoft Corporation. -## Licensed under the MIT license. -## SPDX-License-Identifier: MIT -## - -# permissions for end users to edit instancecontainers. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: instancecontainer-editor-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: symphony-k8s - app.kubernetes.io/part-of: symphony-k8s - app.kubernetes.io/managed-by: kustomize - name: instancecontainer-editor-role -rules: -- apiGroups: - - solution.symphony - resources: - - instancecontainers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - solution.symphony - resources: - - instancecontainers/status - verbs: - - get diff --git a/k8s/config/oss/rbac/solution_instancecontainer_viewer_role.yaml b/k8s/config/oss/rbac/solution_instancecontainer_viewer_role.yaml deleted file mode 100644 index 0d99bbee5..000000000 --- a/k8s/config/oss/rbac/solution_instancecontainer_viewer_role.yaml +++ /dev/null @@ -1,33 +0,0 @@ -## -## Copyright (c) Microsoft Corporation. -## Licensed under the MIT license. -## SPDX-License-Identifier: MIT -## - -# permissions for end users to view instancecontainers. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: instancecontainer-viewer-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: symphony-k8s - app.kubernetes.io/part-of: symphony-k8s - app.kubernetes.io/managed-by: kustomize - name: instancecontainer-viewer-role -rules: -- apiGroups: - - solution.symphony - resources: - - instancecontainers - verbs: - - get - - list - - watch -- apiGroups: - - solution.symphony - resources: - - instancecontainers/status - verbs: - - get diff --git a/k8s/config/oss/samples/fabric_v1_targetcontainer.yaml b/k8s/config/oss/samples/fabric_v1_targetcontainer.yaml deleted file mode 100644 index acaf933b7..000000000 --- a/k8s/config/oss/samples/fabric_v1_targetcontainer.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: fabric.symphony/v1 -kind: TargetContainer -metadata: - labels: - app.kubernetes.io/name: targetcontainer - app.kubernetes.io/instance: targetcontainer-sample - app.kubernetes.io/part-of: symphony-k8s - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/created-by: symphony-k8s - name: targetcontainer-sample -spec: - # TODO(user): Add fields here diff --git a/k8s/config/oss/samples/solution_v1_instancecontainer.yaml b/k8s/config/oss/samples/solution_v1_instancecontainer.yaml deleted file mode 100644 index 3289cbb5d..000000000 --- a/k8s/config/oss/samples/solution_v1_instancecontainer.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: solution.symphony/v1 -kind: InstanceContainer -metadata: - labels: - app.kubernetes.io/name: instancecontainer - app.kubernetes.io/instance: instancecontainer-sample - app.kubernetes.io/part-of: symphony-k8s - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/created-by: symphony-k8s - name: instancecontainer-sample -spec: - # TODO(user): Add fields here diff --git a/k8s/config/oss/webhook/manifests.yaml b/k8s/config/oss/webhook/manifests.yaml index a356ea748..0d3587316 100644 --- a/k8s/config/oss/webhook/manifests.yaml +++ b/k8s/config/oss/webhook/manifests.yaml @@ -24,26 +24,6 @@ webhooks: resources: - targets sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: webhook-service - namespace: system - path: /mutate-fabric-symphony-v1-targetcontainer - failurePolicy: Fail - name: mtargetcontainer.kb.io - rules: - - apiGroups: - - fabric.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - targetcontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: @@ -64,26 +44,6 @@ webhooks: resources: - instances sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: webhook-service - namespace: system - path: /mutate-solution-symphony-v1-instancecontainer - failurePolicy: Fail - name: minstancecontainer.kb.io - rules: - - apiGroups: - - solution.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - instancecontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: @@ -250,27 +210,6 @@ webhooks: resources: - targets sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: webhook-service - namespace: system - path: /validate-fabric-symphony-v1-targetcontainer - failurePolicy: Fail - name: vtargetcontainer.kb.io - rules: - - apiGroups: - - fabric.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - targetcontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: @@ -291,27 +230,6 @@ webhooks: resources: - instances sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: webhook-service - namespace: system - path: /validate-solution-symphony-v1-instancecontainer - failurePolicy: Fail - name: vinstancecontainer.kb.io - rules: - - apiGroups: - - solution.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - instancecontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: diff --git a/k8s/controllers/fabric/targetcontainer_controller.go b/k8s/controllers/fabric/targetcontainer_controller.go deleted file mode 100644 index 2a8bd527a..000000000 --- a/k8s/controllers/fabric/targetcontainer_controller.go +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package fabric - -import ( - "context" - - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/log" - - fabricv1 "gopls-workspace/apis/fabric/v1" -) - -// TargetContainerReconciler reconciles a TargetContainer object -type TargetContainerReconciler struct { - client.Client - Scheme *runtime.Scheme -} - -//+kubebuilder:rbac:groups=fabric.symphony,resources=targetcontainers,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=fabric.symphony,resources=targetcontainers/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=fabric.symphony,resources=targetcontainers/finalizers,verbs=update - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -// TODO(user): Modify the Reconcile function to compare the state specified by -// the TargetContainer object against the actual cluster state, and then -// perform operations to make the cluster state reflect the state specified by -// the user. -// -// For more details, check Reconcile and its Result here: -// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.14.4/pkg/reconcile -func (r *TargetContainerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - _ = log.FromContext(ctx) - - // TODO(user): your logic here - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *TargetContainerReconciler) SetupWithManager(mgr ctrl.Manager) error { - return ctrl.NewControllerManagedBy(mgr). - For(&fabricv1.TargetContainer{}). - Complete(r) -} diff --git a/k8s/controllers/solution/instancecontainer_controller.go b/k8s/controllers/solution/instancecontainer_controller.go deleted file mode 100644 index 08a5a3c4d..000000000 --- a/k8s/controllers/solution/instancecontainer_controller.go +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT license. - * SPDX-License-Identifier: MIT - */ - -package solution - -import ( - "context" - - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/log" - - solutionv1 "gopls-workspace/apis/solution/v1" -) - -// InstanceContainerReconciler reconciles a InstanceContainer object -type InstanceContainerReconciler struct { - client.Client - Scheme *runtime.Scheme -} - -//+kubebuilder:rbac:groups=solution.symphony,resources=instancecontainers,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=solution.symphony,resources=instancecontainers/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=solution.symphony,resources=instancecontainers/finalizers,verbs=update - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -// TODO(user): Modify the Reconcile function to compare the state specified by -// the InstanceContainer object against the actual cluster state, and then -// perform operations to make the cluster state reflect the state specified by -// the user. -// -// For more details, check Reconcile and its Result here: -// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.14.4/pkg/reconcile -func (r *InstanceContainerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - _ = log.FromContext(ctx) - - // TODO(user): your logic here - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *InstanceContainerReconciler) SetupWithManager(mgr ctrl.Manager) error { - return ctrl.NewControllerManagedBy(mgr). - For(&solutionv1.InstanceContainer{}). - Complete(r) -} diff --git a/k8s/main.go b/k8s/main.go index 206d4253d..fc287a38f 100644 --- a/k8s/main.go +++ b/k8s/main.go @@ -314,18 +314,10 @@ func main() { setupLog.Error(err, "unable to create webhook", "webhook", "CatalogContainer") os.Exit(1) } - if err = (&solutionv1.InstanceContainer{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "InstanceContainer") - os.Exit(1) - } if err = (&solutionv1.SolutionContainer{}).SetupWebhookWithManager(mgr); err != nil { setupLog.Error(err, "unable to create webhook", "webhook", "SolutionContainer") os.Exit(1) } - if err = (&fabricv1.TargetContainer{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "TargetContainer") - os.Exit(1) - } } if err = (&solutioncontrollers.SolutionContainerReconciler{ Client: mgr.GetClient(), @@ -341,13 +333,6 @@ func main() { setupLog.Error(err, "unable to create controller", "controller", "CatalogContainer") os.Exit(1) } - if err = (&fabriccontrollers.TargetContainerReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - }).SetupWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "TargetContainer") - os.Exit(1) - } if err = (&workflowcontrollers.CampaignContainerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), @@ -355,13 +340,6 @@ func main() { setupLog.Error(err, "unable to create controller", "controller", "CampaignContainer") os.Exit(1) } - if err = (&solutioncontrollers.InstanceContainerReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - }).SetupWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "InstanceContainer") - os.Exit(1) - } //+kubebuilder:scaffold:builder if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { diff --git a/k8s/testing/mocks.go b/k8s/testing/mocks.go index 8d401ed94..8827664ac 100644 --- a/k8s/testing/mocks.go +++ b/k8s/testing/mocks.go @@ -63,12 +63,10 @@ var ( ) var ( - DefaultTargetNamepsacedName = types.NamespacedName{Name: "target-v1", Namespace: TestNamespace} - DefaultInstanceNamespacedName = types.NamespacedName{Name: "instance-v1", Namespace: TestNamespace} + DefaultTargetNamepsacedName = types.NamespacedName{Name: "testtarget", Namespace: TestNamespace} + DefaultInstanceNamespacedName = types.NamespacedName{Name: "testinstance", Namespace: TestNamespace} DefaultSolutionNamespacedName = types.NamespacedName{Name: "solution-v1", Namespace: TestNamespace} - - SolutionReferenceName = "solution:v1" - TagetReferenceName = "target:v1" + SolutionReferenceName = "solution:v1" TerminalError = v1alpha2.NewCOAError(errors.New(""), "timed out", v1alpha2.TimedOut) NotFoundError = v1alpha2.NewCOAError(errors.New(""), "not found", v1alpha2.NotFound) @@ -328,7 +326,7 @@ func BuildDefaultInstance() *solution_v1.Instance { }, Spec: k8smodel.InstanceSpec{ Target: model.TargetSelector{ - Name: TagetReferenceName, + Name: DefaultTargetNamepsacedName.Name, }, Solution: SolutionReferenceName, }, diff --git a/k8s/utils/symphony-api.go b/k8s/utils/symphony-api.go index ccdfc862f..368613ee1 100644 --- a/k8s/utils/symphony-api.go +++ b/k8s/utils/symphony-api.go @@ -163,8 +163,7 @@ func MatchTargets(instance solution_v1.Instance, targets fabric_v1.TargetList) [ ret := make(map[string]fabric_v1.Target) if instance.Spec.Target.Name != "" { for _, t := range targets.Items { - targetName := ReplaceLastSeperator(instance.Spec.Target.Name, ":", "-") - if matchString(targetName, t.ObjectMeta.Name) { + if matchString(instance.Spec.Target.Name, t.ObjectMeta.Name) { ret[t.ObjectMeta.Name] = t } } diff --git a/packages/helm/symphony-poll-agent/templates/pai-cluster-role.yaml b/packages/helm/symphony-poll-agent/templates/pai-cluster-role.yaml index 9e420388a..0a1fe3fb7 100644 --- a/packages/helm/symphony-poll-agent/templates/pai-cluster-role.yaml +++ b/packages/helm/symphony-poll-agent/templates/pai-cluster-role.yaml @@ -6,5 +6,5 @@ metadata: app: symphony-api rules: - apiGroups: ["*", "solution.symphony", "ai.symphony", "fabric.symphony", "workflow.symphony", "federation.symphony", "apps", "", "policy", "apiextensions.k8s.io", "rbac.authorization.k8s.io", "admissionregistration.k8s.io"] # "" indicates the core API group - resources: ["*", "validatingwebhookconfigurations", "mutatingwebhookconfigurations", "rolebindings", "roles", "clusterrolebindings", "clusterroles", "secrets", "serviceaccounts", "poddisruptionbudgets", "podsecuritypolicies", "resourcequotas", "customresourcedefinitions", "targets", "skills", "models", "skillpackages", "sites/status", "activations/status", "campaigns", "activations", "sites", "catalogs", "devices", "instances", "solutions", "deployments", "services", "devices/status", "instances/status", "targets/status", "solutions/status", "catalogs/status", "campaigns/status", "namespaces", "targetcontainers", "solutioncontainers", "instancecontainers", "catalogcontainers", "campaigncontainers", "targetcontainers/status", "solutioncontainers/status", "instancecontainers/status", "catalogcontainers/status", "campaigncontainers/status"] + resources: ["*", "validatingwebhookconfigurations", "mutatingwebhookconfigurations", "rolebindings", "roles", "clusterrolebindings", "clusterroles", "secrets", "serviceaccounts", "poddisruptionbudgets", "podsecuritypolicies", "resourcequotas", "customresourcedefinitions", "targets", "skills", "models", "skillpackages", "sites/status", "activations/status", "campaigns", "activations", "sites", "catalogs", "devices", "instances", "solutions", "deployments", "services", "devices/status", "instances/status", "targets/status", "solutions/status", "catalogs/status", "campaigns/status", "namespaces", "solutioncontainers", "catalogcontainers", "campaigncontainers", "solutioncontainers/status", "catalogcontainers/status", "campaigncontainers/status"] verbs: ["*", "get", "list", "watch", "create", "update", "patch", "delete"] \ No newline at end of file diff --git a/packages/helm/symphony/files/symphony-api.json b/packages/helm/symphony/files/symphony-api.json index c2a0965db..01281ce90 100644 --- a/packages/helm/symphony/files/symphony-api.json +++ b/packages/helm/symphony/files/symphony-api.json @@ -266,27 +266,6 @@ } ] }, - { - "type": "vendors.targetcontainers", - "route": "targetcontainers", - "managers": [ - { - "name": "target-container-manager", - "type": "managers.symphony.targetcontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": true - } - } - } - } - ] - }, { "type": "vendors.solutions", "route": "solutions", @@ -350,27 +329,6 @@ } ] }, - { - "type": "vendors.instancecontainers", - "route": "instancecontainers", - "managers": [ - { - "name": "instance-container-manager", - "type": "managers.symphony.instancecontainers", - "properties": { - "providers.persistentstate": "k8s-state" - }, - "providers": { - "k8s-state": { - "type": "providers.state.k8s", - "config": { - "inCluster": true - } - } - } - } - ] - }, { "type": "vendors.devices", "route": "devices", diff --git a/packages/helm/symphony/templates/identity/pai-cluster-role.yaml b/packages/helm/symphony/templates/identity/pai-cluster-role.yaml index 9e420388a..0a1fe3fb7 100644 --- a/packages/helm/symphony/templates/identity/pai-cluster-role.yaml +++ b/packages/helm/symphony/templates/identity/pai-cluster-role.yaml @@ -6,5 +6,5 @@ metadata: app: symphony-api rules: - apiGroups: ["*", "solution.symphony", "ai.symphony", "fabric.symphony", "workflow.symphony", "federation.symphony", "apps", "", "policy", "apiextensions.k8s.io", "rbac.authorization.k8s.io", "admissionregistration.k8s.io"] # "" indicates the core API group - resources: ["*", "validatingwebhookconfigurations", "mutatingwebhookconfigurations", "rolebindings", "roles", "clusterrolebindings", "clusterroles", "secrets", "serviceaccounts", "poddisruptionbudgets", "podsecuritypolicies", "resourcequotas", "customresourcedefinitions", "targets", "skills", "models", "skillpackages", "sites/status", "activations/status", "campaigns", "activations", "sites", "catalogs", "devices", "instances", "solutions", "deployments", "services", "devices/status", "instances/status", "targets/status", "solutions/status", "catalogs/status", "campaigns/status", "namespaces", "targetcontainers", "solutioncontainers", "instancecontainers", "catalogcontainers", "campaigncontainers", "targetcontainers/status", "solutioncontainers/status", "instancecontainers/status", "catalogcontainers/status", "campaigncontainers/status"] + resources: ["*", "validatingwebhookconfigurations", "mutatingwebhookconfigurations", "rolebindings", "roles", "clusterrolebindings", "clusterroles", "secrets", "serviceaccounts", "poddisruptionbudgets", "podsecuritypolicies", "resourcequotas", "customresourcedefinitions", "targets", "skills", "models", "skillpackages", "sites/status", "activations/status", "campaigns", "activations", "sites", "catalogs", "devices", "instances", "solutions", "deployments", "services", "devices/status", "instances/status", "targets/status", "solutions/status", "catalogs/status", "campaigns/status", "namespaces", "solutioncontainers", "catalogcontainers", "campaigncontainers", "solutioncontainers/status", "catalogcontainers/status", "campaigncontainers/status"] verbs: ["*", "get", "list", "watch", "create", "update", "patch", "delete"] \ No newline at end of file diff --git a/packages/helm/symphony/templates/symphony-core/symphonyk8s.yaml b/packages/helm/symphony/templates/symphony-core/symphonyk8s.yaml index 0926343e0..682b7e327 100644 --- a/packages/helm/symphony/templates/symphony-core/symphonyk8s.yaml +++ b/packages/helm/symphony/templates/symphony-core/symphonyk8s.yaml @@ -495,60 +495,6 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.15.0 - name: instancecontainers.solution.symphony -spec: - group: solution.symphony - names: - kind: InstanceContainer - listKind: InstanceContainerList - plural: instancecontainers - singular: instancecontainer - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: InstanceContainer is the Schema for the InstanceContainers API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - type: object - status: - properties: - properties: - additionalProperties: - type: string - type: object - required: - - properties - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition metadata: annotations: cert-manager.io/inject-ca-from: '{{ .Release.Namespace }}/{{ include "symphony.fullname" @@ -652,8 +598,6 @@ spec: required: - state type: object - rootResource: - type: string scope: type: string solution: @@ -698,8 +642,6 @@ spec: type: object type: object type: array - version: - type: string required: - solution type: object @@ -1483,61 +1425,6 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.15.0 - name: targetcontainers.fabric.symphony -spec: - group: fabric.symphony - names: - kind: TargetContainer - listKind: TargetContainerList - plural: targetcontainers - singular: targetcontainer - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: TargetContainer is the Schema for the TargetContainers API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - type: object - status: - description: TargetContainerStatus defines the observed state of Target - properties: - properties: - additionalProperties: - type: string - description: 'Important: Run "make" to regenerate code after modifying - this file' - type: object - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition metadata: annotations: cert-manager.io/inject-ca-from: '{{ .Release.Namespace }}/{{ include "symphony.fullname" @@ -1695,8 +1582,6 @@ spec: required: - state type: object - rootResource: - type: string scope: type: string topologies: @@ -1728,8 +1613,6 @@ spec: type: object type: object type: array - version: - type: string type: object status: properties: @@ -2245,32 +2128,6 @@ rules: - get - patch - update -- apiGroups: - - solution.symphony - resources: - - instancecontainers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - solution.symphony - resources: - - instancecontainers/finalizers - verbs: - - update -- apiGroups: - - solution.symphony - resources: - - instancecontainers/status - verbs: - - get - - patch - - update - apiGroups: - solution.symphony resources: @@ -2297,32 +2154,6 @@ rules: - get - patch - update -- apiGroups: - - fabric.symphony - resources: - - targetcontainers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - fabric.symphony - resources: - - targetcontainers/finalizers - verbs: - - update -- apiGroups: - - fabric.symphony - resources: - - targetcontainers/status - verbs: - - get - - patch - - update - apiGroups: - federation.symphony resources: @@ -2657,26 +2488,6 @@ webhooks: resources: - targets sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: '{{ include "symphony.fullname" . }}-webhook-service' - namespace: '{{ .Release.Namespace }}' - path: /mutate-fabric-symphony-v1-targetcontainer - failurePolicy: Fail - name: mtargetcontainer.kb.io - rules: - - apiGroups: - - fabric.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - targetcontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: @@ -2697,26 +2508,6 @@ webhooks: resources: - instances sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: '{{ include "symphony.fullname" . }}-webhook-service' - namespace: '{{ .Release.Namespace }}' - path: /mutate-solution-symphony-v1-instancecontainer - failurePolicy: Fail - name: minstancecontainer.kb.io - rules: - - apiGroups: - - solution.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - instancecontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: @@ -2886,27 +2677,6 @@ webhooks: resources: - targets sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: '{{ include "symphony.fullname" . }}-webhook-service' - namespace: '{{ .Release.Namespace }}' - path: /validate-fabric-symphony-v1-targetcontainer - failurePolicy: Fail - name: vtargetcontainer.kb.io - rules: - - apiGroups: - - fabric.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - targetcontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: @@ -2927,27 +2697,6 @@ webhooks: resources: - instances sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: '{{ include "symphony.fullname" . }}-webhook-service' - namespace: '{{ .Release.Namespace }}' - path: /validate-solution-symphony-v1-instancecontainer - failurePolicy: Fail - name: vinstancecontainer.kb.io - rules: - - apiGroups: - - solution.symphony - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - instancecontainers - sideEffects: None - admissionReviewVersions: - v1 clientConfig: diff --git a/test/integration/lib/testhelpers/manifestbuilder.go b/test/integration/lib/testhelpers/manifestbuilder.go index a9ecbe829..b764c5925 100644 --- a/test/integration/lib/testhelpers/manifestbuilder.go +++ b/test/integration/lib/testhelpers/manifestbuilder.go @@ -263,56 +263,20 @@ func PatchInstance(data []byte, opts InstanceOptions) ([]byte, error) { return yaml.Marshal(instance) } -func PatchSolutionContainer(data []byte, opts InstanceOptions) ([]byte, error) { - var instanceContainer InstanceContainer - err := yaml.Unmarshal(data, &instanceContainer) +func PatchSolutionContainer(data []byte, opts ContainerOptions) ([]byte, error) { + var solutionContainer SolutionContainer + err := yaml.Unmarshal(data, &solutionContainer) if err != nil { return nil, err } if opts.Namespace != "" { - instanceContainer.Metadata.Namespace = opts.Namespace + solutionContainer.Metadata.Namespace = opts.Namespace } - if instanceContainer.Metadata.Annotations == nil { - instanceContainer.Metadata.Annotations = make(map[string]string) + if solutionContainer.Metadata.Annotations == nil { + solutionContainer.Metadata.Annotations = make(map[string]string) } - return yaml.Marshal(instanceContainer) -} - -func PatchTargetContainer(data []byte, opts InstanceOptions) ([]byte, error) { - var targetContainer TargetContainer - err := yaml.Unmarshal(data, &targetContainer) - if err != nil { - return nil, err - } - - if opts.Namespace != "" { - targetContainer.Metadata.Namespace = opts.Namespace - } - - if targetContainer.Metadata.Annotations == nil { - targetContainer.Metadata.Annotations = make(map[string]string) - } - - return yaml.Marshal(targetContainer) -} - -func PatchInstanceContainer(data []byte, opts InstanceOptions) ([]byte, error) { - var instanceContainer InstanceContainer - err := yaml.Unmarshal(data, &instanceContainer) - if err != nil { - return nil, err - } - - if opts.Namespace != "" { - instanceContainer.Metadata.Namespace = opts.Namespace - } - - if instanceContainer.Metadata.Annotations == nil { - instanceContainer.Metadata.Annotations = make(map[string]string) - } - - return yaml.Marshal(instanceContainer) + return yaml.Marshal(solutionContainer) } diff --git a/test/integration/lib/testhelpers/types.go b/test/integration/lib/testhelpers/types.go index 734c5a9e9..23ddce044 100644 --- a/test/integration/lib/testhelpers/types.go +++ b/test/integration/lib/testhelpers/types.go @@ -33,12 +33,11 @@ type ( } TargetSpec struct { - DisplayName string `yaml:"displayName"` - Scope string `yaml:"scope"` - Components []ComponentSpec `yaml:"components,omitempty"` - Topologies []Topology `yaml:"topologies"` - Properties map[string]string `yaml:"properties,omitempty"` - RootResource string `yaml:"rootResource"` + DisplayName string `yaml:"displayName"` + Scope string `yaml:"scope"` + Components []ComponentSpec `yaml:"components,omitempty"` + Topologies []Topology `yaml:"topologies"` + Properties map[string]string `yaml:"properties,omitempty"` } Topology struct { @@ -72,12 +71,11 @@ type ( } InstanceSpec struct { - DisplayName string `yaml:"displayName"` - Target TargetSelector `yaml:"target"` - Solution string `yaml:"solution"` - Scope string `yaml:"scope"` - Parameters map[string]interface{} `yaml:"parameters,omitempty"` - RootResource string `yaml:"rootResource"` + DisplayName string `yaml:"displayName"` + Target TargetSelector `yaml:"target"` + Solution string `yaml:"solution"` + Scope string `yaml:"scope"` + Parameters map[string]interface{} `yaml:"parameters,omitempty"` } TargetSelector struct { @@ -90,16 +88,6 @@ type ( DefaultValue interface{} `yaml:"default"` } - InstanceContainer struct { - ApiVersion string `yaml:"apiVersion"` - Kind string `yaml:"kind"` - Metadata Metadata `yaml:"metadata"` - Spec InstanceContainerSpec `yaml:"spec"` - } - - InstanceContainerSpec struct { - } - SolutionContainer struct { ApiVersion string `yaml:"apiVersion"` Kind string `yaml:"kind"` @@ -109,14 +97,4 @@ type ( SolutionContainerSpec struct { } - - TargetContainer struct { - ApiVersion string `yaml:"apiVersion"` - Kind string `yaml:"kind"` - Metadata Metadata `yaml:"metadata"` - Spec TargetContainerSpec `yaml:"spec"` - } - - TargetContainerSpec struct { - } ) diff --git a/test/integration/scenarios/01.update/manifestTemplates/oss/instance-container.yaml b/test/integration/scenarios/01.update/manifestTemplates/oss/instance-container.yaml deleted file mode 100644 index b39fde4e6..000000000 --- a/test/integration/scenarios/01.update/manifestTemplates/oss/instance-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: solution.symphony/v1 -kind: InstanceContainer -metadata: - name: instance -spec: diff --git a/test/integration/scenarios/01.update/manifestTemplates/oss/instance.yaml b/test/integration/scenarios/01.update/manifestTemplates/oss/instance.yaml index 41e1cfcdc..1e9418cb9 100755 --- a/test/integration/scenarios/01.update/manifestTemplates/oss/instance.yaml +++ b/test/integration/scenarios/01.update/manifestTemplates/oss/instance.yaml @@ -7,11 +7,10 @@ apiVersion: solution.symphony/v1 kind: Instance metadata: annotations: {} - name: instance-v1 + name: instance spec: - rootResource: instance - displayName: instance-v1 + displayName: instance scope: alice-springs solution: mysol:v1 target: - name: self:v1 + name: self diff --git a/test/integration/scenarios/01.update/manifestTemplates/oss/target-container.yaml b/test/integration/scenarios/01.update/manifestTemplates/oss/target-container.yaml deleted file mode 100644 index 8d545fa4d..000000000 --- a/test/integration/scenarios/01.update/manifestTemplates/oss/target-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: fabric.symphony/v1 -kind: TargetContainer -metadata: - name: self -spec: diff --git a/test/integration/scenarios/01.update/manifestTemplates/oss/target.yaml b/test/integration/scenarios/01.update/manifestTemplates/oss/target.yaml index d5105bfb3..3fa5b079b 100755 --- a/test/integration/scenarios/01.update/manifestTemplates/oss/target.yaml +++ b/test/integration/scenarios/01.update/manifestTemplates/oss/target.yaml @@ -6,10 +6,9 @@ apiVersion: fabric.symphony/v1 kind: Target metadata: - name: self-v1 + name: self annotations: {} spec: - rootResource: self displayName: int-virtual-02-v1 scope: alice-springs topologies: diff --git a/test/integration/scenarios/01.update/verify/manifest_test.go b/test/integration/scenarios/01.update/verify/manifest_test.go index 525b5972e..98a03786e 100644 --- a/test/integration/scenarios/01.update/verify/manifest_test.go +++ b/test/integration/scenarios/01.update/verify/manifest_test.go @@ -55,8 +55,6 @@ var ( var ( // Manifest templates containerManifestTemplates = map[string]string{ - "target-container": fmt.Sprintf("%s/%s/target-container.yaml", manifestTemplateFolder, "oss"), - "instance-container": fmt.Sprintf("%s/%s/instance-container.yaml", manifestTemplateFolder, "oss"), "solution-container": fmt.Sprintf("%s/%s/solution-container.yaml", manifestTemplateFolder, "oss"), } diff --git a/test/integration/scenarios/02.basic/magefile.go b/test/integration/scenarios/02.basic/magefile.go index 2f355be6b..bb7358ca8 100644 --- a/test/integration/scenarios/02.basic/magefile.go +++ b/test/integration/scenarios/02.basic/magefile.go @@ -35,8 +35,6 @@ var ( var ( // Manifests to deploy testManifests = []string{ - "manifest/%s/target-container.yaml", - "manifest/%s/instance-container.yaml", "manifest/%s/solution-container.yaml", "manifest/%s/target.yaml", "manifest/%s/instance.yaml", @@ -123,14 +121,12 @@ func DeployManifests(namespace string) error { return err } stringYaml := string(data) - stringYaml = strings.ReplaceAll(stringYaml, "INSTANCECONTAINERNAME", namespace+"instance") - stringYaml = strings.ReplaceAll(stringYaml, "TARGETCONTAINERNAME", namespace+"target") stringYaml = strings.ReplaceAll(stringYaml, "SOLUTIONCONTAINERNAME", namespace+"solution") - stringYaml = strings.ReplaceAll(stringYaml, "INSTANCENAME", namespace+"instance-v1") + stringYaml = strings.ReplaceAll(stringYaml, "INSTANCENAME", namespace+"instance") stringYaml = strings.ReplaceAll(stringYaml, "SCOPENAME", namespace+"scope") - stringYaml = strings.ReplaceAll(stringYaml, "TARGETNAME", namespace+"target-v1") + stringYaml = strings.ReplaceAll(stringYaml, "TARGETNAME", namespace+"target") stringYaml = strings.ReplaceAll(stringYaml, "SOLUTIONNAME", namespace+"solution-v1") - stringYaml = strings.ReplaceAll(stringYaml, "TARGETREFNAME", namespace+"target:v1") + stringYaml = strings.ReplaceAll(stringYaml, "TARGETREFNAME", namespace+"target") stringYaml = strings.ReplaceAll(stringYaml, "SOLUTIONREFNAME", namespace+"solution:v1") err = writeYamlStringsToFile(stringYaml, "./test.yaml") @@ -165,8 +161,8 @@ func Verify() error { } func CleanUpSymphonyObjects(namespace string) error { - instanceName := namespace + "instance-v1" - targetName := namespace + "target-v1" + instanceName := namespace + "instance" + targetName := namespace + "target" solutionName := namespace + "solution-v1" err := shellcmd.Command(fmt.Sprintf("kubectl delete instances.solution.symphony %s -n %s", instanceName, namespace)).Run() if err != nil { diff --git a/test/integration/scenarios/02.basic/manifest/oss/instance-container.yaml b/test/integration/scenarios/02.basic/manifest/oss/instance-container.yaml deleted file mode 100644 index 125593884..000000000 --- a/test/integration/scenarios/02.basic/manifest/oss/instance-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: solution.symphony/v1 -kind: InstanceContainer -metadata: - name: INSTANCECONTAINERNAME -spec: diff --git a/test/integration/scenarios/02.basic/manifest/oss/instance.yaml b/test/integration/scenarios/02.basic/manifest/oss/instance.yaml index bdfe5d449..f235f2776 100755 --- a/test/integration/scenarios/02.basic/manifest/oss/instance.yaml +++ b/test/integration/scenarios/02.basic/manifest/oss/instance.yaml @@ -9,7 +9,6 @@ metadata: annotations: {} name: INSTANCENAME spec: - rootResource: INSTANCECONTAINERNAME displayName: INSTANCENAME scope: SCOPENAME solution: SOLUTIONREFNAME diff --git a/test/integration/scenarios/02.basic/manifest/oss/target-container.yaml b/test/integration/scenarios/02.basic/manifest/oss/target-container.yaml deleted file mode 100644 index bd45b97fd..000000000 --- a/test/integration/scenarios/02.basic/manifest/oss/target-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: fabric.symphony/v1 -kind: TargetContainer -metadata: - name: TARGETCONTAINERNAME -spec: diff --git a/test/integration/scenarios/02.basic/manifest/oss/target.yaml b/test/integration/scenarios/02.basic/manifest/oss/target.yaml index 0750b1826..9f2dd0317 100755 --- a/test/integration/scenarios/02.basic/manifest/oss/target.yaml +++ b/test/integration/scenarios/02.basic/manifest/oss/target.yaml @@ -8,7 +8,6 @@ kind: Target metadata: name: TARGETNAME spec: - rootResource: TARGETCONTAINERNAME components: - name: observability properties: diff --git a/test/integration/scenarios/03.basicWithNsDelete/magefile.go b/test/integration/scenarios/03.basicWithNsDelete/magefile.go index c4dcdba30..25dc75be1 100644 --- a/test/integration/scenarios/03.basicWithNsDelete/magefile.go +++ b/test/integration/scenarios/03.basicWithNsDelete/magefile.go @@ -48,8 +48,6 @@ const ( var ( // Manifests to deploy testManifests = []string{ - "manifest/%s/target-container.yaml", - "manifest/%s/instance-container.yaml", "manifest/%s/solution-container.yaml", "manifest/%s/target.yaml", "manifest/%s/solution.yaml", diff --git a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/instance-container.yaml b/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/instance-container.yaml deleted file mode 100644 index acaa2c994..000000000 --- a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/instance-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: solution.symphony/v1 -kind: InstanceContainer -metadata: - name: instance03 -spec: diff --git a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/instance.yaml b/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/instance.yaml index 1c983e403..a7a34642c 100644 --- a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/instance.yaml +++ b/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/instance.yaml @@ -1,10 +1,9 @@ apiVersion: solution.symphony/v1 kind: Instance metadata: - name: instance03-v1 + name: instance03 spec: - rootResource: instance03 scope: k8s-scope solution: solution03:v1 target: - name: target03:v1 + name: target03 diff --git a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/target-container.yaml b/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/target-container.yaml deleted file mode 100644 index 34d44d1a3..000000000 --- a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/target-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: fabric.symphony/v1 -kind: TargetContainer -metadata: - name: target03 -spec: diff --git a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/target.yaml b/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/target.yaml index c6b2504c3..a3dd08624 100644 --- a/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/target.yaml +++ b/test/integration/scenarios/03.basicWithNsDelete/manifest/oss/target.yaml @@ -1,9 +1,8 @@ apiVersion: fabric.symphony/v1 kind: Target metadata: - name: target03-v1 + name: target03 spec: - rootResource: target03 forceRedeploy: true topologies: - bindings: diff --git a/test/integration/scenarios/03.basicWithNsDelete/verify/manifest_test.go b/test/integration/scenarios/03.basicWithNsDelete/verify/manifest_test.go index 0388f3c41..b33a9bd49 100644 --- a/test/integration/scenarios/03.basicWithNsDelete/verify/manifest_test.go +++ b/test/integration/scenarios/03.basicWithNsDelete/verify/manifest_test.go @@ -129,7 +129,7 @@ func TestBasic_InstanceDeletion(t *testing.T) { fmt.Println("Get namespace before deletion: ", len(namespacesBefore.Items)) // Run a mage command to delete instance - execCmd := exec.Command("sh", "-c", "cd ../../../../localenv && mage remove instances.solution.symphony instance03-v1") + execCmd := exec.Command("sh", "-c", "cd ../../../../localenv && mage remove instances.solution.symphony instance03") execCmd.Stdout = os.Stdout execCmd.Stderr = os.Stderr cmdErr := execCmd.Run() diff --git a/test/integration/scenarios/04.workflow/manifest/instance-catalog.yaml b/test/integration/scenarios/04.workflow/manifest/instance-catalog.yaml index 87d98dd9e..8dc086db8 100644 --- a/test/integration/scenarios/04.workflow/manifest/instance-catalog.yaml +++ b/test/integration/scenarios/04.workflow/manifest/instance-catalog.yaml @@ -7,7 +7,7 @@ spec: catalogType: instance properties: metadata: - name: siteinstance:v1 + name: siteinstance spec: solution: siteapp:v1 scope: SCOPENAME diff --git a/test/integration/scenarios/04.workflow/manifest/target-catalog.yaml b/test/integration/scenarios/04.workflow/manifest/target-catalog.yaml index 59b7de3d4..375ee0bca 100644 --- a/test/integration/scenarios/04.workflow/manifest/target-catalog.yaml +++ b/test/integration/scenarios/04.workflow/manifest/target-catalog.yaml @@ -7,7 +7,7 @@ spec: catalogType: target properties: metadata: - name: sitek8starget:v1 + name: sitek8starget spec: properties: group: site diff --git a/test/integration/scenarios/04.workflow/verify/manifest_test.go b/test/integration/scenarios/04.workflow/verify/manifest_test.go index 58ecb9b72..88f447cdd 100644 --- a/test/integration/scenarios/04.workflow/verify/manifest_test.go +++ b/test/integration/scenarios/04.workflow/verify/manifest_test.go @@ -212,24 +212,12 @@ func TestAdvance_TargetLabel(t *testing.T) { Group: "fabric.symphony", Version: "v1", Resource: "targets", - }).Namespace(namespace).Get(context.Background(), "sitek8starget-v1", metav1.GetOptions{}) + }).Namespace(namespace).Get(context.Background(), "sitek8starget", metav1.GetOptions{}) require.NoError(t, err) result := getLabels(*resource) fmt.Printf("The target is labeled with: %s\n", result) require.Equal(t, expectedResult, result) - - resource, err = dyn.Resource(schema.GroupVersionResource{ - Group: "fabric.symphony", - Version: "v1", - Resource: "targetcontainers", - }).Namespace(namespace).Get(context.Background(), "sitek8starget", metav1.GetOptions{}) - require.NoError(t, err) - - result = getLabels(*resource) - fmt.Printf("The target container is labeled with: %s\n", result) - require.Equal(t, expectedResult, result) - } // Verify instance has correct status @@ -290,23 +278,12 @@ func TestAdvance_InstanceLabel(t *testing.T) { Group: "solution.symphony", Version: "v1", Resource: "instances", - }).Namespace(namespace).Get(context.Background(), "siteinstance-v1", metav1.GetOptions{}) + }).Namespace(namespace).Get(context.Background(), "siteinstance", metav1.GetOptions{}) require.NoError(t, err) result := getLabels(*resource) fmt.Printf("The instance is labeled with: %s\n", result) require.Equal(t, expectedResult, result) - - resource, err = dyn.Resource(schema.GroupVersionResource{ - Group: "solution.symphony", - Version: "v1", - Resource: "instancecontainers", - }).Namespace(namespace).Get(context.Background(), "siteinstance", metav1.GetOptions{}) - require.NoError(t, err) - - result = getLabels(*resource) - fmt.Printf("The instance container is labeled with: %s\n", result) - require.Equal(t, expectedResult, result) } // Verify solution has correct labels diff --git a/test/integration/scenarios/05.catalog/catalogs/instance.yaml b/test/integration/scenarios/05.catalog/catalogs/instance.yaml index e05fa705b..8d8636789 100644 --- a/test/integration/scenarios/05.catalog/catalogs/instance.yaml +++ b/test/integration/scenarios/05.catalog/catalogs/instance.yaml @@ -7,7 +7,7 @@ spec: catalogType: instance properties: metadata: - name: instance:v1 + name: instance spec: solution: app:v1 target: diff --git a/test/integration/scenarios/05.catalog/catalogs/target.yaml b/test/integration/scenarios/05.catalog/catalogs/target.yaml index d6d228885..2276313e6 100644 --- a/test/integration/scenarios/05.catalog/catalogs/target.yaml +++ b/test/integration/scenarios/05.catalog/catalogs/target.yaml @@ -7,7 +7,7 @@ spec: catalogType: target properties: metadata: - name: target:v1 + name: target spec: properties: group: site diff --git a/test/integration/scenarios/06.ado/create_update_fallback_test.go b/test/integration/scenarios/06.ado/create_update_fallback_test.go index 7080840b6..24a5a8117 100644 --- a/test/integration/scenarios/06.ado/create_update_fallback_test.go +++ b/test/integration/scenarios/06.ado/create_update_fallback_test.go @@ -28,8 +28,6 @@ var _ = Describe("Create/update resources for rollback testing", Ordered, func() var targetBytes []byte var solutionBytes []byte var solutionBytesV2 []byte - var instanceContainerBytes []byte - var targetContainerBytes []byte var solutionContainerBytes []byte var targetProps map[string]string @@ -58,23 +56,11 @@ var _ = Describe("Create/update resources for rollback testing", Ordered, func() var err error By("deploy solution container") - solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.InstanceOptions{}) + solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.ContainerOptions{}) Expect(err).ToNot(HaveOccurred()) err = shell.PipeInExec(ctx, "kubectl apply -f -", solutionContainerBytes) Expect(err).ToNot(HaveOccurred()) - By("deploy target container") - targetContainerBytes, err = testhelpers.PatchTargetContainer(defaultTargetContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", targetContainerBytes) - Expect(err).ToNot(HaveOccurred()) - - By("deploy instance container") - instanceContainerBytes, err = testhelpers.PatchInstanceContainer(defaultInstanceContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", instanceContainerBytes) - Expect(err).ToNot(HaveOccurred()) - By("setting the components for the target") props := targetProps if testcase.TargetProperties != nil { @@ -155,7 +141,7 @@ var _ = Describe("Create/update resources for rollback testing", Ordered, func() SolutionComponents: []string{"simple-chart-2"}, SolutionComponentsV2: []string{"simple-chart-2-nonexistent"}, PostUpdateExpectation: expectations.All( - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningFailedCondition, // and it is failed //jq.Equality(".status.provisioningStatus.error.details[0].details[0].code", "Update Failed"), )))), diff --git a/test/integration/scenarios/06.ado/create_update_test.go b/test/integration/scenarios/06.ado/create_update_test.go index 455ee7a64..6ba2fddbf 100644 --- a/test/integration/scenarios/06.ado/create_update_test.go +++ b/test/integration/scenarios/06.ado/create_update_test.go @@ -30,8 +30,6 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { var instanceBytes []byte var targetBytes []byte var solutionBytes []byte - var instanceContainerBytes []byte - var targetContainerBytes []byte var solutionContainerBytes []byte var specTimeout = 120 * time.Second var targetProps map[string]string @@ -62,23 +60,11 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { var err error By("deploy solution container") - solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.InstanceOptions{}) + solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.ContainerOptions{}) Expect(err).ToNot(HaveOccurred()) err = shell.PipeInExec(ctx, "kubectl apply -f -", solutionContainerBytes) Expect(err).ToNot(HaveOccurred()) - By("deploy target container") - targetContainerBytes, err = testhelpers.PatchTargetContainer(defaultTargetContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", targetContainerBytes) - Expect(err).ToNot(HaveOccurred()) - - By("deploy instance container") - instanceContainerBytes, err = testhelpers.PatchInstanceContainer(defaultInstanceContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", instanceContainerBytes) - Expect(err).ToNot(HaveOccurred()) - By("setting the components for the target") props := targetProps params := instanceParams @@ -141,7 +127,7 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1"}, SolutionComponents: []string{}, Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", "Updated"), // and the target component 'simple-chart-1' status is updated. OSS has no provisioning status yet @@ -158,12 +144,12 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1"}, // (same as previous entry) SolutionComponents: []string{"simple-chart-2"}, Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", nil), // Because nothing changed, the output should be nil )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-2", "Updated"), // and the solution component 'simple-chart-2' is created @@ -185,12 +171,12 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1"}, // (same as previous entry) SolutionComponents: []string{"simple-chart-2", "basic-configmap-1"}, // Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", nil), // Because the component didn't change )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-2", nil), // Because the component didn't change @@ -211,13 +197,13 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1", "basic-clusterrole"}, // SolutionComponents: []string{"simple-chart-2", "basic-configmap-1"}, // (same as previous entry) Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", nil), // Because the component didn't change //kube.ProvisioningStatusComponentOutput("target.basic-clusterrole", "Updated"), // and the target component 'basic-clusterrole' is created )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-2", nil), // Because the component didn't change @@ -239,13 +225,13 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1", "basic-clusterrole"}, // (same as previous entry) SolutionComponents: []string{"simple-chart-2", "basic-configmap-1"}, // (same as previous entry) Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", nil), // Because the component didn't change //kube.ProvisioningStatusComponentOutput("target.basic-clusterrole", nil), // Because the component didn't change )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-2", nil), // Because the component didn't change @@ -267,13 +253,13 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1"}, SolutionComponents: []string{"simple-chart-2", "basic-configmap-1"}, // (same as previous entry) Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned ////kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", nil), // Because the component didn't change //kube.ProvisioningStatusComponentOutput("target.basic-clusterrole", "Deleted"), // and the target component 'basic-clusterrole' is deleted )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned //kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-2", nil), // Because the component didn't change @@ -295,13 +281,13 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1"}, // (same as previous entry) SolutionComponents: []string{"basic-configmap-1"}, Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned //kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", nil), // Because the component didn't change //kube.ProvisioningStatusComponentOutput("target.basic-clusterrole", nil), // Because it was deleted in the previous reconciliation )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned //kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-2", "Deleted"), // and the solution component 'simple-chart-2' is deleted @@ -324,12 +310,12 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1"}, // (same as previous entry) SolutionComponents: []string{"basic-configmap-1-modified"}, // (same as previous entry but with new data) Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned //kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-chart-1", nil), // Because the component didn't change )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned //kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.basic-configmap-1", "Updated"), // and the solution component 'basic-configmap-1' is updated @@ -356,7 +342,7 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1-nonexistent"}, // SolutionComponents: []string{"basic-configmap-1-modified"}, // (same as previous entry) Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningFailedCondition, // and it is failed //jq.Equality(".status.provisioningStatus.error.details[0].code", "Update Failed"), //jq.Equality(".status.provisioningStatus.error.details[0].target", "simple-chart-1"), @@ -372,12 +358,12 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-chart-1-nonexistent"}, // (same as previous entry) SolutionComponents: []string{"simple-chart-2-nonexistent"}, // Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningFailedCondition, // and it is failed //jq.Equality(".status.provisioningStatus.error.details[0].code", "Update Failed"), //jq.Equality(".status.provisioningStatus.error.details[0].target", "simple-chart-1"), )))), - kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance-v1' is present in the 'default' namespace + kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( // make sure the instance named 'instance' is present in the 'default' namespace kube.ProvisioningFailedCondition, // and it is failed //jq.Equality(".status.provisioningStatus.error.details[0].details[0].code", "Update Failed"), //jq.Equality(".status.provisioningStatus.error.details[0].details[0].target", "simple-chart-2"), @@ -391,7 +377,7 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-http"}, SolutionComponents: []string{}, Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningSucceededCondition, // and it is successfully provisioned //kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-http", "Updated"), // and the target component 'simple-http' status is updated @@ -406,7 +392,7 @@ var _ = Describe("Create resources with sequential changes", Ordered, func() { TargetComponents: []string{"simple-http-invalid-url"}, SolutionComponents: []string{}, Expectation: expectations.All( - kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( // make sure the target named 'target-v1' is present in the 'default' namespace + kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( // make sure the target named 'target' is present in the 'default' namespace kube.ProvisioningFailedCondition, // and it is failed //kube.OperationIdMatchCondition, // and the status operation id matches the metadata operation id //kube.ProvisioningStatusComponentOutput("target.simple-http", nil), // and the target component 'simple-http-invalid-url' status is failed to update diff --git a/test/integration/scenarios/06.ado/delete_test.go b/test/integration/scenarios/06.ado/delete_test.go index 79b295ec5..504435a6c 100644 --- a/test/integration/scenarios/06.ado/delete_test.go +++ b/test/integration/scenarios/06.ado/delete_test.go @@ -19,8 +19,6 @@ var _ = Describe("Delete", Ordered, func() { var instanceBytes []byte var targetBytes []byte var solutionBytes []byte - var instanceContainerBytes []byte - var targetContainerBytes []byte var solutionContainerBytes []byte var specTimeout = 2 * time.Minute @@ -59,23 +57,11 @@ var _ = Describe("Delete", Ordered, func() { var err error By("deploy solution container") - solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.InstanceOptions{}) + solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.ContainerOptions{}) Expect(err).ToNot(HaveOccurred()) err = shell.PipeInExec(ctx, "kubectl apply -f -", solutionContainerBytes) Expect(err).ToNot(HaveOccurred()) - By("deploy target container") - targetContainerBytes, err = testhelpers.PatchTargetContainer(defaultTargetContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", targetContainerBytes) - Expect(err).ToNot(HaveOccurred()) - - By("deploy instance container") - instanceContainerBytes, err = testhelpers.PatchInstanceContainer(defaultInstanceContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", instanceContainerBytes) - Expect(err).ToNot(HaveOccurred()) - By("setting the components for the target") targetBytes, err = testhelpers.PatchTarget(defaultTargetManifest, testhelpers.TargetOptions{ ComponentNames: testcase.TargetComponents, diff --git a/test/integration/scenarios/06.ado/manifest/instance-container.yaml b/test/integration/scenarios/06.ado/manifest/instance-container.yaml deleted file mode 100644 index b39fde4e6..000000000 --- a/test/integration/scenarios/06.ado/manifest/instance-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: solution.symphony/v1 -kind: InstanceContainer -metadata: - name: instance -spec: diff --git a/test/integration/scenarios/06.ado/manifest/instance.yaml b/test/integration/scenarios/06.ado/manifest/instance.yaml index 3c9785016..67e7936c4 100644 --- a/test/integration/scenarios/06.ado/manifest/instance.yaml +++ b/test/integration/scenarios/06.ado/manifest/instance.yaml @@ -1,10 +1,9 @@ apiVersion: solution.symphony/v1 kind: Instance metadata: - name: instance-v1 + name: instance spec: - rootResource: instance target: - name: target:v1 + name: target solution: solution:v1 scope: azure-iot-operations diff --git a/test/integration/scenarios/06.ado/manifest/target-container.yaml b/test/integration/scenarios/06.ado/manifest/target-container.yaml deleted file mode 100644 index 225b43e66..000000000 --- a/test/integration/scenarios/06.ado/manifest/target-container.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: fabric.symphony/v1 -kind: TargetContainer -metadata: - name: target -spec: diff --git a/test/integration/scenarios/06.ado/manifest/target.yaml b/test/integration/scenarios/06.ado/manifest/target.yaml index 7aecc30b4..2b36d6f17 100644 --- a/test/integration/scenarios/06.ado/manifest/target.yaml +++ b/test/integration/scenarios/06.ado/manifest/target.yaml @@ -1,9 +1,8 @@ apiVersion: fabric.symphony/v1 kind: Target metadata: - name: target-v1 + name: target spec: - rootResource: target scope: azure-iot-operations components: [] topologies: diff --git a/test/integration/scenarios/06.ado/rbac_test.go b/test/integration/scenarios/06.ado/rbac_test.go index 269b61256..6c4a960fb 100644 --- a/test/integration/scenarios/06.ado/rbac_test.go +++ b/test/integration/scenarios/06.ado/rbac_test.go @@ -30,8 +30,6 @@ var _ = Describe("RBAC", Ordered, func() { var instanceBytes []byte var targetBytes []byte var solutionBytes []byte - var instanceContainerBytes []byte - var targetContainerBytes []byte var solutionContainerBytes []byte var specTimeout = 3 * time.Minute var installValues HelmValues @@ -39,23 +37,11 @@ var _ = Describe("RBAC", Ordered, func() { var err error By("deploy solution container") - solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.InstanceOptions{}) + solutionContainerBytes, err = testhelpers.PatchSolutionContainer(defaultSolutionContainerManifest, testhelpers.ContainerOptions{}) Expect(err).ToNot(HaveOccurred()) err = shell.PipeInExec(ctx, "kubectl apply -f -", solutionContainerBytes) Expect(err).ToNot(HaveOccurred()) - By("deploy target container") - targetContainerBytes, err = testhelpers.PatchTargetContainer(defaultTargetContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", targetContainerBytes) - Expect(err).ToNot(HaveOccurred()) - - By("deploy instance container") - instanceContainerBytes, err = testhelpers.PatchInstanceContainer(defaultInstanceContainerManifest, testhelpers.InstanceOptions{}) - Expect(err).ToNot(HaveOccurred()) - err = shell.PipeInExec(ctx, "kubectl apply -f -", instanceContainerBytes) - Expect(err).ToNot(HaveOccurred()) - By("setting the components for the target and scope") targetBytes, err = testhelpers.PatchTarget(defaultTargetManifest, testhelpers.TargetOptions{ ComponentNames: testcase.TargetComponents, diff --git a/test/integration/scenarios/06.ado/suite_test.go b/test/integration/scenarios/06.ado/suite_test.go index 45265e4c4..1fe5252c9 100644 --- a/test/integration/scenarios/06.ado/suite_test.go +++ b/test/integration/scenarios/06.ado/suite_test.go @@ -24,37 +24,31 @@ var defaultTargetManifest []byte //go:embed manifest/solution.yaml var defaultSolutionManifest []byte -//go:embed manifest/instance-container.yaml -var defaultInstanceContainerManifest []byte - -//go:embed manifest/target-container.yaml -var defaultTargetContainerManifest []byte - //go:embed manifest/solution-container.yaml var defaultSolutionContainerManifest []byte -var successfullTargetExpectation = kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( +var successfullTargetExpectation = kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( kube.ProvisioningSucceededCondition, //kube.OperationIdMatchCondition, )))) -var successfullInstanceExpectation = kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( +var successfullInstanceExpectation = kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( kube.ProvisioningSucceededCondition, //kube.OperationIdMatchCondition, )))) -var failedTargetExpectation = kube.Must(kube.Target("target-v1", "default", kube.WithCondition(conditions.All( +var failedTargetExpectation = kube.Must(kube.Target("target", "default", kube.WithCondition(conditions.All( kube.ProvisioningFailedCondition, //kube.OperationIdMatchCondition, )))) -var failedInstanceExpectation = kube.Must(kube.Instance("instance-v1", "default", kube.WithCondition(conditions.All( +var failedInstanceExpectation = kube.Must(kube.Instance("instance", "default", kube.WithCondition(conditions.All( kube.ProvisioningFailedCondition, //kube.OperationIdMatchCondition, )))) -var absentInstanceExpectation = kube.Must(kube.AbsentInstance("instance-v1", "default")) -var absentTargetExpectation = kube.Must(kube.AbsentTarget("target-v1", "default")) +var absentInstanceExpectation = kube.Must(kube.AbsentInstance("instance", "default")) +var absentTargetExpectation = kube.Must(kube.AbsentTarget("target", "default")) var _ = BeforeSuite(func(ctx context.Context) { // err := shell.LocalenvCmd(ctx, "mage cluster:load")