# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: dmi/sw_management_service.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
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 hw_pb2 as dmi_dot_hw__pb2
from dmi import sw_image_pb2 as dmi_dot_sw__image__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='dmi/sw_management_service.proto',
  package='dmi',
  syntax='proto3',
  serialized_options=_b('Z9github.com/opencord/device-management-interface/v3/go/dmi'),
  serialized_pb=_b('\n\x1f\x64mi/sw_management_service.proto\x12\x03\x64mi\x1a\x0c\x64mi/hw.proto\x1a\x12\x64mi/sw_image.proto\"u\n\x1aSoftwareVersionInformation\x12*\n\x0f\x61\x63tive_versions\x18\x01 \x03(\x0b\x32\x11.dmi.ImageVersion\x12+\n\x10standby_versions\x18\x02 \x03(\x0b\x32\x11.dmi.ImageVersion\"a\n\x14\x44ownloadImageRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12)\n\nimage_info\x18\x02 \x01(\x0b\x32\x15.dmi.ImageInformation2\x9c\x02\n\x1fNativeSoftwareManagementService\x12\x46\n\x12GetSoftwareVersion\x12\x0f.dmi.HardwareID\x1a\x1f.dmi.SoftwareVersionInformation\x12>\n\rDownloadImage\x12\x19.dmi.DownloadImageRequest\x1a\x10.dmi.ImageStatus0\x01\x12\x34\n\rActivateImage\x12\x0f.dmi.HardwareID\x1a\x10.dmi.ImageStatus0\x01\x12;\n\x14RevertToStandbyImage\x12\x0f.dmi.HardwareID\x1a\x10.dmi.ImageStatus0\x01\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')
  ,
  dependencies=[dmi_dot_hw__pb2.DESCRIPTOR,dmi_dot_sw__image__pb2.DESCRIPTOR,])




_SOFTWAREVERSIONINFORMATION = _descriptor.Descriptor(
  name='SoftwareVersionInformation',
  full_name='dmi.SoftwareVersionInformation',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='active_versions', full_name='dmi.SoftwareVersionInformation.active_versions', index=0,
      number=1, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='standby_versions', full_name='dmi.SoftwareVersionInformation.standby_versions', index=1,
      number=2, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=74,
  serialized_end=191,
)


_DOWNLOADIMAGEREQUEST = _descriptor.Descriptor(
  name='DownloadImageRequest',
  full_name='dmi.DownloadImageRequest',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='device_uuid', full_name='dmi.DownloadImageRequest.device_uuid', index=0,
      number=1, type=11, cpp_type=10, label=1,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='image_info', full_name='dmi.DownloadImageRequest.image_info', index=1,
      number=2, type=11, cpp_type=10, label=1,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=193,
  serialized_end=290,
)

_SOFTWAREVERSIONINFORMATION.fields_by_name['active_versions'].message_type = dmi_dot_sw__image__pb2._IMAGEVERSION
_SOFTWAREVERSIONINFORMATION.fields_by_name['standby_versions'].message_type = dmi_dot_sw__image__pb2._IMAGEVERSION
_DOWNLOADIMAGEREQUEST.fields_by_name['device_uuid'].message_type = dmi_dot_hw__pb2._UUID
_DOWNLOADIMAGEREQUEST.fields_by_name['image_info'].message_type = dmi_dot_sw__image__pb2._IMAGEINFORMATION
DESCRIPTOR.message_types_by_name['SoftwareVersionInformation'] = _SOFTWAREVERSIONINFORMATION
DESCRIPTOR.message_types_by_name['DownloadImageRequest'] = _DOWNLOADIMAGEREQUEST
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

SoftwareVersionInformation = _reflection.GeneratedProtocolMessageType('SoftwareVersionInformation', (_message.Message,), dict(
  DESCRIPTOR = _SOFTWAREVERSIONINFORMATION,
  __module__ = 'dmi.sw_management_service_pb2'
  # @@protoc_insertion_point(class_scope:dmi.SoftwareVersionInformation)
  ))
_sym_db.RegisterMessage(SoftwareVersionInformation)

DownloadImageRequest = _reflection.GeneratedProtocolMessageType('DownloadImageRequest', (_message.Message,), dict(
  DESCRIPTOR = _DOWNLOADIMAGEREQUEST,
  __module__ = 'dmi.sw_management_service_pb2'
  # @@protoc_insertion_point(class_scope:dmi.DownloadImageRequest)
  ))
_sym_db.RegisterMessage(DownloadImageRequest)


DESCRIPTOR._options = None

_NATIVESOFTWAREMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
  name='NativeSoftwareManagementService',
  full_name='dmi.NativeSoftwareManagementService',
  file=DESCRIPTOR,
  index=0,
  serialized_options=None,
  serialized_start=293,
  serialized_end=577,
  methods=[
  _descriptor.MethodDescriptor(
    name='GetSoftwareVersion',
    full_name='dmi.NativeSoftwareManagementService.GetSoftwareVersion',
    index=0,
    containing_service=None,
    input_type=dmi_dot_hw__pb2._HARDWAREID,
    output_type=_SOFTWAREVERSIONINFORMATION,
    serialized_options=None,
  ),
  _descriptor.MethodDescriptor(
    name='DownloadImage',
    full_name='dmi.NativeSoftwareManagementService.DownloadImage',
    index=1,
    containing_service=None,
    input_type=_DOWNLOADIMAGEREQUEST,
    output_type=dmi_dot_sw__image__pb2._IMAGESTATUS,
    serialized_options=None,
  ),
  _descriptor.MethodDescriptor(
    name='ActivateImage',
    full_name='dmi.NativeSoftwareManagementService.ActivateImage',
    index=2,
    containing_service=None,
    input_type=dmi_dot_hw__pb2._HARDWAREID,
    output_type=dmi_dot_sw__image__pb2._IMAGESTATUS,
    serialized_options=None,
  ),
  _descriptor.MethodDescriptor(
    name='RevertToStandbyImage',
    full_name='dmi.NativeSoftwareManagementService.RevertToStandbyImage',
    index=3,
    containing_service=None,
    input_type=dmi_dot_hw__pb2._HARDWAREID,
    output_type=dmi_dot_sw__image__pb2._IMAGESTATUS,
    serialized_options=None,
  ),
])
_sym_db.RegisterServiceDescriptor(_NATIVESOFTWAREMANAGEMENTSERVICE)

DESCRIPTOR.services_by_name['NativeSoftwareManagementService'] = _NATIVESOFTWAREMANAGEMENTSERVICE

# @@protoc_insertion_point(module_scope)
