Skip to content

Commit bd169ca

Browse files
committed
pkg: add registry certificate to openshift-config-managed ns
this certificate contains the storage ca and the service ca, making it nearly identical to the image-registry-certificates, except that it does not contains the additionalTrustedCA from images.config.openshift.io/cluster.
1 parent 3f6e9f3 commit bd169ca

File tree

4 files changed

+225
-6
lines changed

4 files changed

+225
-6
lines changed

pkg/defaults/defaults.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ const (
2929
// CAs to be trusted during image pullthrough
3030
ImageRegistryCertificatesName = "image-registry-certificates"
3131

32+
// ImageRegistryCAName is the name of the configmap managed by the registry operator
33+
// on the openshift-config-managed namespace. This config map is nearly identical to
34+
// ImageRegistryCertificatesName, but it does not include the additionalTrustedCA
35+
// from images.config.openshift.io/cluster.
36+
ImageRegistryCAName = "image-registry-ca"
37+
3238
// ImageRegistryPrivateConfiguration is the name of a secret that is managed by the
3339
// registry operator and which provides credentials to the registry for things like
3440
// accessing S3 storage

pkg/operator/imageregistrycertificates.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type ImageRegistryCertificatesController struct {
3232
coreClient corev1client.CoreV1Interface
3333
operatorClient v1helpers.OperatorClient
3434
configMapLister corev1listers.ConfigMapNamespaceLister
35+
configMapManagedLister corev1listers.ConfigMapNamespaceLister
3536
serviceLister corev1listers.ServiceNamespaceLister
3637
imageConfigLister configv1listers.ImageLister
3738
openshiftConfigLister corev1listers.ConfigMapNamespaceLister
@@ -60,6 +61,7 @@ func NewImageRegistryCertificatesController(
6061
coreClient: coreClient,
6162
operatorClient: operatorClient,
6263
configMapLister: configMapInformer.Lister().ConfigMaps(defaults.ImageRegistryOperatorNamespace),
64+
configMapManagedLister: configMapInformer.Lister().ConfigMaps(defaults.OpenShiftConfigManagedNamespace),
6365
serviceLister: serviceInformer.Lister().Services(defaults.ImageRegistryOperatorNamespace),
6466
imageConfigLister: imageConfigInformer.Lister(),
6567
openshiftConfigLister: openshiftConfigInformer.Lister().ConfigMaps(defaults.OpenShiftConfigNamespace),
@@ -162,6 +164,30 @@ func (c *ImageRegistryCertificatesController) sync() error {
162164
return utilerrors.NewAggregate([]error{err, updateError})
163165
}
164166

167+
g = resource.NewGeneratorImageRegistryCA(
168+
c.configMapManagedLister,
169+
c.imageConfigLister,
170+
c.openshiftConfigLister,
171+
c.serviceLister,
172+
c.imageRegistryConfigLister,
173+
c.storageListers,
174+
c.kubeconfig,
175+
c.coreClient,
176+
)
177+
err = resource.ApplyMutator(g)
178+
if err != nil {
179+
_, _, updateError := v1helpers.UpdateStatus(
180+
ctx,
181+
c.operatorClient,
182+
v1helpers.UpdateConditionFn(operatorv1.OperatorCondition{
183+
Type: "ImageRegistryCertificatesControllerDegraded",
184+
Status: operatorv1.ConditionTrue,
185+
Reason: "Error",
186+
Message: err.Error(),
187+
}))
188+
return utilerrors.NewAggregate([]error{err, updateError})
189+
}
190+
165191
_, _, err = v1helpers.UpdateStatus(
166192
ctx,
167193
c.operatorClient,

pkg/resource/caconfig.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ func (gcac *generatorCAConfig) expected() (runtime.Object, error) {
112112
if errors.IsNotFound(err) {
113113
klog.V(4).Infof("missing the service CA configmap: %s", err)
114114
} else if err != nil {
115-
return cm, err
115+
return cm, fmt.Errorf("%s: %s", gcac.GetName(), err)
116116
} else {
117117
if cert, ok := serviceCA.Data["service-ca.crt"]; ok {
118118
internalHostnames, err := getServiceHostnames(gcac.serviceLister, defaults.ServiceName)
119119
if err != nil {
120-
return cm, err
120+
return cm, fmt.Errorf("%s: %s", gcac.GetName(), err)
121121
}
122122
if len(internalHostnames) == 0 {
123123
klog.Infof("unable to get the service name to add service-ca.crt")
@@ -137,11 +137,11 @@ func (gcac *generatorCAConfig) expected() (runtime.Object, error) {
137137
if errors.IsNotFound(err) {
138138
klog.V(4).Infof("missing the image config: %s", err)
139139
} else if err != nil {
140-
return cm, err
140+
return cm, fmt.Errorf("%s: %s", gcac.GetName(), err)
141141
} else if caConfigName := imageConfig.Spec.AdditionalTrustedCA.Name; caConfigName != "" {
142142
upstreamConfig, err := gcac.openshiftConfigLister.Get(caConfigName)
143143
if err != nil {
144-
return nil, err
144+
return nil, fmt.Errorf("%s: %s", gcac.GetName(), err)
145145
}
146146

147147
for k, v := range upstreamConfig.Data {
@@ -154,12 +154,12 @@ func (gcac *generatorCAConfig) expected() (runtime.Object, error) {
154154

155155
driver, canRedirect, err := gcac.storageDriver()
156156
if err != nil {
157-
return cm, err
157+
return cm, fmt.Errorf("%s: %s", gcac.GetName(), err)
158158
}
159159
if driver != nil {
160160
storageCABundle, _, err := driver.CABundle()
161161
if err != nil {
162-
return cm, err
162+
return cm, fmt.Errorf("%s: %s", gcac.GetName(), err)
163163
}
164164
if storageCABundle != "" {
165165
klog.V(4).Infof("using storage ca bundle (%d bytes)", len(storageCABundle))

pkg/resource/imageregistryca.go

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
package resource
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strings"
7+
8+
corev1 "k8s.io/api/core/v1"
9+
"k8s.io/apimachinery/pkg/api/errors"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
coreset "k8s.io/client-go/kubernetes/typed/core/v1"
13+
corelisters "k8s.io/client-go/listers/core/v1"
14+
restclient "k8s.io/client-go/rest"
15+
"k8s.io/klog/v2"
16+
17+
operatorv1 "github.com/openshift/api/operator/v1"
18+
configlisters "github.com/openshift/client-go/config/listers/config/v1"
19+
imageregistryv1listers "github.com/openshift/client-go/imageregistry/listers/imageregistry/v1"
20+
21+
"github.com/openshift/cluster-image-registry-operator/pkg/client"
22+
"github.com/openshift/cluster-image-registry-operator/pkg/defaults"
23+
"github.com/openshift/cluster-image-registry-operator/pkg/storage"
24+
)
25+
26+
var _ Mutator = &generatorImageRegistryCA{}
27+
28+
type generatorImageRegistryCA struct {
29+
lister corelisters.ConfigMapNamespaceLister
30+
imageConfigLister configlisters.ImageLister
31+
openshiftConfigLister corelisters.ConfigMapNamespaceLister
32+
serviceLister corelisters.ServiceNamespaceLister
33+
imageRegistryConfigLister imageregistryv1listers.ConfigLister
34+
storageListers *client.StorageListers
35+
kubeconfig *restclient.Config
36+
client coreset.CoreV1Interface
37+
}
38+
39+
func NewGeneratorImageRegistryCA(
40+
lister corelisters.ConfigMapNamespaceLister,
41+
imageConfigLister configlisters.ImageLister,
42+
openshiftConfigLister corelisters.ConfigMapNamespaceLister,
43+
serviceLister corelisters.ServiceNamespaceLister,
44+
imageRegistryConfigLister imageregistryv1listers.ConfigLister,
45+
storageListers *client.StorageListers,
46+
kubeconfig *restclient.Config,
47+
client coreset.CoreV1Interface,
48+
) Mutator {
49+
return &generatorImageRegistryCA{
50+
lister: lister,
51+
imageConfigLister: imageConfigLister,
52+
openshiftConfigLister: openshiftConfigLister,
53+
serviceLister: serviceLister,
54+
imageRegistryConfigLister: imageRegistryConfigLister,
55+
storageListers: storageListers,
56+
kubeconfig: kubeconfig,
57+
client: client,
58+
}
59+
}
60+
61+
func (girca *generatorImageRegistryCA) Type() runtime.Object {
62+
return &corev1.ConfigMap{}
63+
}
64+
65+
func (girca *generatorImageRegistryCA) GetNamespace() string {
66+
return defaults.OpenShiftConfigManagedNamespace
67+
}
68+
69+
func (girca *generatorImageRegistryCA) GetName() string {
70+
return defaults.ImageRegistryCAName
71+
}
72+
73+
func (girca *generatorImageRegistryCA) storageDriver() (storage.Driver, bool, error) {
74+
imageRegistryConfig, err := girca.imageRegistryConfigLister.Get("cluster")
75+
if errors.IsNotFound(err) {
76+
return nil, false, nil
77+
} else if err != nil {
78+
return nil, false, err
79+
}
80+
81+
if imageRegistryConfig.Spec.ManagementState == operatorv1.Removed {
82+
// The certificates controller does not need to know about
83+
// storage when the management state is Removed.
84+
return nil, false, nil
85+
}
86+
87+
driver, err := storage.NewDriver(&imageRegistryConfig.Spec.Storage, girca.kubeconfig, girca.storageListers)
88+
if err == storage.ErrStorageNotConfigured || storage.IsMultiStoragesError(err) {
89+
return nil, false, nil
90+
} else if err != nil {
91+
return nil, false, err
92+
}
93+
94+
canRedirect := !imageRegistryConfig.Spec.DisableRedirect
95+
96+
return driver, canRedirect, nil
97+
}
98+
99+
func (girca *generatorImageRegistryCA) expected() (runtime.Object, error) {
100+
cm := &corev1.ConfigMap{
101+
ObjectMeta: metav1.ObjectMeta{
102+
Name: girca.GetName(),
103+
Namespace: girca.GetNamespace(),
104+
},
105+
Data: map[string]string{},
106+
BinaryData: map[string][]byte{},
107+
}
108+
109+
var ownHostnameKeys []string
110+
111+
serviceCA, err := girca.lister.Get(defaults.ServiceCAName)
112+
if errors.IsNotFound(err) {
113+
klog.V(4).Infof("missing the service CA configmap: %s", err)
114+
} else if err != nil {
115+
return cm, fmt.Errorf("%s: %s", girca.GetName(), err)
116+
} else {
117+
if cert, ok := serviceCA.Data["service-ca.crt"]; ok {
118+
internalHostnames, err := getServiceHostnames(girca.serviceLister, defaults.ServiceName)
119+
if err != nil {
120+
return cm, fmt.Errorf("%s: %s", girca.GetName(), err)
121+
}
122+
if len(internalHostnames) == 0 {
123+
klog.Infof("unable to get the service name to add service-ca.crt")
124+
} else {
125+
for _, internalHostname := range internalHostnames {
126+
key := strings.Replace(internalHostname, ":", "..", -1)
127+
ownHostnameKeys = append(ownHostnameKeys, key)
128+
cm.Data[key] = cert
129+
}
130+
}
131+
} else {
132+
klog.Infof("the service CA is not injected yet")
133+
}
134+
}
135+
136+
driver, canRedirect, err := girca.storageDriver()
137+
if err != nil {
138+
return cm, fmt.Errorf("%s: %s", girca.GetName(), err)
139+
}
140+
if driver != nil {
141+
storageCABundle, _, err := driver.CABundle()
142+
if err != nil {
143+
return cm, fmt.Errorf("%s: %s", girca.GetName(), err)
144+
}
145+
if storageCABundle != "" {
146+
klog.V(4).Infof("using storage ca bundle (%d bytes)", len(storageCABundle))
147+
if canRedirect {
148+
klog.V(4).Infof("injecting storage ca bundle into registry certificates...")
149+
for _, key := range ownHostnameKeys {
150+
cm.Data[key] += "\n" + storageCABundle
151+
}
152+
}
153+
}
154+
}
155+
156+
return cm, nil
157+
}
158+
159+
func (girca *generatorImageRegistryCA) Get() (runtime.Object, error) {
160+
return girca.lister.Get(girca.GetName())
161+
}
162+
163+
func (girca *generatorImageRegistryCA) Create() (runtime.Object, error) {
164+
return commonCreate(girca, func(obj runtime.Object) (runtime.Object, error) {
165+
return girca.client.ConfigMaps(girca.GetNamespace()).Create(
166+
context.TODO(), obj.(*corev1.ConfigMap), metav1.CreateOptions{},
167+
)
168+
})
169+
}
170+
171+
func (girca *generatorImageRegistryCA) Update(o runtime.Object) (runtime.Object, bool, error) {
172+
return commonUpdate(girca, o, func(obj runtime.Object) (runtime.Object, error) {
173+
return girca.client.ConfigMaps(girca.GetNamespace()).Update(
174+
context.TODO(), obj.(*corev1.ConfigMap), metav1.UpdateOptions{},
175+
)
176+
})
177+
}
178+
179+
func (girca *generatorImageRegistryCA) Delete(opts metav1.DeleteOptions) error {
180+
return girca.client.ConfigMaps(girca.GetNamespace()).Delete(
181+
context.TODO(), girca.GetName(), opts,
182+
)
183+
}
184+
185+
func (g *generatorImageRegistryCA) Owned() bool {
186+
return true
187+
}

0 commit comments

Comments
 (0)