// Copyright 2023 Google LLC
//
// 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.migrationcenter.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/type/date.proto";
import "google/type/money.proto";

option csharp_namespace = "Google.Cloud.MigrationCenter.V1";
option go_package = "cloud.google.com/go/migrationcenter/apiv1/migrationcenterpb;migrationcenterpb";
option java_multiple_files = true;
option java_outer_classname = "MigrationCenterProto";
option java_package = "com.google.cloud.migrationcenter.v1";
option php_namespace = "Google\\Cloud\\MigrationCenter\\V1";
option ruby_package = "Google::Cloud::MigrationCenter::V1";

// Service describing handlers for resources.
service MigrationCenter {
  option (google.api.default_host) = "migrationcenter.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Lists all the assets in a given project and location.
  rpc ListAssets(ListAssetsRequest) returns (ListAssetsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/assets"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of an asset.
  rpc GetAsset(GetAssetRequest) returns (Asset) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/assets/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates the parameters of an asset.
  rpc UpdateAsset(UpdateAssetRequest) returns (Asset) {
    option (google.api.http) = {
      patch: "/v1/{asset.name=projects/*/locations/*/assets/*}"
      body: "asset"
    };
    option (google.api.method_signature) = "asset,update_mask";
  }

  // Updates the parameters of a list of assets.
  rpc BatchUpdateAssets(BatchUpdateAssetsRequest)
      returns (BatchUpdateAssetsResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/assets:batchUpdate"
      body: "*"
    };
    option (google.api.method_signature) = "parent,requests";
  }

  // Deletes an asset.
  rpc DeleteAsset(DeleteAssetRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/assets/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes list of Assets.
  rpc BatchDeleteAssets(BatchDeleteAssetsRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/assets:batchDelete"
      body: "*"
    };
    option (google.api.method_signature) = "parent,names";
  }

  // Reports a set of frames.
  rpc ReportAssetFrames(ReportAssetFramesRequest)
      returns (ReportAssetFramesResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/assets:reportAssetFrames"
      body: "frames"
    };
  }

  // Aggregates the requested fields based on provided function.
  rpc AggregateAssetsValues(AggregateAssetsValuesRequest)
      returns (AggregateAssetsValuesResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/assets:aggregateValues"
      body: "*"
    };
  }

  // Creates an import job.
  rpc CreateImportJob(CreateImportJobRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/importJobs"
      body: "import_job"
    };
    option (google.api.method_signature) = "parent,import_job,import_job_id";
    option (google.longrunning.operation_info) = {
      response_type: "ImportJob"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists all import jobs.
  rpc ListImportJobs(ListImportJobsRequest) returns (ListImportJobsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/importJobs"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of an import job.
  rpc GetImportJob(GetImportJobRequest) returns (ImportJob) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/importJobs/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes an import job.
  rpc DeleteImportJob(DeleteImportJobRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/importJobs/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates an import job.
  rpc UpdateImportJob(UpdateImportJobRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{import_job.name=projects/*/locations/*/importJobs/*}"
      body: "import_job"
    };
    option (google.api.method_signature) = "import_job,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "ImportJob"
      metadata_type: "OperationMetadata"
    };
  }

  // Validates an import job.
  rpc ValidateImportJob(ValidateImportJobRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/importJobs/*}:validate"
      body: "*"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Runs an import job.
  rpc RunImportJob(RunImportJobRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/importJobs/*}:run"
      body: "*"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Gets an import data file.
  rpc GetImportDataFile(GetImportDataFileRequest) returns (ImportDataFile) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/importJobs/*/importDataFiles/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // List import data files.
  rpc ListImportDataFiles(ListImportDataFilesRequest)
      returns (ListImportDataFilesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/importJobs/*}/importDataFiles"
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates an import data file.
  rpc CreateImportDataFile(CreateImportDataFileRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/importJobs/*}/importDataFiles"
      body: "import_data_file"
    };
    option (google.api.method_signature) =
        "parent,import_data_file,import_data_file_id";
    option (google.longrunning.operation_info) = {
      response_type: "ImportDataFile"
      metadata_type: "OperationMetadata"
    };
  }

  // Delete an import data file.
  rpc DeleteImportDataFile(DeleteImportDataFileRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/importJobs/*/importDataFiles/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists all groups in a given project and location.
  rpc ListGroups(ListGroupsRequest) returns (ListGroupsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/groups"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a group.
  rpc GetGroup(GetGroupRequest) returns (Group) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/groups/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new group in a given project and location.
  rpc CreateGroup(CreateGroupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/groups"
      body: "group"
    };
    option (google.api.method_signature) = "parent,group,group_id";
    option (google.longrunning.operation_info) = {
      response_type: "Group"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a group.
  rpc UpdateGroup(UpdateGroupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{group.name=projects/*/locations/*/groups/*}"
      body: "group"
    };
    option (google.api.method_signature) = "group,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Group"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a group.
  rpc DeleteGroup(DeleteGroupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/groups/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Adds assets to a group.
  rpc AddAssetsToGroup(AddAssetsToGroupRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{group=projects/*/locations/*/groups/*}:addAssets"
      body: "*"
    };
    option (google.api.method_signature) = "group";
    option (google.longrunning.operation_info) = {
      response_type: "Group"
      metadata_type: "OperationMetadata"
    };
  }

  // Removes assets from a group.
  rpc RemoveAssetsFromGroup(RemoveAssetsFromGroupRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{group=projects/*/locations/*/groups/*}:removeAssets"
      body: "*"
    };
    option (google.api.method_signature) = "group";
    option (google.longrunning.operation_info) = {
      response_type: "Group"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists all error frames in a given source and location.
  rpc ListErrorFrames(ListErrorFramesRequest)
      returns (ListErrorFramesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/sources/*}/errorFrames"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of an error frame.
  rpc GetErrorFrame(GetErrorFrameRequest) returns (ErrorFrame) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/sources/*/errorFrames/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists all the sources in a given project and location.
  rpc ListSources(ListSourcesRequest) returns (ListSourcesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/sources"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a source.
  rpc GetSource(GetSourceRequest) returns (Source) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/sources/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new source in a given project and location.
  rpc CreateSource(CreateSourceRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/sources"
      body: "source"
    };
    option (google.api.method_signature) = "parent,source,source_id";
    option (google.longrunning.operation_info) = {
      response_type: "Source"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a source.
  rpc UpdateSource(UpdateSourceRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{source.name=projects/*/locations/*/sources/*}"
      body: "source"
    };
    option (google.api.method_signature) = "source,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Source"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a source.
  rpc DeleteSource(DeleteSourceRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/sources/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists all the preference sets in a given project and location.
  rpc ListPreferenceSets(ListPreferenceSetsRequest)
      returns (ListPreferenceSetsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/preferenceSets"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a preference set.
  rpc GetPreferenceSet(GetPreferenceSetRequest) returns (PreferenceSet) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/preferenceSets/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new preference set in a given project and location.
  rpc CreatePreferenceSet(CreatePreferenceSetRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/preferenceSets"
      body: "preference_set"
    };
    option (google.api.method_signature) =
        "parent,preference_set,preference_set_id";
    option (google.longrunning.operation_info) = {
      response_type: "PreferenceSet"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a preference set.
  rpc UpdatePreferenceSet(UpdatePreferenceSetRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{preference_set.name=projects/*/locations/*/preferenceSets/*}"
      body: "preference_set"
    };
    option (google.api.method_signature) = "preference_set,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "PreferenceSet"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a preference set.
  rpc DeletePreferenceSet(DeletePreferenceSetRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/preferenceSets/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Gets the details of regional settings.
  rpc GetSettings(GetSettingsRequest) returns (Settings) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/settings}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates the regional-level project settings.
  rpc UpdateSettings(UpdateSettingsRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{settings.name=projects/*/locations/*/settings}"
      body: "settings"
    };
    option (google.api.method_signature) = "settings,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Settings"
      metadata_type: "OperationMetadata"
    };
  }

  // Creates a report configuration.
  rpc CreateReportConfig(CreateReportConfigRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/reportConfigs"
      body: "report_config"
    };
    option (google.api.method_signature) =
        "parent,report_config,report_config_id";
    option (google.longrunning.operation_info) = {
      response_type: "ReportConfig"
      metadata_type: "OperationMetadata"
    };
  }

  // Gets details of a single ReportConfig.
  rpc GetReportConfig(GetReportConfigRequest) returns (ReportConfig) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/reportConfigs/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists ReportConfigs in a given project and location.
  rpc ListReportConfigs(ListReportConfigsRequest)
      returns (ListReportConfigsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/reportConfigs"
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes a ReportConfig.
  rpc DeleteReportConfig(DeleteReportConfigRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/reportConfigs/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Creates a report.
  rpc CreateReport(CreateReportRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/reportConfigs/*}/reports"
      body: "report"
    };
    option (google.api.method_signature) = "parent,report,report_id";
    option (google.longrunning.operation_info) = {
      response_type: "Report"
      metadata_type: "OperationMetadata"
    };
  }

  // Gets details of a single Report.
  rpc GetReport(GetReportRequest) returns (Report) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/reportConfigs/*/reports/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists Reports in a given ReportConfig.
  rpc ListReports(ListReportsRequest) returns (ListReportsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/reportConfigs/*}/reports"
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes a Report.
  rpc DeleteReport(DeleteReportRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/reportConfigs/*/reports/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }
}

// An asset represents a resource in your environment. Asset types include
// virtual machines and databases.
message Asset {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/Asset"
    pattern: "projects/{project}/locations/{location}/assets/{asset}"
  };

  // Output only. The full name of the asset.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the asset was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the asset was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Labels as key value pairs.
  map<string, string> labels = 4;

  // Generic asset attributes.
  map<string, string> attributes = 5;

  // The internal information of an asset. Only one field can be specified
  // with different attributes based on the type of the asset.
  oneof AssetDetails {
    // Output only. Asset information specific for virtual and physical
    // machines.
    MachineDetails machine_details = 6
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. The list of insights associated with the asset.
  InsightList insight_list = 20 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Performance data for the asset.
  AssetPerformanceData performance_data = 21
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The list of sources contributing to the asset.
  repeated string sources = 22 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Source"
    }
  ];

  // Output only. The list of groups that the asset is assigned to.
  repeated string assigned_groups = 23 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Group"
    }
  ];
}

// The preferences that apply to all assets in a given context.
message PreferenceSet {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/PreferenceSet"
    pattern: "projects/{project}/locations/{location}/preferenceSets/{preference_set}"
  };

  // Output only. Name of the preference set.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the preference set was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the preference set was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // User-friendly display name. Maximum length is 63 characters.
  string display_name = 4;

  // A description of the preference set.
  string description = 5;

  // A set of preferences that applies to all virtual machines in the context.
  VirtualMachinePreferences virtual_machine_preferences = 6;
}

// A resource that represents the background job that imports asset frames.
message ImportJob {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/ImportJob"
    pattern: "projects/{project}/locations/{location}/importJobs/{import_job}"
  };

  // Enumerates possible states of an import job.
  enum ImportJobState {
    // Default value.
    IMPORT_JOB_STATE_UNSPECIFIED = 0;

    // The import job is pending.
    IMPORT_JOB_STATE_PENDING = 1;

    // The processing of the import job is ongoing.
    IMPORT_JOB_STATE_RUNNING = 2;

    // The import job processing has completed.
    IMPORT_JOB_STATE_COMPLETED = 3;

    // The import job failed to be processed.
    IMPORT_JOB_STATE_FAILED = 4;

    // The import job is being validated.
    IMPORT_JOB_STATE_VALIDATING = 5;

    // The import job contains blocking errors.
    IMPORT_JOB_STATE_FAILED_VALIDATION = 6;

    // The validation of the job completed with no blocking errors.
    IMPORT_JOB_STATE_READY = 7;
  }

  // Output only. The full name of the import job.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // User-friendly display name. Maximum length is 63 characters.
  string display_name = 2;

  // Output only. The timestamp when the import job was created.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the import job was last updated.
  google.protobuf.Timestamp update_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the import job was completed.
  google.protobuf.Timestamp complete_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The state of the import job.
  ImportJobState state = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Labels as key value pairs.
  map<string, string> labels = 7;

  // Required. Reference to a source.
  string asset_source = 8 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Source"
    }
  ];

  // Holds the various report types of an import job.
  oneof report {
    // Output only. The report with the validation results of the import job.
    ValidationReport validation_report = 10
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The report with the results of running the import job.
    ExecutionReport execution_report = 11
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }
}

// A resource that represents a payload file in an import job.
message ImportDataFile {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/ImportDataFile"
    pattern: "projects/{project}/locations/{location}/importJobs/{import_job}/importDataFiles/{import_data_file}"
  };

  // Enumerates possible states of an import data file.
  enum State {
    // Default value.
    STATE_UNSPECIFIED = 0;

    // The data file is being created.
    CREATING = 1;

    // The data file completed initialization.
    ACTIVE = 2;
  }

  // Output only. The name of the file.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // User-friendly display name. Maximum length is 63 characters.
  string display_name = 6;

  // Required. The payload format.
  ImportJobFormat format = 2 [(google.api.field_behavior) = REQUIRED];

  // Output only. The timestamp when the file was created.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The state of the import data file.
  State state = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  oneof file_info {
    // Information about a file that is uploaded to a storage service.
    UploadFileInfo upload_file_info = 5;
  }
}

// A resource that represents an asset group.
// The purpose of an asset group is to bundle a set of assets that have
// something in common, while allowing users to add annotations to the group.
// An asset can belong to multiple groups.
message Group {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/Group"
    pattern: "projects/{project}/locations/{location}/groups/{group}"
  };

  // Output only. The name of the group.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the group was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the group was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Labels as key value pairs.
  map<string, string> labels = 4;

  // User-friendly display name.
  string display_name = 5;

  // The description of the resource.
  string description = 6;
}

// Message representing a frame which failed to be processed due to an error.
message ErrorFrame {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/ErrorFrame"
    pattern: "projects/{project}/locations/{location}/sources/{source}/errorFrames/{error_frame}"
  };

  // Output only. The identifier of the ErrorFrame.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. All the violations that were detected for the frame.
  repeated FrameViolationEntry violations = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The frame that was originally reported.
  AssetFrame original_frame = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Frame ingestion time.
  google.protobuf.Timestamp ingestion_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Source represents an object from which asset information is
// streamed to Migration Center.
message Source {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/Source"
    pattern: "projects/{project}/locations/{location}/sources/{source}"
  };

  enum SourceType {
    // Unspecified
    SOURCE_TYPE_UNKNOWN = 0;

    // Manually uploaded file (e.g. CSV)
    SOURCE_TYPE_UPLOAD = 1;

    // Guest-level info
    SOURCE_TYPE_GUEST_OS_SCAN = 2;

    // Inventory-level scan
    SOURCE_TYPE_INVENTORY_SCAN = 3;

    // Third-party owned sources.
    SOURCE_TYPE_CUSTOM = 4;
  }

  // Enumerates possible states of a source.
  enum State {
    // Unspecified.
    STATE_UNSPECIFIED = 0;

    // The source is active and ready to be used.
    ACTIVE = 1;

    // In the process of being deleted.
    DELETING = 2;

    // Source is in an invalid state. Asset frames reported to it will be
    // ignored.
    INVALID = 3;
  }

  // Output only. The full name of the source.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the source was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the source was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // User-friendly display name.
  string display_name = 4;

  // Free-text description.
  string description = 5;

  // Data source type.
  SourceType type = 6;

  // The information confidence of the source.
  // The higher the value, the higher the confidence.
  int32 priority = 7;

  // If `true`, the source is managed by other service(s).
  bool managed = 8;

  // Output only. Number of frames that are still being processed.
  int32 pending_frame_count = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The number of frames that were reported by the source and
  // contained errors.
  int32 error_frame_count = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The state of the source.
  State state = 11 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// The groups and associated preference sets on which
// we can generate reports.
message ReportConfig {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/ReportConfig"
    pattern: "projects/{project}/locations/{location}/reportConfigs/{report_config}"
  };

  // Represents a combination of a group with a preference set.
  message GroupPreferenceSetAssignment {
    // Required. Name of the group.
    string group = 1 [
      (google.api.field_behavior) = REQUIRED,
      (google.api.resource_reference) = {
        type: "migrationcenter.googleapis.com/Group"
      }
    ];

    // Required. Name of the Preference Set.
    string preference_set = 2 [
      (google.api.field_behavior) = REQUIRED,
      (google.api.resource_reference) = {
        type: "migrationcenter.googleapis.com/PreferenceSet"
      }
    ];
  }

  // Output only. Name of resource.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the resource was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp when the resource was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // User-friendly display name. Maximum length is 63 characters.
  string display_name = 4;

  // Free-text description.
  string description = 5;

  // Required. Collection of combinations of groups and preference sets.
  repeated GroupPreferenceSetAssignment group_preferenceset_assignments = 6
      [(google.api.field_behavior) = REQUIRED];
}

// Report represents a point-in-time rendering of the ReportConfig results.
message Report {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/Report"
    pattern: "projects/{project}/locations/{location}/reportConfigs/{report_config}/reports/{report}"
  };

  // Report type.
  enum Type {
    // Default Report type.
    TYPE_UNSPECIFIED = 0;

    // Total cost of ownership Report type.
    TOTAL_COST_OF_OWNERSHIP = 1;
  }

  // Report creation state.
  enum State {
    // Default Report creation state.
    STATE_UNSPECIFIED = 0;

    // Creating Report.
    PENDING = 1;

    // Successfully created Report.
    SUCCEEDED = 2;

    // Failed to create Report.
    FAILED = 3;
  }

  // Output only. Name of resource.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Creation timestamp.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Last update timestamp.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // User-friendly display name. Maximum length is 63 characters.
  string display_name = 4;

  // Free-text description.
  string description = 5;

  // Report type.
  Type type = 6;

  // Report creation state.
  State state = 7;

  // Output only. Summary view of the Report.
  ReportSummary summary = 8 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Represents the metadata of the long-running operation.
message OperationMetadata {
  // Output only. The time the operation was created.
  google.protobuf.Timestamp create_time = 1
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time the operation finished running.
  google.protobuf.Timestamp end_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Server-defined resource path for the target of the operation.
  string target = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Name of the verb executed by the operation.
  string verb = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Human-readable status of the operation, if any.
  string status_message = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Identifies whether the user has requested cancellation
  // of the operation. Operations that have been cancelled successfully
  // have [Operation.error][] value with a
  // [google.rpc.Status.code][google.rpc.Status.code] of 1, corresponding to
  // `Code.CANCELLED`.
  bool requested_cancellation = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. API version used to start the operation.
  string api_version = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Message for requesting a list of assets.
message ListAssetsRequest {
  // Required. Parent value for `ListAssetsRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Asset"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Filtering results.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;

  // View of the assets. Defaults to BASIC.
  AssetView view = 6;
}

// Response message for listing assets.
message ListAssetsResponse {
  // A list of assets.
  repeated Asset assets = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Message for getting a Asset.
message GetAssetRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Asset"
    }
  ];

  // View of the assets. Defaults to BASIC.
  AssetView view = 2;
}

// A request to update an asset.
message UpdateAssetRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `Asset` resource by the update.
  // The values specified in the `update_mask` field are relative to the
  // resource, not the full request.
  // A field will be overwritten if it is in the mask.
  // A single * value in the mask lets you to overwrite all fields.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The resource being updated.
  Asset asset = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to update a list of assets.
message BatchUpdateAssetsRequest {
  // Required. Parent value for batch asset update.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Asset"
    }
  ];

  // Required. The request message specifying the resources to update.
  // A maximum of 1000 assets can be modified in a batch.
  repeated UpdateAssetRequest requests = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Response for updating a list of assets.
