http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/slave/containerizer/provisioners/docker/metadata_manager.cpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/provisioners/docker/metadata_manager.cpp b/src/slave/containerizer/provisioners/docker/metadata_manager.cpp deleted file mode 100644 index 55eb382..0000000 --- a/src/slave/containerizer/provisioners/docker/metadata_manager.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <vector> - -#include <glog/logging.h> - -#include <stout/foreach.hpp> -#include <stout/hashset.hpp> -#include <stout/os.hpp> -#include <stout/protobuf.hpp> - -#include <process/defer.hpp> -#include <process/dispatch.hpp> -#include <process/owned.hpp> - -#include "common/status_utils.hpp" - -#include "messages/docker_provisioner.hpp" - -#include "slave/containerizer/provisioners/docker/paths.hpp" -#include "slave/containerizer/provisioners/docker/metadata_manager.hpp" -#include "slave/state.hpp" - -using namespace process; - -using std::list; -using std::string; -using std::vector; - -namespace mesos { -namespace internal { -namespace slave { -namespace docker { - - -class MetadataManagerProcess : public process::Process<MetadataManagerProcess> -{ -public: - ~MetadataManagerProcess() {} - - static Try<process::Owned<MetadataManagerProcess>> create( - const Flags& flags); - - Future<DockerImage> put( - const ImageName& name, - const std::list<std::string>& layerIds); - - Future<Option<DockerImage>> get(const ImageName& name); - - Future<Nothing> recover(); - - // TODO(chenlily): Implement removal of unreferenced images. - -private: - MetadataManagerProcess(const Flags& flags); - - // Write out metadata manager state to persistent store. - Try<Nothing> persist(); - - const Flags flags; - - // This is a lookup table for images that are stored in memory. It is keyed - // by the name of the DockerImage. - // For example, "ubuntu:14.04" -> ubuntu14:04 DockerImage. - hashmap<std::string, DockerImage> storedImages; -}; - - -Try<Owned<MetadataManager>> MetadataManager::create(const Flags& flags) -{ - Try<Owned<MetadataManagerProcess>> process = - MetadataManagerProcess::create(flags); - if (process.isError()) { - return Error("Failed to create Metadata Manager: " + process.error()); - } - return Owned<MetadataManager>(new MetadataManager(process.get())); -} - - -MetadataManager::MetadataManager(Owned<MetadataManagerProcess> process) - : process(process) -{ - process::spawn(CHECK_NOTNULL(process.get())); -} - - -MetadataManager::~MetadataManager() -{ - process::terminate(process.get()); - process::wait(process.get()); -} - - -Future<Nothing> MetadataManager::recover() -{ - return process::dispatch(process.get(), &MetadataManagerProcess::recover); -} - - -Future<DockerImage> MetadataManager::put( - const ImageName& name, - const list<string>& layerIds) -{ - return dispatch( - process.get(), &MetadataManagerProcess::put, name, layerIds); -} - - -Future<Option<DockerImage>> MetadataManager::get(const ImageName& name) -{ - return dispatch(process.get(), &MetadataManagerProcess::get, name); -} - - -MetadataManagerProcess::MetadataManagerProcess(const Flags& flags) - : flags(flags) {} - - -Try<Owned<MetadataManagerProcess>> MetadataManagerProcess::create( - const Flags& flags) -{ - Owned<MetadataManagerProcess> metadataManager = - Owned<MetadataManagerProcess>(new MetadataManagerProcess(flags)); - - return metadataManager; -} - - -Future<DockerImage> MetadataManagerProcess::put( - const ImageName& name, - const list<string>& layerIds) -{ - storedImages[name.name()] = DockerImage(name, layerIds); - - Try<Nothing> status = persist(); - if (status.isError()) { - return Failure("Failed to save state of Docker images" + status.error()); - } - - return storedImages[name.name()]; -} - - -Future<Option<DockerImage>> MetadataManagerProcess::get(const ImageName& name) -{ - if (!storedImages.contains(name.name())) { - return None(); - } - - return storedImages[name.name()]; -} - - -Try<Nothing> MetadataManagerProcess::persist() -{ - DockerProvisionerImages images; - - foreachpair( - const string& name, const DockerImage& dockerImage, storedImages) { - DockerProvisionerImages::Image* image = images.add_images(); - - image->set_name(name); - - foreach (const string& layerId, dockerImage.layerIds) { - image->add_layer_ids(layerId); - } - } - - Try<Nothing> status = mesos::internal::slave::state::checkpoint( - paths::getStoredImagesPath(flags.docker_store_dir), images); - if (status.isError()) { - return Error("Failed to perform checkpoint: " + status.error()); - } - - return Nothing(); -} - - -Future<Nothing> MetadataManagerProcess::recover() -{ - string storedImagesPath = paths::getStoredImagesPath(flags.docker_store_dir); - - storedImages.clear(); - if (!os::exists(storedImagesPath)) { - LOG(INFO) << "No images to load from disk. Docker provisioner image " - << "storage path: " << storedImagesPath << " does not exist."; - return Nothing(); - } - - Result<DockerProvisionerImages> images = - ::protobuf::read<DockerProvisionerImages>(storedImagesPath); - if (images.isError()) { - return Failure("Failed to read protobuf for Docker provisioner image: " + - images.error()); - } - - for (int i = 0; i < images.get().images_size(); i++) { - string name = images.get().images(i).name(); - - list<string> layerIds; - vector<string> missingLayerIds; - for (int j = 0; j < images.get().images(i).layer_ids_size(); j++) { - string layerId = images.get().images(i).layer_ids(j); - - layerIds.push_back(layerId); - - if (!os::exists( - paths::getImageLayerRootfsPath(flags.docker_store_dir, layerId))) { - missingLayerIds.push_back(layerId); - } - } - - if (!missingLayerIds.empty()) { - foreach (const string& layerId, missingLayerIds) { - LOG(WARNING) << "Image layer: " << layerId << " required for Docker " - << "image: " << name << " is not on disk."; - } - LOG(WARNING) << "Skipped loading image: " << name - << " due to missing layers."; - continue; - } - - Try<ImageName> imageName = ImageName::create(name); - if (imageName.isError()) { - return Failure("Unable to parse Docker image name: " + imageName.error()); - } - storedImages[imageName.get().name()] = DockerImage(imageName.get(), layerIds); - } - - LOG(INFO) << "Loaded " << storedImages.size() << " Docker images."; - - return Nothing(); -} - -} // namespace docker { -} // namespace slave { -} // namespace internal { -} // namespace mesos {
http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/slave/containerizer/provisioners/docker/metadata_manager.hpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/provisioners/docker/metadata_manager.hpp b/src/slave/containerizer/provisioners/docker/metadata_manager.hpp deleted file mode 100644 index 9db3f47..0000000 --- a/src/slave/containerizer/provisioners/docker/metadata_manager.hpp +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MESOS_DOCKER_METADATA_MANAGER_HPP__ -#define __MESOS_DOCKER_METADATA_MANAGER_HPP__ - -#include <list> -#include <string> - -#include <stout/hashmap.hpp> -#include <stout/json.hpp> -#include <stout/option.hpp> -#include <stout/protobuf.hpp> -#include <stout/try.hpp> - -#include <process/future.hpp> -#include <process/owned.hpp> -#include <process/process.hpp> - -#include "slave/containerizer/provisioners/docker.hpp" - -#include "slave/flags.hpp" - -namespace mesos { -namespace internal { -namespace slave { -namespace docker { - -// Forward Declaration. -class MetadataManagerProcess; - -/** - * The MetadataManager tracks the Docker images cached by the - * provisioner that are stored on disk. It keeps track of the layers - * that Docker images are composed of and recovers DockerImage objects - * upon initialization by checking for dependent layers stored on disk. - * Currently, image layers are stored indefinitely, with no garbage - * collection of unreferenced image layers. - */ -class MetadataManager -{ -public: - static Try<process::Owned<MetadataManager>> create(const Flags& flags); - - ~MetadataManager(); - - /** - * Create a DockerImage, put it in metadata manager and persist the reference - * store state to disk. - * - * @param name the name of the Docker image to place in the reference - * store. - * @param layerIds the list of layer ids that comprise the Docker image in - * order where the root layer's id (no parent layer) is first - * and the leaf layer's id is last. - */ - process::Future<DockerImage> put( - const ImageName& name, - const std::list<std::string>& layerIds); - - /** - * Retrieve DockerImage based on image name if it is among the DockerImages - * stored in memory. - * - * @param name the name of the Docker image to retrieve - */ - process::Future<Option<DockerImage>> get(const ImageName& name); - - /** - * Recover all stored DockerImage and its layer references. - */ - process::Future<Nothing> recover(); - -private: - explicit MetadataManager(process::Owned<MetadataManagerProcess> process); - - MetadataManager(const MetadataManager&); // Not copyable. - MetadataManager& operator=(const MetadataManager&); // Not assignable. - - process::Owned<MetadataManagerProcess> process; -}; - - -} // namespace docker { -} // namespace slave { -} // namespace internal { -} // namespace mesos { - -#endif // __MESOS_DOCKER_METADATA_MANAGER_HPP__ http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/slave/containerizer/provisioners/docker/paths.cpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/provisioners/docker/paths.cpp b/src/slave/containerizer/provisioners/docker/paths.cpp deleted file mode 100644 index 5a54ba1..0000000 --- a/src/slave/containerizer/provisioners/docker/paths.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "slave/containerizer/provisioners/docker/paths.hpp" - -#include <stout/path.hpp> - -using std::string; - -namespace mesos { -namespace internal { -namespace slave { -namespace docker { -namespace paths { - -string getStagingDir(const string& storeDir) -{ - return path::join(storeDir, "staging"); -} - -string getTempStaging(const string& storeDir) -{ - return path::join(getStagingDir(storeDir), "XXXXXX"); -} - -string getLocalImageTarPath( - const string& discoveryDir, - const string& name) -{ - return path::join(discoveryDir, name + ".tar"); -} - -string getLocalImageRepositoriesPath(const string& staging) -{ - return path::join(staging, "repositories"); -} - -std::string getLocalImageLayerPath( - const string& staging, - const string& layerId) -{ - return path::join(staging, layerId); -} - -string getLocalImageLayerManifestPath( - const string& staging, - const string& layerId) -{ - return path::join(getLocalImageLayerPath(staging, layerId), "json"); -} - -string getLocalImageLayerTarPath( - const string& staging, - const string& layerId) -{ - return path::join(getLocalImageLayerPath(staging, layerId), "layer.tar"); -} - -string getLocalImageLayerRootfsPath( - const string& staging, - const string& layerId) -{ - return path::join(getLocalImageLayerPath(staging, layerId), "rootfs"); -} - -string getImageLayerPath( - const string& storeDir, - const string& layerId) -{ - return path::join(storeDir, "layers", layerId); -} - -string getImageLayerRootfsPath( - const string& storeDir, - const string& layerId) -{ - return path::join(getImageLayerPath(storeDir, layerId), "rootfs"); -} - -string getStoredImagesPath(const string& storeDir) -{ - return path::join(storeDir, "storedImages"); -} - -} // namespace paths { -} // namespace docker { -} // namespace slave { -} // namespace internal { -} // namespace mesos { http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/slave/containerizer/provisioners/docker/paths.hpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/provisioners/docker/paths.hpp b/src/slave/containerizer/provisioners/docker/paths.hpp deleted file mode 100644 index 02f129f..0000000 --- a/src/slave/containerizer/provisioners/docker/paths.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MESOS_DOCKER_PATHS_HPP__ -#define __MESOS_DOCKER_PATHS_HPP__ - -#include <list> -#include <string> - -#include <mesos/mesos.hpp> - -namespace mesos { -namespace internal { -namespace slave { -namespace docker { -namespace paths { - -/** - * The Docker store file system layout is as follows: - * Image store dir ('--docker_store_dir' slave flag) - * |--staging (contains temp directories for downloads and extract) - * |--layers - * |--<layer_id> - * |--rootfs - * |--rootfses - * |--storedImages (file holding on cached images) - */ - -std::string getStagingDir(const std::string& storeDir); - -std::string getTempStaging(const std::string& storeDir); - -std::string getLocalImageTarPath( - const std::string& discoveryDir, - const std::string& name); - -std::string getLocalImageRepositoriesPath(const std::string& staging); - -std::string getLocalImageLayerPath( - const std::string& staging, - const std::string& layerId); - -std::string getLocalImageLayerManifestPath( - const std::string& staging, - const std::string& layerId); - -std::string getLocalImageLayerTarPath( - const std::string& staging, - const std::string& layerId); - -std::string getLocalImageLayerRootfsPath( - const std::string& staging, - const std::string& layerId); - -std::string getImageLayerPath( - const std::string& storeDir, - const std::string& layerId); - -std::string getImageLayerRootfsPath( - const std::string& storeDir, - const std::string& layerId); - -std::string getStoredImagesPath(const std::string& storeDir); - -} // namespace paths { -} // namespace docker { -} // namespace slave { -} // namespace internal { -} // namespace mesos { - -#endif // __MESOS_DOCKER_PATHS_HPP__ http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/slave/containerizer/provisioners/docker/store.hpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/provisioners/docker/store.hpp b/src/slave/containerizer/provisioners/docker/store.hpp deleted file mode 100644 index 03958bf..0000000 --- a/src/slave/containerizer/provisioners/docker/store.hpp +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MESOS_DOCKER_STORE_HPP__ -#define __MESOS_DOCKER_STORE_HPP__ - -#include <string> - -#include <stout/hashmap.hpp> -#include <stout/nothing.hpp> -#include <stout/option.hpp> -#include <stout/try.hpp> - -#include <process/future.hpp> - -#include "slave/containerizer/fetcher.hpp" -#include "slave/containerizer/provisioners/docker.hpp" - -#include "slave/flags.hpp" - -namespace mesos { -namespace internal { -namespace slave { -namespace docker { - -// Store fetches the Docker images and stores them on disk. -class Store -{ -public: - static Try<process::Owned<Store>> create( - const Flags& flags, - Fetcher* fetcher); - - virtual ~Store() {} - - /** - * Get image by name. - * - * @param name The name of the Docker image to retrieve from store. - * - * @return The DockerImage that holds the Docker layers. - */ - virtual process::Future<DockerImage> get(const ImageName& name) = 0; - - /** - * Recover all stored images - */ - virtual process::Future<Nothing> recover() = 0; - - // TODO(chenlily): Implement removing an image. - -protected: - Store() {} -}; - -} // namespace docker { -} // namespace slave { -} // namespace internal { -} // namespace mesos { - -#endif // __MESOS_DOCKER_STORE_HPP__ http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/slave/flags.cpp ---------------------------------------------------------------------- diff --git a/src/slave/flags.cpp b/src/slave/flags.cpp index b0af3d8..bf26b98 100644 --- a/src/slave/flags.cpp +++ b/src/slave/flags.cpp @@ -98,13 +98,13 @@ mesos::internal::slave::Flags::Flags() "Directory the docker provisioner will store images in", "/tmp/mesos/store/docker"); - add(&Flags::docker_backend, - "docker_backend", - "Strategy for docker provisioning container rootfs from images", - "copy"); + add(&Flags::docker_store_discovery, + "docker_store_discovery", + "Strategy for docker store to fetch images", + "local"); - add(&Flags::docker_discovery_local_dir, - "docker_discovery_local_dir", + add(&Flags::docker_store_discovery_local_dir, + "docker_store_discovery_local_dir", "Directory for docker provisioner to look in for local images", "/tmp/mesos/images/docker"); http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/slave/flags.hpp ---------------------------------------------------------------------- diff --git a/src/slave/flags.hpp b/src/slave/flags.hpp index 758d495..1ce123c 100644 --- a/src/slave/flags.hpp +++ b/src/slave/flags.hpp @@ -53,10 +53,11 @@ public: std::string image_provisioner_backend; std::string appc_store_dir; - std::string docker_store; + std::string docker_provisioner_backend; std::string docker_store_dir; - std::string docker_backend; - std::string docker_discovery_local_dir; + std::string docker_store_discovery; + std::string docker_store_discovery_local_dir; + std::string default_role; Option<std::string> attributes; Bytes fetcher_cache_size; http://git-wip-us.apache.org/repos/asf/mesos/blob/4dedbf4a/src/tests/containerizer/provisioner_docker_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/containerizer/provisioner_docker_tests.cpp b/src/tests/containerizer/provisioner_docker_tests.cpp index dd4f813..3a817c0 100644 --- a/src/tests/containerizer/provisioner_docker_tests.cpp +++ b/src/tests/containerizer/provisioner_docker_tests.cpp @@ -702,7 +702,7 @@ class DockerProvisionerLocalStoreTest : public TemporaryDirectoryTest public: void verifyLocalDockerImage( const slave::Flags& flags, - const DockerImage& dockerImage) + const vector<string>& layers) { string layersPath = path::join(flags.docker_store_dir, "layers"); @@ -717,12 +717,10 @@ public: os::read(path::join(layersPath, "456", "rootfs", "temp"))); // Verify the Docker Image provided. - EXPECT_EQ(dockerImage.imageName.repository, "abc"); - EXPECT_EQ(dockerImage.imageName.tag, "latest"); - list<string> expectedLayers; + vector<string> expectedLayers; expectedLayers.push_back("123"); expectedLayers.push_back("456"); - EXPECT_EQ(dockerImage.layerIds, expectedLayers); + EXPECT_EQ(expectedLayers, layers); } protected: @@ -796,25 +794,25 @@ TEST_F(DockerProvisionerLocalStoreTest, LocalStoreTestWithTar) ASSERT_SOME(os::mkdir(image)); slave::Flags flags; - flags.docker_store = "local"; + flags.docker_store_discovery = "local"; flags.docker_store_dir = path::join(os::getcwd(), "store"); - flags.docker_discovery_local_dir = imageDir; + flags.docker_store_discovery_local_dir = imageDir; - // Fetcher is not relevant to local store. It is passed through from the - // provisioner interface. - Fetcher fetcher; - Try<Owned<Store>> store = Store::create(flags, &fetcher); + Try<Owned<slave::Store>> store = + mesos::internal::slave::docker::Store::create(flags); ASSERT_SOME(store); string sandbox = path::join(os::getcwd(), "sandbox"); ASSERT_SOME(os::mkdir(sandbox)); - Try<ImageName> imageName = ImageName::create("abc"); - ASSERT_SOME(imageName); - Future<DockerImage> dockerImage = store.get()->get(imageName.get()); - AWAIT_READY(dockerImage); + Image mesosImage; + mesosImage.set_type(Image::DOCKER); + mesosImage.mutable_docker()->set_name("abc"); - verifyLocalDockerImage(flags, dockerImage.get()); + Future<vector<string>> layers = store.get()->get(mesosImage); + AWAIT_READY(layers); + + verifyLocalDockerImage(flags, layers.get()); } // This tests the ability of the reference store to recover the images it has @@ -822,32 +820,33 @@ TEST_F(DockerProvisionerLocalStoreTest, LocalStoreTestWithTar) TEST_F(DockerProvisionerLocalStoreTest, MetadataManagerInitialization) { slave::Flags flags; - flags.docker_store = "local"; + flags.docker_store_discovery = "local"; flags.docker_store_dir = path::join(os::getcwd(), "store"); - flags.docker_discovery_local_dir = path::join(os::getcwd(), "images"); + flags.docker_store_discovery_local_dir = path::join(os::getcwd(), "images"); - // Fetcher is not relevant to local store. It is passed through from the - // provisioner interface. - Fetcher fetcher; - Try<Owned<Store>> store = Store::create(flags, &fetcher); + Try<Owned<slave::Store>> store = + mesos::internal::slave::docker::Store::create(flags); ASSERT_SOME(store); string sandbox = path::join(os::getcwd(), "sandbox"); ASSERT_SOME(os::mkdir(sandbox)); - Try<ImageName> imageName = ImageName::create("abc"); - ASSERT_SOME(imageName); - Future<DockerImage> dockerImage = store.get()->get(imageName.get()); - AWAIT_READY(dockerImage); + + Image image; + image.set_type(Image::DOCKER); + image.mutable_docker()->set_name("abc"); + + Future<vector<string>> layers = store.get()->get(image); + AWAIT_READY(layers); // Store is deleted and recreated. Reference Store is initialized upon // creation of the store. store.get().reset(); - store = Store::create(flags, &fetcher); + store = mesos::internal::slave::docker::Store::create(flags); ASSERT_SOME(store); - dockerImage = store.get()->get(imageName.get()); - AWAIT_READY(dockerImage); - verifyLocalDockerImage(flags, dockerImage.get()); + layers = store.get()->get(image); + AWAIT_READY(layers); + verifyLocalDockerImage(flags, layers.get()); } } // namespace tests {
