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

package steps

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	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

type ComputeBackfillRequests struct {
	// Each ComputeBackfillRequest is handled independently.
	Requests             []*ComputeBackfillRequest          `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"`
	TaggedRequests       map[string]*ComputeBackfillRequest `protobuf:"bytes,2,rep,name=tagged_requests,json=taggedRequests,proto3" json:"tagged_requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

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

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

var xxx_messageInfo_ComputeBackfillRequests proto.InternalMessageInfo

func (m *ComputeBackfillRequests) GetRequests() []*ComputeBackfillRequest {
	if m != nil {
		return m.Requests
	}
	return nil
}

func (m *ComputeBackfillRequests) GetTaggedRequests() map[string]*ComputeBackfillRequest {
	if m != nil {
		return m.TaggedRequests
	}
	return nil
}

type ComputeBackfillResponses struct {
	// Each ComputeBackfillResponse corresponds to a single
	// ComputeBackfillRequest handled independently.
	Responses []*ComputeBackfillResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	// tagged_responses only contains responses for requests that need to be
	// backfilled. Successfully completed requests are not included.
	TaggedResponses      map[string]*ComputeBackfillResponse `protobuf:"bytes,2,rep,name=tagged_responses,json=taggedResponses,proto3" json:"tagged_responses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
	XXX_unrecognized     []byte                              `json:"-"`
	XXX_sizecache        int32                               `json:"-"`
}

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

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

var xxx_messageInfo_ComputeBackfillResponses proto.InternalMessageInfo

func (m *ComputeBackfillResponses) GetResponses() []*ComputeBackfillResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *ComputeBackfillResponses) GetTaggedResponses() map[string]*ComputeBackfillResponse {
	if m != nil {
		return m.TaggedResponses
	}
	return nil
}

// ComputeBackfillRequest defines the input of the compute-backfill step.
type ComputeBackfillRequest struct {
	Request              *test_platform.Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
	Enumeration          *EnumerationResponse   `protobuf:"bytes,2,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
	Execution            *ExecuteResponse       `protobuf:"bytes,3,opt,name=execution,proto3" json:"execution,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *ComputeBackfillRequest) Reset()         { *m = ComputeBackfillRequest{} }
func (m *ComputeBackfillRequest) String() string { return proto.CompactTextString(m) }
func (*ComputeBackfillRequest) ProtoMessage()    {}
func (*ComputeBackfillRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_19a837aba2bcf585, []int{2}
}

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

var xxx_messageInfo_ComputeBackfillRequest proto.InternalMessageInfo

func (m *ComputeBackfillRequest) GetRequest() *test_platform.Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *ComputeBackfillRequest) GetEnumeration() *EnumerationResponse {
	if m != nil {
		return m.Enumeration
	}
	return nil
}

func (m *ComputeBackfillRequest) GetExecution() *ExecuteResponse {
	if m != nil {
		return m.Execution
	}
	return nil
}

// ComputeBackfillResponse defines the output of the compute-backfill step.
type ComputeBackfillResponse struct {
	Request              *test_platform.Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *ComputeBackfillResponse) Reset()         { *m = ComputeBackfillResponse{} }
func (m *ComputeBackfillResponse) String() string { return proto.CompactTextString(m) }
func (*ComputeBackfillResponse) ProtoMessage()    {}
func (*ComputeBackfillResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_19a837aba2bcf585, []int{3}
}

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

var xxx_messageInfo_ComputeBackfillResponse proto.InternalMessageInfo

func (m *ComputeBackfillResponse) GetRequest() *test_platform.Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func init() {
	proto.RegisterType((*ComputeBackfillRequests)(nil), "test_platform.steps.ComputeBackfillRequests")
	proto.RegisterMapType((map[string]*ComputeBackfillRequest)(nil), "test_platform.steps.ComputeBackfillRequests.TaggedRequestsEntry")
	proto.RegisterType((*ComputeBackfillResponses)(nil), "test_platform.steps.ComputeBackfillResponses")
	proto.RegisterMapType((map[string]*ComputeBackfillResponse)(nil), "test_platform.steps.ComputeBackfillResponses.TaggedResponsesEntry")
	proto.RegisterType((*ComputeBackfillRequest)(nil), "test_platform.steps.ComputeBackfillRequest")
	proto.RegisterType((*ComputeBackfillResponse)(nil), "test_platform.steps.ComputeBackfillResponse")
}

func init() {
	proto.RegisterFile("test_platform/steps/compute_backfill.proto", fileDescriptor_19a837aba2bcf585)
}

var fileDescriptor_19a837aba2bcf585 = []byte{
	// 411 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcd, 0x4a, 0xf3, 0x40,
	0x14, 0x25, 0x29, 0xdf, 0x4f, 0x6f, 0xc1, 0x96, 0xa9, 0xd4, 0x10, 0x37, 0xa5, 0x2a, 0x14, 0x95,
	0x44, 0xea, 0x46, 0x04, 0x51, 0x23, 0x45, 0xa8, 0xbb, 0xe0, 0xca, 0x4d, 0x49, 0xe3, 0x34, 0x86,
	0x26, 0x99, 0x38, 0x33, 0x11, 0xfb, 0x70, 0xae, 0x7d, 0x07, 0x9f, 0x46, 0x9c, 0xc9, 0x4f, 0xa3,
	0xb3, 0x30, 0xbb, 0xdc, 0xc9, 0x39, 0xe7, 0x9e, 0x7b, 0x26, 0x37, 0x70, 0xc8, 0x31, 0xe3, 0xf3,
	0x34, 0xf2, 0xf8, 0x92, 0xd0, 0xd8, 0x66, 0x1c, 0xa7, 0xcc, 0xf6, 0x49, 0x9c, 0x66, 0x1c, 0xcf,
	0x17, 0x9e, 0xbf, 0x5a, 0x86, 0x51, 0x64, 0xa5, 0x94, 0x70, 0x82, 0xfa, 0x35, 0xac, 0x25, 0xb0,
	0xe6, 0x6e, 0x5d, 0x80, 0xe2, 0xe7, 0x0c, 0x33, 0x2e, 0x19, 0xe6, 0x81, 0x4a, 0x1d, 0x27, 0x59,
	0x8c, 0xa9, 0xc7, 0x43, 0x92, 0xe4, 0xb0, 0x3d, 0x25, 0xec, 0x15, 0xfb, 0x59, 0x05, 0x1a, 0xbd,
	0xe9, 0xb0, 0x73, 0x23, 0x8d, 0x39, 0xb9, 0x2f, 0x57, 0x36, 0x63, 0xe8, 0x16, 0xfe, 0xe7, 0x8d,
	0x99, 0xa1, 0x0d, 0x5b, 0xe3, 0xce, 0xe4, 0xc8, 0x52, 0x98, 0xb5, 0xd4, 0x7c, 0xb7, 0x24, 0xa3,
	0x10, 0xba, 0xdc, 0x0b, 0x02, 0xfc, 0x38, 0x2f, 0xf5, 0x74, 0xa1, 0x77, 0xd5, 0x40, 0x8f, 0x59,
	0xf7, 0x42, 0xa3, 0x28, 0xa7, 0x09, 0xa7, 0x6b, 0x77, 0x8b, 0xd7, 0x0e, 0xcd, 0x04, 0xfa, 0x0a,
	0x18, 0xea, 0x41, 0x6b, 0x85, 0xd7, 0x86, 0x36, 0xd4, 0xc6, 0x6d, 0xf7, 0xeb, 0x11, 0x5d, 0xc3,
	0x9f, 0x17, 0x2f, 0xca, 0xb0, 0xa1, 0x0f, 0xb5, 0xa6, 0x93, 0x49, 0xe6, 0xb9, 0x7e, 0xa6, 0x8d,
	0xde, 0x75, 0x30, 0x7e, 0xa0, 0x58, 0x4a, 0x12, 0x86, 0x19, 0x9a, 0x41, 0x9b, 0x16, 0x45, 0x9e,
	0xe0, 0xf1, 0xef, 0xfa, 0x48, 0x92, 0x5b, 0xd1, 0x51, 0x0c, 0xbd, 0x32, 0xc3, 0x42, 0x52, 0x86,
	0xe8, 0x34, 0x91, 0xac, 0x52, 0xcc, 0x6b, 0x19, 0x63, 0x97, 0xd7, 0x4f, 0xcd, 0x14, 0xb6, 0x55,
	0x40, 0x45, 0x90, 0x4e, 0x3d, 0xc8, 0x66, 0x03, 0x6e, 0x24, 0xf9, 0xa1, 0xc1, 0x40, 0x9d, 0x37,
	0x3a, 0x81, 0x7f, 0xf9, 0x87, 0x23, 0x1a, 0x77, 0x26, 0x83, 0x6f, 0x4d, 0x8a, 0x8b, 0x29, 0x60,
	0x68, 0x06, 0x9d, 0x8d, 0x85, 0xc8, 0xad, 0x8d, 0x95, 0xd6, 0xa6, 0x15, 0xae, 0xb4, 0xb5, 0x49,
	0x46, 0x0e, 0xb4, 0xcb, 0xad, 0x31, 0x5a, 0x42, 0x69, 0x5f, 0xad, 0x24, 0x50, 0xb8, 0xba, 0xbd,
	0x92, 0x36, 0xba, 0x53, 0x6c, 0x99, 0x44, 0x35, 0x1f, 0xce, 0xb9, 0x7c, 0xb8, 0x08, 0x88, 0xe5,
	0x3f, 0x51, 0x12, 0x87, 0x59, 0x6c, 0x11, 0x1a, 0xd8, 0x45, 0x41, 0x98, 0x1d, 0x26, 0x4b, 0xea,
	0xd9, 0x62, 0xbb, 0xed, 0x80, 0xd8, 0x8a, 0x9f, 0xc0, 0xe2, 0xaf, 0x78, 0x7b, 0xfa, 0x19, 0x00,
	0x00, 0xff, 0xff, 0x54, 0x52, 0x29, 0x5e, 0xa7, 0x04, 0x00, 0x00,
}
