@@ -3,48 +3,21 @@ package launch
33import (
44 "github.com/sapcc/kubernikus/pkg/api/models"
55 "github.com/sapcc/kubernikus/pkg/apis/kubernikus/v1"
6- "github.com/sapcc/kubernikus/pkg/client/openstack"
76 "github.com/sapcc/kubernikus/pkg/controller/base"
87 "github.com/sapcc/kubernikus/pkg/controller/config"
98 "github.com/sapcc/kubernikus/pkg/controller/metrics"
10- "github.com/sapcc/kubernikus/pkg/templates"
119
1210 "github.com/go-kit/kit/log"
13- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1411 "k8s.io/client-go/tools/record"
1512)
1613
17- type PoolManager interface {
18- GetStatus () (* PoolStatus , error )
19- SetStatus (* PoolStatus ) error
20- CreateNode () (string , error )
21- DeleteNode (string ) error
22- }
23-
2414type LaunchReconciler struct {
2515 config.Clients
2616
2717 Recorder record.EventRecorder
2818 Logger log.Logger
2919}
3020
31- type PoolStatus struct {
32- Nodes []string
33- Running int
34- Starting int
35- Stopping int
36- Needed int
37- UnNeeded int
38- }
39-
40- type ConcretePoolManager struct {
41- config.Clients
42-
43- Kluster * v1.Kluster
44- Pool * models.NodePool
45- Logger log.Logger
46- }
47-
4821func NewController (factories config.Factories , clients config.Clients , recorder record.EventRecorder , logger log.Logger ) base.Controller {
4922 logger = log .With (logger ,
5023 "controller" , "launch" )
@@ -85,7 +58,7 @@ func (lr *LaunchReconciler) Reconcile(kluster *v1.Kluster) (requeueRequested boo
8558
8659func (lr * LaunchReconciler ) reconcilePool (kluster * v1.Kluster , pool * models.NodePool ) (status * PoolStatus , requeue bool , err error ) {
8760
88- pm := lr .newNodePoolManager (kluster , pool )
61+ pm := lr .newPoolManager (kluster , pool )
8962 status , err = pm .GetStatus ()
9063 if err != nil {
9164 return
@@ -127,149 +100,3 @@ func (lr *LaunchReconciler) reconcilePool(kluster *v1.Kluster, pool *models.Node
127100 err = pm .SetStatus (status )
128101 return
129102}
130-
131- func (lr * LaunchReconciler ) newNodePoolManager (kluster * v1.Kluster , pool * models.NodePool ) PoolManager {
132- logger := log .With (lr .Logger ,
133- "kluster" , kluster .Spec .Name ,
134- "project" , kluster .Account (),
135- "pool" , pool .Name )
136-
137- var pm PoolManager
138- pm = & ConcretePoolManager {lr .Clients , kluster , pool , logger }
139- pm = & EventingPoolManager {pm , kluster , lr .Recorder }
140- pm = & LoggingPoolManager {pm , logger }
141- pm = & InstrumentingPoolManager {pm ,
142- metrics .LaunchOperationsLatency ,
143- metrics .LaunchOperationsTotal ,
144- metrics .LaunchSuccessfulOperationsTotal ,
145- metrics .LaunchFailedOperationsTotal ,
146- }
147-
148- return pm
149- }
150-
151- func (cpm * ConcretePoolManager ) GetStatus () (status * PoolStatus , err error ) {
152- status = & PoolStatus {}
153- nodes , err := cpm .Clients .Openstack .GetNodes (cpm .Kluster , cpm .Pool )
154- if err != nil {
155- return status , err
156- }
157-
158- return & PoolStatus {
159- Nodes : cpm .nodeIDs (nodes ),
160- Running : cpm .running (nodes ),
161- Starting : cpm .starting (nodes ),
162- Stopping : cpm .stopping (nodes ),
163- Needed : cpm .needed (nodes ),
164- UnNeeded : cpm .unNeeded (nodes ),
165- }, nil
166- }
167-
168- func (cpm * ConcretePoolManager ) SetStatus (status * PoolStatus ) error {
169- newInfo := models.NodePoolInfo {
170- Name : cpm .Pool .Name ,
171- Size : cpm .Pool .Size ,
172- Running : int64 (status .Running + status .Starting ),
173- Healthy : int64 (status .Running ),
174- Schedulable : int64 (status .Running ),
175- }
176-
177- copy , err := cpm .Clients .Kubernikus .Kubernikus ().Klusters (cpm .Kluster .Namespace ).Get (cpm .Kluster .Name , metav1.GetOptions {})
178- if err != nil {
179- return err
180- }
181-
182- for i , curInfo := range copy .Status .NodePools {
183- if curInfo .Name == newInfo .Name {
184- if curInfo == newInfo {
185- return nil
186- }
187-
188- copy .Status .NodePools [i ] = newInfo
189- _ , err = cpm .Clients .Kubernikus .Kubernikus ().Klusters (copy .Namespace ).Update (copy )
190- return err
191- }
192- }
193-
194- return nil
195- }
196-
197- func (cpm * ConcretePoolManager ) CreateNode () (id string , err error ) {
198- secret , err := cpm .Clients .Kubernetes .CoreV1 ().Secrets (cpm .Kluster .Namespace ).Get (cpm .Kluster .GetName (), metav1.GetOptions {})
199- if err != nil {
200- return "" , err
201- }
202-
203- userdata , err := templates .Ignition .GenerateNode (cpm .Kluster , secret )
204- if err != nil {
205- return "" , err
206- }
207-
208- id , err = cpm .Clients .Openstack .CreateNode (cpm .Kluster , cpm .Pool , userdata )
209- if err != nil {
210- return "" , err
211- }
212-
213- return id , nil
214- }
215-
216- func (cpm * ConcretePoolManager ) DeleteNode (id string ) (err error ) {
217- if err = cpm .Clients .Openstack .DeleteNode (cpm .Kluster , id ); err != nil {
218- return err
219- }
220- return nil
221- }
222-
223- func (cpm * ConcretePoolManager ) nodeIDs (nodes []openstack.Node ) []string {
224- result := []string {}
225- for _ , n := range nodes {
226- result = append (result , n .ID )
227- }
228- return result
229- }
230-
231- func (cpm * ConcretePoolManager ) starting (nodes []openstack.Node ) int {
232- var count int = 0
233- for _ , n := range nodes {
234- if n .Starting () {
235- count = count + 1
236- }
237- }
238- return count
239- }
240-
241- func (cpm * ConcretePoolManager ) stopping (nodes []openstack.Node ) int {
242- var count int = 0
243- for _ , n := range nodes {
244- if n .Stopping () {
245- count = count + 1
246- }
247- }
248- return count
249- }
250-
251- func (cpm * ConcretePoolManager ) running (nodes []openstack.Node ) int {
252- var count int = 0
253- for _ , n := range nodes {
254- if n .Running () {
255- count = count + 1
256- }
257- }
258- return count
259- }
260-
261- func (cpm * ConcretePoolManager ) needed (nodes []openstack.Node ) int {
262- needed := int (cpm .Pool .Size ) - cpm .running (nodes ) - cpm .starting (nodes )
263- if needed < 0 {
264- return 0
265- }
266- return needed
267- }
268-
269- func (cpm ConcretePoolManager ) unNeeded (nodes []openstack.Node ) int {
270- unneeded := cpm .running (nodes ) + cpm .starting (nodes ) - int (cpm .Pool .Size )
271- if unneeded < 0 {
272- return 0
273- }
274- return unneeded
275- }
0 commit comments