// Copyright 2025 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.osconfig.logging;

import "google/protobuf/timestamp.proto";

option go_package = "cloud.google.com/go/osconfig/logging/loggingpb;loggingpb";
option java_multiple_files = true;
option java_outer_classname = "PatchJobLogProto";
option java_package = "com.google.cloud.osconfig.logging";

message PatchJobCompletedLog {
  // Enumeration of the various states a patch job passes through as it
  // executes.
  enum State {
    // State must be specified.
    STATE_UNSPECIFIED = 0;

    // The patch job was successfully initiated.
    STARTED = 1;

    // The patch job is looking up instances to run the patch on.
    INSTANCE_LOOKUP = 2;

    // Instances are being patched.
    PATCHING = 3;

    // Patch job completed successfully.
    SUCCEEDED = 4;

    // Patch job completed but there were errors.
    COMPLETED_WITH_ERRORS = 5;

    // The patch job was canceled.
    CANCELED = 6;

    // The patch job has timed out.
    TIMED_OUT = 7;
  }

  // A summary of the current patch state across all instances this patch job
  // affects. Contains counts of instances in different states. These states map
  // to InstancePatchState. List patch job instance details to see the specific
  // states of each instance.
  message InstanceDetailsSummary {
    // Number of instances pending patch job.
    int64 instances_pending = 1;

    // Number of instances that are inactive.
    int64 instances_inactive = 2;

    // Number of instances notified about patch job.
    int64 instances_notified = 3;

    // Number of instances that have started.
    int64 instances_started = 4;

    // Number of instances that are downloading patches.
    int64 instances_downloading_patches = 5;

    // Number of instances that are applying patches.
    int64 instances_applying_patches = 6;

    // Number of instances rebooting.
    int64 instances_rebooting = 7;

    // Number of instances that have completed successfully.
    int64 instances_succeeded = 8;

    // Number of instances that require reboot.
    int64 instances_succeeded_reboot_required = 9;

    // Number of instances that failed.
    int64 instances_failed = 10;

    // Number of instances that have acked and will start shortly.
    int64 instances_acked = 11;

    // Number of instances that exceeded the time out while applying the patch.
    int64 instances_timed_out = 12;

    // Number of instances that are running the pre-patch step.
    int64 instances_running_pre_patch_step = 13;

    // Number of instances that are running the post-patch step.
    int64 instances_running_post_patch_step = 14;
  }

  // The patch job name. For example:
  // projects/PROJECT_ID/patchJobs/PATCH_JOB_ID
  string patch_job = 1;

  // The current state of the PatchJob.
  State state = 2;

  // Summary of instance details.
  InstanceDetailsSummary instance_details_summary = 3;

  // If this patch job is a dry run, the agent will report that it has
  // finished without running any updates on the VM.
  bool dry_run = 4;

  // If this patch job failed, this message will provide information about the
  // failure.
  string error_message = 5;

  // Time this PatchJob was created.
  google.protobuf.Timestamp create_time = 6;

  // Last time this PatchJob was updated.
  google.protobuf.Timestamp update_time = 7;
}
