Skip to content

Commit

Permalink
runs OpenShift specific ResourceQuota monitors
Browse files Browse the repository at this point in the history
for backward compatability we need to maintain "openshift.io/imagestreams" alias for "count/imagestreams.image.openshift.io"
to dynamically update quota for imagestreams resources.
  • Loading branch information
p0lyn0mial committed Oct 28, 2020
1 parent a9cad6a commit 5206196
Showing 1 changed file with 36 additions and 1 deletion.
37 changes: 36 additions & 1 deletion pkg/cmd/controller/quota.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@ import (
"github.com/openshift/cluster-policy-controller/pkg/quota/clusterquotareconciliation"
image "github.com/openshift/cluster-policy-controller/pkg/quota/quotaimageexternal"
"github.com/openshift/library-go/pkg/quota/clusterquotamapping"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/controller"
kresourcequota "k8s.io/kubernetes/pkg/controller/resourcequota"
kquota "k8s.io/kubernetes/pkg/quota/v1"
"k8s.io/kubernetes/pkg/quota/v1/generic"
quotainstall "k8s.io/kubernetes/pkg/quota/v1/install"
)
Expand All @@ -20,6 +24,8 @@ func RunResourceQuotaManager(ctx *ControllerContext) (bool, error) {
saName := "resourcequota-controller"
listerFuncForResource := generic.ListerFuncForResourceFunc(ctx.GenericResourceInformer.ForResource)
quotaConfiguration := quotainstall.NewQuotaConfigurationForControllers(listerFuncForResource)
resourceQuotaControllerClient := ctx.ClientBuilder.ClientOrDie(saName)
discoveryFunc := resourceQuotaControllerClient.Discovery().ServerPreferredNamespacedResources

imageEvaluators := image.NewReplenishmentEvaluators(
listerFuncForResource,
Expand All @@ -28,14 +34,15 @@ func RunResourceQuotaManager(ctx *ControllerContext) (bool, error) {
resourceQuotaRegistry := generic.NewRegistry(imageEvaluators)

resourceQuotaControllerOptions := &kresourcequota.ResourceQuotaControllerOptions{
QuotaClient: ctx.ClientBuilder.ClientOrDie(saName).CoreV1(),
QuotaClient: resourceQuotaControllerClient.CoreV1(),
ResourceQuotaInformer: ctx.KubernetesInformers.Core().V1().ResourceQuotas(),
ResyncPeriod: controller.StaticResyncPeriodFunc(resourceQuotaSyncPeriod),
Registry: resourceQuotaRegistry,
ReplenishmentResyncPeriod: replenishmentSyncPeriodFunc,
IgnoredResourcesFunc: quotaConfiguration.IgnoredResources,
InformersStarted: ctx.InformersStarted,
InformerFactory: ctx.GenericResourceInformer,
DiscoveryFunc: resourceQuotaDiscoveryWrapper(resourceQuotaRegistry, discoveryFunc),
}
controller, err := kresourcequota.NewResourceQuotaController(resourceQuotaControllerOptions)
if err != nil {
Expand All @@ -46,6 +53,34 @@ func RunResourceQuotaManager(ctx *ControllerContext) (bool, error) {
return true, nil
}

func resourceQuotaDiscoveryWrapper(registry kquota.Registry, discoveryFunc kresourcequota.NamespacedResourcesFunc) kresourcequota.NamespacedResourcesFunc {
return func() ([]*metav1.APIResourceList, error) {
discoveryResources, discoveryErr := discoveryFunc()
if discoveryErr != nil && len(discoveryResources) == 0 {
return nil, discoveryErr
}

interestingResources := []*metav1.APIResourceList{}
for _, resourceList := range discoveryResources {
gv, err := schema.ParseGroupVersion(resourceList.GroupVersion)
if err != nil {
return nil, err
}
for i := range resourceList.APIResources {
gr := schema.GroupResource{
Group: gv.Group,
Resource: resourceList.APIResources[i].Name,
}
if evaluator := registry.Get(gr); evaluator != nil {
interestingResources = append(interestingResources, resourceList)
break
}
}
}
return interestingResources, nil
}
}

func RunClusterQuotaReconciliationController(ctx *ControllerContext) (bool, error) {
defaultResyncPeriod := 5 * time.Minute
defaultReplenishmentSyncPeriod := 12 * time.Hour
Expand Down

0 comments on commit 5206196

Please sign in to comment.