123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /*
- Copyright 2018 The Kubernetes 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 framework
- import (
- "fmt"
- "os"
- "sync"
- "github.com/pkg/errors"
- "k8s.io/api/core/v1"
- clientset "k8s.io/client-go/kubernetes"
- )
- // Factory is a func which operates provider specific behavior.
- type Factory func() (ProviderInterface, error)
- var (
- providers = make(map[string]Factory)
- mutex sync.Mutex
- )
- // RegisterProvider is expected to be called during application init,
- // typically by an init function in a provider package.
- func RegisterProvider(name string, factory Factory) {
- mutex.Lock()
- defer mutex.Unlock()
- if _, ok := providers[name]; ok {
- panic(fmt.Sprintf("provider %s already registered", name))
- }
- providers[name] = factory
- }
- // GetProviders returns the names of all currently registered providers.
- func GetProviders() []string {
- mutex.Lock()
- defer mutex.Unlock()
- var providerNames []string
- for name := range providers {
- providerNames = append(providerNames, name)
- }
- return providerNames
- }
- func init() {
- // "local" or "skeleton" can always be used.
- RegisterProvider("local", func() (ProviderInterface, error) {
- return NullProvider{}, nil
- })
- RegisterProvider("skeleton", func() (ProviderInterface, error) {
- return NullProvider{}, nil
- })
- // The empty string used to be accepted in the past, but is not
- // a valid value anymore.
- }
- // SetupProviderConfig validates the chosen provider and creates
- // an interface instance for it.
- func SetupProviderConfig(providerName string) (ProviderInterface, error) {
- var err error
- mutex.Lock()
- defer mutex.Unlock()
- factory, ok := providers[providerName]
- if !ok {
- return nil, errors.Wrapf(os.ErrNotExist, "The provider %s is unknown.", providerName)
- }
- provider, err := factory()
- return provider, err
- }
- // ProviderInterface contains the implementation for certain
- // provider-specific functionality.
- type ProviderInterface interface {
- FrameworkBeforeEach(f *Framework)
- FrameworkAfterEach(f *Framework)
- ResizeGroup(group string, size int32) error
- GetGroupNodes(group string) ([]string, error)
- GroupSize(group string) (int, error)
- DeleteNode(node *v1.Node) error
- CreatePD(zone string) (string, error)
- DeletePD(pdName string) error
- CreatePVSource(zone, diskName string) (*v1.PersistentVolumeSource, error)
- DeletePVSource(pvSource *v1.PersistentVolumeSource) error
- CleanupServiceResources(c clientset.Interface, loadBalancerName, region, zone string)
- EnsureLoadBalancerResourcesDeleted(ip, portRange string) error
- LoadBalancerSrcRanges() []string
- EnableAndDisableInternalLB() (enable, disable func(svc *v1.Service))
- }
- // NullProvider is the default implementation of the ProviderInterface
- // which doesn't do anything.
- type NullProvider struct{}
- // FrameworkBeforeEach is a base implementation which does BeforeEach.
- func (n NullProvider) FrameworkBeforeEach(f *Framework) {}
- // FrameworkAfterEach is a base implementation which does AfterEach.
- func (n NullProvider) FrameworkAfterEach(f *Framework) {}
- // ResizeGroup is a base implementation which resizes group.
- func (n NullProvider) ResizeGroup(string, int32) error {
- return fmt.Errorf("Provider does not support InstanceGroups")
- }
- // GetGroupNodes is a base implementation which returns group nodes.
- func (n NullProvider) GetGroupNodes(group string) ([]string, error) {
- return nil, fmt.Errorf("provider does not support InstanceGroups")
- }
- // GroupSize returns the size of an instance group
- func (n NullProvider) GroupSize(group string) (int, error) {
- return -1, fmt.Errorf("provider does not support InstanceGroups")
- }
- // DeleteNode is a base implementation which deletes a node.
- func (n NullProvider) DeleteNode(node *v1.Node) error {
- return fmt.Errorf("provider does not support DeleteNode")
- }
- // CreatePD is a base implementation which creates PD.
- func (n NullProvider) CreatePD(zone string) (string, error) {
- return "", fmt.Errorf("provider does not support volume creation")
- }
- // DeletePD is a base implementation which deletes PD.
- func (n NullProvider) DeletePD(pdName string) error {
- return fmt.Errorf("provider does not support volume deletion")
- }
- // CreatePVSource is a base implementation which creates PV source.
- func (n NullProvider) CreatePVSource(zone, diskName string) (*v1.PersistentVolumeSource, error) {
- return nil, fmt.Errorf("Provider not supported")
- }
- // DeletePVSource is a base implementation which deletes PV source.
- func (n NullProvider) DeletePVSource(pvSource *v1.PersistentVolumeSource) error {
- return fmt.Errorf("Provider not supported")
- }
- // CleanupServiceResources is a base implementation which cleans up service resources.
- func (n NullProvider) CleanupServiceResources(c clientset.Interface, loadBalancerName, region, zone string) {
- }
- // EnsureLoadBalancerResourcesDeleted is a base implementation which ensures load balancer is deleted.
- func (n NullProvider) EnsureLoadBalancerResourcesDeleted(ip, portRange string) error {
- return nil
- }
- // LoadBalancerSrcRanges is a base implementation which returns the ranges of ips used by load balancers.
- func (n NullProvider) LoadBalancerSrcRanges() []string {
- return nil
- }
- // EnableAndDisableInternalLB is a base implementation which returns functions for enabling/disabling an internal LB.
- func (n NullProvider) EnableAndDisableInternalLB() (enable, disable func(svc *v1.Service)) {
- nop := func(svc *v1.Service) {}
- return nop, nop
- }
- var _ ProviderInterface = NullProvider{}
|