Skip to content

Commit

Permalink
feat: integration ready for first review
Browse files Browse the repository at this point in the history
Signed-off-by: Alex Jones <alexsimonjones@gmail.com>
  • Loading branch information
AlexsJones committed Apr 11, 2023
1 parent c809af3 commit 3682f5c
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 23 deletions.
10 changes: 9 additions & 1 deletion cmd/analyze/analyze.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,15 @@ var AnalyzeCmd = &cobra.Command{

ctx := context.Background()
// Get kubernetes client from viper
client := viper.Get("kubernetesClient").(*kubernetes.Client)

kubecontext := viper.GetString("kubecontext")
kubeconfig := viper.GetString("kubeconfig")
client, err := kubernetes.NewClient(kubecontext, kubeconfig)
if err != nil {
color.Red("Error initialising kubernetes client: %v", err)
os.Exit(1)
}

// AnalysisResult configuration
config := &analysis.Analysis{
Namespace: namespace,
Expand Down
3 changes: 2 additions & 1 deletion cmd/filters/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ var addCmd = &cobra.Command{
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
inputFilters := strings.Split(args[0], ",")
coreFilters, additionalFilters := analyzer.ListFilters()
coreFilters, additionalFilters, integrationFilters := analyzer.ListFilters()

availableFilters := append(coreFilters, additionalFilters...)
availableFilters = append(availableFilters, integrationFilters...)

// Verify filter exist
invalidFilters := []string{}
Expand Down
19 changes: 17 additions & 2 deletions cmd/filters/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/fatih/color"
"github.com/k8sgpt-ai/k8sgpt/pkg/analyzer"
"github.com/k8sgpt-ai/k8sgpt/pkg/integration"
"github.com/k8sgpt-ai/k8sgpt/pkg/util"
"github.com/spf13/cobra"
"github.com/spf13/viper"
Expand All @@ -16,18 +17,32 @@ var listCmd = &cobra.Command{
Long: `The list command displays a list of available filters that can be used to analyze Kubernetes resources.`,
Run: func(cmd *cobra.Command, args []string) {
activeFilters := viper.GetStringSlice("active_filters")
coreFilters, additionalFilters := analyzer.ListFilters()
coreFilters, additionalFilters, integrationFilters := analyzer.ListFilters()

availableFilters := append(coreFilters, additionalFilters...)
availableFilters = append(availableFilters, integrationFilters...)
if len(activeFilters) == 0 {
activeFilters = coreFilters
}

inactiveFilters := util.SliceDiff(availableFilters, activeFilters)
fmt.Printf(color.YellowString("Active: \n"))
for _, filter := range activeFilters {
fmt.Printf("> %s\n", color.GreenString(filter))
}

// Add integrations ( which are dynamic ) to active filters
integrationProvider := integration.NewIntegration()
fmt.Printf(color.BlueString("Active Integrations: \n"))
for _, filter := range integrationFilters {
b, err := integrationProvider.IsActivate(filter)
if err != nil {
fmt.Printf(color.RedString("Error: %s", err))
}
if b {
fmt.Printf("> %s\n", color.GreenString(filter))
}
}

// display inactive filters
if len(inactiveFilters) != 0 {
fmt.Printf(color.YellowString("Unused: \n"))
Expand Down
2 changes: 1 addition & 1 deletion cmd/filters/remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ var removeCmd = &cobra.Command{

// Get defined active_filters
activeFilters := viper.GetStringSlice("active_filters")
coreFilters, _ := analyzer.ListFilters()
coreFilters, _, _ := analyzer.ListFilters()

if len(activeFilters) == 0 {
activeFilters = coreFilters
Expand Down
5 changes: 3 additions & 2 deletions cmd/integration/integration.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ var (

// IntegrationCmd represents the integrate command
var IntegrationCmd = &cobra.Command{
Use: "integration",
Short: "Intergrate another tool into K8sGPT",
Use: "integration",
Aliases: []string{"integrations"},
Short: "Intergrate another tool into K8sGPT",
Long: `Intergrate another tool into K8sGPT. For example:
k8sgpt integration activate trivy
Expand Down
12 changes: 2 additions & 10 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ import (
"os"
"path/filepath"

"github.com/fatih/color"
"github.com/k8sgpt-ai/k8sgpt/cmd/analyze"
"github.com/k8sgpt-ai/k8sgpt/cmd/auth"
"github.com/k8sgpt-ai/k8sgpt/cmd/filters"
"github.com/k8sgpt-ai/k8sgpt/cmd/generate"
"github.com/k8sgpt-ai/k8sgpt/cmd/integration"
"github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"k8s.io/client-go/util/homedir"
Expand Down Expand Up @@ -78,14 +76,8 @@ func initConfig() {
viper.SafeWriteConfig()
}

//Initialise the kubeconfig
kubernetesClient, err := kubernetes.NewClient(kubecontext, kubeconfig)
if err != nil {
color.Red("Error initialising kubernetes client: %v", err)
os.Exit(1)
}

viper.Set("kubernetesClient", kubernetesClient)
viper.Set("kubecontext", kubecontext)
viper.Set("kubeconfig", kubeconfig)

viper.AutomaticEnv() // read in environment variables that match

Expand Down
11 changes: 9 additions & 2 deletions pkg/analyzer/analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ var additionalAnalyzerMap = map[string]common.IAnalyzer{
"PodDisruptionBudget": PdbAnalyzer{},
}

func ListFilters() ([]string, []string) {
func ListFilters() ([]string, []string, []string) {
coreKeys := make([]string, 0, len(coreAnalyzerMap))
for k := range coreAnalyzerMap {
coreKeys = append(coreKeys, k)
Expand All @@ -33,7 +33,14 @@ func ListFilters() ([]string, []string) {
for k := range additionalAnalyzerMap {
additionalKeys = append(additionalKeys, k)
}
return coreKeys, additionalKeys

intList := integration.NewIntegration().List()
integrationKeys := make([]string, 0, len(intList))
for _, k := range integration.NewIntegration().List() {
integrationKeys = append(integrationKeys, k)
}

return coreKeys, additionalKeys, integrationKeys
}

func GetAnalyzerMap() map[string]common.IAnalyzer {
Expand Down
2 changes: 1 addition & 1 deletion pkg/integration/integration.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type Integration struct {
}

var integrations = map[string]IIntegration{
"trivy": trivy.NewTrivy(),
"VulnerabilityReport": trivy.NewTrivy(),
}

func NewIntegration() *Integration {
Expand Down
15 changes: 13 additions & 2 deletions pkg/integration/trivy/analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/aquasecurity/trivy-operator/pkg/apis/aquasecurity/v1alpha1"
"github.com/k8sgpt-ai/k8sgpt/pkg/common"
"github.com/k8sgpt-ai/k8sgpt/pkg/util"
"k8s.io/client-go/rest"
)

type TrivyAnalyzer struct {
Expand All @@ -16,7 +17,17 @@ func (TrivyAnalyzer) Analyze(a common.Analyzer) ([]common.Result, error) {
// Get all trivy VulnerabilityReports
result := &v1alpha1.VulnerabilityReportList{}

err := a.Client.GetRestClient().Get().Namespace(a.Namespace).Resource("vulnerabilityreports").Do(a.Context).Into(result)
config := a.Client.GetConfig()
// Add group version to sceheme
config.ContentConfig.GroupVersion = &v1alpha1.SchemeGroupVersion
config.UserAgent = rest.DefaultKubernetesUserAgent()
config.APIPath = "/apis"

restClient, err := rest.UnversionedRESTClientFor(config)
if err != nil {
return nil, err
}
err = restClient.Get().Resource("vulnerabilityreports").Do(a.Context).Into(result)
if err != nil {
return nil, err
}
Expand All @@ -32,7 +43,7 @@ func (TrivyAnalyzer) Analyze(a common.Analyzer) ([]common.Result, error) {
if vuln.Severity == "CRITICAL" {
// get the vulnerability ID
// get the vulnerability description
failures = append(failures, fmt.Sprintf("Critical Vulnerability found ID: %s, Description: %s", vuln.VulnerabilityID, vuln.Description))
failures = append(failures, fmt.Sprintf("critical Vulnerability found ID: %s", vuln.VulnerabilityID))
}
}
if len(failures) > 0 {
Expand Down
2 changes: 1 addition & 1 deletion pkg/integration/trivy/trivy.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func (t *Trivy) IsActivate() bool {

func (t *Trivy) AddAnalyzer(mergedMap *map[string]common.IAnalyzer) {

(*mergedMap)["trivy"] = &TrivyAnalyzer{}
(*mergedMap)["VulnerabilityReport"] = &TrivyAnalyzer{}

}

Expand Down
6 changes: 6 additions & 0 deletions pkg/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ import (
type Client struct {
Client kubernetes.Interface
RestClient rest.Interface
Config *rest.Config
}

func (c *Client) GetConfig() *rest.Config {
return c.Config
}

func (c *Client) GetClient() kubernetes.Interface {
Expand Down Expand Up @@ -49,5 +54,6 @@ func NewClient(kubecontext string, kubeconfig string) (*Client, error) {
return &Client{
Client: clientSet,
RestClient: restClient,
Config: c,
}, nil
}

0 comments on commit 3682f5c

Please sign in to comment.