message BatchUpdateAssetsResponse {
  // Update asset content.
  // The content only includes values after field mask being applied.
  repeated Asset assets = 1;
}

// A request to delete an asset.
message DeleteAssetRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Asset"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to delete a list of  asset.
message BatchDeleteAssetsRequest {
  // Required. Parent value for batch asset delete.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Asset"
    }
  ];

  // Required. The IDs of the assets to delete.
  // A maximum of 1000 assets can be deleted in a batch.
  // Format: projects/{project}/locations/{location}/assets/{name}.
  repeated string names = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Asset"
    }
  ];

  // Optional. When this value is set to `true` the request is a no-op for
  // non-existing assets. See https://google.aip.dev/135#delete-if-existing for
  // additional details. Default value is `false`.
  bool allow_missing = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to report a set of asset frames.
message ReportAssetFramesRequest {
  // Required. Parent of the resource.
  string parent = 1 [(google.api.field_behavior) = REQUIRED];

  // Collection of frames data.
  Frames frames = 2;

  // Required. Reference to a source.
  string source = 3 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Source"
    }
  ];
}

// A response to a call to `ReportAssetFrame`.
message ReportAssetFramesResponse {}

// A request to aggregate one or more values.
message AggregateAssetsValuesRequest {
  // Required. Parent value for `AggregateAssetsValuesRequest`.
  string parent = 1 [(google.api.field_behavior) = REQUIRED];

  // Array of aggregations to perform.
  // Up to 25 aggregations can be defined.
  repeated Aggregation aggregations = 2;

  // The aggregation will be performed on assets that match the provided filter.
  string filter = 3;
}

