Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

selinux: Use events in the selinux controller #337

Merged
merged 1 commit into from
Apr 23, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
25 changes: 25 additions & 0 deletions internal/pkg/daemon/selinuxprofile/selinuxpolicy_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import (

statusv1alpha1 "sigs.k8s.io/security-profiles-operator/api/secprofnodestatus/v1alpha1"
selinuxprofilev1alpha1 "sigs.k8s.io/security-profiles-operator/api/selinuxprofile/v1alpha1"
"sigs.k8s.io/security-profiles-operator/internal/pkg/config"
"sigs.k8s.io/security-profiles-operator/internal/pkg/manager/spod/bindata"
"sigs.k8s.io/security-profiles-operator/internal/pkg/nodestatus"
)
Expand Down Expand Up @@ -71,6 +72,17 @@ type sePolStatus struct {
Status sePolStatusType
}

const (
reasonCannotContactSelinuxd event.Reason = "CannotContactSelinuxd"
reasonCannotRemovePolicy event.Reason = "CannotRemoveSelinuxPolicy"
reasonCannotInstallPolicy event.Reason = "CannotSaveSelinuxPolicy"
reasonCannotWritePolicyFile event.Reason = "CannotWritePolicyFile"
reasonCannotGetPolicyStatus event.Reason = "CannotGetPolicyStatus"
reasonCannotUpdatePolicyStatus event.Reason = "CannotUpdatePolicyStatus"

reasonInstalledPolicy event.Reason = "SavedSelinuxPolicy"
)

// blank assignment to verify that ReconcileSelinuxProfile implements `reconcile.Reconciler`.
var _ reconcile.Reconciler = &ReconcileSP{}

Expand Down Expand Up @@ -129,6 +141,7 @@ func (r *ReconcileSP) Reconcile(_ context.Context, request reconcile.Request) (r

if err := nodeStatus.SetNodeStatus(context.TODO(), statusv1alpha1.ProfileStateTerminating); err != nil {
reqLogger.Error(err, "cannot update SELinux profile status")
r.record.Event(instance, event.Warning(reasonCannotUpdatePolicyStatus, err))
return reconcile.Result{}, errors.Wrap(err, "updating status for deleted SELinux profile")
}

Expand All @@ -142,11 +155,13 @@ func (r *ReconcileSP) Reconcile(_ context.Context, request reconcile.Request) (r

res, err := r.reconcileDeletePolicy(instance, nodeStatus, reqLogger)
if res.Requeue || err != nil {
r.record.Event(instance, event.Warning(reasonCannotRemovePolicy, err))
return res, err
}

if err := nodeStatus.Remove(context.TODO(), r.client); err != nil {
reqLogger.Error(err, "cannot remove finalizer from SELinux profile")
r.record.Event(instance, event.Warning(reasonCannotUpdatePolicyStatus, err))
return ctrl.Result{}, errors.Wrap(err, "deleting finalizer for deleted SELinux profile")
}

Expand All @@ -158,26 +173,31 @@ func (r *ReconcileSP) reconcilePolicy(
) (reconcile.Result, error) {
selinuxdReady, err := isSelinuxdReady()
if err != nil {
r.record.Event(sp, event.Warning(reasonCannotContactSelinuxd, err))
return reconcile.Result{}, errors.Wrap(err, "contacting selinuxd")
}
if !selinuxdReady {
l.Info("selinuxd not yet up, requeue")
r.record.Event(sp, event.Normal(reasonCannotContactSelinuxd, "selinuxd not yet up, requeue"))
return reconcile.Result{Requeue: true}, nil
}

err = r.reconcilePolicyFile(sp, l)
if err != nil {
r.record.Event(sp, event.Warning(reasonCannotWritePolicyFile, err))
return reconcile.Result{}, errors.Wrap(err, "Creating policy file")
}

l.Info("Checking if policy deployed", "policyName", sp.Name)
polStatus, err := getPolicyStatus(sp)
if err != nil {
r.record.Event(sp, event.Warning(reasonCannotGetPolicyStatus, err))
return reconcile.Result{}, errors.Wrap(err, "Looking up policy status")
}

if polStatus == nil {
if err := nodeStatus.SetNodeStatus(context.TODO(), statusv1alpha1.ProfileStateInProgress); err != nil {
r.record.Event(sp, event.Warning(reasonCannotUpdatePolicyStatus, err))
return reconcile.Result{}, errors.Wrap(err, "setting node status to in progress")
}
return reconcile.Result{Requeue: true}, nil
Expand All @@ -188,13 +208,18 @@ func (r *ReconcileSP) reconcilePolicy(
switch polStatus.Status {
case installedStatus:
polState = statusv1alpha1.ProfileStateInstalled
evstr := fmt.Sprintf("Successfully saved profile to disk on %s", os.Getenv(config.NodeNameEnvKey))
r.record.Event(sp, event.Normal(reasonInstalledPolicy, evstr))
case failedStatus:
polState = statusv1alpha1.ProfileStateError
evstr := fmt.Sprintf("Successfully saved profile to disk on %s", os.Getenv(config.NodeNameEnvKey))
r.record.Event(sp, event.Warning(reasonCannotInstallPolicy, errors.New(evstr)))
}

l.Info("Policy deployed", "status", polState)

if err := nodeStatus.SetNodeStatus(context.TODO(), polState); err != nil {
r.record.Event(sp, event.Warning(reasonCannotUpdatePolicyStatus, err))
return reconcile.Result{}, errors.Wrap(err, "setting profile status")
}

Expand Down