// Code generated by protoc-gen-go. DO NOT EDIT.
// source: dmi/sw_image.proto

package dmi

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

type ImageStatus_ImageState int32

const (
	ImageStatus_UNDEFINED_STATE     ImageStatus_ImageState = 0
	ImageStatus_COPYING_IMAGE       ImageStatus_ImageState = 1
	ImageStatus_INSTALLING_IMAGE    ImageStatus_ImageState = 2
	ImageStatus_COMMITING_IMAGE     ImageStatus_ImageState = 3
	ImageStatus_REBOOTING_DEVICE    ImageStatus_ImageState = 4
	ImageStatus_UPGRADE_COMPLETE    ImageStatus_ImageState = 5
	ImageStatus_UPGRADE_FAILED      ImageStatus_ImageState = 6
	ImageStatus_ACTIVATION_COMPLETE ImageStatus_ImageState = 7
	ImageStatus_ACTIVATION_FAILED   ImageStatus_ImageState = 8
)

var ImageStatus_ImageState_name = map[int32]string{
	0: "UNDEFINED_STATE",
	1: "COPYING_IMAGE",
	2: "INSTALLING_IMAGE",
	3: "COMMITING_IMAGE",
	4: "REBOOTING_DEVICE",
	5: "UPGRADE_COMPLETE",
	6: "UPGRADE_FAILED",
	7: "ACTIVATION_COMPLETE",
	8: "ACTIVATION_FAILED",
}

var ImageStatus_ImageState_value = map[string]int32{
	"UNDEFINED_STATE":     0,
	"COPYING_IMAGE":       1,
	"INSTALLING_IMAGE":    2,
	"COMMITING_IMAGE":     3,
	"REBOOTING_DEVICE":    4,
	"UPGRADE_COMPLETE":    5,
	"UPGRADE_FAILED":      6,
	"ACTIVATION_COMPLETE": 7,
	"ACTIVATION_FAILED":   8,
}

func (x ImageStatus_ImageState) String() string {
	return proto.EnumName(ImageStatus_ImageState_name, int32(x))
}

func (ImageStatus_ImageState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3d058607a829baf4, []int{2, 0}
}

type ImageStatus_Reason int32

const (
	ImageStatus_UNDEFINED_READON      ImageStatus_Reason = 0
	ImageStatus_ERROR_IN_REQUEST      ImageStatus_Reason = 1
	ImageStatus_INTERNAL_ERROR        ImageStatus_Reason = 2
	ImageStatus_DEVICE_IN_WRONG_STATE ImageStatus_Reason = 3
	ImageStatus_INVALID_IMAGE         ImageStatus_Reason = 4
	ImageStatus_WRONG_IMAGE_CHECKSUM  ImageStatus_Reason = 5
)

var ImageStatus_Reason_name = map[int32]string{
	0: "UNDEFINED_READON",
	1: "ERROR_IN_REQUEST",
	2: "INTERNAL_ERROR",
	3: "DEVICE_IN_WRONG_STATE",
	4: "INVALID_IMAGE",
	5: "WRONG_IMAGE_CHECKSUM",
}

var ImageStatus_Reason_value = map[string]int32{
	"UNDEFINED_READON":      0,
	"ERROR_IN_REQUEST":      1,
	"INTERNAL_ERROR":        2,
	"DEVICE_IN_WRONG_STATE": 3,
	"INVALID_IMAGE":         4,
	"WRONG_IMAGE_CHECKSUM":  5,
}

func (x ImageStatus_Reason) String() string {
	return proto.EnumName(ImageStatus_Reason_name, int32(x))
}

func (ImageStatus_Reason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3d058607a829baf4, []int{2, 1}
}

