Skip to content

Commit 6809216

Browse files
committed
update reconcile func
Signed-off-by: Jeeva Kandasamy <jkandasa@gmail.com>
1 parent fd85ffd commit 6809216

File tree

5 files changed

+148
-70
lines changed

5 files changed

+148
-70
lines changed

api/v1/mycontroller_types.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ import (
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2222
)
2323

24+
var (
25+
MyControllerPhaseFailed = "Failed"
26+
MyControllerPhaseRunning = "Running"
27+
)
28+
2429
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
2530
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
2631

@@ -35,11 +40,11 @@ type MyControllerSpec struct {
3540
Secret string `json:"secret"`
3641
DisableAnalytics bool `json:"disable_analytics"`
3742
LogLevel string `json:"log_level"`
38-
Storage MyControllerStorage `json:"storage"`
43+
Storage MyControllerStorage `json:"storage,omitempty"`
3944
}
4045

4146
type MyControllerStorage struct {
42-
StorageClassName string `json:"storage_class_name"`
47+
StorageClassName string `json:"storage_class_name,omitempty"`
4348
SizeData *resource.Quantity `json:"data_size,omitempty"`
4449
SizeMetric *resource.Quantity `json:"metric_size,omitempty"`
4550
}
@@ -48,10 +53,13 @@ type MyControllerStorage struct {
4853
type MyControllerStatus struct {
4954
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
5055
// Important: Run "make" to regenerate code after modifying this file
56+
Phase string `json:"phase"`
5157
}
5258

5359
//+kubebuilder:object:root=true
5460
//+kubebuilder:subresource:status
61+
// +kubebuilder:printcolumn:name="Status",type="string",JSONPath=".status.phase",description="MyController instance's status"
62+
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"
5563

5664
// MyController is the Schema for the mycontrollers API
5765
type MyController struct {

config/crd/bases/mycontroller.org_mycontrollers.yaml

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,15 @@ spec:
1616
singular: mycontroller
1717
scope: Namespaced
1818
versions:
19-
- name: v1
19+
- additionalPrinterColumns:
20+
- description: MyController instance's status
21+
jsonPath: .status.phase
22+
name: Status
23+
type: string
24+
- jsonPath: .metadata.creationTimestamp
25+
name: Age
26+
type: date
27+
name: v1
2028
schema:
2129
openAPIV3Schema:
2230
description: MyController is the Schema for the mycontrollers API
@@ -58,17 +66,22 @@ spec:
5866
x-kubernetes-int-or-string: true
5967
storage_class_name:
6068
type: string
61-
required:
62-
- storage_class_name
6369
type: object
6470
required:
6571
- disable_analytics
6672
- log_level
6773
- secret
68-
- storage
6974
type: object
7075
status:
7176
description: MyControllerStatus defines the observed state of MyController
77+
properties:
78+
phase:
79+
description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
80+
of cluster Important: Run "make" to regenerate code after modifying
81+
this file'
82+
type: string
83+
required:
84+
- phase
7285
type: object
7386
type: object
7487
served: true

controllers/helper.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package controllers
2+
3+
import (
4+
"os"
5+
6+
"k8s.io/client-go/discovery"
7+
ctrl "sigs.k8s.io/controller-runtime"
8+
)
9+
10+
var openshiftPlatform = false
11+
12+
func isOpenshift() bool {
13+
return openshiftPlatform
14+
}
15+
16+
func updatePlatform(mgr ctrl.Manager) error {
17+
log := mgr.GetLogger()
18+
// update platform
19+
dClient, err := discovery.NewDiscoveryClientForConfig(mgr.GetConfig())
20+
if err != nil {
21+
log.Error(err, "problem getting platform details")
22+
return err
23+
}
24+
25+
apiList, err := dClient.ServerGroups()
26+
if err != nil {
27+
log.Error(err, "problem getting platform details")
28+
os.Exit(1)
29+
}
30+
31+
apiGroups := apiList.Groups
32+
for _, group := range apiGroups {
33+
if group.Name == "route.openshift.io" {
34+
openshiftPlatform = true
35+
}
36+
}
37+
log.Info("platform detail", "is_openshift", openshiftPlatform)
38+
return nil
39+
}

controllers/mycontroller_controller.go

Lines changed: 81 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package controllers
1919
import (
2020
"context"
2121
"fmt"
22-
"os"
2322

2423
routev1 "github.com/openshift/api/route/v1"
2524
"gopkg.in/yaml.v2"
@@ -63,6 +62,8 @@ type MyControllerReconciler struct {
6362
func (r *MyControllerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
6463
log := ctrllog.FromContext(ctx)
6564

65+
log.Info("reconcile triggered", "namespace", req.Namespace, "name", req.Name)
66+
6667
// fetch the MyController instance
6768
myController := &mycontrollerv1.MyController{}
6869
err := r.Get(ctx, req.NamespacedName, myController)
@@ -83,30 +84,58 @@ func (r *MyControllerReconciler) Reconcile(ctx context.Context, req ctrl.Request
8384
found := &appsv1.Deployment{}
8485
err = r.Get(ctx, types.NamespacedName{Name: myController.Name, Namespace: myController.Namespace}, found)
8586
if err != nil && errors.IsNotFound(err) {
87+
err = r.removeMyController(ctx, myController)
88+
if err != nil {
89+
log.Error(err, "failed to remove existing resources")
90+
return ctrl.Result{}, err
91+
}
8692
err = r.setupMyController(ctx, myController)
8793
if err != nil {
8894
log.Error(err, "failed to setup mycontroller")
8995
return ctrl.Result{}, err
9096
}
97+
98+
myController.Status.Phase = mycontrollerv1.MyControllerPhaseRunning
99+
if err = r.Client.Status().Update(ctx, myController); err != nil {
100+
log.Error(err, "failed to update status")
101+
}
91102
// deployed successfully - return and requeue
92103
return ctrl.Result{Requeue: true}, nil
93104
} else if err != nil {
94105
log.Error(err, "failed to get Deployment")
95106
return ctrl.Result{}, err
96107
}
97108

109+
// TODO: verify the existing installation status and reconcile, if there is a need
110+
98111
return ctrl.Result{}, nil
99112
}
100113

101114
// SetupWithManager sets up the controller with the Manager.
102115
func (r *MyControllerReconciler) SetupWithManager(mgr ctrl.Manager) error {
116+
log := mgr.GetLogger()
117+
118+
// update platform
119+
err := updatePlatform(mgr)
120+
if err != nil {
121+
return err
122+
}
123+
124+
// Adding the routev1
125+
if isOpenshift() {
126+
if err := routev1.AddToScheme(mgr.GetScheme()); err != nil {
127+
log.Error(err, "")
128+
return err
129+
}
130+
}
131+
103132
return ctrl.NewControllerManagedBy(mgr).
104133
For(&mycontrollerv1.MyController{}).
105134
Owns(&appsv1.Deployment{}).
106135
Complete(r)
107136
}
108137

109-
func (r *MyControllerReconciler) setupMyController(ctx context.Context, m *mycontrollerv1.MyController) error {
138+
func (r *MyControllerReconciler) removeMyController(ctx context.Context, m *mycontrollerv1.MyController) error {
110139
// delete existing resources and create new resources
111140
// delete deployment
112141
err := r.Delete(ctx, &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Namespace: m.Namespace, Name: m.Name}})
@@ -119,7 +148,7 @@ func (r *MyControllerReconciler) setupMyController(ctx context.Context, m *mycon
119148
return err
120149
}
121150
// delete route
122-
if os.Getenv("is_opensift") == "true" {
151+
if isOpenshift() {
123152
err = r.Delete(ctx, &routev1.Route{ObjectMeta: metav1.ObjectMeta{Namespace: m.Namespace, Name: m.Name}})
124153
if err != nil && !errors.IsNotFound(err) {
125154
return err
@@ -130,9 +159,12 @@ func (r *MyControllerReconciler) setupMyController(ctx context.Context, m *mycon
130159
if err != nil && !errors.IsNotFound(err) {
131160
return err
132161
}
162+
return nil
163+
}
133164

165+
func (r *MyControllerReconciler) setupMyController(ctx context.Context, m *mycontrollerv1.MyController) error {
134166
// create configmap
135-
err = r.createConfigMap(ctx, m)
167+
err := r.createConfigMap(ctx, m)
136168
if err != nil {
137169
return err
138170
}
@@ -204,27 +236,7 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
204236
Labels: ls,
205237
},
206238
Spec: corev1.PodSpec{
207-
Containers: []corev1.Container{{
208-
Image: "quay.io/mycontroller/server:master",
209-
Name: "mycontroller",
210-
Command: []string{"/app/mycontroller-server", "-config", "/app/mycontroller.yaml"},
211-
Ports: []corev1.ContainerPort{{
212-
ContainerPort: 8080,
213-
Name: "mycontroller",
214-
}},
215-
VolumeMounts: []corev1.VolumeMount{
216-
{
217-
Name: "myc-data-dir",
218-
MountPath: "/mc_home",
219-
},
220-
{
221-
Name: "myc-config",
222-
MountPath: "/app/mycontroller.yaml",
223-
SubPath: "mycontroller.yaml",
224-
ReadOnly: true,
225-
},
226-
},
227-
},
239+
Containers: []corev1.Container{
228240
{
229241
Name: "influxdb",
230242
Image: "influxdb:1.8.4",
@@ -236,6 +248,47 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
236248
Name: "myc-metric-dir",
237249
MountPath: "/var/lib/influxdb",
238250
}},
251+
LivenessProbe: &corev1.Probe{
252+
InitialDelaySeconds: 7000,
253+
Handler: corev1.Handler{
254+
HTTPGet: &corev1.HTTPGetAction{
255+
Path: "health",
256+
Port: intstr.FromInt(8086),
257+
Scheme: corev1.URISchemeHTTP,
258+
},
259+
},
260+
},
261+
},
262+
{
263+
Image: "quay.io/mycontroller/server:master",
264+
Name: "mycontroller",
265+
Command: []string{"/app/mycontroller-server", "-config", "/app/mycontroller.yaml"},
266+
Ports: []corev1.ContainerPort{{
267+
ContainerPort: 8080,
268+
Name: "mycontroller",
269+
}},
270+
VolumeMounts: []corev1.VolumeMount{
271+
{
272+
Name: "myc-data-dir",
273+
MountPath: "/mc_home",
274+
},
275+
{
276+
Name: "myc-config",
277+
MountPath: "/app/mycontroller.yaml",
278+
SubPath: "mycontroller.yaml",
279+
ReadOnly: true,
280+
},
281+
},
282+
LivenessProbe: &corev1.Probe{
283+
InitialDelaySeconds: 5000,
284+
Handler: corev1.Handler{
285+
HTTPGet: &corev1.HTTPGetAction{
286+
Path: "api/status",
287+
Port: intstr.FromInt(8080),
288+
Scheme: corev1.URISchemeHTTP,
289+
},
290+
},
291+
},
239292
}},
240293
Volumes: []corev1.Volume{
241294
dataVolume,
@@ -251,7 +304,7 @@ func (r *MyControllerReconciler) deployMyController(ctx context.Context, m *myco
251304
},
252305
},
253306
}
254-
// Set Memcached instance as the owner and controller
307+
// Set MyController instance as the owner and controller
255308
ctrl.SetControllerReference(m, mycDeployment, r.Scheme)
256309
err := r.Create(ctx, mycDeployment)
257310
if err != nil {
@@ -418,7 +471,7 @@ func (r *MyControllerReconciler) createService(ctx context.Context, m *mycontrol
418471

419472
func (r *MyControllerReconciler) createRoute(ctx context.Context, m *mycontrollerv1.MyController) error {
420473
// if it is a openshift platform continue or exit
421-
if os.Getenv("is_openshift") != "true" {
474+
if !isOpenshift() {
422475
return nil
423476
}
424477

@@ -434,7 +487,7 @@ func (r *MyControllerReconciler) createRoute(ctx context.Context, m *mycontrolle
434487
TLS: &routev1.TLSConfig{},
435488
},
436489
}
437-
// Set Memcached instance as the owner and controller
490+
// Set MyController instance as the owner and controller
438491
ctrl.SetControllerReference(m, mycRoute, r.Scheme)
439492

440493
err := r.Create(ctx, mycRoute)

main.go

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ import (
2222

2323
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
2424
// to ensure that exec-entrypoint and run can make use of them.
25-
"k8s.io/client-go/discovery"
26-
_ "k8s.io/client-go/plugin/pkg/client/auth"
2725

28-
routev1 "github.com/openshift/api/route/v1"
26+
_ "k8s.io/client-go/plugin/pkg/client/auth"
2927

3028
"k8s.io/apimachinery/pkg/runtime"
3129
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -99,39 +97,6 @@ func main() {
9997
os.Exit(1)
10098
}
10199

102-
// Adding the routev1
103-
if err := routev1.AddToScheme(mgr.GetScheme()); err != nil {
104-
setupLog.Error(err, "")
105-
os.Exit(1)
106-
}
107-
108-
// update platform
109-
dClient, err := discovery.NewDiscoveryClientForConfig(mgr.GetConfig())
110-
if err != nil {
111-
setupLog.Error(err, "problem getting platform details")
112-
os.Exit(1)
113-
}
114-
115-
apiList, err := dClient.ServerGroups()
116-
if err != nil {
117-
setupLog.Error(err, "problem getting platform details")
118-
os.Exit(1)
119-
}
120-
121-
err = os.Setenv("is_openshift", "false")
122-
if err != nil {
123-
setupLog.Error(err, "problem setting environment 'is_openshift'")
124-
}
125-
apiGroups := apiList.Groups
126-
for _, group := range apiGroups {
127-
if group.Name == "route.openshift.io" {
128-
err = os.Setenv("is_openshift", "true")
129-
if err != nil {
130-
setupLog.Error(err, "problem setting environment 'is_openshift'")
131-
}
132-
}
133-
}
134-
135100
setupLog.Info("starting manager")
136101
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
137102
setupLog.Error(err, "problem running manager")

0 commit comments

Comments
 (0)