You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by qi...@apache.org on 2020/08/18 07:43:11 UTC

[mesos] 01/05: Implemented the framework and `create` method of `volume/csi` isolator.

This is an automated email from the ASF dual-hosted git repository.

qianzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit a3e8fd89b1a34cf479c454e9991712cd2999affe
Author: Qian Zhang <zh...@gmail.com>
AuthorDate: Thu Jul 16 22:13:18 2020 +0800

    Implemented the framework and `create` method of `volume/csi` isolator.
    
    Review: https://reviews.apache.org/r/72690
---
 src/CMakeLists.txt                                 |   2 +
 src/Makefile.am                                    |   4 +
 .../mesos/isolators/volume/csi/isolator.cpp        | 114 +++++++++++++++++++++
 .../mesos/isolators/volume/csi/isolator.hpp        |  86 ++++++++++++++++
 .../mesos/isolators/volume/csi/paths.cpp           |  47 +++++++++
 .../mesos/isolators/volume/csi/paths.hpp           |  57 +++++++++++
 6 files changed, 310 insertions(+)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c60d98a..f3abdbf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -196,6 +196,7 @@ if (NOT WIN32)
     slave/containerizer/mesos/isolators/posix/disk.cpp
     slave/containerizer/mesos/isolators/posix/rlimits.cpp
     slave/containerizer/mesos/isolators/volume/sandbox_path.cpp
+    slave/containerizer/mesos/isolators/volume/csi/paths.cpp
     slave/containerizer/mesos/provisioner/appc/cache.cpp
     slave/containerizer/mesos/provisioner/appc/fetcher.cpp
     slave/containerizer/mesos/provisioner/appc/paths.cpp
@@ -336,6 +337,7 @@ set(LINUX_SRC
   slave/containerizer/mesos/isolators/volume/image.cpp
   slave/containerizer/mesos/isolators/volume/secret.cpp
   slave/containerizer/mesos/isolators/volume/utils.cpp
+  slave/containerizer/mesos/isolators/volume/csi/isolator.cpp
   slave/containerizer/mesos/provisioner/backends/aufs.cpp
   slave/containerizer/mesos/provisioner/backends/bind.cpp
   slave/containerizer/mesos/provisioner/backends/overlay.cpp)
diff --git a/src/Makefile.am b/src/Makefile.am
index 49dab4b..70e844d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1251,6 +1251,8 @@ libmesos_no_3rdparty_la_SOURCES +=					\
   slave/containerizer/mesos/isolators/posix/rlimits.hpp			\
   slave/containerizer/mesos/isolators/volume/sandbox_path.cpp		\
   slave/containerizer/mesos/isolators/volume/sandbox_path.hpp		\
+  slave/containerizer/mesos/isolators/volume/csi/paths.cpp		\
+  slave/containerizer/mesos/isolators/volume/csi/paths.hpp		\
   slave/containerizer/mesos/isolators/windows/cpu.hpp			\
   slave/containerizer/mesos/isolators/windows/mem.hpp			\
   slave/containerizer/mesos/launch.cpp					\
@@ -1454,6 +1456,8 @@ MESOS_LINUX_FILES =									\
   slave/containerizer/mesos/isolators/volume/secret.hpp					\
   slave/containerizer/mesos/isolators/volume/utils.cpp					\
   slave/containerizer/mesos/isolators/volume/utils.hpp					\
+  slave/containerizer/mesos/isolators/volume/csi/isolator.cpp				\
+  slave/containerizer/mesos/isolators/volume/csi/isolator.hpp				\
   slave/containerizer/mesos/provisioner/backends/aufs.cpp				\
   slave/containerizer/mesos/provisioner/backends/aufs.hpp				\
   slave/containerizer/mesos/provisioner/backends/bind.cpp				\
