Skip to content

Commit 5a53ef0

Browse files
TheRealJonjhadvigMylanos
committed
Sync custom logos to console Deployment volumes and console config.
Co-authored-by: Jakub Hadvig <[email protected]> Co-authored-by: Marek Ziska <[email protected]>
1 parent 74664cb commit 5a53ef0

File tree

8 files changed

+72
-67
lines changed

8 files changed

+72
-67
lines changed

pkg/console/operator/sync_v400.go

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (co *consoleOperator) sync_v400(ctx context.Context, controllerContext fact
147147
}
148148

149149
// TODO: why is this missing a toUpdate change?
150-
_, customLogosErrReason, customLogosErr := co.SyncCustomLogoConfigMaps(ctx, updatedOperatorConfig)
150+
configMapsToSync, customLogosErrReason, customLogosErr := co.SyncCustomLogoConfigMaps(ctx, updatedOperatorConfig)
151151
// If the custom logo sync fails for any reason, we are degraded, not progressing.
152152
// The sync loop may not settle, we are unable to honor it in current state.
153153
statusHandler.AddConditions(status.HandleProgressingOrDegraded("CustomLogoSync", customLogosErrReason, customLogosErr))
@@ -187,7 +187,7 @@ func (co *consoleOperator) sync_v400(ctx context.Context, controllerContext fact
187187
sessionSecret,
188188
set.Proxy,
189189
set.Infrastructure,
190-
customLogosErr == nil, // TODO update this to accept result of SyncCustomLogoConfigMaps
190+
configMapsToSync,
191191
controllerContext.Recorder(),
192192
)
193193
toUpdate = toUpdate || depChanged
@@ -291,7 +291,7 @@ func (co *consoleOperator) SyncDeployment(
291291
sessionSecret *corev1.Secret,
292292
proxyConfig *configv1.Proxy,
293293
infrastructureConfig *configv1.Infrastructure,
294-
canMountCustomLogo bool,
294+
customLogos []configmapsub.CustomLogoRef,
295295
recorder events.Recorder,
296296
) (consoleDeployment *appsv1.Deployment, changed bool, reason string, err error) {
297297
updatedOperatorConfig := operatorConfig.DeepCopy()
@@ -306,7 +306,7 @@ func (co *consoleOperator) SyncDeployment(
306306
sessionSecret,
307307
proxyConfig,
308308
infrastructureConfig,
309-
canMountCustomLogo,
309+
customLogos,
310310
)
311311
genChanged := operatorConfig.ObjectMeta.Generation != operatorConfig.Status.ObservedGeneration
312312

@@ -554,36 +554,31 @@ func (co *consoleOperator) SyncTrustedCAConfigMap(ctx context.Context, operatorC
554554
return actual, true, "", err
555555
}
556556

557-
type operatorCustomLogo struct {
558-
location operatorv1.LogoType
559-
theme operatorv1.ThemeType
560-
file configv1.ConfigMapFileReference
561-
okToMount bool
562-
}
563-
564-
func (co *consoleOperator) SyncCustomLogoConfigMaps(ctx context.Context, operatorConfig *operatorv1.Console) ([]operatorCustomLogo, string, error) {
557+
func (co *consoleOperator) SyncCustomLogoConfigMaps(ctx context.Context, operatorConfig *operatorv1.Console) ([]configmapsub.CustomLogoRef, string, error) {
565558
configMapsToSync := getConfigMapsToSync(operatorConfig)
566559
var (
567-
aggregatedError error
568-
aggregatedReason string
560+
aggregatedError error
561+
err error
562+
reason string
569563
)
570564
for _, logoToSync := range configMapsToSync {
571-
reason, err := co.SyncCustomLogoConfigMap(ctx, logoToSync)
565+
logoToSync.OkToMount, reason, err = co.SyncCustomLogoConfigMap(ctx, logoToSync)
572566
if err != nil {
573567
if aggregatedError == nil {
574568
aggregatedError = fmt.Errorf("One or more errors were encountered while configuring custom logos:\n\t- %v, %s", logoToSync, err.Error())
575-
aggregatedReason = reason
576569
} else {
577570
aggregatedError = fmt.Errorf("%s\n\t- %v, %s", aggregatedError.Error(), logoToSync, err.Error())
578-
aggregatedReason = fmt.Sprintf("%s, %s", aggregatedReason, reason)
579571
}
580572
}
581573
}
582-
return configMapsToSync, aggregatedReason, aggregatedError
574+
if aggregatedError != nil {
575+
return nil, reason, aggregatedError
576+
}
577+
return configMapsToSync, "", nil
583578
}
584579

585-
func getConfigMapsToSync(operatorConfig *operatorv1.Console) []operatorCustomLogo {
586-
var normalizedLogos = []operatorCustomLogo{}
580+
func getConfigMapsToSync(operatorConfig *operatorv1.Console) []configmapsub.CustomLogoRef {
581+
var normalizedLogos = []configmapsub.CustomLogoRef{}
587582
var skipDeprecatedLogoSync = false
588583
if operatorConfig.Spec.Customization.CustomLogos != nil {
589584
for _, logo := range operatorConfig.Spec.Customization.CustomLogos {
@@ -593,10 +588,10 @@ func getConfigMapsToSync(operatorConfig *operatorv1.Console) []operatorCustomLog
593588
for _, theme := range logo.Themes {
594589
normalizedLogos = append(
595590
normalizedLogos,
596-
operatorCustomLogo{
597-
location: logo.Type,
598-
theme: theme.Type,
599-
file: theme.File,
591+
configmapsub.CustomLogoRef{
592+
Location: logo.Type,
593+
Theme: theme.Type,
594+
File: theme.File,
600595
},
601596
)
602597
}
@@ -606,10 +601,10 @@ func getConfigMapsToSync(operatorConfig *operatorv1.Console) []operatorCustomLog
606601
if !skipDeprecatedLogoSync && &operatorConfig.Spec.Customization.CustomLogoFile != nil {
607602
normalizedLogos = append(
608603
normalizedLogos,
609-
operatorCustomLogo{
610-
location: operatorv1.LogoTypeMasthead,
611-
theme: operatorv1.ThemeTypeDefault,
612-
file: operatorConfig.Spec.Customization.CustomLogoFile,
604+
configmapsub.CustomLogoRef{
605+
Location: operatorv1.LogoTypeMasthead,
606+
Theme: operatorv1.ThemeTypeDefault,
607+
File: operatorConfig.Spec.Customization.CustomLogoFile,
613608
},
614609
)
615610
}
@@ -622,18 +617,15 @@ func getConfigMapsToSync(operatorConfig *operatorv1.Console) []operatorCustomLog
622617
// - Validate existence of custom icon configmaps defined in the console operator config,
623618
// - populate to the console config
624619
// - create volumes/volumemounts in console deployment
625-
func (co *consoleOperator) SyncCustomLogoConfigMap(ctx context.Context, customLogo operatorCustomLogo) (string, error) {
620+
func (co *consoleOperator) SyncCustomLogoConfigMap(ctx context.Context, customLogo configmapsub.CustomLogoRef) (bool, string, error) {
626621
// validate first, to avoid a broken volume mount & a crashlooping console
627-
okToMount, reason, err := co.ValidateCustomLogo(ctx, customLogo.file)
628-
if customLogo.okToMount {
629-
if err := co.UpdateCustomLogoSyncSource(&customLogo.file); err != nil {
630-
okToMount = false
631-
reason = "FailedSyncSource"
632-
err = customerrors.NewCustomLogoError("custom logo sync source update error")
622+
okToMount, reason, err := co.ValidateCustomLogo(ctx, customLogo.File)
623+
if okToMount {
624+
if err := co.UpdateCustomLogoSyncSource(customLogo.File); err != nil {
625+
return false, "FailedSyncSource", customerrors.NewCustomLogoError(fmt.Sprintf("custom logo sync source update error, %v", err))
633626
}
634627
}
635-
customLogo.okToMount = okToMount // TODO get rid of side-effect
636-
return reason, err
628+
return okToMount, reason, err
637629
}
638630

639631
func (co *consoleOperator) ValidateOAuthServingCertConfigMap(ctx context.Context) (oauthServingCert *corev1.ConfigMap, reason string, err error) {
@@ -657,7 +649,7 @@ func (co *consoleOperator) ValidateOAuthServingCertConfigMap(ctx context.Context
657649
// sync loop will run later. Our operator is waiting to receive
658650
// the copied configmap into the console namespace for a future
659651
// sync loop to mount into the console deployment.
660-
func (c *consoleOperator) UpdateCustomLogoSyncSource(cmRef *configv1.ConfigMapFileReference) error {
652+
func (c *consoleOperator) UpdateCustomLogoSyncSource(cmRef configv1.ConfigMapFileReference) error {
661653
source := resourcesynccontroller.ResourceLocation{}
662654
logoConfigMapName := cmRef.Name
663655

pkg/console/subresource/configmap/brand_custom_logo.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
package configmap
22

3-
import v1 "github.com/openshift/api/operator/v1"
3+
import (
4+
configv1 "github.com/openshift/api/config/v1"
5+
v1 "github.com/openshift/api/operator/v1"
6+
)
7+
8+
type CustomLogoRef struct {
9+
Location v1.LogoType
10+
Theme v1.ThemeType
11+
File configv1.ConfigMapFileReference
12+
OkToMount bool
13+
}
414

515
// borrowed from the image package
616
// image.RegisterFormat()

pkg/console/subresource/configmap/configmap.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func DefaultConfigMap(
8989
ContentSecurityPolicies(aggregateCSPDirectives(availablePlugins)).
9090
ContentSecurityPolicyEnabled(contentSecurityPolicyEnabled).
9191
Proxy(getPluginsProxyServices(availablePlugins)).
92-
CustomLogoFile(operatorConfig.Spec.Customization.CustomLogoFile.Key). // Update/replace this function. We now need to handle multiple custom logo files instead of just one.
92+
CustomLogos(operatorConfig.Spec.Customization.CustomLogos). // Update/replace this function. We now need to handle multiple custom logo files instead of just one.
9393
CustomProductName(operatorConfig.Spec.Customization.CustomProductName).
9494
CustomDeveloperCatalog(operatorConfig.Spec.Customization.DeveloperCatalog).
9595
ProjectAccess(operatorConfig.Spec.Customization.ProjectAccess).

pkg/console/subresource/consoleserver/config_builder.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ type ConsoleServerCLIConfigBuilder struct {
5555
quickStarts operatorv1.QuickStarts
5656
addPage operatorv1.AddPage
5757
perspectives []operatorv1.Perspective
58-
customLogoFile string
5958
CAFile string
6059
monitoring map[string]string
6160
customHostnameRedirectPort int
61+
customLogos []operatorv1.CustomLogo
6262
inactivityTimeoutSeconds int
6363
pluginsList map[string]string
6464
i18nNamespaceList []string
@@ -130,9 +130,9 @@ func (b *ConsoleServerCLIConfigBuilder) Perspectives(perspectives []operatorv1.P
130130
}
131131

132132
// Update/replace this function
133-
func (b *ConsoleServerCLIConfigBuilder) CustomLogoFile(customLogoFile string) *ConsoleServerCLIConfigBuilder {
134-
if customLogoFile != "" {
135-
b.customLogoFile = "/var/logo/" + customLogoFile // append path here to prevent customLogoFile from always being just /var/logo/
133+
func (b *ConsoleServerCLIConfigBuilder) CustomLogos(customLogos []operatorv1.CustomLogo) *ConsoleServerCLIConfigBuilder {
134+
if len(customLogos) > 0 {
135+
b.customLogos = customLogos
136136
}
137137
return b
138138
}
@@ -397,8 +397,8 @@ func (b *ConsoleServerCLIConfigBuilder) customization() Customization {
397397
if len(b.customProductName) > 0 {
398398
conf.CustomProductName = b.customProductName
399399
}
400-
if len(b.customLogoFile) > 0 {
401-
conf.CustomLogoFile = b.customLogoFile
400+
if len(b.customLogos) > 0 {
401+
conf.CustomLogos = b.customLogos
402402
}
403403

404404
if b.devCatalogCustomization.Categories != nil {

pkg/console/subresource/consoleserver/types.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,10 @@ type Session struct {
104104

105105
// Customization holds configuration such as what logo to use.
106106
type Customization struct {
107-
Branding string `yaml:"branding,omitempty"`
108-
DocumentationBaseURL string `yaml:"documentationBaseURL,omitempty"`
109-
CustomProductName string `yaml:"customProductName,omitempty"`
110-
CustomLogoFile string `yaml:"customLogoFile,omitempty"`
107+
Branding string `yaml:"branding,omitempty"`
108+
DocumentationBaseURL string `yaml:"documentationBaseURL,omitempty"`
109+
CustomProductName string `yaml:"customProductName,omitempty"`
110+
CustomLogos []operatorv1.CustomLogo `yaml:"customLogos,omitempty"`
111111
// developerCatalog allows to configure the shown developer catalog categories.
112112
DeveloperCatalog *DeveloperConsoleCatalogCustomization `yaml:"developerCatalog,omitempty"`
113113
ProjectAccess ProjectAccess `yaml:"projectAccess,omitempty"`

pkg/console/subresource/deployment/deployment.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
operatorv1 "github.com/openshift/api/operator/v1"
1818
"github.com/openshift/console-operator/bindata"
1919
"github.com/openshift/console-operator/pkg/api"
20+
configmapsub "github.com/openshift/console-operator/pkg/console/subresource/configmap"
2021
"github.com/openshift/console-operator/pkg/console/subresource/util"
2122
"github.com/openshift/library-go/pkg/operator/resource/resourceread"
2223
)
@@ -74,7 +75,7 @@ func DefaultDeployment(
7475
sessionSecret *corev1.Secret,
7576
proxyConfig *configv1.Proxy,
7677
infrastructureConfig *configv1.Infrastructure,
77-
canMountCustomLogo bool,
78+
customLogos []configmapsub.CustomLogoRef,
7879
) *appsv1.Deployment {
7980
authnCATrustConfigMap := localOAuthServingCertConfigMap
8081
if authnCATrustConfigMap == nil {
@@ -102,7 +103,7 @@ func DefaultDeployment(
102103
authServerCAConfigMap,
103104
trustedCAConfigMap,
104105
sessionSecret,
105-
canMountCustomLogo,
106+
customLogos,
106107
)
107108
withConsoleContainerImage(deployment, operatorConfig, proxyConfig)
108109
withConsoleNodeSelector(deployment, infrastructureConfig)
@@ -233,7 +234,7 @@ func withConsoleVolumes(
233234
authServerCAConfigMap *corev1.ConfigMap,
234235
trustedCAConfigMap *corev1.ConfigMap,
235236
sessionSecret *corev1.Secret,
236-
canMountCustomLogo bool) {
237+
customLogos []configmapsub.CustomLogoRef) {
237238
volumeConfig := defaultVolumeConfig()
238239

239240
caBundle, caBundleExists := trustedCAConfigMap.Data["ca-bundle.crt"]
@@ -242,8 +243,10 @@ func withConsoleVolumes(
242243
}
243244

244245
// Update to handle multiple custom logos
245-
if canMountCustomLogo {
246-
volumeConfig = append(volumeConfig, customLogoVolume())
246+
if len(customLogos) > 0 {
247+
for _, customLogo := range customLogos {
248+
volumeConfig = append(volumeConfig, customLogoVolume(customLogo))
249+
}
247250
}
248251

249252
if oauthServingCert != nil {
@@ -498,9 +501,9 @@ func trustedCAVolume() volumeConfig {
498501
}
499502

500503
// Udpate to handle multiple custom logos
501-
func customLogoVolume() volumeConfig {
504+
func customLogoVolume(customLogo configmapsub.CustomLogoRef) volumeConfig {
502505
return volumeConfig{
503-
name: api.OpenShiftCustomLogoConfigMapName,
506+
name: customLogo.File.Name,
504507
path: "/var/logo/",
505508
isConfigMap: true}
506509
}

pkg/console/subresource/deployment/deployment_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func TestDefaultDeployment(t *testing.T) {
4848
sessionSecret *corev1.Secret
4949
proxyConfig *configv1.Proxy
5050
infrastructureConfig *configv1.Infrastructure
51-
canMountCustomLogo bool
51+
canMountCustomLogo []configmap.CustomLogoRef
5252
}
5353

5454
consoleOperatorConfig := &operatorsv1.Console{
@@ -183,12 +183,12 @@ func TestDefaultDeployment(t *testing.T) {
183183
withConsoleContainerImage(consoleDeploymentTemplate, consoleOperatorConfig, proxyConfig)
184184
withConsoleVolumes(consoleDeploymentTemplate, &corev1.ConfigMap{
185185
Data: map[string]string{"ca-bundle.crt": "test"},
186-
}, nil, trustedCAConfigMapEmpty, nil, false)
186+
}, nil, trustedCAConfigMapEmpty, nil, []configmap.CustomLogoRef{})
187187
consoleDeploymentContainer := consoleDeploymentTemplate.Spec.Template.Spec.Containers[0]
188188
consoleDeploymentVolumes := consoleDeploymentTemplate.Spec.Template.Spec.Volumes
189189
withConsoleVolumes(consoleDeploymentTemplate, &corev1.ConfigMap{
190190
Data: map[string]string{"ca-bundle.crt": "test"},
191-
}, nil, trustedCAConfigMapSet, nil, false)
191+
}, nil, trustedCAConfigMapSet, nil, []configmap.CustomLogoRef{})
192192
consoleDeploymentContainerTrusted := consoleDeploymentTemplate.Spec.Template.Spec.Containers[0]
193193
consoleDeploymentVolumesTrusted := consoleDeploymentTemplate.Spec.Template.Spec.Volumes
194194

@@ -901,7 +901,7 @@ func TestWithConsoleVolumes(t *testing.T) {
901901
deployment *appsv1.Deployment
902902
trustedCAConfigMap *corev1.ConfigMap
903903
sessionSecret *corev1.Secret
904-
canMountCustomLogo bool
904+
canMountCustomLogo []configmap.CustomLogoRef
905905
}
906906

907907
trustedCAConfigMap := &corev1.ConfigMap{
@@ -1076,7 +1076,7 @@ func TestWithConsoleVolumes(t *testing.T) {
10761076
args: args{
10771077
deployment: consoleDeployment,
10781078
trustedCAConfigMap: trustedCAConfigMap,
1079-
canMountCustomLogo: false,
1079+
canMountCustomLogo: []configmap.CustomLogoRef{},
10801080
},
10811081
want: &appsv1.Deployment{
10821082
Spec: appsv1.DeploymentSpec{
@@ -1099,7 +1099,7 @@ func TestWithConsoleVolumes(t *testing.T) {
10991099
args: args{
11001100
deployment: consoleDeployment,
11011101
trustedCAConfigMap: &corev1.ConfigMap{},
1102-
canMountCustomLogo: false,
1102+
canMountCustomLogo: []configmap.CustomLogoRef{},
11031103
},
11041104
want: &appsv1.Deployment{
11051105
Spec: appsv1.DeploymentSpec{
@@ -1122,7 +1122,7 @@ func TestWithConsoleVolumes(t *testing.T) {
11221122
args: args{
11231123
deployment: consoleDeployment,
11241124
trustedCAConfigMap: &corev1.ConfigMap{},
1125-
canMountCustomLogo: true,
1125+
canMountCustomLogo: []configmap.CustomLogoRef{},
11261126
},
11271127
want: &appsv1.Deployment{
11281128
Spec: appsv1.DeploymentSpec{
@@ -1145,7 +1145,7 @@ func TestWithConsoleVolumes(t *testing.T) {
11451145
args: args{
11461146
deployment: consoleDeployment,
11471147
trustedCAConfigMap: trustedCAConfigMap,
1148-
canMountCustomLogo: true,
1148+
canMountCustomLogo: []configmap.CustomLogoRef{},
11491149
},
11501150
want: &appsv1.Deployment{
11511151
Spec: appsv1.DeploymentSpec{

test/e2e/brand_customization_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ func hasCustomBranding(cm *v1.ConfigMap, desiredProductName string, desiredLogoF
189189
consoleConfig := consoleserver.Config{}
190190
yaml.Unmarshal([]byte(cm.Data["console-config.yaml"]), &consoleConfig)
191191
actualProductName := consoleConfig.Customization.CustomProductName
192-
actualLogoFile := consoleConfig.Customization.CustomLogoFile
193-
return (desiredProductName == actualProductName) && ("/var/logo/"+desiredLogoFileName == actualLogoFile)
192+
actualLogoFile := consoleConfig.Customization.CustomLogos[0].Themes[0].File.Name
193+
return (desiredProductName == actualProductName) && (desiredLogoFileName == actualLogoFile)
194194
}
195195

196196
func findCustomLogoVolume(deployment *appsv1.Deployment) bool {

0 commit comments

Comments
 (0)