in operator/controllers/operator/javaagent_controller.go [56:161]
func (r *JavaAgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := runtimelog.FromContext(ctx)
log.Info("=====================javaagent reconcile started================================")
pod := &core.Pod{}
err := r.Client.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: req.Name}, pod)
if err != nil && !apierrors.IsNotFound(err) {
log.Error(err, "failed to get pod")
return ctrl.Result{}, err
}
configmap := &core.ConfigMap{}
configmapName := ""
for i := range pod.Spec.Volumes {
if pod.Spec.Volumes[i].ConfigMap != nil {
configmapName = pod.Spec.Volumes[i].ConfigMap.Name
}
}
// get pods' OwnerReferences
if len(pod.OwnerReferences) == 0 {
log.Error(err, "the pod isn't created by workloads")
return ctrl.Result{}, err
}
ownerReference := pod.OwnerReferences[0]
// get configmap from the volume of configmap
if len(configmapName) > 0 {
err = r.Client.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: configmapName}, configmap)
if err != nil && !apierrors.IsNotFound(err) {
log.Error(err, "failed to get configmap")
return ctrl.Result{}, err
}
} else {
log.Info("No configmap mounted.")
}
swAgentList := &operatorv1alpha1.SwAgentList{}
var lastMatchedSwAgent *operatorv1alpha1.SwAgent
if lastMatchedSwAgent, err = r.getSwAgent(ctx, req, swAgentList, pod); err != nil {
log.Error(err, "get SwAgent error")
return ctrl.Result{}, err
}
config := map[string]string{}
r.injectConfigBySwAgent(lastMatchedSwAgent, config)
// only get the first selector label from labels as podselector
labels := pod.Labels
keys := []string{}
for k := range labels {
if !strings.Contains(k, injector.ActiveInjectorLabel) {
keys = append(keys, k)
}
}
if len(keys) == 0 {
log.Error(err, "the pod doesn't contain the pod selector")
return ctrl.Result{}, err
}
sort.Strings(keys)
selectorname := strings.Join([]string{keys[0], labels[keys[0]]}, "-")
podselector := strings.Join([]string{keys[0], labels[keys[0]]}, "=")
app := kubernetes.Application{
Client: r.Client,
FileRepo: r.FileRepo,
CR: pod,
GVK: core.SchemeGroupVersion.WithKind("Pod"),
TmplFunc: map[string]interface{}{
"config": func() map[string]string {
return config
},
"ownerReference": func() metav1.OwnerReference {
return ownerReference
},
"SelectorName": func() string {
return selectorname
},
"Namespace": func() string {
return req.Namespace
},
"PodSelector": func() string {
return podselector
},
"ServiceName": func() string {
return operatorv1alpha1.GetServiceName(&config)
},
"BackendService": func() string {
return operatorv1alpha1.GetBackendService(&config)
},
},
}
// false means not to compose , such as ownerReferences , as we compose it as template
_, err = app.Apply(ctx, "injector/templates/javaagent.yaml", log, false)
if err != nil {
log.Error(err, "failed to apply javaagent")
return ctrl.Result{}, err
}
if err := r.UpdateStatus(ctx, log, req.Namespace, selectorname, podselector); err != nil {
log.Error(err, "failed to update javaagent's status")
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
}