+func rebuildCollectdConf(cpList *[]onapv1alpha1.CollectdPlugin) (string, error) {
+ var collectdConf string
+ if *cpList == nil || len(*cpList) == 0 {
+ return "", errors.NewNotFound(corev1.Resource("collectdplugin"), "CollectdPlugin")
+ }
+ loadPlugin := make(map[string]string)
+ for _, cp := range *cpList {
+ if cp.Spec.PluginName == "global" {
+ collectdConf += cp.Spec.PluginConf + "\n"
+ } else {
+ loadPlugin[cp.Spec.PluginName] = cp.Spec.PluginConf
+ }
+ }
+
+ log.V(1).Info("::::::: Plugins Map ::::::: ", "PluginMap ", loadPlugin)
+
+ for cpName, cpConf := range loadPlugin {
+ collectdConf += "LoadPlugin" + " " + cpName + "\n"
+ collectdConf += cpConf + "\n"
+ }
+
+ collectdConf += "\n#Last line (collectd requires ā\\nā at the last line)"
+
+ return collectdConf, nil
+}
+
+// Handle Delete CR event for additional cleanup
+func (r *ReconcileCollectdPlugin) handleDelete(reqLogger logr.Logger, cr *onapv1alpha1.CollectdPlugin) (bool, error) {
+ // Check if the CollectdPlugin instance is marked to be deleted, which is
+ // indicated by the deletion timestamp being set.
+ isMarkedToBeDeleted := cr.GetDeletionTimestamp() != nil
+ if isMarkedToBeDeleted {
+ if contains(cr.GetFinalizers(), collectdPluginFinalizer) {
+ // Run finalization logic for collectdPluginFinalizer. If the
+ // finalization logic fails, don't remove the finalizer so
+ // that we can retry during the next reconciliation.
+ if err := r.finalizeCollectdPlugin(reqLogger, cr); err != nil {
+ return isMarkedToBeDeleted, err
+ }
+
+ // Remove collectdPluginFinalizer. Once all finalizers have been
+ // removed, the object will be deleted.
+ cr.SetFinalizers(remove(cr.GetFinalizers(), collectdPluginFinalizer))
+ err := r.client.Update(context.TODO(), cr)
+ if err != nil {
+ return isMarkedToBeDeleted, err
+ }
+ }
+ }
+ return isMarkedToBeDeleted, nil
+}
+
+func (r *ReconcileCollectdPlugin) updateStatus(cr *onapv1alpha1.CollectdPlugin) error {
+ podList := &corev1.PodList{}
+ opts := &client.ListOptions{}
+ opts.SetLabelSelector("app=collectd")
+ var pods []string
+ opts.InNamespace(cr.Namespace)
+ err := r.client.List(context.TODO(), opts, podList)
+ if err != nil {
+ return err
+ }
+
+ if podList.Items == nil || len(podList.Items) == 0 {
+ return err
+ }
+
+ for _, pod := range podList.Items {
+ pods = append(pods, pod.Name)
+ }
+ cr.Status.CollectdAgents = pods
+ err = r.client.Status().Update(context.TODO(), cr)
+ return err
+}
+
+func (r *ReconcileCollectdPlugin) finalizeCollectdPlugin(reqLogger logr.Logger, cr *onapv1alpha1.CollectdPlugin) error {
+ // Cleanup by regenerating new collectd conf and rolling update of DaemonSet
+ if err := r.handleCollectdPlugin(reqLogger, cr); err != nil {
+ reqLogger.Error(err, "Finalize CollectdPlugin failed!!")
+ return err
+ }
+ reqLogger.Info("Successfully finalized CollectdPlugin!!")
+ return nil
+}
+
+func (r *ReconcileCollectdPlugin) addFinalizer(reqLogger logr.Logger, cr *onapv1alpha1.CollectdPlugin) error {
+ reqLogger.Info("Adding Finalizer for the CollectdPlugin")
+ cr.SetFinalizers(append(cr.GetFinalizers(), collectdPluginFinalizer))
+
+ // Update CR
+ err := r.client.Update(context.TODO(), cr)
+ if err != nil {
+ reqLogger.Error(err, "Failed to update CollectdPlugin with finalizer")
+ return err
+ }
+ return nil
+}
+
+func contains(list []string, s string) bool {
+ for _, v := range list {
+ if v == s {
+ return true
+ }
+ }
+ return false
+}
+
+func remove(list []string, s string) []string {
+ for i, v := range list {
+ if v == s {
+ list = append(list[:i], list[i+1:]...)
+ }
+ }
+ return list