# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: dmi/sw_image.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from dmi import commons_pb2 as dmi_dot_commons__pb2


DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x64mi/sw_image.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\"3\n\x0cImageVersion\x12\x12\n\nimage_name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\"x\n\x10ImageInformation\x12 \n\x05image\x18\x01 \x01(\x0b\x32\x11.dmi.ImageVersion\x12\x1c\n\x14image_install_script\x18\x02 \x01(\t\x12\x11\n\timage_url\x18\x03 \x01(\t\x12\x11\n\tsha256sum\x18\x05 \x01(\t\"\xe2\x04\n\x0bImageStatus\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\'\n\x06reason\x18\x02 \x01(\x0e\x32\x17.dmi.ImageStatus.Reason\x12*\n\x05state\x18\x03 \x01(\x0e\x32\x1b.dmi.ImageStatus.ImageState\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"\xd0\x01\n\nImageState\x12\x13\n\x0fUNDEFINED_STATE\x10\x00\x12\x11\n\rCOPYING_IMAGE\x10\x01\x12\x14\n\x10INSTALLING_IMAGE\x10\x02\x12\x14\n\x10\x43OMMITTING_IMAGE\x10\x03\x12\x14\n\x10REBOOTING_DEVICE\x10\x04\x12\x14\n\x10UPGRADE_COMPLETE\x10\x05\x12\x12\n\x0eUPGRADE_FAILED\x10\x06\x12\x17\n\x13\x41\x43TIVATION_COMPLETE\x10\x07\x12\x15\n\x11\x41\x43TIVATION_FAILED\x10\x08\"\xe1\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x14\n\x10\x45RROR_IN_REQUEST\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x19\n\x15\x44\x45VICE_IN_WRONG_STATE\x10\x03\x12\x11\n\rINVALID_IMAGE\x10\x04\x12\x18\n\x14WRONG_IMAGE_CHECKSUM\x10\x05\x12!\n\x1dOPERATION_ALREADY_IN_PROGRESS\x10\x06\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x07\x12\x18\n\x14\x44\x45VICE_NOT_REACHABLE\x10\x08\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')



_IMAGEVERSION = DESCRIPTOR.message_types_by_name['ImageVersion']
_IMAGEINFORMATION = DESCRIPTOR.message_types_by_name['ImageInformation']
_IMAGESTATUS = DESCRIPTOR.message_types_by_name['ImageStatus']
_IMAGESTATUS_IMAGESTATE = _IMAGESTATUS.enum_types_by_name['ImageState']
_IMAGESTATUS_REASON = _IMAGESTATUS.enum_types_by_name['Reason']
ImageVersion = _reflection.GeneratedProtocolMessageType('ImageVersion', (_message.Message,), {
  'DESCRIPTOR' : _IMAGEVERSION,
  '__module__' : 'dmi.sw_image_pb2'
  # @@protoc_insertion_point(class_scope:dmi.ImageVersion)
  })
_sym_db.RegisterMessage(ImageVersion)

ImageInformation = _reflection.GeneratedProtocolMessageType('ImageInformation', (_message.Message,), {
  'DESCRIPTOR' : _IMAGEINFORMATION,
  '__module__' : 'dmi.sw_image_pb2'
  # @@protoc_insertion_point(class_scope:dmi.ImageInformation)
  })
_sym_db.RegisterMessage(ImageInformation)

ImageStatus = _reflection.GeneratedProtocolMessageType('ImageStatus', (_message.Message,), {
  'DESCRIPTOR' : _IMAGESTATUS,
  '__module__' : 'dmi.sw_image_pb2'
  # @@protoc_insertion_point(class_scope:dmi.ImageStatus)
  })
_sym_db.RegisterMessage(ImageStatus)

if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  DESCRIPTOR._serialized_options = b'Z9github.com/opencord/device-management-interface/v3/go/dmi'
  _IMAGEVERSION._serialized_start=46
  _IMAGEVERSION._serialized_end=97
  _IMAGEINFORMATION._serialized_start=99
  _IMAGEINFORMATION._serialized_end=219
  _IMAGESTATUS._serialized_start=222
  _IMAGESTATUS._serialized_end=832
  _IMAGESTATUS_IMAGESTATE._serialized_start=396
  _IMAGESTATUS_IMAGESTATE._serialized_end=604
  _IMAGESTATUS_REASON._serialized_start=607
  _IMAGESTATUS_REASON._serialized_end=832
# @@protoc_insertion_point(module_scope)
