Просмотр исходного кода

Merged in ArinToaca/coriolis-core/check-delete-endpoint (pull request #111)

Add check before deleting endpoint which has associated replicas.
Arin Toaca 8 лет назад
Родитель
Сommit
02d19dc016
2 измененных файлов с 18 добавлено и 0 удалено
  1. 5 0
      coriolis/conductor/rpc/server.py
  2. 13 0
      coriolis/db/api.py

+ 5 - 0
coriolis/conductor/rpc/server.py

@@ -116,6 +116,11 @@ class ConductorServerEndpoint(object):
 
     @endpoint_synchronized
     def delete_endpoint(self, ctxt, endpoint_id):
+        q_replicas_count = db_api.get_endpoint_replicas_count(
+            ctxt, endpoint_id)
+        if q_replicas_count is not 0:
+            raise exception.NotAuthorized("%s replicas would be orphaned!" %
+                                          q_replicas_count)
         db_api.delete_endpoint(ctxt, endpoint_id)
 
     def get_endpoint_instances(self, ctxt, endpoint_id, marker, limit,

+ 13 - 0
coriolis/db/api.py

@@ -298,6 +298,19 @@ def get_replica(context, replica_id):
         models.Replica.id == replica_id).first()
 
 
+@enginefacade.reader
+def get_endpoint_replicas_count(context, endpoint_id):
+    origin_args = {'origin_endpoint_id': endpoint_id}
+    q_origin_count = _soft_delete_aware_query(
+        context, models.Replica).filter_by(**origin_args).count()
+
+    destination_args = {'destination_endpoint_id': endpoint_id}
+    q_destination_count = _soft_delete_aware_query(
+        context, models.Replica).filter_by(**destination_args).count()
+
+    return q_origin_count + q_destination_count
+
+
 @enginefacade.writer
 def add_replica(context, replica):
     replica.user_id = context.user