blob: 62452fa725c4e6e82de80f30be64b17d3bbc8ce5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 manager
import (
"context"
)
import (
"github.com/apache/dubbo-kubernetes/pkg/core/resources/model"
"github.com/apache/dubbo-kubernetes/pkg/core/resources/store"
)
type ResourceManagerWrapper = func(delegate ResourceManager) ResourceManager
type CustomizableResourceManager interface {
ResourceManager
Customize(model.ResourceType, ResourceManager)
ResourceManager(model.ResourceType) ResourceManager
WrapAll(ResourceManagerWrapper)
}
func NewCustomizableResourceManager(defaultManager ResourceManager, customManagers map[model.ResourceType]ResourceManager) CustomizableResourceManager {
if customManagers == nil {
customManagers = map[model.ResourceType]ResourceManager{}
}
return &customizableResourceManager{
defaultManager: defaultManager,
customManagers: customManagers,
}
}
var _ CustomizableResourceManager = &customizableResourceManager{}
type customizableResourceManager struct {
defaultManager ResourceManager
customManagers map[model.ResourceType]ResourceManager
}
// Customize installs a new manager for the given type, overwriting any
// existing manager for that type.
func (m *customizableResourceManager) Customize(resourceType model.ResourceType, manager ResourceManager) {
m.customManagers[resourceType] = manager
}
func (m *customizableResourceManager) Get(ctx context.Context, resource model.Resource, fs ...store.GetOptionsFunc) error {
return m.ResourceManager(resource.Descriptor().Name).Get(ctx, resource, fs...)
}
func (m *customizableResourceManager) List(ctx context.Context, list model.ResourceList, fs ...store.ListOptionsFunc) error {
return m.ResourceManager(list.GetItemType()).List(ctx, list, fs...)
}
func (m *customizableResourceManager) Create(ctx context.Context, resource model.Resource, fs ...store.CreateOptionsFunc) error {
return m.ResourceManager(resource.Descriptor().Name).Create(ctx, resource, fs...)
}
func (m *customizableResourceManager) Delete(ctx context.Context, resource model.Resource, fs ...store.DeleteOptionsFunc) error {
return m.ResourceManager(resource.Descriptor().Name).Delete(ctx, resource, fs...)
}
func (m *customizableResourceManager) DeleteAll(ctx context.Context, list model.ResourceList, fs ...store.DeleteAllOptionsFunc) error {
return m.ResourceManager(list.GetItemType()).DeleteAll(ctx, list, fs...)
}
func (m *customizableResourceManager) Update(ctx context.Context, resource model.Resource, fs ...store.UpdateOptionsFunc) error {
return m.ResourceManager(resource.Descriptor().Name).Update(ctx, resource, fs...)
}
func (m *customizableResourceManager) ResourceManager(typ model.ResourceType) ResourceManager {
if customManager, ok := m.customManagers[typ]; ok {
return customManager
}
return m.defaultManager
}
func (m *customizableResourceManager) WrapAll(wrapper ResourceManagerWrapper) {
m.defaultManager = wrapper(m.defaultManager)
for key, manager := range m.customManagers {
m.customManagers[key] = wrapper(manager)
}
}