cloudfoundry-incubator/stratos

View on GitHub
src/jetstream/repository/console_config/env_lookup.go

Summary

Maintainability
B
4 hrs
Test Coverage
package console_config

import (
    "strconv"

    "github.com/govau/cf-common/env"
    log "github.com/sirupsen/logrus"

    "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/interfaces"
)

const (
    configSetupNeededMarker = "__CONFIG_MIGRATION_NEEDED"
    envGroupName            = "env"
    systemGroupName         = "system"
)

// Env Vars from config store
var envVars map[string]string

// ConfigLookup looks up env var from the config database
func ConfigLookup(name string) (string, bool) {
    // Not initialized yet
    if envVars == nil {
        return "", false
    }

    // Get value from map if available
    v, ok := envVars[name]
    return v, ok
}

// InitializeConfEnvProvider reads the config from the database
func InitializeConfEnvProvider(configStore Repository) error {

    vars, err := configStore.GetValues(envGroupName)
    if err != nil {
        return err
    }

    envVars = vars
    return nil
}

// MigrateSetupData will migrate the old data if needed
func MigrateSetupData(portal interfaces.PortalProxy, configStore Repository) error {

    // Determine if we need to migrate data first
    _, ok, err := configStore.GetValue(systemGroupName, configSetupNeededMarker)
    if err != nil {
        log.Errorf("MigrateSetupData: Unable to check migration marker: %v", err)
        return err
    } else if !ok {
        log.Debug("MigrateSetupData: marker not present - no need to run migrations")
        return nil
    }

    // If we got a value, then we should migrate
    if !portal.GetConfig().CanMigrateDatabaseSchema {
        log.Info("Will not migrate setup data on this instance")
        return nil
    }

    log.Info("Migrating setup data to config store")

    // Load the set  up config from the old table, first

    config, err := configStore.GetConsoleConfig()
    if err != nil {
        log.Warn("Unable to load Setup configuration from the database")
        return err
    }

    if config == nil {
        log.Info("Can not migrate setup data - setup table is empty")

        // Remove the marker
        return configStore.DeleteValue(systemGroupName, configSetupNeededMarker)
    }

    // Persist the config - only save the settings if they differ from the environment
    if err := migrateConfigSetting(portal.Env(), configStore, "UAA_ENDPOINT", config.UAAEndpoint.String(), ""); err != nil {
        return err
    }

    if err := migrateConfigSetting(portal.Env(), configStore, "CONSOLE_ADMIN_SCOPE", config.ConsoleAdminScope, ""); err != nil {
        return err
    }

    if err := migrateConfigSetting(portal.Env(), configStore, "CONSOLE_CLIENT", config.ConsoleClient, ""); err != nil {
        return err
    }

    if err := migrateConfigSetting(portal.Env(), configStore, "CONSOLE_CLIENT_SECRET", config.ConsoleClientSecret, ""); err != nil {
        return err
    }

    if err := migrateConfigSetting(portal.Env(), configStore, "AUTH_ENDPOINT_TYPE", config.AuthEndpointType, ""); err != nil {
        return err
    }

    if err := migrateConfigSetting(portal.Env(), configStore, "SKIP_SSL_VALIDATION", strconv.FormatBool(config.SkipSSLValidation), "false"); err != nil {
        return err
    }

    // Don't store previous SSO_LOGIN value if it's false.
    // SSO_LOGIN was incorrectly being set in previous console config table, this was then transferred over here where the console expects
    // previous values to have been explicitly set by user (and as such should take precedents over env vars)
    // See https://github.com/cloudfoundry/stratos/issues/4013
    if config.UseSSO == true {
        if err := migrateConfigSetting(portal.Env(), configStore, "SSO_LOGIN", strconv.FormatBool(config.UseSSO), "false"); err != nil {
            return err
        }
    }

    // Delete the content form the legacy table
    err = configStore.DeleteConsoleConfig()
    if err != nil {
        log.Warnf("Unable to delete legacy console config data: %+v", err)
        return err
    }

    // Delete the migration marker
    err = configStore.DeleteValue(systemGroupName, configSetupNeededMarker)
    if err != nil {
        log.Warnf("Unable to delete setup config migration marker: %+v", err)
        return err
    }

    return nil
}

func migrateConfigSetting(envLookup *env.VarSet, configStore Repository, envVarName, value, defaultValue string) error {

    var shouldStore = true

    // Get the current value from the environment
    if currentValue, ok := envLookup.Lookup(envVarName); ok {
        shouldStore = currentValue != value
    } else {
        // Only store if the value is not the default value
        shouldStore = value != defaultValue
    }

    if shouldStore {
        err := configStore.SetValue(envGroupName, envVarName, value)
        return err
    }

    return nil
}