Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
ada37c21
Commit
ada37c21
authored
Jul 05, 2016
by
deads2k
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
allow lock acquisition injection for quota admission
parent
145da49c
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
28 additions
and
13 deletions
+28
-13
shared_informer.go
pkg/controller/framework/shared_informer.go
+7
-0
admission.go
plugin/pkg/admission/resourcequota/admission.go
+1
-1
admission_test.go
plugin/pkg/admission/resourcequota/admission_test.go
+10
-10
controller.go
plugin/pkg/admission/resourcequota/controller.go
+10
-2
No files found.
pkg/controller/framework/shared_informer.go
View file @
ada37c21
...
@@ -92,6 +92,9 @@ type sharedIndexInformer struct {
...
@@ -92,6 +92,9 @@ type sharedIndexInformer struct {
// blockDeltas gives a way to stop all event distribution so that a late event handler
// blockDeltas gives a way to stop all event distribution so that a late event handler
// can safely join the shared informer.
// can safely join the shared informer.
blockDeltas
sync
.
Mutex
blockDeltas
sync
.
Mutex
// stopCh is the channel used to stop the main Run process. We have to track it so that
// late joiners can have a proper stop
stopCh
<-
chan
struct
{}
}
}
// dummyController hides the fact that a SharedInformer is different from a dedicated one
// dummyController hides the fact that a SharedInformer is different from a dedicated one
...
@@ -146,6 +149,7 @@ func (s *sharedIndexInformer) Run(stopCh <-chan struct{}) {
...
@@ -146,6 +149,7 @@ func (s *sharedIndexInformer) Run(stopCh <-chan struct{}) {
s
.
started
=
true
s
.
started
=
true
}()
}()
s
.
stopCh
=
stopCh
s
.
processor
.
run
(
stopCh
)
s
.
processor
.
run
(
stopCh
)
s
.
controller
.
Run
(
stopCh
)
s
.
controller
.
Run
(
stopCh
)
}
}
...
@@ -220,6 +224,9 @@ func (s *sharedIndexInformer) AddEventHandler(handler ResourceEventHandler) erro
...
@@ -220,6 +224,9 @@ func (s *sharedIndexInformer) AddEventHandler(handler ResourceEventHandler) erro
listener
:=
newProcessListener
(
handler
)
listener
:=
newProcessListener
(
handler
)
s
.
processor
.
listeners
=
append
(
s
.
processor
.
listeners
,
listener
)
s
.
processor
.
listeners
=
append
(
s
.
processor
.
listeners
,
listener
)
go
listener
.
run
(
s
.
stopCh
)
go
listener
.
pop
(
s
.
stopCh
)
items
:=
s
.
indexer
.
List
()
items
:=
s
.
indexer
.
List
()
for
i
:=
range
items
{
for
i
:=
range
items
{
listener
.
add
(
addNotification
{
newObj
:
items
[
i
]})
listener
.
add
(
addNotification
{
newObj
:
items
[
i
]})
...
...
plugin/pkg/admission/resourcequota/admission.go
View file @
ada37c21
...
@@ -59,7 +59,7 @@ func NewResourceQuota(client clientset.Interface, registry quota.Registry, numEv
...
@@ -59,7 +59,7 @@ func NewResourceQuota(client clientset.Interface, registry quota.Registry, numEv
}
}
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
registry
,
numEvaluators
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
registry
,
n
il
,
n
umEvaluators
,
stopCh
)
return
&
quotaAdmission
{
return
&
quotaAdmission
{
Handler
:
admission
.
NewHandler
(
admission
.
Create
,
admission
.
Update
),
Handler
:
admission
.
NewHandler
(
admission
.
Create
,
admission
.
Update
),
...
...
plugin/pkg/admission/resourcequota/admission_test.go
View file @
ada37c21
...
@@ -150,7 +150,7 @@ func TestAdmissionIgnoresSubresources(t *testing.T) {
...
@@ -150,7 +150,7 @@ func TestAdmissionIgnoresSubresources(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -194,7 +194,7 @@ func TestAdmitBelowQuotaLimit(t *testing.T) {
...
@@ -194,7 +194,7 @@ func TestAdmitBelowQuotaLimit(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -277,7 +277,7 @@ func TestAdmitHandlesOldObjects(t *testing.T) {
...
@@ -277,7 +277,7 @@ func TestAdmitHandlesOldObjects(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
Handler
:
admission
.
NewHandler
(
admission
.
Create
,
admission
.
Update
),
Handler
:
admission
.
NewHandler
(
admission
.
Create
,
admission
.
Update
),
...
@@ -367,7 +367,7 @@ func TestAdmitExceedQuotaLimit(t *testing.T) {
...
@@ -367,7 +367,7 @@ func TestAdmitExceedQuotaLimit(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -411,7 +411,7 @@ func TestAdmitEnforceQuotaConstraints(t *testing.T) {
...
@@ -411,7 +411,7 @@ func TestAdmitEnforceQuotaConstraints(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -465,7 +465,7 @@ func TestAdmitPodInNamespaceWithoutQuota(t *testing.T) {
...
@@ -465,7 +465,7 @@ func TestAdmitPodInNamespaceWithoutQuota(t *testing.T) {
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
liveLookupCache
=
liveLookupCache
quotaAccessor
.
liveLookupCache
=
liveLookupCache
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -531,7 +531,7 @@ func TestAdmitBelowTerminatingQuotaLimit(t *testing.T) {
...
@@ -531,7 +531,7 @@ func TestAdmitBelowTerminatingQuotaLimit(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -636,7 +636,7 @@ func TestAdmitBelowBestEffortQuotaLimit(t *testing.T) {
...
@@ -636,7 +636,7 @@ func TestAdmitBelowBestEffortQuotaLimit(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -728,7 +728,7 @@ func TestAdmitBestEffortQuotaLimitIgnoresBurstable(t *testing.T) {
...
@@ -728,7 +728,7 @@ func TestAdmitBestEffortQuotaLimitIgnoresBurstable(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
handler
:=
&
quotaAdmission
{
handler
:=
&
quotaAdmission
{
...
@@ -846,7 +846,7 @@ func TestAdmissionSetsMissingNamespace(t *testing.T) {
...
@@ -846,7 +846,7 @@ func TestAdmissionSetsMissingNamespace(t *testing.T) {
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
,
_
:=
newQuotaAccessor
(
kubeClient
)
quotaAccessor
.
indexer
=
indexer
quotaAccessor
.
indexer
=
indexer
go
quotaAccessor
.
Run
(
stopCh
)
go
quotaAccessor
.
Run
(
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
5
,
stopCh
)
evaluator
:=
NewQuotaEvaluator
(
quotaAccessor
,
install
.
NewRegistry
(
kubeClient
),
nil
,
5
,
stopCh
)
evaluator
.
(
*
quotaEvaluator
)
.
registry
=
registry
evaluator
.
(
*
quotaEvaluator
)
.
registry
=
registry
defer
utilruntime
.
HandleCrash
()
defer
utilruntime
.
HandleCrash
()
...
...
plugin/pkg/admission/resourcequota/controller.go
View file @
ada37c21
...
@@ -44,6 +44,8 @@ type Evaluator interface {
...
@@ -44,6 +44,8 @@ type Evaluator interface {
type
quotaEvaluator
struct
{
type
quotaEvaluator
struct
{
quotaAccessor
QuotaAccessor
quotaAccessor
QuotaAccessor
// lockAquisitionFunc acquires any required locks and returns a cleanup method to defer
lockAquisitionFunc
func
([]
api
.
ResourceQuota
)
func
()
// registry that knows how to measure usage for objects
// registry that knows how to measure usage for objects
registry
quota
.
Registry
registry
quota
.
Registry
...
@@ -96,9 +98,10 @@ func newAdmissionWaiter(a admission.Attributes) *admissionWaiter {
...
@@ -96,9 +98,10 @@ func newAdmissionWaiter(a admission.Attributes) *admissionWaiter {
// NewQuotaEvaluator configures an admission controller that can enforce quota constraints
// NewQuotaEvaluator configures an admission controller that can enforce quota constraints
// using the provided registry. The registry must have the capability to handle group/kinds that
// using the provided registry. The registry must have the capability to handle group/kinds that
// are persisted by the server this admission controller is intercepting
// are persisted by the server this admission controller is intercepting
func
NewQuotaEvaluator
(
quotaAccessor
QuotaAccessor
,
registry
quota
.
Registry
,
workers
int
,
stopCh
<-
chan
struct
{})
Evaluator
{
func
NewQuotaEvaluator
(
quotaAccessor
QuotaAccessor
,
registry
quota
.
Registry
,
lockAquisitionFunc
func
([]
api
.
ResourceQuota
)
func
(),
workers
int
,
stopCh
<-
chan
struct
{})
Evaluator
{
return
&
quotaEvaluator
{
return
&
quotaEvaluator
{
quotaAccessor
:
quotaAccessor
,
quotaAccessor
:
quotaAccessor
,
lockAquisitionFunc
:
lockAquisitionFunc
,
registry
:
registry
,
registry
:
registry
,
...
@@ -169,6 +172,11 @@ func (e *quotaEvaluator) checkAttributes(ns string, admissionAttributes []*admis
...
@@ -169,6 +172,11 @@ func (e *quotaEvaluator) checkAttributes(ns string, admissionAttributes []*admis
return
return
}
}
if
e
.
lockAquisitionFunc
!=
nil
{
releaseLocks
:=
e
.
lockAquisitionFunc
(
quotas
)
defer
releaseLocks
()
}
e
.
checkQuotas
(
quotas
,
admissionAttributes
,
3
)
e
.
checkQuotas
(
quotas
,
admissionAttributes
,
3
)
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment