// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/payload_config.proto

package chromiumos

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

// An enum of possible delta types.
type PayloadProperties_DeltaType int32

const (
	PayloadProperties_NOT_SET        PayloadProperties_DeltaType = 0
	PayloadProperties_NO_DELTA       PayloadProperties_DeltaType = 1
	PayloadProperties_OMAHA          PayloadProperties_DeltaType = 2
	PayloadProperties_STEPPING_STONE PayloadProperties_DeltaType = 3
	PayloadProperties_MILESTONE      PayloadProperties_DeltaType = 4
	PayloadProperties_FSI            PayloadProperties_DeltaType = 5
)

var PayloadProperties_DeltaType_name = map[int32]string{
	0: "NOT_SET",
	1: "NO_DELTA",
	2: "OMAHA",
	3: "STEPPING_STONE",
	4: "MILESTONE",
	5: "FSI",
}

var PayloadProperties_DeltaType_value = map[string]int32{
	"NOT_SET":        0,
	"NO_DELTA":       1,
	"OMAHA":          2,
	"STEPPING_STONE": 3,
	"MILESTONE":      4,
	"FSI":            5,
}

func (x PayloadProperties_DeltaType) String() string {
	return proto.EnumName(PayloadProperties_DeltaType_name, int32(x))
}

func (PayloadProperties_DeltaType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_cefb278a7cd72110, []int{1, 0}
}

