Skip to content

Commit

Permalink
Merge pull request #14 from devtron-labs/select-all-kinds
Browse files Browse the repository at this point in the history
fix: handled all resources
  • Loading branch information
ajaydevtron authored Aug 30, 2024
2 parents 661d9bc + 9dc03f6 commit 3dda848
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 46 deletions.
45 changes: 44 additions & 1 deletion api/v1alpha1/time_util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,25 @@ func TestTimeRangesWithZone_NearestTimeGap(t1 *testing.T) {
WeekdayFrom: "Mon",
WeekdayTo: "Mon",
}
tm, _ := time.Parse(time.RFC1123, "Sat, 27 Mar 2021 18:15:00 IST") //Sat
tr9 := TimeRange{
TimeFrom: "18:00",
TimeTo: "23:59",
WeekdayFrom: "Mon",
WeekdayTo: "Sun",
}
tr10 := TimeRange{
TimeFrom: "00:00",
TimeTo: "03:59",
WeekdayFrom: "Mon",
WeekdayTo: "Sun",
}
tr11 := TimeRange{
TimeFrom: "04:00",
TimeTo: "17:59",
WeekdayFrom: "Mon",
WeekdayTo: "Sun",
}
tm, _ := time.Parse(time.RFC1123, "Sat, 27 Mar 2021 13:15:00 IST") //Sat
tm2, _ := time.Parse(time.RFC1123, "Sat, 27 Mar 2021 17:45:00 IST") //Sat
tm3, _ := time.Parse(time.RFC1123, "Mon, 22 Mar 2021 18:15:00 IST") //Mon
tm4, _ := time.Parse(time.RFC1123, "Sat, 27 Mar 2021 20:45:00 IST") //Sat
Expand All @@ -183,6 +201,7 @@ func TestTimeRangesWithZone_NearestTimeGap(t1 *testing.T) {
tm11, _ := time.Parse(time.RFC1123, "Sun, 15 Jan 2023 18:36:00 IST") //Sun
tm12, _ := time.Parse(time.RFC1123, "Sun, 15 Jan 2023 18:39:00 IST") //Sun
tm13, _ := time.Parse(time.RFC1123, "Tue, 23 Mar 2021 18:39:00 IST") //Tue
tm14, _ := time.Parse(time.RFC1123, "Tue, 23 Mar 2021 22:30:00 IST") //Tue
type fields struct {
TimeRanges []TimeRange
TimeZone string
Expand Down Expand Up @@ -211,6 +230,30 @@ func TestTimeRangesWithZone_NearestTimeGap(t1 *testing.T) {
want1: true,
wantErr: false,
},
{
name: "inRange",
fields: fields{
TimeRanges: []TimeRange{tr2, tr3, tr1},
TimeZone: "Asia/Kolkata",
},
args: args{instant: tm},
timeGapInSeconds: 105 * 60,
matchedIndex: 2,
want1: true,
wantErr: false,
},
{
name: "inRange",
fields: fields{
TimeRanges: []TimeRange{tr9, tr10, tr11},
TimeZone: "Asia/Kolkata",
},
args: args{instant: tm14},
timeGapInSeconds: 839 * 60,
matchedIndex: 2,
want1: true,
wantErr: false,
},
{
name: "before",
fields: fields{
Expand Down
115 changes: 70 additions & 45 deletions controllers/ResourceSelector.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,38 +48,6 @@ type ResourceSelectorImpl struct {
factory func(mapper *pkg.Mapper) pkg.ArgsProcessor
}

func (r *ResourceSelectorImpl) handleLabelSelector(rule pincherv1alpha1.Selector) ([]unstructured.Unstructured, error) {
factory := r.factory(r.Mapper)
types := strings.Split(rule.ObjectSelector.Type, ",")
namespaces, err := r.getNamespaces(rule, factory)
if err != nil {
return nil, err
}
var manifests []unstructured.Unstructured
for _, t := range types {
resourceMapping, err := factory.MappingFor(t)
if err != nil {
return nil, err
}
for _, namespace := range namespaces {
request := &pkg.ListRequest{
Namespace: namespace,
GroupVersionResource: resourceMapping.Resource,
ListOptions: metav1.ListOptions{
LabelSelector: strings.Join(rule.ObjectSelector.Labels, ","),
},
}
resp, err := r.Kubectl.ListResources(context.Background(), request)
if err != nil {
continue
}
manifests = append(manifests, resp.Manifests...)
}
}

return manifests, nil
}

func (r *ResourceSelectorImpl) handleFieldSelector(rule pincherv1alpha1.Selector) ([]unstructured.Unstructured, error) {
var resp []unstructured.Unstructured
var err error
Expand Down Expand Up @@ -111,27 +79,63 @@ func (r *ResourceSelectorImpl) handleFieldSelector(rule pincherv1alpha1.Selector
return matchedObjects, nil
}

func (r *ResourceSelectorImpl) handleSelector(rule pincherv1alpha1.Selector) ([]unstructured.Unstructured, error) {
func (r *ResourceSelectorImpl) handleLabelSelector(rule pincherv1alpha1.Selector) ([]unstructured.Unstructured, error) {
factory := r.factory(r.Mapper)
types := strings.Split(rule.ObjectSelector.Type, ",")
namespaces, err := r.getNamespaces(rule, factory)
if err != nil {
return nil, err
}
var apiResources []pkg.APIResourceInfo
isNamespaced := len(namespaces) != 0
apiResources, err = r.getResources(types, isNamespaced, factory)
if err != nil {
return nil, err
}
var manifests []unstructured.Unstructured
for _, t := range apiResources {
for _, namespace := range namespaces {
request := &pkg.ListRequest{
Namespace: namespace,
GroupVersionResource: t.GroupVersionResource,
ListOptions: metav1.ListOptions{
LabelSelector: strings.Join(rule.ObjectSelector.Labels, ","),
},
}
resp, err := r.Kubectl.ListResources(context.Background(), request)
if err != nil {
continue
}
manifests = append(manifests, resp.Manifests...)
}
}

return manifests, nil
}

func (r *ResourceSelectorImpl) handleSelector(rule pincherv1alpha1.Selector) ([]unstructured.Unstructured, error) {
factory := r.factory(r.Mapper)
namespaces, err := r.getNamespaces(rule, factory)
if err != nil {
return nil, err
}
var apiResources []pkg.APIResourceInfo
isNamespaced := len(namespaces) != 0
types := strings.Split(rule.ObjectSelector.Type, ",")
apiResources, err = r.getResources(types, isNamespaced, factory)
if err != nil {
return nil, err
}
if len(rule.ObjectSelector.Name) > 0 {
names := strings.Split(rule.ObjectSelector.Name, ",")
var manifests []unstructured.Unstructured
for _, t := range types {
resourceMapping, err := factory.MappingFor(t)
if err != nil {
return nil, err
}
for _, t := range apiResources {
for _, namespace := range namespaces {
for _, name := range names {
request := &pkg.GetRequest{
Name: name,
Namespace: namespace,
GroupVersionKind: resourceMapping.GroupVersionKind,
GroupVersionKind: t.GroupVersionKind,
}
resp, err := r.Kubectl.GetResource(context.Background(), request)
if err != nil {
Expand All @@ -144,15 +148,11 @@ func (r *ResourceSelectorImpl) handleSelector(rule pincherv1alpha1.Selector) ([]
return manifests, nil
} else {
var manifests []unstructured.Unstructured
for _, t := range types {
resourceMapping, err := factory.MappingFor(t)
if err != nil {
return nil, err
}
for _, t := range apiResources {
for _, namespace := range namespaces {
request := &pkg.ListRequest{
Namespace: namespace,
GroupVersionResource: resourceMapping.Resource,
GroupVersionResource: t.GroupVersionResource,
ListOptions: metav1.ListOptions{},
}
resp, err := r.Kubectl.ListResources(context.Background(), request)
Expand All @@ -166,6 +166,31 @@ func (r *ResourceSelectorImpl) handleSelector(rule pincherv1alpha1.Selector) ([]
}
}

func (r *ResourceSelectorImpl) getResources(types []string, isNamespaced bool, factory pkg.ArgsProcessor) ([]pkg.APIResourceInfo, error) {
var apiResources []pkg.APIResourceInfo
var err error
if len(types) == 1 && types[0] == "all" {
apiResources, err = pkg.GetAllAPIResources(isNamespaced)
if err != nil {
return nil, err
}
} else {
for _, t := range types {
resourceMapping, err := factory.MappingFor(t)
if err != nil {
continue
}
apiResourceInfo := pkg.APIResourceInfo{
GroupVersionKind: resourceMapping.GroupVersionKind,
Meta: metav1.APIResource{},
GroupVersionResource: resourceMapping.Resource,
}
apiResources = append(apiResources, apiResourceInfo)
}
}
return apiResources, nil
}

func (r *ResourceSelectorImpl) getNamespaces(rule pincherv1alpha1.Selector, factory pkg.ArgsProcessor) ([]string, error) {
var namespaces []string
if rule.NamespaceSelector.Name == "all" || len(rule.NamespaceSelector.Name) == 0 {
Expand Down
49 changes: 49 additions & 0 deletions pkg/KubectlUtil.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package pkg
import (
"fmt"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
memory "k8s.io/client-go/discovery/cached"
Expand All @@ -44,6 +45,12 @@ type resourceTuple struct {
Name string
}

type APIResourceInfo struct {
GroupVersionKind schema.GroupVersionKind
Meta metav1.APIResource
GroupVersionResource schema.GroupVersionResource
}

func NewMapperFactory() *Mapper {
restConfig := ctrl.GetConfigOrDie()
disco, err := discovery.NewDiscoveryClientForConfig(restConfig)
Expand Down Expand Up @@ -71,6 +78,48 @@ func NewFactory(mapper *Mapper) ArgsProcessor {
}
}

func GetAllAPIResources(isNamespaced bool) ([]APIResourceInfo, error) {
restConfig := ctrl.GetConfigOrDie()
disco, err := discovery.NewDiscoveryClientForConfig(restConfig)
if err != nil {
return nil, err
}

serverResources, err := disco.ServerPreferredResources()
if err != nil {
if len(serverResources) == 0 {
return nil, err
}
}
apiResIfs := make([]APIResourceInfo, 0)
for _, apiResourcesList := range serverResources {
for _, apiResource := range apiResourcesList.APIResources {

if apiResource.Namespaced != isNamespaced {
continue
}
resource := ToGroupVersionResource(apiResourcesList.GroupVersion, &apiResource)
gv, err := schema.ParseGroupVersion(apiResourcesList.GroupVersion)
if err != nil {
return nil, err
}
apiResIf := APIResourceInfo{
GroupVersionKind: schema.GroupVersionKind{Group: gv.Group, Version: gv.Version, Kind: apiResource.Kind},
Meta: apiResource,
GroupVersionResource: resource,
}
apiResIfs = append(apiResIfs, apiResIf)
}
}
return apiResIfs, nil
}

func ToGroupVersionResource(groupVersion string, apiResource *metav1.APIResource) schema.GroupVersionResource {
gvk := schema.FromAPIVersionAndKind(groupVersion, apiResource.Kind)
gv := gvk.GroupVersion()
return gv.WithResource(apiResource.Name)
}

//func (a *ResourceProcessor) ResourceTuples() []resourceTuple {
// if len(a.resourceTuples) > 0 {
// return a.resourceTuples
Expand Down

0 comments on commit 3dda848

Please sign in to comment.