// Copyright 2022 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.clouddms.logging.v1;

import "google/api/field_behavior.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";

option csharp_namespace = "Google.Cloud.CloudDms.Logging.V1";
option go_package = "google.golang.org/genproto/googleapis/cloud/clouddms/logging/v1;logging";
option java_multiple_files = true;
option java_outer_classname = "ClouddmsPlatformLogsProto";
option java_package = "com.google.cloud.clouddms.logging.v1";
option php_namespace = "Google\\Cloud\\CloudDms\\Logging\\V1";
option ruby_package = "Google::Cloud::CloudDMS::Logging::V1";

// The database engines.
enum DatabaseEngine {
  // The source database engine of the migration job is unknown.
  DATABASE_ENGINE_UNSPECIFIED = 0;

  // The source engine is MySQL.
  MYSQL = 1;

  // The source engine is PostgreSQL.
  POSTGRESQL = 2;

  // The source engine is SQL Server.
  SQLSERVER = 3;

  // The source engine is Oracle (for heterogeneous migrations).
  ORACLE = 4;

  // The engine is Spanner (for heterogeneous migrations).
  SPANNER = 5;
}

// The database providers.
enum DatabaseProvider {
  // The database provider is unknown.
  DATABASE_PROVIDER_UNSPECIFIED = 0;

  // CloudSQL runs the database.
  CLOUDSQL = 1;

  // RDS runs the database.
  RDS = 2;

  // Amazon Aurora.
  AURORA = 3;

  // AlloyDB.
  ALLOYDB = 4;
}

// A message defining the database engine and provider.
message DatabaseType {
  // The database provider.
  DatabaseProvider provider = 1;

  // The database engine.
  DatabaseEngine engine = 2;
}

// Migration job as stored in Cloud Logging logs.
// NEXT_TAG = 36.
message LoggedMigrationJob {
  // The migration job states enum.
  enum State {
    // The state of the migration job is unknown.
    STATE_UNSPECIFIED = 0;

    // The migration job is down for maintenance.
    MAINTENANCE = 1;

    // The migration job is in draft mode and fully editable.
    DRAFT = 2;

    // The migration job is being created.
    CREATING = 3;

    // The migration job is created and not started.
    NOT_STARTED = 4;

    // The migration job is running
    RUNNING = 5;

    // The migration job failed.
    FAILED = 6;

    // The migration job has been completed.
    COMPLETED = 7;

    // The migration job is being deleted.
    DELETING = 8;

    // The migration job is being stopped.
    STOPPING = 9;

    // The migration job is currently stopped.
    STOPPED = 10;

    // The migration job has been deleted.
    DELETED = 11;

    // The migration job is being updated.
    UPDATING = 12;

    // The migration job is starting.
    STARTING = 13;

    // The migration job is restarting.
    RESTARTING = 14;

    // The migration job is resuming.
    RESUMING = 15;
  }

  // The migration job phases enum.
  enum Phase {
    // The phase of the migration job is unknown.
    PHASE_UNSPECIFIED = 0;

    // The migration job is in the full dump phase.
    FULL_DUMP = 1;

    // The migration job is CDC phase.
    CDC = 2;

    // The migration job is running the promote phase.
    PROMOTE_IN_PROGRESS = 3;

    // Only RDS flow - waiting for source writes to stop
    WAITING_FOR_SOURCE_WRITES_TO_STOP = 4;

    // Only RDS flow - the sources writes stopped, waiting for dump to begin
    PREPARING_THE_DUMP = 5;
  }

  // The migration job types.
  enum Type {
    // The type of the migration job is unknown.
    TYPE_UNSPECIFIED = 0;

    // The migration job is a one time migration.
    ONE_TIME = 1;

    // The migration job is a continuous migration.
    CONTINUOUS = 2;
  }

  // Type of connectivity to source database.
  enum ConnectivityType {
    // No data defined.
    CONNECTIVITY_TYPE_UNSPECIFIED = 0;

    // Connect using static IO
    STATIC_IP = 1;

    // Use reverse SSH connectivity.
    REVERSE_SSH = 2;

    // Use VPC Peering connectivity.
    VPC_PEERING = 3;
  }

  // Required. The unique identifier for a migration job.
  string name = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Labels.
  map<string, string> labels = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The display name.
  string display_name = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. The current migration job state.
  State state = 4 [(google.api.field_behavior) = REQUIRED];

  // Required. The current migration job phase.
  Phase phase = 5 [(google.api.field_behavior) = REQUIRED];

  // Required. The migration job type.
  Type type = 6 [(google.api.field_behavior) = REQUIRED];

  // Optional. An optional dump path (gs://[BUCKET_NAME]/[OBJECT_NAME]).
  string dump_path = 7 [(google.api.field_behavior) = OPTIONAL];

  // Required. The migration job source connection profile name.
  string source = 8 [(google.api.field_behavior) = REQUIRED];

  // Required. The migration job destination connection profile name.
  string destination = 9 [(google.api.field_behavior) = REQUIRED];

  // Required. the migration job duration in seconds.
  google.protobuf.Duration duration = 10 [(google.api.field_behavior) = REQUIRED];

  // Required. Type of connectivity to source database.
  ConnectivityType connectivity_type = 11 [(google.api.field_behavior) = REQUIRED];

  // Required. The error details in case of state FAILED.
  google.rpc.Status error = 12 [(google.api.field_behavior) = REQUIRED];

  // Required. The time when this migration job was completed. Should only be set when the
  // phase of the migration job is COMPLETED.
  google.protobuf.Timestamp end_time = 13 [(google.api.field_behavior) = REQUIRED];

  // Required. The indicative source database.
  DatabaseType source_database = 14 [(google.api.field_behavior) = REQUIRED];

  // Required. The indicative destination database.
  DatabaseType destination_database = 15 [(google.api.field_behavior) = REQUIRED];
}

