// Copyright 2020 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.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/cloud/osconfig/agentendpoint/v1beta/tasks.proto

package agentendpoint

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Specifies the current agent behavior.
type TaskDirective int32

const (
	// Unspecified is invalid.
	TaskDirective_TASK_DIRECTIVE_UNSPECIFIED TaskDirective = 0
	// The task should continue to progress.
	TaskDirective_CONTINUE TaskDirective = 1
	// Task should not be started, or if already in progress, should stop
	// at first safe stopping point.  Task should be considered done and will
	// never repeat.
	TaskDirective_STOP TaskDirective = 2
)

// Enum value maps for TaskDirective.
var (
	TaskDirective_name = map[int32]string{
		0: "TASK_DIRECTIVE_UNSPECIFIED",
		1: "CONTINUE",
		2: "STOP",
	}
	TaskDirective_value = map[string]int32{
		"TASK_DIRECTIVE_UNSPECIFIED": 0,
		"CONTINUE":                   1,
		"STOP":                       2,
	}
)

func (x TaskDirective) Enum() *TaskDirective {
	p := new(TaskDirective)
	*p = x
	return p
}

func (x TaskDirective) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (TaskDirective) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[0].Descriptor()
}

func (TaskDirective) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[0]
}

func (x TaskDirective) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use TaskDirective.Descriptor instead.
func (TaskDirective) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{0}
}

// Specifies the type of task to perform.
type TaskType int32

const (
	// Unspecified is invalid.
	TaskType_TASK_TYPE_UNSPECIFIED TaskType = 0
	// The apply patches task.
	TaskType_APPLY_PATCHES TaskType = 1
	// The exec step task.
	TaskType_EXEC_STEP_TASK TaskType = 2
)

// Enum value maps for TaskType.
var (
	TaskType_name = map[int32]string{
		0: "TASK_TYPE_UNSPECIFIED",
		1: "APPLY_PATCHES",
		2: "EXEC_STEP_TASK",
	}
	TaskType_value = map[string]int32{
		"TASK_TYPE_UNSPECIFIED": 0,
		"APPLY_PATCHES":         1,
		"EXEC_STEP_TASK":        2,
	}
)

func (x TaskType) Enum() *TaskType {
	p := new(TaskType)
	*p = x
	return p
}

func (x TaskType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (TaskType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[1].Descriptor()
}

func (TaskType) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[1]
}

func (x TaskType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use TaskType.Descriptor instead.
func (TaskType) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{1}
}

// The intermediate states of applying patches.
type ApplyPatchesTaskProgress_State int32

const (
	// Unspecified is invalid.
	ApplyPatchesTaskProgress_STATE_UNSPECIFIED ApplyPatchesTaskProgress_State = 0
	// The agent has started the patch task.
	ApplyPatchesTaskProgress_STARTED ApplyPatchesTaskProgress_State = 4
	// The agent is currently downloading patches.
	ApplyPatchesTaskProgress_DOWNLOADING_PATCHES ApplyPatchesTaskProgress_State = 1
	// The agent is currently applying patches.
	ApplyPatchesTaskProgress_APPLYING_PATCHES ApplyPatchesTaskProgress_State = 2
	// The agent is currently rebooting the VM instance.
	ApplyPatchesTaskProgress_REBOOTING ApplyPatchesTaskProgress_State = 3
)

// Enum value maps for ApplyPatchesTaskProgress_State.
var (
	ApplyPatchesTaskProgress_State_name = map[int32]string{
		0: "STATE_UNSPECIFIED",
		4: "STARTED",
		1: "DOWNLOADING_PATCHES",
		2: "APPLYING_PATCHES",
		3: "REBOOTING",
	}
	ApplyPatchesTaskProgress_State_value = map[string]int32{
		"STATE_UNSPECIFIED":   0,
		"STARTED":             4,
		"DOWNLOADING_PATCHES": 1,
		"APPLYING_PATCHES":    2,
		"REBOOTING":           3,
	}
)

func (x ApplyPatchesTaskProgress_State) Enum() *ApplyPatchesTaskProgress_State {
	p := new(ApplyPatchesTaskProgress_State)
	*p = x
	return p
}

func (x ApplyPatchesTaskProgress_State) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ApplyPatchesTaskProgress_State) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[2].Descriptor()
}

func (ApplyPatchesTaskProgress_State) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[2]
}

