1
16
17 package framework
18
19 import (
20 "context"
21 "fmt"
22 "os"
23 "sync"
24
25 v1 "k8s.io/api/core/v1"
26 clientset "k8s.io/client-go/kubernetes"
27 )
28
29
30 type Factory func() (ProviderInterface, error)
31
32 var (
33 providers = make(map[string]Factory)
34 mutex sync.Mutex
35 )
36
37
38
39 func RegisterProvider(name string, factory Factory) {
40 mutex.Lock()
41 defer mutex.Unlock()
42 if _, ok := providers[name]; ok {
43 panic(fmt.Sprintf("provider %s already registered", name))
44 }
45 providers[name] = factory
46 }
47
48
49 func GetProviders() []string {
50 mutex.Lock()
51 defer mutex.Unlock()
52 var providerNames []string
53 for name := range providers {
54 providerNames = append(providerNames, name)
55 }
56 return providerNames
57 }
58
59 func init() {
60
61 RegisterProvider("local", func() (ProviderInterface, error) {
62 return NullProvider{}, nil
63 })
64 RegisterProvider("skeleton", func() (ProviderInterface, error) {
65 return NullProvider{}, nil
66 })
67
68
69 }
70
71
72
73 func SetupProviderConfig(providerName string) (ProviderInterface, error) {
74 var err error
75
76 mutex.Lock()
77 defer mutex.Unlock()
78 factory, ok := providers[providerName]
79 if !ok {
80 return nil, fmt.Errorf("The provider %s is unknown: %w", providerName, os.ErrNotExist)
81 }
82 provider, err := factory()
83
84 return provider, err
85 }
86
87
88
89 type ProviderInterface interface {
90 FrameworkBeforeEach(f *Framework)
91 FrameworkAfterEach(f *Framework)
92
93 ResizeGroup(group string, size int32) error
94 GetGroupNodes(group string) ([]string, error)
95 GroupSize(group string) (int, error)
96
97 DeleteNode(node *v1.Node) error
98
99 CreatePD(zone string) (string, error)
100 DeletePD(pdName string) error
101 CreateShare() (string, string, string, error)
102 DeleteShare(accountName, shareName string) error
103
104 CreatePVSource(ctx context.Context, zone, diskName string) (*v1.PersistentVolumeSource, error)
105 DeletePVSource(ctx context.Context, pvSource *v1.PersistentVolumeSource) error
106
107 CleanupServiceResources(ctx context.Context, c clientset.Interface, loadBalancerName, region, zone string)
108
109 EnsureLoadBalancerResourcesDeleted(ctx context.Context, ip, portRange string) error
110 LoadBalancerSrcRanges() []string
111 EnableAndDisableInternalLB() (enable, disable func(svc *v1.Service))
112 }
113
114
115
116 type NullProvider struct{}
117
118
119 func (n NullProvider) FrameworkBeforeEach(f *Framework) {}
120
121
122 func (n NullProvider) FrameworkAfterEach(f *Framework) {}
123
124
125 func (n NullProvider) ResizeGroup(string, int32) error {
126 return fmt.Errorf("Provider does not support InstanceGroups")
127 }
128
129
130 func (n NullProvider) GetGroupNodes(group string) ([]string, error) {
131 return nil, fmt.Errorf("provider does not support InstanceGroups")
132 }
133
134
135 func (n NullProvider) GroupSize(group string) (int, error) {
136 return -1, fmt.Errorf("provider does not support InstanceGroups")
137 }
138
139
140 func (n NullProvider) DeleteNode(node *v1.Node) error {
141 return fmt.Errorf("provider does not support DeleteNode")
142 }
143
144 func (n NullProvider) CreateShare() (string, string, string, error) {
145 return "", "", "", fmt.Errorf("provider does not support volume creation")
146 }
147
148 func (n NullProvider) DeleteShare(accountName, shareName string) error {
149 return fmt.Errorf("provider does not support volume deletion")
150 }
151
152
153 func (n NullProvider) CreatePD(zone string) (string, error) {
154 return "", fmt.Errorf("provider does not support volume creation")
155 }
156
157
158 func (n NullProvider) DeletePD(pdName string) error {
159 return fmt.Errorf("provider does not support volume deletion")
160 }
161
162
163 func (n NullProvider) CreatePVSource(ctx context.Context, zone, diskName string) (*v1.PersistentVolumeSource, error) {
164 return nil, fmt.Errorf("Provider not supported")
165 }
166
167
168 func (n NullProvider) DeletePVSource(ctx context.Context, pvSource *v1.PersistentVolumeSource) error {
169 return fmt.Errorf("Provider not supported")
170 }
171
172
173 func (n NullProvider) CleanupServiceResources(ctx context.Context, c clientset.Interface, loadBalancerName, region, zone string) {
174 }
175
176
177 func (n NullProvider) EnsureLoadBalancerResourcesDeleted(ctx context.Context, ip, portRange string) error {
178 return nil
179 }
180
181
182 func (n NullProvider) LoadBalancerSrcRanges() []string {
183 return nil
184 }
185
186
187 func (n NullProvider) EnableAndDisableInternalLB() (enable, disable func(svc *v1.Service)) {
188 nop := func(svc *v1.Service) {}
189 return nop, nop
190 }
191
192 var _ ProviderInterface = NullProvider{}
193
View as plain text