16 #include "tensorflow_serving/model_servers/get_model_status_impl.h"
20 #include "absl/types/optional.h"
21 #include "tensorflow_serving/apis/status.pb.h"
22 #include "tensorflow_serving/core/servable_state.h"
23 #include "tensorflow_serving/core/servable_state_monitor.h"
24 #include "tensorflow_serving/util/status_util.h"
26 namespace tensorflow {
32 ModelVersionStatus_State ManagerStateToStateProtoEnum(
33 const ServableState::ManagerState& manager_state) {
34 switch (manager_state) {
35 case ServableState::ManagerState::kStart: {
36 return ModelVersionStatus_State_START;
38 case ServableState::ManagerState::kLoading: {
39 return ModelVersionStatus_State_LOADING;
41 case ServableState::ManagerState::kAvailable: {
42 return ModelVersionStatus_State_AVAILABLE;
44 case ServableState::ManagerState::kUnloading: {
45 return ModelVersionStatus_State_UNLOADING;
47 case ServableState::ManagerState::kEnd: {
48 return ModelVersionStatus_State_END;
54 void AddModelVersionStatusToResponse(GetModelStatusResponse* response,
56 const ServableState& servable_state) {
57 ModelVersionStatus* version_status = response->add_model_version_status();
58 version_status->set_version(version);
59 version_status->set_state(
60 ManagerStateToStateProtoEnum(servable_state.manager_state));
61 *version_status->mutable_status() = ToStatusProto(servable_state.health);
66 Status GetModelStatusImpl::GetModelStatus(ServerCore* core,
67 const GetModelStatusRequest& request,
68 GetModelStatusResponse* response) {
69 if (!request.has_model_spec()) {
70 return tensorflow::errors::InvalidArgument(
"Missing ModelSpec");
72 return GetModelStatusWithModelSpec(core, request.model_spec(), request,
76 Status GetModelStatusImpl::GetModelStatusWithModelSpec(
77 ServerCore* core,
const ModelSpec& model_spec,
78 const GetModelStatusRequest& request, GetModelStatusResponse* response) {
79 const string& model_name = model_spec.name();
80 const ServableStateMonitor& monitor = *core->servable_state_monitor();
82 if (model_spec.has_version()) {
84 const int64_t version = model_spec.version().value();
85 const ServableId
id = {model_name, version};
86 const absl::optional<ServableState> opt_servable_state =
88 if (!opt_servable_state) {
89 return tensorflow::errors::NotFound(
"Could not find version ", version,
90 " of model ", model_name);
92 AddModelVersionStatusToResponse(response, version,
93 opt_servable_state.value());
96 const ServableStateMonitor::VersionMap versions_and_states =
97 monitor.GetVersionStates(model_name);
98 if (versions_and_states.empty()) {
99 return tensorflow::errors::NotFound(
100 "Could not find any versions of model ", model_name);
102 for (
const auto& version_and_state : versions_and_states) {
103 const int64_t version = version_and_state.first;
104 const ServableState& servable_state = version_and_state.second.state;
105 AddModelVersionStatusToResponse(response, version, servable_state);
108 return absl::OkStatus();