Skip to content

Commit fd85ffd

Browse files
committed
support PersistentVolumeClaim
Signed-off-by: Jeeva Kandasamy <jkandasa@gmail.com>
1 parent a20bc03 commit fd85ffd

File tree

4 files changed

+129
-22
lines changed

4 files changed

+129
-22
lines changed

api/v1/mycontroller_types.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package v1
1818

1919
import (
20+
"k8s.io/apimachinery/pkg/api/resource"
2021
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2122
)
2223

@@ -31,9 +32,16 @@ type MyControllerSpec struct {
3132
// Foo is an example field of MyController. Edit mycontroller_types.go to remove/update
3233
// Foo string `json:"foo,omitempty"`
3334

34-
Secret string `json:"secret"`
35-
DisableAnalytics bool `json:"disable_analytics"`
36-
LogLevel string `json:"log_level"`
35+
Secret string `json:"secret"`
36+
DisableAnalytics bool `json:"disable_analytics"`
37+
LogLevel string `json:"log_level"`
38+
Storage MyControllerStorage `json:"storage"`
39+
}
40+
41+
type MyControllerStorage struct {
42+
StorageClassName string `json:"storage_class_name"`
43+
SizeData *resource.Quantity `json:"data_size,omitempty"`
44+
SizeMetric *resource.Quantity `json:"metric_size,omitempty"`
3745
}
3846

3947
// MyControllerStatus defines the observed state of MyController

api/v1/zz_generated.deepcopy.go

Lines changed: 27 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/mycontroller.org_mycontrollers.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,30 @@ spec:
4242
type: string
4343
secret:
4444
type: string
45+
storage:
46+
properties:
47+
data_size:
48+
anyOf:
49+
- type: integer
50+
- type: string
51+
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
52+
x-kubernetes-int-or-string: true
53+
metric_size:
54+
anyOf:
55+
- type: integer
56+
- type: string
57+
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
58+
x-kubernetes-int-or-string: true
59+
storage_class_name:
60+
type: string
61+
required:
62+
- storage_class_name
63+
type: object
4564
required:
4665
- disable_analytics
4766
- log_level
4867
- secret
68+
- storage
4969
type: object
5070
status:
5171
description: MyControllerStatus defines the observed state of MyController

controllers/mycontroller_controller.go

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ package controllers
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"os"
2223

2324
routev1 "github.com/openshift/api/route/v1"
2425
"gopkg.in/yaml.v2"
2526
appsv1 "k8s.io/api/apps/v1"
2627
corev1 "k8s.io/api/core/v1"
2728
"k8s.io/apimachinery/pkg/api/errors"
29+
"k8s.io/apimachinery/pkg/api/resource"
2830
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2931
"k8s.io/apimachinery/pkg/runtime"
3032
"k8s.io/apimachinery/pkg/types"
@@ -162,7 +164,32 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
162164
ls := labelsForMyController(m.Name)
163165
replicas := int32(1)
164166

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{
166193
ObjectMeta: metav1.ObjectMeta{
167194
Name: m.Name,
168195
Namespace: m.Namespace,
@@ -187,11 +214,11 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
187214
}},
188215
VolumeMounts: []corev1.VolumeMount{
189216
{
190-
Name: "mc-home-dir",
217+
Name: "myc-data-dir",
191218
MountPath: "/mc_home",
192219
},
193220
{
194-
Name: "mc-config",
221+
Name: "myc-config",
195222
MountPath: "/app/mycontroller.yaml",
196223
SubPath: "mycontroller.yaml",
197224
ReadOnly: true,
@@ -206,21 +233,15 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
206233
Name: "influxdb",
207234
}},
208235
VolumeMounts: []corev1.VolumeMount{{
209-
Name: "mc-influxdb-dir",
236+
Name: "myc-metric-dir",
210237
MountPath: "/var/lib/influxdb",
211238
}},
212239
}},
213240
Volumes: []corev1.Volume{
241+
dataVolume,
242+
metricVolume,
214243
{
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",
224245
VolumeSource: corev1.VolumeSource{ConfigMap: &corev1.ConfigMapVolumeSource{
225246
LocalObjectReference: corev1.LocalObjectReference{Name: m.Name},
226247
}},
@@ -231,16 +252,48 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
231252
},
232253
}
233254
// 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)
236257
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)
238259
return err
239260
}
240261

241262
return nil
242263
}
243264

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+
244297
func (r *MyControllerReconciler) createConfigMap(ctx context.Context, m *mycontrollerv1.MyController) error {
245298
log := ctrllog.FromContext(ctx)
246299
mycCfg := mycConfig.Config{
@@ -264,8 +317,8 @@ func (r *MyControllerReconciler) createConfigMap(ctx context.Context, m *mycontr
264317
Level: mycConfig.LogLevelConfig{
265318
Core: m.Spec.LogLevel,
266319
WebHandler: m.Spec.LogLevel,
267-
Storage: m.Spec.LogLevel,
268-
Metric: m.Spec.LogLevel,
320+
Storage: "warn",
321+
Metric: "warn",
269322
},
270323
},
271324
Directories: mycConfig.Directories{

0 commit comments

Comments
 (0)