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  }