// A response to a request to aggregated assets values.
message AggregateAssetsValuesResponse {
  // The aggregation results.
  repeated AggregationResult results = 1;
}

// A request to create an import job.
message CreateImportJobRequest {
  // Required. Value for parent.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/ImportJob"
    }
  ];

  // Required. ID of the import job.
  string import_job_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The resource being created.
  ImportJob import_job = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to list import jobs.
message ListImportJobsRequest {
  // Required. Parent value for `ListImportJobsRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/ImportJob"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Filtering results.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;

  // Optional. The level of details of each import job.
  // Default value is BASIC.
  ImportJobView view = 6 [(google.api.field_behavior) = OPTIONAL];
}

// A response for listing import jobs.
message ListImportJobsResponse {
  // The list of import jobs.
  repeated ImportJob import_jobs = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// A request to get an import job.
message GetImportJobRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ImportJob"
    }
  ];

  // Optional. The level of details of the import job.
  // Default value is FULL.
  ImportJobView view = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to delete an import job.
message DeleteImportJobRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ImportJob"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to `true`, any `ImportDataFiles` of this job will also be
  // deleted If set to `false`, the request only works if the job has no data
  // files.
  bool force = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to update an import job.
message UpdateImportJobRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `Asset` resource by the update.
  // The values specified in the `update_mask` field are relative to the
  // resource, not the full request.
  // A field will be overwritten if it is in the mask.
  // A single * value in the mask lets you to overwrite all fields.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The resource being updated
  ImportJob import_job = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to validate an import job.
message ValidateImportJobRequest {
  // Required. The name of the import job to validate.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ImportJob"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to run an import job.
message RunImportJobRequest {
  // Required. The name of the import job to run.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ImportJob"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to get an import data file.
message GetImportDataFileRequest {
  // Required. Name of the ImportDataFile.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ImportDataFile"
    }
  ];
}

// A request to list import data files of an import job.
message ListImportDataFilesRequest {
  // Required. Name of the parent of the `ImportDataFiles` resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/ImportDataFile"
    }
  ];

  // The maximum number of data files to return. The service may return
  // fewer than this value. If unspecified, at most 500 data files will be
  // returned. The maximum value is 1000; values above 1000 will be coerced to
  // 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListImportDataFiles` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListImportDataFiles`
  // must match the call that provided the page token.
  string page_token = 3;

  // Filtering results.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;
}

// Response for listing payload files of an import job.
message ListImportDataFilesResponse {
  // The list of import data files.
  repeated ImportDataFile import_data_files = 1;

  // A token that can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// A request to create an `ImportDataFile` resource.
message CreateImportDataFileRequest {
  // Required. Name of the parent of the ImportDataFile.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/ImportDataFile"
    }
  ];

  // Required. The ID of the new data file.
  string import_data_file_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The resource being created.
  ImportDataFile import_data_file = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to delete an `ImportDataFile` resource.
message DeleteImportDataFileRequest {
  // Required. Name of the ImportDataFile to delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ImportDataFile"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to list groups.
message ListGroupsRequest {
  // Required. Parent value for `ListGroupsRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Group"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Filtering results.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;
}

// A response for listing groups.
message ListGroupsResponse {
  // The list of Group
  repeated Group groups = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// A request to get a group.
message GetGroupRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Group"
    }
  ];
}

// A request to create a group.
message CreateGroupRequest {
  // Required. Value for parent.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Group"
    }
  ];

  // Required. User specified ID for the group. It will become the last
  // component of the group name. The ID must be unique within the project, must
  // conform with RFC-1034, is restricted to lower-cased letters, and has a
  // maximum length of 63 characters. The ID must match the regular expression:
  // `[a-z]([a-z0-9-]{0,61}[a-z0-9])?`.
  string group_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The group resource being created.
  Group group = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to update a group.
message UpdateGroupRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `Group` resource by the update.
  // The values specified in the `update_mask` are relative to the resource, not
  // the full request. A field will be overwritten if it is in the mask.
  // A single * value in the mask lets you to overwrite all fields.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The group resource being updated.
  Group group = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to delete a group.
message DeleteGroupRequest {
  // Required. Name of the group resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Group"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to add assets to a group.
message AddAssetsToGroupRequest {
  // Required. Group reference.
  string group = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Group"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];

  // Required. List of assets to be added.
  // The maximum number of assets that can be added in a single request is
  // 1000.
  AssetList assets = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. When this value is set to `false` and one of the given assets is
  // already an existing member of the group, the operation fails with an
  // `Already Exists` error. When set to `true` this situation is silently
  // ignored by the server.
  //
  // Default value is `false`.
  bool allow_existing = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to remove assets from a group.
message RemoveAssetsFromGroupRequest {
  // Required. Group reference.
  string group = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Group"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];

  // Required. List of assets to be removed.
  // The maximum number of assets that can be removed in a single request is
  // 1000.
  AssetList assets = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. When this value is set to `false` and one of the given assets is
  // not an existing member of the group, the operation fails with a `Not Found`
  // error. When set to `true` this situation is silently ignored by the server.
  //
  // Default value is `false`.
  bool allow_missing = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to list error frames for a source.
message ListErrorFramesRequest {
  // Required. Parent value (the source) for `ListErrorFramesRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/ErrorFrame"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Optional. An optional view mode to control the level of details of each
  // error frame. The default is a BASIC frame view.
  ErrorFrameView view = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A response for listing error frames.
message ListErrorFramesResponse {
  // The list of error frames.
  repeated ErrorFrame error_frames = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

message GetErrorFrameRequest {
  // Required. The name of the frame to retrieve.
  // Format:
  // projects/{project}/locations/{location}/sources/{source}/errorFrames/{error_frame}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ErrorFrame"
    }
  ];

  // Optional. An optional view mode to control the level of details for the
  // frame. The default is a basic frame view.
  ErrorFrameView view = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request for a list of sources.
message ListSourcesRequest {
  // Required. Parent value for `ListSourcesRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Source"
    }
  ];

  // Requested page size. The server may return fewer items than requested.
  // If unspecified, the server will pick an appropriate default value.
  int32 page_size = 2;

  // A token identifying a page of results that the server should return.
  string page_token = 3;

  // Filtering results.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;
}

// Response message for listing sources.
message ListSourcesResponse {
  // The list of sources.
  repeated Source sources = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// A request to get a source.
message GetSourceRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Source"
    }
  ];
}

// A request to create a source.
message CreateSourceRequest {
  // Required. Value for parent.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Source"
    }
  ];

  // Required. User specified ID for the source. It will become the last
  // component of the source name. The ID must be unique within the project,
  // must conform with RFC-1034, is restricted to lower-cased letters, and has a
  // maximum length of 63 characters. The ID must match the regular expression:
  // `[a-z]([a-z0-9-]{0,61}[a-z0-9])?`.
  string source_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The resource being created.
  Source source = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to update a source.
message UpdateSourceRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `Source` resource by the update.
  // The values specified in the `update_mask` field are relative to the
  // resource, not the full request.
  // A field will be overwritten if it is in the mask.
  // A single * value in the mask lets you to overwrite all fields.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The resource being updated
  Source source = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to delete a source.
message DeleteSourceRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Source"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Request for listing preference sets.
message ListPreferenceSetsRequest {
  // Required. Parent value for `ListPreferenceSetsRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/PreferenceSet"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, at most 500 preference sets will be returned.
  // The maximum value is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;
}

// Response message for listing preference sets.
message ListPreferenceSetsResponse {
  // The list of PreferenceSets
  repeated PreferenceSet preference_sets = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// A request to get a preference set.
message GetPreferenceSetRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/PreferenceSet"
    }
  ];
}

// A request to create a preference set.
message CreatePreferenceSetRequest {
  // Required. Value for parent.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/PreferenceSet"
    }
  ];

  // Required. User specified ID for the preference set. It will become the last
  // component of the preference set name. The ID must be unique within the
  // project, must conform with RFC-1034, is restricted to lower-cased letters,
  // and has a maximum length of 63 characters. The ID must match the regular
  // expression
  // `[a-z]([a-z0-9-]{0,61}[a-z0-9])?`.
  string preference_set_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The preference set resource being created.
  PreferenceSet preference_set = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to update a preference set.
message UpdatePreferenceSetRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `PreferenceSet` resource by the update.
  // The values specified in the `update_mask` field are relative to the
  // resource, not the full request.
  // A field will be overwritten if it is in the mask.
  // A single * value in the mask lets you to overwrite all fields.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The preference set resource being updated.
  PreferenceSet preference_set = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to delete a preference set.
message DeletePreferenceSetRequest {
  // Required. Name of the group resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/PreferenceSet"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to get the settings.
message GetSettingsRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Settings"
    }
  ];
}

// A request to update the settings.
message UpdateSettingsRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `Settings` resource by the update.
  // The values specified in the `update_mask` field are relative to the
  // resource, not the full request.
  // A field will be overwritten if it is in the mask.
  // A single * value in the mask lets you to overwrite all fields.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The project settings resource being updated.
  Settings settings = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to create a `ReportConfig` resource.
message CreateReportConfigRequest {
  // Required. Value for parent.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/ReportConfig"
    }
  ];

  // Required. User specified ID for the report config. It will become the last
  // component of the report config name. The ID must be unique within the
  // project, must conform with RFC-1034, is restricted to lower-cased letters,
  // and has a maximum length of 63 characters. The ID must match the regular
  // expression: [a-z]([a-z0-9-]{0,61}[a-z0-9])?.
  string report_config_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The report config set resource being created.
  ReportConfig report_config = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// A request to delete a ReportConfig.
message DeleteReportConfigRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ReportConfig"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to `true`, any child `Reports` of this entity will also be
  // deleted. If set to `false`, the request only works if the resource has no
  // children.
  bool force = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A request to get a Report.
message GetReportRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Report"
    }
  ];

  // Determines what information to retrieve for the Report.
  ReportView view = 6;
}

// A request for a list of Reports.
message ListReportsRequest {
  // Required. Parent value for `ListReportsRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Report"
    }
  ];

  // Requested page size. The server may return fewer items than requested.
  // If unspecified, the server will pick an appropriate default value.
  int32 page_size = 2;

  // A token identifying a page of results that the server should return.
  string page_token = 3;

  // Filtering results.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;

  // Determines what information to retrieve for each Report.
  ReportView view = 6;
}

// Response message for listing Reports.
message ListReportsResponse {
  // The list of Reports.
  repeated Report reports = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// A request to delete a Report.
message DeleteReportRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Report"
    }
  ];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to get a `ReportConfig` resource.
message GetReportConfigRequest {
  // Required. Name of the resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/ReportConfig"
    }
  ];
}

// A request to get a list of `ReportConfig` resources.
message ListReportConfigsRequest {
  // Required. Parent value for `ListReportConfigsRequest`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/ReportConfig"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Filtering results.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;
}

// Response message for listing report configs.
message ListReportConfigsResponse {
  // A list of report configs.
  repeated ReportConfig report_configs = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Message for creating a Report.
message CreateReportRequest {
  // Required. Value for parent.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "migrationcenter.googleapis.com/Report"
    }
  ];

  // Required. User specified id for the report. It will become the last
  // component of the report name. The id must be unique within the project,
  // must conform with RFC-1034, is restricted to lower-cased letters, and has a
  // maximum length of 63 characters. The id must match the regular expression:
  // [a-z]([a-z0-9-]{0,61}[a-z0-9])?.
  string report_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The report resource being created.
  Report report = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional request ID to identify requests. Specify a unique
  // request ID so that if you must retry your request, the server will know to
  // ignore the request if it has already been completed. The server will
  // guarantee that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, will ignore the second request. This prevents
  // clients from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// Collection of frame data.
message Frames {
  // A repeated field of asset data.
  repeated AssetFrame frames_data = 1;
}

// Contains data reported from an inventory source on an asset.
message AssetFrame {
  // The internal data of the frame is a oneof field depending on the type
  // of asset information in the frame.
  oneof FrameData {
    // Asset information specific for virtual machines.
    MachineDetails machine_details = 1;
  }

  // The time the data was reported.
  google.protobuf.Timestamp report_time = 10;

  // Labels as key value pairs.
  map<string, string> labels = 11;

  // Generic asset attributes.
  map<string, string> attributes = 12;

  // Asset performance data samples.
  repeated PerformanceSample performance_samples = 13;

  // Optional. Trace token is optionally provided to assist with debugging and
  // traceability.
  string trace_token = 14 [(google.api.field_behavior) = OPTIONAL];
}

// Details of a machine.
message MachineDetails {
  // Machine power state.
  enum PowerState {
    // Power state is unknown.
    POWER_STATE_UNSPECIFIED = 0;

    // The machine is preparing to enter the ACTIVE state. An instance may enter
    // the PENDING state when it launches for the first time, or when it is
    // started after being in the SUSPENDED state.
    PENDING = 1;

    // The machine is active.
    ACTIVE = 2;

    // The machine is being turned off.
    SUSPENDING = 3;

    // The machine is off.
    SUSPENDED = 4;

    // The machine is being deleted from the hosting platform.
    DELETING = 5;

    // The machine is deleted from the hosting platform.
    DELETED = 6;
  }

  // Machine unique identifier.
  string uuid = 1;

  // Machine name.
  string machine_name = 2;

  // Machine creation time.
  google.protobuf.Timestamp create_time = 3;

  // Number of CPU cores in the machine. Must be non-negative.
  int32 core_count = 4;

  // The amount of memory in the machine. Must be non-negative.
  int32 memory_mb = 5;

  // Power state of the machine.
  PowerState power_state = 6;

  // Architecture details (vendor, CPU architecture).
  MachineArchitectureDetails architecture = 7;

  // Guest OS information.
  GuestOsDetails guest_os = 8;

  // Network details.
  MachineNetworkDetails network = 9;

  // Disk details.
  MachineDiskDetails disks = 10;

  // Platform specific information.
  PlatformDetails platform = 11;
}

// Details of the machine architecture.
message MachineArchitectureDetails {
  // Firmware type.
  enum FirmwareType {
    // Unspecified or unknown.
    FIRMWARE_TYPE_UNSPECIFIED = 0;

    // BIOS firmware.
    BIOS = 1;

    // EFI firmware.
    EFI = 2;
  }

  // CPU hyper-threading support.
  enum CpuHyperThreading {
    // Unspecified or unknown.
    CPU_HYPER_THREADING_UNSPECIFIED = 0;

    // Hyper-threading is disabled.
    DISABLED = 1;

    // Hyper-threading is enabled.
    ENABLED = 2;
  }

  // CPU architecture, e.g., "x64-based PC", "x86_64", "i686" etc.
  string cpu_architecture = 1;

  // CPU name, e.g., "Intel Xeon E5-2690", "AMD EPYC 7571" etc.
  string cpu_name = 2;

  // Hardware vendor.
  string vendor = 3;

  // Number of CPU threads allocated to the machine.
  int32 cpu_thread_count = 4;

  // Number of processor sockets allocated to the machine.
  int32 cpu_socket_count = 5;

  // BIOS Details.
  BiosDetails bios = 6;

  // Firmware type.
  FirmwareType firmware_type = 7;

  // CPU hyper-threading support.
  CpuHyperThreading hyperthreading = 8;
}

// Details about the BIOS.
message BiosDetails {
  // BIOS name.
  string bios_name = 1;

  // BIOS ID.
  string id = 2;

  // BIOS manufacturer.
  string manufacturer = 3;

  // BIOS version.
  string version = 4;

  // BIOS release date.
  google.type.Date release_date = 5;

  // SMBIOS UUID.
  string smbios_uuid = 6;
}

// Details of network adapters and settings.
message MachineNetworkDetails {
  // The primary IP address of the machine.
  string primary_ip_address = 1;

  // The public IP address of the machine.
  string public_ip_address = 2;

  // MAC address of the machine.
  // This property is used to uniqly identify the machine.
  string primary_mac_address = 3;

  // List of network adapters.
  NetworkAdapterList adapters = 4;
}

// List of network adapters.
message NetworkAdapterList {
  // Network adapter entries.
  repeated NetworkAdapterDetails entries = 1;
}