diff --git a/src/slave/containerizer/mesos/isolators/volume/csi/isolator.cpp b/src/slave/containerizer/mesos/isolators/volume/csi/isolator.cpp
new file mode 100644
index 0000000..7ec3a4e
--- /dev/null
+++ b/src/slave/containerizer/mesos/isolators/volume/csi/isolator.cpp
@@ -0,0 +1,114 @@
+// 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 <string>
+#include <vector>
+
+#include <process/future.hpp>
+#include <process/owned.hpp>
+
+#include <stout/os.hpp>
+
+#include <stout/os/realpath.hpp>
+
+#include "slave/containerizer/mesos/isolators/volume/csi/isolator.hpp"
+#include "slave/containerizer/mesos/isolators/volume/csi/paths.hpp"
+
+using std::string;
+using std::vector;
+
+using process::Future;
+using process::Owned;
+
+using mesos::slave::ContainerConfig;
+using mesos::slave::ContainerLaunchInfo;
+using mesos::slave::ContainerState;
+using mesos::slave::Isolator;
+
+namespace mesos {
+namespace internal {
+namespace slave {
+
+Try<Isolator*> VolumeCSIIsolatorProcess::create(
+    const Flags& flags,
+    CSIServer* csiServer)
+{
+  if (!strings::contains(flags.isolation, "filesystem/linux")) {
+    return Error("'filesystem/linux' isolator must be used");
+  }
+
+  if (csiServer == nullptr) {
+    return Error("No CSI server is provided");
+  }
+
+  const string csiRootDir = path::join(flags.runtime_dir, csi::paths::CSI_DIR);
+
+  // Create the CSI volume information root directory if it does not exist.
+  Try<Nothing> mkdir = os::mkdir(csiRootDir);
+  if (mkdir.isError()) {
+    return Error(
+        "Failed to create CSI volume information root directory at '" +
+        csiRootDir + "': " + mkdir.error());
+  }
+
+  Result<string> rootDir = os::realpath(csiRootDir);
+  if (!rootDir.isSome()) {
+    return Error(
+        "Failed to determine canonical path of CSI volume information root"
+        " directory '" + csiRootDir + "': " +
+        (rootDir.isError() ? rootDir.error() : "No such file or directory"));
+  }
+
+  Owned<MesosIsolatorProcess> process(new VolumeCSIIsolatorProcess(
+      flags,
+      csiServer,
+      rootDir.get()));
+
+  return new MesosIsolator(process);
+}
+
+
+bool VolumeCSIIsolatorProcess::supportsNesting()
+{
+  return true;
+}
+
+
+Future<Nothing> VolumeCSIIsolatorProcess::recover(
+    const vector<ContainerState>& states,
+    const hashset<ContainerID>& orphans)
+{
+  return Nothing();
+}
+
+
+Future<Option<ContainerLaunchInfo>> VolumeCSIIsolatorProcess::prepare(
+    const ContainerID& containerId,
+    const ContainerConfig& containerConfig)
+{
+  return None();
+}
+
+
+Future<Nothing> VolumeCSIIsolatorProcess::cleanup(
+    const ContainerID& containerId)
+{
+  return Nothing();
+}
+
+} // namespace slave {
+} // namespace internal {
+} // namespace mesos {
diff --git a/src/slave/containerizer/mesos/isolators/volume/csi/isolator.hpp b/src/slave/containerizer/mesos/isolators/volume/csi/isolator.hpp
new file mode 100644
index 0000000..f943766
--- /dev/null
+++ b/src/slave/containerizer/mesos/isolators/volume/csi/isolator.hpp
@@ -0,0 +1,86 @@
+// 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 __VOLUME_CSI_ISOLATOR_HPP__
+#define __VOLUME_CSI_ISOLATOR_HPP__
+
+#include <string>
+#include <vector>
+
+#include <mesos/mesos.hpp>
+
+#include <process/future.hpp>
+#include <process/id.hpp>
+#include <process/process.hpp>
+
+#include <stout/hashset.hpp>
+#include <stout/nothing.hpp>
+#include <stout/option.hpp>
+#include <stout/try.hpp>
+
+#include "slave/csi_server.hpp"
+#include "slave/flags.hpp"
+
+#include "slave/containerizer/mesos/isolator.hpp"
+
+namespace mesos {
+namespace internal {
+namespace slave {
+
+class VolumeCSIIsolatorProcess : public MesosIsolatorProcess
+{
+public:
+  static Try<mesos::slave::Isolator*> create(
+      const Flags& flags,
+      CSIServer* csiServer);
+
+  ~VolumeCSIIsolatorProcess() override {};
+
+  bool supportsNesting() override;
+
+  process::Future<Nothing> recover(
+      const std::vector<mesos::slave::ContainerState>& states,
+      const hashset<ContainerID>& orphans) override;
+
+  process::Future<Option<mesos::slave::ContainerLaunchInfo>> prepare(
+      const ContainerID& containerId,
+      const mesos::slave::ContainerConfig& containerConfig) override;
+
+  process::Future<Nothing> cleanup(
+      const ContainerID& containerId) override;
+
+private:
+  VolumeCSIIsolatorProcess(
+      const Flags& _flags,
+      CSIServer* _csiServer,
+      const std::string& _rootDir)
+  : ProcessBase(process::ID::generate("volume-csi-isolator")),
+    flags(_flags),
+    csiServer(_csiServer),
+    rootDir(_rootDir) {}
+
+  const Flags flags;
+  CSIServer* csiServer;
+
+  // CSI volume information root directory.
+  const std::string rootDir;
+};
+
+} // namespace slave {
+} // namespace internal {
+} // namespace mesos {
+
+#endif // __VOLUME_CSI_ISOLATOR_HPP__
diff --git a/src/slave/containerizer/mesos/isolators/volume/csi/paths.cpp b/src/slave/containerizer/mesos/isolators/volume/csi/paths.cpp
new file mode 100644
index 0000000..4fdbc29
--- /dev/null
+++ b/src/slave/containerizer/mesos/isolators/volume/csi/paths.cpp
@@ -0,0 +1,47 @@
+// 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 <mesos/type_utils.hpp>
+
+#include <stout/path.hpp>
+#include <stout/stringify.hpp>
+
+#include "slave/containerizer/mesos/isolators/volume/csi/paths.hpp"
+
+using std::string;
+
+namespace mesos {
+namespace internal {
+namespace slave {
+namespace csi {
+namespace paths {
+
+string getContainerDir(const string& rootDir, const ContainerID& containerId)
+{
+  return path::join(rootDir, stringify(containerId));
+}
+
+
+string getVolumesPath(const string& rootDir, const ContainerID& containerId)
+{
+  return path::join(getContainerDir(rootDir, containerId), "volumes");
+}
+
+} // namespace paths {
+} // namespace csi {
+} // namespace slave {
+} // namespace internal {
+} // namespace mesos {
diff --git a/src/slave/containerizer/mesos/isolators/volume/csi/paths.hpp b/src/slave/containerizer/mesos/isolators/volume/csi/paths.hpp
new file mode 100644
index 0000000..5b4a4ee
--- /dev/null
+++ b/src/slave/containerizer/mesos/isolators/volume/csi/paths.hpp
@@ -0,0 +1,57 @@
+// 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 __VOLUME_CSI_ISOLATOR_PATHS_HPP__
+#define __VOLUME_CSI_ISOLATOR_PATHS_HPP__
+
+#include <string>
+
+#include <mesos/mesos.hpp>
+
+namespace mesos {
+namespace internal {
+namespace slave {
+namespace csi {
+namespace paths {
+
+// The root directory where we keep the information of CSI volumes that each
+// container uses. The layout is as follows:
+//   /<runtime_dir>/isolators/volume/csi/
+//      |-- <ID of Container1>/
+//      |      |-- volumes
+//      |-- <ID of Container2>/
+//      |      |-- volumes
+//      |-- <ID of Container3>/
+//      |-- ...
+constexpr char CSI_DIR[] = "isolators/volume/csi";
+
+
+std::string getContainerDir(
+    const std::string& rootDir,
+    const ContainerID& containerId);
+
+
+std::string getVolumesPath(
+    const std::string& rootDir,
+    const ContainerID& containerId);
+
+} // namespace paths {
+} // namespace csi {
+} // namespace slave {
+} // namespace internal {
+} // namespace mesos {
+
+#endif // __VOLUME_CSI_ISOLATOR_PATHS_HPP__