// 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_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, 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, 0x02,
	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, 0x81, 0x76, 0xd0, 0x31, 0x98, 0x58,
	0xd1, 0xba, 0x58, 0xf5, 0x1b, 0x1a, 0xdb, 0xd5, 0xc2, 0xbc, 0x58, 0xa1, 0xe7, 0xb0, 0x57, 0xde,
	0xc4, 0xa3, 0x77, 0xef, 0xcb, 0xb5, 0xec, 0xb7, 0xcc, 0x12, 0x0f, 0xc2, 0xe0, 0x57, 0x13, 0x3a,
	0x3a, 0x44, 0x50, 0xc5, 0xd5, 0xba, 0x44, 0x2f, 0xa1, 0x5d, 0xea, 0x97, 0x8e, 0xd9, 0x1d, 0x75,
	0x74, 0x4c, 0x63, 0xb2, 0xda, 0x42, 0x0e, 0xb4, 0x0b, 0x1e, 0x97, 0xf5, 0xe2, 0xdd, 0xd1, 0xd1,
	0x66, 0x17, 0x43, 0x0e, 0x99, 0xb6, 0x59, 0x8d, 0xa1, 0xb7, 0xd0, 0x52, 0xa5, 0x5c, 0x87, 0xeb,
	0x8e, 0x8e, 0xff, 0xe1, 0x1f, 0xde, 0x9c, 0x19, 0x12, 0x9d, 0x40, 0x27, 0xe5, 0x66, 0x73, 0x75,
	0xe1, 0xa6, 0x0e, 0xfe, 0x58, 0x1a, 0xfc, 0xb1, 0x00, 0x36, 0x75, 0x68, 0x1f, 0x9e, 0xcc, 0xe9,
	0x18, 0x5f, 0x10, 0x8a, 0xc7, 0x51, 0x10, 0xba, 0x21, 0xb6, 0xb7, 0x50, 0x0f, 0xfe, 0xf7, 0xfc,
	0xcb, 0x6f, 0x84, 0x4e, 0x22, 0x32, 0x73, 0x27, 0xd8, 0xb6, 0xd0, 0x01, 0xd8, 0x84, 0x06, 0xa1,
	0x3b, 0x9d, 0x6e, 0xd4, 0x6d, 0x55, 0xed, 0xf9, 0xb3, 0x19, 0x09, 0x37, 0x62, 0x43, 0xa1, 0x0c,
	0x9f, 0xfb, 0xbe, 0x16, 0xc7, 0x78, 0x41, 0x3c, 0x6c, 0x37, 0x95, 0x3a, 0xbf, 0x9c, 0x30, 0x77,
	0x8c, 0x23, 0xcf, 0x9f, 0x5d, 0x4e, 0x71, 0x88, 0xed, 0x16, 0x42, 0xd0, 0xbd, 0x57, 0x2f, 0x5c,
	0x32, 0xc5, 0x63, 0xbb, 0x8d, 0x8e, 0x60, 0xdf, 0xf5, 0x42, 0xb2, 0x70, 0x43, 0xe2, 0xd3, 0x0d,
	0xbc, 0x83, 0x0e, 0xa1, 0xf7, 0xc8, 0xa8, 0xf9, 0xdd, 0xc1, 0x4f, 0x0b, 0xda, 0xe6, 0x72, 0x7a,
	0xc8, 0xc3, 0x36, 0x0c, 0xbb, 0x81, 0x4f, 0xed, 0x2d, 0xa5, 0x62, 0xc6, 0x7c, 0x16, 0x11, 0x1a,
	0x31, 0xfc, 0x65, 0x8e, 0x83, 0xd0, 0xb6, 0xd4, 0x68, 0x42, 0x43, 0xcc, 0xa8, 0x3b, 0x8d, 0xb4,
	0x6d, 0x6f, 0xa3, 0xa7, 0x70, 0x68, 0x02, 0x2b, 0xf4, 0x2b, 0xf3, 0xe9, 0xa4, 0xbe, 0x49, 0x43,
	0xdd, 0x84, 0xd0, 0x85, 0x3b, 0x25, 0xe3, 0x7a, 0xd1, 0x26, 0xea, 0xc3, 0x81, 0x61, 0xb4, 0x10,
	0x79, 0x9f, 0xb0, 0xf7, 0x39, 0x98, 0xcf, 0xec, 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, 0x34, 0xd0, 0x41, 0x4a, 0x85, 0x03, 0x00, 0x00,
}
