Skip to content

Update protos branch and implement new RPCs #412

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions docs/examples/_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@
BoundingBoxLabelsByFilterRequest,
BoundingBoxLabelsByFilterResponse,
CaptureMetadata,
ConfigureDatabaseUserRequest,
ConfigureDatabaseUserResponse,
DataServiceBase,
DeleteBinaryDataByFilterRequest,
DeleteBinaryDataByFilterResponse,
DeleteBinaryDataByIDsRequest,
DeleteBinaryDataByIDsResponse,
DeleteTabularDataRequest,
DeleteTabularDataResponse,
DeleteTabularDataByFilterRequest,
DeleteTabularDataByFilterResponse,
GetDatabaseConnectionRequest,
GetDatabaseConnectionResponse,
RemoveBoundingBoxFromImageByIDResponse,
RemoveBoundingBoxFromImageByIDRequest,
RemoveTagsFromBinaryDataByFilterRequest,
Expand All @@ -54,6 +60,8 @@
AppServiceBase,
GetUserIDByEmailRequest,
GetUserIDByEmailResponse,
CreateKeyRequest,
CreateKeyResponse,
CreateOrganizationRequest,
CreateOrganizationResponse,
ListOrganizationsRequest,
Expand All @@ -64,6 +72,8 @@
GetOrganizationResponse,
GetOrganizationNamespaceAvailabilityRequest,
GetOrganizationNamespaceAvailabilityResponse,
GetRobotAPIKeysRequest,
GetRobotAPIKeysResponse,
UpdateOrganizationRequest,
UpdateOrganizationResponse,
DeleteOrganizationRequest,
Expand Down Expand Up @@ -227,6 +237,9 @@ async def BinaryDataByIDs(self, stream: Stream[BinaryDataByIDsRequest, BinaryDat
async def DeleteTabularDataByFilter(self, stream: Stream[DeleteTabularDataByFilterRequest, DeleteTabularDataByFilterResponse]) -> None:
pass

async def DeleteTabularData(self, stream: Stream[DeleteTabularDataRequest, DeleteTabularDataResponse]) -> None:
pass

async def DeleteBinaryDataByFilter(self, stream: Stream[DeleteBinaryDataByFilterRequest, DeleteBinaryDataByFilterResponse]) -> None:
pass

Expand Down Expand Up @@ -265,6 +278,12 @@ async def RemoveBoundingBoxFromImageByID(
async def BoundingBoxLabelsByFilter(self, stream: Stream[BoundingBoxLabelsByFilterRequest, BoundingBoxLabelsByFilterResponse]) -> None:
pass

async def GetDatabaseConnection(self, stream: Stream[GetDatabaseConnectionRequest, GetDatabaseConnectionResponse]) -> None:
pass

async def ConfigureDatabaseUser(self, stream: Stream[ConfigureDatabaseUserRequest, ConfigureDatabaseUserResponse]) -> None:
pass


class MockDataSync(DataSyncServiceBase):
async def DataCaptureUpload(self, stream: Stream[DataCaptureUploadRequest, DataCaptureUploadResponse]) -> None:
Expand Down Expand Up @@ -496,6 +515,12 @@ async def GetModule(self, stream: Stream[GetModuleRequest, GetModuleResponse]) -
async def ListModules(self, stream: Stream[ListModulesRequest, ListModulesResponse]) -> None:
pass

async def CreateKey(self, stream: Stream[CreateKeyRequest, CreateKeyResponse]) -> None:
pass

async def GetRobotAPIKeys(self, stream: Stream[GetRobotAPIKeysRequest, GetRobotAPIKeysResponse]) -> None:
pass


async def main(*, host: str = "127.0.0.1", port: int = 9092) -> None:
server = Server([MockData(), MockDataSync(), MockApp()])
Expand Down
10 changes: 5 additions & 5 deletions src/viam/app/app_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1133,8 +1133,6 @@ async def update_module(
description (str): A short description of the module that explains its purpose.
models (Optional[List[viam.proto.app.Model]]): list of models that are available in the module.
entrypoint (str): The executable to run to start the module program.
organization_id (Optional[str]): ID of organization of the module being updated, required if no namespace exists in the
module ID.
public (bool): The visibility that should be set for the module. Defaults to False (private).

Raises:
Expand All @@ -1145,7 +1143,6 @@ async def update_module(
"""
request = UpdateModuleRequest(
module_id=module_id,
organization_id=organization_id if organization_id else "",
visibility=Visibility.VISIBILITY_PUBLIC if public else Visibility.VISIBILITY_PRIVATE,
url=url,
description=description,
Expand Down Expand Up @@ -1186,8 +1183,7 @@ async def get_module(self, module_id: str) -> Module:
Returns:
viam.proto.app.Module: The module.
"""
organization_id = await self._get_organization_id()
request = GetModuleRequest(module_id=module_id, organization_id=organization_id)
request = GetModuleRequest(module_id=module_id)
response: GetModuleResponse = await self._app_client.GetModule(request, metadata=self._metadata)
return response.module

Expand All @@ -1201,3 +1197,7 @@ async def list_modules(self) -> List[Module]:
request = ListModulesRequest(organization_id=organization_id)
response: ListModulesResponse = await self._app_client.ListModules(request, metadata=self._metadata)
return list(response.modules)

# TODO: implement
async def create_key(self, authorizations: List[Authorization], name: str) -> Tuple[str, str]:
raise NotImplementedError()
43 changes: 34 additions & 9 deletions src/viam/app/data_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@
DeleteBinaryDataByFilterResponse,
DeleteBinaryDataByIDsRequest,
DeleteBinaryDataByIDsResponse,
DeleteTabularDataByFilterRequest,
DeleteTabularDataByFilterResponse,
DeleteTabularDataRequest,
DeleteTabularDataResponse,
Filter,
GetDatabaseConnectionRequest,
GetDatabaseConnectionResponse,
RemoveTagsFromBinaryDataByFilterRequest,
RemoveTagsFromBinaryDataByFilterResponse,
RemoveTagsFromBinaryDataByIDsRequest,
Expand Down Expand Up @@ -259,18 +261,22 @@ async def binary_data_by_ids(
LOGGER.error(f"Failed to write binary data to file {dest}", exc_info=e)
return [DataClient.BinaryData(data.binary, data.metadata) for data in response.data]

async def delete_tabular_data_by_filter(self, filter: Optional[Filter]) -> int:
"""Filter and delete tabular data.
async def delete_tabular_data(self, organization_id: str, delete_older_than_days: int) -> int:
"""Delete tabular data older than a specified number of days.

Args:
filter (viam.proto.app.data.Filter): Optional `Filter` specifying tabular data to delete. Passing an empty `Filter` will lead to
all data being deleted. Exercise caution when using this option.
organization_id (str): ID of organization to delete data from.
delete_older_than_days (int): Delete data that was captured up to this many days ago. For example if `delete_older_than_days`
is 10, this deletes any data that was captured up to 10 days ago. If it is 0, all existing data is deleted.
"""
filter = filter if filter else Filter()
request = DeleteTabularDataByFilterRequest(filter=filter)
response: DeleteTabularDataByFilterResponse = await self._data_client.DeleteTabularDataByFilter(request, metadata=self._metadata)
request = DeleteTabularDataRequest(organization_id=organization_id, delete_older_than_days=delete_older_than_days)
response: DeleteTabularDataResponse = await self._data_client.DeleteTabularData(request, metadata=self._metadata)
return response.deleted_count

async def delete_tabular_data_by_filter(self, filter: Optional[Filter]) -> int:
"""Deprecated: use delete_tabular_data instead."""
raise NotImplementedError()

async def delete_binary_data_by_filter(self, filter: Optional[Filter]) -> int:
"""Filter and delete binary data.

Expand Down Expand Up @@ -405,6 +411,25 @@ async def bounding_box_labels_by_filter(self, filter: Optional[Filter] = None) -
response: BoundingBoxLabelsByFilterResponse = await self._data_client.BoundingBoxLabelsByFilter(request, metadata=self._metadata)
return list(response.labels)

async def get_database_connection(self, organization_id: str) -> str:
"""Get a connection to access a MongoDB Atlas Data federation instance.

Args:
organization_id (str): Organization to retrieve the connection for.

Returns:
str: The hostname of the federated database.
"""
request = GetDatabaseConnectionRequest(organization_id=organization_id)
response: GetDatabaseConnectionResponse = await self._data_client.GetDatabaseConnection(
request, metadata=self._metadata
)
return response.hostname

# TODO: implement
async def configure_database_user(self) -> None:
raise NotImplementedError()

async def binary_data_capture_upload(
self,
binary_data: bytes,
Expand Down
16 changes: 8 additions & 8 deletions src/viam/gen/app/cloudslam/v1/cloud_slam_pb2.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ....common.v1 import common_pb2 as common_dot_v1_dot_common__pb2
from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!app/cloudslam/v1/cloud_slam.proto\x12\x15viam.app.cloudslam.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\xc6\x02\n\x1aStartMappingSessionRequest\x128\n\x0bslam_config\x18\x01 \x01(\x0b2\x17.google.protobuf.StructR\nslamConfig\x12!\n\x0cslam_version\x18\x02 \x01(\tR\x0bslamVersion\x12\x19\n\x08map_name\x18\x03 \x01(\tR\x07mapName\x12\'\n\x0forganization_id\x18\x04 \x01(\tR\x0eorganizationId\x12\x1f\n\x0blocation_id\x18\x05 \x01(\tR\nlocationId\x12\x19\n\x08robot_id\x18\x06 \x01(\tR\x07robotId\x12.\n\x13viam_server_version\x18\x07 \x01(\tR\x11viamServerVersion\x12\x1b\n\tis_online\x18\x08 \x01(\x08R\x08isOnline"<\n\x1bStartMappingSessionResponse\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"D\n\'GetActiveMappingSessionsForRobotRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId"I\n(GetActiveMappingSessionsForRobotResponse\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"C\n"GetMappingSessionPointCloudRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"h\n#GetMappingSessionPointCloudResponse\x12\x17\n\x07map_url\x18\x01 \x01(\tR\x06mapUrl\x12(\n\x04pose\x18\x02 \x01(\x0b2\x14.viam.common.v1.PoseR\x04pose"f\n\x1aListMappingSessionsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId"_\n\x1bListMappingSessionsResponse\x12@\n\x07session\x18\x01 \x03(\x0b2&.viam.app.cloudslam.v1.MappingMetadataR\x07session":\n\x19StopMappingSessionRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"U\n\x1aStopMappingSessionResponse\x12\x1d\n\npackage_id\x18\x01 \x01(\tR\tpackageId\x12\x18\n\x07version\x18\x02 \x01(\tR\x07version"E\n$GetMappingSessionMetadataByIDRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"z\n%GetMappingSessionMetadataByIDResponse\x12Q\n\x10session_metadata\x18\x01 \x01(\x0b2&.viam.app.cloudslam.v1.MappingMetadataR\x0fsessionMetadata"\xbb\x01\n\'UpdateMappingSessionMetadataByIDRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId\x12\x1d\n\nend_status\x18\x02 \x01(\tR\tendStatus\x12R\n\x18time_cloud_run_job_ended\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\x14timeCloudRunJobEnded"*\n(UpdateMappingSessionMetadataByIDResponse"\xf6\x04\n\x0fMappingMetadata\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId\x12\x19\n\x08robot_id\x18\x03 \x01(\tR\x07robotId\x12L\n\x14time_start_submitted\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampR\x12timeStartSubmitted\x12V\n\x1atime_cloud_run_job_started\x18\x05 \x01(\x0b2\x1a.google.protobuf.TimestampR\x16timeCloudRunJobStarted\x12H\n\x12time_end_submitted\x18\x06 \x01(\x0b2\x1a.google.protobuf.TimestampR\x10timeEndSubmitted\x12R\n\x18time_cloud_run_job_ended\x18\x07 \x01(\x0b2\x1a.google.protobuf.TimestampR\x14timeCloudRunJobEnded\x12\x1d\n\nend_status\x18\x08 \x01(\tR\tendStatus\x12\'\n\x10cloud_run_job_id\x18\t \x01(\tR\rcloudRunJobId\x12.\n\x13viam_server_version\x18\n \x01(\tR\x11viamServerVersion\x12\x19\n\x08map_name\x18\x0b \x01(\tR\x07mapName\x12!\n\x0cslam_version\x18\x0c \x01(\tR\x0bslamVersion\x12\x16\n\x06config\x18\r \x01(\tR\x06config2\x89\x08\n\x10CloudSLAMService\x12|\n\x13StartMappingSession\x121.viam.app.cloudslam.v1.StartMappingSessionRequest\x1a2.viam.app.cloudslam.v1.StartMappingSessionResponse\x12\xa3\x01\n GetActiveMappingSessionsForRobot\x12>.viam.app.cloudslam.v1.GetActiveMappingSessionsForRobotRequest\x1a?.viam.app.cloudslam.v1.GetActiveMappingSessionsForRobotResponse\x12\x94\x01\n\x1bGetMappingSessionPointCloud\x129.viam.app.cloudslam.v1.GetMappingSessionPointCloudRequest\x1a:.viam.app.cloudslam.v1.GetMappingSessionPointCloudResponse\x12|\n\x13ListMappingSessions\x121.viam.app.cloudslam.v1.ListMappingSessionsRequest\x1a2.viam.app.cloudslam.v1.ListMappingSessionsResponse\x12y\n\x12StopMappingSession\x120.viam.app.cloudslam.v1.StopMappingSessionRequest\x1a1.viam.app.cloudslam.v1.StopMappingSessionResponse\x12\x9a\x01\n\x1dGetMappingSessionMetadataByID\x12;.viam.app.cloudslam.v1.GetMappingSessionMetadataByIDRequest\x1a<.viam.app.cloudslam.v1.GetMappingSessionMetadataByIDResponse\x12\xa3\x01\n UpdateMappingSessionMetadataByID\x12>.viam.app.cloudslam.v1.UpdateMappingSessionMetadataByIDRequest\x1a?.viam.app.cloudslam.v1.UpdateMappingSessionMetadataByIDResponseB"Z go.viam.com/api/app/cloudslam/v1b\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!app/cloudslam/v1/cloud_slam.proto\x12\x15viam.app.cloudslam.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\xc6\x02\n\x1aStartMappingSessionRequest\x128\n\x0bslam_config\x18\x01 \x01(\x0b2\x17.google.protobuf.StructR\nslamConfig\x12!\n\x0cslam_version\x18\x02 \x01(\tR\x0bslamVersion\x12\x19\n\x08map_name\x18\x03 \x01(\tR\x07mapName\x12\'\n\x0forganization_id\x18\x04 \x01(\tR\x0eorganizationId\x12\x1f\n\x0blocation_id\x18\x05 \x01(\tR\nlocationId\x12\x19\n\x08robot_id\x18\x06 \x01(\tR\x07robotId\x12.\n\x13viam_server_version\x18\x07 \x01(\tR\x11viamServerVersion\x12\x1b\n\tis_online\x18\x08 \x01(\x08R\x08isOnline"<\n\x1bStartMappingSessionResponse\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"D\n\'GetActiveMappingSessionsForRobotRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId"I\n(GetActiveMappingSessionsForRobotResponse\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"C\n"GetMappingSessionPointCloudRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"h\n#GetMappingSessionPointCloudResponse\x12\x17\n\x07map_url\x18\x01 \x01(\tR\x06mapUrl\x12(\n\x04pose\x18\x02 \x01(\x0b2\x14.viam.common.v1.PoseR\x04pose"f\n\x1aListMappingSessionsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId"_\n\x1bListMappingSessionsResponse\x12@\n\x07session\x18\x01 \x03(\x0b2&.viam.app.cloudslam.v1.MappingMetadataR\x07session":\n\x19StopMappingSessionRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"U\n\x1aStopMappingSessionResponse\x12\x1d\n\npackage_id\x18\x01 \x01(\tR\tpackageId\x12\x18\n\x07version\x18\x02 \x01(\tR\x07version"E\n$GetMappingSessionMetadataByIDRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId"z\n%GetMappingSessionMetadataByIDResponse\x12Q\n\x10session_metadata\x18\x01 \x01(\x0b2&.viam.app.cloudslam.v1.MappingMetadataR\x0fsessionMetadata"\xd8\x01\n\'UpdateMappingSessionMetadataByIDRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId\x12\x1d\n\nend_status\x18\x02 \x01(\tR\tendStatus\x12R\n\x18time_cloud_run_job_ended\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\x14timeCloudRunJobEnded\x12\x1b\n\terror_msg\x18\x04 \x01(\tR\x08errorMsg"*\n(UpdateMappingSessionMetadataByIDResponse"\x93\x05\n\x0fMappingMetadata\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId\x12\x19\n\x08robot_id\x18\x03 \x01(\tR\x07robotId\x12L\n\x14time_start_submitted\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampR\x12timeStartSubmitted\x12V\n\x1atime_cloud_run_job_started\x18\x05 \x01(\x0b2\x1a.google.protobuf.TimestampR\x16timeCloudRunJobStarted\x12H\n\x12time_end_submitted\x18\x06 \x01(\x0b2\x1a.google.protobuf.TimestampR\x10timeEndSubmitted\x12R\n\x18time_cloud_run_job_ended\x18\x07 \x01(\x0b2\x1a.google.protobuf.TimestampR\x14timeCloudRunJobEnded\x12\x1d\n\nend_status\x18\x08 \x01(\tR\tendStatus\x12\'\n\x10cloud_run_job_id\x18\t \x01(\tR\rcloudRunJobId\x12.\n\x13viam_server_version\x18\n \x01(\tR\x11viamServerVersion\x12\x19\n\x08map_name\x18\x0b \x01(\tR\x07mapName\x12!\n\x0cslam_version\x18\x0c \x01(\tR\x0bslamVersion\x12\x16\n\x06config\x18\r \x01(\tR\x06config\x12\x1b\n\terror_msg\x18\x0e \x01(\tR\x08errorMsg2\x89\x08\n\x10CloudSLAMService\x12|\n\x13StartMappingSession\x121.viam.app.cloudslam.v1.StartMappingSessionRequest\x1a2.viam.app.cloudslam.v1.StartMappingSessionResponse\x12\xa3\x01\n GetActiveMappingSessionsForRobot\x12>.viam.app.cloudslam.v1.GetActiveMappingSessionsForRobotRequest\x1a?.viam.app.cloudslam.v1.GetActiveMappingSessionsForRobotResponse\x12\x94\x01\n\x1bGetMappingSessionPointCloud\x129.viam.app.cloudslam.v1.GetMappingSessionPointCloudRequest\x1a:.viam.app.cloudslam.v1.GetMappingSessionPointCloudResponse\x12|\n\x13ListMappingSessions\x121.viam.app.cloudslam.v1.ListMappingSessionsRequest\x1a2.viam.app.cloudslam.v1.ListMappingSessionsResponse\x12y\n\x12StopMappingSession\x120.viam.app.cloudslam.v1.StopMappingSessionRequest\x1a1.viam.app.cloudslam.v1.StopMappingSessionResponse\x12\x9a\x01\n\x1dGetMappingSessionMetadataByID\x12;.viam.app.cloudslam.v1.GetMappingSessionMetadataByIDRequest\x1a<.viam.app.cloudslam.v1.GetMappingSessionMetadataByIDResponse\x12\xa3\x01\n UpdateMappingSessionMetadataByID\x12>.viam.app.cloudslam.v1.UpdateMappingSessionMetadataByIDRequest\x1a?.viam.app.cloudslam.v1.UpdateMappingSessionMetadataByIDResponseB"Z go.viam.com/api/app/cloudslam/v1b\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'app.cloudslam.v1.cloud_slam_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
Expand Down Expand Up @@ -38,10 +38,10 @@
_GETMAPPINGSESSIONMETADATABYIDRESPONSE._serialized_start = 1277
_GETMAPPINGSESSIONMETADATABYIDRESPONSE._serialized_end = 1399
_UPDATEMAPPINGSESSIONMETADATABYIDREQUEST._serialized_start = 1402
_UPDATEMAPPINGSESSIONMETADATABYIDREQUEST._serialized_end = 1589
_UPDATEMAPPINGSESSIONMETADATABYIDRESPONSE._serialized_start = 1591
_UPDATEMAPPINGSESSIONMETADATABYIDRESPONSE._serialized_end = 1633
_MAPPINGMETADATA._serialized_start = 1636
_MAPPINGMETADATA._serialized_end = 2266
_CLOUDSLAMSERVICE._serialized_start = 2269
_CLOUDSLAMSERVICE._serialized_end = 3302
_UPDATEMAPPINGSESSIONMETADATABYIDREQUEST._serialized_end = 1618
_UPDATEMAPPINGSESSIONMETADATABYIDRESPONSE._serialized_start = 1620
_UPDATEMAPPINGSESSIONMETADATABYIDRESPONSE._serialized_end = 1662
_MAPPINGMETADATA._serialized_start = 1665
_MAPPINGMETADATA._serialized_end = 2324
_CLOUDSLAMSERVICE._serialized_start = 2327
_CLOUDSLAMSERVICE._serialized_end = 3360
Loading