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/03 02:51:33 UTC

[mesos] 01/04: Added CSI volume type into the `Volume` protobuf message.

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 8a41f00a379431d65b144e120fe60da95e6195e9
Author: Qian Zhang <zh...@gmail.com>
AuthorDate: Wed Jul 8 11:08:08 2020 +0800

    Added CSI volume type into the `Volume` protobuf message.
    
    Also removed the `types.proto` file which has `VolumeCapability`
    defined as well so that we will have a single place (`mesos.proto`)
    to define this protobuf message.
    
    Review: https://reviews.apache.org/r/72660
---
 include/mesos/csi/types.hpp                        | 40 ----------
 include/mesos/csi/types.proto                      | 90 ---------------------
 include/mesos/mesos.proto                          | 91 ++++++++++++++++++++++
 .../storage/disk_profile_adaptor.hpp               |  4 +-
 include/mesos/type_utils.hpp                       |  6 ++
 include/mesos/v1/mesos.proto                       | 91 ++++++++++++++++++++++
 src/CMakeLists.txt                                 |  2 -
 src/Makefile.am                                    | 10 ---
 src/common/type_utils.cpp                          | 18 +++++
 src/csi/state.proto                                |  4 +-
 src/csi/types.cpp                                  | 36 ---------
 src/csi/v0_utils.cpp                               | 68 ++++++++--------
 src/csi/v0_utils.hpp                               | 14 ++--
 src/csi/v0_volume_manager.cpp                      | 12 +--
 src/csi/v0_volume_manager.hpp                      |  8 +-
 src/csi/v0_volume_manager_process.hpp              |  8 +-
 src/csi/v1_utils.cpp                               | 68 ++++++++--------
 src/csi/v1_utils.hpp                               | 14 ++--
 src/csi/v1_volume_manager.cpp                      | 12 +--
 src/csi/v1_volume_manager.hpp                      |  8 +-
 src/csi/v1_volume_manager_process.hpp              |  8 +-
 src/csi/volume_manager.hpp                         |  8 +-
 src/examples/test_csi_plugin.cpp                   |  6 +-
 src/resource_provider/state.proto                  |  4 +-
 src/tests/csi_utils_tests.cpp                      |  1 -
 src/tests/disk_profile_adaptor_tests.cpp           |  6 +-
 26 files changed, 324 insertions(+), 313 deletions(-)

