es.bsc.demiurge.core.configuration.Config.java Source code

Java tutorial

Introduction

Here is the source code for es.bsc.demiurge.core.configuration.Config.java

Source

/**
 Copyright (C) 2013-2014  Barcelona Supercomputing Center
    
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.
    
 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.
    
 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

package es.bsc.demiurge.core.configuration;

import es.bsc.demiurge.core.VmmGlobalListener;
import es.bsc.demiurge.core.cloudmiddleware.CloudMiddleware;
import es.bsc.demiurge.core.drivers.Estimator;
import es.bsc.demiurge.core.drivers.Monitoring;
import es.bsc.demiurge.core.drivers.VmmListener;
import es.bsc.demiurge.core.manager.VmManager;
import es.bsc.demiurge.core.monitoring.hosts.HostFactory;
import es.bsc.demiurge.core.vmplacement.CloplaConversor;
import org.apache.commons.configuration.*;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.optaplanner.core.impl.score.director.simple.SimpleScoreCalculator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Singleton class that contains all the configuration parameters.
 *
 * @author Mario Macias (github.com/mariomac), David Ortiz Lopez (david.ortiz@bsc.es), Mario Macias (http://github.com/mariomac)
 *
 */
public enum Config {
    INSTANCE;

    private String configurationFileName = null;

    // Configuration file
    private static final String PROPNAME_CONF_FILE = "config";

    private static final String DEFAULT_CONF_CLASSPATH_LOCATION = "/default.properties";
    private static final String DEFAULT_CONF_FILE_LOCATION = "/etc/demiurge/config.properties";
    private static final String OLD_ASCETIC_DEFAULT_CONF_FILE_LOCATION = "/etc/ascetic/vmm/vmmconfig.properties";
    private static final String DEFAULT_DB_NAME = "VmManagerDb";
    private static final String DEFAULT_BEANS_LOCATION = "/Beans.xml";

    // TODO: remove public ATTRIBUTES and access only through apache configuration
    // security
    public String cryptSalt;
    public boolean disableSecurity;

    // db
    public String dbName;

    // OpenStack configuration
    public boolean deployVmWithVolume;

    // Servers host names
    public String[] hosts;

    // Deploy
    public int connectionPort;
    public String contextPath;
    public String deployPackage;

    private Monitoring monitoring;
    private CloudMiddleware cloudMiddleware;
    private Set<Estimator> estimators;

    // Zabbix config
    public String zabbixDbIp;
    public String zabbixDbUser;
    public String zabbixDbPassword;

    private Map<String, Class<? extends SimpleScoreCalculator>> placementPolicies;
    private Configuration configuration;
    private List<VmmListener> vmmListeners;
    private HostFactory hostFactory;
    private VmManager vmManager;
    private CloplaConversor cloplaConversor;

    private List<VmmGlobalListener> vmmGlobalListeners;

    Config() {
        configuration = getPropertiesObjectFromConfigFile();
        initializeClassAttributes();
    }

    public Configuration getConfiguration() {
        return configuration;
    }

    /**
     * Returns a properties file that contains the configuration parameters for the VM Manager.
     *
     * @return the properties file
     */
    private Configuration getPropertiesObjectFromConfigFile() {
        Logger log = LogManager.getLogger(Config.class);
        try {
            Configuration embeddedConfig = null;
            URL embeddedConfigURL = Configuration.class.getResource(DEFAULT_CONF_CLASSPATH_LOCATION);
            if (embeddedConfigURL != null) {
                try {
                    embeddedConfig = new PropertiesConfiguration(embeddedConfigURL);
                } catch (ConfigurationException e) {
                    log.warn("Error processing embedded config file", e);
                }
            }

            // TO ALLOW COMPATIBILITY WITH OLDER VERSIONS OF VMM (Ascetic_exclusive)
            // If there is a config file in the newest default location, looks for it
            // if not, it looks in the old Ascetic default location
            String defaultFileName = OLD_ASCETIC_DEFAULT_CONF_FILE_LOCATION;
            if (new File(DEFAULT_CONF_FILE_LOCATION).exists()) {
                defaultFileName = DEFAULT_CONF_FILE_LOCATION;
            }
            configurationFileName = System.getProperty(PROPNAME_CONF_FILE, defaultFileName);

            log.debug("Loading configuration file: " + configurationFileName);

            Configuration fileConfig = null;
            if (new File(configurationFileName).exists()) {
                fileConfig = new PropertiesConfiguration(configurationFileName);
            }
            if (embeddedConfig == null) {
                if (fileConfig == null) {
                    throw new IllegalStateException("No configuration found at " + configurationFileName);
                }
                return fileConfig;
            } else {
                CompositeConfiguration compositeConfiguration = new CompositeConfiguration();
                if (fileConfig != null) {
                    compositeConfiguration.addConfiguration(fileConfig);
                }
                compositeConfiguration.addConfiguration(embeddedConfig);
                return compositeConfiguration;
            }
        } catch (ConfigurationException e) {
            log.error("Error loading properties file", e);
            e.printStackTrace();
        }
        return null;
    }

