// Copyright 2016 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// DO NOT EDIT. THIS IS AUTOMATICALLY GENERATED.
// Run "go generate" to regenerate.
//go:generate go run cbt.go gcpolicy.go -o cbtdoc.go doc

/*
The `cbt` tool is a command-line tool that allows you to interact with Cloud Bigtable.
See the [cbt overview](https://cloud.google.com/bigtable/docs/cbt-overview) to learn how to install the `cbt` tool.

Usage:

	cbt [-<option> <option-argument>] <command> <required-argument> [optional-argument]


The commands are:

    count                     Count rows in a table
    createinstance            Create an instance with an initial cluster
    createcluster             Create a cluster in the configured instance
    createfamily              Create a column family
    createtable               Create a table
    updatecluster             Update a cluster in the configured instance
    deleteinstance            Delete an instance
    deletecluster             Delete a cluster from the configured instance
    deletecolumn              Delete all cells in a column
    deletefamily              Delete a column family
    deleterow                 Delete a row
    deleteallrows             Delete all rows
    deletetable               Delete a table
    doc                       Print godoc-suitable documentation for cbt
    help                      Print help text
    listinstances             List instances in a project
    listclusters              List clusters in an instance
    lookup                    Read from a single row
    ls                        List tables and column families
    mddoc                     Print documentation for cbt in Markdown format
    read                      Read rows
    set                       Set value of a cell (write)
    setgcpolicy               Set the garbage-collection policy (age, versions) for a column family
    waitforreplication        Block until all the completed writes have been replicated to all the clusters
    createtablefromsnapshot   Create a table from a snapshot (snapshots alpha)
    createsnapshot            Create a snapshot from a source table (snapshots alpha)
    listsnapshots             List snapshots in a cluster (snapshots alpha)
    getsnapshot               Get snapshot info (snapshots alpha)
    deletesnapshot            Delete snapshot in a cluster (snapshots alpha)
    version                   Print the current cbt version
    createappprofile          Create app profile for an instance
    getappprofile             Read app profile for an instance
    listappprofile            Lists app profile for an instance
    updateappprofile          Update app profile for an instance
    deleteappprofile          Delete app profile for an instance

The options are:

    -project string
        project ID. If unset uses gcloud configured project
    -instance string
        Cloud Bigtable instance
    -creds string
        Path to the credentials file. If set, uses the application credentials in this file

Example:  cbt -instance=my-instance ls

Use "cbt help \<command>" for more information about a command.


Alpha features are not currently available to most Cloud Bigtable customers. Alpha
features might be changed in backward-incompatible ways and are not recommended
for production use. They are not subject to any SLA or deprecation policy.

Syntax rules for the Bash shell apply to the `cbt` tool. This means, for example,
that you must put quotes around values that contain spaces or operators. It also means that
if a value is arbitrary bytes, you need to prefix it with a dollar sign and use single quotes.

Example:

cbt -project my-project -instance my-instance lookup my-table $'\224\257\312W\365:\205d\333\2471\315\'


For convenience, you can add values for the -project, -instance, -creds, -admin-endpoint and -data-endpoint
options to your ~/.cbtrc file in the following format:


    project = my-project-123
    instance = my-instance
    creds = path-to-account-key.json
    admin-endpoint = hostname:port
    data-endpoint = hostname:port
    auth-token = AJAvW039NO1nDcijk_J6_rFXG_...

All values are optional and can be overridden at the command prompt.




Count rows in a table

Usage:
	cbt count <table-id>




Create an instance with an initial cluster

Usage:
	cbt createinstance <instance-id> <display-name> <cluster-id> <zone> <num-nodes> <storage-type>
	  instance-id      Permanent, unique ID for the instance
	  display-name     Description of the instance
	  cluster-id       Permanent, unique ID for the cluster in the instance
	  zone             The zone in which to create the cluster
	  num-nodes        The number of nodes to create
	  storage-type     SSD or HDD

	    Example: cbt createinstance my-instance "My instance" my-instance-c1 us-central1-b 3 SSD




Create a cluster in the configured instance

Usage:
	cbt createcluster <cluster-id> <zone> <num-nodes> <storage-type>
	  cluster-id       Permanent, unique ID for the cluster in the instance
	  zone             The zone in which to create the cluster
	  num-nodes        The number of nodes to create
	  storage-type     SSD or HDD

	    Example: cbt createcluster my-instance-c2 europe-west1-b 3 SSD




Create a column family

Usage:
	cbt createfamily <table-id> <family>

	    Example: cbt createfamily mobile-time-series stats_summary




Create a table

Usage:
	cbt createtable <table-id> [families=<family>:gcpolicy=<gcpolicy-expression>,...]
	   [splits=<split-row-key-1>,<split-row-key-2>,...]
	  families     Column families and their associated garbage collection (gc) policies.
	               Put gc policies in quotes when they include shell operators && and ||. For gcpolicy,
	               see "setgcpolicy".
	  splits       Row key(s) where the table should initially be split

	    Example: cbt createtable mobile-time-series "families=stats_summary:maxage=10d||maxversions=1,stats_detail:maxage=10d||maxversions=1" splits=tablet,phone




Update a cluster in the configured instance

Usage:
	cbt updatecluster <cluster-id> [num-nodes=<num-nodes>]
	  cluster-id    Permanent, unique ID for the cluster in the instance
	  num-nodes     The new number of nodes

	    Example: cbt updatecluster my-instance-c1 num-nodes=5




Delete an instance

Usage:
	cbt deleteinstance <instance-id>

	    Example: cbt deleteinstance my-instance




Delete a cluster from the configured instance

Usage:
	cbt deletecluster <cluster-id>

	    Example: cbt deletecluster my-instance-c2




Delete all cells in a column

Usage:
	cbt deletecolumn <table-id> <row-key> <family> <column> [app-profile=<app-profile-id>]
	  app-profile=<app-profile-id>        The app profile ID to use for the request

	    Example: cbt deletecolumn mobile-time-series phone#4c410523#20190501 stats_summary os_name




Delete a column family

Usage:
	cbt deletefamily <table-id> <family>

	    Example: cbt deletefamily mobile-time-series stats_summary




Delete a row

Usage:
	cbt deleterow <table-id> <row-key> [app-profile=<app-profile-id>]
	  app-profile=<app-profile-id>        The app profile ID to use for the request

	    Example: cbt deleterow mobile-time-series phone#4c410523#20190501




Delete all rows

Usage:
	cbt deleteallrows <table-id>

	    Example: cbt deleteallrows  mobile-time-series




Delete a table

Usage:
	cbt deletetable <table-id>

	    Example: cbt deletetable mobile-time-series




Print godoc-suitable documentation for cbt

Usage:
	cbt doc




Print help text

Usage:
	cbt help <command>

	    Example: cbt help createtable




List instances in a project

Usage:
	cbt listinstances




List clusters in an instance

Usage:
	cbt listclusters




Read from a single row

Usage:
	cbt lookup <table-id> <row-key> [columns=<family>:<qualifier>,...] [cells-per-column=<n>]  [app-profile=<app profile id>]
	  row-key                             String or raw bytes. Raw bytes must be enclosed in single quotes and have a dollar-sign prefix
	  columns=<family>:<qualifier>,...    Read only these columns, comma-separated
	  cells-per-column=<n>                Read only this number of cells per column
	  app-profile=<app-profile-id>        The app profile ID to use for the request

	 Example: cbt lookup mobile-time-series phone#4c410523#20190501 columns=stats_summary:os_build,os_name cells-per-column=1
	 Example: cbt lookup mobile-time-series $'\x41\x42'




List tables and column families

Usage:
	cbt ls                List tables
	cbt ls <table-id>     List column families in a table

	    Example: cbt ls mobile-time-series




Print documentation for cbt in Markdown format

Usage:
	cbt mddoc




Read rows

Usage:
	cbt read <table-id> [start=<row-key>] [end=<row-key>] [prefix=<row-key-prefix>] [regex=<regex>] [columns=<family>:<qualifier>,...] [count=<n>] [cells-per-column=<n>] [app-profile=<app-profile-id>]
	  start=<row-key>                     Start reading at this row
	  end=<row-row>                       Stop reading before this row
	  prefix=<row-key-prefix>             Read rows with this prefix
	  regex=<regex>                       Read rows with keys matching this regex
	  columns=<family>:<qualifier>,...    Read only these columns, comma-separated
	  count=<n>                           Read only this many rows
	  cells-per-column=<n>                Read only this many cells per column
	  app-profile=<app-profile-id>        The app profile ID to use for the request

	    Examples: (see 'set' examples to create data to read)
	      cbt read mobile-time-series prefix=phone columns=stats_summary:os_build,os_name count=10
	      cbt read mobile-time-series start=phone#4c410523#20190501 end=phone#4c410523#20190601
	      cbt read mobile-time-series regex="phone.*" cells-per-column=1

	   Note: Using a regex without also specifying start, end, prefix, or count results in a full
	   table scan, which can be slow.





Set value of a cell (write)

Usage:
	cbt set <table-id> <row-key> [app-profile=<app-profile-id>] <family>:<column>=<val>[@<timestamp>] ...
	  app-profile=<app profile id>          The app profile ID to use for the request
	  <family>:<column>=<val>[@<timestamp>] may be repeated to set multiple cells.

	    timestamp is an optional integer.
	    If the timestamp cannot be parsed, '@<timestamp>' will be interpreted as part of the value.
	    For most uses, a timestamp is the number of microseconds since 1970-01-01 00:00:00 UTC.

	    Examples:
	      cbt set mobile-time-series phone#4c410523#20190501 stats_summary:connected_cell=1@12345 stats_summary:connected_cell=0@1570041766
	      cbt set mobile-time-series phone#4c410523#20190501 stats_summary:os_build=PQ2A.190405.003 stats_summary:os_name=android




Set the garbage-collection policy (age, versions) for a column family

Usage:
	cbt setgcpolicy <table> <family> ((maxage=<d> | maxversions=<n>) [(and|or) (maxage=<d> | maxversions=<n>),...] | never)
	  maxage=<d>         Maximum timestamp age to preserve. Acceptable units: ms, s, m, h, d
	  maxversions=<n>    Maximum number of versions to preserve
	  Put garbage collection policies in quotes when they include shell operators && and ||.

	    Examples:
	      cbt setgcpolicy mobile-time-series stats_detail maxage=10d
	      cbt setgcpolicy mobile-time-series stats_summary maxage=10d or maxversions=1





Block until all the completed writes have been replicated to all the clusters

Usage:
	cbt waitforreplication <table-id>





Create a table from a snapshot (snapshots alpha)

Usage:
	cbt createtablefromsnapshot <table> <cluster> <snapshot>
	  table        The name of the table to create
	  cluster      The cluster where the snapshot is located
	  snapshot     The snapshot to restore





Create a snapshot from a source table (snapshots alpha)

Usage:
	cbt createsnapshot <cluster> <snapshot> <table> [ttl=<d>]
	  [ttl=<d>]        Lifespan of the snapshot (e.g. "1h", "4d")




List snapshots in a cluster (snapshots alpha)

Usage:
	cbt listsnapshots [<cluster>]




Get snapshot info (snapshots alpha)

Usage:
	cbt getsnapshot <cluster> <snapshot>




Delete snapshot in a cluster (snapshots alpha)

Usage:
	cbt deletesnapshot <cluster> <snapshot>




Print the current cbt version

Usage:
	cbt version




Create app profile for an instance

Usage:
	cbt createappprofile <instance-id> <app-profile-id> <description> (route-any | [ route-to=<cluster-id> : transactional-writes]) [-force]
	  force:  Optional flag to override any warnings causing the command to fail

	    Examples:
	      cbt createappprofile my-instance multi-cluster "Routes to nearest available cluster" route-any
	      cbt createappprofile my-instance single-cluster "Europe routing" route-to=my-instance-c2




Read app profile for an instance

Usage:
	cbt getappprofile <instance-id> <profile-id>




Lists app profile for an instance

Usage:
	cbt listappprofile <instance-id>




Update app profile for an instance

Usage:
	cbt updateappprofile  <instance-id> <profile-id> <description>(route-any | [ route-to=<cluster-id> : transactional-writes]) [-force]
	  force:  Optional flag to override any warnings causing the command to fail

	    Example: cbt updateappprofile my-instance multi-cluster "Use this one." route-any




Delete app profile for an instance

Usage:
	cbt deleteappprofile <instance-id> <profile-id>

	    Example: cbt deleteappprofile my-instance single-cluster




*/
package main
