package io.cattle.platform.docker.machine.launch; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.core.constants.ProjectConstants; import io.cattle.platform.iaas.api.manager.HaConfigManager; import io.cattle.platform.json.JsonMapper; import io.cattle.platform.lock.definition.LockDefinition; import io.cattle.platform.service.launcher.GenericServiceLauncher; import io.cattle.platform.util.type.InitializationTask; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.apache.http.client.fluent.Request; import com.netflix.config.DynamicBooleanProperty; import com.netflix.config.DynamicStringProperty; public class CatalogLauncher extends GenericServiceLauncher implements InitializationTask { private static final DynamicStringProperty CATALOG_URL = ArchaiusUtil.getString("catalog.url"); private static final DynamicStringProperty CATALOG_REFRESH_INTERVAL = ArchaiusUtil.getString("catalog.refresh.interval.seconds"); private static final DynamicStringProperty CATALOG_BINARY = ArchaiusUtil.getString("catalog.service.executable"); private static final DynamicStringProperty DB_PARAMS = ArchaiusUtil.getString("db.cattle.go.params"); private static final DynamicBooleanProperty LAUNCH_CATALOG = ArchaiusUtil.getBoolean("catalog.execute"); public static class CatalogEntry { String url; String branch; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getBranch() { return branch; } public void setBranch(String branch) { this.branch = branch; } public CatalogEntry() { this.branch = "master"; } } public static class ConfigFileFields { Map<String, CatalogEntry> Catalogs; public Map<String, CatalogEntry> getCatalogs() { return Catalogs; } public void setCatalogs(Map<String, CatalogEntry> catalogs) { Catalogs = catalogs; } public ConfigFileFields() { } } @Inject JsonMapper jsonMapper; @Override protected boolean shouldRun() { return LAUNCH_CATALOG.get(); } @Override protected String binaryPath() { return CATALOG_BINARY.get(); } @Override protected List<DynamicStringProperty> getReloadSettings() { List<DynamicStringProperty> list = new ArrayList<DynamicStringProperty>(); list.add(CATALOG_URL); list.add(CATALOG_REFRESH_INTERVAL); return list; } @Override protected void prepareProcess(ProcessBuilder pb) throws IOException { List<String> args = pb.command(); args.add("--config"); prepareConfigFile(); args.add("repo.json"); args.add("--refresh-interval"); args.add(CATALOG_REFRESH_INTERVAL.get()); } protected void prepareConfigFile() throws IOException { File configFile = new File("repo.json"); String catUrl = CATALOG_URL.get(); ConfigFileFields configCatalogEntries = new ConfigFileFields(); FileOutputStream fos = null; try { if (catUrl.startsWith("{")) { configCatalogEntries = jsonMapper.readValue(catUrl, ConfigFileFields.class); fos = new FileOutputStream(configFile.getAbsoluteFile()); jsonMapper.writeValue(fos, configCatalogEntries); } else { String[] catalogs = catUrl.split(","); Map<String, CatalogEntry> catalogEntryMap = new HashMap<String, CatalogEntry>(); for (String catalog : catalogs) { CatalogEntry entry = new CatalogEntry(); String[] splitted = catalog.split("="); entry.setUrl(splitted[1]); entry.setBranch("master"); catalogEntryMap.put(splitted[0], entry); } configCatalogEntries.setCatalogs(catalogEntryMap); fos = new FileOutputStream(configFile.getAbsoluteFile()); jsonMapper.writeValue(fos, configCatalogEntries); } } finally { if (fos != null) { fos.close(); } } } @Override protected void setEnvironment(Map<String, String> env) { env.put("CATALOG_SERVICE_MYSQL_ADDRESS", String.format("%s:%s", HaConfigManager.DB_HOST.get(), HaConfigManager.DB_PORT.get())); env.put("CATALOG_SERVICE_MYSQL_DBNAME", HaConfigManager.DB_NAME.get()); env.put("CATALOG_SERVICE_MYSQL_USER", HaConfigManager.DB_USER.get()); env.put("CATALOG_SERVICE_MYSQL_PASSWORD", HaConfigManager.DB_PASS.get()); env.put("CATALOG_SERVICE_MYSQL_PARAMS", DB_PARAMS.get() == null ? "" : DB_PARAMS.get()); } @Override protected LockDefinition getLock() { return null; } @Override protected boolean isReady() { return true; } @Override public void reload() { if (!shouldRun()) { return; } try { prepareConfigFile(); Request.Post("http://localhost:8088/v1-catalog/templates?action=refresh") .addHeader(ProjectConstants.PROJECT_HEADER, "global").execute(); } catch (IOException e) { throw new RuntimeException(e); } } }