| 943 | |
| 944 | |
| 945 | pair<Response, Option<Master::ReadOnlyHandler::PostProcessing>> |
| 946 | Master::ReadOnlyHandler::stateSummary( |
| 947 | ContentType outputContentType, |
| 948 | const hashmap<std::string, std::string>& query, |
| 949 | const process::Owned<ObjectApprovers>& approvers) const |
| 950 | { |
| 951 | CHECK_EQ(outputContentType, ContentType::JSON); |
| 952 | |
| 953 | const Master* master = this->master; |
| 954 | auto stateSummary = [master, &approvers](JSON::ObjectWriter* writer) { |
| 955 | writer->field("hostname", master->info().hostname()); |
| 956 | |
| 957 | if (master->flags.cluster.isSome()) { |
| 958 | writer->field("cluster", master->flags.cluster.get()); |
| 959 | } |
| 960 | |
| 961 | // We use the tasks in the 'Frameworks' struct to compute summaries |
| 962 | // for this endpoint. This is done 1) for consistency between the |
| 963 | // 'slaves' and 'frameworks' subsections below 2) because we want to |
| 964 | // provide summary information for frameworks that are currently |
| 965 | // registered 3) the frameworks keep a circular buffer of completed |
| 966 | // tasks that we can use to keep a limited view on the history of |
| 967 | // recent completed / failed tasks. |
| 968 | |
| 969 | // Generate mappings from 'slave' to 'framework' and reverse. |
| 970 | SlaveFrameworkMapping slaveFrameworkMapping( |
| 971 | master->frameworks.registered); |
| 972 | |
| 973 | // Generate 'TaskState' summaries for all framework and slave ids. |
| 974 | TaskStateSummaries taskStateSummaries( |
| 975 | master->frameworks.registered); |
| 976 | |
| 977 | // Model all of the slaves. |
| 978 | writer->field( |
| 979 | "slaves", |
| 980 | [master, |
| 981 | &slaveFrameworkMapping, |
| 982 | &taskStateSummaries, |
| 983 | &approvers](JSON::ArrayWriter* writer) { |
| 984 | foreachvalue (Slave* slave, master->slaves.registered) { |
| 985 | writer->element( |
| 986 | [&slave, |
| 987 | &master, |
| 988 | &slaveFrameworkMapping, |
| 989 | &taskStateSummaries, |
| 990 | &approvers](JSON::ObjectWriter* writer) { |
| 991 | SlaveWriter slaveWriter( |
| 992 | *slave, |
| 993 | master->slaves.draining.get(slave->id), |
| 994 | master->slaves.deactivated.contains(slave->id), |
| 995 | approvers); |
| 996 | slaveWriter(writer); |
| 997 | |
| 998 | // Add the 'TaskState' summary for this slave. |
| 999 | const TaskStateSummary& summary = |
| 1000 | taskStateSummaries.slave(slave->id); |
| 1001 | |
| 1002 | // Certain per-agent status totals will always be zero |