You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2017/12/14 05:03:18 UTC
[3/7] mesos git commit: Added `--volumes` flag for test CSI plugin to
test pre-existing volumes.
Added `--volumes` flag for test CSI plugin to test pre-existing volumes.
Example: `--volumes "volume1:1GB;volume2:2GB"`.
This patch also changes `--total_capacity` to `--available_capacity` to
follow the latest CSI spec, and fixed a compilation bug with clang 3.9.
Review: https://reviews.apache.org/r/64581/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/dbd45960
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/dbd45960
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/dbd45960
Branch: refs/heads/master
Commit: dbd459606910c404ff4117c0d91098a6810cd012
Parents: 065c74c
Author: Chun-Hung Hsiao <ch...@mesosphere.io>
Authored: Wed Dec 13 18:57:23 2017 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Wed Dec 13 18:57:23 2017 -0800
----------------------------------------------------------------------
src/examples/test_csi_plugin.cpp | 93 ++++++++++++++++----
...agent_resource_provider_config_api_tests.cpp | 2 +-
.../storage_local_resource_provider_tests.cpp | 2 +-
3 files changed, 80 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/dbd45960/src/examples/test_csi_plugin.cpp
----------------------------------------------------------------------
diff --git a/src/examples/test_csi_plugin.cpp b/src/examples/test_csi_plugin.cpp
index 6359db8..742aea9 100644
--- a/src/examples/test_csi_plugin.cpp
+++ b/src/examples/test_csi_plugin.cpp
@@ -49,6 +49,7 @@ using std::max;
using std::min;
using std::string;
using std::unique_ptr;
+using std::vector;
using grpc::InsecureServerCredentials;
using grpc::Server;
@@ -75,14 +76,23 @@ public:
"work_dir",
"Path to the work directory of the plugin.");
- add(&Flags::total_capacity,
- "total_capacity",
- "The total disk capacity managed by the plugin.");
+ add(&Flags::available_capacity,
+ "available_capacity",
+ "The available disk capacity managed by the plugin, in addition\n"
+ "to the pre-existing volumes.");
+
+ add(&Flags::volumes,
+ "volumes",
+ "Creates pre-existing volumes upon start-up. The volumes are\n"
+ "specified as a semicolon-delimited list of name:capacity pairs.\n"
+ "If a volume with the same name already exists, the pair will be\n"
+ "ignored. (Example: 'volume1:1GB;volume2:2GB')");
}
string endpoint;
string work_dir;
- Bytes total_capacity;
+ Bytes available_capacity;
+ Option<string> volumes;
};
@@ -96,13 +106,13 @@ public:
const string& _workDir,
const string& _endpoint,
const csi::Version& _version,
- const Bytes& totalCapacity)
+ const Bytes& _availableCapacity,
+ const hashmap<string, Bytes>& _volumes)
: workDir(_workDir),
endpoint(_endpoint),
- version(_version)
+ version(_version),
+ availableCapacity(_availableCapacity)
{
- availableCapacity = totalCapacity;
-
// TODO(jieyu): Consider not using CHECKs here.
Try<list<string>> paths = os::ls(workDir);
CHECK_SOME(paths);
@@ -112,18 +122,32 @@ public:
CHECK_SOME(volume);
CHECK(!volumes.contains(volume->id));
- CHECK_GE(availableCapacity, volume->size);
-
- availableCapacity -= volume->size;
volumes.put(volume->id, volume.get());
}
+ foreachpair (const string& name, const Bytes& capacity, _volumes) {
+ if (volumes.contains(name)) {
+ continue;
+ }
+
+ Volume volume;
+ volume.id = name;
+ volume.size = capacity;
+
+ const string path = getVolumePath(volume);
+
+ Try<Nothing> mkdir = os::mkdir(path);
+ CHECK_SOME(mkdir);
+
+ volumes.put(volume.id, volume);
+ }
+
ServerBuilder builder;
builder.AddListeningPort(endpoint, InsecureServerCredentials());
builder.RegisterService(static_cast<csi::Identity::Service*>(this));
builder.RegisterService(static_cast<csi::Controller::Service*>(this));
builder.RegisterService(static_cast<csi::Node::Service*>(this));
- server = std::move(builder.BuildAndStart());
+ server = builder.BuildAndStart();
}
void wait()
@@ -488,9 +512,11 @@ Status TestCSIPlugin::ValidateVolumeCapabilities(
foreach (const csi::VolumeCapability& capability,
request->volume_capabilities()) {
- if (!capability.has_mount()) {
+ if (capability.has_mount() &&
+ (!capability.mount().fs_type().empty() ||
+ !capability.mount().mount_flags().empty())) {
response->set_supported(false);
- response->set_message("Only MountVolume is supported");
+ response->set_message("Only default capability is supported");
return Status::OK;
}
@@ -536,6 +562,7 @@ Status TestCSIPlugin::ListVolumes(
csi::VolumeInfo* info = response->add_entries()->mutable_volume_info();
info->set_id(volume.id);
info->set_capacity_bytes(volume.size.bytes());
+ (*info->mutable_attributes())["path"] = getVolumePath(volume);
}
return Status::OK;
@@ -873,11 +900,47 @@ int main(int argc, char** argv)
version.set_minor(1);
version.set_patch(0);
+ hashmap<string, Bytes> volumes;
+
+ if (flags.volumes.isSome()) {
+ foreach (const string& token, strings::tokenize(flags.volumes.get(), ";")) {
+ vector<string> pair = strings::tokenize(token, ":");
+
+ Option<Error> error;
+
+ if (pair.size() != 2) {
+ error = "Not a name:capacity pair";
+ } else if (pair[0].empty()) {
+ error = "Volume name cannot be empty";
+ } else if (pair[0].find_first_of(os::PATH_SEPARATOR) != string::npos) {
+ error = "Volume name cannot contain '/'";
+ } else if (volumes.contains(pair[0])) {
+ error = "Volume name must be unique";
+ } else {
+ Try<Bytes> capacity = Bytes::parse(pair[1]);
+ if (capacity.isError()) {
+ error = capacity.error();
+ } else if (capacity.get() == 0) {
+ error = "Volume capacity cannot be zero";
+ } else {
+ volumes.put(pair[0], capacity.get());
+ }
+ }
+
+ if (error.isSome()) {
+ cerr << "Failed to parse item '" << token << "' in 'volumes' flag: "
+ << error->message;
+ return EXIT_FAILURE;
+ }
+ }
+ }
+
unique_ptr<TestCSIPlugin> plugin(new TestCSIPlugin(
flags.work_dir,
flags.endpoint,
version,
- flags.total_capacity));
+ flags.available_capacity,
+ volumes));
plugin->wait();
http://git-wip-us.apache.org/repos/asf/mesos/blob/dbd45960/src/tests/agent_resource_provider_config_api_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/agent_resource_provider_config_api_tests.cpp b/src/tests/agent_resource_provider_config_api_tests.cpp
index 5a50e82..3c68b73 100644
--- a/src/tests/agent_resource_provider_config_api_tests.cpp
+++ b/src/tests/agent_resource_provider_config_api_tests.cpp
@@ -103,7 +103,7 @@ public:
"value": "%s",
"arguments": [
"%s",
- "--total_capacity=%s",
+ "--available_capacity=%s",
"--work_dir=%s"
]
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/dbd45960/src/tests/storage_local_resource_provider_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/storage_local_resource_provider_tests.cpp b/src/tests/storage_local_resource_provider_tests.cpp
index f01d533..20f4f76 100644
--- a/src/tests/storage_local_resource_provider_tests.cpp
+++ b/src/tests/storage_local_resource_provider_tests.cpp
@@ -83,7 +83,7 @@ public:
"value": "%s",
"arguments": [
"%s",
- "--total_capacity=4GB",
+ "--available_capacity=4GB",
"--work_dir=%s"
]
}