Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 51 additions & 136 deletions controllers/usernamespace/usernamespace_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,6 @@ func (r *CheUserNamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Req
return ctrl.Result{}, err
}

if err = r.reconcileProxySettings(ctx, req.Name, checluster, deployContext); err != nil {
logrus.Errorf("Failed to reconcile proxy settings into namespace '%s': %v", req.Name, err)
return ctrl.Result{}, err
}

// Deprecated [CRW-6792].
// All certificates are mounted into /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
// and automatically added to the system trust store.
Expand All @@ -243,13 +238,8 @@ func (r *CheUserNamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Req
return ctrl.Result{}, err
}

if err = r.reconcileIdleSettings(ctx, req.Name, checluster, deployContext); err != nil {
logrus.Errorf("Failed to reconcile idle settings into namespace '%s': %v", req.Name, err)
return ctrl.Result{}, err
}

if err = r.reconcileEditorSettings(deployContext, req.Name, checluster); err != nil {
logrus.Errorf("Failed to reconcile editor settings into namespace '%s': %v", req.Name, err)
if err = r.reconcileUserSettings(deployContext, req.Name, checluster); err != nil {
logrus.Errorf("Failed to reconcile user settings into namespace '%s': %v", req.Name, err)
return ctrl.Result{}, err
}

Expand Down Expand Up @@ -333,152 +323,77 @@ func (r *CheUserNamespaceReconciler) reconcileTrustedCerts(ctx context.Context,
return err
}

func (r *CheUserNamespaceReconciler) reconcileProxySettings(ctx context.Context, targetNs string, checluster *chev2.CheCluster, deployContext *chetypes.DeployContext) error {
if err := deleteLegacyObject("proxy-settings", &corev1.ConfigMap{}, targetNs, checluster, deployContext); err != nil {
return err
}
proxyConfig, err := che.GetProxyConfiguration(deployContext)
if err != nil {
return err
}

if proxyConfig == nil {
return nil
}

proxySettings := map[string]string{}
if proxyConfig.HttpProxy != "" {
proxySettings["HTTP_PROXY"] = proxyConfig.HttpProxy
proxySettings["http_proxy"] = proxyConfig.HttpProxy
}
if proxyConfig.HttpsProxy != "" {
proxySettings["HTTPS_PROXY"] = proxyConfig.HttpsProxy
proxySettings["https_proxy"] = proxyConfig.HttpsProxy
}
if proxyConfig.NoProxy != "" {
proxySettings["NO_PROXY"] = proxyConfig.NoProxy
proxySettings["no_proxy"] = proxyConfig.NoProxy
func (r *CheUserNamespaceReconciler) reconcileUserSettings(
deployContext *chetypes.DeployContext,
targetNs string,
checluster *chev2.CheCluster,
) error {
cm2Delete := []string{
prefixedName("editor-settings"),
prefixedName("idle-settings"),
prefixedName("proxy-settings"),
checluster.Name + "-" + checluster.Namespace + "-proxy-settings", // legacy name
}

key := client.ObjectKey{Name: prefixedName("proxy-settings"), Namespace: targetNs}
cfg := &corev1.ConfigMap{}
exists := true
if err := r.client.Get(ctx, key, cfg); err != nil {
if errors.IsNotFound(err) {
exists = false
} else {
// delete previously created CMs
for _, name := range cm2Delete {
if _, err := deploy.Delete(
deployContext,
client.ObjectKey{Name: name, Namespace: targetNs},
&corev1.ConfigMap{},
); err != nil {
return err
}
}

if len(proxySettings) == 0 {
if exists {
if err := r.client.Delete(ctx, cfg); err != nil {
return err
}
}
return nil
}
name := prefixedName("user-settings")

requiredLabels := defaults.AddStandardLabelsForComponent(checluster, userSettingsComponentLabelValue, map[string]string{
dwconstants.DevWorkspaceMountLabel: "true",
dwconstants.DevWorkspaceWatchConfigMapLabel: "true",
})
requiredAnnos := map[string]string{
annotations := map[string]string{
dwconstants.DevWorkspaceMountAsAnnotation: "env",
}
labels := defaults.AddStandardLabelsForComponent(checluster,
userSettingsComponentLabelValue,
map[string]string{
dwconstants.DevWorkspaceMountLabel: "true",
dwconstants.DevWorkspaceWatchConfigMapLabel: "true",
})

cfg = &corev1.ConfigMap{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: prefixedName("proxy-settings"),
Namespace: targetNs,
Labels: requiredLabels,
Annotations: requiredAnnos,
},
Data: proxySettings,
}

_, err = deploy.Sync(deployContext, cfg, deploy.ConfigMapDiffOpts)
return err
}

func (r *CheUserNamespaceReconciler) reconcileIdleSettings(ctx context.Context, targetNs string, checluster *chev2.CheCluster, deployContext *chetypes.DeployContext) error {

if checluster.Spec.DevEnvironments.SecondsOfInactivityBeforeIdling == nil && checluster.Spec.DevEnvironments.SecondsOfRunBeforeIdling == nil {
return nil
}
configMapName := prefixedName("idle-settings")
cfg := &corev1.ConfigMap{}
data := map[string]string{}

requiredLabels := defaults.AddStandardLabelsForComponent(checluster, userSettingsComponentLabelValue, map[string]string{
dwconstants.DevWorkspaceMountLabel: "true",
dwconstants.DevWorkspaceWatchConfigMapLabel: "true",
})
requiredAnnos := map[string]string{
dwconstants.DevWorkspaceMountAsAnnotation: "env",
// editor download urls
if len(deployContext.CheCluster.Spec.DevEnvironments.EditorsDownloadUrls) > 0 {
for _, editorDownloadUrl := range deployContext.CheCluster.Spec.DevEnvironments.EditorsDownloadUrls {
editor := strings.ToUpper(editorDownloadUrl.Editor)
editor = strings.ReplaceAll(editor, "-", "_")
editor = strings.ReplaceAll(editor, "/", "_")
data[fmt.Sprintf("EDITOR_DOWNLOAD_URL_%s", editor)] = editorDownloadUrl.Url
}
}

data := map[string]string{}

// idling configuration
if checluster.Spec.DevEnvironments.SecondsOfInactivityBeforeIdling != nil {
data["SECONDS_OF_DW_INACTIVITY_BEFORE_IDLING"] = strconv.FormatInt(int64(*checluster.Spec.DevEnvironments.SecondsOfInactivityBeforeIdling), 10)
}

if checluster.Spec.DevEnvironments.SecondsOfRunBeforeIdling != nil {
data["SECONDS_OF_DW_RUN_BEFORE_IDLING"] = strconv.FormatInt(int64(*checluster.Spec.DevEnvironments.SecondsOfRunBeforeIdling), 10)
}

cfg = &corev1.ConfigMap{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: configMapName,
Namespace: targetNs,
Labels: requiredLabels,
Annotations: requiredAnnos,
},
Data: data,
}
_, err := deploy.Sync(deployContext, cfg, deploy.ConfigMapDiffOpts)
return err
}

func (r *CheUserNamespaceReconciler) reconcileEditorSettings(
deployContext *chetypes.DeployContext,
targetNs string,
checluster *chev2.CheCluster,
) error {
name := prefixedName("editor-settings")

annotations := map[string]string{
dwconstants.DevWorkspaceMountAsAnnotation: "env",
}
labels := defaults.AddStandardLabelsForComponent(checluster, userSettingsComponentLabelValue, map[string]string{
dwconstants.DevWorkspaceMountLabel: "true",
dwconstants.DevWorkspaceWatchConfigMapLabel: "true",
})

delConfigMap := func() error {
_, err := deploy.Delete(deployContext, client.ObjectKey{Name: name, Namespace: targetNs}, &corev1.ConfigMap{})
// proxy settings
if proxyConfig, err := che.GetProxyConfiguration(deployContext); err != nil {
return err
}

data := map[string]string{}
if len(deployContext.CheCluster.Spec.DevEnvironments.EditorsDownloadUrls) > 0 {
for _, editorDownloadUrl := range deployContext.CheCluster.Spec.DevEnvironments.EditorsDownloadUrls {
editor := strings.ToUpper(editorDownloadUrl.Editor)
editor = strings.ReplaceAll(editor, "-", "_")
editor = strings.ReplaceAll(editor, "/", "_")
data[fmt.Sprintf("EDITOR_DOWNLOAD_URL_%s", editor)] = editorDownloadUrl.Url
} else if proxyConfig != nil {
if proxyConfig.HttpProxy != "" {
data["HTTP_PROXY"] = proxyConfig.HttpProxy
data["http_proxy"] = proxyConfig.HttpProxy
}
if proxyConfig.HttpsProxy != "" {
data["HTTPS_PROXY"] = proxyConfig.HttpsProxy
data["https_proxy"] = proxyConfig.HttpsProxy
}
if proxyConfig.NoProxy != "" {
data["NO_PROXY"] = proxyConfig.NoProxy
data["no_proxy"] = proxyConfig.NoProxy
}
} else {
return delConfigMap()
}

cm := &corev1.ConfigMap{
Expand Down
31 changes: 17 additions & 14 deletions controllers/usernamespace/usernamespace_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,25 +254,28 @@ func TestCreatesDataInNamespace(t *testing.T) {

assert.False(t, res.Requeue, "The reconciliation request should have succeeded but it is requesting a requeue")

idleSettings := corev1.ConfigMap{}
assert.NoError(t, cl.Get(ctx, client.ObjectKey{Name: "che-idle-settings", Namespace: namespace.GetName()}, &idleSettings))
userSettings := corev1.ConfigMap{}
assert.NoError(t, cl.Get(ctx, client.ObjectKey{Name: "che-user-settings", Namespace: namespace.GetName()}, &userSettings))

assert.Equal(t, "env", idleSettings.GetAnnotations()[dwconstants.DevWorkspaceMountAsAnnotation],
"idle settings should be annotated as mount as 'env'")
assert.Equal(t, "env", userSettings.GetAnnotations()[dwconstants.DevWorkspaceMountAsAnnotation],
"user settings should be annotated as mount as 'env'")

assert.Equal(t, "true", idleSettings.GetLabels()[dwconstants.DevWorkspaceMountLabel],
"idle settings should be labeled as mounted")
assert.Equal(t, "true", userSettings.GetLabels()[dwconstants.DevWorkspaceMountLabel],
"user settings should be labeled as mounted")

assert.Equal(t, 2, len(idleSettings.Data), "Expecting 2 elements in the idle settings")
assert.Equal(t, "1800", userSettings.Data["SECONDS_OF_DW_INACTIVITY_BEFORE_IDLING"], "Unexpected user settings")
assert.Equal(t, "-1", userSettings.Data["SECONDS_OF_DW_RUN_BEFORE_IDLING"], "Unexpected user settings")

assert.Equal(t, "1800", idleSettings.Data["SECONDS_OF_DW_INACTIVITY_BEFORE_IDLING"], "Unexpected idle settings")
assert.Equal(t, "-1", idleSettings.Data["SECONDS_OF_DW_RUN_BEFORE_IDLING"], "Unexpected idle settings")
assert.Equal(t, userSettings.Data["EDITOR_DOWNLOAD_URL_CHE_INCUBATOR_CHE_IDEA_LATEST"], "url_latest")
assert.Equal(t, userSettings.Data["EDITOR_DOWNLOAD_URL_CHE_INCUBATOR_CHE_IDEA_NEXT"], "url_next")

editorSettings := corev1.ConfigMap{}
assert.NoError(t, cl.Get(ctx, client.ObjectKey{Name: "che-editor-settings", Namespace: namespace.GetName()}, &editorSettings))
assert.Equal(t, 2, len(editorSettings.Data))
assert.Equal(t, editorSettings.Data["EDITOR_DOWNLOAD_URL_CHE_INCUBATOR_CHE_IDEA_LATEST"], "url_latest")
assert.Equal(t, editorSettings.Data["EDITOR_DOWNLOAD_URL_CHE_INCUBATOR_CHE_IDEA_NEXT"], "url_next")
if infraType == infrastructure.Kubernetes {
assert.Equal(t, 4, len(userSettings.Data), "Expecting 2 elements in the user settings")
} else {
assert.Equal(t, userSettings.Data["NO_PROXY"], ".svc")
assert.Equal(t, userSettings.Data["no_proxy"], ".svc")
assert.Equal(t, 6, len(userSettings.Data), "Expecting 2 elements in the user settings")
}

cert := corev1.Secret{}
assert.NoError(t, cl.Get(ctx, client.ObjectKey{Name: "che-server-cert", Namespace: namespace.GetName()}, &cert))
Expand Down