// Details of network adapter.
message NetworkAdapterDetails {
  // Network adapter type (e.g. VMXNET3).
  string adapter_type = 1;

  // MAC address.
  string mac_address = 2;

  // NetworkAddressList
  NetworkAddressList addresses = 3;
}

// List of allocated/assigned network addresses.
message NetworkAddressList {
  // Network address entries.
  repeated NetworkAddress entries = 1;
}

// Details of network address.
message NetworkAddress {
  // Network address assignment.
  enum AddressAssignment {
    // Unknown (default value).
    ADDRESS_ASSIGNMENT_UNSPECIFIED = 0;

    // Staticly assigned IP.
    ADDRESS_ASSIGNMENT_STATIC = 1;

    // Dynamically assigned IP (DHCP).
    ADDRESS_ASSIGNMENT_DHCP = 2;
  }

  // Assigned or configured IP Address.
  string ip_address = 1;

  // Subnet mask.
  string subnet_mask = 2;

  // Broadcast address.
  string bcast = 3;

  // Fully qualified domain name.
  string fqdn = 4;

  // Whether DHCP is used to assign addresses.
  AddressAssignment assignment = 5;
}

// Details of machine disks.
message MachineDiskDetails {
  // Disk total Capacity.
  int64 total_capacity_bytes = 1;

  // Total disk free space.
  int64 total_free_bytes = 2;

  // List of disks.
  DiskEntryList disks = 3;
}

// VM disks.
message DiskEntryList {
  // Disk entries.
  repeated DiskEntry entries = 1;
}

// Single disk entry.
message DiskEntry {
  // Disks interface type.
  enum InterfaceType {
    // Interface type unknown or unspecified.
    INTERFACE_TYPE_UNSPECIFIED = 0;

    // IDE interface type.
    IDE = 1;

    // SATA interface type.
    SATA = 2;

    // SAS interface type.
    SAS = 3;

    // SCSI interface type.
    SCSI = 4;

    // NVME interface type.
    NVME = 5;

    // FC interface type.
    FC = 6;

    // iSCSI interface type.
    ISCSI = 7;
  }

  // Disk capacity.
  int64 capacity_bytes = 1;

  // Disk free space.
  int64 free_bytes = 2;

  // Disk label.
  string disk_label = 3;

  // Disk label type (e.g. BIOS/GPT)
  string disk_label_type = 4;

  // Disks interface type.
  InterfaceType interface_type = 5;

  // Partition layout.
  DiskPartitionList partitions = 6;

  // Disk hardware address (e.g. 0:1 for SCSI).
  string hw_address = 7;

  // Additional details for specific platforms.
  oneof platform_specific {
    // VMware disk details.
    VmwareDiskConfig vmware = 20;
  }
}

// Disk partition list.
message DiskPartitionList {
  // Partition entries.
  repeated DiskPartition entries = 1;
}

// Disk Partition details.
message DiskPartition {
  // Partition type.
  string type = 1;

  // Partition file system.
  string file_system = 2;

  // Mount pount (Linux/Windows) or drive letter (Windows).
  string mount_point = 3;

  // Partition capacity.
  int64 capacity_bytes = 4;

  // Partition free space.
  int64 free_bytes = 5;

  // Partition UUID.
  string uuid = 6;

  // Sub-partitions.
  DiskPartitionList sub_partitions = 7;
}

// VMware disk config details.
message VmwareDiskConfig {
  // VMDK backing type possible values.
  enum BackingType {
    // Default value.
    BACKING_TYPE_UNSPECIFIED = 0;

    // Flat v1.
    BACKING_TYPE_FLAT_V1 = 1;

    // Flat v2.
    BACKING_TYPE_FLAT_V2 = 2;

    // Persistent memory, also known as Non-Volatile Memory (NVM).
    BACKING_TYPE_PMEM = 3;

    // Raw Disk Memory v1.
    BACKING_TYPE_RDM_V1 = 4;

    // Raw Disk Memory v2.
    BACKING_TYPE_RDM_V2 = 5;

    // SEsparse is a snapshot format introduced in vSphere 5.5 for large disks.
    BACKING_TYPE_SESPARSE = 6;

    // SEsparse v1.
    BACKING_TYPE_SESPARSE_V1 = 7;

    // SEsparse v1.
    BACKING_TYPE_SESPARSE_V2 = 8;
  }

  // VMDK disk mode.
  enum VmdkMode {
    // VMDK disk mode unspecified or unknown.
    VMDK_MODE_UNSPECIFIED = 0;

    // Dependent disk mode.
    DEPENDENT = 1;

    // Independent - Persistent disk mode.
    INDEPENDENT_PERSISTENT = 2;

    // Independent - Nonpersistent disk mode.
    INDEPENDENT_NONPERSISTENT = 3;
  }

  // RDM compatibility mode.
  enum RdmCompatibility {
    // Compatibility mode unspecified or unknown.
    RDM_COMPATIBILITY_UNSPECIFIED = 0;

    // Physical compatibility mode.
    PHYSICAL_COMPATIBILITY = 1;

    // Virtual compatibility mode.
    VIRTUAL_COMPATIBILITY = 2;
  }

  // VMDK backing type.
  BackingType backing_type = 1;

  // Is VMDK shared with other VMs.
  bool shared = 2;

  // VMDK disk mode.
  VmdkMode vmdk_mode = 3;

  // RDM compatibility mode.
  RdmCompatibility rdm_compatibility = 4;
}

// Information from Guest-level collections.
message GuestOsDetails {
  // The name of the operating system.
  string os_name = 1;

  // What family the OS belong to, if known.
  OperatingSystemFamily family = 2;

  // The version of the operating system.
  string version = 3;

  // OS and app configuration.
  GuestConfigDetails config = 4;

  // Runtime information.
  GuestRuntimeDetails runtime = 5;
}

// Guest OS config information.
message GuestConfigDetails {
  // Security-Enhanced Linux (SELinux) mode.
  enum SeLinuxMode {
    // SELinux mode unknown or unspecified.
    SE_LINUX_MODE_UNSPECIFIED = 0;

    // SELinux is disabled.
    SE_LINUX_MODE_DISABLED = 1;

    // SELinux permissive mode.
    SE_LINUX_MODE_PERMISSIVE = 2;

    // SELinux enforcing mode.
    SE_LINUX_MODE_ENFORCING = 3;
  }

  // OS issue (typically /etc/issue in Linux).
  string issue = 1;

  // Mount list (Linux fstab).
  FstabEntryList fstab = 2;

  // Hosts file (/etc/hosts).
  HostsEntryList hosts = 3;

  // NFS exports.
  NfsExportList nfs_exports = 4;

  // Security-Enhanced Linux (SELinux) mode.
  SeLinuxMode selinux_mode = 5;
}

// Fstab content.
message FstabEntryList {
  // Fstab entries.
  repeated FstabEntry entries = 1;
}

// Single fstab entry.
message FstabEntry {
  // The block special device or remote filesystem to be mounted.
  string spec = 1;

  // The mount point for the filesystem.
  string file = 2;

  // The type of the filesystem.
  string vfstype = 3;

  // Mount options associated with the filesystem.
  string mntops = 4;

  // Used by dump to determine which filesystems need to be dumped.
  int32 freq = 5;

  // Used by the fsck(8) program to determine the order in which filesystem
  // checks are done at reboot time.
  int32 passno = 6;
}

// Hosts content.
message HostsEntryList {
  // Hosts entries.
  repeated HostsEntry entries = 1;
}

// Single /etc/hosts entry.
message HostsEntry {
  // IP (raw, IPv4/6 agnostic).
  string ip = 1;

  // List of host names / aliases.
  repeated string host_names = 2;
}

// NFS exports.
message NfsExportList {
  // NFS export entries.
  repeated NfsExport entries = 1;
}

// NFS export.
message NfsExport {
  // The directory being exported.
  string export_directory = 1;

  // The hosts or networks to which the export is being shared.
  repeated string hosts = 2;
}

// Guest OS runtime information.
message GuestRuntimeDetails {
  // Running background services.
  RunningServiceList services = 1;

  // Running processes.
  RunningProcessList processes = 2;

  // Runtime network information (connections, ports).
  RuntimeNetworkInfo network = 3;

  // Last time the OS was booted.
  google.protobuf.Timestamp last_boot_time = 4;

  // Domain, e.g. c.stratozone-development.internal.
  string domain = 5;

  // Machine name.
  string machine_name = 6;

  // Installed applications information.
  GuestInstalledApplicationList installed_apps = 7;

  // Open files information.
  OpenFileList open_file_list = 8;
}

// List of running guest OS services.
message RunningServiceList {
  // Running service entries.
  repeated RunningService entries = 1;
}

// Guest OS running service details.
message RunningService {
  // Service state (OS-agnostic).
  enum State {
    // Service state unspecified.
    STATE_UNSPECIFIED = 0;

    // Service is active.
    ACTIVE = 1;

    // Service is paused.
    PAUSED = 2;

    // Service is stopped.
    STOPPED = 3;
  }

  // Service start mode (OS-agnostic).
  enum StartMode {
    // Start mode unspecified.
    START_MODE_UNSPECIFIED = 0;

    // The service is a device driver started by the system loader.
    BOOT = 1;

    // The service is a device driver started by the IOInitSystem function.
    SYSTEM = 2;

    // The service is started by the operating system, at system start-up
    AUTO = 3;

    // The service is started only manually, by a user.
    MANUAL = 4;

    // The service is disabled.
    DISABLED = 5;
  }

  // Service name.
  string service_name = 1;

  // Service state (OS-agnostic).
  State state = 2;

  // Service start mode (OS-agnostic).
  StartMode start_mode = 3;

  // Service binary path.
  string exe_path = 4;

  // Service command line.
  string cmdline = 5;

  // Service pid.
  int64 pid = 6;
}

