Skip to content

Commit b43b129

Browse files
author
OpenShift Bot
committed
Merge pull request #8195 from miminar/registry-quota-refactor
Merged by openshift-bot
2 parents de351a1 + 23f729d commit b43b129

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+4956
-3142
lines changed

contrib/completions/bash/oadm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,6 +1493,7 @@ _oadm_registry()
14931493
flags_completion+=("__handle_filename_extension_flag kubeconfig")
14941494
flags+=("--daemonset")
14951495
flags+=("--dry-run")
1496+
flags+=("--enforce-quota")
14961497
flags+=("--images=")
14971498
flags+=("--labels=")
14981499
flags+=("--latest-images")

contrib/completions/bash/oc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4513,6 +4513,7 @@ _oc_adm_registry()
45134513
flags_completion+=("__handle_filename_extension_flag kubeconfig")
45144514
flags+=("--daemonset")
45154515
flags+=("--dry-run")
4516+
flags+=("--enforce-quota")
45164517
flags+=("--images=")
45174518
flags+=("--labels=")
45184519
flags+=("--latest-images")

contrib/completions/bash/openshift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2069,6 +2069,7 @@ _openshift_admin_registry()
20692069
flags_completion+=("__handle_filename_extension_flag kubeconfig")
20702070
flags+=("--daemonset")
20712071
flags+=("--dry-run")
2072+
flags+=("--enforce-quota")
20722073
flags+=("--images=")
20732074
flags+=("--labels=")
20742075
flags+=("--latest-images")
@@ -8100,6 +8101,7 @@ _openshift_cli_adm_registry()
81008101
flags_completion+=("__handle_filename_extension_flag kubeconfig")
81018102
flags+=("--daemonset")
81028103
flags+=("--dry-run")
8104+
flags+=("--enforce-quota")
81038105
flags+=("--images=")
81048106
flags+=("--labels=")
81058107
flags+=("--latest-images")

