// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/skylab_tool/result.proto

package skylab_tool

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// WaitTaskResult describes the format returned by the `skylab wait-task` subcommand.
type WaitTaskResult struct {
	Result               *WaitTaskResult_Task       `protobuf:"bytes,1,opt,name=result,json=task-result,proto3" json:"result,omitempty"`
	Stdout               string                     `protobuf:"bytes,2,opt,name=stdout,proto3" json:"stdout,omitempty"`
	ChildResults         []*WaitTaskResult_Task     `protobuf:"bytes,3,rep,name=child_results,json=child-results,proto3" json:"child_results,omitempty"`
	LogDataUrl           *WaitTaskResult_LogDataURL `protobuf:"bytes,4,opt,name=log_data_url,json=log-data-url,proto3" json:"log_data_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *WaitTaskResult) Reset()         { *m = WaitTaskResult{} }
func (m *WaitTaskResult) String() string { return proto.CompactTextString(m) }
func (*WaitTaskResult) ProtoMessage()    {}
func (*WaitTaskResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_febb2b9b7927acc2, []int{0}
}

func (m *WaitTaskResult) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitTaskResult.Unmarshal(m, b)
}
func (m *WaitTaskResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitTaskResult.Marshal(b, m, deterministic)
}
func (m *WaitTaskResult) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitTaskResult.Merge(m, src)
}
func (m *WaitTaskResult) XXX_Size() int {
	return xxx_messageInfo_WaitTaskResult.Size(m)
}
func (m *WaitTaskResult) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitTaskResult.DiscardUnknown(m)
}

var xxx_messageInfo_WaitTaskResult proto.InternalMessageInfo

func (m *WaitTaskResult) GetResult() *WaitTaskResult_Task {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *WaitTaskResult) GetStdout() string {
	if m != nil {
		return m.Stdout
	}
	return ""
}

func (m *WaitTaskResult) GetChildResults() []*WaitTaskResult_Task {
	if m != nil {
		return m.ChildResults
	}
	return nil
}

func (m *WaitTaskResult) GetLogDataUrl() *WaitTaskResult_LogDataURL {
	if m != nil {
		return m.LogDataUrl
	}
	return nil
}

type WaitTaskResult_Task struct {
	Name  string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"`
	// TODO(crbug.com/964573): Deprecate this field.
	Failure bool `protobuf:"varint,3,opt,name=failure,proto3" json:"failure,omitempty"`
	Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"`
	// Note: These fields are a little problematic, because they are not independently
	// meaningful to the caller; their meaning depends on the namespace (buildbucket vs. swarming)
	// and, in the case of swarming, environment (dev vs. prod).
	// Still, they are used by some clients, so preserved for now.
	// Note the distinction between TaskRunID and TaskRequestID: in buildbucket runs,
	// these will be equal. In swarming runs, they will differ in the last character
	// (this is the difference between a swarming run id and request id).
	TaskRunId     string `protobuf:"bytes,5,opt,name=task_run_id,json=task-run-id,proto3" json:"task_run_id,omitempty"`
	TaskRequestId string `protobuf:"bytes,6,opt,name=task_request_id,json=task-request-id,proto3" json:"task_request_id,omitempty"`
	// Note: these URL fields are only populated for -bb runs; eventually,
	// non-bb runs will be deprecated.
	TaskRunUrl           string   `protobuf:"bytes,7,opt,name=task_run_url,json=task-run-url,proto3" json:"task_run_url,omitempty"`
	TaskLogsUrl          string   `protobuf:"bytes,8,opt,name=task_logs_url,json=task-logs-url,proto3" json:"task_logs_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *WaitTaskResult_Task) Reset()         { *m = WaitTaskResult_Task{} }
func (m *WaitTaskResult_Task) String() string { return proto.CompactTextString(m) }
func (*WaitTaskResult_Task) ProtoMessage()    {}
func (*WaitTaskResult_Task) Descriptor() ([]byte, []int) {
	return fileDescriptor_febb2b9b7927acc2, []int{0, 0}
}

func (m *WaitTaskResult_Task) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitTaskResult_Task.Unmarshal(m, b)
}
func (m *WaitTaskResult_Task) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitTaskResult_Task.Marshal(b, m, deterministic)
}
func (m *WaitTaskResult_Task) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitTaskResult_Task.Merge(m, src)
}
func (m *WaitTaskResult_Task) XXX_Size() int {
	return xxx_messageInfo_WaitTaskResult_Task.Size(m)
}
func (m *WaitTaskResult_Task) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitTaskResult_Task.DiscardUnknown(m)
}

var xxx_messageInfo_WaitTaskResult_Task proto.InternalMessageInfo

func (m *WaitTaskResult_Task) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *WaitTaskResult_Task) GetState() string {
	if m != nil {
		return m.State
	}
	return ""
}

func (m *WaitTaskResult_Task) GetFailure() bool {
	if m != nil {
		return m.Failure
	}
	return false
}

func (m *WaitTaskResult_Task) GetSuccess() bool {
	if m != nil {
		return m.Success
	}
	return false
}

func (m *WaitTaskResult_Task) GetTaskRunId() string {
	if m != nil {
		return m.TaskRunId
	}
	return ""
}

func (m *WaitTaskResult_Task) GetTaskRequestId() string {
	if m != nil {
		return m.TaskRequestId
	}
	return ""
}

func (m *WaitTaskResult_Task) GetTaskRunUrl() string {
	if m != nil {
		return m.TaskRunUrl
	}
	return ""
}

func (m *WaitTaskResult_Task) GetTaskLogsUrl() string {
	if m != nil {
		return m.TaskLogsUrl
	}
	return ""
}

type WaitTaskResult_LogDataURL struct {
	IsolateUrl string `protobuf:"bytes,1,opt,name=isolate_url,json=isolateUrl,proto3" json:"isolate_url,omitempty"` // Deprecated: Do not use.
	// Google Storage URL, in full "gs://bucket/foo/bar/baz" form
	GsUrl                string   `protobuf:"bytes,2,opt,name=gs_url,json=gs-url,proto3" json:"gs_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *WaitTaskResult_LogDataURL) Reset()         { *m = WaitTaskResult_LogDataURL{} }
func (m *WaitTaskResult_LogDataURL) String() string { return proto.CompactTextString(m) }
func (*WaitTaskResult_LogDataURL) ProtoMessage()    {}
func (*WaitTaskResult_LogDataURL) Descriptor() ([]byte, []int) {
	return fileDescriptor_febb2b9b7927acc2, []int{0, 1}
}

func (m *WaitTaskResult_LogDataURL) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitTaskResult_LogDataURL.Unmarshal(m, b)
}
func (m *WaitTaskResult_LogDataURL) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitTaskResult_LogDataURL.Marshal(b, m, deterministic)
}
func (m *WaitTaskResult_LogDataURL) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitTaskResult_LogDataURL.Merge(m, src)
}
func (m *WaitTaskResult_LogDataURL) XXX_Size() int {
	return xxx_messageInfo_WaitTaskResult_LogDataURL.Size(m)
}
func (m *WaitTaskResult_LogDataURL) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitTaskResult_LogDataURL.DiscardUnknown(m)
}

