package resourcehandler import ( "fmt" "github.com/kubescape/go-logger" "github.com/kubescape/go-logger/helpers" "github.com/kubescape/k8s-interface/k8sinterface" "github.com/kubescape/k8s-interface/workloadinterface" "github.com/kubescape/opa-utils/objectsenvelopes" ) func addWorkloadsToResourcesMap(allResources map[string][]workloadinterface.IMetadata, workloads []workloadinterface.IMetadata) { for i := range workloads { groupVersionResource, err := k8sinterface.GetGroupVersionResource(workloads[i].GetKind()) if err != nil { // TODO - print warning continue } if k8sinterface.IsTypeWorkload(workloads[i].GetObject()) { w := workloadinterface.NewWorkloadObj(workloads[i].GetObject()) if groupVersionResource.Group != w.GetGroup() || groupVersionResource.Version != w.GetVersion() { // TODO - print warning continue } } resourceTriplets := k8sinterface.JoinResourceTriplets(groupVersionResource.Group, groupVersionResource.Version, groupVersionResource.Resource) if r, ok := allResources[resourceTriplets]; ok { allResources[resourceTriplets] = append(r, workloads[i]) } else { allResources[resourceTriplets] = []workloadinterface.IMetadata{workloads[i]} } } } /* unused for now func addCommitData(input string, workloadIDToSource map[string]reporthandling.Source) { giRepo, err := cautils.NewLocalGitRepository(input) if err != nil || giRepo == nil { return } for k := range workloadIDToSource { sourceObj := workloadIDToSource[k] lastCommit, err := giRepo.GetFileLastCommit(sourceObj.RelativePath) if err != nil { continue } sourceObj.LastCommit = reporthandling.LastCommit{ Hash: lastCommit.SHA, Date: lastCommit.Author.Date, CommitterName: lastCommit.Author.Name, CommitterEmail: lastCommit.Author.Email, Message: lastCommit.Message, } workloadIDToSource[k] = sourceObj } } */ // findScanObjectResource finds the requested k8s object to be scanned in the resources map func findScanObjectResource(mappedResources map[string][]workloadinterface.IMetadata, resource *objectsenvelopes.ScanObject) (workloadinterface.IWorkload, error) { if resource == nil { return nil, nil } logger.L().Debug("Single resource scan", helpers.String("resource", resource.GetID())) var wls []workloadinterface.IWorkload for _, resources := range mappedResources { for _, r := range resources { if r.GetKind() == resource.GetKind() && r.GetName() == resource.GetName() { if resource.GetNamespace() != "" && resource.GetNamespace() != r.GetNamespace() { continue } if resource.GetApiVersion() != "" && resource.GetApiVersion() != r.GetApiVersion() { continue } if k8sinterface.IsTypeWorkload(r.GetObject()) { wl := workloadinterface.NewWorkloadObj(r.GetObject()) wls = append(wls, wl) } } } } if len(wls) == 0 { return nil, fmt.Errorf("k8s resource '%s' not found", getReadableID(resource)) } else if len(wls) > 1 { return nil, fmt.Errorf("more than one k8s resource found for '%s'", getReadableID(resource)) } return wls[0], nil } // TODO: move this to k8s-interface func getReadableID(obj *objectsenvelopes.ScanObject) string { var ID string if obj.GetApiVersion() != "" { ID += fmt.Sprintf("%s/", k8sinterface.JoinGroupVersion(k8sinterface.SplitApiVersion(obj.GetApiVersion()))) } if obj.GetNamespace() != "" { ID += fmt.Sprintf("%s/", obj.GetNamespace()) } ID += fmt.Sprintf("%s/%s", obj.GetKind(), obj.GetName()) return ID }