1// Copyright 2023 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 15syntax = "proto3"; 16 17package google.cloud.resourcemanager.v3; 18 19import "google/api/annotations.proto"; 20import "google/api/client.proto"; 21import "google/api/field_behavior.proto"; 22import "google/api/resource.proto"; 23import "google/iam/v1/iam_policy.proto"; 24import "google/iam/v1/policy.proto"; 25import "google/longrunning/operations.proto"; 26import "google/protobuf/field_mask.proto"; 27import "google/protobuf/timestamp.proto"; 28 29option csharp_namespace = "Google.Cloud.ResourceManager.V3"; 30option go_package = "cloud.google.com/go/resourcemanager/apiv3/resourcemanagerpb;resourcemanagerpb"; 31option java_multiple_files = true; 32option java_outer_classname = "ProjectsProto"; 33option java_package = "com.google.cloud.resourcemanager.v3"; 34option php_namespace = "Google\\Cloud\\ResourceManager\\V3"; 35option ruby_package = "Google::Cloud::ResourceManager::V3"; 36 37// Manages Google Cloud Projects. 38service Projects { 39 option (google.api.default_host) = "cloudresourcemanager.googleapis.com"; 40 option (google.api.oauth_scopes) = 41 "https://www.googleapis.com/auth/cloud-platform," 42 "https://www.googleapis.com/auth/cloud-platform.read-only"; 43 44 // Retrieves the project identified by the specified `name` (for example, 45 // `projects/415104041262`). 46 // 47 // The caller must have `resourcemanager.projects.get` permission 48 // for this project. 49 rpc GetProject(GetProjectRequest) returns (Project) { 50 option (google.api.http) = { 51 get: "/v3/{name=projects/*}" 52 }; 53 option (google.api.method_signature) = "name"; 54 } 55 56 // Lists projects that are direct children of the specified folder or 57 // organization resource. `list()` provides a strongly consistent view of the 58 // projects underneath the specified parent resource. `list()` returns 59 // projects sorted based upon the (ascending) lexical ordering of their 60 // `display_name`. The caller must have `resourcemanager.projects.list` 61 // permission on the identified parent. 62 rpc ListProjects(ListProjectsRequest) returns (ListProjectsResponse) { 63 option (google.api.http) = { 64 get: "/v3/projects" 65 }; 66 option (google.api.method_signature) = "parent"; 67 } 68 69 // Search for projects that the caller has both `resourcemanager.projects.get` 70 // permission on, and also satisfy the specified query. 71 // 72 // This method returns projects in an unspecified order. 73 // 74 // This method is eventually consistent with project mutations; this means 75 // that a newly created project may not appear in the results or recent 76 // updates to an existing project may not be reflected in the results. To 77 // retrieve the latest state of a project, use the 78 // [GetProject][google.cloud.resourcemanager.v3.Projects.GetProject] method. 79 rpc SearchProjects(SearchProjectsRequest) returns (SearchProjectsResponse) { 80 option (google.api.http) = { 81 get: "/v3/projects:search" 82 }; 83 option (google.api.method_signature) = "query"; 84 } 85 86 // Request that a new project be created. The result is an `Operation` which 87 // can be used to track the creation process. This process usually takes a few 88 // seconds, but can sometimes take much longer. The tracking `Operation` is 89 // automatically deleted after a few hours, so there is no need to call 90 // `DeleteOperation`. 91 rpc CreateProject(CreateProjectRequest) 92 returns (google.longrunning.Operation) { 93 option (google.api.http) = { 94 post: "/v3/projects" 95 body: "project" 96 }; 97 option (google.api.method_signature) = "project"; 98 option (google.longrunning.operation_info) = { 99 response_type: "Project" 100 metadata_type: "CreateProjectMetadata" 101 }; 102 } 103 104 // Updates the `display_name` and labels of the project identified by the 105 // specified `name` (for example, `projects/415104041262`). Deleting all 106 // labels requires an update mask for labels field. 107 // 108 // The caller must have `resourcemanager.projects.update` permission for this 109 // project. 110 rpc UpdateProject(UpdateProjectRequest) 111 returns (google.longrunning.Operation) { 112 option (google.api.http) = { 113 patch: "/v3/{project.name=projects/*}" 114 body: "project" 115 }; 116 option (google.api.method_signature) = "project,update_mask"; 117 option (google.longrunning.operation_info) = { 118 response_type: "Project" 119 metadata_type: "UpdateProjectMetadata" 120 }; 121 } 122 123 // Move a project to another place in your resource hierarchy, under a new 124 // resource parent. 125 // 126 // Returns an operation which can be used to track the process of the project 127 // move workflow. 128 // Upon success, the `Operation.response` field will be populated with the 129 // moved project. 130 // 131 // The caller must have `resourcemanager.projects.move` permission on the 132 // project, on the project's current and proposed new parent. 133 // 134 // If project has no current parent, or it currently does not have an 135 // associated organization resource, you will also need the 136 // `resourcemanager.projects.setIamPolicy` permission in the project. 137 // 138 // 139 rpc MoveProject(MoveProjectRequest) returns (google.longrunning.Operation) { 140 option (google.api.http) = { 141 post: "/v3/{name=projects/*}:move" 142 body: "*" 143 }; 144 option (google.api.method_signature) = "name, destination_parent"; 145 option (google.longrunning.operation_info) = { 146 response_type: "Project" 147 metadata_type: "MoveProjectMetadata" 148 }; 149 } 150 151 // Marks the project identified by the specified 152 // `name` (for example, `projects/415104041262`) for deletion. 153 // 154 // This method will only affect the project if it has a lifecycle state of 155 // [ACTIVE][google.cloud.resourcemanager.v3.Project.State.ACTIVE]. 156 // 157 // This method changes the Project's lifecycle state from 158 // [ACTIVE][google.cloud.resourcemanager.v3.Project.State.ACTIVE] 159 // to 160 // [DELETE_REQUESTED][google.cloud.resourcemanager.v3.Project.State.DELETE_REQUESTED]. 161 // The deletion starts at an unspecified time, 162 // at which point the Project is no longer accessible. 163 // 164 // Until the deletion completes, you can check the lifecycle state 165 // checked by retrieving the project with [GetProject] 166 // [google.cloud.resourcemanager.v3.Projects.GetProject], 167 // and the project remains visible to [ListProjects] 168 // [google.cloud.resourcemanager.v3.Projects.ListProjects]. 169 // However, you cannot update the project. 170 // 171 // After the deletion completes, the project is not retrievable by 172 // the [GetProject] 173 // [google.cloud.resourcemanager.v3.Projects.GetProject], 174 // [ListProjects] 175 // [google.cloud.resourcemanager.v3.Projects.ListProjects], and 176 // [SearchProjects][google.cloud.resourcemanager.v3.Projects.SearchProjects] 177 // methods. 178 // 179 // This method behaves idempotently, such that deleting a `DELETE_REQUESTED` 180 // project will not cause an error, but also won't do anything. 181 // 182 // The caller must have `resourcemanager.projects.delete` permissions for this 183 // project. 184 rpc DeleteProject(DeleteProjectRequest) 185 returns (google.longrunning.Operation) { 186 option (google.api.http) = { 187 delete: "/v3/{name=projects/*}" 188 }; 189 option (google.api.method_signature) = "name"; 190 option (google.longrunning.operation_info) = { 191 response_type: "Project" 192 metadata_type: "DeleteProjectMetadata" 193 }; 194 } 195 196 // Restores the project identified by the specified 197 // `name` (for example, `projects/415104041262`). 198 // You can only use this method for a project that has a lifecycle state of 199 // [DELETE_REQUESTED] 200 // [Projects.State.DELETE_REQUESTED]. 201 // After deletion starts, the project cannot be restored. 202 // 203 // The caller must have `resourcemanager.projects.undelete` permission for 204 // this project. 205 rpc UndeleteProject(UndeleteProjectRequest) 206 returns (google.longrunning.Operation) { 207 option (google.api.http) = { 208 post: "/v3/{name=projects/*}:undelete" 209 body: "*" 210 }; 211 option (google.api.method_signature) = "name"; 212 option (google.longrunning.operation_info) = { 213 response_type: "Project" 214 metadata_type: "UndeleteProjectMetadata" 215 }; 216 } 217 218 // Returns the IAM access control policy for the specified project, in the 219 // format `projects/{ProjectIdOrNumber}` e.g. projects/123. 220 // Permission is denied if the policy or the resource do not exist. 221 rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest) 222 returns (google.iam.v1.Policy) { 223 option (google.api.http) = { 224 post: "/v3/{resource=projects/*}:getIamPolicy" 225 body: "*" 226 }; 227 option (google.api.method_signature) = "resource"; 228 } 229 230 // Sets the IAM access control policy for the specified project, in the 231 // format `projects/{ProjectIdOrNumber}` e.g. projects/123. 232 // 233 // CAUTION: This method will replace the existing policy, and cannot be used 234 // to append additional IAM settings. 235 // 236 // Note: Removing service accounts from policies or changing their roles can 237 // render services completely inoperable. It is important to understand how 238 // the service account is being used before removing or updating its roles. 239 // 240 // The following constraints apply when using `setIamPolicy()`: 241 // 242 // + Project does not support `allUsers` and `allAuthenticatedUsers` as 243 // `members` in a `Binding` of a `Policy`. 244 // 245 // + The owner role can be granted to a `user`, `serviceAccount`, or a group 246 // that is part of an organization. For example, 247 // [email protected] could be added as an owner to a project in 248 // the myownpersonaldomain.com organization, but not the examplepetstore.com 249 // organization. 250 // 251 // + Service accounts can be made owners of a project directly 252 // without any restrictions. However, to be added as an owner, a user must be 253 // invited using the Cloud Platform console and must accept the invitation. 254 // 255 // + A user cannot be granted the owner role using `setIamPolicy()`. The user 256 // must be granted the owner role using the Cloud Platform Console and must 257 // explicitly accept the invitation. 258 // 259 // + Invitations to grant the owner role cannot be sent using 260 // `setIamPolicy()`; 261 // they must be sent only using the Cloud Platform Console. 262 // 263 // + If the project is not part of an organization, there must be at least 264 // one owner who has accepted the Terms of Service (ToS) agreement in the 265 // policy. Calling `setIamPolicy()` to remove the last ToS-accepted owner 266 // from the policy will fail. This restriction also applies to legacy 267 // projects that no longer have owners who have accepted the ToS. Edits to 268 // IAM policies will be rejected until the lack of a ToS-accepting owner is 269 // rectified. If the project is part of an organization, you can remove all 270 // owners, potentially making the organization inaccessible. 271 rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest) 272 returns (google.iam.v1.Policy) { 273 option (google.api.http) = { 274 post: "/v3/{resource=projects/*}:setIamPolicy" 275 body: "*" 276 }; 277 option (google.api.method_signature) = "resource, policy"; 278 } 279 280 // Returns permissions that a caller has on the specified project, in the 281 // format `projects/{ProjectIdOrNumber}` e.g. projects/123.. 282 rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest) 283 returns (google.iam.v1.TestIamPermissionsResponse) { 284 option (google.api.http) = { 285 post: "/v3/{resource=projects/*}:testIamPermissions" 286 body: "*" 287 }; 288 option (google.api.method_signature) = "resource, permissions"; 289 } 290} 291 292// A project is a high-level Google Cloud entity. It is a 293// container for ACLs, APIs, App Engine Apps, VMs, and other 294// Google Cloud Platform resources. 295message Project { 296 option (google.api.resource) = { 297 type: "cloudresourcemanager.googleapis.com/Project" 298 pattern: "projects/{project}" 299 style: DECLARATIVE_FRIENDLY 300 }; 301 302 // Project lifecycle states. 303 enum State { 304 // Unspecified state. This is only used/useful for distinguishing 305 // unset values. 306 STATE_UNSPECIFIED = 0; 307 308 // The normal and active state. 309 ACTIVE = 1; 310 311 // The project has been marked for deletion by the user 312 // (by invoking 313 // [DeleteProject][google.cloud.resourcemanager.v3.Projects.DeleteProject]) 314 // or by the system (Google Cloud Platform). 315 // This can generally be reversed by invoking [UndeleteProject] 316 // [google.cloud.resourcemanager.v3.Projects.UndeleteProject]. 317 DELETE_REQUESTED = 2; 318 } 319 320 // Output only. The unique resource name of the project. It is an int64 321 // generated number prefixed by "projects/". 322 // 323 // Example: `projects/415104041262` 324 string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; 325 326 // Optional. A reference to a parent Resource. eg., `organizations/123` or 327 // `folders/876`. 328 string parent = 2 [(google.api.field_behavior) = OPTIONAL]; 329 330 // Immutable. The unique, user-assigned id of the project. 331 // It must be 6 to 30 lowercase ASCII letters, digits, or hyphens. 332 // It must start with a letter. 333 // Trailing hyphens are prohibited. 334 // 335 // Example: `tokyo-rain-123` 336 string project_id = 3 [(google.api.field_behavior) = IMMUTABLE]; 337 338 // Output only. The project lifecycle state. 339 State state = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; 340 341 // Optional. A user-assigned display name of the project. 342 // When present it must be between 4 to 30 characters. 343 // Allowed characters are: lowercase and uppercase letters, numbers, 344 // hyphen, single-quote, double-quote, space, and exclamation point. 345 // 346 // Example: `My Project` 347 string display_name = 5 [(google.api.field_behavior) = OPTIONAL]; 348 349 // Output only. Creation time. 350 google.protobuf.Timestamp create_time = 6 351 [(google.api.field_behavior) = OUTPUT_ONLY]; 352 353 // Output only. The most recent time this resource was modified. 354 google.protobuf.Timestamp update_time = 7 355 [(google.api.field_behavior) = OUTPUT_ONLY]; 356 357 // Output only. The time at which this resource was requested for deletion. 358 google.protobuf.Timestamp delete_time = 8 359 [(google.api.field_behavior) = OUTPUT_ONLY]; 360 361 // Output only. A checksum computed by the server based on the current value 362 // of the Project resource. This may be sent on update and delete requests to 363 // ensure the client has an up-to-date value before proceeding. 364 string etag = 9 [(google.api.field_behavior) = OUTPUT_ONLY]; 365 366 // Optional. The labels associated with this project. 367 // 368 // Label keys must be between 1 and 63 characters long and must conform 369 // to the following regular expression: \[a-z\](\[-a-z0-9\]*\[a-z0-9\])?. 370 // 371 // Label values must be between 0 and 63 characters long and must conform 372 // to the regular expression (\[a-z\](\[-a-z0-9\]*\[a-z0-9\])?)?. 373 // 374 // No more than 64 labels can be associated with a given resource. 375 // 376 // Clients should store labels in a representation such as JSON that does not 377 // depend on specific characters being disallowed. 378 // 379 // Example: `"myBusinessDimension" : "businessValue"` 380 map<string, string> labels = 10 [(google.api.field_behavior) = OPTIONAL]; 381} 382 383// The request sent to the 384// [GetProject][google.cloud.resourcemanager.v3.Projects.GetProject] 385// method. 386message GetProjectRequest { 387 // Required. The name of the project (for example, `projects/415104041262`). 388 string name = 1 [ 389 (google.api.field_behavior) = REQUIRED, 390 (google.api.resource_reference) = { 391 type: "cloudresourcemanager.googleapis.com/Project" 392 } 393 ]; 394} 395 396// The request sent to the 397// [ListProjects][google.cloud.resourcemanager.v3.Projects.ListProjects] 398// method. 399message ListProjectsRequest { 400 // Required. The name of the parent resource whose projects are being listed. 401 // Only children of this parent resource are listed; descendants are not 402 // listed. 403 // 404 // If the parent is a folder, use the value `folders/{folder_id}`. If the 405 // parent is an organization, use the value `organizations/{org_id}`. 406 string parent = 1 [ 407 (google.api.field_behavior) = REQUIRED, 408 (google.api.resource_reference) = { child_type: "*" } 409 ]; 410 411 // Optional. A pagination token returned from a previous call to 412 // [ListProjects] [google.cloud.resourcemanager.v3.Projects.ListProjects] that 413 // indicates from where listing should continue. 414 string page_token = 2 [(google.api.field_behavior) = OPTIONAL]; 415 416 // Optional. The maximum number of projects to return in the response. 417 // The server can return fewer projects than requested. 418 // If unspecified, server picks an appropriate default. 419 int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL]; 420 421 // Optional. Indicate that projects in the `DELETE_REQUESTED` state should 422 // also be returned. Normally only `ACTIVE` projects are returned. 423 bool show_deleted = 4 [(google.api.field_behavior) = OPTIONAL]; 424} 425 426// A page of the response received from the 427// [ListProjects][google.cloud.resourcemanager.v3.Projects.ListProjects] 428// method. 429// 430// A paginated response where more pages are available has 431// `next_page_token` set. This token can be used in a subsequent request to 432// retrieve the next request page. 433// 434// NOTE: A response may contain fewer elements than the request `page_size` and 435// still have a `next_page_token`. 436message ListProjectsResponse { 437 // The list of Projects under the parent. This list can be paginated. 438 repeated Project projects = 1; 439 440 // Pagination token. 441 // 442 // If the result set is too large to fit in a single response, this token 443 // is returned. It encodes the position of the current result cursor. 444 // Feeding this value into a new list request with the `page_token` parameter 445 // gives the next page of the results. 446 // 447 // When `next_page_token` is not filled in, there is no next page and 448 // the list returned is the last page in the result set. 449 // 450 // Pagination tokens have a limited lifetime. 451 string next_page_token = 2; 452} 453 454// The request sent to the 455// [SearchProjects][google.cloud.resourcemanager.v3.Projects.SearchProjects] 456// method. 457message SearchProjectsRequest { 458 // Optional. A query string for searching for projects that the caller has 459 // `resourcemanager.projects.get` permission to. If multiple fields are 460 // included in the query, then it will return results that match any of the 461 // fields. Some eligible fields are: 462 // 463 // - **`displayName`, `name`**: Filters by displayName. 464 // - **`parent`**: Project's parent (for example: `folders/123`, 465 // `organizations/*`). Prefer `parent` field over `parent.type` and 466 // `parent.id`. 467 // - **`parent.type`**: Parent's type: `folder` or `organization`. 468 // - **`parent.id`**: Parent's id number (for example: `123`). 469 // - **`id`, `projectId`**: Filters by projectId. 470 // - **`state`, `lifecycleState`**: Filters by state. 471 // - **`labels`**: Filters by label name or value. 472 // - **`labels.<key>` (where `<key>` is the name of a label)**: Filters by label 473 // name. 474 // 475 // Search expressions are case insensitive. 476 // 477 // Some examples queries: 478 // 479 // 480 // - **`name:how*`**: The project's name starts with "how". 481 // - **`name:Howl`**: The project's name is `Howl` or `howl`. 482 // - **`name:HOWL`**: Equivalent to above. 483 // - **`NAME:howl`**: Equivalent to above. 484 // - **`labels.color:*`**: The project has the label `color`. 485 // - **`labels.color:red`**: The project's label `color` has the value `red`. 486 // - **`labels.color:red labels.size:big`**: The project's label `color` has 487 // the value `red` or its label `size` has the value `big`. 488 // 489 // If no query is specified, the call will return projects for which the user 490 // has the `resourcemanager.projects.get` permission. 491 string query = 1 [(google.api.field_behavior) = OPTIONAL]; 492 493 // Optional. A pagination token returned from a previous call to 494 // [ListProjects] [google.cloud.resourcemanager.v3.Projects.ListProjects] that 495 // indicates from where listing should continue. 496 string page_token = 2 [(google.api.field_behavior) = OPTIONAL]; 497 498 // Optional. The maximum number of projects to return in the response. 499 // The server can return fewer projects than requested. 500 // If unspecified, server picks an appropriate default. 501 int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL]; 502} 503 504// A page of the response received from the 505// [SearchProjects][google.cloud.resourcemanager.v3.Projects.SearchProjects] 506// method. 507// 508// A paginated response where more pages are available has 509// `next_page_token` set. This token can be used in a subsequent request to 510// retrieve the next request page. 511message SearchProjectsResponse { 512 // The list of Projects that matched the list filter query. This list can 513 // be paginated. 514 repeated Project projects = 1; 515 516 // Pagination token. 517 // 518 // If the result set is too large to fit in a single response, this token 519 // is returned. It encodes the position of the current result cursor. 520 // Feeding this value into a new list request with the `page_token` parameter 521 // gives the next page of the results. 522 // 523 // When `next_page_token` is not filled in, there is no next page and 524 // the list returned is the last page in the result set. 525 // 526 // Pagination tokens have a limited lifetime. 527 string next_page_token = 2; 528} 529 530// The request sent to the 531// [CreateProject][google.cloud.resourcemanager.v3.Projects.CreateProject] 532// method. 533message CreateProjectRequest { 534 // Required. The Project to create. 535 // 536 // Project ID is required. If the requested ID is unavailable, the request 537 // fails. 538 // 539 // If the `parent` field is set, the `resourcemanager.projects.create` 540 // permission is checked on the parent resource. If no parent is set and 541 // the authorization credentials belong to an Organization, the parent 542 // will be set to that Organization. 543 Project project = 1 [(google.api.field_behavior) = REQUIRED]; 544} 545 546// A status object which is used as the `metadata` field for the Operation 547// returned by CreateProject. It provides insight for when significant phases of 548// Project creation have completed. 549message CreateProjectMetadata { 550 // Creation time of the project creation workflow. 551 google.protobuf.Timestamp create_time = 1; 552 553 // True if the project can be retrieved using `GetProject`. No other 554 // operations on the project are guaranteed to work until the project creation 555 // is complete. 556 bool gettable = 2; 557 558 // True if the project creation process is complete. 559 bool ready = 3; 560} 561 562// The request sent to the 563// [UpdateProject][google.cloud.resourcemanager.v3.Projects.UpdateProject] 564// method. 565// 566// Only the `display_name` and `labels` fields can be change. Use the 567// [MoveProject][google.cloud.resourcemanager.v3.Projects.MoveProject] method to 568// change the `parent` field. 569message UpdateProjectRequest { 570 // Required. The new definition of the project. 571 Project project = 1 [(google.api.field_behavior) = REQUIRED]; 572 573 // Optional. An update mask to selectively update fields. 574 google.protobuf.FieldMask update_mask = 2 575 [(google.api.field_behavior) = OPTIONAL]; 576} 577 578// A status object which is used as the `metadata` field for the Operation 579// returned by UpdateProject. 580message UpdateProjectMetadata {} 581 582// The request sent to 583// [MoveProject][google.cloud.resourcemanager.v3.Projects.MoveProject] 584// method. 585message MoveProjectRequest { 586 // Required. The name of the project to move. 587 string name = 1 [ 588 (google.api.field_behavior) = REQUIRED, 589 (google.api.resource_reference) = { 590 type: "cloudresourcemanager.googleapis.com/Project" 591 } 592 ]; 593 594 // Required. The new parent to move the Project under. 595 string destination_parent = 2 [ 596 (google.api.field_behavior) = REQUIRED, 597 (google.api.resource_reference) = { child_type: "*" } 598 ]; 599} 600 601// A status object which is used as the `metadata` field for the Operation 602// returned by MoveProject. 603message MoveProjectMetadata {} 604 605// [DeleteProject][google.cloud.resourcemanager.v3.Projects.DeleteProject] 606// method. 607message DeleteProjectRequest { 608 // Required. The name of the Project (for example, `projects/415104041262`). 609 string name = 1 [ 610 (google.api.field_behavior) = REQUIRED, 611 (google.api.resource_reference) = { 612 type: "cloudresourcemanager.googleapis.com/Project" 613 } 614 ]; 615} 616 617// A status object which is used as the `metadata` field for the Operation 618// returned by `DeleteProject`. 619message DeleteProjectMetadata {} 620 621// The request sent to the [UndeleteProject] 622// [google.cloud.resourcemanager.v3.Projects.UndeleteProject] 623// method. 624message UndeleteProjectRequest { 625 // Required. The name of the project (for example, `projects/415104041262`). 626 // 627 // Required. 628 string name = 1 [ 629 (google.api.field_behavior) = REQUIRED, 630 (google.api.resource_reference) = { 631 type: "cloudresourcemanager.googleapis.com/Project" 632 } 633 ]; 634} 635 636// A status object which is used as the `metadata` field for the Operation 637// returned by `UndeleteProject`. 638message UndeleteProjectMetadata {} 639