// 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_COMMITTING_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: "COMMITTING_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,
	"COMMITTING_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_REASON      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_REASON",
	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_REASON":      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
	// The image_url would contain the protocol, credentials, the IP address/DNS of the server and the path of the file
	// e.g. sftp://download_user:download_pass@192.168.0.1:22/images/image1
	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_REASON
}

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, 0x33, 0x0d, 0x23, 0x92, 0x71, 0x19, 0x3b,
	0x41, 0xb0, 0xb1, 0x5c, 0x7b, 0x9a, 0x8e, 0x94, 0xb1, 0x2b, 0xdb, 0x29, 0xaf, 0xc1, 0x13, 0xb0,
	0xe6, 0x71, 0x78, 0x24, 0x34, 0x33, 0x6e, 0x53, 0x89, 0xdd, 0xf8, 0x77, 0xce, 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, 0x4a, 0x48, 0x72, 0x29, 0xf3, 0xac, 0x34, 0x7c, 0x30, 0x81,
	0xff, 0x88, 0xb2, 0x2d, 0x78, 0x51, 0x8a, 0x3c, 0x43, 0x2f, 0x00, 0x74, 0x59, 0x94, 0xc5, 0x92,
	0xf7, 0xad, 0x13, 0xeb, 0xf5, 0x1e, 0xdb, 0xd3, 0x84, 0xc6, 0x92, 0xa3, 0x3e, 0xec, 0xdc, 0x19,
	0x67, 0x7f, 0x5b, 0x6b, 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, 0xe8, 0xe8, 0x0d, 0x1c, 0x98, 0xb1, 0x22, 0x2b, 0xab, 0x78, 0xb5, 0x8a, 0xca,
	0xa4, 0x10, 0xb7, 0x55, 0x3d, 0x04, 0x09, 0xd3, 0x58, 0x4b, 0x81, 0x56, 0xd0, 0x31, 0x98, 0x58,
	0xd1, 0xba, 0x58, 0xf5, 0x1b, 0xda, 0xb6, 0xab, 0xc1, 0xbc, 0x58, 0xa1, 0xe7, 0xb0, 0x57, 0xde,
	0xc4, 0xa3, 0x77, 0xef, 0xcb, 0xb5, 0xec, 0xb7, 0xcc, 0x12, 0x0f, 0x60, 0xf0, 0xab, 0x09, 0x1d,
	0x1d, 0x22, 0xa8, 0xe2, 0x6a, 0x5d, 0xa2, 0x97, 0xd0, 0x2e, 0xf5, 0x4b, 0xc7, 0xec, 0x8e, 0x3a,
	0x3a, 0xa6, 0x11, 0x59, 0x2d, 0x21, 0x07, 0xda, 0x05, 0x8f, 0xcb, 0x7a, 0xf1, 0xee, 0xe8, 0x68,
	0xb3, 0x8b, 0x71, 0x0e, 0x99, 0x96, 0x59, 0x6d, 0x43, 0x6f, 0xa1, 0xa5, 0x4a, 0xb9, 0x0e, 0xd7,
	0x1d, 0x1d, 0xff, 0xe3, 0x7f, 0x78, 0x73, 0x66, 0x9c, 0xe8, 0x04, 0x3a, 0x29, 0x37, 0x9b, 0xab,
	0x0b, 0x37, 0x75, 0xf0, 0xc7, 0x68, 0xf0, 0xc7, 0x02, 0xd8, 0xd4, 0xa1, 0x7d, 0x78, 0x32, 0xa7,
	0x63, 0x7c, 0x41, 0x28, 0x1e, 0x47, 0x41, 0xe8, 0x86, 0xd8, 0xde, 0x42, 0x3d, 0xf8, 0xdf, 0xf3,
	0x2f, 0xbf, 0x11, 0x3a, 0x89, 0xc8, 0xcc, 0x9d, 0x60, 0xdb, 0x42, 0x07, 0x60, 0x13, 0x1a, 0x84,
	0xee, 0x74, 0xba, 0xa1, 0xdb, 0x8a, 0x7a, 0xfe, 0x6c, 0x46, 0xc2, 0x70, 0x43, 0x1b, 0x8a, 0x32,
	0x7c, 0xee, 0xfb, 0x1a, 0x8e, 0xf1, 0x82, 0x78, 0xd8, 0x6e, 0x2a, 0x3a, 0xbf, 0x9c, 0x30, 0x77,
	0x8c, 0x23, 0xcf, 0x9f, 0x5d, 0x4e, 0x71, 0x88, 0xed, 0x16, 0x42, 0xd0, 0xbd, 0xa7, 0x17, 0x2e,
	0x99, 0xe2, 0xb1, 0xdd, 0x46, 0x47, 0xb0, 0xef, 0x7a, 0x21, 0x59, 0xb8, 0x21, 0xf1, 0xe9, 0xc6,
	0xbc, 0x83, 0x0e, 0xa1, 0xf7, 0x48, 0xa8, 0xfd, 0xbb, 0x83, 0x9f, 0x16, 0xb4, 0xcd, 0xe9, 0xf4,
	0x90, 0x87, 0x75, 0x18, 0x76, 0x03, 0x9f, 0xda, 0x5b, 0x8a, 0x62, 0xc6, 0x7c, 0x16, 0x11, 0x1a,
	0x31, 0xfc, 0x65, 0x8e, 0x83, 0xd0, 0xb6, 0xd4, 0x68, 0x42, 0x43, 0xcc, 0xa8, 0x3b, 0x8d, 0xb4,
	0x6c, 0x6f, 0xa3, 0xa7, 0x70, 0x68, 0x02, 0x2b, 0xeb, 0x57, 0xe6, 0xd3, 0x49, 0x7d, 0x94, 0x86,
	0x3a, 0x0a, 0xa1, 0x0b, 0x77, 0x4a, 0xc6, 0xf5, 0xa2, 0x4d, 0xd4, 0x87, 0x03, 0xe3, 0xd1, 0x20,
	0xf2, 0x3e, 0x61, 0xef, 0x73, 0x30, 0x9f, 0xd9, 0xad, 0xf3, 0x8f, 0xdf, 0x3f, 0x2c, 0x45, 0x75,
	0xb3, 0xbe, 0x1a, 0x26, 0xb9, 0x74, 0xf2, 0x5b, 0x9e, 0x25, 0x79, 0x91, 0x3a, 0x29, 0xbf, 0x13,
	0x09, 0x3f, 0x95, 0x71, 0x16, 0x2f, 0xb9, 0xe4, 0x59, 0x75, 0x2a, 0xb2, 0x8a, 0x17, 0xd7, 0x71,
	0xc2, 0x9d, 0xbb, 0x33, 0x67, 0x99, 0x3b, 0xa9, 0x14, 0x57, 0x6d, 0xfd, 0x63, 0x9d, 0xfd, 0x0d,
	0x00, 0x00, 0xff, 0xff, 0x43, 0x5f, 0xa7, 0xa1, 0x86, 0x03, 0x00, 0x00,
}
