Repository: thelastpickle/cassandra-medusa

Issue:
Make test_backup_orchestration unit test work again
[Project board link](https://github.com/orgs/k8ssandra/projects/8/views/1?pane=issue&itemId=38876115)

tests/backup_cluster_test.py::BackupClusterTest::test_backup_orchestration


Discussion:
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=thelastpickle_cassandra-medusa&pullRequest=654)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=SECURITY_HOTSPOT) [![E](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/E-16px.png 'E')](https://sonarcloud.io/project/security_hotspots?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=SECURITY_HOTSPOT) [1 Security Hotspot](https://sonarcloud.io/project/security_hotspots?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonarcloud.io/project/issues?id=thelastpickle_cassandra-medusa&pullRequest=654&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=thelastpickle_cassandra-medusa&pullRequest=654) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=thelastpickle_cassandra-medusa&pullRequest=654&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=thelastpickle_cassandra-medusa&pullRequest=654&metric=new_duplicated_lines_density&view=list)



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)

Patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7f0cee0..b2b800c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -13,7 +13,7 @@ jobs:
   build:
     strategy:
       matrix:
-        python-version: [3.7, 3.8, 3.9, "3.10"]
+        python-version: [3.7, 3.8, 3.9, "3.10", "3.11"]
         include:
           - python-version: 3.7
             tox-py: py37
@@ -23,6 +23,8 @@ jobs:
             tox-py: py39
           - python-version: "3.10"
             tox-py: py310
+          - python-version: "3.11"
+            tox-py: py311
     runs-on: ubuntu-20.04
     steps:
     - uses: actions/checkout@v3
@@ -103,33 +105,58 @@ jobs:
     strategy:
         fail-fast: false
         matrix:
-          python-version: [3.9]
+          python-version: [3.7, 3.8, 3.9, "3.10", "3.11"]
           it-backend: [local, s3, gcs, minio, azure, azure-hierarchical]
           # IBM not included by default due to lite plan quota being easily exceeded
           #it-backend: [local, s3, gcs, minio, ibm, azure]
           cassandra-version: [2.2.19, 3.11.11, 4.0.0, 'github:apache/trunk']
           include:
+            # tweak the experimental flag for cassandra versions
             - cassandra-version: 2.2.19
               experimental: false
             - cassandra-version: 3.11.11
               experimental: false
             - cassandra-version: 4.0.0
               experimental: false
-            - cassandra-version: 'github:apache/trunk'
-              experimental: true
+            # explicitly include tests against python 3.11 and one version of cassandra
+            - python-version: "3.11"
+              cassandra-version: 4.0.0
+              it-backend: gcs
+              experimental: false
+            # explicitly include tests against python 3.10 and one version of cassandra
+            - python-version: "3.10"
+              cassandra-version: 4.0.0
+              it-backend: gcs
+              experimental: false
+            # explicitly include tests against python 3.8 and one version of cassandra
+            - python-version: 3.8
+              cassandra-version: 4.0.0
+              it-backend: gcs
+              experimental: false
+            # explicitly include tests against python 3.7 and one version of cassandra
+            - python-version: 3.7
+              cassandra-version: 4.0.0
+              it-backend: gcs
+              experimental: false
           exclude:
-            # excludes unnecessary combinations
+            # no tests against trunk
             - cassandra-version: 'github:apache/trunk'
+            # fewer tests against cassandra 3.11.11 (exclude all but local storage backends)
             - it-backend: s3
-              cassandra-version: 3.11.11
+              cassandra-version: "3.11.11"
             - it-backend: gcs
-              cassandra-version: 3.11.11
+              cassandra-version: "3.11.11"
             - it-backend: minio
-              cassandra-version: 3.11.11
+              cassandra-version: "3.11.11"
             - it-backend: azure
-              cassandra-version: 3.11.11
+              cassandra-version: "3.11.11"
             - it-backend: azure-hierarchical
-              cassandra-version: 3.11.11
+              cassandra-version: "3.11.11"
+            # no tests against non-python3.9, except the explicitly allowed combinations
+            - python-version: 3.7
+            - python-version: 3.8
+            - python-version: "3.10"
+            - python-version: "3.11"
 
     runs-on: ubuntu-20.04
     services:
diff --git a/medusa-example.ini b/medusa-example.ini
index 6e65fa6..da5ad97 100644
--- a/medusa-example.ini
+++ b/medusa-example.ini
@@ -83,7 +83,7 @@ max_backup_count = 0
 ; Used to throttle S3 backups/restores:
 transfer_max_bandwidth = 50MB/s
 
-; Max number of downloads/uploads. Not used by the GCS backend.
+; Max number of concurrent downloads/uploads.
 concurrent_transfers = 1
 
 ; Size over which uploads will be using multi part uploads. Defaults to 20MB.
