Skip to content

Commit

Permalink
refactor: kubehunter package (#330)
Browse files Browse the repository at this point in the history
Signed-off-by: Daniel Pacak <pacak.daniel@gmail.com>
  • Loading branch information
danielpacak committed Jan 11, 2021
1 parent 69e885c commit 64802a7
Show file tree
Hide file tree
Showing 4 changed files with 152 additions and 63 deletions.
10 changes: 4 additions & 6 deletions pkg/cmd/scan_kubehunter.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ package cmd
import (
"context"

"github.com/aquasecurity/starboard/pkg/starboard"

starboardapi "github.com/aquasecurity/starboard/pkg/generated/clientset/versioned"
"github.com/aquasecurity/starboard/pkg/generated/clientset/versioned"
"github.com/aquasecurity/starboard/pkg/kubehunter"
"github.com/aquasecurity/starboard/pkg/kubehunter/crd"
"github.com/aquasecurity/starboard/pkg/starboard"
"github.com/spf13/cobra"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/kubernetes"
Expand Down Expand Up @@ -56,10 +54,10 @@ func ScanKubeHunterReports(cf *genericclioptions.ConfigFlags) func(cmd *cobra.Co
if err != nil {
return err
}
starboardClientset, err := starboardapi.NewForConfig(kubeConfig)
starboardClientset, err := versioned.NewForConfig(kubeConfig)
if err != nil {
return err
}
return crd.NewWriter(starboardClientset).Write(ctx, report, kubeHunterReportName)
return kubehunter.NewWriter(starboardClientset).Write(ctx, report, kubeHunterReportName)
}
}
55 changes: 0 additions & 55 deletions pkg/kubehunter/crd/writer.go

This file was deleted.

47 changes: 45 additions & 2 deletions pkg/kubehunter/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,53 @@ package kubehunter

import (
"context"
"errors"
"strings"

starboard "github.com/aquasecurity/starboard/pkg/apis/aquasecurity/v1alpha1"
"github.com/aquasecurity/starboard/pkg/apis/aquasecurity/v1alpha1"
"github.com/aquasecurity/starboard/pkg/generated/clientset/versioned"
"github.com/aquasecurity/starboard/pkg/kube"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type Writer interface {
Write(ctx context.Context, report starboard.KubeHunterOutput, cluster string) error
Write(ctx context.Context, report v1alpha1.KubeHunterOutput, cluster string) error
}

type writer struct {
clientset versioned.Interface
}

func NewWriter(clientset versioned.Interface) Writer {
return &writer{
clientset: clientset,
}
}

func (w *writer) Write(ctx context.Context, report v1alpha1.KubeHunterOutput, cluster string) error {
if strings.TrimSpace(cluster) == "" {
return errors.New("cluster name must not be blank")
}
_, err := w.clientset.AquasecurityV1alpha1().KubeHunterReports().Create(ctx, &v1alpha1.KubeHunterReport{
ObjectMeta: metav1.ObjectMeta{
Name: cluster,
Labels: map[string]string{
kube.LabelResourceKind: "Cluster",
kube.LabelResourceName: cluster,
},
},
Report: report,
}, metav1.CreateOptions{})
if err != nil && apierrors.IsAlreadyExists(err) {
found, err := w.clientset.AquasecurityV1alpha1().KubeHunterReports().Get(ctx, cluster, metav1.GetOptions{})
if err != nil {
return err
}
deepCopy := found.DeepCopy()
deepCopy.Report = report
_, err = w.clientset.AquasecurityV1alpha1().KubeHunterReports().Update(ctx, deepCopy, metav1.UpdateOptions{})
return err
}
return err
}
103 changes: 103 additions & 0 deletions pkg/kubehunter/writer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package kubehunter_test

import (
"context"
"testing"

"github.com/aquasecurity/starboard/pkg/apis/aquasecurity/v1alpha1"
"github.com/aquasecurity/starboard/pkg/generated/clientset/versioned/fake"
"github.com/aquasecurity/starboard/pkg/kube"
"github.com/aquasecurity/starboard/pkg/kubehunter"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func TestWriter_Write(t *testing.T) {

t.Run("Should create KubeHunterReport", func(t *testing.T) {
clientset := fake.NewSimpleClientset()

writer := kubehunter.NewWriter(clientset)
err := writer.Write(context.TODO(), v1alpha1.KubeHunterOutput{
Summary: v1alpha1.KubeHunterSummary{
HighCount: 7,
},
}, "my-cluster")
require.NoError(t, err)

list, err := clientset.AquasecurityV1alpha1().KubeHunterReports().List(context.TODO(), metav1.ListOptions{})
require.NoError(t, err)

reports := map[string]v1alpha1.KubeHunterReport{}
for _, item := range list.Items {
reports[item.Name] = item
}
assert.Equal(t, map[string]v1alpha1.KubeHunterReport{
"my-cluster": {
ObjectMeta: metav1.ObjectMeta{
Name: "my-cluster",
Labels: map[string]string{
kube.LabelResourceKind: "Cluster",
kube.LabelResourceName: "my-cluster",
},
},
Report: v1alpha1.KubeHunterOutput{
Summary: v1alpha1.KubeHunterSummary{
HighCount: 7,
},
},
},
}, reports)
})

t.Run("Should update KubeHunterReport", func(t *testing.T) {
clientset := fake.NewSimpleClientset(&v1alpha1.KubeHunterReport{
ObjectMeta: metav1.ObjectMeta{
Name: "my-cluster",
Labels: map[string]string{
kube.LabelResourceKind: "Cluster",
kube.LabelResourceName: "my-cluster",
},
},
Report: v1alpha1.KubeHunterOutput{
Summary: v1alpha1.KubeHunterSummary{
HighCount: 1,
},
},
})

writer := kubehunter.NewWriter(clientset)
err := writer.Write(context.TODO(), v1alpha1.KubeHunterOutput{
Summary: v1alpha1.KubeHunterSummary{
HighCount: 3,
},
}, "my-cluster")
require.NoError(t, err)

list, err := clientset.AquasecurityV1alpha1().KubeHunterReports().List(context.TODO(), metav1.ListOptions{})
require.NoError(t, err)

reports := map[string]v1alpha1.KubeHunterReport{}
for _, item := range list.Items {
reports[item.Name] = item
}
assert.Equal(t, map[string]v1alpha1.KubeHunterReport{
"my-cluster": {
ObjectMeta: metav1.ObjectMeta{
Name: "my-cluster",
Labels: map[string]string{
kube.LabelResourceKind: "Cluster",
kube.LabelResourceName: "my-cluster",
},
},
Report: v1alpha1.KubeHunterOutput{
Summary: v1alpha1.KubeHunterSummary{
HighCount: 3,
},
},
},
}, reports)
})

}

0 comments on commit 64802a7

Please sign in to comment.