xref: /aosp_15_r20/external/googleapis/google/cloud/resourcemanager/v3/projects.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
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