diff --git a/medusa/backup_cluster.py b/medusa/backup_cluster.py
index 6f92652..ed55804 100644
--- a/medusa/backup_cluster.py
+++ b/medusa/backup_cluster.py
@@ -57,7 +57,7 @@ def orchestrate(config, backup_name_arg, seed_target, stagger, enable_md5_checks
             try:
                 # Try to get a backup with backup_name. If it exists then we cannot take another backup with that name
                 cluster_backup = storage.get_cluster_backup(backup_name)
-                if cluster_backup:
+                if cluster_backup and cluster_backup.name == backup_name:
                     err_msg = 'Backup named {} already exists.'.format(backup_name)
                     logging.error(err_msg)
                     raise Exception(err_msg)
diff --git a/medusa/service/grpc/medusa_pb2.py b/medusa/service/grpc/medusa_pb2.py
index 3960ac0..de80edd 100644
--- a/medusa/service/grpc/medusa_pb2.py
+++ b/medusa/service/grpc/medusa_pb2.py
@@ -2,11 +2,10 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: medusa.proto
 """Generated protocol buffer code."""
-from google.protobuf.internal import enum_type_wrapper
 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 descriptor_pool as _descriptor_pool
 from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -14,887 +13,46 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='medusa.proto',
-  package='',
-  syntax='proto3',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x0cmedusa.proto\"d\n\rBackupRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12!\n\x04mode\x18\x02 \x01(\x0e\x32\x13.BackupRequest.Mode\"\"\n\x04Mode\x12\x10\n\x0c\x44IFFERENTIAL\x10\x00\x12\x08\n\x04\x46ULL\x10\x01\"A\n\x0e\x42\x61\x63kupResponse\x12\x12\n\nbackupName\x18\x01 \x01(\t\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.StatusType\")\n\x13\x42\x61\x63kupStatusRequest\x12\x12\n\nbackupName\x18\x01 \x01(\t\"\xa0\x01\n\x14\x42\x61\x63kupStatusResponse\x12\x15\n\rfinishedNodes\x18\x01 \x03(\t\x12\x17\n\x0funfinishedNodes\x18\x02 \x03(\t\x12\x14\n\x0cmissingNodes\x18\x03 \x03(\t\x12\x11\n\tstartTime\x18\x04 \x01(\t\x12\x12\n\nfinishTime\x18\x05 \x01(\t\x12\x1b\n\x06status\x18\x06 \x01(\x0e\x32\x0b.StatusType\"#\n\x13\x44\x65leteBackupRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"A\n\x14\x44\x65leteBackupResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.StatusType\"\x13\n\x11GetBackupsRequest\"Y\n\x12GetBackupsResponse\x12\x1f\n\x07\x62\x61\x63kups\x18\x01 \x03(\x0b\x32\x0e.BackupSummary\x12\"\n\roverallStatus\x18\x02 \x01(\x0e\x32\x0b.StatusType\"\xc2\x01\n\rBackupSummary\x12\x12\n\nbackupName\x18\x01 \x01(\t\x12\x11\n\tstartTime\x18\x02 \x01(\x03\x12\x12\n\nfinishTime\x18\x03 \x01(\x03\x12\x12\n\ntotalNodes\x18\x04 \x01(\x05\x12\x15\n\rfinishedNodes\x18\x05 \x01(\x05\x12\x1a\n\x05nodes\x18\x06 \x03(\x0b\x32\x0b.BackupNode\x12\x1b\n\x06status\x18\x07 \x01(\x0e\x32\x0b.StatusType\x12\x12\n\nbackupType\x18\x08 \x01(\t\"L\n\nBackupNode\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0e\n\x06tokens\x18\x02 \x03(\x03\x12\x12\n\ndatacenter\x18\x03 \x01(\t\x12\x0c\n\x04rack\x18\x04 \x01(\t\"\x15\n\x13PurgeBackupsRequest\"\x84\x01\n\x14PurgeBackupsResponse\x12\x17\n\x0fnbBackupsPurged\x18\x01 \x01(\x05\x12\x17\n\x0fnbObjectsPurged\x18\x02 \x01(\x05\x12\x17\n\x0ftotalPurgedSize\x18\x03 \x01(\x03\x12!\n\x19totalObjectsWithinGcGrace\x18\x04 \x01(\x05\"S\n\x15PrepareRestoreRequest\x12\x12\n\nbackupName\x18\x01 \x01(\t\x12\x12\n\ndatacenter\x18\x02 \x01(\t\x12\x12\n\nrestoreKey\x18\x03 \x01(\t\"\x18\n\x16PrepareRestoreResponse*C\n\nStatusType\x12\x0f\n\x0bIN_PROGRESS\x10\x00\x12\x0b\n\x07SUCCESS\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x12\x0b\n\x07UNKNOWN\x10\x03\x32\x94\x03\n\x06Medusa\x12)\n\x06\x42\x61\x63kup\x12\x0e.BackupRequest\x1a\x0f.BackupResponse\x12.\n\x0b\x41syncBackup\x12\x0e.BackupRequest\x1a\x0f.BackupResponse\x12;\n\x0c\x42\x61\x63kupStatus\x12\x14.BackupStatusRequest\x1a\x15.BackupStatusResponse\x12;\n\x0c\x44\x65leteBackup\x12\x14.DeleteBackupRequest\x1a\x15.DeleteBackupResponse\x12\x35\n\nGetBackups\x12\x12.GetBackupsRequest\x1a\x13.GetBackupsResponse\x12;\n\x0cPurgeBackups\x12\x14.PurgeBackupsRequest\x1a\x15.PurgeBackupsResponse\x12\x41\n\x0ePrepareRestore\x12\x16.PrepareRestoreRequest\x1a\x17.PrepareRestoreResponseb\x06proto3'
-)
-
-_STATUSTYPE = _descriptor.EnumDescriptor(
-  name='StatusType',
-  full_name='StatusType',
-  filename=None,
-  file=DESCRIPTOR,
-  create_key=_descriptor._internal_create_key,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='IN_PROGRESS', index=0, number=0,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='SUCCESS', index=1, number=1,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='FAILED', index=2, number=2,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='UNKNOWN', index=3, number=3,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=1151,
-  serialized_end=1218,
-)
-_sym_db.RegisterEnumDescriptor(_STATUSTYPE)
-
-StatusType = enum_type_wrapper.EnumTypeWrapper(_STATUSTYPE)
-IN_PROGRESS = 0
-SUCCESS = 1
-FAILED = 2
-UNKNOWN = 3
-
-
-_BACKUPREQUEST_MODE = _descriptor.EnumDescriptor(
-  name='Mode',
-  full_name='BackupRequest.Mode',
-  filename=None,
-  file=DESCRIPTOR,
-  create_key=_descriptor._internal_create_key,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='DIFFERENTIAL', index=0, number=0,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='FULL', index=1, number=1,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=82,
-  serialized_end=116,
-)
-_sym_db.RegisterEnumDescriptor(_BACKUPREQUEST_MODE)
-
-
-_BACKUPREQUEST = _descriptor.Descriptor(
-  name='BackupRequest',
-  full_name='BackupRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='BackupRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mode', full_name='BackupRequest.mode', index=1,
-      number=2, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-    _BACKUPREQUEST_MODE,
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=16,
-  serialized_end=116,
-)
-
-
-_BACKUPRESPONSE = _descriptor.Descriptor(
-  name='BackupResponse',
-  full_name='BackupResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='backupName', full_name='BackupResponse.backupName', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='BackupResponse.status', index=1,
-      number=2, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=118,
-  serialized_end=183,
-)
-
-
-_BACKUPSTATUSREQUEST = _descriptor.Descriptor(
-  name='BackupStatusRequest',
-  full_name='BackupStatusRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='backupName', full_name='BackupStatusRequest.backupName', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=185,
-  serialized_end=226,
-)
-
-
-_BACKUPSTATUSRESPONSE = _descriptor.Descriptor(
-  name='BackupStatusResponse',
-  full_name='BackupStatusResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='finishedNodes', full_name='BackupStatusResponse.finishedNodes', index=0,
-      number=1, type=9, cpp_type=9, 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,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='unfinishedNodes', full_name='BackupStatusResponse.unfinishedNodes', index=1,
-      number=2, type=9, cpp_type=9, 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,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='missingNodes', full_name='BackupStatusResponse.missingNodes', index=2,
-      number=3, type=9, cpp_type=9, 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,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='startTime', full_name='BackupStatusResponse.startTime', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='finishTime', full_name='BackupStatusResponse.finishTime', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='BackupStatusResponse.status', index=5,
-      number=6, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=229,
-  serialized_end=389,
-)
-
-
-_DELETEBACKUPREQUEST = _descriptor.Descriptor(
-  name='DeleteBackupRequest',
-  full_name='DeleteBackupRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='DeleteBackupRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=391,
-  serialized_end=426,
-)
-
-
-_DELETEBACKUPRESPONSE = _descriptor.Descriptor(
-  name='DeleteBackupResponse',
-  full_name='DeleteBackupResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='DeleteBackupResponse.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='DeleteBackupResponse.status', index=1,
-      number=2, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=428,
-  serialized_end=493,
-)
-
-
-_GETBACKUPSREQUEST = _descriptor.Descriptor(
-  name='GetBackupsRequest',
-  full_name='GetBackupsRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=495,
-  serialized_end=514,
-)
-
-
-_GETBACKUPSRESPONSE = _descriptor.Descriptor(
-  name='GetBackupsResponse',
-  full_name='GetBackupsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='backups', full_name='GetBackupsResponse.backups', 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,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='overallStatus', full_name='GetBackupsResponse.overallStatus', index=1,
-      number=2, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=516,
-  serialized_end=605,
-)
-
-
-_BACKUPSUMMARY = _descriptor.Descriptor(
-  name='BackupSummary',
-  full_name='BackupSummary',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='backupName', full_name='BackupSummary.backupName', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='startTime', full_name='BackupSummary.startTime', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='finishTime', full_name='BackupSummary.finishTime', index=2,
-      number=3, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='totalNodes', full_name='BackupSummary.totalNodes', index=3,
-      number=4, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='finishedNodes', full_name='BackupSummary.finishedNodes', index=4,
-      number=5, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='nodes', full_name='BackupSummary.nodes', index=5,
-      number=6, 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,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='BackupSummary.status', index=6,
-      number=7, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='backupType', full_name='BackupSummary.backupType', index=7,
-      number=8, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=608,
-  serialized_end=802,
-)
-
-
-_BACKUPNODE = _descriptor.Descriptor(
-  name='BackupNode',
-  full_name='BackupNode',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='host', full_name='BackupNode.host', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='tokens', full_name='BackupNode.tokens', index=1,
-      number=2, type=3, cpp_type=2, 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,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='datacenter', full_name='BackupNode.datacenter', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rack', full_name='BackupNode.rack', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=804,
-  serialized_end=880,
-)
-
-
-_PURGEBACKUPSREQUEST = _descriptor.Descriptor(
-  name='PurgeBackupsRequest',
-  full_name='PurgeBackupsRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=882,
-  serialized_end=903,
-)
-
-
-_PURGEBACKUPSRESPONSE = _descriptor.Descriptor(
-  name='PurgeBackupsResponse',
-  full_name='PurgeBackupsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='nbBackupsPurged', full_name='PurgeBackupsResponse.nbBackupsPurged', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='nbObjectsPurged', full_name='PurgeBackupsResponse.nbObjectsPurged', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='totalPurgedSize', full_name='PurgeBackupsResponse.totalPurgedSize', index=2,
-      number=3, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='totalObjectsWithinGcGrace', full_name='PurgeBackupsResponse.totalObjectsWithinGcGrace', index=3,
-      number=4, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=906,
-  serialized_end=1038,
-)
-
-
-_PREPARERESTOREREQUEST = _descriptor.Descriptor(
-  name='PrepareRestoreRequest',
-  full_name='PrepareRestoreRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='backupName', full_name='PrepareRestoreRequest.backupName', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='datacenter', full_name='PrepareRestoreRequest.datacenter', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='restoreKey', full_name='PrepareRestoreRequest.restoreKey', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1040,
-  serialized_end=1123,
-)
-
-
-_PREPARERESTORERESPONSE = _descriptor.Descriptor(
-  name='PrepareRestoreResponse',
-  full_name='PrepareRestoreResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1125,
-  serialized_end=1149,
-)
-
-_BACKUPREQUEST.fields_by_name['mode'].enum_type = _BACKUPREQUEST_MODE
-_BACKUPREQUEST_MODE.containing_type = _BACKUPREQUEST
-_BACKUPRESPONSE.fields_by_name['status'].enum_type = _STATUSTYPE
-_BACKUPSTATUSRESPONSE.fields_by_name['status'].enum_type = _STATUSTYPE
-_DELETEBACKUPRESPONSE.fields_by_name['status'].enum_type = _STATUSTYPE
-_GETBACKUPSRESPONSE.fields_by_name['backups'].message_type = _BACKUPSUMMARY
-_GETBACKUPSRESPONSE.fields_by_name['overallStatus'].enum_type = _STATUSTYPE
-_BACKUPSUMMARY.fields_by_name['nodes'].message_type = _BACKUPNODE
-_BACKUPSUMMARY.fields_by_name['status'].enum_type = _STATUSTYPE
-DESCRIPTOR.message_types_by_name['BackupRequest'] = _BACKUPREQUEST
-DESCRIPTOR.message_types_by_name['BackupResponse'] = _BACKUPRESPONSE
-DESCRIPTOR.message_types_by_name['BackupStatusRequest'] = _BACKUPSTATUSREQUEST
-DESCRIPTOR.message_types_by_name['BackupStatusResponse'] = _BACKUPSTATUSRESPONSE
-DESCRIPTOR.message_types_by_name['DeleteBackupRequest'] = _DELETEBACKUPREQUEST
-DESCRIPTOR.message_types_by_name['DeleteBackupResponse'] = _DELETEBACKUPRESPONSE
-DESCRIPTOR.message_types_by_name['GetBackupsRequest'] = _GETBACKUPSREQUEST
-DESCRIPTOR.message_types_by_name['GetBackupsResponse'] = _GETBACKUPSRESPONSE
-DESCRIPTOR.message_types_by_name['BackupSummary'] = _BACKUPSUMMARY
-DESCRIPTOR.message_types_by_name['BackupNode'] = _BACKUPNODE
-DESCRIPTOR.message_types_by_name['PurgeBackupsRequest'] = _PURGEBACKUPSREQUEST
-DESCRIPTOR.message_types_by_name['PurgeBackupsResponse'] = _PURGEBACKUPSRESPONSE
-DESCRIPTOR.message_types_by_name['PrepareRestoreRequest'] = _PREPARERESTOREREQUEST
-DESCRIPTOR.message_types_by_name['PrepareRestoreResponse'] = _PREPARERESTORERESPONSE
-DESCRIPTOR.enum_types_by_name['StatusType'] = _STATUSTYPE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-BackupRequest = _reflection.GeneratedProtocolMessageType('BackupRequest', (_message.Message,), {
-  'DESCRIPTOR' : _BACKUPREQUEST,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:BackupRequest)
-  })
-_sym_db.RegisterMessage(BackupRequest)
-
-BackupResponse = _reflection.GeneratedProtocolMessageType('BackupResponse', (_message.Message,), {
-  'DESCRIPTOR' : _BACKUPRESPONSE,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:BackupResponse)
-  })
-_sym_db.RegisterMessage(BackupResponse)
-
-BackupStatusRequest = _reflection.GeneratedProtocolMessageType('BackupStatusRequest', (_message.Message,), {
-  'DESCRIPTOR' : _BACKUPSTATUSREQUEST,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:BackupStatusRequest)
-  })
-_sym_db.RegisterMessage(BackupStatusRequest)
-
-BackupStatusResponse = _reflection.GeneratedProtocolMessageType('BackupStatusResponse', (_message.Message,), {
-  'DESCRIPTOR' : _BACKUPSTATUSRESPONSE,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:BackupStatusResponse)
-  })
-_sym_db.RegisterMessage(BackupStatusResponse)
-
-DeleteBackupRequest = _reflection.GeneratedProtocolMessageType('DeleteBackupRequest', (_message.Message,), {
-  'DESCRIPTOR' : _DELETEBACKUPREQUEST,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:DeleteBackupRequest)
-  })
-_sym_db.RegisterMessage(DeleteBackupRequest)
-
-DeleteBackupResponse = _reflection.GeneratedProtocolMessageType('DeleteBackupResponse', (_message.Message,), {
-  'DESCRIPTOR' : _DELETEBACKUPRESPONSE,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:DeleteBackupResponse)
-  })
-_sym_db.RegisterMessage(DeleteBackupResponse)
-
-GetBackupsRequest = _reflection.GeneratedProtocolMessageType('GetBackupsRequest', (_message.Message,), {
-  'DESCRIPTOR' : _GETBACKUPSREQUEST,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:GetBackupsRequest)
-  })
-_sym_db.RegisterMessage(GetBackupsRequest)
-
-GetBackupsResponse = _reflection.GeneratedProtocolMessageType('GetBackupsResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETBACKUPSRESPONSE,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:GetBackupsResponse)
-  })
-_sym_db.RegisterMessage(GetBackupsResponse)
-
-BackupSummary = _reflection.GeneratedProtocolMessageType('BackupSummary', (_message.Message,), {
-  'DESCRIPTOR' : _BACKUPSUMMARY,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:BackupSummary)
-  })
-_sym_db.RegisterMessage(BackupSummary)
-
-BackupNode = _reflection.GeneratedProtocolMessageType('BackupNode', (_message.Message,), {
-  'DESCRIPTOR' : _BACKUPNODE,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:BackupNode)
-  })
-_sym_db.RegisterMessage(BackupNode)
-
-PurgeBackupsRequest = _reflection.GeneratedProtocolMessageType('PurgeBackupsRequest', (_message.Message,), {
-  'DESCRIPTOR' : _PURGEBACKUPSREQUEST,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:PurgeBackupsRequest)
-  })
-_sym_db.RegisterMessage(PurgeBackupsRequest)
-
-PurgeBackupsResponse = _reflection.GeneratedProtocolMessageType('PurgeBackupsResponse', (_message.Message,), {
-  'DESCRIPTOR' : _PURGEBACKUPSRESPONSE,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:PurgeBackupsResponse)
-  })
-_sym_db.RegisterMessage(PurgeBackupsResponse)
-
-PrepareRestoreRequest = _reflection.GeneratedProtocolMessageType('PrepareRestoreRequest', (_message.Message,), {
-  'DESCRIPTOR' : _PREPARERESTOREREQUEST,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:PrepareRestoreRequest)
-  })
-_sym_db.RegisterMessage(PrepareRestoreRequest)
-
-PrepareRestoreResponse = _reflection.GeneratedProtocolMessageType('PrepareRestoreResponse', (_message.Message,), {
-  'DESCRIPTOR' : _PREPARERESTORERESPONSE,
-  '__module__' : 'medusa_pb2'
-  # @@protoc_insertion_point(class_scope:PrepareRestoreResponse)
-  })
-_sym_db.RegisterMessage(PrepareRestoreResponse)
-
-
-
-_MEDUSA = _descriptor.ServiceDescriptor(
-  name='Medusa',
-  full_name='Medusa',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_start=1221,
-  serialized_end=1625,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='Backup',
-    full_name='Medusa.Backup',
-    index=0,
-    containing_service=None,
-    input_type=_BACKUPREQUEST,
-    output_type=_BACKUPRESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-  _descriptor.MethodDescriptor(
-    name='AsyncBackup',
-    full_name='Medusa.AsyncBackup',
-    index=1,
-    containing_service=None,
-    input_type=_BACKUPREQUEST,
-    output_type=_BACKUPRESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-  _descriptor.MethodDescriptor(
-    name='BackupStatus',
-    full_name='Medusa.BackupStatus',
-    index=2,
-    containing_service=None,
-    input_type=_BACKUPSTATUSREQUEST,
-    output_type=_BACKUPSTATUSRESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-  _descriptor.MethodDescriptor(
-    name='DeleteBackup',
-    full_name='Medusa.DeleteBackup',
-    index=3,
-    containing_service=None,
-    input_type=_DELETEBACKUPREQUEST,
-    output_type=_DELETEBACKUPRESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-  _descriptor.MethodDescriptor(
-    name='GetBackups',
-    full_name='Medusa.GetBackups',
-    index=4,
-    containing_service=None,
-    input_type=_GETBACKUPSREQUEST,
-    output_type=_GETBACKUPSRESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-  _descriptor.MethodDescriptor(
-    name='PurgeBackups',
-    full_name='Medusa.PurgeBackups',
-    index=5,
-    containing_service=None,
-    input_type=_PURGEBACKUPSREQUEST,
-    output_type=_PURGEBACKUPSRESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-  _descriptor.MethodDescriptor(
-    name='PrepareRestore',
-    full_name='Medusa.PrepareRestore',
-    index=6,
-    containing_service=None,
-    input_type=_PREPARERESTOREREQUEST,
-    output_type=_PREPARERESTORERESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_MEDUSA)
-
-DESCRIPTOR.services_by_name['Medusa'] = _MEDUSA
-
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cmedusa.proto\"d\n\rBackupRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12!\n\x04mode\x18\x02 \x01(\x0e\x32\x13.BackupRequest.Mode\"\"\n\x04Mode\x12\x10\n\x0c\x44IFFERENTIAL\x10\x00\x12\x08\n\x04\x46ULL\x10\x01\"A\n\x0e\x42\x61\x63kupResponse\x12\x12\n\nbackupName\x18\x01 \x01(\t\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.StatusType\")\n\x13\x42\x61\x63kupStatusRequest\x12\x12\n\nbackupName\x18\x01 \x01(\t\"\xa0\x01\n\x14\x42\x61\x63kupStatusResponse\x12\x15\n\rfinishedNodes\x18\x01 \x03(\t\x12\x17\n\x0funfinishedNodes\x18\x02 \x03(\t\x12\x14\n\x0cmissingNodes\x18\x03 \x03(\t\x12\x11\n\tstartTime\x18\x04 \x01(\t\x12\x12\n\nfinishTime\x18\x05 \x01(\t\x12\x1b\n\x06status\x18\x06 \x01(\x0e\x32\x0b.StatusType\"#\n\x13\x44\x65leteBackupRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"A\n\x14\x44\x65leteBackupResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.StatusType\"\x13\n\x11GetBackupsRequest\"Y\n\x12GetBackupsResponse\x12\x1f\n\x07\x62\x61\x63kups\x18\x01 \x03(\x0b\x32\x0e.BackupSummary\x12\"\n\roverallStatus\x18\x02 \x01(\x0e\x32\x0b.StatusType\"\xc2\x01\n\rBackupSummary\x12\x12\n\nbackupName\x18\x01 \x01(\t\x12\x11\n\tstartTime\x18\x02 \x01(\x03\x12\x12\n\nfinishTime\x18\x03 \x01(\x03\x12\x12\n\ntotalNodes\x18\x04 \x01(\x05\x12\x15\n\rfinishedNodes\x18\x05 \x01(\x05\x12\x1a\n\x05nodes\x18\x06 \x03(\x0b\x32\x0b.BackupNode\x12\x1b\n\x06status\x18\x07 \x01(\x0e\x32\x0b.StatusType\x12\x12\n\nbackupType\x18\x08 \x01(\t\"L\n\nBackupNode\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0e\n\x06tokens\x18\x02 \x03(\x03\x12\x12\n\ndatacenter\x18\x03 \x01(\t\x12\x0c\n\x04rack\x18\x04 \x01(\t\"\x15\n\x13PurgeBackupsRequest\"\x84\x01\n\x14PurgeBackupsResponse\x12\x17\n\x0fnbBackupsPurged\x18\x01 \x01(\x05\x12\x17\n\x0fnbObjectsPurged\x18\x02 \x01(\x05\x12\x17\n\x0ftotalPurgedSize\x18\x03 \x01(\x03\x12!\n\x19totalObjectsWithinGcGrace\x18\x04 \x01(\x05\"S\n\x15PrepareRestoreRequest\x12\x12\n\nbackupName\x18\x01 \x01(\t\x12\x12\n\ndatacenter\x18\x02 \x01(\t\x12\x12\n\nrestoreKey\x18\x03 \x01(\t\"\x18\n\x16PrepareRestoreResponse*C\n\nStatusType\x12\x0f\n\x0bIN_PROGRESS\x10\x00\x12\x0b\n\x07SUCCESS\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x12\x0b\n\x07UNKNOWN\x10\x03\x32\x94\x03\n\x06Medusa\x12)\n\x06\x42\x61\x63kup\x12\x0e.BackupRequest\x1a\x0f.BackupResponse\x12.\n\x0b\x41syncBackup\x12\x0e.BackupRequest\x1a\x0f.BackupResponse\x12;\n\x0c\x42\x61\x63kupStatus\x12\x14.BackupStatusRequest\x1a\x15.BackupStatusResponse\x12;\n\x0c\x44\x65leteBackup\x12\x14.DeleteBackupRequest\x1a\x15.DeleteBackupResponse\x12\x35\n\nGetBackups\x12\x12.GetBackupsRequest\x1a\x13.GetBackupsResponse\x12;\n\x0cPurgeBackups\x12\x14.PurgeBackupsRequest\x1a\x15.PurgeBackupsResponse\x12\x41\n\x0ePrepareRestore\x12\x16.PrepareRestoreRequest\x1a\x17.PrepareRestoreResponseb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'medusa_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _globals['_STATUSTYPE']._serialized_start=1151
+  _globals['_STATUSTYPE']._serialized_end=1218
+  _globals['_BACKUPREQUEST']._serialized_start=16
+  _globals['_BACKUPREQUEST']._serialized_end=116
+  _globals['_BACKUPREQUEST_MODE']._serialized_start=82
+  _globals['_BACKUPREQUEST_MODE']._serialized_end=116
+  _globals['_BACKUPRESPONSE']._serialized_start=118
+  _globals['_BACKUPRESPONSE']._serialized_end=183
+  _globals['_BACKUPSTATUSREQUEST']._serialized_start=185
+  _globals['_BACKUPSTATUSREQUEST']._serialized_end=226
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_start=229
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_end=389
+  _globals['_DELETEBACKUPREQUEST']._serialized_start=391
+  _globals['_DELETEBACKUPREQUEST']._serialized_end=426
+  _globals['_DELETEBACKUPRESPONSE']._serialized_start=428
+  _globals['_DELETEBACKUPRESPONSE']._serialized_end=493
+  _globals['_GETBACKUPSREQUEST']._serialized_start=495
+  _globals['_GETBACKUPSREQUEST']._serialized_end=514
+  _globals['_GETBACKUPSRESPONSE']._serialized_start=516
+  _globals['_GETBACKUPSRESPONSE']._serialized_end=605
+  _globals['_BACKUPSUMMARY']._serialized_start=608
+  _globals['_BACKUPSUMMARY']._serialized_end=802
+  _globals['_BACKUPNODE']._serialized_start=804
+  _globals['_BACKUPNODE']._serialized_end=880
+  _globals['_PURGEBACKUPSREQUEST']._serialized_start=882
+  _globals['_PURGEBACKUPSREQUEST']._serialized_end=903
+  _globals['_PURGEBACKUPSRESPONSE']._serialized_start=906
+  _globals['_PURGEBACKUPSRESPONSE']._serialized_end=1038
+  _globals['_PREPARERESTOREREQUEST']._serialized_start=1040
+  _globals['_PREPARERESTOREREQUEST']._serialized_end=1123
+  _globals['_PREPARERESTORERESPONSE']._serialized_start=1125
+  _globals['_PREPARERESTORERESPONSE']._serialized_end=1149
+  _globals['_MEDUSA']._serialized_start=1221
+  _globals['_MEDUSA']._serialized_end=1625
 # @@protoc_insertion_point(module_scope)
diff --git a/requirements-grpc-runtime.txt b/requirements-grpc-runtime.txt
index a7689a3..c29fba7 100644
--- a/requirements-grpc-runtime.txt
+++ b/requirements-grpc-runtime.txt
@@ -1,2 +1,2 @@
-grpcio>=1.29.0,<=1.48.2
-grpcio-health-checking>=1.29.0,<=1.48.2
\ No newline at end of file
+grpcio==1.58.0
+grpcio-health-checking==1.58.0
\ No newline at end of file
diff --git a/requirements-grpc.txt b/requirements-grpc.txt
index 3bd4210..301b8a7 100644
--- a/requirements-grpc.txt
+++ b/requirements-grpc.txt
@@ -1,4 +1,4 @@
-protobuf>=3.12.0,<=3.20.1
-grpcio>=1.29.0,<=1.48.2
-grpcio-tools>=1.29.0,<=1.48.2
-grpcio-health-checking>=1.29.0,<=1.48.2
\ No newline at end of file
+protobuf==4.24.3
+grpcio==1.58.0
+grpcio-health-checking==1.58.0
+grpcio-tools==1.58.0
diff --git a/requirements.txt b/requirements.txt
index a4a8e20..cc0923f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,7 +10,7 @@ pyOpenSSL==22.0.0
 cryptography<=35.0,>=2.5
 pycryptodome>=3.9.9
 retrying>=1.3.3
-ssh2-python==0.27.0
+ssh2-python==1.0.0
 ssh-python>=0.8.0
 parallel-ssh==2.2.0
 requests>=2.22.0
diff --git a/setup.py b/setup.py
index b94e57e..501a44c 100644
--- a/setup.py
+++ b/setup.py
@@ -54,13 +54,13 @@ setuptools.setup(
         'pycryptodome>=3.9.9',
         'retrying>=1.3.3',
         'parallel-ssh==2.2.0',
-        'ssh2-python==0.27.0',
+        'ssh2-python==1.0.0',
         'ssh-python>=0.8.0',
         'requests==2.22.0',
-        'protobuf>=3.12.0,<=3.20.1',
-        'grpcio>=1.29.0,<=1.48.2',
-        'grpcio-health-checking>=1.29.0,<=1.48.2',
-        'grpcio-tools>=1.29.0,<=1.48.2',
+        'protobuf==4.24.3',
+        'grpcio==1.58.0',
+        'grpcio-health-checking==1.58.0',
+        'grpcio-tools==1.58.0',
         'gevent',
         'greenlet',
         'fasteners==0.16',
@@ -73,7 +73,7 @@ setuptools.setup(
         'gcloud-aio-storage==8.3.0',
         'azure-core==1.29.4',
         'azure-identity==1.14.0',
-        'azure-storage-blob==12.17.0',
+        'azure-storage-blob==12.17.0'
     ],
     entry_points={
         'console_scripts': [
diff --git a/tox.ini b/tox.ini
index 34f42d4..ee90330 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,11 +1,8 @@
 [tox]
-envlist = py{36,37,38,39,310}
+envlist = py{36,37,38,39,310,311}
 
 [testenv] 
 deps =
-    flake8<=3.7.9
-    pytest
-    nose
     -r{toxinidir}/requirements.txt
     -r{toxinidir}/requirements-test.txt
 


Test patch:
diff --git a/tests/backup_cluster_test.py b/tests/backup_cluster_test.py
index 21783f4..e1d0d64 100644
--- a/tests/backup_cluster_test.py
+++ b/tests/backup_cluster_test.py
@@ -92,15 +92,14 @@ class BackupClusterTest(unittest.TestCase):
         backup_job.execute(self.mock_cql_session_provider)
         assert self.mock_orchestration.pssh_run.call_count == 2
 
-    # TODO https://github.com/thelastpickle/cassandra-medusa/issues/645
-    # def test_backup_orchestration(self):
-    #     self.mock_orchestration.pssh_run.return_value = True
-    #     self.mock_storage.get_cluster_backup.return_value = None
-    #     medusa_conf = self._build_medusa_config(self.config)
-    #     orchestrate(medusa_conf, "backup2", "127.0.0.1", None, True, "differential", pathlib.Path("/tmp"),
-    #                 1, 2, self.mock_orchestration, self.mock_orchestration, self.mock_cassandra_config,
-    #                 self.mock_monitoring, self.mock_storage, self.mock_cql_session_provider)
-    #     assert self.mock_orchestration.pssh_run.call_count == 2
+    def test_backup_orchestration(self):
+        self.mock_orchestration.pssh_run.return_value = True
+        self.mock_storage.get_cluster_backup.return_value = None
+        medusa_conf = self._build_medusa_config(self.config)
+        orchestrate(medusa_conf, "backup2", "127.0.0.1", None, True, "differential", pathlib.Path("/tmp"),
+                    1, 2, self.mock_orchestration, self.mock_orchestration, self.mock_cassandra_config,
+                    self.mock_monitoring, self.mock_storage, self.mock_cql_session_provider)
+        assert self.mock_orchestration.pssh_run.call_count == 2
 
     def test_fail_backup_orchestration(self):
         self.mock_orchestration.pssh_run.return_value = True