Apache Mesos
protobuf_utils.hpp
Go to the documentation of this file.
1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements. See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership. The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License. You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 
17 #ifndef __PROTOBUF_UTILS_HPP__
18 #define __PROTOBUF_UTILS_HPP__
19 
20 #include <initializer_list>
21 #include <ostream>
22 #include <set>
23 #include <string>
24 
25 #include <sys/stat.h>
26 
27 #include <mesos/mesos.hpp>
28 
30 
31 #include <mesos/master/master.hpp>
32 
33 #include <mesos/slave/isolator.hpp>
34 
35 #include <process/time.hpp>
36 
37 #include <stout/duration.hpp>
38 #include <stout/ip.hpp>
39 #include <stout/none.hpp>
40 #include <stout/option.hpp>
41 #include <stout/try.hpp>
42 #include <stout/uuid.hpp>
43 
44 #include "messages/messages.hpp"
45 
46 // Forward declaration (in lieu of an include).
47 namespace process {
48 struct UPID;
49 }
50 
51 namespace mesos {
52 
53 class AuthorizationAcceptor;
54 
55 namespace internal {
56 
57 namespace master {
58 // Forward declaration (in lieu of an include).
59 struct Framework;
60 struct Slave;
61 } // namespace master {
62 
63 namespace protobuf {
64 
66  const FrameworkInfo& framework,
68 
69 
70 // Returns whether the task state is terminal. Terminal states
71 // mean that the resources are released and the task cannot
72 // transition back to a non-terminal state. Note that
73 // `TASK_UNREACHABLE` is not a terminal state, but still
74 // releases the resources.
75 bool isTerminalState(const TaskState& state);
76 
77 
78 // See TaskStatus for more information about these fields. Note
79 // that the 'uuid' must be provided for updates that need
80 // acknowledgement. Currently, all slave and executor generated
81 // updates require acknowledgement, whereas master generated
82 // and scheduler driver generated updates do not.
83 StatusUpdate createStatusUpdate(
84  const FrameworkID& frameworkId,
85  const Option<SlaveID>& slaveId,
86  const TaskID& taskId,
87  const TaskState& state,
88  const TaskStatus::Source& source,
89  const Option<id::UUID>& uuid,
90  const std::string& message = "",
91  const Option<TaskStatus::Reason>& reason = None(),
92  const Option<ExecutorID>& executorId = None(),
93  const Option<bool>& healthy = None(),
94  const Option<CheckStatusInfo>& checkStatus = None(),
95  const Option<Labels>& labels = None(),
96  const Option<ContainerStatus>& containerStatus = None(),
97  const Option<TimeInfo>& unreachableTime = None(),
98  const Option<Resources>& limitedResources = None());
99 
100 
101 StatusUpdate createStatusUpdate(
102  const FrameworkID& frameworkId,
103  const TaskStatus& status,
104  const Option<SlaveID>& slaveId);
105 
106 
107 // Helper function that creates a new task status from scratch with
108 // obligatory fields set.
109 TaskStatus createTaskStatus(
110  const TaskID& taskId,
111  const TaskState& state,
112  const id::UUID& uuid,
113  double timestamp);
114 
115 
116 // Helper function that creates a new task status from the given task
117 // status. Specific fields in `status` can be overridden in the new
118 // status by specifying the appropriate argument. Fields `task_id`,
119 // `slave_id`, `executor_id`, cannot be changed; while `timestamp`
120 // and `uuid` cannot be preserved.
121 //
122 // NOTE: A task status update may be used for guaranteed delivery of
123 // some task-related information, e.g., task's health update. In this
124 // case, it is often desirable to preserve specific fields from the
125 // previous status update to avoid shadowing information that was
126 // delivered previously.
127 TaskStatus createTaskStatus(
128  TaskStatus status,
129  const id::UUID& uuid,
130  double timestamp,
131  const Option<TaskState>& state = None(),
132  const Option<std::string>& message = None(),
133  const Option<TaskStatus::Source>& source = None(),
134  const Option<TaskStatus::Reason>& reason = None(),
135  const Option<std::string>& data = None(),
136  const Option<bool>& healthy = None(),
137  const Option<CheckStatusInfo>& checkStatus = None(),
138  const Option<Labels>& labels = None(),
139  const Option<ContainerStatus>& containerStatus = None(),
140  const Option<TimeInfo>& unreachableTime = None());
141 
142 
143 Task createTask(
144  const TaskInfo& task,
145  const TaskState& state,
146  const FrameworkID& frameworkId);
147 
148 
149 Option<bool> getTaskHealth(const Task& task);
150 
151 
153 
154 
156 
157 
158 bool isTerminalState(const OperationState& state);
159 
160 
161 OperationStatus createOperationStatus(
162  const OperationState& state,
163  const Option<OperationID>& operationId = None(),
164  const Option<std::string>& message = None(),
165  const Option<Resources>& convertedResources = None(),
166  const Option<id::UUID>& statusUUID = None());
167 
168 
170  const Offer::Operation& info,
171  const OperationStatus& latestStatus,
172  const Option<FrameworkID>& frameworkId,
173  const Option<SlaveID>& slaveId,
174  const Option<id::UUID>& operationUUID = None());
175 
176 
177 UpdateOperationStatusMessage createUpdateOperationStatusMessage(
178  const id::UUID& operationUUID,
179  const OperationStatus& status,
180  const Option<OperationStatus>& latestStatus = None(),
181  const Option<FrameworkID>& frameworkId = None(),
182  const Option<SlaveID>& slaveId = None());
183 
184 
185 // Helper function that creates a MasterInfo from UPID.
186 MasterInfo createMasterInfo(const process::UPID& pid);
187 
188 
189 Label createLabel(
190  const std::string& key,
191  const Option<std::string>& value = None());
192 
193 
194 // Helper function to convert a protobuf string map to `Labels`.
196  const google::protobuf::Map<std::string, std::string>& map);
197 
198 
199 // Helper function to convert a `Labels` to a protobuf string map.
201  const Labels& labels);
202 
203 
204 // Previously, `Resource` did not contain `AllocationInfo`.
205 // So for backwards compatibility with old schedulers and
206 // tooling, we must allow operations to contain `Resource`s
207 // without an `AllocationInfo`. This allows the master to
208 // inject the offer's `AllocationInfo` into the operation's
209 // resources.
211  Offer::Operation* operation,
212  const Resource::AllocationInfo& allocationInfo);
213 
214 
215 // This strips the Resource::AllocationInfo from all
216 // Resource objects contained within the operation.
217 void stripAllocationInfo(Offer::Operation* operation);
218 
219 
220 bool isSpeculativeOperation(const Offer::Operation& operation);
221 
222 
223 // Helper function to pack a protobuf list of resource versions.
224 google::protobuf::RepeatedPtrField<ResourceVersionUUID> createResourceVersions(
225  const hashmap<Option<ResourceProviderID>, id::UUID>& resourceVersions);
226 
227 
228 // Helper function to unpack a protobuf list of resource versions.
230  const google::protobuf::RepeatedPtrField<ResourceVersionUUID>&
231  resourceVersionUUIDs);
232 
233 
234 // Helper function that fills in a TimeInfo from the current time.
235 TimeInfo getCurrentTime();
236 
237 
238 // Helper function that creates a `FileInfo` from data returned by `stat()`.
239 FileInfo createFileInfo(const std::string& path, const struct stat& s);
240 
241 
242 ContainerID getRootContainerId(const ContainerID& containerId);
243 
244 
246 
247 namespace slave {
248 
249 // TODO(bmahler): Store the repeated field within this so that we
250 // don't drop unknown capabilities.
252 {
253  Capabilities() = default;
254 
255  template <typename Iterable>
256  Capabilities(const Iterable& capabilities)
257  {
258  foreach (const SlaveInfo::Capability& capability, capabilities) {
259  switch (capability.type()) {
261  break;
262  case SlaveInfo::Capability::MULTI_ROLE:
263  multiRole = true;
264  break;
265  case SlaveInfo::Capability::HIERARCHICAL_ROLE:
266  hierarchicalRole = true;
267  break;
268  case SlaveInfo::Capability::RESERVATION_REFINEMENT:
269  reservationRefinement = true;
270  break;
271  case SlaveInfo::Capability::RESOURCE_PROVIDER:
272  resourceProvider = true;
273  break;
274  // If adding another case here be sure to update the
275  // equality operator.
276  }
277  }
278  }
279 
280  // See mesos.proto for the meaning of agent capabilities.
281  bool multiRole = false;
282  bool hierarchicalRole = false;
283  bool reservationRefinement = false;
284  bool resourceProvider = false;
285 
286  google::protobuf::RepeatedPtrField<SlaveInfo::Capability>
288  {
289  google::protobuf::RepeatedPtrField<SlaveInfo::Capability> result;
290  if (multiRole) {
291  result.Add()->set_type(SlaveInfo::Capability::MULTI_ROLE);
292  }
293  if (hierarchicalRole) {
294  result.Add()->set_type(SlaveInfo::Capability::HIERARCHICAL_ROLE);
295  }
296  if (reservationRefinement) {
297  result.Add()->set_type(SlaveInfo::Capability::RESERVATION_REFINEMENT);
298  }
299  if (resourceProvider) {
300  result.Add()->set_type(SlaveInfo::Capability::RESOURCE_PROVIDER);
301  }
302 
303  return result;
304  }
305 };
306 
307 
308 bool operator==(const Capabilities& left, const Capabilities& right);
309 bool operator!=(const Capabilities& left, const Capabilities& right);
310 std::ostream& operator<<(std::ostream& stream, const Capabilities& c);
311 
312 
313 mesos::slave::ContainerLimitation createContainerLimitation(
314  const Resources& resources,
315  const std::string& message,
316  const TaskStatus::Reason& reason);
317 
318 
319 mesos::slave::ContainerState createContainerState(
320  const Option<ExecutorInfo>& executorInfo,
321  const ContainerID& id,
322  pid_t pid,
323  const std::string& directory);
324 
325 } // namespace slave {
326 
327 namespace maintenance {
328 
332 Unavailability createUnavailability(
333  const process::Time& start,
334  const Option<Duration>& duration = None());
335 
336 
340 google::protobuf::RepeatedPtrField<MachineID> createMachineList(
341  std::initializer_list<MachineID> ids);
342 
343 
348 mesos::maintenance::Window createWindow(
349  std::initializer_list<MachineID> ids,
350  const Unavailability& unavailability);
351 
352 
357 mesos::maintenance::Schedule createSchedule(
358  std::initializer_list<mesos::maintenance::Window> windows);
359 
360 } // namespace maintenance {
361 
362 
363 namespace master {
364 
365 // TODO(bmahler): Store the repeated field within this so that we
366 // don't drop unknown capabilities.
368 {
369  Capabilities() = default;
370 
371  template <typename Iterable>
372  Capabilities(const Iterable& capabilities)
373  {
374  foreach (const MasterInfo::Capability& capability, capabilities) {
375  switch (capability.type()) {
377  break;
378  case MasterInfo::Capability::AGENT_UPDATE:
379  agentUpdate = true;
380  break;
381  }
382  }
383  }
384 
385  bool agentUpdate = false;
386 };
387 
388 namespace event {
389 
390 // Helper for creating a `TASK_UPDATED` event from a `Task`, its
391 // latest state according to the agent, and its status corresponding
392 // to the last status update acknowledged from the scheduler.
394  const Task& task,
395  const TaskState& state,
396  const TaskStatus& status);
397 
398 
399 // Helper for creating a `TASK_ADDED` event from a `Task`.
400 mesos::master::Event createTaskAdded(const Task& task);
401 
402 
403 // Helper for creating a 'FRAMEWORK_ADDED' event from a `Framework`.
405  const mesos::internal::master::Framework& framework);
406 
407 
408 // Helper for creating a 'FRAMEWORK_UPDATED' event from a `Framework`.
410  const mesos::internal::master::Framework& framework);
411 
412 
413 // Helper for creating a 'FRAMEWORK_REMOVED' event from a `FrameworkInfo`.
414 mesos::master::Event createFrameworkRemoved(const FrameworkInfo& frameworkInfo);
415 
416 
417 // Helper for creating an `Agent` response.
418 mesos::master::Response::GetAgents::Agent createAgentResponse(
419  const mesos::internal::master::Slave& slave,
420  const Option<process::Owned<AuthorizationAcceptor>>& rolesAcceptor =
421  None());
422 
423 
424 // Helper for creating an `AGENT_ADDED` event from a `Slave`.
426  const mesos::internal::master::Slave& slave);
427 
428 
429 // Helper for creating an `AGENT_REMOVED` event from a `SlaveID`.
430 mesos::master::Event createAgentRemoved(const SlaveID& slaveId);
431 
432 } // namespace event {
433 } // namespace master {
434 
435 namespace framework {
436 
437 // TODO(bmahler): Store the repeated field within this so that we
438 // don't drop unknown capabilities.
440 {
441  Capabilities() = default;
442 
443  template <typename Iterable>
444  Capabilities(const Iterable& capabilities)
445  {
446  foreach (const FrameworkInfo::Capability& capability, capabilities) {
447  switch (capability.type()) {
449  break;
450  case FrameworkInfo::Capability::REVOCABLE_RESOURCES:
451  revocableResources = true;
452  break;
453  case FrameworkInfo::Capability::TASK_KILLING_STATE:
454  taskKillingState = true;
455  break;
456  case FrameworkInfo::Capability::GPU_RESOURCES:
457  gpuResources = true;
458  break;
459  case FrameworkInfo::Capability::SHARED_RESOURCES:
460  sharedResources = true;
461  break;
462  case FrameworkInfo::Capability::PARTITION_AWARE:
463  partitionAware = true;
464  break;
465  case FrameworkInfo::Capability::MULTI_ROLE:
466  multiRole = true;
467  break;
468  case FrameworkInfo::Capability::RESERVATION_REFINEMENT:
469  reservationRefinement = true;
470  break;
471  case FrameworkInfo::Capability::REGION_AWARE:
472  regionAware = true;
473  break;
474  }
475  }
476  }
477 
478  // See mesos.proto for the meaning of these capabilities.
479  bool revocableResources = false;
480  bool taskKillingState = false;
481  bool gpuResources = false;
482  bool sharedResources = false;
483  bool partitionAware = false;
484  bool multiRole = false;
485  bool reservationRefinement = false;
486  bool regionAware = false;
487 };
488 
489 
490 // Helper to get roles from FrameworkInfo based on the
491 // presence of the MULTI_ROLE capability.
492 std::set<std::string> getRoles(const FrameworkInfo& frameworkInfo);
493 
494 } // namespace framework {
495 
496 } // namespace protobuf {
497 } // namespace internal {
498 } // namespace mesos {
499 
500 #endif // __PROTOBUF_UTILS_HPP__
hashmap< Option< ResourceProviderID >, id::UUID > parseResourceVersions(const google::protobuf::RepeatedPtrField< ResourceVersionUUID > &resourceVersionUUIDs)
Capabilities(const Iterable &capabilities)
Definition: protobuf_utils.hpp:372
Try< Resources > getConsumedResources(const Offer::Operation &operation)
Option< bool > getTaskHealth(const Task &task)
bool multiRole
Definition: protobuf_utils.hpp:281
mesos::master::Event createFrameworkAdded(const mesos::internal::master::Framework &framework)
Definition: option.hpp:28
StatusUpdate createStatusUpdate(const FrameworkID &frameworkId, const Option< SlaveID > &slaveId, const TaskID &taskId, const TaskState &state, const TaskStatus::Source &source, const Option< id::UUID > &uuid, const std::string &message="", const Option< TaskStatus::Reason > &reason=None(), const Option< ExecutorID > &executorId=None(), const Option< bool > &healthy=None(), const Option< CheckStatusInfo > &checkStatus=None(), const Option< Labels > &labels=None(), const Option< ContainerStatus > &containerStatus=None(), const Option< TimeInfo > &unreachableTime=None(), const Option< Resources > &limitedResources=None())
void stripAllocationInfo(Offer::Operation *operation)
mesos::master::Response::GetAgents::Agent createAgentResponse(const mesos::internal::master::Slave &slave, const Option< process::Owned< AuthorizationAcceptor >> &rolesAcceptor=None())
bool resourceProvider
Definition: protobuf_utils.hpp:284
bool reservationRefinement
Definition: protobuf_utils.hpp:485
Definition: try.hpp:34
Labels convertStringMapToLabels(const google::protobuf::Map< std::string, std::string > &map)
google::protobuf::RepeatedPtrField< MachineID > createMachineList(std::initializer_list< MachineID > ids)
Helper for constructing a list of MachineID.
bool taskKillingState
Definition: protobuf_utils.hpp:480
void injectAllocationInfo(Offer::Operation *operation, const Resource::AllocationInfo &allocationInfo)
Definition: protobuf_utils.hpp:251
Unavailability createUnavailability(const process::Time &start, const Option< Duration > &duration=None())
Helper for constructing an unavailability from a Time and Duration.
std::set< std::string > getRoles(const FrameworkInfo &frameworkInfo)
Capabilities(const Iterable &capabilities)
Definition: protobuf_utils.hpp:256
Result< ProcessStatus > status(pid_t pid)
Definition: proc.hpp:166
mesos::slave::ContainerState createContainerState(const Option< ExecutorInfo > &executorInfo, const ContainerID &id, pid_t pid, const std::string &directory)
TaskStatus createTaskStatus(const TaskID &taskId, const TaskState &state, const id::UUID &uuid, double timestamp)
Definition: resources.hpp:79
mesos::master::Event createFrameworkUpdated(const mesos::internal::master::Framework &framework)
bool revocableResources
Definition: protobuf_utils.hpp:479
ContainerID getRootContainerId(const ContainerID &containerId)
mesos::maintenance::Schedule createSchedule(std::initializer_list< mesos::maintenance::Window > windows)
Helper for constructing a maintenance Schedule.
Capability
Definition: capabilities.hpp:35
Try< google::protobuf::Map< std::string, std::string > > convertLabelsToStringMap(const Labels &labels)
Operation
Definition: cgroups.hpp:441
mesos::master::Event createAgentAdded(const mesos::internal::master::Slave &slave)
Try< Nothing > start(const std::string &name)
Starts the slice with the given name (via &#39;systemctl start &lt;name&gt;&#39;).
Definition: protobuf_utils.hpp:367
Capabilities(const Iterable &capabilities)
Definition: protobuf_utils.hpp:444
mesos::v1::scheduler::Event Event
Definition: mesos.hpp:2584
bool partitionAware
Definition: protobuf_utils.hpp:483
Definition: hashmap.hpp:38
mesos::master::Event createTaskAdded(const Task &task)
DWORD pid_t
Definition: windows.hpp:187
mesos::slave::ContainerLimitation createContainerLimitation(const Resources &resources, const std::string &message, const TaskStatus::Reason &reason)
FileInfo createFileInfo(const std::string &path, const struct stat &s)
mesos::master::Event createTaskUpdated(const Task &task, const TaskState &state, const TaskStatus &status)
bool isTerminalState(const TaskState &state)
mesos::master::Event createAgentRemoved(const SlaveID &slaveId)
Try< Nothing > unavailability(const Unavailability &unavailability)
An &quot;untyped&quot; PID, used to encapsulate the process ID for lower-layer abstractions (eg...
Definition: pid.hpp:39
Iterable< V > map(F &&f, const Iterable< U, Us...> &input)
Definition: lambda.hpp:45
bool agentUpdate
Definition: protobuf_utils.hpp:385
Operation createOperation(const Offer::Operation &info, const OperationStatus &latestStatus, const Option< FrameworkID > &frameworkId, const Option< SlaveID > &slaveId, const Option< id::UUID > &operationUUID=None())
Option< ContainerStatus > getTaskContainerStatus(const Task &task)
Definition: uuid.hpp:35
Definition: protobuf_utils.hpp:439
Task createTask(const TaskInfo &task, const TaskState &state, const FrameworkID &frameworkId)
const int UNKNOWN
Definition: diagnosis.hpp:39
google::protobuf::RepeatedPtrField< SlaveInfo::Capability > toRepeatedPtrField() const
Definition: protobuf_utils.hpp:287
UpdateOperationStatusMessage createUpdateOperationStatusMessage(const id::UUID &operationUUID, const OperationStatus &status, const Option< OperationStatus > &latestStatus=None(), const Option< FrameworkID > &frameworkId=None(), const Option< SlaveID > &slaveId=None())
Try< hashmap< std::string, uint64_t > > stat(const std::string &hierarchy, const std::string &cgroup, const std::string &file)
Definition: time.hpp:23
bool sharedResources
Definition: protobuf_utils.hpp:482
bool multiRole
Definition: protobuf_utils.hpp:484
bool reservationRefinement
Definition: protobuf_utils.hpp:283
bool operator==(const Capabilities &left, const Capabilities &right)
bool gpuResources
Definition: protobuf_utils.hpp:481
Result< Process > process(pid_t pid)
Definition: freebsd.hpp:30
bool hierarchicalRole
Definition: protobuf_utils.hpp:282
Definition: none.hpp:27
mesos::master::Event createFrameworkRemoved(const FrameworkInfo &frameworkInfo)
Type
Definition: capabilities.hpp:79
Object protobuf(const google::protobuf::Message &message)
Definition: protobuf.hpp:836
Definition: master.hpp:117
mesos::maintenance::Window createWindow(std::initializer_list< MachineID > ids, const Unavailability &unavailability)
Helper for constructing a maintenance Window.
bool frameworkHasCapability(const FrameworkInfo &framework, FrameworkInfo::Capability::Type capability)
bool operator!=(const Capabilities &left, const Capabilities &right)
bool isSpeculativeOperation(const Offer::Operation &operation)
Label createLabel(const std::string &key, const Option< std::string > &value=None())
Definition: owned.hpp:35
Definition: master.hpp:2151
MasterInfo createMasterInfo(const process::UPID &pid)
Option< CheckStatusInfo > getTaskCheckStatus(const Task &task)
std::ostream & operator<<(std::ostream &stream, const Capabilities &c)
OperationStatus createOperationStatus(const OperationState &state, const Option< OperationID > &operationId=None(), const Option< std::string > &message=None(), const Option< Resources > &convertedResources=None(), const Option< id::UUID > &statusUUID=None())
bool regionAware
Definition: protobuf_utils.hpp:486
google::protobuf::RepeatedPtrField< ResourceVersionUUID > createResourceVersions(const hashmap< Option< ResourceProviderID >, id::UUID > &resourceVersions)