1// Copyright 2020 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.securitycenter.settings.v1beta1; 18 19import "google/api/annotations.proto"; 20import "google/api/client.proto"; 21import "google/api/field_behavior.proto"; 22import "google/api/resource.proto"; 23import "google/cloud/securitycenter/settings/v1beta1/component_settings.proto"; 24import "google/cloud/securitycenter/settings/v1beta1/detector.proto"; 25import "google/cloud/securitycenter/settings/v1beta1/settings.proto"; 26import "google/protobuf/empty.proto"; 27import "google/protobuf/field_mask.proto"; 28 29option cc_enable_arenas = true; 30option csharp_namespace = "Google.Cloud.SecurityCenter.Settings.V1Beta1"; 31option go_package = "cloud.google.com/go/securitycenter/settings/apiv1beta1/settingspb;settingspb"; 32option java_multiple_files = true; 33option java_outer_classname = "SettingsServiceProto"; 34option java_package = "com.google.cloud.securitycenter.settings.v1beta1"; 35option php_namespace = "Google\\Cloud\\SecurityCenter\\Settings\\V1beta1"; 36option ruby_package = "Google::Cloud::SecurityCenter::Settings::V1beta1"; 37 38// ## API Overview 39// 40// The SecurityCenterSettingsService is a sub-api of 41// `securitycenter.googleapis.com`. The service provides methods to manage 42// Security Center Settings, and Component Settings for GCP organizations, 43// folders, projects, and clusters. 44service SecurityCenterSettingsService { 45 option (google.api.default_host) = "securitycenter.googleapis.com"; 46 option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform"; 47 48 // Retrieves the organizations service account, if it exists, otherwise it 49 // creates the organization service account. This API is idempotent and 50 // will only create a service account once. On subsequent calls it will 51 // return the previously created service account. SHA, SCC and CTD Infra 52 // Automation will use this SA. This SA will not have any permissions when 53 // created. The UI will provision this via IAM or the user will using 54 // their own internal process. This API only creates SAs on the organization. 55 // Folders are not supported and projects will use per-project SAs associated 56 // with APIs enabled on a project. This API will be called by the UX 57 // onboarding workflow. 58 rpc GetServiceAccount(GetServiceAccountRequest) returns (ServiceAccount) { 59 option (google.api.http) = { 60 get: "/settings/v1beta1/{name=organizations/*/serviceAccount}" 61 }; 62 option (google.api.method_signature) = "name"; 63 } 64 65 // Gets the Settings. 66 rpc GetSettings(GetSettingsRequest) returns (Settings) { 67 option (google.api.http) = { 68 get: "/settings/v1beta1/{name=organizations/*/settings}" 69 additional_bindings { 70 get: "/settings/v1beta1/{name=folders/*/settings}" 71 } 72 additional_bindings { 73 get: "/settings/v1beta1/{name=projects/*/settings}" 74 } 75 additional_bindings { 76 get: "/settings/v1beta1/{name=projects/*/locations/*/clusters/*/settings}" 77 } 78 additional_bindings { 79 get: "/settings/v1beta1/{name=projects/*/regions/*/clusters/*/settings}" 80 } 81 additional_bindings { 82 get: "/settings/v1beta1/{name=projects/*/zones/*/clusters/*/settings}" 83 } 84 }; 85 option (google.api.method_signature) = "name"; 86 } 87 88 // Updates the Settings. 89 rpc UpdateSettings(UpdateSettingsRequest) returns (Settings) { 90 option (google.api.http) = { 91 patch: "/settings/v1beta1/{settings.name=organizations/*/settings}" 92 body: "settings" 93 additional_bindings { 94 patch: "/settings/v1beta1/{settings.name=folders/*/settings}" 95 body: "settings" 96 } 97 additional_bindings { 98 patch: "/settings/v1beta1/{settings.name=projects/*/settings}" 99 body: "settings" 100 } 101 additional_bindings { 102 patch: "/settings/v1beta1/{settings.name=projects/*/locations/*/clusters/*/settings}" 103 body: "settings" 104 } 105 additional_bindings { 106 patch: "/settings/v1beta1/{settings.name=projects/*/regions/*/clusters/*/settings}" 107 body: "settings" 108 } 109 additional_bindings { 110 patch: "/settings/v1beta1/{settings.name=projects/*/zones/*/clusters/*/settings}" 111 body: "settings" 112 } 113 }; 114 option (google.api.method_signature) = "settings,update_mask"; 115 } 116 117 // Reset the organization, folder or project's settings and return 118 // the settings of just that resource to the default. 119 // 120 // Settings are present at the organization, folder, project, and cluster 121 // levels. Using Reset on a sub-organization level will remove that resource's 122 // override and result in the parent's settings being used (eg: if Reset on a 123 // cluster, project settings will be used). 124 // 125 // Using Reset on organization will remove the override that was set and 126 // result in default settings being used. 127 rpc ResetSettings(ResetSettingsRequest) returns (google.protobuf.Empty) { 128 option (google.api.http) = { 129 post: "/settings/v1beta1/{name=organizations/*/settings}:reset" 130 body: "*" 131 additional_bindings { 132 post: "/settings/v1beta1/{name=folders/*/settings}:reset" 133 body: "*" 134 } 135 additional_bindings { 136 post: "/settings/v1beta1/{name=projects/*/settings}:reset" 137 body: "*" 138 } 139 additional_bindings { 140 post: "/settings/v1beta1/{name=projects/*/locations/*/clusters/*/settings}:reset" 141 body: "*" 142 } 143 additional_bindings { 144 post: "/settings/v1beta1/{name=projects/*/regions/*/clusters/*/settings}:reset" 145 body: "*" 146 } 147 additional_bindings { 148 post: "/settings/v1beta1/{name=projects/*/zones/*/clusters/*/settings}:reset" 149 body: "*" 150 } 151 }; 152 } 153 154 // Gets a list of settings. 155 rpc BatchGetSettings(BatchGetSettingsRequest) returns (BatchGetSettingsResponse) { 156 option (google.api.http) = { 157 get: "/settings/v1beta1/{parent=organizations/*}/settings:batchGet" 158 }; 159 } 160 161 // CalculateEffectiveSettings looks up all of the Security Center 162 // Settings resources in the GCP resource hierarchy, and calculates the 163 // effective settings on that resource by applying the following rules: 164 // * Settings provided closer to the target resource take precedence over 165 // those further away (e.g. folder will override organization level 166 // settings). 167 // * Product defaults can be overridden at org, folder, project, and cluster 168 // levels. 169 // * Detectors will be filtered out if they belong to a billing tier the 170 // customer 171 // has not configured. 172 rpc CalculateEffectiveSettings(CalculateEffectiveSettingsRequest) returns (Settings) { 173 option (google.api.http) = { 174 get: "/settings/v1beta1/{name=organizations/*/effectiveSettings}:calculate" 175 additional_bindings { 176 get: "/settings/v1beta1/{name=folders/*/effectiveSettings}:calculate" 177 } 178 additional_bindings { 179 get: "/settings/v1beta1/{name=projects/*/effectiveSettings}:calculate" 180 } 181 additional_bindings { 182 get: "/settings/v1beta1/{name=projects/*/locations/*/clusters/*/effectiveSettings}:calculate" 183 } 184 additional_bindings { 185 get: "/settings/v1beta1/{name=projects/*/regions/*/clusters/*/effectiveSettings}:calculate" 186 } 187 additional_bindings { 188 get: "/settings/v1beta1/{name=projects/*/zones/*/clusters/*/effectiveSettings}:calculate" 189 } 190 }; 191 option (google.api.method_signature) = "name"; 192 } 193 194 // Gets a list of effective settings. 195 rpc BatchCalculateEffectiveSettings(BatchCalculateEffectiveSettingsRequest) returns (BatchCalculateEffectiveSettingsResponse) { 196 option (google.api.http) = { 197 post: "/settings/v1beta1/{parent=organizations/*}/effectiveSettings:batchCalculate" 198 body: "*" 199 }; 200 } 201 202 // Gets the Component Settings. 203 rpc GetComponentSettings(GetComponentSettingsRequest) returns (ComponentSettings) { 204 option (google.api.http) = { 205 get: "/settings/v1beta1/{name=organizations/*/components/*/settings}" 206 additional_bindings { 207 get: "/settings/v1beta1/{name=folders/*/components/*/settings}" 208 } 209 additional_bindings { 210 get: "/settings/v1beta1/{name=projects/*/components/*/settings}" 211 } 212 additional_bindings { 213 get: "/settings/v1beta1/{name=projects/*/locations/*/clusters/*/components/*/settings}" 214 } 215 additional_bindings { 216 get: "/settings/v1beta1/{name=projects/*/regions/*/clusters/*/components/*/settings}" 217 } 218 additional_bindings { 219 get: "/settings/v1beta1/{name=projects/*/zones/*/clusters/*/components/*/settings}" 220 } 221 }; 222 option (google.api.method_signature) = "name"; 223 } 224 225 // Updates the Component Settings. 226 rpc UpdateComponentSettings(UpdateComponentSettingsRequest) returns (ComponentSettings) { 227 option (google.api.http) = { 228 patch: "/settings/v1beta1/{component_settings.name=organizations/*/components/*/settings}" 229 body: "component_settings" 230 additional_bindings { 231 patch: "/settings/v1beta1/{component_settings.name=folders/*/components/*/settings}" 232 body: "component_settings" 233 } 234 additional_bindings { 235 patch: "/settings/v1beta1/{component_settings.name=projects/*/components/*/settings}" 236 body: "component_settings" 237 } 238 additional_bindings { 239 patch: "/settings/v1beta1/{component_settings.name=projects/*/locations/*/clusters/*/components/*/settings}" 240 body: "component_settings" 241 } 242 additional_bindings { 243 patch: "/settings/v1beta1/{component_settings.name=projects/*/regions/*/clusters/*/components/*/settings}" 244 body: "component_settings" 245 } 246 additional_bindings { 247 patch: "/settings/v1beta1/{component_settings.name=projects/*/zones/*/clusters/*/components/*/settings}" 248 body: "component_settings" 249 } 250 }; 251 option (google.api.method_signature) = "component_settings,update_mask"; 252 } 253 254 // Reset the organization, folder or project's component settings and return 255 // the settings to the default. Settings are present at the 256 // organization, folder and project levels. Using Reset for a folder or 257 // project will remove the override that was set and result in the 258 // organization-level settings being used. 259 rpc ResetComponentSettings(ResetComponentSettingsRequest) returns (google.protobuf.Empty) { 260 option (google.api.http) = { 261 post: "/settings/v1beta1/{name=organizations/*/components/*/settings}:reset" 262 body: "*" 263 additional_bindings { 264 post: "/settings/v1beta1/{name=folders/*/components/*/settings}:reset" 265 body: "*" 266 } 267 additional_bindings { 268 post: "/settings/v1beta1/{name=projects/*/components/*/settings}:reset" 269 body: "*" 270 } 271 additional_bindings { 272 post: "/settings/v1beta1/{name=projects/*/locations/*/clusters/*/components/*/settings}:reset" 273 body: "*" 274 } 275 additional_bindings { 276 post: "/settings/v1beta1/{name=projects/*/regions/*/clusters/*/components/*/settings}:reset" 277 body: "*" 278 } 279 additional_bindings { 280 post: "/settings/v1beta1/{name=projects/*/zones/*/clusters/*/components/*/settings}:reset" 281 body: "*" 282 } 283 }; 284 } 285 286 // Gets the Effective Component Settings. 287 rpc CalculateEffectiveComponentSettings(CalculateEffectiveComponentSettingsRequest) returns (ComponentSettings) { 288 option (google.api.http) = { 289 get: "/settings/v1beta1/{name=organizations/*/components/*/effectiveSettings}:calculate" 290 additional_bindings { 291 get: "/settings/v1beta1/{name=folders/*/components/*/effectiveSettings}:calculate" 292 } 293 additional_bindings { 294 get: "/settings/v1beta1/{name=projects/*/components/*/effectiveSettings}:calculate" 295 } 296 additional_bindings { 297 get: "/settings/v1beta1/{name=projects/*/locations/*/clusters/*/components/*/effectiveSettings}:calculate" 298 } 299 additional_bindings { 300 get: "/settings/v1beta1/{name=projects/*/regions/*/clusters/*/components/*/effectiveSettings}:calculate" 301 } 302 additional_bindings { 303 get: "/settings/v1beta1/{name=projects/*/zones/*/clusters/*/components/*/effectiveSettings}:calculate" 304 } 305 }; 306 option (google.api.method_signature) = "name"; 307 } 308 309 // Retrieves an unordered list of available detectors. 310 rpc ListDetectors(ListDetectorsRequest) returns (ListDetectorsResponse) { 311 option (google.api.http) = { 312 get: "/settings/v1beta1/{parent=organizations/*}/detectors" 313 }; 314 option (google.api.method_signature) = "parent"; 315 } 316 317 // Retrieves an unordered list of available SCC components. 318 rpc ListComponents(ListComponentsRequest) returns (ListComponentsResponse) { 319 option (google.api.http) = { 320 get: "/settings/v1beta1/{parent=organizations/*}/components" 321 }; 322 option (google.api.method_signature) = "parent"; 323 } 324} 325 326// Request message for GetServiceAccount. 327message GetServiceAccountRequest { 328 // Required. The relative resource name of the service account resource. 329 // Format: 330 // * `organizations/{organization}/serviceAccount` 331 string name = 1 [ 332 (google.api.field_behavior) = REQUIRED, 333 (google.api.resource_reference) = { 334 type: "securitycenter.googleapis.com/ServiceAccount" 335 } 336 ]; 337} 338 339// An organization-level service account to be used by threat detection 340// components. 341message ServiceAccount { 342 option (google.api.resource) = { 343 type: "securitycenter.googleapis.com/ServiceAccount" 344 pattern: "organizations/{organization}/serviceAccount" 345 }; 346 347 // The relative resource name of the service account resource. 348 // Format: 349 // * `organizations/{organization}/serviceAccount` 350 string name = 1; 351 352 // Security Center managed service account for the organization 353 // example service-org-1234@scc.iam.gserviceaccount.com 354 // This service_account will be stored in the ComponentSettings field for the 355 // SCC, SHA, and Infra Automation components. 356 string service_account = 2; 357} 358 359// Request message for GetSettings. 360message GetSettingsRequest { 361 // Required. The name of the settings to retrieve. 362 // Formats: 363 // * `organizations/{organization}/settings` 364 // * `folders/{folder}/settings` 365 // * `projects/{project}/settings` 366 // * `projects/{project}/locations/{location}/clusters/{cluster}/settings` 367 // * `projects/{project}/regions/{region}/clusters/{cluster}/settings` 368 // * `projects/{project}/zones/{zone}/clusters/{cluster}/settings` 369 string name = 1 [ 370 (google.api.field_behavior) = REQUIRED, 371 (google.api.resource_reference) = { 372 type: "securitycenter.googleapis.com/Settings" 373 } 374 ]; 375} 376 377// Request message for UpdateSettings. 378message UpdateSettingsRequest { 379 // Required. The settings to update. 380 // 381 // The settings' `name` field is used to identify the settings to be updated. 382 // Formats: 383 // * `organizations/{organization}/settings` 384 // * `folders/{folder}/settings` 385 // * `projects/{project}/settings` 386 // * `projects/{project}/locations/{location}/clusters/{cluster}/settings` 387 // * `projects/{project}/regions/{region}/clusters/{cluster}/settings` 388 // * `projects/{project}/zones/{zone}/clusters/{cluster}/settings` 389 Settings settings = 1 [(google.api.field_behavior) = REQUIRED]; 390 391 // The list of fields to be updated on the settings. 392 google.protobuf.FieldMask update_mask = 2; 393} 394 395// Request message for ResetSettings. 396message ResetSettingsRequest { 397 // Required. The name of the settings to reset. 398 // Formats: 399 // * `organizations/{organization}/settings` 400 // * `folders/{folder}/settings` 401 // * `projects/{project}/settings` 402 // * `projects/{project}/locations/{location}/clusters/{cluster}/settings` 403 // * `projects/{project}/regions/{region}/clusters/{cluster}/settings` 404 // * `projects/{project}/zones/{zone}/clusters/{cluster}/settings` 405 string name = 1 [ 406 (google.api.field_behavior) = REQUIRED, 407 (google.api.resource_reference) = { 408 type: "securitycenter.googleapis.com/Settings" 409 } 410 ]; 411 412 // A fingerprint used for optimistic concurrency. If none is provided, 413 // then the existing settings will be blindly overwritten. 414 string etag = 2; 415} 416 417// Request message for BatchGetSettings. 418message BatchGetSettingsRequest { 419 // Required. The relative resource name of the organization shared by all of the 420 // settings being retrieved. 421 // Format: 422 // * `organizations/{organization}` 423 string parent = 1 [ 424 (google.api.field_behavior) = REQUIRED, 425 (google.api.resource_reference) = { 426 type: "cloudresourcemanager.googleapis.com/Organization" 427 } 428 ]; 429 430 // The names of the settings to retrieve. 431 // A maximum of 1000 settings can be retrieved in a batch. 432 // Formats: 433 // * `organizations/{organization}/settings` 434 // * `folders/{folder}/settings` 435 // * `projects/{project}/settings` 436 // * `projects/{project}/locations/{location}/clusters/{cluster}/settings` 437 // * `projects/{project}/regions/{region}/clusters/{cluster}/settings` 438 // * `projects/{project}/zones/{zone}/clusters/{cluster}/settings` 439 repeated string names = 2; 440} 441 442// Response message for BatchGetSettings. 443message BatchGetSettingsResponse { 444 // Settings requested. 445 repeated Settings settings = 1; 446} 447 448// Request message for CalculateEffectiveSettings. 449message CalculateEffectiveSettingsRequest { 450 // Required. The name of the effective settings to retrieve. 451 // Formats: 452 // * `organizations/{organization}/effectiveSettings` 453 // * `folders/{folder}/effectiveSettings` 454 // * `projects/{project}/effectiveSettings` 455 // * `projects/{project}/locations/{location}/clusters/{cluster}/effectiveSettings` 456 // * `projects/{project}/regions/{region}/clusters/{cluster}/effectiveSettings` 457 // * `projects/{project}/zones/{zone}/clusters/{cluster}/effectiveSettings` 458 string name = 1 [ 459 (google.api.field_behavior) = REQUIRED, 460 (google.api.resource_reference) = { 461 type: "securitycenter.googleapis.com/Settings" 462 } 463 ]; 464} 465 466// Request message for BatchGetEffectiveSettings. 467message BatchCalculateEffectiveSettingsRequest { 468 // Required. The relative resource name of the organization shared by all of the 469 // settings being retrieved. 470 // Format: 471 // * `organizations/{organization}` 472 string parent = 1 [ 473 (google.api.field_behavior) = REQUIRED, 474 (google.api.resource_reference) = { 475 type: "cloudresourcemanager.googleapis.com/Organization" 476 } 477 ]; 478 479 // The requests specifying the effective settings to retrieve. 480 // A maximum of 1000 effective settings can be retrieved in a batch. 481 repeated CalculateEffectiveSettingsRequest requests = 2; 482} 483 484// Response message for BatchGetEffectiveSettings. 485message BatchCalculateEffectiveSettingsResponse { 486 // Settings requested. 487 repeated Settings settings = 1; 488} 489 490// Request message for GetComponentSettings. 491message GetComponentSettingsRequest { 492 // Required. The component settings to retrieve. 493 // 494 // Formats: 495 // * `organizations/{organization}/components/{component}/settings` 496 // * `folders/{folder}/components/{component}/settings` 497 // * `projects/{project}/components/{component}/settings` 498 // * `projects/{project}/locations/{location}/clusters/{cluster}/components/{component}/settings` 499 // * `projects/{project}/regions/{region}/clusters/{cluster}/components/{component}/settings` 500 // * `projects/{project}/zones/{zone}/clusters/{cluster}/components/{component}/settings` 501 string name = 1 [ 502 (google.api.field_behavior) = REQUIRED, 503 (google.api.resource_reference) = { 504 type: "securitycenter.googleapis.com/ComponentSettings" 505 } 506 ]; 507} 508 509// Request message for UpdateComponentSettings. 510message UpdateComponentSettingsRequest { 511 // Required. The component settings to update. 512 // 513 // The component settings' `name` field is used to identify the component 514 // settings to be updated. Formats: 515 // * `organizations/{organization}/components/{component}/settings` 516 // * `folders/{folder}/components/{component}/settings` 517 // * `projects/{project}/components/{component}/settings` 518 // * `projects/{project}/locations/{location}/clusters/{cluster}/components/{component}/settings` 519 // * `projects/{project}/regions/{region}/clusters/{cluster}/components/{component}/settings` 520 // * `projects/{project}/zones/{zone}/clusters/{cluster}/components/{component}/settings` 521 ComponentSettings component_settings = 1 [(google.api.field_behavior) = REQUIRED]; 522 523 // The list of fields to be updated on the component settings resource. 524 google.protobuf.FieldMask update_mask = 2; 525} 526 527// Request message for ResetComponentSettings. 528message ResetComponentSettingsRequest { 529 // Required. The component settings to reset. 530 // 531 // Formats: 532 // * `organizations/{organization}/components/{component}/settings` 533 // * `folders/{folder}/components/{component}/settings` 534 // * `projects/{project}/components/{component}/settings` 535 // * `projects/{project}/locations/{location}/clusters/{cluster}/components/{component}/settings` 536 // * `projects/{project}/regions/{region}/clusters/{cluster}/components/{component}/settings` 537 // * `projects/{project}/zones/{zone}/clusters/{cluster}/components/{component}/settings` 538 string name = 1 [ 539 (google.api.field_behavior) = REQUIRED, 540 (google.api.resource_reference) = { 541 type: "securitycenter.googleapis.com/ComponentSettings" 542 } 543 ]; 544 545 // An fingerprint used for optimistic concurrency. If none is provided, 546 // then the existing settings will be blindly overwritten. 547 string etag = 2; 548} 549 550// Request message for CalculateEffectiveComponentSettings. 551message CalculateEffectiveComponentSettingsRequest { 552 // Required. The effective component settings to retrieve. 553 // 554 // Formats: 555 // * `organizations/{organization}/components/{component}/settings` 556 // * `folders/{folder}/components/{component}/settings` 557 // * `projects/{project}/components/{component}/settings` 558 // * `projects/{project}/locations/{location}/clusters/{cluster}/components/{component}/settings` 559 // * `projects/{project}/regions/{region}/clusters/{cluster}/components/{component}/settings` 560 // * `projects/{project}/zones/{zone}/clusters/{cluster}/components/{component}/settings` 561 string name = 1 [ 562 (google.api.field_behavior) = REQUIRED, 563 (google.api.resource_reference) = { 564 type: "securitycenter.googleapis.com/ComponentSettings" 565 } 566 ]; 567} 568 569// Request message for ListDetectors. 570message ListDetectorsRequest { 571 // Required. The parent, which owns this collection of detectors. 572 // Format: 573 // * `organizations/{organization}` 574 string parent = 1 [ 575 (google.api.field_behavior) = REQUIRED, 576 (google.api.resource_reference) = { 577 type: "cloudresourcemanager.googleapis.com/Organization" 578 } 579 ]; 580 581 // Filters to apply on the response. Filters can be applied on: 582 // * components 583 // * labels 584 // * billing tiers 585 // 586 // Component filters will retrieve only detectors for the components 587 // specified. Label filters will retrieve only detectors that match one of the 588 // labels specified. Billing tier filters will retrieve only detectors for 589 // that billing tier. 590 // 591 // The filters 592 string filter = 2; 593 594 // The maximum number of detectors to return. The service may return fewer 595 // than this value. If unspecified, at most 100 detectors will be returned. 596 // The maximum value is 1000; values above 1000 will be coerced to 1000. 597 int32 page_size = 3; 598 599 // A page token, received from a previous `ListDetectors` call. 600 // Provide this to retrieve the subsequent page. 601 // 602 // When paginating, all other parameters provided to `ListDetectors` must 603 // match the call that provided the page token. 604 string page_token = 4; 605} 606 607// Response message for ListDetectors. 608message ListDetectorsResponse { 609 // The detectors from the specified organization. 610 repeated Detector detectors = 1; 611 612 // A token that can be sent as `page_token` to retrieve the next page. 613 // If this field is omitted, there are no subsequent pages. 614 string next_page_token = 2; 615} 616 617// Request message for ListComponents. 618message ListComponentsRequest { 619 // Required. The parent, which owns this collection of components. 620 // Format: 621 // * `organizations/{organization}` 622 string parent = 1 [ 623 (google.api.field_behavior) = REQUIRED, 624 (google.api.resource_reference) = { 625 type: "cloudresourcemanager.googleapis.com/Organization" 626 } 627 ]; 628 629 // The maximum number of components to return. The service may return fewer 630 // than this value. If unspecified, at most 100 components will be returned. 631 // The maximum value is 1000; values above 1000 will be coerced to 1000. 632 int32 page_size = 2; 633 634 // A page token, received from a previous `ListComponents` call. 635 // Provide this to retrieve the subsequent page. 636 // 637 // When paginating, all other parameters provided to `ListComponents` must 638 // match the call that provided the page token. 639 string page_token = 3; 640} 641 642// Response message for ListComponents. 643message ListComponentsResponse { 644 // The components from the specified organization. 645 repeated string components = 1; 646 647 // A token that can be sent as `page_token` to retrieve the next page. 648 // If this field is omitted, there are no subsequent pages. 649 string next_page_token = 2; 650} 651