// An MySQL database connection profile.
message MySqlConnectionProfile {
  // The MySQL database version.
  enum Version {
    // Unspecified version.
    VERSION_UNSPECIFIED = 0;

    // MySQL 5.5.
    V5_5 = 1;

    // MySQL 5.6.
    V5_6 = 2;

    // MySQL 5.7.
    V5_7 = 3;

    // MySQL 8.0.
    V8_0 = 4;
  }

  // The database version.
  Version version = 1;

  // The Cloud SQL id for a Cloud SQL instance.
  string cloud_sql_id = 2;
}

// An PostgreSQL connection profile.
message PostgreSqlConnectionProfile {
  // The PostgreSQL database version.
  enum Version {
    // Unspecified version.
    VERSION_UNSPECIFIED = 0;

    // PostgreSQL 9.6.
    V9_6 = 1;

    // PostgreSQL 11.
    V11 = 2;

    // PostgreSQL 10.
    V10 = 3;

    // PostgreSQL 12.
    V12 = 4;

    // PostgreSQL 13.
    V13 = 5;
  }

  // The database version.
  Version version = 1;

  // The Cloud SQL id for a Cloud SQL instance.
  string cloud_sql_id = 2;
}

// A CloudSQL connection profile.
message CloudSqlConnectionProfile {
  // The Cloud SQL id.
  string cloud_sql_id = 1;
}

// An Oracle connection profile.
message OracleConnectionProfile {
  // Connectivity options used to establish a connection to the profile.
  enum ConnectivityType {
    // No data defined.
    CONNECTIVITY_TYPE_UNSPECIFIED = 0;

    // Static Service IP connectivity.
    STATIC_SERVICE_IP = 1;

    // Forward SSH tunnel connectivity.
    FORWARD_SSH_TUNNEL = 2;

    // Private connectivity.
    PRIVATE_CONNECTIVITY = 3;
  }

  // Required. Type of connectivity to source database.
  ConnectivityType connectivity_type = 1 [(google.api.field_behavior) = REQUIRED];
}

