Skip to content

Commit

Permalink
refactor: separate scan job with different reconciler (#727)
Browse files Browse the repository at this point in the history
* refactor: separate scan job with different reconciler

Signed-off-by: chenk <hen.keinan@gmail.com>

* refactor: separate scan job with different reconciler

Signed-off-by: chenk <hen.keinan@gmail.com>

* refactor: separate scan job with different reconciler

Signed-off-by: chenk <hen.keinan@gmail.com>

* refactor: separate scan job with different reconciler

Signed-off-by: chenk <hen.keinan@gmail.com>

* refactor: separate scan job with different reconciler

Signed-off-by: chenk <hen.keinan@gmail.com>

Signed-off-by: chenk <hen.keinan@gmail.com>
  • Loading branch information
chen-keinan authored Nov 23, 2022
1 parent 91d3f03 commit dcc63aa
Show file tree
Hide file tree
Showing 6 changed files with 374 additions and 305 deletions.
18 changes: 16 additions & 2 deletions pkg/operator/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/aquasecurity/trivy-operator/pkg/rbacassessment"
"github.com/aquasecurity/trivy-operator/pkg/trivyoperator"
"github.com/aquasecurity/trivy-operator/pkg/vulnerabilityreport"
vcontroller "github.com/aquasecurity/trivy-operator/pkg/vulnerabilityreport/controller"
"github.com/aquasecurity/trivy-operator/pkg/webhook"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
Expand Down Expand Up @@ -163,14 +164,13 @@ func Start(ctx context.Context, buildInfo trivyoperator.BuildInfo, operatorConfi
return fmt.Errorf("initializing %s plugin: %w", pluginContext.GetName(), err)
}

if err = (&vulnerabilityreport.WorkloadController{
if err = (&vcontroller.WorkloadController{
Logger: ctrl.Log.WithName("reconciler").WithName("vulnerabilityreport"),
Config: operatorConfig,
ConfigData: trivyOperatorConfig,
Client: mgr.GetClient(),
ObjectResolver: objectResolver,
LimitChecker: limitChecker,
LogsReader: logsReader,
SecretsReader: secretsReader,
Plugin: plugin,
PluginContext: pluginContext,
Expand All @@ -180,6 +180,20 @@ func Start(ctx context.Context, buildInfo trivyoperator.BuildInfo, operatorConfi
return fmt.Errorf("unable to setup vulnerabilityreport reconciler: %w", err)
}

if err = (&vcontroller.ScanJobController{
Logger: ctrl.Log.WithName("reconciler").WithName("scan job"),
Config: operatorConfig,
ConfigData: trivyOperatorConfig,
ObjectResolver: objectResolver,
LogsReader: logsReader,
Plugin: plugin,
PluginContext: pluginContext,
VulnerabilityReadWriter: vulnerabilityreport.NewReadWriter(&objectResolver),
ExposedSecretReadWriter: exposedsecretreport.NewReadWriter(&objectResolver),
}).SetupWithManager(mgr); err != nil {
return fmt.Errorf("unable to setup scan job reconciler: %w", err)
}

if operatorConfig.ScannerReportTTL != nil {
if err = (&TTLReportReconciler{
Logger: ctrl.Log.WithName("reconciler").WithName("ttlreport"),
Expand Down
8 changes: 4 additions & 4 deletions pkg/trivyoperator/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ type ConfigManager interface {
// GetDefaultConfig returns the default configuration settings.
func GetDefaultConfig() ConfigData {
return map[string]string{
keyVulnerabilityReportsScanner: "Trivy",
keyConfigAuditReportsScanner: "Trivy",
KeyScanJobcompressLogs: "true",
"compliance.failEntriesLimit": "10",
keyVulnerabilityReportsScanner: "Trivy",
keyConfigAuditReportsScanner: "Trivy",
KeyScanJobcompressLogs: "true",
"compliance.failEntriesLimit": "10",
KeyReportRecordFailedChecksOnly: "true",
}
}
Expand Down
72 changes: 72 additions & 0 deletions pkg/vulnerabilityreport/controller/helper.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package controller

import (
"context"
"reflect"

"github.com/aquasecurity/trivy-operator/pkg/exposedsecretreport"
"github.com/aquasecurity/trivy-operator/pkg/kube"
"github.com/aquasecurity/trivy-operator/pkg/trivyoperator"
"github.com/aquasecurity/trivy-operator/pkg/vulnerabilityreport"
)

func hasReports(ctx context.Context, esReadWriter exposedsecretreport.ReadWriter, vulnReadWriter vulnerabilityreport.ReadWriter, owner kube.ObjectRef, hash string, images kube.ContainerImages) (bool, error) {
hasVulnerabilityReports, err := hasVulnerabilityReports(ctx, vulnReadWriter, owner, hash, images)
if err != nil {
return false, err
}

hasSecretReports, err := hasSecretReports(ctx, esReadWriter, owner, hash, images)
if err != nil {
return false, err
}

return hasVulnerabilityReports && hasSecretReports, nil
}

func hasVulnerabilityReports(ctx context.Context, vulnReadWriter vulnerabilityreport.ReadWriter, owner kube.ObjectRef, hash string, images kube.ContainerImages) (bool, error) {
// TODO FindByOwner should accept optional label selector to further narrow down search results
list, err := vulnReadWriter.FindByOwner(ctx, owner)
if err != nil {
return false, err
}

actual := map[string]bool{}
for _, report := range list {
if containerName, ok := report.Labels[trivyoperator.LabelContainerName]; ok {
if hash == report.Labels[trivyoperator.LabelResourceSpecHash] {
actual[containerName] = true
}
}
}

return compareReports(actual, images), nil
}

func hasSecretReports(ctx context.Context, esReadWriter exposedsecretreport.ReadWriter, owner kube.ObjectRef, hash string, images kube.ContainerImages) (bool, error) {
// TODO FindByOwner should accept optional label selector to further narrow down search results
list, err := esReadWriter.FindByOwner(ctx, owner)
if err != nil {
return false, err
}

actual := map[string]bool{}
for _, report := range list {
if containerName, ok := report.Labels[trivyoperator.LabelContainerName]; ok {
if hash == report.Labels[trivyoperator.LabelResourceSpecHash] {
actual[containerName] = true
}
}
}

return compareReports(actual, images), nil
}

func compareReports(actual map[string]bool, images kube.ContainerImages) bool {
expected := map[string]bool{}
for containerName := range images {
expected[containerName] = true
}

return reflect.DeepEqual(actual, expected)
}
Loading

0 comments on commit dcc63aa

Please sign in to comment.