    public String getConfigurationFileName() {
        return configurationFileName;
    }

    /**
      * Initializes all the configuration parameters.
      *
      */
    private void initializeClassAttributes() {
        Logger logger = LogManager.getLogger(Config.class);
        dbName = configuration.getString("dbName", DEFAULT_DB_NAME);

        disableSecurity = configuration.getBoolean("disableSecurity", false);
        connectionPort = configuration.getInt("connectionPort", 80);
        deployPackage = configuration.getString("deployPackage");
        hosts = configuration.getStringArray("hosts");
        contextPath = configuration.getString("contextPath", "/");
        zabbixDbIp = configuration.getString("zabbixDbIp");
        zabbixDbUser = configuration.getString("zabbixDbUser");
        zabbixDbPassword = configuration.getString("zabbixDbPassword");
        deployVmWithVolume = configuration.getBoolean("deployVmWithVolume", false);

        cryptSalt = configuration.getString("crypt.salt", "addYourOwnSaltPropertyToTheConfigFile");

        logger.debug("Loading configuration: " + toString());
    }

    public void loadBeansConfig() {
        ApplicationContext springContext = new ClassPathXmlApplicationContext(DEFAULT_BEANS_LOCATION);
        placementPolicies = springContext.getBean("placementPolicies", Map.class);

        vmManager = springContext.getBean("vmManager", VmManager.class);

        cloudMiddleware = springContext.getBean("cloudMiddleware", CloudMiddleware.class);
        monitoring = springContext.getBean("monitoring", Monitoring.class);

        estimators = springContext.getBean("estimators", Set.class);

        vmmListeners = springContext.getBean("vmmListeners", List.class);
        vmmGlobalListeners = springContext.getBean("vmmGlobalListeners", List.class);

        // by the moment, don't need to put these two into beans (to simplify)
        hostFactory = new HostFactory(cloudMiddleware, monitoring);
        cloplaConversor = new CloplaConversor();

        /*
         * Extra initialization actions for managers
         */
        vmManager.doInitActions();

    }

    public Map<String, Class<? extends SimpleScoreCalculator>> getPlacementPolicies() {
        return placementPolicies;
    }

    public Monitoring getMonitoring() {
        return monitoring;
    }

    public CloudMiddleware getCloudMiddleware() {
        return cloudMiddleware;
    }

    public Set<Estimator> getEstimators() {
        return estimators;
    }

    public List<VmmListener> getVmmListeners() {
        return vmmListeners;
    }

    public CloplaConversor getCloplaConversor() {
        return cloplaConversor;
    }

    public List<VmmGlobalListener> getVmmGlobalListeners() {
        return vmmGlobalListeners;
    }

    @Override
    public String toString() {
        return "Config{" + "\n\tdbName='" + dbName + '\'' + "\n\thosts=" + Arrays.toString(hosts)
                + "\n\tconnectionPort='" + connectionPort + '\'' + "\n\tdeployPackage='" + deployPackage + '\''
                + "\n\tzabbixDbIp='" + zabbixDbIp + '\'' + "\n\tzabbixDbUser='" + zabbixDbUser + '\''
                + "\n\tzabbixDbPassword='" + zabbixDbPassword + '\'' + "\n\tdeployVmWithVolume='"
                + deployVmWithVolume + '\'' + "\n}";
    }

    public HostFactory getHostFactory() {
        return hostFactory;
    }

    public VmManager getVmManager() {
        return vmManager;
    }
}