Skip to content

Commit

Permalink
Merge pull request #201 from yossig-aquasec/master_updating_deploymen…
Browse files Browse the repository at this point in the history
…ts_on_secret_change

Adding support for restart deployments when secret\config map changed.
  • Loading branch information
yossig-aquasec committed Aug 22, 2022
2 parents 57d631c + dfc01af commit 96443a8
Show file tree
Hide file tree
Showing 13 changed files with 113 additions and 67 deletions.
3 changes: 3 additions & 0 deletions controllers/aquasecurity/aquastarboard/aquaStarboardHelper.go
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,9 @@ func (enf *AquaStarboardHelper) CreateStarboardDeployment(cr *aquasecurityv1alph
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: selectors,
Annotations: map[string]string{
"ConfigMapChecksum": cr.Spec.ConfigMapChecksum,
},
},
Spec: corev1.PodSpec{
//SecurityContext: &corev1.PodSecurityContext{
Expand Down
14 changes: 10 additions & 4 deletions controllers/aquasecurity/aquastarboard/aquastarboard_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func (r *AquaStarboardReconciler) Reconcile(ctx context.Context, req ctrl.Reques
return reconcile.Result{}, err
}

return ctrl.Result{Requeue: true}, nil
return ctrl.Result{}, nil
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -255,7 +255,7 @@ func (r *AquaStarboardReconciler) addStarboardDeployment(cr *aquasecurityv1alpha

// object already exists - don't requeue
reqLogger.Info("Skip reconcile: Aqua Starboard Deployment Exists", "Deployment.Namespace", found.Namespace, "Deployment.Name", found.Name)
return reconcile.Result{Requeue: true}, nil
return reconcile.Result{}, nil
}

func (r *AquaStarboardReconciler) updateStarboardServerObject(serviceObject *v1alpha1.AquaService, StarboardImageData *v1alpha1.AquaImage) *v1alpha1.AquaService {
Expand Down Expand Up @@ -442,7 +442,7 @@ func (r *AquaStarboardReconciler) addStarboardConfigMap(cr *aquasecurityv1alpha1
if err != nil {
return reconcile.Result{}, err
}
cr.Spec.ConfigMapChecksum = hash
cr.Spec.ConfigMapChecksum += hash

// Set AquaStarboard instance as the owner and controller
requeue := true
Expand Down Expand Up @@ -496,14 +496,20 @@ func (r *AquaStarboardReconciler) addStarboardSecret(cr *aquasecurityv1alpha1.Aq
"ke-token-secret",
)

hash, err := extra.GenerateMD5ForSpec(starboardSecret)
if err != nil {
return reconcile.Result{}, err
}
cr.Spec.ConfigMapChecksum += hash

// Set AquaStarboard instance as the owner and controller
if err := controllerutil.SetControllerReference(cr, starboardSecret, r.Scheme); err != nil {
return reconcile.Result{}, err
}

// Check if this object already exists
found := &corev1.Secret{}
err := r.Client.Get(context.TODO(), types.NamespacedName{Name: starboardSecret.Name, Namespace: starboardSecret.Namespace}, found)
err = r.Client.Get(context.TODO(), types.NamespacedName{Name: starboardSecret.Name, Namespace: starboardSecret.Namespace}, found)
if err != nil && errors.IsNotFound(err) {
reqLogger.Info("Aqua Starboard: Creating a New token secret", "Secret.Namespace", starboardSecret.Namespace, "Secret.Name", starboardSecret.Name)
err = r.Client.Create(context.TODO(), starboardSecret)
Expand Down
29 changes: 2 additions & 27 deletions controllers/operator/aquacsp/aquacsp_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,35 +281,10 @@ func (r *AquaCspReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
instance.Status.State = crStatus
_ = r.Client.Status().Update(context.Background(), instance)
}
return reconcile.Result{Requeue: true, RequeueAfter: time.Duration(0)}, nil
}

/*if instance.Spec.ScannerService != nil {
if len(instance.Spec.AdminPassword) > 0 {
_, err = r.InstallAquaScanner(instance)
if err != nil {
return reconcile.Result{Requeue: true, RequeueAfter: time.Duration(0)}, err
}
if instance.Spec.Scale != nil {
_, err = r.ScaleScannerCLI(instance)
if err != nil {
return reconcile.Result{Requeue: true, RequeueAfter: time.Duration(0)}, err
}
}
} else {
reqLogger.Info("[Warning] missing admin password can't deploy scanner")
}
}
if strings.ToLower(instance.Spec.Infrastructure.Platform) == "openshift" {
if instance.Spec.Route {
_, err = r.CreateRoute(instance)
if err != nil {
return reconcile.Result{Requeue: true, RequeueAfter: time.Duration(0)}, err
}
}
}*/
return ctrl.Result{Requeue: true, RequeueAfter: time.Second * 30}, nil
return ctrl.Result{}, nil
}

// SetupWithManager sets up the controller with the Manager.
Expand Down
4 changes: 2 additions & 2 deletions controllers/operator/aquadatabase/aquadatabase_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ func (r *AquaDatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Request
_ = r.Client.Status().Update(context.Background(), instance)
}

return ctrl.Result{Requeue: true}, nil
return ctrl.Result{}, nil
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -338,7 +338,7 @@ func (r *AquaDatabaseReconciler) InstallDatabaseDeployment(cr *v1alpha1.AquaData

// Deployment already exists - don't requeue
reqLogger.Info("Skip reconcile: Aqua Database Deployment Already Exists", "Deployment.Namespace", found.Namespace, "Deployment.Name", found.Name)
return reconcile.Result{Requeue: true}, nil
return reconcile.Result{}, nil
}

func (r *AquaDatabaseReconciler) InstallDatabaseService(cr *v1alpha1.AquaDatabase, serviceName, app string, servicePort int32) (reconcile.Result, error) {
Expand Down
5 changes: 4 additions & 1 deletion controllers/operator/aquaenforcer/aquaEnforcerHelper.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func (enf *AquaEnforcerHelper) CreateDaemonSet(cr *v1alpha1.AquaEnforcer) *appsv
"aqua.component": "enforcer",
}
annotations := map[string]string{
"description": "Secret for aqua database password",
"description": "Deploy aqua Enforcer",
"ConfigMapChecksum": cr.Spec.ConfigMapChecksum,
}

Expand Down Expand Up @@ -173,6 +173,9 @@ func (enf *AquaEnforcerHelper) CreateDaemonSet(cr *v1alpha1.AquaEnforcer) *appsv
ObjectMeta: metav1.ObjectMeta{
Labels: labels,
Name: fmt.Sprintf(consts.EnforcerDeamonsetName, cr.Name),
Annotations: map[string]string{
"ConfigMapChecksum": cr.Spec.ConfigMapChecksum,
},
},
Spec: corev1.PodSpec{
ServiceAccountName: cr.Spec.Infrastructure.ServiceAccount,
Expand Down
46 changes: 28 additions & 18 deletions controllers/operator/aquaenforcer/aquaenforcer_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,8 @@ func (r *AquaEnforcerReconciler) Reconcile(ctx context.Context, req ctrl.Request
// Fetch the AquaEnforcer instance
instance := &operatorv1alpha1.AquaEnforcer{}
err := r.Client.Get(context.TODO(), req.NamespacedName, instance)
reqLogger.Info(fmt.Sprintf("Enforcer instance: %v", instance))
if err != nil {
reqLogger.Info(fmt.Sprintf("error: %v", err))
if errors.IsNotFound(err) {

// Request object not found, could have been deleted after reconcile request.
// Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.
// Return and don't requeue
Expand All @@ -89,11 +86,10 @@ func (r *AquaEnforcerReconciler) Reconcile(ctx context.Context, req ctrl.Request
// Error reading the object - requeue the request.
return reconcile.Result{}, err
}
reqLogger.Info("Going to updateEnforcerObject")

instance = r.updateEnforcerObject(instance)
r.Client.Update(context.Background(), instance)

reqLogger.Info(fmt.Sprintf("After update object: %v", instance.Spec.EnforcerService))
rbacHelper := common.NewAquaRbacHelper(
instance.Spec.Infrastructure,
instance.Name,
Expand All @@ -113,18 +109,15 @@ func (r *AquaEnforcerReconciler) Reconcile(ctx context.Context, req ctrl.Request
!reflect.DeepEqual(operatorv1alpha1.AquaEnforcerUpdatePendingApproval, currentStatus) &&
!reflect.DeepEqual(operatorv1alpha1.AquaEnforcerUpdateInProgress, currentStatus) {
instance.Status.State = operatorv1alpha1.AquaDeploymentStatePending
reqLogger.Info(fmt.Sprintf("before update state: instance.Spec.EnforcerService: %v", instance.Spec.EnforcerService))
_ = r.Client.Status().Update(context.Background(), instance)
}
reqLogger.Info(fmt.Sprintf("later: instance.Spec.EnforcerService: %v", instance.Spec.EnforcerService))

if instance.Spec.EnforcerService != nil {
if len(instance.Spec.Token) != 0 {
instance.Spec.Secret = &operatorv1alpha1.AquaSecret{
Name: fmt.Sprintf(consts.EnforcerTokenSecretName, instance.Name),
Key: consts.EnforcerTokenSecretKey,
}
reqLogger.Info(fmt.Sprintf("InstallEnforcerToken: %v", instance))

_, err = r.InstallEnforcerToken(instance)
if err != nil {
Expand Down Expand Up @@ -153,7 +146,7 @@ func (r *AquaEnforcerReconciler) Reconcile(ctx context.Context, req ctrl.Request
}
}

return ctrl.Result{Requeue: true}, nil
return ctrl.Result{}, nil
}

// SetupWithManager sets up the controller with the Manager.
Expand All @@ -175,12 +168,11 @@ func (r *AquaEnforcerReconciler) SetupWithManager(mgr ctrl.Manager) error {
*/

func (r *AquaEnforcerReconciler) updateEnforcerObject(cr *operatorv1alpha1.AquaEnforcer) *operatorv1alpha1.AquaEnforcer {
reqLogger := log.WithValues("Aqua Enforcer updateEnforcerObject Phase", "updateEnforcerObject")
version := cr.Spec.Infrastructure.Version
if len(version) == 0 {
version = consts.LatestVersion
}
reqLogger.Info(fmt.Sprintf("before: cr.Spec.EnforcerService: %v", cr.Spec.EnforcerService))

if cr.Spec.EnforcerService == nil {
cr.Spec.EnforcerService = &operatorv1alpha1.AquaService{
ImageData: &operatorv1alpha1.AquaImage{
Expand All @@ -190,7 +182,6 @@ func (r *AquaEnforcerReconciler) updateEnforcerObject(cr *operatorv1alpha1.AquaE
PullPolicy: consts.PullPolicy,
},
}
reqLogger.Info(fmt.Sprintf("after: cr.Spec.EnforcerService: %v", cr.Spec.EnforcerService))
}

cr.Spec.Infrastructure = common.UpdateAquaInfrastructure(cr.Spec.Infrastructure, cr.Name, cr.Namespace)
Expand Down Expand Up @@ -285,7 +276,7 @@ func (r *AquaEnforcerReconciler) InstallEnforcerDaemonSet(cr *operatorv1alpha1.A

// DaemonSet already exists - don't requeue
reqLogger.Info("Skip reconcile: Aqua Enforcer DaemonSet Already Exists", "DaemonSet.Namespace", found.Namespace, "DaemonSet.Name", found.Name)
return reconcile.Result{Requeue: true}, nil
return reconcile.Result{}, nil
}

func (r *AquaEnforcerReconciler) InstallEnforcerToken(cr *operatorv1alpha1.AquaEnforcer) (reconcile.Result, error) {
Expand All @@ -295,17 +286,23 @@ func (r *AquaEnforcerReconciler) InstallEnforcerToken(cr *operatorv1alpha1.AquaE
// Define a new DaemonSet object
enforcerHelper := newAquaEnforcerHelper(cr)
token := enforcerHelper.CreateTokenSecret(cr)
// Adding token to the hashed data, for restart pods if token is changed
hash, err := extra.GenerateMD5ForSpec(token.Data)
if err != nil {
return reconcile.Result{}, err
}
cr.Spec.ConfigMapChecksum += hash

// Set AquaEnforcer instance as the owner and controller
if err := controllerutil.SetControllerReference(cr, token, r.Scheme); err != nil {
return reconcile.Result{}, err
}

// Check if this DaemonSet already exists
// Check if this Secret already exists
found := &corev1.Secret{}
err := r.Client.Get(context.TODO(), types.NamespacedName{Name: token.Name, Namespace: token.Namespace}, found)
err = r.Client.Get(context.TODO(), types.NamespacedName{Name: token.Name, Namespace: token.Namespace}, found)
if err != nil && errors.IsNotFound(err) {
reqLogger.Info("Creating a New Aqua Database", "Secret.Namespace", token.Namespace, "Secret.Name", token.Name)
reqLogger.Info("Creating a New Enforcer Token Secret", "Secret.Namespace", token.Namespace, "Secret.Name", token.Name)
err = r.Client.Create(context.TODO(), token)
if err != nil {
return reconcile.Result{}, err
Expand All @@ -316,9 +313,21 @@ func (r *AquaEnforcerReconciler) InstallEnforcerToken(cr *operatorv1alpha1.AquaE
return reconcile.Result{}, err
}

if !equality.Semantic.DeepDerivative(token.Data, found.Data) {
found = token
log.Info("Aqua Enforcer: Updating Enforcer Token Secret", "Secret.Namespace", found.Namespace, "Secret.Name", found.Name)
err := r.Client.Update(context.TODO(), found)
if err != nil {
log.Error(err, "Failed to update Enforcer Token Secret", "Secret.Namespace", found.Namespace, "Secret.Name", found.Name)
return reconcile.Result{}, err
}

return reconcile.Result{Requeue: true}, nil
}

// Secret already exists - don't requeue
reqLogger.Info("Skip reconcile: Aqua Enforcer Token Secret Already Exists", "Secret.Namespace", found.Namespace, "Secret.Name", found.Name)
return reconcile.Result{Requeue: true}, nil
return reconcile.Result{}, nil
}

func (r *AquaEnforcerReconciler) addEnforcerConfigMap(cr *operatorv1alpha1.AquaEnforcer) (reconcile.Result, error) {
Expand All @@ -330,11 +339,12 @@ func (r *AquaEnforcerReconciler) addEnforcerConfigMap(cr *operatorv1alpha1.AquaE
enforcerHelper := newAquaEnforcerHelper(cr)

configMap := enforcerHelper.CreateConfigMap(cr)
// Adding configmap to the hashed data, for restart pods if token is changed
hash, err := extra.GenerateMD5ForSpec(configMap.Data)
if err != nil {
return reconcile.Result{}, err
}
cr.Spec.ConfigMapChecksum = hash
cr.Spec.ConfigMapChecksum += hash

// Set AquaScanner instance as the owner and controller
if err := controllerutil.SetControllerReference(cr, configMap, r.Scheme); err != nil {
Expand Down
4 changes: 2 additions & 2 deletions controllers/operator/aquagateway/aquagateway_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ func (r *AquaGatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request)
}
}

return ctrl.Result{Requeue: true}, nil
return ctrl.Result{}, nil
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -265,7 +265,7 @@ func (r *AquaGatewayReconciler) InstallGatewayDeployment(cr *operatorv1alpha1.Aq

// Deployment already exists - don't requeue
reqLogger.Info("Skip reconcile: Aqua Gateway Deployment Already Exists", "Deployment.Namespace", found.Namespace, "Deployment.Name", found.Name)
return reconcile.Result{Requeue: true, RequeueAfter: time.Duration(0)}, nil
return reconcile.Result{}, nil
}

func (r *AquaGatewayReconciler) InstallGatewayService(cr *operatorv1alpha1.AquaGateway) (reconcile.Result, error) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,9 @@ func (enf *AquaKubeEnforcerHelper) CreateKEDeployment(cr *operatorv1alpha1.AquaK
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: selectors,
Annotations: map[string]string{
"ConfigMapChecksum": cr.Spec.ConfigMapChecksum,
},
},
Spec: corev1.PodSpec{
SecurityContext: &corev1.PodSecurityContext{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ func (r *AquaKubeEnforcerReconciler) Reconcile(ctx context.Context, req ctrl.Req
r.installAquaStarboard(instance)
}

return ctrl.Result{Requeue: true}, nil
return ctrl.Result{}, nil
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -505,7 +505,7 @@ func (r *AquaKubeEnforcerReconciler) addKEDeployment(cr *operatorv1alpha1.AquaKu

// object already exists - don't requeue
reqLogger.Info("Skip reconcile: Aqua KubeEnforcer Deployment Exists", "Deployment.Namespace", found.Namespace, "Deployment.Name", found.Name)
return reconcile.Result{Requeue: true}, nil
return reconcile.Result{}, nil
}

func (r *AquaKubeEnforcerReconciler) addKubeEnforcerClusterRole(cr *operatorv1alpha1.AquaKubeEnforcer) (reconcile.Result, error) {
Expand Down Expand Up @@ -855,11 +855,12 @@ func (r *AquaKubeEnforcerReconciler) addKEConfigMap(cr *operatorv1alpha1.AquaKub
cr.Spec.Config.GatewayAddress,
cr.Spec.Config.ClusterName,
deployStarboard)
// Adding configmap to the hashed data, for restart pods if token is changed
hash, err := extra.GenerateMD5ForSpec(configMap.Data)
if err != nil {
return reconcile.Result{}, err
}
cr.Spec.ConfigMapChecksum = hash
cr.Spec.ConfigMapChecksum += hash

// Set AquaKubeEnforcer instance as the owner and controller
if err := controllerutil.SetControllerReference(cr, configMap, r.Scheme); err != nil {
Expand Down Expand Up @@ -909,6 +910,12 @@ func (r *AquaKubeEnforcerReconciler) addKESecretToken(cr *operatorv1alpha1.AquaK
"aqua-kube-enforcer-token",
"ke-token-secret",
cr.Spec.Token)
// Adding secret to the hashed data, for restart pods if token is changed
hash, err := extra.GenerateMD5ForSpec(tokenSecret.Data)
if err != nil {
return reconcile.Result{}, err
}
cr.Spec.ConfigMapChecksum += hash

// Set AquaKubeEnforcer instance as the owner and controller
if err := controllerutil.SetControllerReference(cr, tokenSecret, r.Scheme); err != nil {
Expand All @@ -917,7 +924,7 @@ func (r *AquaKubeEnforcerReconciler) addKESecretToken(cr *operatorv1alpha1.AquaK

// Check if this object already exists
found := &corev1.Secret{}
err := r.Client.Get(context.TODO(), types.NamespacedName{Name: tokenSecret.Name, Namespace: tokenSecret.Namespace}, found)
err = r.Client.Get(context.TODO(), types.NamespacedName{Name: tokenSecret.Name, Namespace: tokenSecret.Namespace}, found)
if err != nil && errors.IsNotFound(err) {
reqLogger.Info("Aqua KubeEnforcer: Creating a New token secret", "Secret.Namespace", tokenSecret.Namespace, "Secret.Name", tokenSecret.Name)
err = r.Client.Create(context.TODO(), tokenSecret)
Expand All @@ -930,6 +937,18 @@ func (r *AquaKubeEnforcerReconciler) addKESecretToken(cr *operatorv1alpha1.AquaK
return reconcile.Result{}, err
}

if !equality.Semantic.DeepDerivative(tokenSecret.Data, found.Data) {
found = tokenSecret
log.Info("Aqua Enforcer: Updating KubeEnforcer Token Secret", "Secret.Namespace", found.Namespace, "Secret.Name", found.Name)
err := r.Client.Update(context.TODO(), found)
if err != nil {
log.Error(err, "Failed to update KubeEnforcer Token Secret", "Secret.Namespace", found.Namespace, "Secret.Name", found.Name)
return reconcile.Result{}, err
}

return reconcile.Result{Requeue: true}, nil
}

// object already exists - don't requeue
reqLogger.Info("Skip reconcile: Aqua KubeEnforcer Token Secret Exists", "Secret.Namespace", found.Namespace, "Secret.Name", found.Name)
return reconcile.Result{Requeue: true}, nil
Expand Down
3 changes: 3 additions & 0 deletions controllers/operator/aquascanner/aquaScannerHelper.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ func (as *AquaScannerHelper) newDeployment(cr *v1alpha1.AquaScanner) *appsv1.Dep
ObjectMeta: metav1.ObjectMeta{
Labels: labels,
Name: fmt.Sprintf(consts.ScannerDeployName, cr.Name),
Annotations: map[string]string{
"ConfigMapChecksum": cr.Spec.ConfigMapChecksum,
},
},
Spec: corev1.PodSpec{
ServiceAccountName: cr.Spec.Infrastructure.ServiceAccount,
Expand Down
Loading

0 comments on commit 96443a8

Please sign in to comment.