hack/lib/util/environment.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ function os::util::environment::setup_server_vars() {
239239
# Returns:
240240
# - export USE_IMAGES
241241
# - export TAG
242+
# - export MAX_IMAGES_BULK_IMPORTED_PER_REPOSITORY
242243
function os::util::environment::setup_images_vars() {
243244
# Use either the latest release built images, or latest.
244245
if [[ -z "${USE_IMAGES-}" ]]; then
@@ -250,4 +251,5 @@ function os::util::environment::setup_images_vars() {
250251
export USE_IMAGES="openshift/origin-\${component}:${TAG}"
251252
fi
252253
fi
254+
export MAX_IMAGES_BULK_IMPORTED_PER_REPOSITORY="${MAX_IMAGES_BULK_IMPORTED_PER_REPOSITORY:-3}"
253255
}

hack/util.sh

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,14 @@ function configure_os_server {
8484
--images="${USE_IMAGES}"
8585

8686

87-
# Don't try this at home. We don't have flags for setting etcd ports in the config, but we want deconflicted ones. Use sed to replace defaults in a completely unsafe way
88-
os::util::sed "s/:4001$/:${ETCD_PORT}/g" ${SERVER_CONFIG_DIR}/master/master-config.yaml
89-
os::util::sed "s/:7001$/:${ETCD_PEER_PORT}/g" ${SERVER_CONFIG_DIR}/master/master-config.yaml
87+
# Don't try this at home. We don't have flags for setting etcd ports in the config, but we want
88+
# deconflicted ones. Use sed to replace defaults in a completely unsafe way.
89+
# And be sure to use the same limit for bulk image import from repository in tests and server.
90+
os::util::sed \
91+
-e "s/:4001$/:${ETCD_PORT}/g" \
92+
-e "s/:7001$/:${ETCD_PEER_PORT}/g" \
93+
-e "s/\(maxImagesBulkImportedPerRepository:\s*\)\(.*\)/\1${MAX_IMAGES_BULK_IMPORTED_PER_REPOSITORY:-\2}/" \
94+
${SERVER_CONFIG_DIR}/master/master-config.yaml
9095

9196

9297
# Make oc use ${MASTER_CONFIG_DIR}/admin.kubeconfig, and ignore anything in the running user's $HOME dir
@@ -636,7 +641,11 @@ function install_router {
636641
function install_registry {
637642
# The --mount-host option is provided to reuse local storage.
638643
echo "[INFO] Installing the registry"
639-
openshift admin registry --config="${ADMIN_KUBECONFIG}" --images="${USE_IMAGES}"
644+
# For testing purposes, ensure the quota objects are always up to date in the registry by
645+
# disabling project cache.
646+
openshift admin registry --config="${ADMIN_KUBECONFIG}" --images="${USE_IMAGES}" -o json | \
647+
oc env -f - --output json "REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_PROJECTCACHETTL=0" | \
648+
oc create -f -
640649
}
641650

642651
function wait_for_registry {

images/dockerregistry/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ middleware:
1818
- name: openshift
1919
options:
2020
pullthrough: true
21+
enforcequota: false
22+
projectcachettl: 1m

pkg/assets/bindata.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9199,9 +9199,7 @@ cpu:"CPU (Request)",
91999199
"limits.cpu":"CPU (Limit)",
92009200
"limits.memory":"Memory (Limit)",
92019201
memory:"Memory (Request)",
9202-
"openshift.io/imagesize":"Image Size",
9203-
"openshift.io/imagestreamsize":"Image Stream Size",
9204-
"openshift.io/projectimagessize":"Project Image Size",
9202+
"openshift.io/imagestreams":"Image Streams",
92059203
persistentvolumeclaims:"Persistent Volume Claims",
92069204
pods:"Pods",
92079205
replicationcontrollers:"Replication Controllers",

pkg/client/imagestreamimages.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package client
22

33
import (
4-
"fmt"
5-
64
"github.com/openshift/origin/pkg/image/api"
75
)
86

@@ -33,6 +31,6 @@ func newImageStreamImages(c *Client, namespace string) *imageStreamImages {
3331
// Get finds the specified image by name of an image repository and id.
3432
func (c *imageStreamImages) Get(name, id string) (result *api.ImageStreamImage, err error) {
3533
result = &api.ImageStreamImage{}
36-
err = c.r.Get().Namespace(c.ns).Resource("imageStreamImages").Name(fmt.Sprintf("%s@%s", name, id)).Do().Into(result)
34+
err = c.r.Get().Namespace(c.ns).Resource("imageStreamImages").Name(api.MakeImageStreamImageName(name, id)).Do().Into(result)
3735
return
3836
}

pkg/client/imagestreams.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"k8s.io/kubernetes/pkg/watch"
99

1010
imageapi "github.com/openshift/origin/pkg/image/api"
11+
quotautil "github.com/openshift/origin/pkg/quota/util"
1112
)
1213

1314
var ErrImageStreamImportUnsupported = errors.New("the server does not support directly importing images - create an image stream with tags or the dockerImageRepository field set")
@@ -139,7 +140,7 @@ func transformUnsupported(err error) error {
139140
// enabled by policy. A create request will return a Forbidden(403) error.
140141
// We want to return ErrImageStreamImportUnsupported to allow fallback behavior
141142
// in clients.
142-
if apierrs.IsForbidden(err) {
143+
if apierrs.IsForbidden(err) && !quotautil.IsErrorQuotaExceeded(err) {
143144
return ErrImageStreamImportUnsupported
144145
}
145146
return err

pkg/client/imagestreamtags.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package client
22

33
import (
4-
"fmt"
5-
64
"github.com/openshift/origin/pkg/image/api"
75
)
86

@@ -35,7 +33,7 @@ func newImageStreamTags(c *Client, namespace string) *imageStreamTags {
3533
// Get finds the specified image by name of an image stream and tag.
3634
func (c *imageStreamTags) Get(name, tag string) (result *api.ImageStreamTag, err error) {
3735
result = &api.ImageStreamTag{}
38-
err = c.r.Get().Namespace(c.ns).Resource("imageStreamTags").Name(fmt.Sprintf("%s:%s", name, tag)).Do().Into(result)
36+
err = c.r.Get().Namespace(c.ns).Resource("imageStreamTags").Name(api.JoinImageStreamTag(name, tag)).Do().Into(result)
3937
return
4038
}
4139

@@ -48,5 +46,5 @@ func (c *imageStreamTags) Update(tag *api.ImageStreamTag) (result *api.ImageStre
4846

4947
// Delete deletes the specified tag from the image stream.
5048
func (c *imageStreamTags) Delete(name, tag string) error {
51-
return c.r.Delete().Namespace(c.ns).Resource("imageStreamTags").Name(fmt.Sprintf("%s:%s", name, tag)).Do().Error()
49+
return c.r.Delete().Namespace(c.ns).Resource("imageStreamTags").Name(api.JoinImageStreamTag(name, tag)).Do().Error()
5250
}

pkg/cmd/admin/registry/registry.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ type RegistryConfig struct {
8383
Selector string
8484
ServiceAccount string
8585
DaemonSet bool
86+
EnforceQuota bool
8687

8788
ServingCertPath string
8889
ServingKeyPath string
@@ -121,6 +122,7 @@ func NewCmdRegistry(f *clientcmd.Factory, parentName, name string, out io.Writer
121122
Volume: "/registry",
122123
ServiceAccount: "registry",
123124
Replicas: 1,
125+
EnforceQuota: true,
124126
}
125127

126128
cmd := &cobra.Command{
@@ -153,6 +155,7 @@ func NewCmdRegistry(f *clientcmd.Factory, parentName, name string, out io.Writer
153155
cmd.Flags().StringVar(&cfg.ServingCertPath, "tls-certificate", cfg.ServingCertPath, "An optional path to a PEM encoded certificate (which may contain the private key) for serving over TLS")
154156
cmd.Flags().StringVar(&cfg.ServingKeyPath, "tls-key", cfg.ServingKeyPath, "An optional path to a PEM encoded private key for serving over TLS")
155157
cmd.Flags().BoolVar(&cfg.DaemonSet, "daemonset", cfg.DaemonSet, "Use a daemonset instead of a deployment config.")
158+
cmd.Flags().BoolVar(&cfg.EnforceQuota, "enforce-quota", cfg.EnforceQuota, "If set, the registry will refuse to write blobs if they exceed quota limits")
156159

157160
// autocompletion hints
158161
cmd.MarkFlagFilename("credentials", "kubeconfig")
@@ -303,6 +306,11 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
303306
env := app.Environment{}
304307
env.Add(secretEnv)
305308

309+
enforceQuota := "false"
310+
if cfg.EnforceQuota {
311+
enforceQuota = "true"
312+
}
313+
env["REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_ENFORCEQUOTA"] = enforceQuota
306314
healthzPort := defaultPort
307315
if len(ports) > 0 {
308316
healthzPort = ports[0].ContainerPort

pkg/cmd/server/admission/init.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ package admission
22

33
import (
44
"k8s.io/kubernetes/pkg/admission"
5+
"k8s.io/kubernetes/pkg/quota"
56

67
"github.com/openshift/origin/pkg/authorization/authorizer"
78
"github.com/openshift/origin/pkg/client"
89
"github.com/openshift/origin/pkg/project/cache"
910
)
1011

1112
type PluginInitializer struct {
12-
OpenshiftClient client.Interface
13-
ProjectCache *cache.ProjectCache
14-
Authorizer authorizer.Authorizer
13+
OpenshiftClient client.Interface
14+
ProjectCache *cache.ProjectCache
15+
OriginQuotaRegistry quota.Registry
16+
Authorizer authorizer.Authorizer
1517
}
1618

1719
// Initialize will check the initialization interfaces implemented by each plugin
@@ -24,6 +26,9 @@ func (i *PluginInitializer) Initialize(plugins []admission.Interface) {
2426
if wantsProjectCache, ok := plugin.(WantsProjectCache); ok {
2527
wantsProjectCache.SetProjectCache(i.ProjectCache)
2628
}
29+
if wantsOriginQuotaRegistry, ok := plugin.(WantsOriginQuotaRegistry); ok {
30+
wantsOriginQuotaRegistry.SetOriginQuotaRegistry(i.OriginQuotaRegistry)
31+
}
2732
if wantsAuthorizer, ok := plugin.(WantsAuthorizer); ok {
2833
wantsAuthorizer.SetAuthorizer(i.Authorizer)
2934
}

pkg/cmd/server/admission/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package admission
22

33
import (
4+
"k8s.io/kubernetes/pkg/quota"
5+
46
"github.com/openshift/origin/pkg/authorization/authorizer"
57
"github.com/openshift/origin/pkg/client"
68
"github.com/openshift/origin/pkg/project/cache"
@@ -18,6 +20,11 @@ type WantsProjectCache interface {
1820
SetProjectCache(*cache.ProjectCache)
1921
}
2022

23+
// WantsQuotaRegistry should be implemented by admission plugins that need a quota registry
24+
type WantsOriginQuotaRegistry interface {
25+
SetOriginQuotaRegistry(quota.Registry)
26+
}
27+
2128
// Validator should be implemented by admission plugins that can validate themselves
2229
// after initialization has happened.
2330
type Validator interface {

pkg/cmd/server/bootstrappolicy/policy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ func GetBootstrapClusterRoles() []authorizationapi.ClusterRole {
435435
Name: RegistryRoleName,
436436
},
437437
Rules: []authorizationapi.PolicyRule{
438-
authorizationapi.NewRule("list").Groups(kapiGroup).Resources("resourcequotas").RuleOrDie(),
438+
authorizationapi.NewRule("list").Groups(kapiGroup).Resources("limitranges", "resourcequotas").RuleOrDie(),
439439

440440
authorizationapi.NewRule("get", "delete").Groups(imageGroup).Resources("images").RuleOrDie(),
441441
authorizationapi.NewRule("get").Groups(imageGroup).Resources("imagestreamimages", "imagestreamtags", "imagestreams/secrets").RuleOrDie(),

pkg/cmd/server/origin/master.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
deploylogregistry "github.com/openshift/origin/pkg/deploy/registry/deploylog"
5252
deployrollback "github.com/openshift/origin/pkg/deploy/registry/rollback"
5353
"github.com/openshift/origin/pkg/dockerregistry"
54+
imageadmission "github.com/openshift/origin/pkg/image/admission"
5455
"github.com/openshift/origin/pkg/image/importer"
5556
imageimporter "github.com/openshift/origin/pkg/image/importer"
5657
"github.com/openshift/origin/pkg/image/registry/image"
@@ -443,8 +444,9 @@ func (c *MasterConfig) GetRestStorage() map[string]rest.Storage {
443444
imageStorage, err := imageetcd.NewREST(c.RESTOptionsGetter)
444445
checkStorageErr(err)
445446
imageRegistry := image.NewRegistry(imageStorage)
447+
imageStreamLimitVerifier := imageadmission.NewLimitVerifier(c.KubeClient())
446448
imageStreamSecretsStorage := imagesecret.NewREST(c.ImageStreamSecretClient())
447-
imageStreamStorage, imageStreamStatusStorage, internalImageStreamStorage, err := imagestreametcd.NewREST(c.RESTOptionsGetter, imagestream.DefaultRegistryFunc(defaultRegistryFunc), subjectAccessReviewRegistry)
449+
imageStreamStorage, imageStreamStatusStorage, internalImageStreamStorage, err := imagestreametcd.NewREST(c.RESTOptionsGetter, imagestream.DefaultRegistryFunc(defaultRegistryFunc), subjectAccessReviewRegistry, imageStreamLimitVerifier)
448450
checkStorageErr(err)
449451
imageStreamRegistry := imagestream.NewRegistry(imageStreamStorage, imageStreamStatusStorage, internalImageStreamStorage)
450452
imageStreamMappingStorage := imagestreammapping.NewREST(imageRegistry, imageStreamRegistry)

pkg/cmd/server/origin/master_config.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,13 @@ import (
5656
"github.com/openshift/origin/pkg/cmd/util/plug"
5757
"github.com/openshift/origin/pkg/cmd/util/pluginconfig"
5858
"github.com/openshift/origin/pkg/cmd/util/variable"
59+
imageadmission "github.com/openshift/origin/pkg/image/admission"
5960
accesstokenregistry "github.com/openshift/origin/pkg/oauth/registry/oauthaccesstoken"
6061
accesstokenetcd "github.com/openshift/origin/pkg/oauth/registry/oauthaccesstoken/etcd"
6162
projectauth "github.com/openshift/origin/pkg/project/auth"
6263
projectcache "github.com/openshift/origin/pkg/project/cache"
64+
"github.com/openshift/origin/pkg/quota"
65+
quotaadmission "github.com/openshift/origin/pkg/quota/admission/resourcequota"
6366
"github.com/openshift/origin/pkg/serviceaccounts"
6467
usercache "github.com/openshift/origin/pkg/user/cache"
6568
groupregistry "github.com/openshift/origin/pkg/user/registry/group"
@@ -188,11 +191,12 @@ func BuildMasterConfig(options configapi.MasterConfig) (*MasterConfig, error) {
188191
kubeletClientConfig := configapi.GetKubeletClientConfig(options)
189192

190193
// in-order list of plug-ins that should intercept admission decisions (origin only intercepts)
191-
admissionControlPluginNames := []string{"ProjectRequestLimit", "OriginNamespaceLifecycle", "PodNodeConstraints", "BuildByStrategy", "OriginResourceQuota"}
194+
admissionControlPluginNames := []string{"ProjectRequestLimit", "OriginNamespaceLifecycle", "PodNodeConstraints", "BuildByStrategy", imageadmission.PluginName, quotaadmission.PluginName}
192195
if len(options.AdmissionConfig.PluginOrderOverride) > 0 {
193196
admissionControlPluginNames = options.AdmissionConfig.PluginOrderOverride
194197
}
195198

199+
quotaRegistry := quota.NewOriginQuotaRegistry(privilegedLoopbackOpenShiftClient)
196200
ruleResolver := rulevalidation.NewDefaultRuleResolver(
197201
rulevalidation.PolicyGetter(policyClient),
198202
rulevalidation.BindingLister(policyClient),
@@ -202,9 +206,10 @@ func BuildMasterConfig(options configapi.MasterConfig) (*MasterConfig, error) {
202206
authorizer := newAuthorizer(ruleResolver, policyClient, options.ProjectConfig.ProjectRequestMessage)
203207

204208
pluginInitializer := oadmission.PluginInitializer{
205-
OpenshiftClient: privilegedLoopbackOpenShiftClient,
206-
ProjectCache: projectCache,
207-
Authorizer: authorizer,
209+
OpenshiftClient: privilegedLoopbackOpenShiftClient,
210+
ProjectCache: projectCache,
211+
OriginQuotaRegistry: quotaRegistry,
212+
Authorizer: authorizer,
208213
}
209214

210215
plugins := []admission.Interface{}

pkg/cmd/server/origin/run_components.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ func (c *MasterConfig) RunResourceQuotaManager(cm *cmapp.CMServer) {
497497
}
498498

499499
osClient, kClient := c.ResourceQuotaManagerClients()
500-
resourceQuotaRegistry := quota.NewRegistry(osClient, false)
500+
resourceQuotaRegistry := quota.NewOriginQuotaRegistry(osClient)
501501
resourceQuotaControllerOptions := &kresourcequota.ResourceQuotaControllerOptions{
502502
KubeClient: kClient,
503503
ResyncPeriod: controller.StaticResyncPeriodFunc(resourceQuotaSyncPeriod),

pkg/cmd/server/start/admission.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
_ "github.com/openshift/origin/pkg/build/admission/defaults"
1111
_ "github.com/openshift/origin/pkg/build/admission/overrides"
1212
_ "github.com/openshift/origin/pkg/build/admission/strategyrestrictions"
13+
_ "github.com/openshift/origin/pkg/image/admission"
1314
_ "github.com/openshift/origin/pkg/project/admission/lifecycle"
1415
_ "github.com/openshift/origin/pkg/project/admission/nodeenv"
1516
_ "github.com/openshift/origin/pkg/project/admission/requestlimit"

pkg/cmd/server/start/admission_sync_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"k8s.io/kubernetes/pkg/util/sets"
1212

1313
"github.com/openshift/origin/pkg/cmd/server/kubernetes"
14+
imageadmission "github.com/openshift/origin/pkg/image/admission"
15+
quotaadmission "github.com/openshift/origin/pkg/quota/admission/resourcequota"
1416
)
1517

1618
var admissionPluginsNotUsedByKube = sets.NewString(
@@ -25,10 +27,11 @@ var admissionPluginsNotUsedByKube = sets.NewString(
2527
"BuildByStrategy", // from origin, only needed for managing builds, not kubernetes resources
2628
"BuildDefaults", // from origin, only needed for managing builds, not kubernetes resources
2729
"BuildOverrides", // from origin, only needed for managing builds, not kubernetes resources
30+
imageadmission.PluginName, // from origin, used for limiting image sizes, not kubernetes resources
2831
"OriginNamespaceLifecycle", // from origin, only needed for rejecting openshift resources, so not needed by kube
2932
"ProjectRequestLimit", // from origin, used for limiting project requests by user (online use case)
3033
"RunOnceDuration", // from origin, used for overriding the ActiveDeadlineSeconds for run-once pods
31-
"OriginResourceQuota", // from origin, used for quota abuse checks of openshift resources
34+
quotaadmission.PluginName, // from origin, used for quota abuse checks of openshift resources
3235

3336
"NamespaceExists", // superseded by NamespaceLifecycle
3437
"InitialResources", // do we want this? https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/initial-resources.md

0 commit comments

Comments
 (0)