spanner_instance_admin.proto 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. // Copyright 2022 Google LLC
  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. syntax = "proto3";
  15. package google.spanner.admin.instance.v1;
  16. import "google/api/annotations.proto";
  17. import "google/api/client.proto";
  18. import "google/api/field_behavior.proto";
  19. import "google/api/resource.proto";
  20. import "google/iam/v1/iam_policy.proto";
  21. import "google/iam/v1/policy.proto";
  22. import "google/longrunning/operations.proto";
  23. import "google/protobuf/empty.proto";
  24. import "google/protobuf/field_mask.proto";
  25. import "google/protobuf/timestamp.proto";
  26. import "google/spanner/admin/instance/v1/common.proto";
  27. option csharp_namespace = "Google.Cloud.Spanner.Admin.Instance.V1";
  28. option go_package = "google.golang.org/genproto/googleapis/spanner/admin/instance/v1;instance";
  29. option java_multiple_files = true;
  30. option java_outer_classname = "SpannerInstanceAdminProto";
  31. option java_package = "com.google.spanner.admin.instance.v1";
  32. option php_namespace = "Google\\Cloud\\Spanner\\Admin\\Instance\\V1";
  33. option ruby_package = "Google::Cloud::Spanner::Admin::Instance::V1";
  34. // Cloud Spanner Instance Admin API
  35. //
  36. // The Cloud Spanner Instance Admin API can be used to create, delete,
  37. // modify and list instances. Instances are dedicated Cloud Spanner serving
  38. // and storage resources to be used by Cloud Spanner databases.
  39. //
  40. // Each instance has a "configuration", which dictates where the
  41. // serving resources for the Cloud Spanner instance are located (e.g.,
  42. // US-central, Europe). Configurations are created by Google based on
  43. // resource availability.
  44. //
  45. // Cloud Spanner billing is based on the instances that exist and their
  46. // sizes. After an instance exists, there are no additional
  47. // per-database or per-operation charges for use of the instance
  48. // (though there may be additional network bandwidth charges).
  49. // Instances offer isolation: problems with databases in one instance
  50. // will not affect other instances. However, within an instance
  51. // databases can affect each other. For example, if one database in an
  52. // instance receives a lot of requests and consumes most of the
  53. // instance resources, fewer resources are available for other
  54. // databases in that instance, and their performance may suffer.
  55. service InstanceAdmin {
  56. option (google.api.default_host) = "spanner.googleapis.com";
  57. option (google.api.oauth_scopes) =
  58. "https://www.googleapis.com/auth/cloud-platform,"
  59. "https://www.googleapis.com/auth/spanner.admin";
  60. // Lists the supported instance configurations for a given project.
  61. rpc ListInstanceConfigs(ListInstanceConfigsRequest)
  62. returns (ListInstanceConfigsResponse) {
  63. option (google.api.http) = {
  64. get: "/v1/{parent=projects/*}/instanceConfigs"
  65. };
  66. option (google.api.method_signature) = "parent";
  67. }
  68. // Gets information about a particular instance configuration.
  69. rpc GetInstanceConfig(GetInstanceConfigRequest) returns (InstanceConfig) {
  70. option (google.api.http) = {
  71. get: "/v1/{name=projects/*/instanceConfigs/*}"
  72. };
  73. option (google.api.method_signature) = "name";
  74. }
  75. // Creates an instance config and begins preparing it to be used. The
  76. // returned [long-running operation][google.longrunning.Operation]
  77. // can be used to track the progress of preparing the new
  78. // instance config. The instance config name is assigned by the caller. If the
  79. // named instance config already exists, `CreateInstanceConfig` returns
  80. // `ALREADY_EXISTS`.
  81. //
  82. // Immediately after the request returns:
  83. //
  84. // * The instance config is readable via the API, with all requested
  85. // attributes. The instance config's
  86. // [reconciling][google.spanner.admin.instance.v1.InstanceConfig.reconciling]
  87. // field is set to true. Its state is `CREATING`.
  88. //
  89. // While the operation is pending:
  90. //
  91. // * Cancelling the operation renders the instance config immediately
  92. // unreadable via the API.
  93. // * Except for deleting the creating resource, all other attempts to modify
  94. // the instance config are rejected.
  95. //
  96. // Upon completion of the returned operation:
  97. //
  98. // * Instances can be created using the instance configuration.
  99. // * The instance config's
  100. // [reconciling][google.spanner.admin.instance.v1.InstanceConfig.reconciling]
  101. // field becomes false. Its state becomes `READY`.
  102. //
  103. // The returned [long-running operation][google.longrunning.Operation] will
  104. // have a name of the format
  105. // `<instance_config_name>/operations/<operation_id>` and can be used to track
  106. // creation of the instance config. The
  107. // [metadata][google.longrunning.Operation.metadata] field type is
  108. // [CreateInstanceConfigMetadata][google.spanner.admin.instance.v1.CreateInstanceConfigMetadata].
  109. // The [response][google.longrunning.Operation.response] field type is
  110. // [InstanceConfig][google.spanner.admin.instance.v1.InstanceConfig], if
  111. // successful.
  112. //
  113. // Authorization requires `spanner.instanceConfigs.create` permission on
  114. // the resource
  115. // [parent][google.spanner.admin.instance.v1.CreateInstanceConfigRequest.parent].
  116. rpc CreateInstanceConfig(CreateInstanceConfigRequest)
  117. returns (google.longrunning.Operation) {
  118. option (google.api.http) = {
  119. post: "/v1/{parent=projects/*}/instanceConfigs"
  120. body: "*"
  121. };
  122. option (google.api.method_signature) =
  123. "parent,instance_config,instance_config_id";
  124. option (google.longrunning.operation_info) = {
  125. response_type: "google.spanner.admin.instance.v1.InstanceConfig"
  126. metadata_type: "google.spanner.admin.instance.v1.CreateInstanceConfigMetadata"
  127. };
  128. }
  129. // Updates an instance config. The returned
  130. // [long-running operation][google.longrunning.Operation] can be used to track
  131. // the progress of updating the instance. If the named instance config does
  132. // not exist, returns `NOT_FOUND`.
  133. //
  134. // Only user managed configurations can be updated.
  135. //
  136. // Immediately after the request returns:
  137. //
  138. // * The instance config's
  139. // [reconciling][google.spanner.admin.instance.v1.InstanceConfig.reconciling]
  140. // field is set to true.
  141. //
  142. // While the operation is pending:
  143. //
  144. // * Cancelling the operation sets its metadata's
  145. // [cancel_time][google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata.cancel_time].
  146. // The operation is guaranteed to succeed at undoing all changes, after
  147. // which point it terminates with a `CANCELLED` status.
  148. // * All other attempts to modify the instance config are rejected.
  149. // * Reading the instance config via the API continues to give the
  150. // pre-request values.
  151. //
  152. // Upon completion of the returned operation:
  153. //
  154. // * Creating instances using the instance configuration uses the new
  155. // values.
  156. // * The instance config's new values are readable via the API.
  157. // * The instance config's
  158. // [reconciling][google.spanner.admin.instance.v1.InstanceConfig.reconciling]
  159. // field becomes false.
  160. //
  161. // The returned [long-running operation][google.longrunning.Operation] will
  162. // have a name of the format
  163. // `<instance_config_name>/operations/<operation_id>` and can be used to track
  164. // the instance config modification. The
  165. // [metadata][google.longrunning.Operation.metadata] field type is
  166. // [UpdateInstanceConfigMetadata][google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata].
  167. // The [response][google.longrunning.Operation.response] field type is
  168. // [InstanceConfig][google.spanner.admin.instance.v1.InstanceConfig], if
  169. // successful.
  170. //
  171. // Authorization requires `spanner.instanceConfigs.update` permission on
  172. // the resource [name][google.spanner.admin.instance.v1.InstanceConfig.name].
  173. rpc UpdateInstanceConfig(UpdateInstanceConfigRequest)
  174. returns (google.longrunning.Operation) {
  175. option (google.api.http) = {
  176. patch: "/v1/{instance_config.name=projects/*/instanceConfigs/*}"
  177. body: "*"
  178. };
  179. option (google.api.method_signature) = "instance_config,update_mask";
  180. option (google.longrunning.operation_info) = {
  181. response_type: "google.spanner.admin.instance.v1.InstanceConfig"
  182. metadata_type: "google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata"
  183. };
  184. }
  185. // Deletes the instance config. Deletion is only allowed when no
  186. // instances are using the configuration. If any instances are using
  187. // the config, returns `FAILED_PRECONDITION`.
  188. //
  189. // Only user managed configurations can be deleted.
  190. //
  191. // Authorization requires `spanner.instanceConfigs.delete` permission on
  192. // the resource [name][google.spanner.admin.instance.v1.InstanceConfig.name].
  193. rpc DeleteInstanceConfig(DeleteInstanceConfigRequest)
  194. returns (google.protobuf.Empty) {
  195. option (google.api.http) = {
  196. delete: "/v1/{name=projects/*/instanceConfigs/*}"
  197. };
  198. option (google.api.method_signature) = "name";
  199. }
  200. // Lists the user-managed instance config [long-running
  201. // operations][google.longrunning.Operation] in the given project. An instance
  202. // config operation has a name of the form
  203. // `projects/<project>/instanceConfigs/<instance_config>/operations/<operation>`.
  204. // The long-running operation
  205. // [metadata][google.longrunning.Operation.metadata] field type
  206. // `metadata.type_url` describes the type of the metadata. Operations returned
  207. // include those that have completed/failed/canceled within the last 7 days,
  208. // and pending operations. Operations returned are ordered by
  209. // `operation.metadata.value.start_time` in descending order starting
  210. // from the most recently started operation.
  211. rpc ListInstanceConfigOperations(ListInstanceConfigOperationsRequest)
  212. returns (ListInstanceConfigOperationsResponse) {
  213. option (google.api.http) = {
  214. get: "/v1/{parent=projects/*}/instanceConfigOperations"
  215. };
  216. option (google.api.method_signature) = "parent";
  217. }
  218. // Lists all instances in the given project.
  219. rpc ListInstances(ListInstancesRequest) returns (ListInstancesResponse) {
  220. option (google.api.http) = {
  221. get: "/v1/{parent=projects/*}/instances"
  222. };
  223. option (google.api.method_signature) = "parent";
  224. }
  225. // Gets information about a particular instance.
  226. rpc GetInstance(GetInstanceRequest) returns (Instance) {
  227. option (google.api.http) = {
  228. get: "/v1/{name=projects/*/instances/*}"
  229. };
  230. option (google.api.method_signature) = "name";
  231. }
  232. // Creates an instance and begins preparing it to begin serving. The
  233. // returned [long-running operation][google.longrunning.Operation]
  234. // can be used to track the progress of preparing the new
  235. // instance. The instance name is assigned by the caller. If the
  236. // named instance already exists, `CreateInstance` returns
  237. // `ALREADY_EXISTS`.
  238. //
  239. // Immediately upon completion of this request:
  240. //
  241. // * The instance is readable via the API, with all requested attributes
  242. // but no allocated resources. Its state is `CREATING`.
  243. //
  244. // Until completion of the returned operation:
  245. //
  246. // * Cancelling the operation renders the instance immediately unreadable
  247. // via the API.
  248. // * The instance can be deleted.
  249. // * All other attempts to modify the instance are rejected.
  250. //
  251. // Upon completion of the returned operation:
  252. //
  253. // * Billing for all successfully-allocated resources begins (some types
  254. // may have lower than the requested levels).
  255. // * Databases can be created in the instance.
  256. // * The instance's allocated resource levels are readable via the API.
  257. // * The instance's state becomes `READY`.
  258. //
  259. // The returned [long-running operation][google.longrunning.Operation] will
  260. // have a name of the format `<instance_name>/operations/<operation_id>` and
  261. // can be used to track creation of the instance. The
  262. // [metadata][google.longrunning.Operation.metadata] field type is
  263. // [CreateInstanceMetadata][google.spanner.admin.instance.v1.CreateInstanceMetadata].
  264. // The [response][google.longrunning.Operation.response] field type is
  265. // [Instance][google.spanner.admin.instance.v1.Instance], if successful.
  266. rpc CreateInstance(CreateInstanceRequest)
  267. returns (google.longrunning.Operation) {
  268. option (google.api.http) = {
  269. post: "/v1/{parent=projects/*}/instances"
  270. body: "*"
  271. };
  272. option (google.api.method_signature) = "parent,instance_id,instance";
  273. option (google.longrunning.operation_info) = {
  274. response_type: "google.spanner.admin.instance.v1.Instance"
  275. metadata_type: "google.spanner.admin.instance.v1.CreateInstanceMetadata"
  276. };
  277. }
  278. // Updates an instance, and begins allocating or releasing resources
  279. // as requested. The returned [long-running
  280. // operation][google.longrunning.Operation] can be used to track the
  281. // progress of updating the instance. If the named instance does not
  282. // exist, returns `NOT_FOUND`.
  283. //
  284. // Immediately upon completion of this request:
  285. //
  286. // * For resource types for which a decrease in the instance's allocation
  287. // has been requested, billing is based on the newly-requested level.
  288. //
  289. // Until completion of the returned operation:
  290. //
  291. // * Cancelling the operation sets its metadata's
  292. // [cancel_time][google.spanner.admin.instance.v1.UpdateInstanceMetadata.cancel_time],
  293. // and begins restoring resources to their pre-request values. The
  294. // operation is guaranteed to succeed at undoing all resource changes,
  295. // after which point it terminates with a `CANCELLED` status.
  296. // * All other attempts to modify the instance are rejected.
  297. // * Reading the instance via the API continues to give the pre-request
  298. // resource levels.
  299. //
  300. // Upon completion of the returned operation:
  301. //
  302. // * Billing begins for all successfully-allocated resources (some types
  303. // may have lower than the requested levels).
  304. // * All newly-reserved resources are available for serving the instance's
  305. // tables.
  306. // * The instance's new resource levels are readable via the API.
  307. //
  308. // The returned [long-running operation][google.longrunning.Operation] will
  309. // have a name of the format `<instance_name>/operations/<operation_id>` and
  310. // can be used to track the instance modification. The
  311. // [metadata][google.longrunning.Operation.metadata] field type is
  312. // [UpdateInstanceMetadata][google.spanner.admin.instance.v1.UpdateInstanceMetadata].
  313. // The [response][google.longrunning.Operation.response] field type is
  314. // [Instance][google.spanner.admin.instance.v1.Instance], if successful.
  315. //
  316. // Authorization requires `spanner.instances.update` permission on
  317. // the resource [name][google.spanner.admin.instance.v1.Instance.name].
  318. rpc UpdateInstance(UpdateInstanceRequest)
  319. returns (google.longrunning.Operation) {
  320. option (google.api.http) = {
  321. patch: "/v1/{instance.name=projects/*/instances/*}"
  322. body: "*"
  323. };
  324. option (google.api.method_signature) = "instance,field_mask";
  325. option (google.longrunning.operation_info) = {
  326. response_type: "google.spanner.admin.instance.v1.Instance"
  327. metadata_type: "google.spanner.admin.instance.v1.UpdateInstanceMetadata"
  328. };
  329. }
  330. // Deletes an instance.
  331. //
  332. // Immediately upon completion of the request:
  333. //
  334. // * Billing ceases for all of the instance's reserved resources.
  335. //
  336. // Soon afterward:
  337. //
  338. // * The instance and *all of its databases* immediately and
  339. // irrevocably disappear from the API. All data in the databases
  340. // is permanently deleted.
  341. rpc DeleteInstance(DeleteInstanceRequest) returns (google.protobuf.Empty) {
  342. option (google.api.http) = {
  343. delete: "/v1/{name=projects/*/instances/*}"
  344. };
  345. option (google.api.method_signature) = "name";
  346. }
  347. // Sets the access control policy on an instance resource. Replaces any
  348. // existing policy.
  349. //
  350. // Authorization requires `spanner.instances.setIamPolicy` on
  351. // [resource][google.iam.v1.SetIamPolicyRequest.resource].
  352. rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest)
  353. returns (google.iam.v1.Policy) {
  354. option (google.api.http) = {
  355. post: "/v1/{resource=projects/*/instances/*}:setIamPolicy"
  356. body: "*"
  357. };
  358. option (google.api.method_signature) = "resource,policy";
  359. }
  360. // Gets the access control policy for an instance resource. Returns an empty
  361. // policy if an instance exists but does not have a policy set.
  362. //
  363. // Authorization requires `spanner.instances.getIamPolicy` on
  364. // [resource][google.iam.v1.GetIamPolicyRequest.resource].
  365. rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest)
  366. returns (google.iam.v1.Policy) {
  367. option (google.api.http) = {
  368. post: "/v1/{resource=projects/*/instances/*}:getIamPolicy"
  369. body: "*"
  370. };
  371. option (google.api.method_signature) = "resource";
  372. }
  373. // Returns permissions that the caller has on the specified instance resource.
  374. //
  375. // Attempting this RPC on a non-existent Cloud Spanner instance resource will
  376. // result in a NOT_FOUND error if the user has `spanner.instances.list`
  377. // permission on the containing Google Cloud Project. Otherwise returns an
  378. // empty set of permissions.
  379. rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest)
  380. returns (google.iam.v1.TestIamPermissionsResponse) {
  381. option (google.api.http) = {
  382. post: "/v1/{resource=projects/*/instances/*}:testIamPermissions"
  383. body: "*"
  384. };
  385. option (google.api.method_signature) = "resource,permissions";
  386. }
  387. }
  388. message ReplicaInfo {
  389. // Indicates the type of replica. See the [replica types
  390. // documentation](https://cloud.google.com/spanner/docs/replication#replica_types)
  391. // for more details.
  392. enum ReplicaType {
  393. // Not specified.
  394. TYPE_UNSPECIFIED = 0;
  395. // Read-write replicas support both reads and writes. These replicas:
  396. //
  397. // * Maintain a full copy of your data.
  398. // * Serve reads.
  399. // * Can vote whether to commit a write.
  400. // * Participate in leadership election.
  401. // * Are eligible to become a leader.
  402. READ_WRITE = 1;
  403. // Read-only replicas only support reads (not writes). Read-only replicas:
  404. //
  405. // * Maintain a full copy of your data.
  406. // * Serve reads.
  407. // * Do not participate in voting to commit writes.
  408. // * Are not eligible to become a leader.
  409. READ_ONLY = 2;
  410. // Witness replicas don't support reads but do participate in voting to
  411. // commit writes. Witness replicas:
  412. //
  413. // * Do not maintain a full copy of data.
  414. // * Do not serve reads.
  415. // * Vote whether to commit writes.
  416. // * Participate in leader election but are not eligible to become leader.
  417. WITNESS = 3;
  418. }
  419. // The location of the serving resources, e.g. "us-central1".
  420. string location = 1;
  421. // The type of replica.
  422. ReplicaType type = 2;
  423. // If true, this location is designated as the default leader location where
  424. // leader replicas are placed. See the [region types
  425. // documentation](https://cloud.google.com/spanner/docs/instances#region_types)
  426. // for more details.
  427. bool default_leader_location = 3;
  428. }
  429. // A possible configuration for a Cloud Spanner instance. Configurations
  430. // define the geographic placement of nodes and their replication.
  431. message InstanceConfig {
  432. option (google.api.resource) = {
  433. type: "spanner.googleapis.com/InstanceConfig"
  434. pattern: "projects/{project}/instanceConfigs/{instance_config}"
  435. };
  436. // The type of this configuration.
  437. enum Type {
  438. // Unspecified.
  439. TYPE_UNSPECIFIED = 0;
  440. // Google managed configuration.
  441. GOOGLE_MANAGED = 1;
  442. // User managed configuration.
  443. USER_MANAGED = 2;
  444. }
  445. // Indicates the current state of the instance config.
  446. enum State {
  447. // Not specified.
  448. STATE_UNSPECIFIED = 0;
  449. // The instance config is still being created.
  450. CREATING = 1;
  451. // The instance config is fully created and ready to be used to create
  452. // instances.
  453. READY = 2;
  454. }
  455. // A unique identifier for the instance configuration. Values
  456. // are of the form
  457. // `projects/<project>/instanceConfigs/[a-z][-a-z0-9]*`.
  458. string name = 1;
  459. // The name of this instance configuration as it appears in UIs.
  460. string display_name = 2;
  461. // Output only. Whether this instance config is a Google or User Managed
  462. // Configuration.
  463. Type config_type = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
  464. // The geographic placement of nodes in this instance configuration and their
  465. // replication properties.
  466. repeated ReplicaInfo replicas = 3;
  467. // Output only. The available optional replicas to choose from for user
  468. // managed configurations. Populated for Google managed configurations.
  469. repeated ReplicaInfo optional_replicas = 6
  470. [(google.api.field_behavior) = OUTPUT_ONLY];
  471. // Base configuration name, e.g. projects/<project_name>/instanceConfigs/nam3,
  472. // based on which this configuration is created. Only set for user managed
  473. // configurations. `base_config` must refer to a configuration of type
  474. // GOOGLE_MANAGED in the same project as this configuration.
  475. string base_config = 7 [(google.api.resource_reference) = {
  476. type: "spanner.googleapis.com/InstanceConfig"
  477. }];
  478. // Cloud Labels are a flexible and lightweight mechanism for organizing cloud
  479. // resources into groups that reflect a customer's organizational needs and
  480. // deployment strategies. Cloud Labels can be used to filter collections of
  481. // resources. They can be used to control how resource metrics are aggregated.
  482. // And they can be used as arguments to policy management rules (e.g. route,
  483. // firewall, load balancing, etc.).
  484. //
  485. // * Label keys must be between 1 and 63 characters long and must conform to
  486. // the following regular expression: `[a-z][a-z0-9_-]{0,62}`.
  487. // * Label values must be between 0 and 63 characters long and must conform
  488. // to the regular expression `[a-z0-9_-]{0,63}`.
  489. // * No more than 64 labels can be associated with a given resource.
  490. //
  491. // See https://goo.gl/xmQnxf for more information on and examples of labels.
  492. //
  493. // If you plan to use labels in your own code, please note that additional
  494. // characters may be allowed in the future. Therefore, you are advised to use
  495. // an internal label representation, such as JSON, which doesn't rely upon
  496. // specific characters being disallowed. For example, representing labels
  497. // as the string: name + "_" + value would prove problematic if we were to
  498. // allow "_" in a future release.
  499. map<string, string> labels = 8;
  500. // etag is used for optimistic concurrency control as a way
  501. // to help prevent simultaneous updates of a instance config from overwriting
  502. // each other. It is strongly suggested that systems make use of the etag in
  503. // the read-modify-write cycle to perform instance config updates in order to
  504. // avoid race conditions: An etag is returned in the response which contains
  505. // instance configs, and systems are expected to put that etag in the request
  506. // to update instance config to ensure that their change will be applied to
  507. // the same version of the instance config.
  508. // If no etag is provided in the call to update instance config, then the
  509. // existing instance config is overwritten blindly.
  510. string etag = 9;
  511. // Allowed values of the "default_leader" schema option for databases in
  512. // instances that use this instance configuration.
  513. repeated string leader_options = 4;
  514. // Output only. If true, the instance config is being created or updated. If
  515. // false, there are no ongoing operations for the instance config.
  516. bool reconciling = 10 [(google.api.field_behavior) = OUTPUT_ONLY];
  517. // Output only. The current instance config state.
  518. State state = 11 [(google.api.field_behavior) = OUTPUT_ONLY];
  519. }
  520. // An isolated set of Cloud Spanner resources on which databases can be hosted.
  521. message Instance {
  522. option (google.api.resource) = {
  523. type: "spanner.googleapis.com/Instance"
  524. pattern: "projects/{project}/instances/{instance}"
  525. };
  526. // Indicates the current state of the instance.
  527. enum State {
  528. // Not specified.
  529. STATE_UNSPECIFIED = 0;
  530. // The instance is still being created. Resources may not be
  531. // available yet, and operations such as database creation may not
  532. // work.
  533. CREATING = 1;
  534. // The instance is fully created and ready to do work such as
  535. // creating databases.
  536. READY = 2;
  537. }
  538. // Required. A unique identifier for the instance, which cannot be changed
  539. // after the instance is created. Values are of the form
  540. // `projects/<project>/instances/[a-z][-a-z0-9]*[a-z0-9]`. The final
  541. // segment of the name must be between 2 and 64 characters in length.
  542. string name = 1 [(google.api.field_behavior) = REQUIRED];
  543. // Required. The name of the instance's configuration. Values are of the form
  544. // `projects/<project>/instanceConfigs/<configuration>`. See
  545. // also [InstanceConfig][google.spanner.admin.instance.v1.InstanceConfig] and
  546. // [ListInstanceConfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigs].
  547. string config = 2 [
  548. (google.api.field_behavior) = REQUIRED,
  549. (google.api.resource_reference) = {
  550. type: "spanner.googleapis.com/InstanceConfig"
  551. }
  552. ];
  553. // Required. The descriptive name for this instance as it appears in UIs.
  554. // Must be unique per project and between 4 and 30 characters in length.
  555. string display_name = 3 [(google.api.field_behavior) = REQUIRED];
  556. // The number of nodes allocated to this instance. At most one of either
  557. // node_count or processing_units should be present in the message. This
  558. // may be zero in API responses for instances that are not yet in state
  559. // `READY`.
  560. //
  561. // See [the
  562. // documentation](https://cloud.google.com/spanner/docs/compute-capacity)
  563. // for more information about nodes and processing units.
  564. int32 node_count = 5;
  565. // The number of processing units allocated to this instance. At most one of
  566. // processing_units or node_count should be present in the message. This may
  567. // be zero in API responses for instances that are not yet in state `READY`.
  568. //
  569. // See [the
  570. // documentation](https://cloud.google.com/spanner/docs/compute-capacity)
  571. // for more information about nodes and processing units.
  572. int32 processing_units = 9;
  573. // Output only. The current instance state. For
  574. // [CreateInstance][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstance],
  575. // the state must be either omitted or set to `CREATING`. For
  576. // [UpdateInstance][google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstance],
  577. // the state must be either omitted or set to `READY`.
  578. State state = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
  579. // Cloud Labels are a flexible and lightweight mechanism for organizing cloud
  580. // resources into groups that reflect a customer's organizational needs and
  581. // deployment strategies. Cloud Labels can be used to filter collections of
  582. // resources. They can be used to control how resource metrics are aggregated.
  583. // And they can be used as arguments to policy management rules (e.g. route,
  584. // firewall, load balancing, etc.).
  585. //
  586. // * Label keys must be between 1 and 63 characters long and must conform to
  587. // the following regular expression: `[a-z][a-z0-9_-]{0,62}`.
  588. // * Label values must be between 0 and 63 characters long and must conform
  589. // to the regular expression `[a-z0-9_-]{0,63}`.
  590. // * No more than 64 labels can be associated with a given resource.
  591. //
  592. // See https://goo.gl/xmQnxf for more information on and examples of labels.
  593. //
  594. // If you plan to use labels in your own code, please note that additional
  595. // characters may be allowed in the future. And so you are advised to use an
  596. // internal label representation, such as JSON, which doesn't rely upon
  597. // specific characters being disallowed. For example, representing labels
  598. // as the string: name + "_" + value would prove problematic if we were to
  599. // allow "_" in a future release.
  600. map<string, string> labels = 7;
  601. // Deprecated. This field is not populated.
  602. repeated string endpoint_uris = 8;
  603. // Output only. The time at which the instance was created.
  604. google.protobuf.Timestamp create_time = 11
  605. [(google.api.field_behavior) = OUTPUT_ONLY];
  606. // Output only. The time at which the instance was most recently updated.
  607. google.protobuf.Timestamp update_time = 12
  608. [(google.api.field_behavior) = OUTPUT_ONLY];
  609. }
  610. // The request for
  611. // [ListInstanceConfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigs].
  612. message ListInstanceConfigsRequest {
  613. // Required. The name of the project for which a list of supported instance
  614. // configurations is requested. Values are of the form
  615. // `projects/<project>`.
  616. string parent = 1 [
  617. (google.api.field_behavior) = REQUIRED,
  618. (google.api.resource_reference) = {
  619. type: "cloudresourcemanager.googleapis.com/Project"
  620. }
  621. ];
  622. // Number of instance configurations to be returned in the response. If 0 or
  623. // less, defaults to the server's maximum allowed page size.
  624. int32 page_size = 2;
  625. // If non-empty, `page_token` should contain a
  626. // [next_page_token][google.spanner.admin.instance.v1.ListInstanceConfigsResponse.next_page_token]
  627. // from a previous
  628. // [ListInstanceConfigsResponse][google.spanner.admin.instance.v1.ListInstanceConfigsResponse].
  629. string page_token = 3;
  630. }
  631. // The response for
  632. // [ListInstanceConfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigs].
  633. message ListInstanceConfigsResponse {
  634. // The list of requested instance configurations.
  635. repeated InstanceConfig instance_configs = 1;
  636. // `next_page_token` can be sent in a subsequent
  637. // [ListInstanceConfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigs]
  638. // call to fetch more of the matching instance configurations.
  639. string next_page_token = 2;
  640. }
  641. // The request for
  642. // [GetInstanceConfigRequest][google.spanner.admin.instance.v1.InstanceAdmin.GetInstanceConfig].
  643. message GetInstanceConfigRequest {
  644. // Required. The name of the requested instance configuration. Values are of
  645. // the form `projects/<project>/instanceConfigs/<config>`.
  646. string name = 1 [
  647. (google.api.field_behavior) = REQUIRED,
  648. (google.api.resource_reference) = {
  649. type: "spanner.googleapis.com/InstanceConfig"
  650. }
  651. ];
  652. }
  653. // The request for
  654. // [CreateInstanceConfigRequest][InstanceAdmin.CreateInstanceConfigRequest].
  655. message CreateInstanceConfigRequest {
  656. // Required. The name of the project in which to create the instance config.
  657. // Values are of the form `projects/<project>`.
  658. string parent = 1 [
  659. (google.api.field_behavior) = REQUIRED,
  660. (google.api.resource_reference) = {
  661. type: "cloudresourcemanager.googleapis.com/Project"
  662. }
  663. ];
  664. // Required. The ID of the instance config to create. Valid identifiers are
  665. // of the form `custom-[-a-z0-9]*[a-z0-9]` and must be between 2 and 64
  666. // characters in length. The `custom-` prefix is required to avoid name
  667. // conflicts with Google managed configurations.
  668. string instance_config_id = 2 [(google.api.field_behavior) = REQUIRED];
  669. // Required. The InstanceConfig proto of the configuration to create.
  670. // instance_config.name must be
  671. // `<parent>/instanceConfigs/<instance_config_id>`.
  672. // instance_config.base_config must be a Google managed configuration name,
  673. // e.g. <parent>/instanceConfigs/us-east1, <parent>/instanceConfigs/nam3.
  674. InstanceConfig instance_config = 3 [(google.api.field_behavior) = REQUIRED];
  675. // An option to validate, but not actually execute, a request,
  676. // and provide the same response.
  677. bool validate_only = 4;
  678. }
  679. // The request for
  680. // [UpdateInstanceConfigRequest][InstanceAdmin.UpdateInstanceConfigRequest].
  681. message UpdateInstanceConfigRequest {
  682. // Required. The user instance config to update, which must always include the
  683. // instance config name. Otherwise, only fields mentioned in
  684. // [update_mask][google.spanner.admin.instance.v1.UpdateInstanceConfigRequest.update_mask]
  685. // need be included. To prevent conflicts of concurrent updates,
  686. // [etag][google.spanner.admin.instance.v1.InstanceConfig.reconciling] can
  687. // be used.
  688. InstanceConfig instance_config = 1 [(google.api.field_behavior) = REQUIRED];
  689. // Required. A mask specifying which fields in
  690. // [InstanceConfig][google.spanner.admin.instance.v1.InstanceConfig] should be
  691. // updated. The field mask must always be specified; this prevents any future
  692. // fields in [InstanceConfig][google.spanner.admin.instance.v1.InstanceConfig]
  693. // from being erased accidentally by clients that do not know about them. Only
  694. // display_name and labels can be updated.
  695. google.protobuf.FieldMask update_mask = 2
  696. [(google.api.field_behavior) = REQUIRED];
  697. // An option to validate, but not actually execute, a request,
  698. // and provide the same response.
  699. bool validate_only = 3;
  700. }
  701. // The request for
  702. // [DeleteInstanceConfigRequest][InstanceAdmin.DeleteInstanceConfigRequest].
  703. message DeleteInstanceConfigRequest {
  704. // Required. The name of the instance configuration to be deleted.
  705. // Values are of the form
  706. // `projects/<project>/instanceConfigs/<instance_config>`
  707. string name = 1 [
  708. (google.api.field_behavior) = REQUIRED,
  709. (google.api.resource_reference) = {
  710. type: "spanner.googleapis.com/InstanceConfig"
  711. }
  712. ];
  713. // Used for optimistic concurrency control as a way to help prevent
  714. // simultaneous deletes of an instance config from overwriting each
  715. // other. If not empty, the API
  716. // only deletes the instance config when the etag provided matches the current
  717. // status of the requested instance config. Otherwise, deletes the instance
  718. // config without checking the current status of the requested instance
  719. // config.
  720. string etag = 2;
  721. // An option to validate, but not actually execute, a request,
  722. // and provide the same response.
  723. bool validate_only = 3;
  724. }
  725. // The request for
  726. // [ListInstanceConfigOperations][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigOperations].
  727. message ListInstanceConfigOperationsRequest {
  728. // Required. The project of the instance config operations.
  729. // Values are of the form `projects/<project>`.
  730. string parent = 1 [
  731. (google.api.field_behavior) = REQUIRED,
  732. (google.api.resource_reference) = {
  733. type: "cloudresourcemanager.googleapis.com/Project"
  734. }
  735. ];
  736. // An expression that filters the list of returned operations.
  737. //
  738. // A filter expression consists of a field name, a
  739. // comparison operator, and a value for filtering.
  740. // The value must be a string, a number, or a boolean. The comparison operator
  741. // must be one of: `<`, `>`, `<=`, `>=`, `!=`, `=`, or `:`.
  742. // Colon `:` is the contains operator. Filter rules are not case sensitive.
  743. //
  744. // The following fields in the [Operation][google.longrunning.Operation]
  745. // are eligible for filtering:
  746. //
  747. // * `name` - The name of the long-running operation
  748. // * `done` - False if the operation is in progress, else true.
  749. // * `metadata.@type` - the type of metadata. For example, the type string
  750. // for
  751. // [CreateInstanceConfigMetadata][google.spanner.admin.instance.v1.CreateInstanceConfigMetadata]
  752. // is
  753. // `type.googleapis.com/google.spanner.admin.instance.v1.CreateInstanceConfigMetadata`.
  754. // * `metadata.<field_name>` - any field in metadata.value.
  755. // `metadata.@type` must be specified first, if filtering on metadata
  756. // fields.
  757. // * `error` - Error associated with the long-running operation.
  758. // * `response.@type` - the type of response.
  759. // * `response.<field_name>` - any field in response.value.
  760. //
  761. // You can combine multiple expressions by enclosing each expression in
  762. // parentheses. By default, expressions are combined with AND logic. However,
  763. // you can specify AND, OR, and NOT logic explicitly.
  764. //
  765. // Here are a few examples:
  766. //
  767. // * `done:true` - The operation is complete.
  768. // * `(metadata.@type=` \
  769. // `type.googleapis.com/google.spanner.admin.instance.v1.CreateInstanceConfigMetadata)
  770. // AND` \
  771. // `(metadata.instance_config.name:custom-config) AND` \
  772. // `(metadata.progress.start_time < \"2021-03-28T14:50:00Z\") AND` \
  773. // `(error:*)` - Return operations where:
  774. // * The operation's metadata type is
  775. // [CreateInstanceConfigMetadata][google.spanner.admin.instance.v1.CreateInstanceConfigMetadata].
  776. // * The instance config name contains "custom-config".
  777. // * The operation started before 2021-03-28T14:50:00Z.
  778. // * The operation resulted in an error.
  779. string filter = 2;
  780. // Number of operations to be returned in the response. If 0 or
  781. // less, defaults to the server's maximum allowed page size.
  782. int32 page_size = 3;
  783. // If non-empty, `page_token` should contain a
  784. // [next_page_token][google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse.next_page_token]
  785. // from a previous
  786. // [ListInstanceConfigOperationsResponse][google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse]
  787. // to the same `parent` and with the same `filter`.
  788. string page_token = 4;
  789. }
  790. // The response for
  791. // [ListInstanceConfigOperations][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigOperations].
  792. message ListInstanceConfigOperationsResponse {
  793. // The list of matching instance config [long-running
  794. // operations][google.longrunning.Operation]. Each operation's name will be
  795. // prefixed by the instance config's name. The operation's
  796. // [metadata][google.longrunning.Operation.metadata] field type
  797. // `metadata.type_url` describes the type of the metadata.
  798. repeated google.longrunning.Operation operations = 1;
  799. // `next_page_token` can be sent in a subsequent
  800. // [ListInstanceConfigOperations][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigOperations]
  801. // call to fetch more of the matching metadata.
  802. string next_page_token = 2;
  803. }
  804. // The request for
  805. // [GetInstance][google.spanner.admin.instance.v1.InstanceAdmin.GetInstance].
  806. message GetInstanceRequest {
  807. // Required. The name of the requested instance. Values are of the form
  808. // `projects/<project>/instances/<instance>`.
  809. string name = 1 [
  810. (google.api.field_behavior) = REQUIRED,
  811. (google.api.resource_reference) = {
  812. type: "spanner.googleapis.com/Instance"
  813. }
  814. ];
  815. // If field_mask is present, specifies the subset of
  816. // [Instance][google.spanner.admin.instance.v1.Instance] fields that should be
  817. // returned. If absent, all
  818. // [Instance][google.spanner.admin.instance.v1.Instance] fields are returned.
  819. google.protobuf.FieldMask field_mask = 2;
  820. }
  821. // The request for
  822. // [CreateInstance][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstance].
  823. message CreateInstanceRequest {
  824. // Required. The name of the project in which to create the instance. Values
  825. // are of the form `projects/<project>`.
  826. string parent = 1 [
  827. (google.api.field_behavior) = REQUIRED,
  828. (google.api.resource_reference) = {
  829. type: "cloudresourcemanager.googleapis.com/Project"
  830. }
  831. ];
  832. // Required. The ID of the instance to create. Valid identifiers are of the
  833. // form `[a-z][-a-z0-9]*[a-z0-9]` and must be between 2 and 64 characters in
  834. // length.
  835. string instance_id = 2 [(google.api.field_behavior) = REQUIRED];
  836. // Required. The instance to create. The name may be omitted, but if
  837. // specified must be `<parent>/instances/<instance_id>`.
  838. Instance instance = 3 [(google.api.field_behavior) = REQUIRED];
  839. }
  840. // The request for
  841. // [ListInstances][google.spanner.admin.instance.v1.InstanceAdmin.ListInstances].
  842. message ListInstancesRequest {
  843. // Required. The name of the project for which a list of instances is
  844. // requested. Values are of the form `projects/<project>`.
  845. string parent = 1 [
  846. (google.api.field_behavior) = REQUIRED,
  847. (google.api.resource_reference) = {
  848. type: "cloudresourcemanager.googleapis.com/Project"
  849. }
  850. ];
  851. // Number of instances to be returned in the response. If 0 or less, defaults
  852. // to the server's maximum allowed page size.
  853. int32 page_size = 2;
  854. // If non-empty, `page_token` should contain a
  855. // [next_page_token][google.spanner.admin.instance.v1.ListInstancesResponse.next_page_token]
  856. // from a previous
  857. // [ListInstancesResponse][google.spanner.admin.instance.v1.ListInstancesResponse].
  858. string page_token = 3;
  859. // An expression for filtering the results of the request. Filter rules are
  860. // case insensitive. The fields eligible for filtering are:
  861. //
  862. // * `name`
  863. // * `display_name`
  864. // * `labels.key` where key is the name of a label
  865. //
  866. // Some examples of using filters are:
  867. //
  868. // * `name:*` --> The instance has a name.
  869. // * `name:Howl` --> The instance's name contains the string "howl".
  870. // * `name:HOWL` --> Equivalent to above.
  871. // * `NAME:howl` --> Equivalent to above.
  872. // * `labels.env:*` --> The instance has the label "env".
  873. // * `labels.env:dev` --> The instance has the label "env" and the value of
  874. // the label contains the string "dev".
  875. // * `name:howl labels.env:dev` --> The instance's name contains "howl" and
  876. // it has the label "env" with its value
  877. // containing "dev".
  878. string filter = 4;
  879. }
  880. // The response for
  881. // [ListInstances][google.spanner.admin.instance.v1.InstanceAdmin.ListInstances].
  882. message ListInstancesResponse {
  883. // The list of requested instances.
  884. repeated Instance instances = 1;
  885. // `next_page_token` can be sent in a subsequent
  886. // [ListInstances][google.spanner.admin.instance.v1.InstanceAdmin.ListInstances]
  887. // call to fetch more of the matching instances.
  888. string next_page_token = 2;
  889. }
  890. // The request for
  891. // [UpdateInstance][google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstance].
  892. message UpdateInstanceRequest {
  893. // Required. The instance to update, which must always include the instance
  894. // name. Otherwise, only fields mentioned in
  895. // [field_mask][google.spanner.admin.instance.v1.UpdateInstanceRequest.field_mask]
  896. // need be included.
  897. Instance instance = 1 [(google.api.field_behavior) = REQUIRED];
  898. // Required. A mask specifying which fields in
  899. // [Instance][google.spanner.admin.instance.v1.Instance] should be updated.
  900. // The field mask must always be specified; this prevents any future fields in
  901. // [Instance][google.spanner.admin.instance.v1.Instance] from being erased
  902. // accidentally by clients that do not know about them.
  903. google.protobuf.FieldMask field_mask = 2
  904. [(google.api.field_behavior) = REQUIRED];
  905. }
  906. // The request for
  907. // [DeleteInstance][google.spanner.admin.instance.v1.InstanceAdmin.DeleteInstance].
  908. message DeleteInstanceRequest {
  909. // Required. The name of the instance to be deleted. Values are of the form
  910. // `projects/<project>/instances/<instance>`
  911. string name = 1 [
  912. (google.api.field_behavior) = REQUIRED,
  913. (google.api.resource_reference) = {
  914. type: "spanner.googleapis.com/Instance"
  915. }
  916. ];
  917. }
  918. // Metadata type for the operation returned by
  919. // [CreateInstance][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstance].
  920. message CreateInstanceMetadata {
  921. // The instance being created.
  922. Instance instance = 1;
  923. // The time at which the
  924. // [CreateInstance][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstance]
  925. // request was received.
  926. google.protobuf.Timestamp start_time = 2;
  927. // The time at which this operation was cancelled. If set, this operation is
  928. // in the process of undoing itself (which is guaranteed to succeed) and
  929. // cannot be cancelled again.
  930. google.protobuf.Timestamp cancel_time = 3;
  931. // The time at which this operation failed or was completed successfully.
  932. google.protobuf.Timestamp end_time = 4;
  933. }
  934. // Metadata type for the operation returned by
  935. // [UpdateInstance][google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstance].
  936. message UpdateInstanceMetadata {
  937. // The desired end state of the update.
  938. Instance instance = 1;
  939. // The time at which
  940. // [UpdateInstance][google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstance]
  941. // request was received.
  942. google.protobuf.Timestamp start_time = 2;
  943. // The time at which this operation was cancelled. If set, this operation is
  944. // in the process of undoing itself (which is guaranteed to succeed) and
  945. // cannot be cancelled again.
  946. google.protobuf.Timestamp cancel_time = 3;
  947. // The time at which this operation failed or was completed successfully.
  948. google.protobuf.Timestamp end_time = 4;
  949. }
  950. // Metadata type for the operation returned by
  951. // [CreateInstanceConfig][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstanceConfig].
  952. message CreateInstanceConfigMetadata {
  953. // The target instance config end state.
  954. InstanceConfig instance_config = 1;
  955. // The progress of the
  956. // [CreateInstanceConfig][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstanceConfig]
  957. // operation.
  958. OperationProgress progress = 2;
  959. // The time at which this operation was cancelled.
  960. google.protobuf.Timestamp cancel_time = 3;
  961. }
  962. // Metadata type for the operation returned by
  963. // [UpdateInstanceConfig][google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstanceConfig].
  964. message UpdateInstanceConfigMetadata {
  965. // The desired instance config after updating.
  966. InstanceConfig instance_config = 1;
  967. // The progress of the
  968. // [UpdateInstanceConfig][google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstanceConfig]
  969. // operation.
  970. OperationProgress progress = 2;
  971. // The time at which this operation was cancelled.
  972. google.protobuf.Timestamp cancel_time = 3;
  973. }