package io.vivarium.client; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.google.common.base.Preconditions; import io.vivarium.net.UUIDDeserializer; import io.vivarium.net.UUIDSerializer; import io.vivarium.serialization.FileIO; import io.vivarium.util.UUID; import io.vivarium.util.UserFacingError; public class WorkerConfig { public static final String DEFAULT_PATH = "worker_config.json"; public static final long[] DEFAULT_THROUGHPUTS = { 20_000_000, 35_000_000, 50_000_000, 60_500_000, 70_000_000, 80_000_000, 85_000_000, 86_000_000, 87_000_000, 88_000_000, 89_000_000, 90_000_000 }; @JsonSerialize(using = UUIDSerializer.class) @JsonDeserialize(using = UUIDDeserializer.class) public final UUID workerID; public final long[] throughputs; private WorkerConfig() { workerID = null; throughputs = null; } private WorkerConfig(UUID workerID, long[] throughputs) { Preconditions.checkNotNull(workerID); Preconditions.checkNotNull(throughputs); this.workerID = workerID; this.throughputs = throughputs; } public static WorkerConfig loadWorkerConfig(File file, boolean generateIfNotFound) { Preconditions.checkNotNull(file); try { if (file.exists()) { ObjectMapper mapper = new ObjectMapper(); String configData = FileIO.loadFileToString(file); WorkerConfig loadedConfig = mapper.readValue(configData, WorkerConfig.class); return loadedConfig; } else if (generateIfNotFound) { try { UUID machineUUID = getMachineUUID(); WorkerConfig generatedConfig = new WorkerConfig(machineUUID, DEFAULT_THROUGHPUTS); generatedConfig.persistWorkerConfig(file); return generatedConfig; } catch (FileNotFoundException e) { e.printStackTrace(); throw new UserFacingError( "Trying to generate the worker configuration failed. This is only known to work on ubuntu systems at this time."); } } else { throw new UserFacingError("The worker config file " + file.getAbsolutePath() + " can't be found and worker config autogeneration has not been enabled."); } } catch (JsonParseException | JsonMappingException e) { e.printStackTrace(); throw new UserFacingError("Unable to read parse file " + file.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } private static UUID getMachineUUID() throws FileNotFoundException { String uuidString = FileIO.loadFileToString(new File("/var/lib/dbus/machine-id")); return UUID.fromString(uuidString); } private void persistWorkerConfig(File file) { Preconditions.checkNotNull(file); try { ObjectMapper mapper = new ObjectMapper(); String dataString = mapper.writeValueAsString(this); FileIO.saveStringToFile(dataString, file); } catch (IOException e) { throw new UserFacingError("The worker config file could not be written to: " + file.getAbsolutePath()); } } }