// List of running guest OS processes.
message RunningProcessList {
  // Running process entries.
  repeated RunningProcess entries = 1;
}

// Guest OS running process details.
message RunningProcess {
  // Process ID.
  int64 pid = 1;

  // Process binary path.
  string exe_path = 2;

  // Process full command line.
  string cmdline = 3;

  // User running the process.
  string user = 4;

  // Process extended attributes.
  map<string, string> attributes = 100;
}

// Runtime networking information.
message RuntimeNetworkInfo {
  // Time of the last network scan.
  google.protobuf.Timestamp scan_time = 1;

  // Network connections.
  NetworkConnectionList connections = 2;
}

// Network connection list.
message NetworkConnectionList {
  // Network connection entries.
  repeated NetworkConnection entries = 1;
}

message NetworkConnection {
  // Network connection state.
  enum State {
    // Connection state is unknown or unspecified.
    STATE_UNSPECIFIED = 0;

    // The connection is being opened.
    OPENING = 1;

    // The connection is open.
    OPEN = 2;

    // Listening for incoming connections.
    LISTEN = 3;

    // The connection is being closed.
    CLOSING = 4;

    // The connection is closed.
    CLOSED = 5;
  }

  // Connection protocol (e.g. TCP/UDP).
  string protocol = 1;

  // Local IP address.
  string local_ip_address = 2;

  // Local port.
  int32 local_port = 3;

  // Remote IP address.
  string remote_ip_address = 4;

  // Remote port.
  int32 remote_port = 5;

  // Network connection state.
  State state = 6;

  // Process ID.
  int64 pid = 7;

  // Process or service name.
  string process_name = 8;
}

// Guest installed application list.
message GuestInstalledApplicationList {
  // Application entries.
  repeated GuestInstalledApplication entries = 1;
}

// Guest installed application information.
message GuestInstalledApplication {
  // Installed application name.
  string application_name = 1;

  // Installed application vendor.
  string vendor = 2;

  // The time when the application was installed.
  google.protobuf.Timestamp install_time = 3;

  // Source path.
  string path = 4;

  // Installed application version.
  string version = 5;
}

// Open file list.
message OpenFileList {
  // Open file details entries.
  repeated OpenFileDetails entries = 1;
}

// Open file Information.
message OpenFileDetails {
  // Opened file command.
  string command = 1;

  // Opened file user.
  string user = 2;

  // Opened file file type.
  string file_type = 3;

  // Opened file file path.
  string file_path = 4;
}

// Information about the platform.
message PlatformDetails {
  oneof vendor_details {
    // VMware specific details.
    VmwarePlatformDetails vmware_details = 1;

    // AWS EC2 specific details.
    AwsEc2PlatformDetails aws_ec2_details = 2;

    // Azure VM specific details.
    AzureVmPlatformDetails azure_vm_details = 3;

    // Generic platform details.
    GenericPlatformDetails generic_details = 4;

    // Physical machines platform details.
    PhysicalPlatformDetails physical_details = 5;
  }
}

// VMware specific details.
message VmwarePlatformDetails {
  // vCenter version.
  string vcenter_version = 1;

  // ESX version.
  string esx_version = 2;

  // VMware os enum -
  // https://vdc-repo.vmware.com/vmwb-repository/dcr-public/da47f910-60ac-438b-8b9b-6122f4d14524/16b7274a-bf8b-4b4c-a05e-746f2aa93c8c/doc/vim.vm.GuestOsDescriptor.GuestOsIdentifier.html.
  string osid = 3;

  // Folder name in vCenter where asset resides.
  string vcenter_folder = 4;

  // vCenter URI used in collection.
  string vcenter_uri = 5;

  // vCenter VM ID.
  string vcenter_vm_id = 6;
}

// AWS EC2 specific details.
message AwsEc2PlatformDetails {
  // AWS platform's machine type label.
  string machine_type_label = 1;

  // The location of the machine in the AWS format.
  string location = 2;
}

// Azure VM specific details.
message AzureVmPlatformDetails {
  // Azure platform's machine type label.
  string machine_type_label = 1;

  // The location of the machine in the Azure format.
  string location = 2;

  // Azure platform's provisioning state.
  string provisioning_state = 3;
}

// Generic platform details.
message GenericPlatformDetails {
  // Free text representation of the machine location.
  // The format of this field should not be relied on. Different VMs in the same
  // location may have different string values for this field.
  string location = 1;
}

// Platform specific details for Physical Machines.
message PhysicalPlatformDetails {
  // Free text representation of the machine location.
  // The format of this field should not be relied on. Different machines in the
  // same location may have different string values for this field.
  string location = 1;
}

// Memory usage sample.
message MemoryUsageSample {
  // Percentage of system memory utilized. Must be in the interval [0, 100].
  float utilized_percentage = 1;
}

// CPU usage sample.
message CpuUsageSample {
  // Percentage of total CPU capacity utilized. Must be in the interval [0,
  // 100]. On most systems can be calculated using 100 - idle percentage.
  float utilized_percentage = 1;
}

// Network usage sample. Values are across all network interfaces.
message NetworkUsageSample {
  // Average network ingress in B/s sampled over a short window.
  // Must be non-negative.
  float average_ingress_bps = 1;

  // Average network egress in B/s sampled over a short window.
  // Must be non-negative.
  float average_egress_bps = 2;
}

// Disk usage sample. Values are across all disks.
message DiskUsageSample {
  // Average IOPS sampled over a short window. Must be non-negative.
  float average_iops = 1;
}

// Performance data sample.
message PerformanceSample {
  // Time the sample was collected.
  google.protobuf.Timestamp sample_time = 1;

  // Memory usage sample.
  MemoryUsageSample memory = 2;

  // CPU usage sample.
  CpuUsageSample cpu = 3;

  // Network usage sample.
  NetworkUsageSample network = 4;

  // Disk usage sample.
  DiskUsageSample disk = 5;
}

// Performance data for an asset.
message AssetPerformanceData {
  // Daily resource usage aggregations.
  // Contains all of the data available for an asset, up to the last 420 days.
  // Aggregations are sorted from oldest to most recent.
  repeated DailyResourceUsageAggregation daily_resource_usage_aggregations = 1;
}

// Usage data aggregation for a single day.
message DailyResourceUsageAggregation {
  // Statistical aggregation of samples for a single resource usage.
  message Stats {
    // Average usage value.
    float average = 1;

    // Median usage value.
    float median = 2;

    // 95th percentile usage value.
    float nintey_fifth_percentile = 3;

    // Peak usage value.
    float peak = 4;
  }

  // Statistical aggregation of CPU usage.
  message CPU {
    // CPU utilization percentage.
    Stats utilization_percentage = 1;
  }

  // Statistical aggregation of memory usage.
  message Memory {
    // Memory utilization percentage.
    Stats utilization_percentage = 1;
  }

  // Statistical aggregation of network usage.
  message Network {
    // Network ingress in B/s.
    Stats ingress_bps = 1;

    // Network egress in B/s.
    Stats egress_bps = 2;
  }

  // Statistical aggregation of disk usage.
  message Disk {
    // Disk I/O operations per second.
    Stats iops = 1;
  }

  // Aggregation date. Day boundaries are at midnight UTC.
  google.type.Date date = 1;

  // CPU usage.
  CPU cpu = 2;

  // Memory usage.
  Memory memory = 3;

  // Network usage.
  Network network = 4;

  // Disk usage.
  Disk disk = 5;
}