func (x ApplyPatchesTaskProgress_State) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ApplyPatchesTaskProgress_State.Descriptor instead.
func (ApplyPatchesTaskProgress_State) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{2, 0}
}

// The final states of applying patches.
type ApplyPatchesTaskOutput_State int32

const (
	// Unspecified is invalid.
	ApplyPatchesTaskOutput_STATE_UNSPECIFIED ApplyPatchesTaskOutput_State = 0
	// Applying patches completed successfully.
	ApplyPatchesTaskOutput_SUCCEEDED ApplyPatchesTaskOutput_State = 1
	// Applying patches completed successfully, but a reboot is required.
	ApplyPatchesTaskOutput_SUCCEEDED_REBOOT_REQUIRED ApplyPatchesTaskOutput_State = 2
	// Applying patches failed.
	ApplyPatchesTaskOutput_FAILED ApplyPatchesTaskOutput_State = 3
)

// Enum value maps for ApplyPatchesTaskOutput_State.
var (
	ApplyPatchesTaskOutput_State_name = map[int32]string{
		0: "STATE_UNSPECIFIED",
		1: "SUCCEEDED",
		2: "SUCCEEDED_REBOOT_REQUIRED",
		3: "FAILED",
	}
	ApplyPatchesTaskOutput_State_value = map[string]int32{
		"STATE_UNSPECIFIED":         0,
		"SUCCEEDED":                 1,
		"SUCCEEDED_REBOOT_REQUIRED": 2,
		"FAILED":                    3,
	}
)

func (x ApplyPatchesTaskOutput_State) Enum() *ApplyPatchesTaskOutput_State {
	p := new(ApplyPatchesTaskOutput_State)
	*p = x
	return p
}

func (x ApplyPatchesTaskOutput_State) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ApplyPatchesTaskOutput_State) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[3].Descriptor()
}

func (ApplyPatchesTaskOutput_State) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[3]
}

func (x ApplyPatchesTaskOutput_State) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ApplyPatchesTaskOutput_State.Descriptor instead.
func (ApplyPatchesTaskOutput_State) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{3, 0}
}

// The intermediate states of exec steps.
type ExecStepTaskProgress_State int32

const (
	// Unspecified is invalid.
	ExecStepTaskProgress_STATE_UNSPECIFIED ExecStepTaskProgress_State = 0
	// The agent has started the exec step task.
	ExecStepTaskProgress_STARTED ExecStepTaskProgress_State = 1
)

// Enum value maps for ExecStepTaskProgress_State.
var (
	ExecStepTaskProgress_State_name = map[int32]string{
		0: "STATE_UNSPECIFIED",
		1: "STARTED",
	}
	ExecStepTaskProgress_State_value = map[string]int32{
		"STATE_UNSPECIFIED": 0,
		"STARTED":           1,
	}
)

func (x ExecStepTaskProgress_State) Enum() *ExecStepTaskProgress_State {
	p := new(ExecStepTaskProgress_State)
	*p = x
	return p
}

func (x ExecStepTaskProgress_State) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ExecStepTaskProgress_State) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[4].Descriptor()
}

func (ExecStepTaskProgress_State) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[4]
}

func (x ExecStepTaskProgress_State) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ExecStepTaskProgress_State.Descriptor instead.
func (ExecStepTaskProgress_State) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{5, 0}
}

// The final states of exec steps.
type ExecStepTaskOutput_State int32

const (
	// Unspecified is invalid.
	ExecStepTaskOutput_STATE_UNSPECIFIED ExecStepTaskOutput_State = 0
	// The exec step completed normally.
	ExecStepTaskOutput_COMPLETED ExecStepTaskOutput_State = 1
	// The exec step was terminated because it took too long.
	ExecStepTaskOutput_TIMED_OUT ExecStepTaskOutput_State = 2
	// The exec step task was cancelled before it started.
	ExecStepTaskOutput_CANCELLED ExecStepTaskOutput_State = 3
)

// Enum value maps for ExecStepTaskOutput_State.
var (
	ExecStepTaskOutput_State_name = map[int32]string{
		0: "STATE_UNSPECIFIED",
		1: "COMPLETED",
		2: "TIMED_OUT",
		3: "CANCELLED",
	}
	ExecStepTaskOutput_State_value = map[string]int32{
		"STATE_UNSPECIFIED": 0,
		"COMPLETED":         1,
		"TIMED_OUT":         2,
		"CANCELLED":         3,
	}
)

