private List<ServiceDescriptor> getServiceInventory(SlotStatus slotStatus) { Assignment assignment = slotStatus.getAssignment(); if (assignment == null) { return null; } String config = assignment.getConfig(); File cacheFile = getCacheFile(config); if (cacheFile.canRead()) { try { String json = CharStreams.toString(Files.newReaderSupplier(cacheFile, Charsets.UTF_8)); List<ServiceDescriptor> descriptors = descriptorsJsonCodec.fromJson(json); invalidServiceInventory.remove(config); return descriptors; } catch (Exception ignored) { // delete the bad cache file cacheFile.delete(); } } InputSupplier<? extends InputStream> configFile = ConfigUtils.newConfigEntrySupplier(repository, config, "airship-service-inventory.json"); if (configFile == null) { return null; } try { String json; try { json = CharStreams.toString(CharStreams.newReaderSupplier(configFile, Charsets.UTF_8)); } catch (FileNotFoundException e) { // no service inventory in the config, so replace with json null so caching works json = "null"; } invalidServiceInventory.remove(config); // cache json cacheFile.getParentFile().mkdirs(); Files.write(json, cacheFile, Charsets.UTF_8); List<ServiceDescriptor> descriptors = descriptorsJsonCodec.fromJson(json); return descriptors; } catch (Exception e) { if (invalidServiceInventory.add(config)) { log.error(e, "Unable to read service inventory for %s" + config); } } return null; }
@Override public Deployment install(Installation installation) { Preconditions.checkNotNull(installation, "installation is null"); File deploymentDir = new File(baseDir, "installation"); Assignment assignment = installation.getAssignment(); Deployment newDeployment = new Deployment( slotId, location, deploymentDir, getDataDir(), assignment, installation.getResources()); File tempDir = createTempDir(baseDir, "tmp-install"); try { // download the binary File binary = new File(tempDir, "airship-binary.tar.gz"); try { Files.copy(Resources.newInputStreamSupplier(installation.getBinaryFile().toURL()), binary); } catch (IOException e) { throw new RuntimeException( "Unable to download binary " + assignment.getBinary() + " from " + installation.getBinaryFile(), e); } // unpack the binary into a temp unpack dir File unpackDir = new File(tempDir, "unpack"); unpackDir.mkdirs(); try { extractTar(binary, unpackDir, tarTimeout); } catch (CommandFailedException e) { throw new RuntimeException( "Unable to extract tar file " + assignment.getBinary() + ": " + e.getMessage()); } // find the archive root dir (it should be the only file in the temp unpack dir) List<File> files = listFiles(unpackDir); if (files.size() != 1) { throw new RuntimeException( "Invalid tar file: file does not have a root directory " + assignment.getBinary()); } File binaryRootDir = files.get(0); // unpack config bundle try { URL url = installation.getConfigFile().toURL(); ConfigUtils.unpackConfig(Resources.newInputStreamSupplier(url), binaryRootDir); } catch (Exception e) { throw new RuntimeException( "Unable to extract config bundle " + assignment.getConfig() + ": " + e.getMessage()); } // installation is good, clear the current deployment if (this.deployment != null) { this.deploymentFile.delete(); deleteRecursively(this.deployment.getDeploymentDir()); this.deployment = null; } // save deployment versions file try { save(newDeployment); } catch (IOException e) { throw new RuntimeException("Unable to save deployment file", e); } // move the binary root directory to the final target try { Files.move(binaryRootDir, deploymentDir); } catch (IOException e) { throw new RuntimeException("Unable to move deployment to final location", e); } } finally { if (!deleteRecursively(tempDir)) { log.warn("Unable to delete temp directory: %s", tempDir.getAbsolutePath()); } } this.deployment = newDeployment; return newDeployment; }