diff --git a/google/cloud/resourcemanager/artman_cloudresourcemanager.yaml b/google/cloud/resourcemanager/artman_cloudresourcemanager.yaml new file mode 100644 index 00000000..ad75e97e --- /dev/null +++ b/google/cloud/resourcemanager/artman_cloudresourcemanager.yaml @@ -0,0 +1,35 @@ +common: + api_name: cloudresourcemanager + api_version: v2 + organization_name: google-cloud + proto_deps: + - name: google-common-protos + - name: google-iam-v1 + src_proto_paths: + - v2 + service_yaml: cloudresourcemanager.yaml + gapic_yaml: v2/cloudresourcemanager_gapic.yaml +artifacts: +- name: gapic_config + type: GAPIC_CONFIG +- name: java_gapic + type: GAPIC + language: JAVA +- name: python_gapic + type: GAPIC + language: PYTHON +- name: nodejs_gapic + type: GAPIC + language: NODEJS +- name: php_gapic + type: GAPIC + language: PHP +- name: go_gapic + type: GAPIC + language: GO +- name: ruby_gapic + type: GAPIC + language: RUBY +- name: csharp_gapic + type: GAPIC + language: CSHARP diff --git a/google/cloud/resourcemanager/cloudresourcemanager.yaml b/google/cloud/resourcemanager/cloudresourcemanager.yaml new file mode 100644 index 00000000..7780c301 --- /dev/null +++ b/google/cloud/resourcemanager/cloudresourcemanager.yaml @@ -0,0 +1,56 @@ +type: google.api.Service +config_version: 1 +name: cloudresourcemanager.googleapis.com +title: Google Cloud Resource Manager API + +apis: +- name: google.cloud.resourcemanager.v2.Folders + +types: +- name: google.cloud.resourcemanager.v2.FolderOperation + +documentation: + summary: |- + The Google Cloud Resource Manager API provides methods for creating, + reading, and updating project metadata. + +backend: + rules: + - selector: google.cloud.resourcemanager.v2.Folders.ListFolders + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.SearchFolders + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.GetFolder + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.CreateFolder + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.UpdateFolder + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.MoveFolder + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.DeleteFolder + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.UndeleteFolder + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.GetIamPolicy + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.SetIamPolicy + deadline: 30.0 + - selector: google.cloud.resourcemanager.v2.Folders.TestIamPermissions + deadline: 30.0 + +authentication: + rules: + - selector: '*' + oauth: + canonical_scopes: |- + https://www.googleapis.com/auth/cloud-platform + - selector: |- + google.cloud.resourcemanager.v2.Folders.GetFolder, + google.cloud.resourcemanager.v2.Folders.GetIamPolicy, + google.cloud.resourcemanager.v2.Folders.ListFolders, + google.cloud.resourcemanager.v2.Folders.SearchFolders + oauth: + canonical_scopes: |- + https://www.googleapis.com/auth/cloud-platform, + https://www.googleapis.com/auth/cloud-platform.read-only diff --git a/google/cloud/resourcemanager/v2/cloudresourcemanager_gapic.yaml b/google/cloud/resourcemanager/v2/cloudresourcemanager_gapic.yaml new file mode 100644 index 00000000..4a5a07eb --- /dev/null +++ b/google/cloud/resourcemanager/v2/cloudresourcemanager_gapic.yaml @@ -0,0 +1,277 @@ +type: com.google.api.codegen.ConfigProto +config_schema_version: 1.0.0 +# The settings of generated code in a specific language. +language_settings: + java: + package_name: com.google.cloud.resourcemanager.v2 + python: + package_name: google.cloud.resourcemanager_v2.gapic + go: + package_name: cloud.google.com/go/cloud/resourcemanager/apiv2 + csharp: + package_name: Google.Cloud.ResourceManager.V2 + ruby: + package_name: Google::Cloud::ResourceManager::V2 + php: + package_name: Google\Cloud\ResourceManager\V2 + nodejs: + package_name: resourcemanager.v2 +# The configuration for the license header to put on generated files. +license_header: + # The file containing the copyright line(s). + copyright_file: copyright-google.txt + # The file containing the raw license header without any copyright line(s). + license_file: license-header-apache-2.0.txt +# A list of API interface configurations. +interfaces: + # The fully qualified name of the API interface. +- name: google.cloud.resourcemanager.v2.Folders + # A list of resource collection configurations. + # Consists of a name_pattern and an entity_name. + # The name_pattern is a pattern to describe the names of the resources of this + # collection, using the platform's conventions for URI patterns. A generator + # may use this to generate methods to compose and decompose such names. The + # pattern should use named placeholders as in `shelves/{shelf}/books/{book}`; + # those will be taken as hints for the parameter names of the generated + # methods. If empty, no name methods are generated. + # The entity_name is the name to be used as a basis for generated methods and + # classes. + collections: + - name_pattern: folders/{folder} + entity_name: folder + # Definition for retryable codes. + retry_codes_def: + - name: idempotent + retry_codes: + - UNAVAILABLE + - DEADLINE_EXCEEDED + - name: non_idempotent + retry_codes: [] + # Definition for retry/backoff parameters. + retry_params_def: + - name: default + initial_retry_delay_millis: 100 + retry_delay_multiplier: 1.3 + max_retry_delay_millis: 30000 + initial_rpc_timeout_millis: 20000 + rpc_timeout_multiplier: 1 + max_rpc_timeout_millis: 20000 + total_timeout_millis: 600000 + # A list of method configurations. + # Common properties: + # name - The simple name of the method. + # flattening - Specifies the configuration for parameter flattening. + # Describes the parameter groups for which a generator should produce + # method overloads which allow a client to directly pass request message + # fields as method parameters. This information may or may not be used, + # depending on the target language. + # Consists of groups, which each represent a list of parameters to be + # flattened. Each parameter listed must be a field of the request + # message. + # required_fields - Fields that are always required for a request to be + # valid. + # request_object_method - Turns on or off the generation of a method whose + # sole parameter is a request object. Not all languages will generate + # this method. + # resource_name_treatment - An enum that specifies how to treat the + # resource name formats defined in the field_name_patterns + # and response_field_name_patterns fields. + # UNSET: default value + # NONE: the collection configs will not be used by the generated code. + # VALIDATE: string fields will be validated by the client against the + # specified resource name formats. + # STATIC_TYPES: the client will use generated types for resource names. + # page_streaming - Specifies the configuration for paging. + # Describes information for generating a method which transforms a + # paging list RPC into a stream of resources. + # Consists of a request and a response. + # The request specifies request information of the list method. It + # defines which fields match the paging pattern in the request. The + # request consists of a page_size_field and a token_field. The + # page_size_field is the name of the optional field specifying the + # maximum number of elements to be returned in the response. The + # token_field is the name of the field in the request containing the + # page token. + # The response specifies response information of the list method. It + # defines which fields match the paging pattern in the response. The + # response consists of a token_field and a resources_field. The + # token_field is the name of the field in the response containing the + # next page token. The resources_field is the name of the field in the + # response containing the list of resources belonging to the page. + # retry_codes_name - Specifies the configuration for retryable codes. The + # name must be defined in interfaces.retry_codes_def. + # retry_params_name - Specifies the configuration for retry/backoff + # parameters. The name must be defined in interfaces.retry_params_def. + # field_name_patterns - Maps the field name of the request type to + # entity_name of interfaces.collections. + # Specifies the string pattern that the field must follow. + # timeout_millis - Specifies the default timeout for a non-retrying call. If + # the call is retrying, refer to retry_params_name instead. + methods: + - name: ListFolders + flattening: + groups: + - parameters: + - parent + - show_deleted + - parameters: + - parent + required_fields: + - parent + request_object_method: true + page_streaming: + request: + page_size_field: page_size + token_field: page_token + response: + token_field: next_page_token + resources_field: folders + retry_codes_name: idempotent + retry_params_name: default + timeout_millis: 30000 + - name: SearchFolders + flattening: + groups: + - parameters: + - query + required_fields: + - query + request_object_method: true + page_streaming: + request: + page_size_field: page_size + token_field: page_token + response: + token_field: next_page_token + resources_field: folders + retry_codes_name: idempotent + retry_params_name: default + timeout_millis: 30000 + - name: GetFolder + flattening: + groups: + - parameters: + - name + required_fields: + - name + request_object_method: false + retry_codes_name: idempotent + retry_params_name: default + field_name_patterns: + name: folder + timeout_millis: 30000 + - name: CreateFolder + flattening: + groups: + - parameters: + - parent + - folder + required_fields: + - parent + - folder + request_object_method: true + retry_codes_name: non_idempotent + retry_params_name: default + timeout_millis: 30000 + - name: UpdateFolder + flattening: + groups: + - parameters: + - folder + - update_mask + required_fields: + - folder + - update_mask + request_object_method: true + retry_codes_name: non_idempotent + retry_params_name: default + field_name_patterns: + folder.name: folder + timeout_millis: 30000 + - name: MoveFolder + flattening: + groups: + - parameters: + - name + - destination_parent + required_fields: + - name + - destination_parent + request_object_method: true + retry_codes_name: non_idempotent + retry_params_name: default + field_name_patterns: + name: folder + timeout_millis: 30000 + - name: DeleteFolder + flattening: + groups: + - parameters: + - name + - parameters: + - name + - recursive_delete + required_fields: + - name + request_object_method: true + retry_codes_name: idempotent + retry_params_name: default + field_name_patterns: + name: folder + timeout_millis: 30000 + - name: UndeleteFolder + flattening: + groups: + - parameters: + - name + required_fields: + - name + request_object_method: false + retry_codes_name: non_idempotent + retry_params_name: default + field_name_patterns: + name: folder + timeout_millis: 30000 + - name: GetIamPolicy + flattening: + groups: + - parameters: + - resource + required_fields: + - resource + request_object_method: false + retry_codes_name: idempotent + retry_params_name: default + field_name_patterns: + resource: folder + timeout_millis: 30000 + - name: SetIamPolicy + flattening: + groups: + - parameters: + - resource + - policy + required_fields: + - resource + - policy + request_object_method: true + retry_codes_name: non_idempotent + retry_params_name: default + field_name_patterns: + resource: folder + timeout_millis: 30000 + - name: TestIamPermissions + flattening: + groups: + - parameters: + - resource + - permissions + required_fields: + - resource + - permissions + request_object_method: true + retry_codes_name: non_idempotent + retry_params_name: default + field_name_patterns: + resource: folder + timeout_millis: 30000 diff --git a/google/cloud/resourcemanager/v2/folders.proto b/google/cloud/resourcemanager/v2/folders.proto new file mode 100644 index 00000000..9ff9c077 --- /dev/null +++ b/google/cloud/resourcemanager/v2/folders.proto @@ -0,0 +1,393 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.cloud.resourcemanager.v2; + +import "google/api/annotations.proto"; +import "google/iam/v1/iam_policy.proto"; +import "google/iam/v1/policy.proto"; +import "google/longrunning/operations.proto"; +import "google/protobuf/field_mask.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "google.golang.org/genproto/googleapis/cloud/resourcemanager/v2;resourcemanager"; +option java_multiple_files = true; +option java_outer_classname = "FoldersProto"; +option java_package = "com.google.cloud.resourcemanager.v2"; + + +// Manages Cloud Resource Folders. +// Cloud Resource Folders can be used to organize the resources under an +// organization and to control the IAM policies applied to groups of resources. +service Folders { + // Lists the Folders that are direct descendants of supplied parent resource. + // List provides a strongly consistent view of the Folders underneath + // the specified parent resource. + // List returns Folders sorted based upon the (ascending) lexical ordering + // of their display_name. + // The caller must have `resourcemanager.folders.list` permission on the + // identified parent. + rpc ListFolders(ListFoldersRequest) returns (ListFoldersResponse) { + option (google.api.http) = { get: "/v2/folders" }; + } + + // Search for folders that match specific filter criteria. + // Search provides an eventually consistent view of the folders a user has + // access to which meet the specified filter criteria. + // + // This will only return folders on which the caller has the + // permission `resourcemanager.folders.get`. + rpc SearchFolders(SearchFoldersRequest) returns (SearchFoldersResponse) { + option (google.api.http) = { post: "/v2/folders:search" body: "*" }; + } + + // Retrieves a Folder identified by the supplied resource name. + // Valid Folder resource names have the format `folders/{folder_id}` + // (for example, `folders/1234`). + // The caller must have `resourcemanager.folders.get` permission on the + // identified folder. + rpc GetFolder(GetFolderRequest) returns (Folder) { + option (google.api.http) = { get: "/v2/{name=folders/*}" }; + } + + // Creates a Folder in the resource hierarchy. + // Returns an Operation which can be used to track the progress of the + // folder creation workflow. + // Upon success the Operation.response field will be populated with the + // created Folder. + // + // In order to succeed, the addition of this new Folder must not violate + // the Folder naming, height or fanout constraints. + // + The Folder's display_name must be distinct from all other Folder's that + // share its parent. + // + The addition of the Folder must not cause the active Folder hierarchy + // to exceed a height of 4. Note, the full active + deleted Folder hierarchy + // is allowed to reach a height of 8; this provides additional headroom when + // moving folders that contain deleted folders. + // + The addition of the Folder must not cause the total number of Folders + // under its parent to exceed 100. + // + // If the operation fails due to a folder constraint violation, + // a PreconditionFailure explaining the violation will be returned. + // If the failure occurs synchronously then the PreconditionFailure + // will be returned via the Status.details field and if it occurs + // asynchronously then the PreconditionFailure will be returned + // via the the Operation.error field. + // + // The caller must have `resourcemanager.folders.create` permission on the + // identified parent. + rpc CreateFolder(CreateFolderRequest) returns (google.longrunning.Operation) { + option (google.api.http) = { post: "/v2/folders" body: "folder" }; + } + + // Updates a Folder, changing its display_name. + // Changes to the folder display_name will be rejected if they violate either + // the display_name formatting rules or naming constraints described in + // the [CreateFolder] documentation. + // + The Folder's display name must start and end with a letter or digit, + // may contain letters, digits, spaces, hyphens and underscores and can be + // no longer than 30 characters. This is captured by the regular expression: + // [\p{L}\p{N}]({\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?. + // The caller must have `resourcemanager.folders.update` permission on the + // identified folder. + // + // If the update fails due to the unique name constraint then a + // PreconditionFailure explaining this violation will be returned + // in the Status.details field. + rpc UpdateFolder(UpdateFolderRequest) returns (Folder) { + option (google.api.http) = { patch: "/v2/{folder.name=folders/*}" body: "folder" }; + } + + // Moves a Folder under a new resource parent. + // Returns an Operation which can be used to track the progress of the + // folder move workflow. + // Upon success the Operation.response field will be populated with the + // moved Folder. + // Upon failure, a FolderOperationError categorizing the failure cause will + // be returned - if the failure occurs synchronously then the + // FolderOperationError will be returned via the Status.details field + // and if it occurs asynchronously then the FolderOperation will be returned + // via the the Operation.error field. + // In addition, the Operation.metadata field will be populated with a + // FolderOperation message as an aid to stateless clients. + // Folder moves will be rejected if they violate either the naming, height + // or fanout constraints described in the [CreateFolder] documentation. + // The caller must have `resourcemanager.folders.move` permission on the + // folder's current and proposed new parent. + rpc MoveFolder(MoveFolderRequest) returns (google.longrunning.Operation) { + option (google.api.http) = { post: "/v2/{name=folders/*}:move" body: "*" }; + } + + // Requests deletion of a Folder. The Folder is moved into the + // [DELETE_REQUESTED] state immediately, and is deleted approximately 30 days + // later. This method may only be called on an empty Folder in the [ACTIVE] + // state, where a Folder is empty if it doesn't contain any Folders or + // Projects in the [ACTIVE] state. + // The caller must have `resourcemanager.folders.delete` permission on the + // identified folder. + rpc DeleteFolder(DeleteFolderRequest) returns (Folder) { + option (google.api.http) = { delete: "/v2/{name=folders/*}" }; + } + + // Cancels the deletion request for a Folder. This method may only be + // called on a Folder in the [DELETE_REQUESTED] state. + // In order to succeed, the Folder's parent must be in the [ACTIVE] state. + // In addition, reintroducing the folder into the tree must not violate + // folder naming, height and fanout constraints described in the + // [CreateFolder] documentation. + // The caller must have `resourcemanager.folders.undelete` permission on the + // identified folder. + rpc UndeleteFolder(UndeleteFolderRequest) returns (Folder) { + option (google.api.http) = { post: "/v2/{name=folders/*}:undelete" body: "*" }; + } + + // Gets the access control policy for a Folder. The returned policy may be + // empty if no such policy or resource exists. The `resource` field should + // be the Folder's resource name, e.g. "folders/1234". + // The caller must have `resourcemanager.folders.getIamPolicy` permission + // on the identified folder. + rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest) returns (google.iam.v1.Policy) { + option (google.api.http) = { post: "/v2/{resource=folders/*}:getIamPolicy" body: "*" }; + } + + // Sets the access control policy on a Folder, replacing any existing policy. + // The `resource` field should be the Folder's resource name, e.g. + // "folders/1234". + // The caller must have `resourcemanager.folders.setIamPolicy` permission + // on the identified folder. + rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest) returns (google.iam.v1.Policy) { + option (google.api.http) = { post: "/v2/{resource=folders/*}:setIamPolicy" body: "*" }; + } + + // Returns permissions that a caller has on the specified Folder. + // The `resource` field should be the Folder's resource name, + // e.g. "folders/1234". + // + // There are no permissions required for making this API call. + rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest) returns (google.iam.v1.TestIamPermissionsResponse) { + option (google.api.http) = { post: "/v2/{resource=folders/*}:testIamPermissions" body: "*" }; + } +} + +// A Folder in an Organization's resource hierarchy, used to +// organize that Organization's resources. +message Folder { + // Folder lifecycle states. + enum LifecycleState { + // Unspecified state. + LIFECYCLE_STATE_UNSPECIFIED = 0; + + // The normal and active state. + ACTIVE = 1; + + // The folder has been marked for deletion by the user. + DELETE_REQUESTED = 2; + } + + // Output only. The resource name of the Folder. + // Its format is `folders/{folder_id}`, for example: "folders/1234". + string name = 1; + + // The Folder’s parent's resource name. + // Updates to the folder's parent must be performed via [MoveFolders]. + string parent = 2; + + // The folder’s display name. + // A folder’s display name must be unique amongst its siblings, e.g. + // no two folders with the same parent can share the same display name. + // The display name must start and end with a letter or digit, may contain + // letters, digits, spaces, hyphens and underscores and can be no longer + // than 30 characters. This is captured by the regular expression: + // [\p{L}\p{N}]({\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?. + string display_name = 3; + + // Output only. The lifecycle state of the folder. + // Updates to the lifecycle_state must be performed via + // [DeleteFolder] and [UndeleteFolder]. + LifecycleState lifecycle_state = 4; + + // Output only. Timestamp when the Folder was created. Assigned by the server. + google.protobuf.Timestamp create_time = 5; + + // Output only. Timestamp when the Folder was last modified. + google.protobuf.Timestamp update_time = 6; +} + +// The ListFolders request message. +message ListFoldersRequest { + // The resource name of the Organization or Folder whose Folders are + // being listed. + // Must be of the form `folders/{folder_id}` or `organizations/{org_id}`. + // Access to this method is controlled by checking the + // `resourcemanager.folders.list` permission on the `parent`. + string parent = 1; + + // The maximum number of Folders to return in the response. + // This field is optional. + int32 page_size = 2; + + // A pagination token returned from a previous call to `ListFolders` + // that indicates where this listing should continue from. + // This field is optional. + string page_token = 3; + + // Controls whether Folders in the [DELETE_REQUESTED} state should + // be returned. + bool show_deleted = 4; +} + +// The ListFolders response message. +message ListFoldersResponse { + // A possibly paginated list of Folders that are direct descendants of + // the specified parent resource. + repeated Folder folders = 1; + + // A pagination token returned from a previous call to `ListFolders` + // that indicates from where listing should continue. + // This field is optional. + string next_page_token = 2; +} + +// The request message for searching folders. +message SearchFoldersRequest { + // The maximum number of folders to return in the response. + // This field is optional. + int32 page_size = 1; + + // A pagination token returned from a previous call to `SearchFolders` + // that indicates from where search should continue. + // This field is optional. + string page_token = 2; + + // Search criteria used to select the Folders to return. + // If no search criteria is specified then all accessible folders will be + // returned. + // + // Query expressions can be used to restrict results based upon displayName, + // lifecycleState and parent, where the operators `=`, `NOT`, `AND` and `OR` + // can be used along with the suffix wildcard symbol `*`. + // + // Some example queries are: + // |Query|Description| + // |------|-----------| + // |displayName=Test*|Folders whose display name starts with "Test".| + // |lifecycleState=ACTIVE|Folders whose lifecycleState is ACTIVE.| + // |parent=folders/123|Folders whose parent is "folders/123".| + // |parent=folders/123 AND lifecycleState=ACTIVE|Active folders whose + // parent is "folders/123".| + string query = 3; +} + +// The response message for searching folders. +message SearchFoldersResponse { + // A possibly paginated folder search results. + // the specified parent resource. + repeated Folder folders = 1; + + // A pagination token returned from a previous call to `SearchFolders` + // that indicates from where searching should continue. + // This field is optional. + string next_page_token = 2; +} + +// The GetFolder request message. +message GetFolderRequest { + // The resource name of the Folder to retrieve. + // Must be of the form `folders/{folder_id}`. + string name = 1; +} + +// The CreateFolder request message. +message CreateFolderRequest { + // The resource name of the new Folder's parent. + // Must be of the form `folders/{folder_id}` or `organizations/{org_id}`. + string parent = 1; + + // The Folder being created, only the display name will be consulted. + // All other fields will be ignored. + Folder folder = 2; +} + +// The MoveFolder request message. +message MoveFolderRequest { + // The resource name of the Folder to move. + // Must be of the form folders/{folder_id} + string name = 1; + + // The resource name of the Folder or Organization to reparent + // the folder under. + // Must be of the form `folders/{folder_id}` or `organizations/{org_id}`. + string destination_parent = 2; +} + +// The request message for updating a folder's display name. +message UpdateFolderRequest { + // The new definition of the Folder. It must include a + // a `name` and `display_name` field. The other fields + // will be ignored. + Folder folder = 1; + + // Fields to be updated. + // Only the `display_name` can be updated. + google.protobuf.FieldMask update_mask = 2; +} + +// The DeleteFolder request message. +message DeleteFolderRequest { + // the resource name of the Folder to be deleted. + // Must be of the form `folders/{folder_id}`. + string name = 1; + + // Instructs DeleteFolderAction to delete a folder even when the folder is not + // empty. + bool recursive_delete = 2; +} + +// The UndeleteFolder request message. +message UndeleteFolderRequest { + // The resource name of the Folder to undelete. + // Must be of the form `folders/{folder_id}`. + string name = 1; +} + +// Metadata describing a long running folder operation +message FolderOperation { + // The type of operation that failed. + enum OperationType { + // Operation type not specified. + OPERATION_TYPE_UNSPECIFIED = 0; + + // A create folder operation. + CREATE = 1; + + // A move folder operation. + MOVE = 2; + } + + // The display name of the folder. + string display_name = 1; + + // The type of this operation. + OperationType operation_type = 2; + + // The resource name of the folder's parent. + // Only applicable when the operation_type is MOVE. + string source_parent = 3; + + // The resource name of the folder or organization we are either creating + // the folder under or moving the folder to. + string destination_parent = 4; +}