// An producer connection profile definition.
// NEXT_TAG = 8.
message LoggedConnectionProfile {
  // The connection profile states enum.
  enum State {
    // The state of the connection profile is unknown.
    STATE_UNSPECIFIED = 0;

    // The connection profile is in draft mode and fully editable.
    DRAFT = 1;

    // The connection profile is being created.
    CREATING = 2;

    // The connection profile is ready.
    READY = 3;

    // The connection profile is being updated.
    UPDATING = 4;

    // The connection profile is being deleted.
    DELETING = 5;

    // The connection profile has been deleted.
    DELETED = 6;

    // The last action on the connection profile failed.
    FAILED = 7;
  }

  // The unique identifier for a connection profile.
  string name = 1;

  // Labels.
  map<string, string> labels = 2;

  // The current connection profile state.
  State state = 3;

  // The display name.
  string display_name = 4;

  // The connection profile definition
  oneof connection_profile {
    // A MySQL database connection profile.
    MySqlConnectionProfile mysql = 100;

    // A PostgreSQL database connection profile.
    PostgreSqlConnectionProfile postgresql = 101;

    // A CloudSQL database connection profile.
    CloudSqlConnectionProfile cloudsql = 102;

    // An Oracle database connection profile.
    OracleConnectionProfile oracle = 103;
  }

  // The error details in case of state FAILED.
  google.rpc.Status error = 5;

  // The database provider.
  DatabaseProvider provider = 6;
}

// Log definition for Migration Job event
message MigrationJobEventLog {
  // The migration job resource
  LoggedMigrationJob migration_job = 1;

  // Timestamp of the event
  google.protobuf.Timestamp occurrence_timestamp = 2;

  // Event code
  int32 code = 3;

  // Event message
  string text_message = 4;

  // Original event data
  oneof original_cause {
    // Original event code
    int32 original_code = 200;

    // Original event message
    string original_message = 201;
  }
}

// Log definition for Connection Profile event
message ConnectionProfileEventLog {
  // The connection profilr resource
  LoggedConnectionProfile connection_profile = 1;

  // Timestamp of the event
  google.protobuf.Timestamp occurrence_timestamp = 2;

  // Event code
  int32 code = 3;

  // Event message
  string text_message = 4;

  // Original event data
  oneof original_cause {
    // Original event code
    int32 original_code = 200;

    // Original event message
    string original_message = 201;
  }
}

// The PrivateConnection resource is used to establish private connectivity
// with the customer's network.
message LoggedPrivateConnection {
  // Private Connection state.
  enum State {
    // Unspecified state.
    STATE_UNSPECIFIED = 0;

    // The private connection is in creation state - creating resources.
    CREATING = 1;

    // The private connection has been created with all of its resources.
    CREATED = 2;

    // The private connection creation has failed.
    FAILED = 3;

    // The private connection is being deleted.
    DELETING = 4;

    // Delete request has failed, resource is in invalid state.
    FAILED_TO_DELETE = 5;

    // The private connection has been deleted.
    DELETED = 6;
  }

  // The resource's name.
  string name = 1;

  // Labels.
  map<string, string> labels = 2;

  // Display name.
  string display_name = 3;

  // The state of the Private Connection.
  State state = 4;

  // The error details in case of state FAILED.
  google.rpc.Status error = 5;

  // VPC Peering Config.
  VpcPeeringConfig vpc_peering_config = 100;
}

// The VPC Peering configuration is used to create VPC peering between
// the data plane and the consumer's VPC.
message VpcPeeringConfig {
  // Fully qualified name of the VPC DMS will peer to.
  string vpc_name = 1;

  // The subnet that will be peered to. (CIDR of /29).
  string subnet = 2;
}

// Log definition for a Private Connection event.
message PrivateConnectionEventLog {
  // The private connection resource.
  LoggedPrivateConnection private_connection = 1;

  // Timestamp of the event.
  google.protobuf.Timestamp occurrence_timestamp = 2;

  // Event code.
  int32 code = 3;

  // Event message.
  string text_message = 4;

  // Original event data.
  oneof original_cause {
    // Original event code.
    int32 original_code = 200;

    // Original event message.
    string original_message = 201;
  }
}