@@ -18,13 +18,15 @@ package controllers
18
18
19
19
import (
20
20
"context"
21
+ "fmt"
21
22
"os"
22
23
23
24
routev1 "github.com/openshift/api/route/v1"
24
25
"gopkg.in/yaml.v2"
25
26
appsv1 "k8s.io/api/apps/v1"
26
27
corev1 "k8s.io/api/core/v1"
27
28
"k8s.io/apimachinery/pkg/api/errors"
29
+ "k8s.io/apimachinery/pkg/api/resource"
28
30
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29
31
"k8s.io/apimachinery/pkg/runtime"
30
32
"k8s.io/apimachinery/pkg/types"
@@ -162,7 +164,32 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
162
164
ls := labelsForMyController (m .Name )
163
165
replicas := int32 (1 )
164
166
165
- mcDeployment := & appsv1.Deployment {
167
+ // storage volumes
168
+ dataVolume := corev1.Volume {
169
+ Name : "myc-data-dir" ,
170
+ VolumeSource : corev1.VolumeSource {EmptyDir : & corev1.EmptyDirVolumeSource {}},
171
+ }
172
+ metricVolume := corev1.Volume {
173
+ Name : "myc-metric-dir" ,
174
+ VolumeSource : corev1.VolumeSource {EmptyDir : & corev1.EmptyDirVolumeSource {}},
175
+ }
176
+
177
+ // update storage volumes
178
+ storage := m .Spec .Storage
179
+ if storage .SizeData != nil {
180
+ err := r .updatePVC (ctx , m .Namespace , storage .StorageClassName , fmt .Sprintf ("data-%s" , m .Name ), storage .SizeData , & dataVolume )
181
+ if err != nil {
182
+ return err
183
+ }
184
+ }
185
+ if storage .SizeMetric != nil {
186
+ err := r .updatePVC (ctx , m .Namespace , storage .StorageClassName , fmt .Sprintf ("metric-%s" , m .Name ), storage .SizeMetric , & metricVolume )
187
+ if err != nil {
188
+ return err
189
+ }
190
+ }
191
+
192
+ mycDeployment := & appsv1.Deployment {
166
193
ObjectMeta : metav1.ObjectMeta {
167
194
Name : m .Name ,
168
195
Namespace : m .Namespace ,
@@ -187,11 +214,11 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
187
214
}},
188
215
VolumeMounts : []corev1.VolumeMount {
189
216
{
190
- Name : "mc-home -dir" ,
217
+ Name : "myc-data -dir" ,
191
218
MountPath : "/mc_home" ,
192
219
},
193
220
{
194
- Name : "mc -config" ,
221
+ Name : "myc -config" ,
195
222
MountPath : "/app/mycontroller.yaml" ,
196
223
SubPath : "mycontroller.yaml" ,
197
224
ReadOnly : true ,
@@ -206,21 +233,15 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
206
233
Name : "influxdb" ,
207
234
}},
208
235
VolumeMounts : []corev1.VolumeMount {{
209
- Name : "mc-influxdb -dir" ,
236
+ Name : "myc-metric -dir" ,
210
237
MountPath : "/var/lib/influxdb" ,
211
238
}},
212
239
}},
213
240
Volumes : []corev1.Volume {
241
+ dataVolume ,
242
+ metricVolume ,
214
243
{
215
- Name : "mc-home-dir" ,
216
- VolumeSource : corev1.VolumeSource {EmptyDir : & corev1.EmptyDirVolumeSource {}},
217
- },
218
- {
219
- Name : "mc-influxdb-dir" ,
220
- VolumeSource : corev1.VolumeSource {EmptyDir : & corev1.EmptyDirVolumeSource {}},
221
- },
222
- {
223
- Name : "mc-config" ,
244
+ Name : "myc-config" ,
224
245
VolumeSource : corev1.VolumeSource {ConfigMap : & corev1.ConfigMapVolumeSource {
225
246
LocalObjectReference : corev1.LocalObjectReference {Name : m .Name },
226
247
}},
@@ -231,16 +252,48 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
231
252
},
232
253
}
233
254
// Set Memcached instance as the owner and controller
234
- ctrl .SetControllerReference (m , mcDeployment , r .Scheme )
235
- err := r .Create (ctx , mcDeployment )
255
+ ctrl .SetControllerReference (m , mycDeployment , r .Scheme )
256
+ err := r .Create (ctx , mycDeployment )
236
257
if err != nil {
237
- log .Error (err , "failed to create new Deployment" , "Deployment.Namespace" , mcDeployment .Namespace , "Deployment.Name" , mcDeployment .Name )
258
+ log .Error (err , "failed to create new Deployment" , "Deployment.Namespace" , mycDeployment .Namespace , "Deployment.Name" , mycDeployment .Name )
238
259
return err
239
260
}
240
261
241
262
return nil
242
263
}
243
264
265
+ func (r * MyControllerReconciler ) updatePVC (ctx context.Context , namespace , storageClassName , claimName string , pvSize * resource.Quantity , volume * corev1.Volume ) error {
266
+ log := ctrllog .FromContext (ctx )
267
+ pvc := & corev1.PersistentVolumeClaim {}
268
+ err := r .Get (ctx , types.NamespacedName {Name : claimName , Namespace : namespace }, pvc )
269
+ if err != nil {
270
+ if ! errors .IsNotFound (err ) {
271
+ return err
272
+ }
273
+ // create pvc
274
+ pvc .ObjectMeta = metav1.ObjectMeta {Namespace : namespace , Name : claimName }
275
+ storageClassNameTmp := storageClassName
276
+ pvc .Spec = corev1.PersistentVolumeClaimSpec {
277
+ AccessModes : []corev1.PersistentVolumeAccessMode {corev1 .ReadWriteOnce },
278
+ StorageClassName : & storageClassNameTmp ,
279
+ Resources : corev1.ResourceRequirements {
280
+ Requests : corev1.ResourceList {"storage" : * pvSize },
281
+ },
282
+ }
283
+ err = r .Create (ctx , pvc )
284
+ if err != nil {
285
+ log .Error (err , "failed to create new pvc" , "Namespace" , namespace , "Name" , claimName , "StorageClassName" , storageClassName )
286
+ return err
287
+ }
288
+ }
289
+ // update into given volume
290
+ volume .VolumeSource = corev1.VolumeSource {PersistentVolumeClaim : & corev1.PersistentVolumeClaimVolumeSource {
291
+ ReadOnly : false ,
292
+ ClaimName : claimName ,
293
+ }}
294
+ return nil
295
+ }
296
+
244
297
func (r * MyControllerReconciler ) createConfigMap (ctx context.Context , m * mycontrollerv1.MyController ) error {
245
298
log := ctrllog .FromContext (ctx )
246
299
mycCfg := mycConfig.Config {
@@ -264,8 +317,8 @@ func (r *MyControllerReconciler) createConfigMap(ctx context.Context, m *mycontr
264
317
Level : mycConfig.LogLevelConfig {
265
318
Core : m .Spec .LogLevel ,
266
319
WebHandler : m .Spec .LogLevel ,
267
- Storage : m . Spec . LogLevel ,
268
- Metric : m . Spec . LogLevel ,
320
+ Storage : "warn" ,
321
+ Metric : "warn" ,
269
322
},
270
323
},
271
324
Directories : mycConfig.Directories {
0 commit comments