// Message containing insights list.
message InsightList {
  // Output only. Insights of the list.
  repeated Insight insights = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Update timestamp.
  google.protobuf.Timestamp update_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// An insight about an asset.
message Insight {
  oneof insight {
    // Output only. An insight about potential migrations for an asset.
    MigrationInsight migration_insight = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }
}

// An insight about potential migrations for an asset.
message MigrationInsight {
  // Output only. Description of how well the asset this insight is associated
  // with fits the proposed migration.
  FitDescriptor fit = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // A target for the migration.
  oneof migration_target {
    // Output only. A Google Compute Engine target.
    ComputeEngineMigrationTarget compute_engine_target = 10
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }
}

// Compute engine migration target.
message ComputeEngineMigrationTarget {
  // Description of the suggested shape for the migration target.
  ComputeEngineShapeDescriptor shape = 1;
}

// Describes the fit level of an asset for migration to a specific target.
message FitDescriptor {
  // Fit level.
  enum FitLevel {
    // Not enough information.
    FIT_LEVEL_UNSPECIFIED = 0;

    // Fit.
    FIT = 1;

    // No Fit.
    NO_FIT = 2;

    // Fit with effort.
    REQUIRES_EFFORT = 3;
  }

  // Fit level.
  FitLevel fit_level = 1;
}

// Compute Engine target shape descriptor.
message ComputeEngineShapeDescriptor {
  // Memory in mebibytes.
  int32 memory_mb = 1;

  // Number of physical cores.
  int32 physical_core_count = 2;

  // Number of logical cores.
  int32 logical_core_count = 3;

  // Compute Engine machine series.
  string series = 4;

  // Compute Engine machine type.
  string machine_type = 5;
}

// Message describing an aggregation. The message includes the aggregation type,
// parameters, and the field on which to perform the aggregation.
message Aggregation {
  // Object count.
  message Count {}

  // Sum of field values.
  message Sum {}

  // Histogram of bucketed assets counts by field value.
  message Histogram {
    // Lower bounds of buckets.
    // The response will contain `n+1` buckets for `n` bounds.
    // The first bucket will count all assets for which the field value is
    // smaller than the first bound.
    // Subsequent buckets will count assets for which the field value is
    // greater or equal to a lower bound and smaller than the next one.
    // The last bucket will count assets for which the field value is greater or
    // equal to the final lower bound.
    // You can define up to 20 lower bounds.
    repeated double lower_bounds = 1;
  }

  // Frequency distribution of all field values.
  message Frequency {}

  // The name of the field on which to aggregate.
  string field = 1;

  oneof aggregation_function {
    // Count the number of matching objects.
    Count count = 2;

    // Sum over a numeric field.
    Sum sum = 3;

    // Creates a bucketed histogram of field values.
    Histogram histogram = 4;

    // Creates a frequency distribution of all field values.
    Frequency frequency = 5;
  }
}

// Message describing a result of an aggregation.
message AggregationResult {
  // The result of a count aggregation.
  message Count {
    int64 value = 1;
  }

  // The result of a sum aggregation.
  message Sum {
    double value = 1;
  }

  // The result of a bucketed histogram aggregation.
  message Histogram {
    // A histogram bucket with a lower and upper bound, and a count of items
    // with a field value between those bounds.
    // The lower bound is inclusive and the upper bound is exclusive.
    // Lower bound may be -infinity and upper bound may be infinity.
    message Bucket {
      // Lower bound - inclusive.
      double lower_bound = 1;

      // Upper bound - exclusive.
      double upper_bound = 2;

      // Count of items in the bucket.
      int64 count = 3;
    }

    // Buckets in the histogram.
    // There will be `n+1` buckets matching `n` lower bounds in the request.
    // The first bucket will be from -infinity to the first bound.
    // Subsequent buckets will be between one bound and the next.
    // The final bucket will be from the final bound to infinity.
    repeated Bucket buckets = 1;
  }

  // The result of a frequency distribution aggregation.
  message Frequency {
    map<string, int64> values = 1;
  }

  string field = 1;

  oneof result {
    Count count = 2;

    Sum sum = 3;

    Histogram histogram = 4;

    Frequency frequency = 5;
  }
}

// A resource that aggregates the validation errors found in an import job file.
message FileValidationReport {
  // The name of the file.
  string file_name = 1;

  // Partial list of rows that encountered validation error.
  repeated ImportRowError row_errors = 2;

  // Flag indicating that processing was aborted due to maximum number of
  // errors.
  bool partial_report = 3;

  // List of file level errors.
  repeated ImportError file_errors = 4;
}

// A resource that aggregates errors across import job files.
message ValidationReport {
  // List of errors found in files.
  repeated FileValidationReport file_validations = 1;

  // List of job level errors.
  repeated ImportError job_errors = 2;
}

// A resource that reports result of the import job execution.
message ExecutionReport {
  // Total number of asset frames reported for the import job.
  int32 frames_reported = 1;

  // Validation errors encountered during the execution of the import job.
  ValidationReport execution_errors = 2;

  // Total number of rows in the import job.
  int32 total_rows_count = 3;
}

// A resource that reports the errors encountered while processing an
// import job.
message ImportError {
  // Enumerate possible error severity.
  enum Severity {
    SEVERITY_UNSPECIFIED = 0;

    ERROR = 1;

    WARNING = 2;

    INFO = 3;
  }

  // The error information.
  string error_details = 1;

  // The severity of the error.
  Severity severity = 2;
}

// A resource that reports the import job errors at row level.
message ImportRowError {
  // The row number where the error was detected.
  int32 row_number = 1 [deprecated = true];

  // The name of the VM in the row.
  string vm_name = 2;

  // The VM UUID.
  string vm_uuid = 3;

  // The list of errors detected in the row.
  repeated ImportError errors = 4;
}

// A resource that contains a URI to which a data file can be uploaded.
message UploadFileInfo {
  // Output only. Upload URI for the file.
  string signed_uri = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The headers that were used to sign the URI.
  map<string, string> headers = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Expiration time of the upload URI.
  google.protobuf.Timestamp uri_expiration_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Lists the asset IDs of all assets.
message AssetList {
  // Required. A list of asset IDs
  repeated string asset_ids = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "migrationcenter.googleapis.com/Asset"
    }
  ];
}

// A resource that contains a single violation of a reported `AssetFrame`
// resource.
message FrameViolationEntry {
  // The field of the original frame where the violation occurred.
  string field = 1;

  // A message describing the violation.
  string violation = 2;
}

// VirtualMachinePreferences enables you to create sets of assumptions, for
// example, a geographical location and pricing track, for your migrated virtual
// machines. The set of preferences influence recommendations for migrating
// virtual machine assets.
message VirtualMachinePreferences {
  // Region preferences for assets using this preference set.
  // If you are unsure which value to set, the migration service API region is
  // often a good value to start with.
  RegionPreferences region_preferences = 3;

  // Commitment plan to consider when calculating costs for virtual machine
  // insights and recommendations.
  // If you are unsure which value to set, a 3 year commitment plan is often a
  // good value to start with.
  CommitmentPlan commitment_plan = 4;

  // Sizing optimization strategy specifies the preferred strategy used when
  // extrapolating usage data to calculate insights and recommendations for a
  // virtual machine.
  // If you are unsure which value to set, a moderate sizing optimization
  // strategy is often a good value to start with.
  SizingOptimizationStrategy sizing_optimization_strategy = 5;

  // Compute Engine preferences concern insights and recommendations for Compute
  // Engine target.
  ComputeEnginePreferences compute_engine_preferences = 6;
}

// The user preferences relating to Compute Engine target platform.
message ComputeEnginePreferences {
  // Preferences concerning the machine types to consider on Compute Engine.
  MachinePreferences machine_preferences = 2;

  // License type to consider when calculating costs for virtual machine
  // insights and recommendations. If unspecified, costs are calculated
  // based on the default licensing plan.
  LicenseType license_type = 3;
}

// The type of machines to consider when calculating virtual machine migration
// insights and recommendations.
// Not all machine types are available in all zones and regions.
message MachinePreferences {
  // Compute Engine machine series to consider for insights and recommendations.
  // If empty, no restriction is applied on the machine series.
  repeated MachineSeries allowed_machine_series = 1;
}

// A Compute Engine machine series.
message MachineSeries {
  // Code to identify a Compute Engine machine series. Consult
  // https://cloud.google.com/compute/docs/machine-resource#machine_type_comparison
  // for more details on the available series.
  string code = 1;
}

// The user preferences relating to target regions.
message RegionPreferences {
  // A list of preferred regions,
  // ordered by the most preferred region first.
  // Set only valid Google Cloud region names.
  // See https://cloud.google.com/compute/docs/regions-zones
  // for available regions.
  repeated string preferred_regions = 1;
}

// Describes the Migration Center settings related to the project.
message Settings {
  option (google.api.resource) = {
    type: "migrationcenter.googleapis.com/Settings"
    pattern: "projects/{project}/locations/{location}/settings"
  };

  // Output only. The name of the resource.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The preference set used by default for a project.
  string preference_set = 2 [(google.api.resource_reference) = {
    type: "migrationcenter.googleapis.com/PreferenceSet"
  }];
}