diff --git a/include/mesos/csi/types.hpp b/include/mesos/csi/types.hpp
deleted file mode 100644
index df9df38..0000000
--- a/include/mesos/csi/types.hpp
+++ /dev/null
@@ -1,40 +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_CSI_TYPES_HPP__
-#define __MESOS_CSI_TYPES_HPP__
-
-// ONLY USEFUL AFTER RUNNING PROTOC.
-#include <mesos/csi/types.pb.h>
-
-namespace mesos {
-namespace csi {
-namespace types {
-
-bool operator==(const VolumeCapability& left, const VolumeCapability& right);
-
-
-inline bool operator!=(
-    const VolumeCapability& left, const VolumeCapability& right)
-{
-  return !(left == right);
-}
-
-} // namespace types {
-} // namespace csi {
-} // namespace mesos {
-
-#endif // __MESOS_CSI_TYPES_HPP__
diff --git a/include/mesos/csi/types.proto b/include/mesos/csi/types.proto
deleted file mode 100644
index 3e1ac4b..0000000
--- a/include/mesos/csi/types.proto
+++ /dev/null
@@ -1,90 +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.
-
-syntax = "proto3";
-
-package mesos.csi.types;
-
-// This file contains "unversioned" CSI protobuf definitions used by Mesos. For
-// any CSI version, an unversioned CSI protobuf constructed from a versioned one
-// can be used to reconstructed back the same versioned protobuf (excluding
-// unknown fields). An unversioned protobuf can also be used to construct a
-// protobuf of another CSI version, but version-specific details might be lost.
-
-
-/**
- * Protobuf to specify a capability of a volume:
- * https://github.com/container-storage-interface/spec/blob/release-1.1/spec.md#createvolume
- */
-message VolumeCapability {
-  // Indicate that the volume will be accessed via the block device API.
-  message BlockVolume {
-    // Intentionally empty, for now.
-  }
-
-  // Indicate that the volume will be accessed via the filesystem API.
-  message MountVolume {
-    // The filesystem type. This field is OPTIONAL.
-    // An empty string is equal to an unspecified field value.
-    string fs_type = 1;
-
-    // The mount options that can be used for the volume. This field is
-    // OPTIONAL. `mount_flags` MAY contain sensitive information.
-    // Therefore, the CO and the Plugin MUST NOT leak this information
-    // to untrusted entities. The total size of this repeated field
-    // SHALL NOT exceed 4 KiB.
-    repeated string mount_flags = 2;
-  }
-
-  // Specify how a volume can be accessed.
-  message AccessMode {
-    enum Mode {
-      UNKNOWN = 0;
-
-      // Can only be published once as read/write on a single node, at
-      // any given time.
-      SINGLE_NODE_WRITER = 1;
-
-      // Can only be published once as readonly on a single node, at
-      // any given time.
-      SINGLE_NODE_READER_ONLY = 2;
-
-      // Can be published as readonly at multiple nodes simultaneously.
-      MULTI_NODE_READER_ONLY = 3;
-
-      // Can be published at multiple nodes simultaneously. Only one of
-      // the node can be used as read/write. The rest will be readonly.
-      MULTI_NODE_SINGLE_WRITER = 4;
-
-      // Can be published as read/write at multiple nodes
-      // simultaneously.
-      MULTI_NODE_MULTI_WRITER = 5;
-    }
-
-    // This field is REQUIRED.
-    Mode mode = 1;
-  }
-
-  // Specifies what API the volume will be accessed using. One of the
-  // following fields MUST be specified.
-  oneof access_type {
-    BlockVolume block = 1;
-    MountVolume mount = 2;
-  }
-
-  // This is a REQUIRED field.
-  AccessMode access_mode = 3;
-}
diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto
index 5f795f5..fe371ea 100644
--- a/include/mesos/mesos.proto
+++ b/include/mesos/mesos.proto
@@ -3056,6 +3056,7 @@ message Volume {
       HOST_PATH = 4;
       SANDBOX_PATH = 2;
       SECRET = 3;
+      CSI_VOLUME = 5;
     }
 
     message DockerVolume {
@@ -3094,6 +3095,94 @@ message Volume {
       required string path = 2;
     }
 
+    // A volume which will be handled by the `volume/csi` isolator.
+    message CSIVolume {
+      // The name of the CSI plugin.
+      required string plugin_name = 1;
+
+      // Specifies a capability of a volume.
+      // https://github.com/container-storage-interface/spec/blob/v1.3.0/csi.proto#L379:L438
+      message VolumeCapability {
+        // Indicates that the volume will be accessed via the block device API.
+        message BlockVolume {
+          // Intentionally empty, for now.
+        }
+
+        // Indicates that the volume will be accessed via the filesystem API.
+        message MountVolume {
+          // The filesystem type. An empty string is equal to an unspecified
+          // field value.
+          optional string fs_type = 1;
+
+          // The mount options that can be used for the volume. This field is
+          // OPTIONAL. `mount_flags` MAY contain sensitive information.
+          // Therefore, Mesos and the Plugin MUST NOT leak this information
+          // to untrusted entities. The total size of this repeated field
+          // SHALL NOT exceed 4 KiB.
+          repeated string mount_flags = 2;
+        }
+
+        // Specifies how a volume can be accessed.
+        message AccessMode {
+          enum Mode {
+            UNKNOWN = 0;
+
+            // Can only be published once as read/write on a single node, at
+            // any given time.
+            SINGLE_NODE_WRITER = 1;
+
+            // Can only be published once as readonly on a single node, at
+            // any given time.
+            SINGLE_NODE_READER_ONLY = 2;
+
+            // Can be published as readonly at multiple nodes simultaneously.
+            MULTI_NODE_READER_ONLY = 3;
+
+            // Can be published at multiple nodes simultaneously. Only one of
+            // the node can be used as read/write. The rest will be readonly.
+            MULTI_NODE_SINGLE_WRITER = 4;
+
+            // Can be published as read/write at multiple nodes
+            // simultaneously.
+            MULTI_NODE_MULTI_WRITER = 5;
+          }
+
+          required Mode mode = 1;
+        }
+
+        // Specifies what API the volume will be accessed using. One of the
+        // following fields MUST be specified.
+        oneof access_type {
+          BlockVolume block = 1;
+          MountVolume mount = 2;
+        }
+
+        required AccessMode access_mode = 3;
+      }
+
+      // Specifies the parameters used to stage/publish a pre-provisioned volume
+      // on an agent host. The fields are merged from `NodeStageVolumeRequest`
+      // and `NodePublishVolumeRequest` protobuf messages defined in CSI spec
+      // except two fields `staging_target_path` and `target_path` which will be
+      // internally determined by Mesos when staging/publishing the volume.
+      message StaticProvisioning {
+        required string volume_id = 1;
+        required VolumeCapability volume_capability = 2;
+        optional bool readonly = 3;
+
+        // The secrets needed for staging/publishing the volume, e.g.:
+        // {
+        //   "username": {"type": REFERENCE, "reference": {"name": "U_SECRET"}},
+        //   "password": {"type": REFERENCE, "reference": {"name": "P_SECRET"}}
+        // }
+        map<string, Secret> node_stage_secrets = 4;
+        map<string, Secret> node_publish_secrets = 5;
+        map<string, string> volume_context = 6;
+      }
+
+      optional StaticProvisioning static_provisioning = 2;
+    }
+
     // Enum fields should be optional, see: MESOS-4997.
     optional Type type = 1;
 
@@ -3109,6 +3198,8 @@ message Volume {
     // The volume/secret isolator uses the secret-fetcher module (third-party or
     // internal) downloads the secret and makes it available at container_path.
     optional Secret secret = 4;
+
+    optional CSIVolume csi_volume = 6;
   }
 
   optional Source source = 5;
diff --git a/include/mesos/resource_provider/storage/disk_profile_adaptor.hpp b/include/mesos/resource_provider/storage/disk_profile_adaptor.hpp
index 8b6da3a..e9d8815 100644
--- a/include/mesos/resource_provider/storage/disk_profile_adaptor.hpp
+++ b/include/mesos/resource_provider/storage/disk_profile_adaptor.hpp
@@ -23,8 +23,6 @@
 
 #include <mesos/mesos.hpp>
 
-#include <mesos/csi/types.hpp>
-
 #include <process/future.hpp>
 
 #include <stout/hashset.hpp>
@@ -63,7 +61,7 @@ public:
      * of `VolumeCapability` objects, the module will only allow a single
      * `VolumeCapability`.
      */
-    csi::types::VolumeCapability capability;
+    Volume::Source::CSIVolume::VolumeCapability capability;
 
     /**
      * Free-form key-value pairs which should be passed into the body
diff --git a/include/mesos/type_utils.hpp b/include/mesos/type_utils.hpp
index 98a2995..da9fd96 100644
--- a/include/mesos/type_utils.hpp
+++ b/include/mesos/type_utils.hpp
@@ -87,6 +87,9 @@ bool operator==(const TaskStatus& left, const TaskStatus& right);
 bool operator==(const URL& left, const URL& right);
 bool operator==(const UUID& left, const UUID& right);
 bool operator==(const Volume& left, const Volume& right);
+bool operator==(
+    const Volume::Source::CSIVolume::VolumeCapability& left,
+    const Volume::Source::CSIVolume::VolumeCapability& right);
 
 bool operator!=(const CheckStatusInfo& left, const CheckStatusInfo& right);
 bool operator!=(const ExecutorInfo& left, const ExecutorInfo& right);
@@ -96,6 +99,9 @@ bool operator!=(const Operation& left, const Operation& right);
 bool operator!=(const OperationStatus& left, const OperationStatus& right);
 
 bool operator!=(const TaskStatus& left, const TaskStatus& right);
+bool operator!=(
+    const Volume::Source::CSIVolume::VolumeCapability& left,
+    const Volume::Source::CSIVolume::VolumeCapability& right);
 
 inline bool operator==(const ExecutorID& left, const ExecutorID& right)
 {
diff --git a/include/mesos/v1/mesos.proto b/include/mesos/v1/mesos.proto
index 07d2f40..effcfa1 100644
--- a/include/mesos/v1/mesos.proto
+++ b/include/mesos/v1/mesos.proto
@@ -3045,6 +3045,7 @@ message Volume {
       HOST_PATH = 4;
       SANDBOX_PATH = 2;
       SECRET = 3;
+      CSI_VOLUME = 5;
     }
 
     message DockerVolume {
@@ -3083,6 +3084,94 @@ message Volume {
       required string path = 2;
     }
 
+    // A volume which will be handled by the `volume/csi` isolator.
+    message CSIVolume {
+      // The name of the CSI plugin.
+      required string plugin_name = 1;
+
+      // Specifies a capability of a volume.
+      // https://github.com/container-storage-interface/spec/blob/v1.3.0/csi.proto#L379:L438
+      message VolumeCapability {
+        // Indicates that the volume will be accessed via the block device API.
+        message BlockVolume {
+          // Intentionally empty, for now.
+        }
+
+        // Indicates that the volume will be accessed via the filesystem API.
+        message MountVolume {
+          // The filesystem type. An empty string is equal to an unspecified
+          // field value.
+          optional string fs_type = 1;
+
+          // The mount options that can be used for the volume. This field is
+          // OPTIONAL. `mount_flags` MAY contain sensitive information.
+          // Therefore, Mesos and the Plugin MUST NOT leak this information
+          // to untrusted entities. The total size of this repeated field
+          // SHALL NOT exceed 4 KiB.
+          repeated string mount_flags = 2;
+        }
+
+        // Specifies how a volume can be accessed.
+        message AccessMode {
+          enum Mode {
+            UNKNOWN = 0;
+
+            // Can only be published once as read/write on a single node, at
+            // any given time.
+            SINGLE_NODE_WRITER = 1;
+
+            // Can only be published once as readonly on a single node, at
+            // any given time.
+            SINGLE_NODE_READER_ONLY = 2;
+
+            // Can be published as readonly at multiple nodes simultaneously.
+            MULTI_NODE_READER_ONLY = 3;
+
+            // Can be published at multiple nodes simultaneously. Only one of
+            // the node can be used as read/write. The rest will be readonly.
+            MULTI_NODE_SINGLE_WRITER = 4;
+
+            // Can be published as read/write at multiple nodes
+            // simultaneously.
+            MULTI_NODE_MULTI_WRITER = 5;
+          }
+
+          required Mode mode = 1;
+        }
+
+        // Specifies what API the volume will be accessed using. One of the
+        // following fields MUST be specified.
+        oneof access_type {
+          BlockVolume block = 1;
+          MountVolume mount = 2;
+        }
+
+        required AccessMode access_mode = 3;
+      }
+
+      // Specifies the parameters used to stage/publish a pre-provisioned volume
+      // on an agent host. The fields are merged from `NodeStageVolumeRequest`
+      // and `NodePublishVolumeRequest` protobuf messages defined in CSI spec
+      // except two fields `staging_target_path` and `target_path` which will be
+      // internally determined by Mesos when staging/publishing the volume.
+      message StaticProvisioning {
+        required string volume_id = 1;
+        required VolumeCapability volume_capability = 2;
+        optional bool readonly = 3;
+
+        // The secrets needed for staging/publishing the volume, e.g.:
+        // {
+        //   "username": {"type": REFERENCE, "reference": {"name": "U_SECRET"}},
+        //   "password": {"type": REFERENCE, "reference": {"name": "P_SECRET"}}
+        // }
+        map<string, Secret> node_stage_secrets = 4;
+        map<string, Secret> node_publish_secrets = 5;
+        map<string, string> volume_context = 6;
+      }
+
+      optional StaticProvisioning static_provisioning = 2;
+    }
+
     // Enum fields should be optional, see: MESOS-4997.
     optional Type type = 1;
 
@@ -3098,6 +3187,8 @@ message Volume {
     // The volume/secret isolator uses the secret-fetcher module (third-party or
     // internal) downloads the secret and makes it available at container_path.
     optional Secret secret = 4;
+
+    optional CSIVolume csi_volume = 6;
   }
 
   optional Source source = 5;
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index bcb5128..4e15e3d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -39,7 +39,6 @@ PROTOC_GENERATE(TARGET mesos/allocator/allocator)
 PROTOC_GENERATE(TARGET mesos/authentication/authentication)
 PROTOC_GENERATE(TARGET mesos/authorizer/acls)
 PROTOC_GENERATE(TARGET mesos/authorizer/authorizer)
-PROTOC_GENERATE(TARGET mesos/csi/types)
 PROTOC_GENERATE(TARGET mesos/maintenance/maintenance)
 PROTOC_GENERATE(TARGET mesos/master/master)
 PROTOC_GENERATE(TARGET mesos/module/hook)
@@ -252,7 +251,6 @@ if (NOT WIN32)
 endif ()
 
 set(CSI_SRC
-  csi/types.cpp
   csi/metrics.cpp
   csi/paths.cpp
   csi/service_manager.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index a89919d..447db32 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -293,7 +293,6 @@ APPC_SPEC_PROTO = $(top_srcdir)/include/mesos/appc/spec.proto
 AUTHENTICATION_PROTO = $(top_srcdir)/include/mesos/authentication/authentication.proto
 AUTHORIZATION_PROTO = $(top_srcdir)/include/mesos/authorizer/authorizer.proto
 CONTAINERIZER_PROTO = $(top_srcdir)/include/mesos/slave/containerizer.proto
-CSI_TYPES_PROTO = $(top_srcdir)/include/mesos/csi/types.proto
 DOCKER_SPEC_PROTO = $(top_srcdir)/include/mesos/docker/spec.proto
 DOCKER_V1_PROTO = $(top_srcdir)/include/mesos/docker/v1.proto
 DOCKER_V2_PROTO = $(top_srcdir)/include/mesos/docker/v2.proto
@@ -431,8 +430,6 @@ CXX_CSI_PROTOS =							\
   ../include/csi/v1/csi.grpc.pb.h					\
   ../include/csi/v1/csi.pb.cc						\
   ../include/csi/v1/csi.pb.h						\
-  ../include/mesos/csi/types.pb.cc					\
-  ../include/mesos/csi/types.pb.h					\
   csi/state.pb.cc							\
   csi/state.pb.h
 
@@ -711,14 +708,9 @@ nodist_authorizer_HEADERS =						\
 csidir = $(pkgincludedir)/csi
 
 csi_HEADERS =								\
-  $(top_srcdir)/include/mesos/csi/types.hpp				\
-  $(top_srcdir)/include/mesos/csi/types.proto				\
   $(top_srcdir)/include/mesos/csi/v0.hpp				\
   $(top_srcdir)/include/mesos/csi/v1.hpp
 
-nodist_csi_HEADERS =							\
-  ../include/mesos/csi/types.pb.h
-
 # Install the generated CSI headers into $PREFIX/include.
 csi_v0dir = $(includedir)/csi/v0
 
@@ -1603,7 +1595,6 @@ libcsi_la_SOURCES =							\
   csi/service_manager.hpp						\
   csi/state.hpp								\
   csi/state.proto							\
-  csi/types.cpp								\
   csi/v0.cpp								\
   csi/v0_client.cpp							\
   csi/v0_client.hpp							\
@@ -1698,7 +1689,6 @@ libmesos_la_SOURCES =							\
   $(AUTHENTICATION_PROTO)						\
   $(AUTHORIZATION_PROTO)						\
   $(CONTAINERIZER_PROTO)						\
-  $(CSI_TYPES_PROTO)							\
   $(EXECUTOR_PROTO)							\
   $(DOCKER_SPEC_PROTO)							\
   $(DOCKER_V1_PROTO)							\
diff --git a/src/common/type_utils.cpp b/src/common/type_utils.cpp
index 5bf7113..bb43784 100644
--- a/src/common/type_utils.cpp
+++ b/src/common/type_utils.cpp
@@ -195,6 +195,16 @@ bool operator==(const Volume& left, const Volume& right)
 }
 
 
+bool operator==(
+    const Volume::Source::CSIVolume::VolumeCapability& left,
+    const Volume::Source::CSIVolume::VolumeCapability& right)
+{
+  // NOTE: `MessageDifferencer::Equivalent` would ignore unknown fields and load
+  // default values for unset fields (which are indistinguishable in proto3).
+  return google::protobuf::util::MessageDifferencer::Equivalent(left, right);
+}
+
+
 // TODO(bmahler): Leverage process::http::URL for equality.
 bool operator==(const URL& left, const URL& right)
 {
@@ -648,6 +658,14 @@ bool operator!=(const TaskStatus& left, const TaskStatus& right)
 }
 
 
+bool operator!=(
+    const Volume::Source::CSIVolume::VolumeCapability& left,
+    const Volume::Source::CSIVolume::VolumeCapability& right)
+{
+  return !(left == right);
+}
+
+
 bool operator==(const CheckStatusInfo& left, const CheckStatusInfo& right)
 {
   return left.SerializeAsString() == right.SerializeAsString();
diff --git a/src/csi/state.proto b/src/csi/state.proto
index 96ba420..28ad5ef 100644
--- a/src/csi/state.proto
+++ b/src/csi/state.proto
@@ -16,7 +16,7 @@
 
 syntax = "proto3";
 
-import "mesos/csi/types.proto";
+import "mesos/mesos.proto";
 
 package mesos.csi.state;
 
@@ -44,7 +44,7 @@ message VolumeState {
   State state = 1;
 
   // The capability used to publish the volume. This is a REQUIRED field.
-  types.VolumeCapability volume_capability = 2;
+  Volume.Source.CSIVolume.VolumeCapability volume_capability = 2;
 
   // The parameters used when creating the volume. This is an OPTIONAL field.
   map<string, string> parameters = 6;
diff --git a/src/csi/types.cpp b/src/csi/types.cpp
deleted file mode 100644
index cb5ee8f..0000000
--- a/src/csi/types.cpp
+++ /dev/null
@@ -1,36 +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 <mesos/csi/types.hpp>
-
-#include <google/protobuf/util/message_differencer.h>
-
-using google::protobuf::util::MessageDifferencer;
-
-namespace mesos {
-namespace csi {
-namespace types {
-
-bool operator==(const VolumeCapability& left, const VolumeCapability& right)
-{
-  // NOTE: `MessageDifferencer::Equivalent` would ignore unknown fields and load
-  // default values for unset fields (which are indistinguishable in proto3).
-  return MessageDifferencer::Equivalent(left, right);
-}
-
-} // namespace types {
-} // namespace csi {
-} // namespace mesos {
diff --git a/src/csi/v0_utils.cpp b/src/csi/v0_utils.cpp
index 248e417..706d880 100644
--- a/src/csi/v0_utils.cpp
+++ b/src/csi/v0_utils.cpp
@@ -35,55 +35,56 @@ RepeatedPtrField<T1> devolve(RepeatedPtrField<T2> from)
 }
 
 
-types::VolumeCapability::BlockVolume devolve(
+CSIVolume::VolumeCapability::BlockVolume devolve(
     const VolumeCapability::BlockVolume& block)
 {
-  return types::VolumeCapability::BlockVolume();
+  return CSIVolume::VolumeCapability::BlockVolume();
 }
 
 
-types::VolumeCapability::MountVolume devolve(
+CSIVolume::VolumeCapability::MountVolume devolve(
     const VolumeCapability::MountVolume& mount)
 {
-  types::VolumeCapability::MountVolume result;
+  CSIVolume::VolumeCapability::MountVolume result;
   result.set_fs_type(mount.fs_type());
   *result.mutable_mount_flags() = mount.mount_flags();
   return result;
 }
 
 
-types::VolumeCapability::AccessMode devolve(
+CSIVolume::VolumeCapability::AccessMode devolve(
     const VolumeCapability::AccessMode& accessMode)
 {
-  types::VolumeCapability::AccessMode result;
+  CSIVolume::VolumeCapability::AccessMode result;
 
   switch (accessMode.mode()) {
     case VolumeCapability::AccessMode::UNKNOWN: {
-      result.set_mode(types::VolumeCapability::AccessMode::UNKNOWN);
+      result.set_mode(CSIVolume::VolumeCapability::AccessMode::UNKNOWN);
       break;
     }
     case VolumeCapability::AccessMode::SINGLE_NODE_WRITER: {
-      result.set_mode(types::VolumeCapability::AccessMode::SINGLE_NODE_WRITER);
+      result.set_mode(
+          CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_WRITER);
       break;
     }
     case VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY);
+          CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY);
       break;
     }
     case VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY);
+          CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY);
       break;
     }
     case VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER);
+          CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER);
       break;
     }
     case VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER);
+          CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER);
       break;
     }
     // NOTE: We avoid using a default clause for the following values in
@@ -99,9 +100,9 @@ types::VolumeCapability::AccessMode devolve(
 }
 
 
-types::VolumeCapability devolve(const VolumeCapability& capability)
+CSIVolume::VolumeCapability devolve(const VolumeCapability& capability)
 {
-  types::VolumeCapability result;
+  CSIVolume::VolumeCapability result;
 
   switch (capability.access_type_case()) {
     case VolumeCapability::kBlock: {
@@ -125,10 +126,10 @@ types::VolumeCapability devolve(const VolumeCapability& capability)
 }
 
 
-RepeatedPtrField<types::VolumeCapability> devolve(
+RepeatedPtrField<CSIVolume::VolumeCapability> devolve(
     const RepeatedPtrField<VolumeCapability>& capabilities)
 {
-  return devolve<types::VolumeCapability>(capabilities);
+  return devolve<CSIVolume::VolumeCapability>(capabilities);
 }
 
 
@@ -146,14 +147,14 @@ RepeatedPtrField<T1> evolve(RepeatedPtrField<T2> from)
 
 
 VolumeCapability::BlockVolume evolve(
-    const types::VolumeCapability::BlockVolume& block)
+    const CSIVolume::VolumeCapability::BlockVolume& block)
 {
   return VolumeCapability::BlockVolume();
 }
 
 
 VolumeCapability::MountVolume evolve(
-    const types::VolumeCapability::MountVolume& mount)
+    const CSIVolume::VolumeCapability::MountVolume& mount)
 {
   VolumeCapability::MountVolume result;
   result.set_fs_type(mount.fs_type());
@@ -163,62 +164,55 @@ VolumeCapability::MountVolume evolve(
 
 
 VolumeCapability::AccessMode evolve(
-    const types::VolumeCapability::AccessMode& accessMode)
+    const CSIVolume::VolumeCapability::AccessMode& accessMode)
 {
   VolumeCapability::AccessMode result;
 
   switch (accessMode.mode()) {
-    case types::VolumeCapability::AccessMode::UNKNOWN: {
+    case CSIVolume::VolumeCapability::AccessMode::UNKNOWN: {
       result.set_mode(VolumeCapability::AccessMode::UNKNOWN);
       break;
     }
-    case types::VolumeCapability::AccessMode::SINGLE_NODE_WRITER: {
+    case CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_WRITER: {
       result.set_mode(VolumeCapability::AccessMode::SINGLE_NODE_WRITER);
       break;
     }
-    case types::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY: {
+    case CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY: {
       result.set_mode(VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY);
       break;
     }
-    case types::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY: {
+    case CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY: {
       result.set_mode(VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY);
       break;
     }
-    case types::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER: {
+    case CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER: {
       result.set_mode(VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER);
       break;
     }
-    case types::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER: {
+    case CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER: {
       result.set_mode(VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER);
       break;
     }
-    // NOTE: We avoid using a default clause for the following values in
-    // proto3's open enum to enable the compiler to detect missing enum cases
-    // for us. See: https://github.com/google/protobuf/issues/3917
-    case google::protobuf::kint32min:
-    case google::protobuf::kint32max: {
-      UNREACHABLE();
-    }
   }
 
   return result;
 }
 
 
-VolumeCapability evolve(const types::VolumeCapability& capability)
+VolumeCapability evolve(const CSIVolume::VolumeCapability& capability)
 {
   VolumeCapability result;
 
   switch (capability.access_type_case()) {
-    case types::VolumeCapability::kBlock: {
+    case CSIVolume::VolumeCapability::kBlock: {
       *result.mutable_block() = evolve(capability.block());
       break;
     }
-    case types::VolumeCapability::kMount: {
+    case CSIVolume::VolumeCapability::kMount: {
       *result.mutable_mount() = evolve(capability.mount());
       break;
     }
-    case types::VolumeCapability::ACCESS_TYPE_NOT_SET: {
+    case CSIVolume::VolumeCapability::ACCESS_TYPE_NOT_SET: {
       break;
     }
   }
@@ -232,7 +226,7 @@ VolumeCapability evolve(const types::VolumeCapability& capability)
 
 
 RepeatedPtrField<VolumeCapability> devolve(
-    const RepeatedPtrField<types::VolumeCapability>& capabilities)
+    const RepeatedPtrField<CSIVolume::VolumeCapability>& capabilities)
 {
   return evolve<VolumeCapability>(capabilities);
 }
diff --git a/src/csi/v0_utils.hpp b/src/csi/v0_utils.hpp
index 468b416..576a938 100644
--- a/src/csi/v0_utils.hpp
+++ b/src/csi/v0_utils.hpp
@@ -19,7 +19,8 @@
 
 #include <google/protobuf/message.h>
 
-#include <mesos/csi/types.hpp>
+#include <mesos/mesos.hpp>
+
 #include <mesos/csi/v0.hpp>
 
 #include <stout/foreach.hpp>
@@ -29,6 +30,9 @@ namespace mesos {
 namespace csi {
 namespace v0 {
 
+using CSIVolume = Volume::Source::CSIVolume;
+
+
 struct PluginCapabilities
 {
   PluginCapabilities() = default;
@@ -140,17 +144,17 @@ struct NodeCapabilities
 
 
 // Helpers to devolve CSI v0 protobufs to their unversioned counterparts.
-types::VolumeCapability devolve(const VolumeCapability& capability);
+CSIVolume::VolumeCapability devolve(const VolumeCapability& capability);
 
-google::protobuf::RepeatedPtrField<types::VolumeCapability> devolve(
+google::protobuf::RepeatedPtrField<CSIVolume::VolumeCapability> devolve(
     const google::protobuf::RepeatedPtrField<VolumeCapability>& capabilities);
 
 
 // Helpers to evolve unversioned CSI protobufs to their v0 counterparts.
-VolumeCapability evolve(const types::VolumeCapability& capability);
+VolumeCapability evolve(const CSIVolume::VolumeCapability& capability);
 
 google::protobuf::RepeatedPtrField<VolumeCapability> evolve(
-    const google::protobuf::RepeatedPtrField<types::VolumeCapability>&
+    const google::protobuf::RepeatedPtrField<CSIVolume::VolumeCapability>&
       capabilities);
 
 } // namespace v0 {
diff --git a/src/csi/v0_volume_manager.cpp b/src/csi/v0_volume_manager.cpp
index 4b056e7..b383598 100644
--- a/src/csi/v0_volume_manager.cpp
+++ b/src/csi/v0_volume_manager.cpp
@@ -259,7 +259,7 @@ Future<vector<VolumeInfo>> VolumeManagerProcess::listVolumes()
 
 
 Future<Bytes> VolumeManagerProcess::getCapacity(
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   if (!controllerCapabilities->getCapacity) {
@@ -280,7 +280,7 @@ Future<Bytes> VolumeManagerProcess::getCapacity(
 Future<VolumeInfo> VolumeManagerProcess::createVolume(
     const string& name,
     const Bytes& capacity,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   if (!controllerCapabilities->createDeleteVolume) {
@@ -329,7 +329,7 @@ Future<VolumeInfo> VolumeManagerProcess::createVolume(
 
 Future<Option<Error>> VolumeManagerProcess::validateVolume(
     const VolumeInfo& volumeInfo,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   // If the volume has been checkpointed, the validation succeeds only if the
@@ -1229,7 +1229,7 @@ Future<vector<VolumeInfo>> VolumeManager::listVolumes()
 
 
 Future<Bytes> VolumeManager::getCapacity(
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   return recovered
@@ -1244,7 +1244,7 @@ Future<Bytes> VolumeManager::getCapacity(
 Future<VolumeInfo> VolumeManager::createVolume(
     const string& name,
     const Bytes& capacity,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   return recovered
@@ -1260,7 +1260,7 @@ Future<VolumeInfo> VolumeManager::createVolume(
 
 Future<Option<Error>> VolumeManager::validateVolume(
     const VolumeInfo& volumeInfo,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   return recovered
diff --git a/src/csi/v0_volume_manager.hpp b/src/csi/v0_volume_manager.hpp
index 9d572e7..6920eb8 100644
--- a/src/csi/v0_volume_manager.hpp
+++ b/src/csi/v0_volume_manager.hpp
@@ -24,8 +24,6 @@
 
 #include <mesos/mesos.hpp>
 
-#include <mesos/csi/types.hpp>
-
 #include <process/future.hpp>
 #include <process/grpc.hpp>
 #include <process/http.hpp>
@@ -74,20 +72,20 @@ public:
   process::Future<std::vector<VolumeInfo>> listVolumes() override;
 
   process::Future<Bytes> getCapacity(
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters)
     override;
 
   process::Future<VolumeInfo> createVolume(
       const std::string& name,
       const Bytes& capacity,
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters)
     override;
 
   process::Future<Option<Error>> validateVolume(
       const VolumeInfo& volumeInfo,
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters)
     override;
 
diff --git a/src/csi/v0_volume_manager_process.hpp b/src/csi/v0_volume_manager_process.hpp
index 50148ff..d5a5eb2 100644
--- a/src/csi/v0_volume_manager_process.hpp
+++ b/src/csi/v0_volume_manager_process.hpp
@@ -24,8 +24,6 @@
 
 #include <mesos/mesos.hpp>
 
-#include <mesos/csi/types.hpp>
-
 #include <process/future.hpp>
 #include <process/grpc.hpp>
 #include <process/http.hpp>
@@ -71,18 +69,18 @@ public:
   process::Future<std::vector<VolumeInfo>> listVolumes();
 
   process::Future<Bytes> getCapacity(
-      const types::VolumeCapability& capability,
+      const CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters);
 
   process::Future<VolumeInfo> createVolume(
       const std::string& name,
       const Bytes& capacity,
-      const types::VolumeCapability& capability,
+      const CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters);
 
   process::Future<Option<Error>> validateVolume(
       const VolumeInfo& volumeInfo,
-      const types::VolumeCapability& capability,
+      const CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters);
 
   process::Future<bool> deleteVolume(const std::string& volumeId);
diff --git a/src/csi/v1_utils.cpp b/src/csi/v1_utils.cpp
index e74138b..8d2eca3 100644
--- a/src/csi/v1_utils.cpp
+++ b/src/csi/v1_utils.cpp
@@ -35,55 +35,56 @@ RepeatedPtrField<T1> devolve(RepeatedPtrField<T2> from)
 }
 
 
-types::VolumeCapability::BlockVolume devolve(
+CSIVolume::VolumeCapability::BlockVolume devolve(
     const VolumeCapability::BlockVolume& block)
 {
-  return types::VolumeCapability::BlockVolume();
+  return CSIVolume::VolumeCapability::BlockVolume();
 }
 
 
-types::VolumeCapability::MountVolume devolve(
+CSIVolume::VolumeCapability::MountVolume devolve(
     const VolumeCapability::MountVolume& mount)
 {
-  types::VolumeCapability::MountVolume result;
+  CSIVolume::VolumeCapability::MountVolume result;
   result.set_fs_type(mount.fs_type());
   *result.mutable_mount_flags() = mount.mount_flags();
   return result;
 }
 
 
-types::VolumeCapability::AccessMode devolve(
+CSIVolume::VolumeCapability::AccessMode devolve(
     const VolumeCapability::AccessMode& accessMode)
 {
-  types::VolumeCapability::AccessMode result;
+  CSIVolume::VolumeCapability::AccessMode result;
 
   switch (accessMode.mode()) {
     case VolumeCapability::AccessMode::UNKNOWN: {
-      result.set_mode(types::VolumeCapability::AccessMode::UNKNOWN);
+      result.set_mode(CSIVolume::VolumeCapability::AccessMode::UNKNOWN);
       break;
     }
     case VolumeCapability::AccessMode::SINGLE_NODE_WRITER: {
-      result.set_mode(types::VolumeCapability::AccessMode::SINGLE_NODE_WRITER);
+      result.set_mode(
+          CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_WRITER);
       break;
     }
     case VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY);
+          CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY);
       break;
     }
     case VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY);
+          CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY);
       break;
     }
     case VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER);
+          CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER);
       break;
     }
     case VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER: {
       result.set_mode(
-          types::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER);
+          CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER);
       break;
     }
     // NOTE: We avoid using a default clause for the following values in
@@ -99,9 +100,9 @@ types::VolumeCapability::AccessMode devolve(
 }
 
 
-types::VolumeCapability devolve(const VolumeCapability& capability)
+CSIVolume::VolumeCapability devolve(const VolumeCapability& capability)
 {
-  types::VolumeCapability result;
+  CSIVolume::VolumeCapability result;
 
   switch (capability.access_type_case()) {
     case VolumeCapability::kBlock: {
@@ -125,10 +126,10 @@ types::VolumeCapability devolve(const VolumeCapability& capability)
 }
 
 
-RepeatedPtrField<types::VolumeCapability> devolve(
+RepeatedPtrField<CSIVolume::VolumeCapability> devolve(
     const RepeatedPtrField<VolumeCapability>& capabilities)
 {
-  return devolve<types::VolumeCapability>(capabilities);
+  return devolve<CSIVolume::VolumeCapability>(capabilities);
 }
 
 
@@ -146,14 +147,14 @@ RepeatedPtrField<T1> evolve(RepeatedPtrField<T2> from)
 
 
 VolumeCapability::BlockVolume evolve(
-    const types::VolumeCapability::BlockVolume& block)
+    const CSIVolume::VolumeCapability::BlockVolume& block)
 {
   return VolumeCapability::BlockVolume();
 }
 
 
 VolumeCapability::MountVolume evolve(
-    const types::VolumeCapability::MountVolume& mount)
+    const CSIVolume::VolumeCapability::MountVolume& mount)
 {
   VolumeCapability::MountVolume result;
   result.set_fs_type(mount.fs_type());
@@ -163,62 +164,55 @@ VolumeCapability::MountVolume evolve(
 
 
 VolumeCapability::AccessMode evolve(
-    const types::VolumeCapability::AccessMode& accessMode)
+    const CSIVolume::VolumeCapability::AccessMode& accessMode)
 {
   VolumeCapability::AccessMode result;
 
   switch (accessMode.mode()) {
-    case types::VolumeCapability::AccessMode::UNKNOWN: {
+    case CSIVolume::VolumeCapability::AccessMode::UNKNOWN: {
       result.set_mode(VolumeCapability::AccessMode::UNKNOWN);
       break;
     }
-    case types::VolumeCapability::AccessMode::SINGLE_NODE_WRITER: {
+    case CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_WRITER: {
       result.set_mode(VolumeCapability::AccessMode::SINGLE_NODE_WRITER);
       break;
     }
-    case types::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY: {
+    case CSIVolume::VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY: {
       result.set_mode(VolumeCapability::AccessMode::SINGLE_NODE_READER_ONLY);
       break;
     }
-    case types::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY: {
+    case CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY: {
       result.set_mode(VolumeCapability::AccessMode::MULTI_NODE_READER_ONLY);
       break;
     }
-    case types::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER: {
+    case CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER: {
       result.set_mode(VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER);
       break;
     }
-    case types::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER: {
+    case CSIVolume::VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER: {
       result.set_mode(VolumeCapability::AccessMode::MULTI_NODE_MULTI_WRITER);
       break;
     }
-    // NOTE: We avoid using a default clause for the following values in
-    // proto3's open enum to enable the compiler to detect missing enum cases
-    // for us. See: https://github.com/google/protobuf/issues/3917
-    case google::protobuf::kint32min:
-    case google::protobuf::kint32max: {
-      UNREACHABLE();
-    }
   }
 
   return result;
 }
 
 
-VolumeCapability evolve(const types::VolumeCapability& capability)
+VolumeCapability evolve(const CSIVolume::VolumeCapability& capability)
 {
   VolumeCapability result;
 
   switch (capability.access_type_case()) {
-    case types::VolumeCapability::kBlock: {
+    case CSIVolume::VolumeCapability::kBlock: {
       *result.mutable_block() = evolve(capability.block());
       break;
     }
-    case types::VolumeCapability::kMount: {
+    case CSIVolume::VolumeCapability::kMount: {
       *result.mutable_mount() = evolve(capability.mount());
       break;
     }
-    case types::VolumeCapability::ACCESS_TYPE_NOT_SET: {
+    case CSIVolume::VolumeCapability::ACCESS_TYPE_NOT_SET: {
       break;
     }
   }
@@ -232,7 +226,7 @@ VolumeCapability evolve(const types::VolumeCapability& capability)
 
 
 RepeatedPtrField<VolumeCapability> devolve(
-    const RepeatedPtrField<types::VolumeCapability>& capabilities)
+    const RepeatedPtrField<CSIVolume::VolumeCapability>& capabilities)
 {
   return evolve<VolumeCapability>(capabilities);
 }
diff --git a/src/csi/v1_utils.hpp b/src/csi/v1_utils.hpp
index 11a64d7..ca774d8 100644
--- a/src/csi/v1_utils.hpp
+++ b/src/csi/v1_utils.hpp
@@ -19,7 +19,8 @@
 
 #include <google/protobuf/message.h>
 
-#include <mesos/csi/types.hpp>
+#include <mesos/mesos.hpp>
+
 #include <mesos/csi/v1.hpp>
 
 #include <stout/foreach.hpp>
@@ -29,6 +30,9 @@ namespace mesos {
 namespace csi {
 namespace v1 {
 
+using CSIVolume = Volume::Source::CSIVolume;
+
+
 struct PluginCapabilities
 {
   PluginCapabilities() = default;
@@ -198,17 +202,17 @@ struct NodeCapabilities
 
 
 // Helpers to devolve CSI v1 protobufs to their unversioned counterparts.
-types::VolumeCapability devolve(const VolumeCapability& capability);
+CSIVolume::VolumeCapability devolve(const VolumeCapability& capability);
 
-google::protobuf::RepeatedPtrField<types::VolumeCapability> devolve(
+google::protobuf::RepeatedPtrField<CSIVolume::VolumeCapability> devolve(
     const google::protobuf::RepeatedPtrField<VolumeCapability>& capabilities);
 
 
 // Helpers to evolve unversioned CSI protobufs to their v1 counterparts.
-VolumeCapability evolve(const types::VolumeCapability& capability);
+VolumeCapability evolve(const CSIVolume::VolumeCapability& capability);
 
 google::protobuf::RepeatedPtrField<VolumeCapability> evolve(
-    const google::protobuf::RepeatedPtrField<types::VolumeCapability>&
+    const google::protobuf::RepeatedPtrField<CSIVolume::VolumeCapability>&
       capabilities);
 
 } // namespace v1 {
diff --git a/src/csi/v1_volume_manager.cpp b/src/csi/v1_volume_manager.cpp
index 9e44947..a9b80d0 100644
--- a/src/csi/v1_volume_manager.cpp
+++ b/src/csi/v1_volume_manager.cpp
@@ -260,7 +260,7 @@ Future<vector<VolumeInfo>> VolumeManagerProcess::listVolumes()
 
 
 Future<Bytes> VolumeManagerProcess::getCapacity(
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   if (!controllerCapabilities->getCapacity) {
@@ -281,7 +281,7 @@ Future<Bytes> VolumeManagerProcess::getCapacity(
 Future<VolumeInfo> VolumeManagerProcess::createVolume(
     const string& name,
     const Bytes& capacity,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   if (!controllerCapabilities->createDeleteVolume) {
@@ -331,7 +331,7 @@ Future<VolumeInfo> VolumeManagerProcess::createVolume(
 
 Future<Option<Error>> VolumeManagerProcess::validateVolume(
     const VolumeInfo& volumeInfo,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   // If the volume has been checkpointed, the validation succeeds only if the
@@ -1263,7 +1263,7 @@ Future<vector<VolumeInfo>> VolumeManager::listVolumes()
 
 
 Future<Bytes> VolumeManager::getCapacity(
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   return recovered
@@ -1278,7 +1278,7 @@ Future<Bytes> VolumeManager::getCapacity(
 Future<VolumeInfo> VolumeManager::createVolume(
     const string& name,
     const Bytes& capacity,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   return recovered
@@ -1294,7 +1294,7 @@ Future<VolumeInfo> VolumeManager::createVolume(
 
 Future<Option<Error>> VolumeManager::validateVolume(
     const VolumeInfo& volumeInfo,
-    const types::VolumeCapability& capability,
+    const CSIVolume::VolumeCapability& capability,
     const Map<string, string>& parameters)
 {
   return recovered
diff --git a/src/csi/v1_volume_manager.hpp b/src/csi/v1_volume_manager.hpp
index ba984a9..4db11b5 100644
--- a/src/csi/v1_volume_manager.hpp
+++ b/src/csi/v1_volume_manager.hpp
@@ -24,8 +24,6 @@
 
 #include <mesos/mesos.hpp>
 
-#include <mesos/csi/types.hpp>
-
 #include <process/future.hpp>
 #include <process/grpc.hpp>
 #include <process/http.hpp>
@@ -74,20 +72,20 @@ public:
   process::Future<std::vector<VolumeInfo>> listVolumes() override;
 
   process::Future<Bytes> getCapacity(
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters)
     override;
 
   process::Future<VolumeInfo> createVolume(
       const std::string& name,
       const Bytes& capacity,
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters)
     override;
 
   process::Future<Option<Error>> validateVolume(
       const VolumeInfo& volumeInfo,
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters)
     override;
 
diff --git a/src/csi/v1_volume_manager_process.hpp b/src/csi/v1_volume_manager_process.hpp
index a03e291..df52c3d 100644
--- a/src/csi/v1_volume_manager_process.hpp
+++ b/src/csi/v1_volume_manager_process.hpp
@@ -24,8 +24,6 @@
 
 #include <mesos/mesos.hpp>
 
-#include <mesos/csi/types.hpp>
-
 #include <process/future.hpp>
 #include <process/grpc.hpp>
 #include <process/http.hpp>
@@ -71,18 +69,18 @@ public:
   process::Future<std::vector<VolumeInfo>> listVolumes();
 
   process::Future<Bytes> getCapacity(
-      const types::VolumeCapability& capability,
+      const CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters);
 
   process::Future<VolumeInfo> createVolume(
       const std::string& name,
       const Bytes& capacity,
-      const types::VolumeCapability& capability,
+      const CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters);
 
   process::Future<Option<Error>> validateVolume(
       const VolumeInfo& volumeInfo,
-      const types::VolumeCapability& capability,
+      const CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters);
 
   process::Future<bool> deleteVolume(const std::string& volumeId);
diff --git a/src/csi/volume_manager.hpp b/src/csi/volume_manager.hpp
index 0aa6337..199cf44 100644
--- a/src/csi/volume_manager.hpp
+++ b/src/csi/volume_manager.hpp
@@ -24,8 +24,6 @@
 
 #include <mesos/mesos.hpp>
 
-#include <mesos/csi/types.hpp>
-
 #include <process/future.hpp>
 #include <process/grpc.hpp>
 #include <process/http.hpp>
@@ -77,7 +75,7 @@ public:
   // given capability and parameters. Returns zero bytes if `GET_CAPACITY`
   // controller capability is not supported.
   virtual process::Future<Bytes> getCapacity(
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters) = 0;
 
   // The following methods are used to manage volume lifecycles. The lifecycle
@@ -104,7 +102,7 @@ public:
   virtual process::Future<VolumeInfo> createVolume(
       const std::string& name,
       const Bytes& capacity,
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters) = 0;
 
   // Validates a volume against the given capability and parameters. Once
@@ -112,7 +110,7 @@ public:
   // untracked then returns None. Otherwise returns the validation error.
   virtual process::Future<Option<Error>> validateVolume(
       const VolumeInfo& volumeInfo,
-      const types::VolumeCapability& capability,
+      const Volume::Source::CSIVolume::VolumeCapability& capability,
       const google::protobuf::Map<std::string, std::string>& parameters) = 0;
 
   // Deprovisions a volume and returns true if `CREATE_DELETE_VOLUME` controller
diff --git a/src/examples/test_csi_plugin.cpp b/src/examples/test_csi_plugin.cpp
index 6202173..214a3ee 100644
--- a/src/examples/test_csi_plugin.cpp
+++ b/src/examples/test_csi_plugin.cpp
@@ -31,7 +31,6 @@
 
 #include <mesos/type_utils.hpp>
 
-#include <mesos/csi/types.hpp>
 #include <mesos/csi/v0.hpp>
 #include <mesos/csi/v1.hpp>
 
@@ -99,10 +98,11 @@ using grpc::WriteOptions;
 
 using mesos::csi::VolumeInfo;
 
-using mesos::csi::types::VolumeCapability;
-
 using process::grpc::StatusError;
 
+using VolumeCapability = mesos::Volume::Source::CSIVolume::VolumeCapability;
+
+
 constexpr char PLUGIN_NAME[] = "org.apache.mesos.csi.test";
 constexpr char NODE_ID[] = "localhost";
 constexpr Bytes DEFAULT_VOLUME_CAPACITY = Megabytes(64);
diff --git a/src/resource_provider/state.proto b/src/resource_provider/state.proto
index e19d609..4192c0d 100644
--- a/src/resource_provider/state.proto
+++ b/src/resource_provider/state.proto
@@ -18,8 +18,6 @@ syntax = "proto2";
 
 import "mesos/mesos.proto";
 
-import "mesos/csi/types.proto";
-
 package mesos.resource_provider;
 
 option java_package = "org.apache.mesos.resource_provider";
@@ -38,7 +36,7 @@ message ResourceProviderState {
     // Describes a manifest of CSI properties associated with a profile.
     // See DiskProfileAdaptor::ProfileInfo.
     message ProfileInfo {
-      required csi.types.VolumeCapability capability = 1;
+      required Volume.Source.CSIVolume.VolumeCapability capability = 1;
       map<string, string> parameters = 2;
     }
 
diff --git a/src/tests/csi_utils_tests.cpp b/src/tests/csi_utils_tests.cpp
index 5ebd0e1..0457d8c 100644
--- a/src/tests/csi_utils_tests.cpp
+++ b/src/tests/csi_utils_tests.cpp
@@ -21,7 +21,6 @@
 
 #include <gtest/gtest.h>
 
-#include <mesos/csi/types.hpp>
 #include <mesos/csi/v0.hpp>
 #include <mesos/csi/v1.hpp>
 
diff --git a/src/tests/disk_profile_adaptor_tests.cpp b/src/tests/disk_profile_adaptor_tests.cpp
index 2809847..cafbb76 100644
--- a/src/tests/disk_profile_adaptor_tests.cpp
+++ b/src/tests/disk_profile_adaptor_tests.cpp
@@ -19,7 +19,6 @@
 #include <tuple>
 #include <vector>
 
-#include <mesos/csi/types.hpp>
 #include <mesos/csi/v0.hpp>
 
 #include <mesos/module/disk_profile_adaptor.hpp>
@@ -71,6 +70,9 @@ namespace mesos {
 namespace internal {
 namespace tests {
 
+using VolumeCapability = mesos::Volume::Source::CSIVolume::VolumeCapability;
+
+
 constexpr char URI_DISK_PROFILE_ADAPTOR_NAME[] =
   "org_apache_mesos_UriDiskProfileAdaptor";
 
@@ -486,7 +488,7 @@ TEST_F(UriDiskProfileAdaptorTest, FetchFromFile)
   AWAIT_ASSERT_READY(mapping);
   ASSERT_TRUE(mapping->capability.has_block());
   ASSERT_EQ(
-      csi::types::VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER,
+      VolumeCapability::AccessMode::MULTI_NODE_SINGLE_WRITER,
       mapping->capability.access_mode().mode());
 
   Clock::resume();