Skip to content

Commit 7da63a5

Browse files
Merge pull request #210 from dmage/readonly
Add ReadOnly flag
2 parents 565ef16 + f3b8256 commit 7da63a5

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

pkg/apis/imageregistry/v1/types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ type ImageRegistrySpec struct {
104104
// Storage details for configuring registry storage, e.g. S3 bucket coordinates.
105105
Storage ImageRegistryConfigStorage `json:"storage,omitempty"`
106106

107+
// ReadOnly indicates whether the registry instance should reject attempts
108+
// to push new images or delete existing ones.
109+
ReadOnly bool `json:"readOnly,omitempty"`
110+
107111
// Requests controls how many parallel requests a given registry instance will handle before queuing additional requests
108112
Requests ImageRegistryConfigRequests `json:"requests,omitempty"`
109113

pkg/resource/podtemplatespec.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ func makePodTemplateSpec(coreClient coreset.CoreV1Interface, driver storage.Driv
125125
corev1.EnvVar{Name: "REGISTRY_OPENSHIFT_SERVER_ADDR", Value: fmt.Sprintf("%s.%s.svc:%d", params.Service.Name, params.Deployment.Namespace, params.Container.Port)},
126126
)
127127

128+
if cr.Spec.ReadOnly {
129+
env = append(env, corev1.EnvVar{Name: "REGISTRY_STORAGE_MAINTENANCE_READONLY", Value: "{enabled: true}"})
130+
}
131+
128132
if cr.Spec.Proxy.HTTP != "" {
129133
env = append(env, corev1.EnvVar{Name: "HTTP_PROXY", Value: cr.Spec.Proxy.HTTP})
130134
}

test/e2e/readonly_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package e2e
2+
3+
import (
4+
"testing"
5+
6+
corev1 "k8s.io/api/core/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
9+
operatorapi "github.com/openshift/api/operator/v1"
10+
11+
imageregistryv1 "github.com/openshift/cluster-image-registry-operator/pkg/apis/imageregistry/v1"
12+
"github.com/openshift/cluster-image-registry-operator/test/framework"
13+
)
14+
15+
func TestReadOnly(t *testing.T) {
16+
client := framework.MustNewClientset(t, nil)
17+
18+
defer framework.MustRemoveImageRegistry(t, client)
19+
20+
cr := &imageregistryv1.Config{
21+
TypeMeta: metav1.TypeMeta{
22+
APIVersion: imageregistryv1.SchemeGroupVersion.String(),
23+
Kind: "Config",
24+
},
25+
ObjectMeta: metav1.ObjectMeta{
26+
Name: imageregistryv1.ImageRegistryResourceName,
27+
},
28+
Spec: imageregistryv1.ImageRegistrySpec{
29+
ManagementState: operatorapi.Managed,
30+
Storage: imageregistryv1.ImageRegistryConfigStorage{
31+
Filesystem: &imageregistryv1.ImageRegistryConfigStorageFilesystem{
32+
VolumeSource: corev1.VolumeSource{
33+
EmptyDir: &corev1.EmptyDirVolumeSource{},
34+
},
35+
},
36+
},
37+
ReadOnly: true,
38+
Replicas: 1,
39+
},
40+
}
41+
framework.MustDeployImageRegistry(t, client, cr)
42+
framework.MustEnsureImageRegistryIsAvailable(t, client)
43+
framework.MustEnsureInternalRegistryHostnameIsSet(t, client)
44+
framework.MustEnsureClusterOperatorStatusIsSet(t, client)
45+
framework.MustEnsureOperatorIsNotHotLooping(t, client)
46+
47+
deploy, err := client.Deployments(imageregistryv1.ImageRegistryOperatorNamespace).Get(imageregistryv1.ImageRegistryName, metav1.GetOptions{})
48+
if err != nil {
49+
t.Fatal(err)
50+
}
51+
found := false
52+
for _, env := range deploy.Spec.Template.Spec.Containers[0].Env {
53+
if env.Name == "REGISTRY_STORAGE_MAINTENANCE_READONLY" {
54+
if expected := "{enabled: true}"; env.Value != expected {
55+
t.Errorf("%s: got %q, want %q", env.Name, env.Value, expected)
56+
} else {
57+
found = true
58+
}
59+
}
60+
}
61+
if !found {
62+
framework.DumpObject(t, "deployment", deploy)
63+
t.Error("environment variable REGISTRY_STORAGE_MAINTENANCE_READONLY_ENABLED=true is not found")
64+
}
65+
}

0 commit comments

Comments
 (0)