Future<vector<string>> StoreProcess::fetchDependencies( const string& imageId, bool cached) { const string imagePath = paths::getImagePath(rootDir, imageId); Try<spec::ImageManifest> manifest = spec::getManifest(imagePath); if (manifest.isError()) { return Failure( "Failed to get dependencies for image id '" + imageId + "': " + manifest.error()); } vector<Image::Appc> dependencies; foreach (const spec::ImageManifest::Dependency& dependency, manifest->dependencies()) { Image::Appc appc; appc.set_name(dependency.imagename()); if (dependency.has_imageid()) { appc.set_id(dependency.imageid()); } // TODO(jojy): Make Image::Appc use appc::spec::Label instead of // mesos::Label so that we can avoid this loop here. foreach (const spec::ImageManifest::Label& label, dependency.labels()) { mesos::Label appcLabel; appcLabel.set_key(label.name()); appcLabel.set_value(label.value()); appc.mutable_labels()->add_labels()->CopyFrom(appcLabel); } dependencies.emplace_back(appc); } if (dependencies.size() == 0) { return vector<string>(); } // Do a depth first search. vector<Future<vector<string>>> futures; futures.reserve(dependencies.size()); foreach (const Image::Appc& appc, dependencies) { futures.emplace_back(fetchImage(appc, cached)); }