blob: dafe1df0cb5d0b83ca0579068916fe7fda848f02 [file] [log] [blame]
/**
* 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_TYPE_UTILS_H__
#define __MESOS_TYPE_UTILS_H__
#include <ostream>
#include <boost/functional/hash.hpp>
#include <mesos/mesos.hpp>
#include <mesos/module/module.hpp>
#include <mesos/scheduler/scheduler.hpp>
#include <stout/hashmap.hpp>
#include <stout/stringify.hpp>
#include <stout/uuid.hpp>
// This file includes definitions for operators on public protobuf
// classes (defined in mesos.proto, module.proto, etc.) that don't
// have these operators generated by the protobuf compiler. The
// corresponding definitions are in src/common/type_utils.cpp.
//
// Mesos modules need some of the protobuf classes defined in
// mesos.proto, module.proto, etc., and require some of these
// operators declared in type_utils.hpp. Exposing type_utils.hpp
// allows us to build modules without having a dependency on mesos
// source tree (src/*).
namespace mesos {
bool operator==(const CommandInfo& left, const CommandInfo& right);
bool operator==(const CommandInfo::URI& left, const CommandInfo::URI& right);
bool operator==(const Credential& left, const Credential& right);
bool operator==(const Environment& left, const Environment& right);
bool operator==(const ExecutorInfo& left, const ExecutorInfo& right);
bool operator==(const MasterInfo& left, const MasterInfo& right);
bool operator==(
const ResourceStatistics& left,
const ResourceStatistics& right);
bool operator==(const SlaveInfo& left, const SlaveInfo& right);
bool operator==(const Volume& left, const Volume& right);
bool operator==(const URL& left, const URL& right);
bool operator==(const TaskStatus& left, const TaskStatus& right);
bool operator!=(const TaskStatus& left, const TaskStatus& right);
inline bool operator==(const ContainerID& left, const ContainerID& right)
{
return left.value() == right.value();
}
inline bool operator==(const ExecutorID& left, const ExecutorID& right)
{
return left.value() == right.value();
}
inline bool operator==(const FrameworkID& left, const FrameworkID& right)
{
return left.value() == right.value();
}
inline bool operator==(const FrameworkInfo& left, const FrameworkInfo& right)
{
return (left.name() == right.name()) && (left.user() == right.user());
}
inline bool operator==(const OfferID& left, const OfferID& right)
{
return left.value() == right.value();
}
inline bool operator==(const SlaveID& left, const SlaveID& right)
{
return left.value() == right.value();
}
inline bool operator==(const TaskID& left, const TaskID& right)
{
return left.value() == right.value();
}
inline bool operator==(const ContainerID& left, const std::string& right)
{
return left.value() == right;
}
inline bool operator==(const ExecutorID& left, const std::string& right)
{
return left.value() == right;
}
inline bool operator==(const FrameworkID& left, const std::string& right)
{
return left.value() == right;
}
inline bool operator==(const OfferID& left, const std::string& right)
{
return left.value() == right;
}
inline bool operator==(const SlaveID& left, const std::string& right)
{
return left.value() == right;
}
inline bool operator==(const TaskID& left, const std::string& right)
{
return left.value() == right;
}
inline bool operator!=(const ContainerID& left, const ContainerID& right)
{
return left.value() != right.value();
}
inline bool operator!=(const ExecutorID& left, const ExecutorID& right)
{
return left.value() != right.value();
}
inline bool operator!=(const FrameworkID& left, const FrameworkID& right)
{
return left.value() != right.value();
}
inline bool operator!=(const SlaveID& left, const SlaveID& right)
{
return left.value() != right.value();
}
inline bool operator<(const ContainerID& left, const ContainerID& right)
{
return left.value() < right.value();
}
inline bool operator<(const ExecutorID& left, const ExecutorID& right)
{
return left.value() < right.value();
}
inline bool operator<(const FrameworkID& left, const FrameworkID& right)
{
return left.value() < right.value();
}
inline bool operator<(const OfferID& left, const OfferID& right)
{
return left.value() < right.value();
}
inline bool operator<(const SlaveID& left, const SlaveID& right)
{
return left.value() < right.value();
}
inline bool operator<(const TaskID& left, const TaskID& right)
{
return left.value() < right.value();
}
inline std::size_t hash_value(const CommandInfo::URI& uri)
{
size_t seed = 0;
if (uri.extract()) {
seed += 11;
}
if (uri.executable()) {
seed += 2003;
}
boost::hash_combine(seed, uri.value());
return seed;
}
inline std::size_t hash_value(const ContainerID& containerId)
{
size_t seed = 0;
boost::hash_combine(seed, containerId.value());
return seed;
}
inline std::size_t hash_value(const ExecutorID& executorId)
{
size_t seed = 0;
boost::hash_combine(seed, executorId.value());
return seed;
}
inline std::size_t hash_value(const FrameworkID& frameworkId)
{
size_t seed = 0;
boost::hash_combine(seed, frameworkId.value());
return seed;
}
inline std::size_t hash_value(const OfferID& offerId)
{
size_t seed = 0;
boost::hash_combine(seed, offerId.value());
return seed;
}
inline std::size_t hash_value(const SlaveID& slaveId)
{
size_t seed = 0;
boost::hash_combine(seed, slaveId.value());
return seed;
}
inline std::size_t hash_value(const TaskID& taskId)
{
size_t seed = 0;
boost::hash_combine(seed, taskId.value());
return seed;
}
inline std::ostream& operator<<(
std::ostream& stream,
const ContainerID& containerId)
{
return stream << containerId.value();
}
inline std::ostream& operator<<(
std::ostream& stream,
const ContainerInfo& containerInfo)
{
return stream << containerInfo.DebugString();
}
inline std::ostream& operator<<(
std::ostream& stream,
const ExecutorID& executorId)
{
return stream << executorId.value();
}
inline std::ostream& operator<<(
std::ostream& stream,
const ExecutorInfo& executor)
{
return stream << executor.DebugString();
}
inline std::ostream& operator<<(
std::ostream& stream,
const FrameworkID& frameworkId)
{
return stream << frameworkId.value();
}
inline std::ostream& operator<<(std::ostream& stream, const MasterInfo& master)
{
return stream << master.DebugString();
}
inline std::ostream& operator<<(std::ostream& stream, const OfferID& offerId)
{
return stream << offerId.value();
}
inline std::ostream& operator<<(std::ostream& stream, const RateLimits& limits)
{
return stream << limits.DebugString();
}
inline std::ostream& operator<<(std::ostream& stream, const SlaveID& slaveId)
{
return stream << slaveId.value();
}
inline std::ostream& operator<<(std::ostream& stream, const SlaveInfo& slave)
{
return stream << slave.DebugString();
}
inline std::ostream& operator<<(std::ostream& stream, const TaskID& taskId)
{
return stream << taskId.value();
}
inline std::ostream& operator<<(std::ostream& stream, const TaskInfo& task)
{
return stream << task.DebugString();
}
inline std::ostream& operator<<(std::ostream& stream, const TaskState& state)
{
return stream << TaskState_Name(state);
}
inline std::ostream& operator<<(std::ostream& stream,
const scheduler::Call::Type& type)
{
return stream << scheduler::Call_Type_Name(type);
}
inline std::ostream& operator<<(
std::ostream& stream,
const scheduler::Event::Type& type)
{
return stream << scheduler::Event_Type_Name(type);
}
inline std::ostream& operator<<(
std::ostream& stream,
const std::vector<TaskID>& taskIds)
{
stream << "[ ";
for (auto it = taskIds.begin(); it != taskIds.end(); ++it) {
if (it != taskIds.begin()) {
stream << ", ";
}
stream << *it;
}
stream << " ]";
return stream;
}
inline std::ostream& operator<<(
std::ostream& stream,
const FrameworkInfo::Capability& capability)
{
return stream << FrameworkInfo::Capability::Type_Name(capability.type());
}
template <typename T>
inline std::ostream& operator<<(
std::ostream& stream,
const google::protobuf::RepeatedPtrField<T>& messages)
{
stream << "[ ";
for (auto it = messages.begin(); it != messages.end(); ++it) {
if (it != messages.begin()) {
stream << ", ";
}
stream << *it;
}
stream << " ]";
return stream;
}
inline std::ostream& operator<<(std::ostream& stream, const Modules& modules)
{
return stream << modules.DebugString();
}
inline std::ostream& operator<<(
std::ostream& stream,
const hashmap<std::string, std::string>& map)
{
stream << stringify(map);
return stream;
}
} // namespace mesos {
#endif // __MESOS_TYPE_UTILS_H__