vitess.io/vitess@v0.16.2/go/vt/vtadmin/http/tablets.go (about) 1 /* 2 Copyright 2020 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package http 18 19 import ( 20 "context" 21 22 vtadminpb "vitess.io/vitess/go/vt/proto/vtadmin" 23 ) 24 25 // GetFullStatus implements the http wrapper for /tablets/{tablet}/full_status 26 func GetFullStatus(ctx context.Context, r Request, api *API) *JSONResponse { 27 vars := r.Vars() 28 29 alias, err := vars.GetTabletAlias("tablet") 30 if err != nil { 31 return NewJSONResponse(nil, err) 32 } 33 status, err := api.server.GetFullStatus(ctx, &vtadminpb.GetFullStatusRequest{ 34 ClusterId: r.URL.Query()["cluster"][0], 35 Alias: alias, 36 }) 37 38 return NewJSONResponse(status, err) 39 } 40 41 // GetTablets implements the http wrapper for /tablets[?cluster=[&cluster=]]. 42 func GetTablets(ctx context.Context, r Request, api *API) *JSONResponse { 43 tablets, err := api.server.GetTablets(ctx, &vtadminpb.GetTabletsRequest{ 44 ClusterIds: r.URL.Query()["cluster"], 45 }) 46 47 return NewJSONResponse(tablets, err) 48 } 49 50 // GetTablet implements the http wrapper for /tablet/{tablet}[?cluster=[&cluster=]]. 51 func GetTablet(ctx context.Context, r Request, api *API) *JSONResponse { 52 vars := r.Vars() 53 54 alias, err := vars.GetTabletAlias("tablet") 55 if err != nil { 56 return NewJSONResponse(nil, err) 57 } 58 59 tablet, err := api.server.GetTablet(ctx, &vtadminpb.GetTabletRequest{ 60 Alias: alias, 61 ClusterIds: r.URL.Query()["cluster"], 62 }) 63 64 return NewJSONResponse(tablet, err) 65 } 66 67 func DeleteTablet(ctx context.Context, r Request, api *API) *JSONResponse { 68 vars := r.Vars() 69 70 alias, err := vars.GetTabletAlias("tablet") 71 if err != nil { 72 return NewJSONResponse(nil, err) 73 } 74 75 allowPrimary, err := r.ParseQueryParamAsBool("allow_primary", false) 76 if err != nil { 77 return NewJSONResponse(nil, err) 78 } 79 80 deleted, err := api.server.DeleteTablet(ctx, &vtadminpb.DeleteTabletRequest{ 81 Alias: alias, 82 AllowPrimary: allowPrimary, 83 ClusterIds: r.URL.Query()["cluster"], 84 }) 85 86 return NewJSONResponse(deleted, err) 87 } 88 89 // PingTablet checks that the specified tablet is awake and responding to RPCs. This command can be blocked by other in-flight operations. 90 func PingTablet(ctx context.Context, r Request, api *API) *JSONResponse { 91 vars := r.Vars() 92 93 alias, err := vars.GetTabletAlias("tablet") 94 if err != nil { 95 return NewJSONResponse(nil, err) 96 } 97 98 ping, err := api.server.PingTablet(ctx, &vtadminpb.PingTabletRequest{ 99 Alias: alias, 100 ClusterIds: r.URL.Query()["cluster"], 101 }) 102 103 return NewJSONResponse(ping, err) 104 } 105 106 // RefreshState reloads the tablet record on the specified tablet. 107 func RefreshState(ctx context.Context, r Request, api *API) *JSONResponse { 108 vars := r.Vars() 109 110 alias, err := vars.GetTabletAlias("tablet") 111 if err != nil { 112 return NewJSONResponse(nil, err) 113 } 114 115 result, err := api.server.RefreshState(ctx, &vtadminpb.RefreshStateRequest{ 116 Alias: alias, 117 ClusterIds: r.URL.Query()["cluster"], 118 }) 119 120 return NewJSONResponse(result, err) 121 } 122 123 // RefreshTabletReplicationSource implements the http wrapper for 124 // PUT /tablet/{tablet}/refresh_replication_source. 125 // 126 // Query params: 127 // - cluster: repeatable, list of cluster IDs to restrict to when searching fo 128 // a tablet with that alias. 129 // 130 // PUT body is unused; this endpoint takes no additional options. 131 func RefreshTabletReplicationSource(ctx context.Context, r Request, api *API) *JSONResponse { 132 vars := r.Vars() 133 134 alias, err := vars.GetTabletAlias("tablet") 135 if err != nil { 136 return NewJSONResponse(nil, err) 137 } 138 139 result, err := api.server.RefreshTabletReplicationSource(ctx, &vtadminpb.RefreshTabletReplicationSourceRequest{ 140 Alias: alias, 141 ClusterIds: r.URL.Query()["cluster"], 142 }) 143 144 return NewJSONResponse(result, err) 145 } 146 147 // RunHealthCheck runs a healthcheck on the tablet and returns the result. 148 func RunHealthCheck(ctx context.Context, r Request, api *API) *JSONResponse { 149 vars := r.Vars() 150 151 alias, err := vars.GetTabletAlias("tablet") 152 if err != nil { 153 return NewJSONResponse(nil, err) 154 } 155 156 result, err := api.server.RunHealthCheck(ctx, &vtadminpb.RunHealthCheckRequest{ 157 Alias: alias, 158 ClusterIds: r.URL.Query()["cluster"], 159 }) 160 161 return NewJSONResponse(result, err) 162 } 163 164 // SetReadOnly sets the tablet to read only mode 165 func SetReadOnly(ctx context.Context, r Request, api *API) *JSONResponse { 166 vars := r.Vars() 167 168 alias, err := vars.GetTabletAlias("tablet") 169 if err != nil { 170 return NewJSONResponse(nil, err) 171 } 172 173 result, err := api.server.SetReadOnly(ctx, &vtadminpb.SetReadOnlyRequest{ 174 Alias: alias, 175 ClusterIds: r.URL.Query()["cluster"], 176 }) 177 178 return NewJSONResponse(result, err) 179 } 180 181 // SetReadWrite sets the tablet to read write mode 182 func SetReadWrite(ctx context.Context, r Request, api *API) *JSONResponse { 183 vars := r.Vars() 184 185 alias, err := vars.GetTabletAlias("tablet") 186 if err != nil { 187 return NewJSONResponse(nil, err) 188 } 189 190 result, err := api.server.SetReadWrite(ctx, &vtadminpb.SetReadWriteRequest{ 191 Alias: alias, 192 ClusterIds: r.URL.Query()["cluster"], 193 }) 194 195 return NewJSONResponse(result, err) 196 } 197 198 // StartReplication starts replication on the specified tablet. 199 func StartReplication(ctx context.Context, r Request, api *API) *JSONResponse { 200 vars := r.Vars() 201 202 alias, err := vars.GetTabletAlias("tablet") 203 if err != nil { 204 return NewJSONResponse(nil, err) 205 } 206 207 result, err := api.server.StartReplication(ctx, &vtadminpb.StartReplicationRequest{ 208 Alias: alias, 209 ClusterIds: r.URL.Query()["cluster"], 210 }) 211 212 return NewJSONResponse(result, err) 213 } 214 215 // StartReplication stops replication on the specified tablet. 216 func StopReplication(ctx context.Context, r Request, api *API) *JSONResponse { 217 vars := r.Vars() 218 219 alias, err := vars.GetTabletAlias("tablet") 220 if err != nil { 221 return NewJSONResponse(nil, err) 222 } 223 224 result, err := api.server.StopReplication(ctx, &vtadminpb.StopReplicationRequest{ 225 Alias: alias, 226 ClusterIds: r.URL.Query()["cluster"], 227 }) 228 229 return NewJSONResponse(result, err) 230 } 231 232 // TabletExternallyPromoted implements the http wrapper for 233 // POST /tablet/{tablet}/tablet_externally_promoted. 234 // 235 // Query params: 236 // - `cluster`: repeated list of clusterIDs to limit the request to. 237 // 238 // POST body is unused; this endpoint takes no additional options. 239 func TabletExternallyPromoted(ctx context.Context, r Request, api *API) *JSONResponse { 240 vars := r.Vars() 241 242 alias, err := vars.GetTabletAlias("tablet") 243 if err != nil { 244 return NewJSONResponse(nil, err) 245 } 246 247 result, err := api.server.TabletExternallyPromoted(ctx, &vtadminpb.TabletExternallyPromotedRequest{ 248 Alias: alias, 249 ClusterIds: r.URL.Query()["cluster"], 250 }) 251 return NewJSONResponse(result, err) 252 }