func (x ExecStepTaskOutput_State) Enum() *ExecStepTaskOutput_State {
	p := new(ExecStepTaskOutput_State)
	*p = x
	return p
}

func (x ExecStepTaskOutput_State) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ExecStepTaskOutput_State) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[5].Descriptor()
}

func (ExecStepTaskOutput_State) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes[5]
}

func (x ExecStepTaskOutput_State) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ExecStepTaskOutput_State.Descriptor instead.
func (ExecStepTaskOutput_State) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{6, 0}
}

// A unit of work to be performed by the agent.
type Task struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Unique task id.
	TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"`
	// The type of task to perform.
	//
	// Task details must include the appropriate message based on this enum as
	// specified below:
	// APPLY_PATCHES = ApplyPatchesTask
	// EXEC_STEP = ExecStepTask;
	TaskType TaskType `protobuf:"varint,2,opt,name=task_type,json=taskType,proto3,enum=google.cloud.osconfig.agentendpoint.v1beta.TaskType" json:"task_type,omitempty"`
	// Current directive to the agent.
	TaskDirective TaskDirective `protobuf:"varint,3,opt,name=task_directive,json=taskDirective,proto3,enum=google.cloud.osconfig.agentendpoint.v1beta.TaskDirective" json:"task_directive,omitempty"`
	// Specific details about the current task to perform.
	//
	// Types that are assignable to TaskDetails:
	//	*Task_ApplyPatchesTask
	//	*Task_ExecStepTask
	TaskDetails isTask_TaskDetails `protobuf_oneof:"task_details"`
	// Labels describing the task.  Used for logging by the agent.
	ServiceLabels map[string]string `protobuf:"bytes,6,rep,name=service_labels,json=serviceLabels,proto3" json:"service_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

func (x *Task) Reset() {
	*x = Task{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Task) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Task) ProtoMessage() {}

func (x *Task) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Task.ProtoReflect.Descriptor instead.
func (*Task) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{0}
}

func (x *Task) GetTaskId() string {
	if x != nil {
		return x.TaskId
	}
	return ""
}

func (x *Task) GetTaskType() TaskType {
	if x != nil {
		return x.TaskType
	}
	return TaskType_TASK_TYPE_UNSPECIFIED
}

func (x *Task) GetTaskDirective() TaskDirective {
	if x != nil {
		return x.TaskDirective
	}
	return TaskDirective_TASK_DIRECTIVE_UNSPECIFIED
}

func (m *Task) GetTaskDetails() isTask_TaskDetails {
	if m != nil {
		return m.TaskDetails
	}
	return nil
}

func (x *Task) GetApplyPatchesTask() *ApplyPatchesTask {
	if x, ok := x.GetTaskDetails().(*Task_ApplyPatchesTask); ok {
		return x.ApplyPatchesTask
	}
	return nil
}

func (x *Task) GetExecStepTask() *ExecStepTask {
	if x, ok := x.GetTaskDetails().(*Task_ExecStepTask); ok {
		return x.ExecStepTask
	}
	return nil
}

func (x *Task) GetServiceLabels() map[string]string {
	if x != nil {
		return x.ServiceLabels
	}
	return nil
}

type isTask_TaskDetails interface {
	isTask_TaskDetails()
}

type Task_ApplyPatchesTask struct {
	// Details about the apply patches task to perform.
	ApplyPatchesTask *ApplyPatchesTask `protobuf:"bytes,4,opt,name=apply_patches_task,json=applyPatchesTask,proto3,oneof"`
}

type Task_ExecStepTask struct {
	// Details about the exec step task to perform.
	ExecStepTask *ExecStepTask `protobuf:"bytes,5,opt,name=exec_step_task,json=execStepTask,proto3,oneof"`
}

func (*Task_ApplyPatchesTask) isTask_TaskDetails() {}

func (*Task_ExecStepTask) isTask_TaskDetails() {}

// Message which instructs agent to apply patches.
type ApplyPatchesTask struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Specific information about how patches should be applied.
	PatchConfig *PatchConfig `protobuf:"bytes,1,opt,name=patch_config,json=patchConfig,proto3" json:"patch_config,omitempty"`
	// If true, the agent will report its status as it goes through the motions
	// but won't actually run any updates or perform any reboots.
	DryRun bool `protobuf:"varint,3,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"`
}

func (x *ApplyPatchesTask) Reset() {
	*x = ApplyPatchesTask{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ApplyPatchesTask) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ApplyPatchesTask) ProtoMessage() {}

func (x *ApplyPatchesTask) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ApplyPatchesTask.ProtoReflect.Descriptor instead.
func (*ApplyPatchesTask) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{1}
}

func (x *ApplyPatchesTask) GetPatchConfig() *PatchConfig {
	if x != nil {
		return x.PatchConfig
	}
	return nil
}

func (x *ApplyPatchesTask) GetDryRun() bool {
	if x != nil {
		return x.DryRun
	}
	return false
}

// Information reported from the agent about applying patches execution.
type ApplyPatchesTaskProgress struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The current state of this patch execution.
	State ApplyPatchesTaskProgress_State `protobuf:"varint,1,opt,name=state,proto3,enum=google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskProgress_State" json:"state,omitempty"`
}

func (x *ApplyPatchesTaskProgress) Reset() {
	*x = ApplyPatchesTaskProgress{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ApplyPatchesTaskProgress) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ApplyPatchesTaskProgress) ProtoMessage() {}

func (x *ApplyPatchesTaskProgress) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ApplyPatchesTaskProgress.ProtoReflect.Descriptor instead.
func (*ApplyPatchesTaskProgress) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{2}
}

func (x *ApplyPatchesTaskProgress) GetState() ApplyPatchesTaskProgress_State {
	if x != nil {
		return x.State
	}
	return ApplyPatchesTaskProgress_STATE_UNSPECIFIED
}

// Information reported from the agent about applying patches execution.
type ApplyPatchesTaskOutput struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The final state of this task.
	State ApplyPatchesTaskOutput_State `protobuf:"varint,1,opt,name=state,proto3,enum=google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskOutput_State" json:"state,omitempty"`
}

func (x *ApplyPatchesTaskOutput) Reset() {
	*x = ApplyPatchesTaskOutput{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ApplyPatchesTaskOutput) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ApplyPatchesTaskOutput) ProtoMessage() {}

func (x *ApplyPatchesTaskOutput) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ApplyPatchesTaskOutput.ProtoReflect.Descriptor instead.
func (*ApplyPatchesTaskOutput) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{3}
}

func (x *ApplyPatchesTaskOutput) GetState() ApplyPatchesTaskOutput_State {
	if x != nil {
		return x.State
	}
	return ApplyPatchesTaskOutput_STATE_UNSPECIFIED
}

// Message which instructs agent to execute the following command.
type ExecStepTask struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Details of the exec step to run.
	ExecStep *ExecStep `protobuf:"bytes,1,opt,name=exec_step,json=execStep,proto3" json:"exec_step,omitempty"`
}

func (x *ExecStepTask) Reset() {
	*x = ExecStepTask{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecStepTask) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecStepTask) ProtoMessage() {}

func (x *ExecStepTask) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecStepTask.ProtoReflect.Descriptor instead.
func (*ExecStepTask) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{4}
}

func (x *ExecStepTask) GetExecStep() *ExecStep {
	if x != nil {
		return x.ExecStep
	}
	return nil
}

// Information reported from the agent about the exec step execution.
type ExecStepTaskProgress struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The current state of this exec step.
	State ExecStepTaskProgress_State `protobuf:"varint,1,opt,name=state,proto3,enum=google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskProgress_State" json:"state,omitempty"`
}

func (x *ExecStepTaskProgress) Reset() {
	*x = ExecStepTaskProgress{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecStepTaskProgress) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecStepTaskProgress) ProtoMessage() {}

func (x *ExecStepTaskProgress) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecStepTaskProgress.ProtoReflect.Descriptor instead.
func (*ExecStepTaskProgress) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{5}
}

func (x *ExecStepTaskProgress) GetState() ExecStepTaskProgress_State {
	if x != nil {
		return x.State
	}
	return ExecStepTaskProgress_STATE_UNSPECIFIED
}

// Information reported from the agent about the exec step execution.
type ExecStepTaskOutput struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The final state of the exec step.
	State ExecStepTaskOutput_State `protobuf:"varint,1,opt,name=state,proto3,enum=google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskOutput_State" json:"state,omitempty"`
	// Required. The exit code received from the script which ran as part of the exec step.
	ExitCode int32 `protobuf:"varint,2,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"`
}

func (x *ExecStepTaskOutput) Reset() {
	*x = ExecStepTaskOutput{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecStepTaskOutput) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecStepTaskOutput) ProtoMessage() {}

func (x *ExecStepTaskOutput) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecStepTaskOutput.ProtoReflect.Descriptor instead.
func (*ExecStepTaskOutput) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP(), []int{6}
}

func (x *ExecStepTaskOutput) GetState() ExecStepTaskOutput_State {
	if x != nil {
		return x.State
	}
	return ExecStepTaskOutput_STATE_UNSPECIFIED
}

func (x *ExecStepTaskOutput) GetExitCode() int32 {
	if x != nil {
		return x.ExitCode
	}
	return 0
}

var File_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto protoreflect.FileDescriptor

var file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDesc = []byte{
	0x0a, 0x36, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64,
	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2f, 0x74, 0x61, 0x73,
	0x6b, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69,
	0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c,
	0x6f, 0x75, 0x64, 0x2f, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x61, 0x67, 0x65,
	0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x2f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xe2, 0x04, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x74,
	0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61,
	0x73, 0x6b, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x74,
	0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x60, 0x0a, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
	0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64,
	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x73,
	0x6b, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x0d, 0x74, 0x61, 0x73, 0x6b,
	0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x6c, 0x0a, 0x12, 0x61, 0x70, 0x70,
	0x6c, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67,
	0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x54,
	0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63,
	0x68, 0x65, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x60, 0x0a, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x5f,
	0x73, 0x74, 0x65, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64,
	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65,
	0x63, 0x53, 0x74, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x65, 0x78, 0x65,
	0x63, 0x53, 0x74, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x6a, 0x0a, 0x0e, 0x73, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x43, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
	0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65,
	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x54,
	0x61, 0x73, 0x6b, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c,
	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c,
	0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
	0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x5f,
	0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c,
	0x79, 0x50, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5a, 0x0a, 0x0c,
	0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74,
	0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e,
	0x50, 0x61, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x70, 0x61, 0x74,
	0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f,
	0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75,
	0x6e, 0x22, 0xec, 0x01, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68,
	0x65, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x65,
	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4a, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f,
	0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79,
	0x50, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x6f, 0x67, 0x72,
	0x65, 0x73, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05,
	0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x69, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15,
	0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
	0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44,
	0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x4e,
	0x47, 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x41,
	0x50, 0x50, 0x4c, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x10,
	0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03,
	0x22, 0xd7, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, 0x65,
	0x73, 0x54, 0x61, 0x73, 0x6b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x63, 0x0a, 0x05, 0x73,
	0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
	0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74,
	0x63, 0x68, 0x65, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x53,
	0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
	0x22, 0x58, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41,
	0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12,
	0x1d, 0x0a, 0x19, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x42,
	0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0a,
	0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x22, 0x61, 0x0a, 0x0c, 0x45, 0x78,
	0x65, 0x63, 0x53, 0x74, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x51, 0x0a, 0x09, 0x65, 0x78,
	0x65, 0x63, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f,
	0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x53,
	0x74, 0x65, 0x70, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x53, 0x74, 0x65, 0x70, 0x22, 0xa6, 0x01,
	0x0a, 0x14, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72,
	0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x61, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x46, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67,
	0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x50,
	0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0,
	0x41, 0x02, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x2b, 0x0a, 0x05, 0x53, 0x74, 0x61,
	0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41,
	0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x22, 0xe4, 0x01, 0x0a, 0x12, 0x45, 0x78, 0x65, 0x63, 0x53,
	0x74, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x5f, 0x0a,
	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x44, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69,
	0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74,
	0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x53, 0x74, 0x61,
	0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20,
	0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x05, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65,
	0x22, 0x4b, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41,
	0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12,
	0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x12, 0x0d,
	0x0a, 0x09, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x47, 0x0a,
	0x0d, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1e,
	0x0a, 0x1a, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x56, 0x45,
	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c,
	0x0a, 0x08, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04,
	0x53, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x2a, 0x4c, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x79,
	0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a,
	0x0d, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x10, 0x01,
	0x12, 0x12, 0x0a, 0x0e, 0x45, 0x58, 0x45, 0x43, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x5f, 0x54, 0x41,
	0x53, 0x4b, 0x10, 0x02, 0x42, 0x90, 0x01, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
	0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x42, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x5a, 0x57,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6f, 0x73, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69,
	0x6e, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x3b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x65,
	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescOnce sync.Once
	file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescData = file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDesc
)

func file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescGZIP() []byte {
	file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescOnce.Do(func() {
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescData)
	})
	return file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDescData
}

var file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
var file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_goTypes = []interface{}{
	(TaskDirective)(0),                  // 0: google.cloud.osconfig.agentendpoint.v1beta.TaskDirective
	(TaskType)(0),                       // 1: google.cloud.osconfig.agentendpoint.v1beta.TaskType
	(ApplyPatchesTaskProgress_State)(0), // 2: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskProgress.State
	(ApplyPatchesTaskOutput_State)(0),   // 3: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskOutput.State
	(ExecStepTaskProgress_State)(0),     // 4: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskProgress.State
	(ExecStepTaskOutput_State)(0),       // 5: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskOutput.State
	(*Task)(nil),                        // 6: google.cloud.osconfig.agentendpoint.v1beta.Task
	(*ApplyPatchesTask)(nil),            // 7: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTask
	(*ApplyPatchesTaskProgress)(nil),    // 8: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskProgress
	(*ApplyPatchesTaskOutput)(nil),      // 9: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskOutput
	(*ExecStepTask)(nil),                // 10: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTask
	(*ExecStepTaskProgress)(nil),        // 11: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskProgress
	(*ExecStepTaskOutput)(nil),          // 12: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskOutput
	nil,                                 // 13: google.cloud.osconfig.agentendpoint.v1beta.Task.ServiceLabelsEntry
	(*PatchConfig)(nil),                 // 14: google.cloud.osconfig.agentendpoint.v1beta.PatchConfig
	(*ExecStep)(nil),                    // 15: google.cloud.osconfig.agentendpoint.v1beta.ExecStep
}
var file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_depIdxs = []int32{
	1,  // 0: google.cloud.osconfig.agentendpoint.v1beta.Task.task_type:type_name -> google.cloud.osconfig.agentendpoint.v1beta.TaskType
	0,  // 1: google.cloud.osconfig.agentendpoint.v1beta.Task.task_directive:type_name -> google.cloud.osconfig.agentendpoint.v1beta.TaskDirective
	7,  // 2: google.cloud.osconfig.agentendpoint.v1beta.Task.apply_patches_task:type_name -> google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTask
	10, // 3: google.cloud.osconfig.agentendpoint.v1beta.Task.exec_step_task:type_name -> google.cloud.osconfig.agentendpoint.v1beta.ExecStepTask
	13, // 4: google.cloud.osconfig.agentendpoint.v1beta.Task.service_labels:type_name -> google.cloud.osconfig.agentendpoint.v1beta.Task.ServiceLabelsEntry
	14, // 5: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTask.patch_config:type_name -> google.cloud.osconfig.agentendpoint.v1beta.PatchConfig
	2,  // 6: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskProgress.state:type_name -> google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskProgress.State
	3,  // 7: google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskOutput.state:type_name -> google.cloud.osconfig.agentendpoint.v1beta.ApplyPatchesTaskOutput.State
	15, // 8: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTask.exec_step:type_name -> google.cloud.osconfig.agentendpoint.v1beta.ExecStep
	4,  // 9: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskProgress.state:type_name -> google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskProgress.State
	5,  // 10: google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskOutput.state:type_name -> google.cloud.osconfig.agentendpoint.v1beta.ExecStepTaskOutput.State
	11, // [11:11] is the sub-list for method output_type
	11, // [11:11] is the sub-list for method input_type
	11, // [11:11] is the sub-list for extension type_name
	11, // [11:11] is the sub-list for extension extendee
	0,  // [0:11] is the sub-list for field type_name
}

func init() { file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_init() }
func file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_init() {
	if File_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto != nil {
		return
	}
	file_google_cloud_osconfig_agentendpoint_v1beta_patch_jobs_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Task); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ApplyPatchesTask); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ApplyPatchesTaskProgress); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ApplyPatchesTaskOutput); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecStepTask); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecStepTaskProgress); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecStepTaskOutput); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*Task_ApplyPatchesTask)(nil),
		(*Task_ExecStepTask)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDesc,
			NumEnums:      6,
			NumMessages:   8,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_goTypes,
		DependencyIndexes: file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_depIdxs,
		EnumInfos:         file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_enumTypes,
		MessageInfos:      file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_msgTypes,
	}.Build()
	File_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto = out.File
	file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_rawDesc = nil
	file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_goTypes = nil
	file_google_cloud_osconfig_agentendpoint_v1beta_tasks_proto_depIdxs = nil
}