type ImageVersion struct {
	ImageName            string   `protobuf:"bytes,1,opt,name=image_name,json=imageName,proto3" json:"image_name,omitempty"`
	Version              string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ImageVersion proto.InternalMessageInfo

func (m *ImageVersion) GetImageName() string {
	if m != nil {
		return m.ImageName
	}
	return ""
}

func (m *ImageVersion) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

type ImageInformation struct {
	Image *ImageVersion `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"`
	// Script used by the device specific managers to install the image.
	// Script must be included in the object downloaded from the image_url
	ImageInstallScript string `protobuf:"bytes,2,opt,name=image_install_script,json=imageInstallScript,proto3" json:"image_install_script,omitempty"`
	// Location of the image and installation script, authentication (user/pass) if any should be in the url string
	ImageUrl string `protobuf:"bytes,3,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
	// SHA-256 sum of the image (sha256sum on Linux)
	Sha256Sum            string   `protobuf:"bytes,5,opt,name=sha256sum,proto3" json:"sha256sum,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ImageInformation proto.InternalMessageInfo

func (m *ImageInformation) GetImage() *ImageVersion {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *ImageInformation) GetImageInstallScript() string {
	if m != nil {
		return m.ImageInstallScript
	}
	return ""
}

func (m *ImageInformation) GetImageUrl() string {
	if m != nil {
		return m.ImageUrl
	}
	return ""
}

func (m *ImageInformation) GetSha256Sum() string {
	if m != nil {
		return m.Sha256Sum
	}
	return ""
}

type ImageStatus struct {
	Status Status                 `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
	Reason ImageStatus_Reason     `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.ImageStatus_Reason" json:"reason,omitempty"`
	State  ImageStatus_ImageState `protobuf:"varint,3,opt,name=state,proto3,enum=dmi.ImageStatus_ImageState" json:"state,omitempty"`
	// description contains more information about the current state of the procedure and is device dependant
	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ImageStatus proto.InternalMessageInfo

func (m *ImageStatus) GetStatus() Status {
	if m != nil {
		return m.Status
	}
	return Status_UNDEFINED_STATUS
}

func (m *ImageStatus) GetReason() ImageStatus_Reason {
	if m != nil {
		return m.Reason
	}
	return ImageStatus_UNDEFINED_READON
}

func (m *ImageStatus) GetState() ImageStatus_ImageState {
	if m != nil {
		return m.State
	}
	return ImageStatus_UNDEFINED_STATE
}

func (m *ImageStatus) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func init() {
	proto.RegisterEnum("dmi.ImageStatus_ImageState", ImageStatus_ImageState_name, ImageStatus_ImageState_value)
	proto.RegisterEnum("dmi.ImageStatus_Reason", ImageStatus_Reason_name, ImageStatus_Reason_value)
	proto.RegisterType((*ImageVersion)(nil), "dmi.ImageVersion")
	proto.RegisterType((*ImageInformation)(nil), "dmi.ImageInformation")
	proto.RegisterType((*ImageStatus)(nil), "dmi.ImageStatus")
}

func init() { proto.RegisterFile("dmi/sw_image.proto", fileDescriptor_3d058607a829baf4) }

var fileDescriptor_3d058607a829baf4 = []byte{
	// 572 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x93, 0xcf, 0x6e, 0xd3, 0x4c,
	0x14, 0xc5, 0xeb, 0xe6, 0x4f, 0xdb, 0x9b, 0xef, 0x0b, 0xce, 0xb4, 0x55, 0x03, 0x05, 0xa9, 0x0a,
	0x0b, 0xd8, 0x34, 0x86, 0x54, 0x20, 0x21, 0x56, 0xae, 0x3d, 0x0d, 0x23, 0x92, 0x71, 0x99, 0x38,
	0x41, 0xb0, 0xb1, 0x5c, 0x7b, 0x9a, 0x8e, 0x94, 0xb1, 0x2b, 0xdb, 0x29, 0xaf, 0xc1, 0x0b, 0xb0,
	0xe7, 0x6d, 0x78, 0x25, 0x34, 0x33, 0x6e, 0x53, 0x89, 0xdd, 0xf8, 0x9c, 0xdf, 0xbd, 0xf7, 0xdc,
	0x2b, 0x19, 0x50, 0x2a, 0x85, 0x53, 0xfe, 0x88, 0x84, 0x8c, 0x97, 0x7c, 0x78, 0x5b, 0xe4, 0x55,
	0x8e, 0x1a, 0xa9, 0x14, 0xcf, 0x7a, 0xca, 0x48, 0x72, 0x29, 0xf3, 0xac, 0x34, 0xfa, 0x60, 0x0c,
	0xff, 0x11, 0x85, 0x2d, 0x78, 0x51, 0x8a, 0x3c, 0x43, 0x2f, 0x00, 0x74, 0x59, 0x94, 0xc5, 0x92,
	0xf7, 0xad, 0x13, 0xeb, 0xf5, 0x1e, 0xdb, 0xd3, 0x0a, 0x8d, 0x25, 0x47, 0x7d, 0xd8, 0xb9, 0x33,
	0x64, 0x7f, 0x5b, 0x7b, 0xf7, 0x9f, 0x83, 0xdf, 0x16, 0xd8, 0xba, 0x13, 0xc9, 0xae, 0xf3, 0x42,
	0xc6, 0x95, 0xea, 0xf6, 0x0a, 0x5a, 0xba, 0x56, 0x37, 0xea, 0x8c, 0x7a, 0xc3, 0x54, 0x8a, 0xe1,
	0xe3, 0x79, 0xcc, 0xf8, 0xe8, 0x0d, 0x1c, 0x98, 0xb1, 0x22, 0x2b, 0xab, 0x78, 0xb5, 0x8a, 0xca,
	0xa4, 0x10, 0xb7, 0x55, 0x3d, 0x04, 0x09, 0xd3, 0x58, 0x5b, 0x33, 0xed, 0xa0, 0x63, 0x30, 0xb1,
	0xa2, 0x75, 0xb1, 0xea, 0x37, 0x34, 0xb6, 0xab, 0x85, 0x79, 0xb1, 0x42, 0xcf, 0x61, 0xaf, 0xbc,
	0x89, 0x47, 0xef, 0xde, 0x97, 0x6b, 0xd9, 0x6f, 0x99, 0x25, 0x1e, 0x84, 0xc1, 0xaf, 0x26, 0x74,
	0x74, 0x88, 0x59, 0x15, 0x57, 0xeb, 0x12, 0xbd, 0x84, 0x76, 0xa9, 0x5f, 0x3a, 0x66, 0x77, 0xd4,
	0xd1, 0x31, 0x8d, 0xc9, 0x6a, 0x0b, 0x39, 0xd0, 0x2e, 0x78, 0x5c, 0xd6, 0x8b, 0x77, 0x47, 0x47,
	0x9b, 0x5d, 0x0c, 0x39, 0x64, 0xda, 0x66, 0x35, 0x86, 0xde, 0x42, 0x4b, 0x95, 0x72, 0x1d, 0xae,
	0x3b, 0x3a, 0xfe, 0x87, 0x7f, 0x78, 0x73, 0x66, 0x48, 0x74, 0x02, 0x9d, 0x94, 0x9b, 0xcd, 0xd5,
	0x85, 0x9b, 0x3a, 0xf8, 0x63, 0x69, 0xf0, 0xc7, 0x02, 0xd8, 0xd4, 0xa1, 0x7d, 0x78, 0x32, 0xa7,
	0x3e, 0xbe, 0x20, 0x14, 0xfb, 0xd1, 0x2c, 0x74, 0x43, 0x6c, 0x6f, 0xa1, 0x1e, 0xfc, 0xef, 0x05,
	0x97, 0xdf, 0x08, 0x1d, 0x47, 0x64, 0xea, 0x8e, 0xb1, 0x6d, 0xa1, 0x03, 0xb0, 0x09, 0x9d, 0x85,
	0xee, 0x64, 0xb2, 0x51, 0xb7, 0x55, 0xb5, 0x17, 0x4c, 0xa7, 0x24, 0xdc, 0x88, 0x0d, 0x85, 0x32,
	0x7c, 0x1e, 0x04, 0x5a, 0xf4, 0xf1, 0x82, 0x78, 0xd8, 0x6e, 0x2a, 0x75, 0x7e, 0x39, 0x66, 0xae,
	0x8f, 0x23, 0x2f, 0x98, 0x5e, 0x4e, 0x70, 0x88, 0xed, 0x16, 0x42, 0xd0, 0xbd, 0x57, 0x2f, 0x5c,
	0x32, 0xc1, 0xbe, 0xdd, 0x46, 0x47, 0xb0, 0xef, 0x7a, 0x21, 0x59, 0xb8, 0x21, 0x09, 0xe8, 0x06,
	0xde, 0x41, 0x87, 0xd0, 0x7b, 0x64, 0xd4, 0xfc, 0xee, 0xe0, 0xa7, 0x05, 0x6d, 0x73, 0x39, 0x3d,
	0xe4, 0x61, 0x1b, 0x86, 0x5d, 0x3f, 0xa0, 0xf6, 0x96, 0x52, 0x31, 0x63, 0x01, 0x8b, 0x08, 0x8d,
	0x18, 0xfe, 0x32, 0xc7, 0xb3, 0xd0, 0xb6, 0xd4, 0x68, 0x42, 0x43, 0xcc, 0xa8, 0x3b, 0x89, 0xb4,
	0x6d, 0x6f, 0xa3, 0xa7, 0x70, 0x68, 0x02, 0x2b, 0xf4, 0x2b, 0x0b, 0xe8, 0xb8, 0xbe, 0x49, 0x43,
	0xdd, 0x84, 0xd0, 0x85, 0x3b, 0x21, 0x7e, 0xbd, 0x68, 0x13, 0xf5, 0xe1, 0xc0, 0x30, 0x5a, 0x88,
	0xbc, 0x4f, 0xd8, 0xfb, 0x3c, 0x9b, 0x4f, 0xed, 0xd6, 0xf9, 0xc7, 0xef, 0x1f, 0x96, 0xa2, 0xba,
	0x59, 0x5f, 0x0d, 0x93, 0x5c, 0x3a, 0xf9, 0x2d, 0xcf, 0x92, 0xbc, 0x48, 0x9d, 0x94, 0xdf, 0x89,
	0x84, 0x9f, 0xca, 0x38, 0x8b, 0x97, 0x5c, 0xf2, 0xac, 0x3a, 0x15, 0x59, 0xc5, 0x8b, 0xeb, 0x38,
	0xe1, 0xce, 0xdd, 0x99, 0xb3, 0xcc, 0x9d, 0x54, 0x8a, 0xab, 0xb6, 0xfe, 0xaf, 0xce, 0xfe, 0x06,
	0x00, 0x00, 0xff, 0xff, 0xbe, 0x44, 0x10, 0x9d, 0x85, 0x03, 0x00, 0x00,
}