var xxx_messageInfo_WaitTaskResult_LogDataURL proto.InternalMessageInfo

// Deprecated: Do not use.
func (m *WaitTaskResult_LogDataURL) GetIsolateUrl() string {
	if m != nil {
		return m.IsolateUrl
	}
	return ""
}

func (m *WaitTaskResult_LogDataURL) GetGsUrl() string {
	if m != nil {
		return m.GsUrl
	}
	return ""
}

// WaitTasksResult describes the format returned by the `skylab wait-tasks` subcommand.
type WaitTasksResult struct {
	Results []*WaitTaskResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
	// True if an error or timeout was encountered while waiting for tasks to complete.
	Incomplete           bool     `protobuf:"varint,2,opt,name=incomplete,proto3" json:"incomplete,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *WaitTasksResult) Reset()         { *m = WaitTasksResult{} }
func (m *WaitTasksResult) String() string { return proto.CompactTextString(m) }
func (*WaitTasksResult) ProtoMessage()    {}
func (*WaitTasksResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_febb2b9b7927acc2, []int{1}
}

func (m *WaitTasksResult) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitTasksResult.Unmarshal(m, b)
}
func (m *WaitTasksResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitTasksResult.Marshal(b, m, deterministic)
}
func (m *WaitTasksResult) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitTasksResult.Merge(m, src)
}
func (m *WaitTasksResult) XXX_Size() int {
	return xxx_messageInfo_WaitTasksResult.Size(m)
}
func (m *WaitTasksResult) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitTasksResult.DiscardUnknown(m)
}

var xxx_messageInfo_WaitTasksResult proto.InternalMessageInfo

func (m *WaitTasksResult) GetResults() []*WaitTaskResult {
	if m != nil {
		return m.Results
	}
	return nil
}

func (m *WaitTasksResult) GetIncomplete() bool {
	if m != nil {
		return m.Incomplete
	}
	return false
}

func init() {
	proto.RegisterType((*WaitTaskResult)(nil), "test_platform.skylab_tool.WaitTaskResult")
	proto.RegisterType((*WaitTaskResult_Task)(nil), "test_platform.skylab_tool.WaitTaskResult.Task")
	proto.RegisterType((*WaitTaskResult_LogDataURL)(nil), "test_platform.skylab_tool.WaitTaskResult.LogDataURL")
	proto.RegisterType((*WaitTasksResult)(nil), "test_platform.skylab_tool.WaitTasksResult")
}

func init() {
	proto.RegisterFile("test_platform/skylab_tool/result.proto", fileDescriptor_febb2b9b7927acc2)
}

var fileDescriptor_febb2b9b7927acc2 = []byte{
	// 446 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0xcf, 0x6e, 0xd4, 0x30,
	0x10, 0xc6, 0x95, 0xee, 0x76, 0x77, 0x3b, 0xbb, 0x65, 0x25, 0x0b, 0x21, 0xc3, 0x01, 0x45, 0x0b,
	0x42, 0xcb, 0x21, 0x8e, 0x04, 0x3c, 0x41, 0x0b, 0x07, 0x44, 0x4f, 0x56, 0x2b, 0x10, 0x97, 0xc8,
	0x4d, 0xbc, 0xa9, 0xb5, 0x4e, 0xbc, 0xf8, 0x0f, 0x12, 0x0f, 0xcd, 0x0b, 0x70, 0x42, 0x9e, 0x38,
	0xa5, 0x3d, 0x54, 0xaa, 0xb8, 0x79, 0x26, 0xbf, 0xf9, 0x9c, 0xf9, 0x66, 0x0c, 0x6f, 0xbc, 0x74,
	0xbe, 0x3a, 0x68, 0xe1, 0x77, 0xc6, 0x76, 0xa5, 0xdb, 0xff, 0xd2, 0xe2, 0xba, 0xf2, 0xc6, 0xe8,
	0xd2, 0x4a, 0x17, 0xb4, 0x67, 0x07, 0x6b, 0xbc, 0x21, 0xcf, 0xef, 0x71, 0xec, 0x0e, 0xb7, 0xf9,
	0x3d, 0x85, 0x27, 0x5f, 0x85, 0xf2, 0x97, 0xc2, 0xed, 0x39, 0xd6, 0x90, 0x2f, 0x30, 0x1b, 0xaa,
	0x69, 0x96, 0x67, 0xdb, 0xe5, 0x3b, 0xc6, 0x1e, 0x2c, 0x67, 0xf7, 0x4b, 0x19, 0x1e, 0x97, 0x5e,
	0xb8, 0x7d, 0x31, 0x48, 0x90, 0x67, 0x30, 0x73, 0xbe, 0x31, 0xc1, 0xd3, 0xa3, 0x3c, 0xdb, 0x9e,
	0xf0, 0x14, 0x91, 0x4b, 0x38, 0xad, 0x6f, 0x94, 0x6e, 0xaa, 0x81, 0x73, 0x74, 0x92, 0x4f, 0xfe,
	0xe3, 0xae, 0x41, 0x24, 0x5d, 0xe6, 0xc8, 0x37, 0x58, 0x69, 0xd3, 0x56, 0x8d, 0xf0, 0xa2, 0x0a,
	0x56, 0xd3, 0x29, 0x36, 0xf0, 0xe1, 0xf1, 0xa2, 0x17, 0xa6, 0xfd, 0x28, 0xbc, 0xb8, 0xe2, 0x17,
	0x3c, 0x2a, 0x15, 0x51, 0xa9, 0x08, 0x56, 0xbf, 0xf8, 0x93, 0xc1, 0x34, 0x72, 0x84, 0xc0, 0xb4,
	0x17, 0x9d, 0x44, 0x6f, 0x4e, 0x38, 0x9e, 0xc9, 0x53, 0x38, 0x76, 0x5e, 0x78, 0x99, 0x7a, 0x1c,
	0x02, 0x42, 0x61, 0xbe, 0x13, 0x4a, 0x07, 0x2b, 0xe9, 0x24, 0xcf, 0xb6, 0x0b, 0x3e, 0x86, 0xf1,
	0x8b, 0x0b, 0x75, 0x2d, 0x9d, 0xc3, 0x3f, 0x5c, 0xf0, 0x31, 0x24, 0x39, 0xa0, 0x7b, 0x95, 0x0d,
	0x7d, 0xa5, 0x1a, 0x7a, 0x8c, 0x7a, 0xc9, 0xd0, 0xd0, 0x17, 0xaa, 0x21, 0x5b, 0x58, 0x0f, 0x84,
	0xfc, 0x11, 0x62, 0x57, 0xaa, 0xa1, 0x33, 0xa4, 0xd6, 0xc9, 0x76, 0x4c, 0x47, 0x72, 0x03, 0xab,
	0x5b, 0xad, 0x68, 0xc6, 0x1c, 0xb1, 0xd5, 0xad, 0x58, 0xb0, 0x9a, 0xbc, 0x86, 0x53, 0x64, 0xb4,
	0x69, 0x1d, 0x42, 0x0b, 0x84, 0x30, 0x59, 0xc4, 0x24, 0x36, 0xff, 0x19, 0xe0, 0x9f, 0x31, 0xe4,
	0x15, 0x2c, 0x95, 0x33, 0x5a, 0x78, 0x89, 0x15, 0x68, 0xc4, 0xd9, 0x11, 0xcd, 0x38, 0xa4, 0xf4,
	0x95, 0xd5, 0x71, 0xee, 0x49, 0x31, 0xcd, 0x7d, 0x90, 0xda, 0xfc, 0x84, 0xf5, 0x68, 0xb9, 0x4b,
	0xfb, 0x76, 0x0e, 0xf3, 0x71, 0x09, 0x32, 0x5c, 0x82, 0xb7, 0x8f, 0x9e, 0x17, 0x1f, 0x2b, 0xc9,
	0x4b, 0x00, 0xd5, 0xd7, 0xa6, 0x3b, 0x68, 0x99, 0xe6, 0xb0, 0xe0, 0x77, 0x32, 0x67, 0x9f, 0xbe,
	0x9f, 0xb7, 0x86, 0xd5, 0x37, 0xd6, 0x74, 0x2a, 0x74, 0xcc, 0xd8, 0xb6, 0x1c, 0x03, 0xe3, 0x4a,
	0xd5, 0xef, 0xac, 0x28, 0xf1, 0xb1, 0x94, 0xad, 0x29, 0x1f, 0x7c, 0x56, 0xd7, 0x33, 0x64, 0xde,
	0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x31, 0xce, 0xb6, 0xfc, 0x7a, 0x03, 0x00, 0x00,
}