// Describes the Summary view of a Report, which contains aggregated values
// for all the groups and preference sets included in this Report.
message ReportSummary {
  // Describes a collection of data points rendered as a Chart.
  message ChartData {
    // Describes a single data point in the Chart.
    message DataPoint {
      // The X-axis label for this data point.
      string label = 1;

      // The Y-axis value for this data point.
      double value = 2;
    }

    // Each data point in the chart is represented as a name-value pair
    // with the name being the x-axis label, and the value being the y-axis
    // value.
    repeated DataPoint data_points = 1;
  }

  // Utilization Chart is a specific type of visualization which displays
  // a metric classified into "Used" and "Free" buckets.
  message UtilizationChartData {
    // Aggregate value which falls into the "Used" bucket.
    int64 used = 1;

    // Aggregate value which falls into the "Free" bucket.
    int64 free = 2;
  }

  // A Histogram Chart shows a distribution of values into buckets, showing
  // a count of values which fall into a bucket.
  message HistogramChartData {
    // A histogram bucket with a lower and upper bound, and a count of items
    // with a field value between those bounds.
    // The lower bound is inclusive and the upper bound is exclusive.
    // Lower bound may be -infinity and upper bound may be infinity.
    message Bucket {
      // Lower bound - inclusive.
      int64 lower_bound = 1;

      // Upper bound - exclusive.
      int64 upper_bound = 2;

      // Count of items in the bucket.
      int64 count = 3;
    }

    // Buckets in the histogram.
    // There will be `n+1` buckets matching `n` lower bounds in the request.
    // The first bucket will be from -infinity to the first bound.
    // Subsequent buckets will be between one bound and the next.
    // The final bucket will be from the final bound to infinity.
    repeated Bucket buckets = 1;
  }

  // Aggregate statistics for a collection of assets.
  message AssetAggregateStats {
    // Sum of the memory in bytes of all the assets in this collection.
    int64 total_memory_bytes = 1;

    // Sum of persistent storage in bytes of all the assets in this collection.
    int64 total_storage_bytes = 2;

    // Sum of the CPU core count of all the assets in this collection.
    int64 total_cores = 3;

    // Count of the number of unique assets in this collection.
    int64 total_assets = 4;

    // Total memory split into Used/Free buckets.
    UtilizationChartData memory_utilization_chart = 5;

    // Total memory split into Used/Free buckets.
    UtilizationChartData storage_utilization_chart = 6;

    // Count of assets grouped by Operating System families.
    ChartData operating_system = 7;

    // Histogram showing a distribution of CPU core counts.
    HistogramChartData core_count_histogram = 8;

    // Histogram showing a distribution of memory sizes.
    HistogramChartData memory_bytes_histogram = 9;

    // Histogram showing a distribution of memory sizes.
    HistogramChartData storage_bytes_histogram = 10;
  }

  // Represents a data point tracking the count of assets allocated for a
  // specific Machine Series.
  message MachineSeriesAllocation {
    // The Machine Series (e.g. "E2", "N2")
    MachineSeries machine_series = 1;

    // Count of assets allocated to this machine series.
    int64 allocated_asset_count = 2;
  }

  // A set of findings that applies to assets destined for Compute Engine.
  message ComputeEngineFinding {
    // Set of regions in which the assets were allocated.
    repeated string allocated_regions = 1;

    // Count of assets which were allocated.
    int64 allocated_asset_count = 2;

    // Distribution of assets based on the Machine Series.
    repeated MachineSeriesAllocation machine_series_allocations = 3;

    // Set of disk types allocated to assets.
    repeated PersistentDiskType allocated_disk_types = 4;
  }

  // Summary Findings for a specific Group/PreferenceSet combination.
  message GroupPreferenceSetFinding {
    // Display Name of the Preference Set
    string display_name = 1;

    // Description for the Preference Set.
    string description = 2;

    // A set of preferences that applies to all machines in the context.
    VirtualMachinePreferences machine_preferences = 3;

    // Total monthly cost for this preference set.
    google.type.Money monthly_cost_total = 4;

    // Compute monthly cost for this preference set.
    google.type.Money monthly_cost_compute = 5;

    // Licensing monthly cost for this preference set.
    google.type.Money monthly_cost_os_license = 6;

    // Network Egress monthly cost for this preference set.
    google.type.Money monthly_cost_network_egress = 7;

    // Storage monthly cost for this preference set.
    google.type.Money monthly_cost_storage = 8;

    // Miscellaneous monthly cost for this preference set.
    google.type.Money monthly_cost_other = 9;

    // A set of findings that applies to Compute Engine machines in the input.
    ComputeEngineFinding compute_engine_finding = 10;
  }

  // Summary Findings for a specific Group.
  message GroupFinding {
    // Display Name for the Group.
    string display_name = 1;

    // Description for the Group.
    string description = 2;

    // Summary statistics for all the assets in this group.
    AssetAggregateStats asset_aggregate_stats = 3;

    // Count of the number of assets in this group which are also included
    // in another group within the same report.
    int64 overlapping_asset_count = 4;

    // Findings for each of the PreferenceSets for this group.
    repeated GroupPreferenceSetFinding preference_set_findings = 5;
  }

  // Aggregate statistics for all the assets across all the groups.
  AssetAggregateStats all_assets_stats = 1;

  // Findings for each Group included in this report.
  repeated GroupFinding group_findings = 2;
}

// Specifies the types of asset views that provide complete or partial details
// of an asset.
enum AssetView {
  // The asset view is not specified. The API displays the basic view by
  // default.
  ASSET_VIEW_UNSPECIFIED = 0;

  // The asset view includes only basic metadata of the asset.
  ASSET_VIEW_BASIC = 1;

  // The asset view includes all the metadata of an asset and performance data.
  ASSET_VIEW_FULL = 2;
}

// Known categories of operating systems.
enum OperatingSystemFamily {
  OS_FAMILY_UNKNOWN = 0;

  // Microsoft Windows Server and Desktop.
  OS_FAMILY_WINDOWS = 1;

  // Various Linux flavors.
  OS_FAMILY_LINUX = 2;

  // Non-Linux Unix flavors.
  OS_FAMILY_UNIX = 3;
}

// Specifies the data formats supported by Migration Center.
enum ImportJobFormat {
  // Default value.
  IMPORT_JOB_FORMAT_UNSPECIFIED = 0;

  // RVTools format (XLSX).
  IMPORT_JOB_FORMAT_RVTOOLS_XLSX = 1;

  // RVTools format (CSV).
  IMPORT_JOB_FORMAT_RVTOOLS_CSV = 2;

  // CSV format exported from AWS using the
  // [AWS collection
  // script][https://github.com/GoogleCloudPlatform/aws-to-stratozone-export].
  IMPORT_JOB_FORMAT_EXPORTED_AWS_CSV = 4;

  // CSV format exported from Azure using the
  // [Azure collection
  // script][https://github.com/GoogleCloudPlatform/azure-to-stratozone-export].
  IMPORT_JOB_FORMAT_EXPORTED_AZURE_CSV = 5;

  // CSV format created manually and following the StratoZone format. For more
  // information, see [Manually create and upload data
  // tables][https://cloud.google.com/migrate/stratozone/docs/import-data-portal].
  IMPORT_JOB_FORMAT_STRATOZONE_CSV = 6;
}

// Specifies the types of import job views that provide complete or partial
// details of an import job.
enum ImportJobView {
  // The import job view is not specified. The API displays the basic view by
  // default.
  IMPORT_JOB_VIEW_UNSPECIFIED = 0;

  // The import job view includes basic metadata of an import job.
  // This view does not include payload information.
  IMPORT_JOB_VIEW_BASIC = 1;

  // The import job view includes all metadata of an import job.
  IMPORT_JOB_VIEW_FULL = 2;
}

// ErrorFrameView can be specified in ErrorFrames List and Get requests to
// control the level of details that is returned for the original frame.
enum ErrorFrameView {
  // Value is unset. The system will fallback to the default value.
  ERROR_FRAME_VIEW_UNSPECIFIED = 0;

  // Include basic frame data, but not the full contents.
  ERROR_FRAME_VIEW_BASIC = 1;

  // Include everything.
  ERROR_FRAME_VIEW_FULL = 2;
}

// The persistent disk (PD) types of Compute Engine virtual machines.
enum PersistentDiskType {
  // Unspecified (default value).
  // Selecting this value allows the system to use any disk type according
  // to reported usage. This a good value to start with.
  PERSISTENT_DISK_TYPE_UNSPECIFIED = 0;

  // Standard HDD Persistent Disk.
  PERSISTENT_DISK_TYPE_STANDARD = 1;

  // Balanced Persistent Disk.
  PERSISTENT_DISK_TYPE_BALANCED = 2;

  // SSD Persistent Disk.
  PERSISTENT_DISK_TYPE_SSD = 3;
}

// The License type for premium images (RHEL, RHEL for SAP, SLES, SLES for SAP,
// Windows Server).
enum LicenseType {
  // Unspecified (default value).
  LICENSE_TYPE_UNSPECIFIED = 0;

  // Default Google Cloud licensing plan. Licensing is charged per usage.
  // This a good value to start with.
  LICENSE_TYPE_DEFAULT = 1;

  // Bring-your-own-license (BYOL) plan. User provides the OS license.
  LICENSE_TYPE_BRING_YOUR_OWN_LICENSE = 2;
}

// The sizing optimization strategy preferences of a virtual machine. This
// strategy, in addition to actual usage data of the virtual machine, can help
// determine the recommended shape on the target platform.
enum SizingOptimizationStrategy {
  // Unspecified (default value).
  SIZING_OPTIMIZATION_STRATEGY_UNSPECIFIED = 0;

  // No optimization applied. Virtual machine sizing matches as closely as
  // possible the machine shape on the source site, not considering any actual
  // performance data.
  SIZING_OPTIMIZATION_STRATEGY_SAME_AS_SOURCE = 1;

  // Virtual machine sizing will match the reported usage and shape, with some
  // slack. This a good value to start with.
  SIZING_OPTIMIZATION_STRATEGY_MODERATE = 2;

  // Virtual machine sizing will match the reported usage, with little slack.
  // Using this option can help reduce costs.
  SIZING_OPTIMIZATION_STRATEGY_AGGRESSIVE = 3;
}

// The plan of commitments for VM resource-based committed use discount (CUD).
enum CommitmentPlan {
  // Unspecified commitment plan.
  COMMITMENT_PLAN_UNSPECIFIED = 0;

  // No commitment plan.
  COMMITMENT_PLAN_NONE = 1;

  // 1 year commitment.
  COMMITMENT_PLAN_ONE_YEAR = 2;

  // 3 years commitment.
  COMMITMENT_PLAN_THREE_YEARS = 3;
}

// Specifies the types of views that provide complete or partial details
// of a Report.
enum ReportView {
  // The report view is not specified. The API displays the basic view by
  // default.
  REPORT_VIEW_UNSPECIFIED = 0;

  // The report view includes only basic metadata of the Report. Useful for
  // list views.
  REPORT_VIEW_BASIC = 1;

  // The report view includes all the metadata of the Report. Useful for
  // preview.
  REPORT_VIEW_FULL = 2;

  // The report view includes the standard metadata of an report. Useful for
  // detail view.
  REPORT_VIEW_STANDARD = 3;
}
