mirror of
https://github.com/kubevela/kubevela.git
synced 2026-03-05 19:22:03 +00:00
* Feat: ref component Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: support topology and override Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: add support for external policy and workflow Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: add admission control Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: disable cross namespace ref object Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Chore: refactor Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: support labelSelector in ref-objects Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: add pre approve for deploy step Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Chore: refactor Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: test Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: support comp/trait type in override policy even not used by prototype Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: support regex match for patch component name Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: labelSelector not work for cluster Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: ref workflow contains external policy Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: revision test Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: parallel apply components Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: add test for oam provider Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: service ref-comp & indirect trait ns Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: align namespace setting for chart Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: add strict unmarshal and reformat Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: merge with cluster rework Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: patch trait-def Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: apply components + load dynamic component Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: add test for loadPoliciesInOrder Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Feat: add test for open merge Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: reformat & add test for step generator Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: add test for parse override policy related defs Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: add test for multicluster provider (expandTopology and overrideConfiguration) Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: add admission test Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: revert trait status pass in component status Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: add test for dependency in workflowstep & standalone multicluster test Signed-off-by: Somefive <yd219913@alibaba-inc.com> * Fix: add check for ref and steps in WorkflowStep & enhance ref-objects scheme check Signed-off-by: Somefive <yd219913@alibaba-inc.com>
127 lines
4.4 KiB
Go
127 lines
4.4 KiB
Go
/*
|
|
Copyright 2021 The KubeVela Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package resourcekeeper
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
|
|
"github.com/pkg/errors"
|
|
v1 "k8s.io/api/apps/v1"
|
|
v12 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
|
|
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha1"
|
|
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
|
"github.com/oam-dev/kubevela/pkg/multicluster"
|
|
"github.com/oam-dev/kubevela/pkg/oam"
|
|
"github.com/oam-dev/kubevela/pkg/policy"
|
|
"github.com/oam-dev/kubevela/pkg/resourcetracker"
|
|
"github.com/oam-dev/kubevela/pkg/utils/apply"
|
|
)
|
|
|
|
// ResourceKeeper handler for dispatching and deleting resources
|
|
type ResourceKeeper interface {
|
|
Dispatch(context.Context, []*unstructured.Unstructured, ...DispatchOption) error
|
|
Delete(context.Context, []*unstructured.Unstructured, ...DeleteOption) error
|
|
GarbageCollect(context.Context, ...GCOption) (bool, []v1beta1.ManagedResource, error)
|
|
StateKeep(context.Context) error
|
|
|
|
DispatchComponentRevision(context.Context, *v1.ControllerRevision) error
|
|
DeleteComponentRevision(context.Context, *v1.ControllerRevision) error
|
|
}
|
|
|
|
type resourceKeeper struct {
|
|
client.Client
|
|
app *v1beta1.Application
|
|
mu sync.Mutex
|
|
|
|
applicator apply.Applicator
|
|
_rootRT *v1beta1.ResourceTracker
|
|
_currentRT *v1beta1.ResourceTracker
|
|
_historyRTs []*v1beta1.ResourceTracker
|
|
_crRT *v1beta1.ResourceTracker
|
|
|
|
applyOncePolicy *v1alpha1.ApplyOncePolicySpec
|
|
garbageCollectPolicy *v1alpha1.GarbageCollectPolicySpec
|
|
|
|
cache *resourceCache
|
|
}
|
|
|
|
func (h *resourceKeeper) getRootRT(ctx context.Context) (rootRT *v1beta1.ResourceTracker, err error) {
|
|
if h._rootRT == nil {
|
|
if h._rootRT, err = resourcetracker.CreateRootResourceTracker(multicluster.ContextInLocalCluster(ctx), h.Client, h.app); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return h._rootRT, nil
|
|
}
|
|
|
|
func (h *resourceKeeper) getCurrentRT(ctx context.Context) (currentRT *v1beta1.ResourceTracker, err error) {
|
|
if h._currentRT == nil {
|
|
if h._currentRT, err = resourcetracker.CreateCurrentResourceTracker(multicluster.ContextInLocalCluster(ctx), h.Client, h.app); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return h._currentRT, nil
|
|
}
|
|
|
|
func (h *resourceKeeper) getComponentRevisionRT(ctx context.Context) (crRT *v1beta1.ResourceTracker, err error) {
|
|
if h._crRT == nil {
|
|
if h._crRT, err = resourcetracker.CreateComponentRevisionResourceTracker(multicluster.ContextInLocalCluster(ctx), h.Client, h.app); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return h._crRT, nil
|
|
}
|
|
|
|
func (h *resourceKeeper) parseApplicationResourcePolicy() (err error) {
|
|
if h.applyOncePolicy, err = policy.ParseApplyOncePolicy(h.app); err != nil {
|
|
return errors.Wrapf(err, "failed to parse apply-once policy")
|
|
}
|
|
if h.applyOncePolicy == nil && v12.HasLabel(h.app.ObjectMeta, oam.LabelAddonName) {
|
|
h.applyOncePolicy = &v1alpha1.ApplyOncePolicySpec{Enable: true}
|
|
}
|
|
if h.garbageCollectPolicy, err = policy.ParseGarbageCollectPolicy(h.app); err != nil {
|
|
return errors.Wrapf(err, "failed to parse garbage-collect policy")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (h *resourceKeeper) loadResourceTrackers(ctx context.Context) (err error) {
|
|
h._rootRT, h._currentRT, h._historyRTs, h._crRT, err = resourcetracker.ListApplicationResourceTrackers(multicluster.ContextInLocalCluster(ctx), h.Client, h.app)
|
|
return err
|
|
}
|
|
|
|
// NewResourceKeeper create a handler for dispatching and deleting resources
|
|
func NewResourceKeeper(ctx context.Context, cli client.Client, app *v1beta1.Application) (_ ResourceKeeper, err error) {
|
|
h := &resourceKeeper{
|
|
Client: cli,
|
|
app: app,
|
|
applicator: apply.NewAPIApplicator(cli),
|
|
cache: newResourceCache(cli),
|
|
}
|
|
if err = h.loadResourceTrackers(ctx); err != nil {
|
|
return nil, errors.Wrapf(err, "failed to load resourcetrackers")
|
|
}
|
|
if err = h.parseApplicationResourcePolicy(); err != nil {
|
|
return nil, errors.Wrapf(err, "failed to parse resource policy")
|
|
}
|
|
return h, nil
|
|
}
|