package io.cattle.platform.app;
import io.cattle.platform.archaius.polling.RefreshableFixedDelayPollingScheduler;
import io.cattle.platform.archaius.sources.DefaultTransformedEnvironmentProperties;
import io.cattle.platform.archaius.sources.LazyJDBCSource;
import io.cattle.platform.archaius.sources.NamedDynamicConfiguration;
import io.cattle.platform.archaius.sources.NamedMapConfiguration;
import io.cattle.platform.archaius.sources.NamedSystemConfiguration;
import io.cattle.platform.archaius.sources.OptionalPropertiesConfigurationFactory;
import io.cattle.platform.archaius.sources.TransformedEnvironmentProperties;
import io.cattle.platform.archaius.startup.ArchaiusStartup;
import io.cattle.platform.datasource.DataSourceFactory;
import io.cattle.platform.extension.dynamic.DynamicExtensionManager;
import io.cattle.platform.extension.impl.EMUtils;
import io.cattle.platform.extension.impl.ExtensionManagerImpl;
import io.cattle.platform.logback.Startup;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Properties;
import org.apache.commons.configuration.AbstractConfiguration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
@Configuration
public class ConfigConfig {
private static final String[] DEFAULTS = new String[] {
"META-INF/cattle/agent-server/defaults.properties",
"META-INF/cattle/system-services/defaults.properties",
"META-INF/cattle/defaults/defaults.properties",
"META-INF/cattle/system/defaults.properties",
"META-INF/cattle/redis/defaults.properties",
"META-INF/cattle/core-model/defaults.properties",
"META-INF/cattle/process/defaults.properties",
"META-INF/cattle/encryption/defaults.properties",
"META-INF/cattle/allocator-server/defaults.properties",
"META-INF/cattle/core-object-defaults/defaults.properties",
"META-INF/cattle/bootstrap/defaults.properties",
"META-INF/cattle/iaas-api/defaults.properties",
"META-INF/cattle/config-defaults/defaults.properties",
"META-INF/cattle/api-server/defaults.properties",
"META-INF/cattle/defaults/dev-defaults.properties",
"META-INF/cattle/system-services/healthcheck-defaults.properties",
};
@Bean
ArchaiusStartup ArchaiusStartup(ExtensionManagerImpl em, @Qualifier("GlobalProperties") Properties props,
DataSourceFactory dsf, RefreshableFixedDelayPollingScheduler scheduler) {
ArchaiusStartup.setGlobalDefaults(props);
ArchaiusStartup startup = new ArchaiusStartup();
startup.setExtensionManager(em);
startup.setDataSourceFactory(dsf);
startup.setSchedulers(Arrays.asList(scheduler));
EMUtils.addConfig(em, new DefaultTransformedEnvironmentProperties(), "DefaultEnvironmentConfig");
EMUtils.addConfig(em, new TransformedEnvironmentProperties(), "EnvironmentConfig");
EMUtils.addConfig(em, new NamedSystemConfiguration(), "SystemConfig");
AbstractConfiguration localFileConfig = OptionalPropertiesConfigurationFactory.getConfiguration("cattle-local.properties");
EMUtils.addConfig(em, localFileConfig, "CattleLocalFileConfig");
NamedDynamicConfiguration dbConfig = new NamedDynamicConfiguration(new LazyJDBCSource(), scheduler);
dbConfig.setSourceName("Database");
EMUtils.addConfig(em, dbConfig, "DatabaseConfig");
AbstractConfiguration cattleFileConfig = OptionalPropertiesConfigurationFactory.getConfiguration("cattle.properties");
EMUtils.addConfig(em, cattleFileConfig, "CattleFileConfig");
AbstractConfiguration cattleOverrideFileConfig = OptionalPropertiesConfigurationFactory.getConfiguration("cattle-override.properties");
EMUtils.addConfig(em, cattleOverrideFileConfig, "CattleOverrideFileConfig");
AbstractConfiguration cattleGlobalFileConfig = OptionalPropertiesConfigurationFactory.getConfiguration("cattle-global.properties");
EMUtils.addConfig(em, cattleGlobalFileConfig, "CattleGlobalFileConfig");
NamedMapConfiguration defaultsConfig = new NamedMapConfiguration(props);
defaultsConfig.setSourceName("Code Packaged Defaults");
EMUtils.addConfig(em, defaultsConfig, "DefaultsConfig");
startup.init();
em.start();
startup.start();
return startup;
}
@Bean
RefreshableFixedDelayPollingScheduler ConfigScheduler() {
return new RefreshableFixedDelayPollingScheduler();
}
@Bean
ExtensionManagerImpl extensionManager() {
return new DynamicExtensionManager();
}
@Bean
Properties GlobalProperties() throws IOException {
Properties props = new Properties();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
for (String config : DEFAULTS) {
try (InputStream is = cl.getResourceAsStream(config)) {
if (is != null) {
props.load(is);
}
}
}
return props;
}
@Bean
@DependsOn("ArchaiusStartup")
Startup Startup() {
return new Startup();
}
}