type PayloadConfig struct {
	// This is current configuration for payloads.
	Delta                []*PayloadProperties `protobuf:"bytes,1,rep,name=delta,proto3" json:"delta,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_PayloadConfig proto.InternalMessageInfo

func (m *PayloadConfig) GetDelta() []*PayloadProperties {
	if m != nil {
		return m.Delta
	}
	return nil
}

// This is a single payload config field.
type PayloadProperties struct {
	// The board to be considered for signing.
	Board *PayloadProperties_Board `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
	// The delta type to generate for the payload.
	DeltaType PayloadProperties_DeltaType `protobuf:"varint,2,opt,name=delta_type,json=deltaType,proto3,enum=chromiumos.PayloadProperties_DeltaType" json:"delta_type,omitempty"`
	// The channel to sign payloads for (e.g. 'dev', 'stable', or '').
	Channel string `protobuf:"bytes,3,opt,name=channel,proto3" json:"channel,omitempty"`
	// The chrome os version (e.g. '12240.0.0' or '').
	ChromeOsVersion string `protobuf:"bytes,4,opt,name=chrome_os_version,json=chromeOsVersion,proto3" json:"chrome_os_version,omitempty"`
	// The version of chrome within the payload (e.g. '78.0.3877.0').
	ChromeVersion string `protobuf:"bytes,5,opt,name=chrome_version,json=chromeVersion,proto3" json:"chrome_version,omitempty"`
	// The milestone number (e.g. 73).
	Milestone uint32 `protobuf:"varint,6,opt,name=milestone,proto3" json:"milestone,omitempty"`
	// Generate the image update deltas.
	GenerateDelta bool `protobuf:"varint,7,opt,name=generate_delta,json=generateDelta,proto3" json:"generate_delta,omitempty"`
	// Test the image update deltas we generated post signing.
	DeltaPayloadTests bool `protobuf:"varint,8,opt,name=delta_payload_tests,json=deltaPayloadTests,proto3" json:"delta_payload_tests,omitempty"`
	// Do a full payload test.
	FullPayloadTests bool `protobuf:"varint,9,opt,name=full_payload_tests,json=fullPayloadTests,proto3" json:"full_payload_tests,omitempty"`
	// An array of model names: ['teemo', 'kench', 'sion'].
	// While we generally don't like repeated scalars, it conforms to the json.
	ApplicableModels     []string `protobuf:"bytes,10,rep,name=applicable_models,json=applicableModels,proto3" json:"applicable_models,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PayloadProperties proto.InternalMessageInfo

func (m *PayloadProperties) GetBoard() *PayloadProperties_Board {
	if m != nil {
		return m.Board
	}
	return nil
}

func (m *PayloadProperties) GetDeltaType() PayloadProperties_DeltaType {
	if m != nil {
		return m.DeltaType
	}
	return PayloadProperties_NOT_SET
}

func (m *PayloadProperties) GetChannel() string {
	if m != nil {
		return m.Channel
	}
	return ""
}

func (m *PayloadProperties) GetChromeOsVersion() string {
	if m != nil {
		return m.ChromeOsVersion
	}
	return ""
}

func (m *PayloadProperties) GetChromeVersion() string {
	if m != nil {
		return m.ChromeVersion
	}
	return ""
}

func (m *PayloadProperties) GetMilestone() uint32 {
	if m != nil {
		return m.Milestone
	}
	return 0
}

func (m *PayloadProperties) GetGenerateDelta() bool {
	if m != nil {
		return m.GenerateDelta
	}
	return false
}

func (m *PayloadProperties) GetDeltaPayloadTests() bool {
	if m != nil {
		return m.DeltaPayloadTests
	}
	return false
}

func (m *PayloadProperties) GetFullPayloadTests() bool {
	if m != nil {
		return m.FullPayloadTests
	}
	return false
}

func (m *PayloadProperties) GetApplicableModels() []string {
	if m != nil {
		return m.ApplicableModels
	}
	return nil
}

// A board type and builder name, and if it is currently active.
type PayloadProperties_Board struct {
	// The board's public codename (e.g. nyan-kitty).
	PublicCodename string `protobuf:"bytes,1,opt,name=public_codename,json=publicCodename,proto3" json:"public_codename,omitempty"`
	// Is the board currently being supported.
	IsActive bool `protobuf:"varint,2,opt,name=is_active,json=isActive,proto3" json:"is_active,omitempty"`
	// What is the builder name for the board (e.g. nyan_kitty).
	BuilderName          string   `protobuf:"bytes,3,opt,name=builder_name,json=builderName,proto3" json:"builder_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PayloadProperties_Board proto.InternalMessageInfo

func (m *PayloadProperties_Board) GetPublicCodename() string {
	if m != nil {
		return m.PublicCodename
	}
	return ""
}

func (m *PayloadProperties_Board) GetIsActive() bool {
	if m != nil {
		return m.IsActive
	}
	return false
}

func (m *PayloadProperties_Board) GetBuilderName() string {
	if m != nil {
		return m.BuilderName
	}
	return ""
}

func init() {
	proto.RegisterEnum("chromiumos.PayloadProperties_DeltaType", PayloadProperties_DeltaType_name, PayloadProperties_DeltaType_value)
	proto.RegisterType((*PayloadConfig)(nil), "chromiumos.PayloadConfig")
	proto.RegisterType((*PayloadProperties)(nil), "chromiumos.PayloadProperties")
	proto.RegisterType((*PayloadProperties_Board)(nil), "chromiumos.PayloadProperties.Board")
}

func init() { proto.RegisterFile("chromiumos/payload_config.proto", fileDescriptor_cefb278a7cd72110) }

var fileDescriptor_cefb278a7cd72110 = []byte{
	// 506 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0x5f, 0x6b, 0xdb, 0x30,
	0x14, 0xc5, 0xe7, 0xa6, 0x6e, 0xe2, 0x9b, 0x26, 0x75, 0xb4, 0x17, 0xb3, 0x3f, 0xcc, 0xeb, 0x18,
	0x35, 0xdb, 0x70, 0x20, 0x1d, 0x83, 0x3d, 0xa6, 0x4d, 0xba, 0x05, 0x9a, 0x3f, 0x38, 0x66, 0x0f,
	0x83, 0x21, 0x14, 0x5b, 0x49, 0x05, 0xb2, 0x65, 0x24, 0xa7, 0x90, 0xef, 0xb3, 0x0f, 0x3a, 0x22,
	0xd9, 0x4d, 0xb7, 0x41, 0xdf, 0x7c, 0xcf, 0xf9, 0xe9, 0xc0, 0xf5, 0x91, 0xe0, 0x4d, 0x72, 0x27,
	0x45, 0xc6, 0xb6, 0x99, 0x50, 0xfd, 0x82, 0xec, 0xb8, 0x20, 0x29, 0x4e, 0x44, 0xbe, 0x66, 0x9b,
	0xb0, 0x90, 0xa2, 0x14, 0x08, 0x0e, 0xc0, 0xf9, 0x08, 0x3a, 0x0b, 0xc3, 0x5c, 0x6b, 0x04, 0x5d,
	0x82, 0x9d, 0x52, 0x5e, 0x12, 0xcf, 0xf2, 0x1b, 0x41, 0x7b, 0xf0, 0x3a, 0x3c, 0xc0, 0x61, 0x45,
	0x2e, 0xa4, 0x28, 0xa8, 0x2c, 0x19, 0x55, 0x91, 0x61, 0xcf, 0x7f, 0xdb, 0xd0, 0xfb, 0xcf, 0x44,
	0x5f, 0xc1, 0x5e, 0x09, 0x22, 0x53, 0xcf, 0xf2, 0xad, 0xa0, 0x3d, 0x78, 0xf7, 0x64, 0x54, 0x78,
	0xb5, 0x47, 0x23, 0x73, 0x02, 0xdd, 0x00, 0xe8, 0x64, 0x5c, 0xee, 0x0a, 0xea, 0x1d, 0xf9, 0x56,
	0xd0, 0x1d, 0x5c, 0x3c, 0x7d, 0x7e, 0xb4, 0xe7, 0xe3, 0x5d, 0x41, 0x23, 0x27, 0xad, 0x3f, 0x91,
	0x07, 0xcd, 0xe4, 0x8e, 0xe4, 0x39, 0xe5, 0x5e, 0xc3, 0xb7, 0x02, 0x27, 0xaa, 0x47, 0xf4, 0x01,
	0x7a, 0x3a, 0x8e, 0x62, 0xa1, 0xf0, 0x3d, 0x95, 0x8a, 0x89, 0xdc, 0x3b, 0xd6, 0xcc, 0x99, 0x31,
	0xe6, 0xea, 0x87, 0x91, 0xd1, 0x7b, 0xe8, 0x56, 0x6c, 0x0d, 0xda, 0x1a, 0xec, 0x18, 0xb5, 0xc6,
	0x5e, 0x81, 0x93, 0x31, 0x4e, 0x55, 0x29, 0x72, 0xea, 0x9d, 0xf8, 0x56, 0xd0, 0x89, 0x0e, 0xc2,
	0x3e, 0x64, 0x43, 0x73, 0x2a, 0x49, 0x49, 0xb1, 0xf9, 0xc3, 0x4d, 0xdf, 0x0a, 0x5a, 0x51, 0xa7,
	0x56, 0xf5, 0x02, 0x28, 0x84, 0xe7, 0x66, 0xf3, 0xba, 0xba, 0x92, 0xaa, 0x52, 0x79, 0x2d, 0xcd,
	0xf6, 0xb4, 0x55, 0xed, 0x1e, 0xef, 0x0d, 0xf4, 0x09, 0xd0, 0x7a, 0xcb, 0xf9, 0x3f, 0xb8, 0xa3,
	0x71, 0x77, 0xef, 0xfc, 0x45, 0x7f, 0x84, 0x1e, 0x29, 0x0a, 0xce, 0x12, 0xb2, 0xe2, 0x14, 0x67,
	0x22, 0xa5, 0x5c, 0x79, 0xe0, 0x37, 0x02, 0x27, 0x72, 0x0f, 0xc6, 0x54, 0xeb, 0x2f, 0x0a, 0xb0,
	0x75, 0x29, 0xe8, 0x02, 0xce, 0x8a, 0xed, 0x8a, 0xb3, 0x04, 0x27, 0x22, 0xa5, 0x39, 0xc9, 0xa8,
	0xae, 0xd4, 0x89, 0xba, 0x46, 0xbe, 0xae, 0x54, 0xf4, 0x12, 0x1c, 0xa6, 0x30, 0x49, 0x4a, 0x76,
	0x6f, 0x5a, 0x6b, 0x45, 0x2d, 0xa6, 0x86, 0x7a, 0x46, 0x6f, 0xe1, 0x74, 0xb5, 0x65, 0x3c, 0xa5,
	0x12, 0xeb, 0x08, 0x53, 0x48, 0xbb, 0xd2, 0x66, 0x24, 0xa3, 0xe7, 0xbf, 0xc0, 0x79, 0xa8, 0x11,
	0xb5, 0xa1, 0x39, 0x9b, 0xc7, 0x78, 0x39, 0x8e, 0xdd, 0x67, 0xe8, 0x14, 0x5a, 0xb3, 0x39, 0x1e,
	0x8d, 0x6f, 0xe3, 0xa1, 0x6b, 0x21, 0x07, 0xec, 0xf9, 0x74, 0xf8, 0x7d, 0xe8, 0x1e, 0x21, 0x04,
	0xdd, 0x65, 0x3c, 0x5e, 0x2c, 0x26, 0xb3, 0x6f, 0x78, 0x19, 0xcf, 0x67, 0x63, 0xb7, 0x81, 0x3a,
	0xe0, 0x4c, 0x27, 0xb7, 0x63, 0x33, 0x1e, 0xa3, 0x26, 0x34, 0x6e, 0x96, 0x13, 0xd7, 0xbe, 0xfa,
	0xf2, 0xf3, 0xf3, 0x46, 0x3c, 0xdc, 0xa2, 0x50, 0xc8, 0x4d, 0xff, 0xd1, 0x5b, 0x61, 0xf9, 0x5a,
	0x92, 0xbe, 0x7e, 0x22, 0xfd, 0x8d, 0x78, 0xe4, 0xac, 0x4e, 0xb4, 0x78, 0xf9, 0x27, 0x00, 0x00,
	0xff, 0xff, 0xe1, 0x5c, 0xbf, 0x57, 0x5a, 0x03, 0x00, 0x00,
}
