TensorFlow Serving C++ API Documentation
get_model_status_impl.cc
1 /* Copyright 2018 Google Inc. All Rights Reserved.
2 
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6 
7  http://www.apache.org/licenses/LICENSE-2.0
8 
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ==============================================================================*/
15 
16 #include "tensorflow_serving/model_servers/get_model_status_impl.h"
17 
18 #include <string>
19 
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"
25 
26 namespace tensorflow {
27 namespace serving {
28 
29 namespace {
30 
31 // Converts ManagerState to enum State in GetModelStatusResponse.
32 ModelVersionStatus_State ManagerStateToStateProtoEnum(
33  const ServableState::ManagerState& manager_state) {
34  switch (manager_state) {
35  case ServableState::ManagerState::kStart: {
36  return ModelVersionStatus_State_START;
37  }
38  case ServableState::ManagerState::kLoading: {
39  return ModelVersionStatus_State_LOADING;
40  }
41  case ServableState::ManagerState::kAvailable: {
42  return ModelVersionStatus_State_AVAILABLE;
43  }
44  case ServableState::ManagerState::kUnloading: {
45  return ModelVersionStatus_State_UNLOADING;
46  }
47  case ServableState::ManagerState::kEnd: {
48  return ModelVersionStatus_State_END;
49  }
50  }
51 }
52 
53 // Adds ModelVersionStatus to GetModelStatusResponse
54 void AddModelVersionStatusToResponse(GetModelStatusResponse* response,
55  const int64& version,
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);
62 }
63 
64 } // namespace
65 
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");
71  }
72  return GetModelStatusWithModelSpec(core, request.model_spec(), request,
73  response);
74 }
75 
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();
81 
82  if (model_spec.has_version()) {
83  // Only gets status for specified version of specified model.
84  const int64_t version = model_spec.version().value();
85  const ServableId id = {model_name, version};
86  const absl::optional<ServableState> opt_servable_state =
87  monitor.GetState(id);
88  if (!opt_servable_state) {
89  return tensorflow::errors::NotFound("Could not find version ", version,
90  " of model ", model_name);
91  }
92  AddModelVersionStatusToResponse(response, version,
93  opt_servable_state.value());
94  } else {
95  // Gets status for all versions of specified model.
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);
101  }
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);
106  }
107  }
108  return absl::OkStatus();
109 }
110 
111 } // namespace serving
112 } // namespace tensorflow