1 package resourcebundlestate
7 "github.com/onap/multicloud-k8s/src/monitor/pkg/apis/k8splugin/v1alpha1"
9 appsv1 "k8s.io/api/apps/v1"
10 v1 "k8s.io/api/batch/v1"
11 corev1 "k8s.io/api/core/v1"
12 v1beta1 "k8s.io/api/extensions/v1beta1"
13 k8serrors "k8s.io/apimachinery/pkg/api/errors"
14 "sigs.k8s.io/controller-runtime/pkg/client"
15 "sigs.k8s.io/controller-runtime/pkg/controller"
16 "sigs.k8s.io/controller-runtime/pkg/manager"
17 "sigs.k8s.io/controller-runtime/pkg/reconcile"
18 "sigs.k8s.io/controller-runtime/pkg/source"
21 // Add the new controller to the controller manager
22 func Add(mgr manager.Manager) error {
23 return add(mgr, newReconciler(mgr))
26 func add(mgr manager.Manager, r *reconciler) error {
27 // Create a new controller
28 c, err := controller.New("ResourceBundleState-controller", mgr, controller.Options{Reconciler: r})
33 // Watch for changes to primary resource ResourceBundleState
34 err = c.Watch(&source.Kind{Type: &v1alpha1.ResourceBundleState{}}, &EventHandler{})
42 func newReconciler(m manager.Manager) *reconciler {
43 return &reconciler{client: m.GetClient()}
46 type reconciler struct {
47 // Stores an array of all the ResourceBundleState
48 crList []v1alpha1.ResourceBundleState
52 // Reconcile implements the loop that will manage the ResourceBundleState CR
53 // We only accept CREATE events here and any subsequent changes are ignored.
54 func (r *reconciler) Reconcile(req reconcile.Request) (reconcile.Result, error) {
55 log.Printf("Reconciling ResourceBundleState %+v\n", req)
57 rbstate := &v1alpha1.ResourceBundleState{}
58 err := r.client.Get(context.TODO(), req.NamespacedName, rbstate)
60 if k8serrors.IsNotFound(err) {
61 log.Printf("Object not found: %+v. Ignore as it must have been deleted.\n", req.NamespacedName)
62 return reconcile.Result{}, nil
64 log.Printf("Failed to get object: %+v\n", req.NamespacedName)
65 return reconcile.Result{}, err
68 err = r.updatePods(rbstate, rbstate.Spec.Selector.MatchLabels)
70 log.Printf("Error adding podstatuses: %v\n", err)
71 return reconcile.Result{}, err
74 err = r.updateServices(rbstate, rbstate.Spec.Selector.MatchLabels)
76 log.Printf("Error adding servicestatuses: %v\n", err)
77 return reconcile.Result{}, err
80 err = r.updateConfigMaps(rbstate, rbstate.Spec.Selector.MatchLabels)
82 log.Printf("Error adding configmapstatuses: %v\n", err)
83 return reconcile.Result{}, err
86 err = r.updateDeployments(rbstate, rbstate.Spec.Selector.MatchLabels)
88 log.Printf("Error adding deploymentstatuses: %v\n", err)
89 return reconcile.Result{}, err
92 err = r.updateSecrets(rbstate, rbstate.Spec.Selector.MatchLabels)
94 log.Printf("Error adding secretstatuses: %v\n", err)
95 return reconcile.Result{}, err
98 err = r.updateDaemonSets(rbstate, rbstate.Spec.Selector.MatchLabels)
100 log.Printf("Error adding daemonSetstatuses: %v\n", err)
101 return reconcile.Result{}, err
104 err = r.updateIngresses(rbstate, rbstate.Spec.Selector.MatchLabels)
106 log.Printf("Error adding ingressStatuses: %v\n", err)
107 return reconcile.Result{}, err
110 err = r.updateJobs(rbstate, rbstate.Spec.Selector.MatchLabels)
112 log.Printf("Error adding jobstatuses: %v\n", err)
113 return reconcile.Result{}, err
116 err = r.updateStatefulSets(rbstate, rbstate.Spec.Selector.MatchLabels)
118 log.Printf("Error adding statefulSetstatuses: %v\n", err)
119 return reconcile.Result{}, err
122 // TODO: Update this based on the statuses of the lower resources
123 rbstate.Status.Ready = false
124 err = r.client.Status().Update(context.TODO(), rbstate)
126 log.Printf("failed to update rbstate: %v\n", err)
127 return reconcile.Result{}, err
130 return reconcile.Result{}, nil
133 func (r *reconciler) updateServices(rbstate *v1alpha1.ResourceBundleState,
134 selectors map[string]string) error {
136 // Update the CR with the Services created as well
137 serviceList := &corev1.ServiceList{}
138 err := listResources(r.client, rbstate.Namespace, selectors, serviceList)
140 log.Printf("Failed to list services: %v", err)
144 rbstate.Status.ServiceStatuses = []corev1.Service{}
146 for _, svc := range serviceList.Items {
147 resStatus := corev1.Service{
148 ObjectMeta: svc.ObjectMeta,
151 rbstate.Status.ServiceStatuses = append(rbstate.Status.ServiceStatuses, resStatus)
157 func (r *reconciler) updatePods(rbstate *v1alpha1.ResourceBundleState,
158 selectors map[string]string) error {
160 // Update the CR with the pods tracked
161 podList := &corev1.PodList{}
162 err := listResources(r.client, rbstate.Namespace, selectors, podList)
164 log.Printf("Failed to list pods: %v", err)
168 rbstate.Status.PodStatuses = []v1alpha1.PodStatus{}
170 for _, pod := range podList.Items {
171 resStatus := v1alpha1.PodStatus{
172 ObjectMeta: pod.ObjectMeta,
176 rbstate.Status.PodStatuses = append(rbstate.Status.PodStatuses, resStatus)
182 func (r *reconciler) updateConfigMaps(rbstate *v1alpha1.ResourceBundleState,
183 selectors map[string]string) error {
185 // Update the CR with the ConfigMaps created as well
186 configMapList := &corev1.ConfigMapList{}
187 err := listResources(r.client, rbstate.Namespace, selectors, configMapList)
189 log.Printf("Failed to list configMaps: %v", err)
193 rbstate.Status.ConfigMapStatuses = []corev1.ConfigMap{}
195 for _, cm := range configMapList.Items {
196 resStatus := corev1.ConfigMap{
197 ObjectMeta: cm.ObjectMeta,
199 rbstate.Status.ConfigMapStatuses = append(rbstate.Status.ConfigMapStatuses, resStatus)
205 func (r *reconciler) updateDeployments(rbstate *v1alpha1.ResourceBundleState,
206 selectors map[string]string) error {
208 // Update the CR with the Deployments created as well
209 deploymentList := &appsv1.DeploymentList{}
210 err := listResources(r.client, rbstate.Namespace, selectors, deploymentList)
212 log.Printf("Failed to list deployments: %v", err)
216 rbstate.Status.DeploymentStatuses = []appsv1.Deployment{}
218 for _, dep := range deploymentList.Items {
219 resStatus := appsv1.Deployment{
220 ObjectMeta: dep.ObjectMeta,
223 rbstate.Status.DeploymentStatuses = append(rbstate.Status.DeploymentStatuses, resStatus)
229 func (r *reconciler) updateSecrets(rbstate *v1alpha1.ResourceBundleState,
230 selectors map[string]string) error {
232 // Update the CR with the Secrets created as well
233 secretList := &corev1.SecretList{}
234 err := listResources(r.client, rbstate.Namespace, selectors, secretList)
236 log.Printf("Failed to list secrets: %v", err)
240 rbstate.Status.SecretStatuses = []corev1.Secret{}
242 for _, sec := range secretList.Items {
243 resStatus := corev1.Secret{
244 ObjectMeta: sec.ObjectMeta,
246 rbstate.Status.SecretStatuses = append(rbstate.Status.SecretStatuses, resStatus)
252 func (r *reconciler) updateDaemonSets(rbstate *v1alpha1.ResourceBundleState,
253 selectors map[string]string) error {
255 // Update the CR with the DaemonSets created as well
256 daemonSetList := &appsv1.DaemonSetList{}
257 err := listResources(r.client, rbstate.Namespace, selectors, daemonSetList)
259 log.Printf("Failed to list DaemonSets: %v", err)
263 rbstate.Status.DaemonSetStatuses = []appsv1.DaemonSet{}
265 for _, ds := range daemonSetList.Items {
266 resStatus := appsv1.DaemonSet{
267 ObjectMeta: ds.ObjectMeta,
270 rbstate.Status.DaemonSetStatuses = append(rbstate.Status.DaemonSetStatuses, resStatus)
276 func (r *reconciler) updateIngresses(rbstate *v1alpha1.ResourceBundleState,
277 selectors map[string]string) error {
279 // Update the CR with the Ingresses created as well
280 ingressList := &v1beta1.IngressList{}
281 err := listResources(r.client, rbstate.Namespace, selectors, ingressList)
283 log.Printf("Failed to list ingresses: %v", err)
287 rbstate.Status.IngressStatuses = []v1beta1.Ingress{}
289 for _, ing := range ingressList.Items {
290 resStatus := v1beta1.Ingress{
291 ObjectMeta: ing.ObjectMeta,
294 rbstate.Status.IngressStatuses = append(rbstate.Status.IngressStatuses, resStatus)
300 func (r *reconciler) updateJobs(rbstate *v1alpha1.ResourceBundleState,
301 selectors map[string]string) error {
303 // Update the CR with the Services created as well
304 jobList := &v1.JobList{}
305 err := listResources(r.client, rbstate.Namespace, selectors, jobList)
307 log.Printf("Failed to list jobs: %v", err)
311 rbstate.Status.JobStatuses = []v1.Job{}
313 for _, job := range jobList.Items {
315 ObjectMeta: job.ObjectMeta,
318 rbstate.Status.JobStatuses = append(rbstate.Status.JobStatuses, resStatus)
324 func (r *reconciler) updateStatefulSets(rbstate *v1alpha1.ResourceBundleState,
325 selectors map[string]string) error {
327 // Update the CR with the StatefulSets created as well
328 statefulSetList := &appsv1.StatefulSetList{}
329 err := listResources(r.client, rbstate.Namespace, selectors, statefulSetList)
331 log.Printf("Failed to list statefulSets: %v", err)
335 rbstate.Status.StatefulSetStatuses = []appsv1.StatefulSet{}
337 for _, sfs := range statefulSetList.Items {
338 resStatus := appsv1.StatefulSet{
339 ObjectMeta: sfs.ObjectMeta,
342 rbstate.Status.StatefulSetStatuses = append(rbstate.Status.StatefulSetStatuses, resStatus)