/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package se.kth.karamel.common.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.PosixFilePermission;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.apache.log4j.Logger;
/**
*
* @author kamal
* @param <K>
* @param <V>
*/
public class Confs<K extends String, V extends String> extends Properties {
private static final Logger logger = Logger.getLogger(Confs.class);
private static Confs memConfs;
public synchronized <K, V> void set(K k, V v) {
if (v == null || v.toString().isEmpty()) {
if (contains(k)) {
remove(k);
}
} else {
super.put(k, v);
}
}
public static void setMemConfs(Confs confs) {
memConfs = confs;
}
public void writeKaramelConfs() {
File folder = new File(Settings.KARAMEL_ROOT_PATH);
writeConfs(folder);
}
public void writeClusterConfs(String clusterName) {
File folder = new File(Settings.CLUSTER_ROOT_PATH(clusterName));
writeConfs(folder);
}
public void writeConfs(File folder) {
FileOutputStream out = null;
try {
if (!folder.exists()) {
folder.mkdirs();
}
File file = new File(folder, Settings.KARAMEL_CONF_NAME);
out = new FileOutputStream(file);
store(out, "Karamel configurations");
if (System.getProperty("os.name").toLowerCase().indexOf("win") == -1) {
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
Files.setPosixFilePermissions(file.toPath(), perms);
}
} catch (IOException ex) {
logger.error("", ex);
} finally {
try {
out.close();
} catch (IOException ex) {
logger.error("", ex);
}
}
}
public static Confs loadJustClusterConfs(String clusterName) {
Confs clusterConf = loadConfs(Settings.CLUSTER_ROOT_PATH(clusterName));
return clusterConf;
}
public static Confs loadAllConfsForCluster(String clusterName) {
Confs karamelConf = loadKaramelConfs();
Confs clusterConf = loadConfs(Settings.CLUSTER_ROOT_PATH(clusterName));
for (String prop : clusterConf.stringPropertyNames()) {
karamelConf.put(prop, clusterConf.getProperty(prop));
}
return karamelConf;
}
public static Confs loadKaramelConfs() {
if (memConfs == null) {
return loadConfs(Settings.KARAMEL_ROOT_PATH);
} else {
return applyDefaults(memConfs);
}
}
public static Confs loadConfs(String folder) {
Confs prop = new Confs();
try {
File folders = new File(folder);
File file = new File(folders, Settings.KARAMEL_CONF_NAME);
if (!folders.exists()) {
logger.info(String.format("Created empty conf file cus didn't exist. %s'", folder));
folders.mkdirs();
}
FileInputStream fis = new FileInputStream(file);
prop.load(fis);
} catch (IOException e) {
logger.warn(String.format("Couldn't find karamel conf file in '%s'", folder));
}
return applyDefaults(prop);
}
public static Confs loadConfs() {
Confs prop = new Confs();
return applyDefaults(prop);
}
public static Confs applyDefaults(Confs prop) {
String pubKeyPath = prop.getProperty(Settings.SSH_PUBKEY_PATH_KEY);
String priKeyPath = prop.getProperty(Settings.SSH_PRIVKEY_PATH_KEY);
String batchSize = prop.getProperty(Settings.AWS_BATCH_SIZE_KEY);
String prepareStorage = prop.getProperty(Settings.PREPARE_STORAGES_KEY);
String skipExistingTasks = prop.getProperty(Settings.SKIP_EXISTINGTASKS_KEY);
String chefdkVersion = prop.getProperty(Settings.CHEFDK_VERSION_KEY);
if ((pubKeyPath == null || priKeyPath == null)) {
if (Settings.DEFAULT_PRIKEY_PATH != null) {
pubKeyPath = Settings.DEFAULT_PUBKEY_PATH;
priKeyPath = Settings.DEFAULT_PRIKEY_PATH;
prop.put(Settings.SSH_PUBKEY_PATH_KEY, pubKeyPath);
prop.put(Settings.SSH_PRIVKEY_PATH_KEY, priKeyPath);
}
}
if (batchSize == null) {
prop.put(Settings.AWS_BATCH_SIZE_KEY, Settings.AWS_BATCH_SIZE_DEFAULT.toString());
}
if (prepareStorage == null) {
prop.put(Settings.PREPARE_STORAGES_KEY, Settings.PREPARE_STORAGES_DEFAULT);
}
if (skipExistingTasks == null) {
prop.put(Settings.SKIP_EXISTINGTASKS_KEY, Settings.SKIP_EXISTINGTASKS_DEFAULT);
}
if (chefdkVersion == null) {
prop.put(Settings.CHEFDK_VERSION_KEY, Settings.CHEFDK_VERSION_DEFAULT);
}
return prop;
}
@Override
public synchronized Confs clone() {
Confs clone = new Confs();
for (String prop : stringPropertyNames()) {
clone.put(prop, getProperty(prop));
}
return clone;
}
}