Browse Source

[oozie] Delete cleanly coordinators and bundles

Romain Rigaux 12 years ago
parent
commit
38bcb60

+ 43 - 32
apps/oozie/src/oozie/models.py

@@ -296,18 +296,27 @@ class Workflow(Job):
   def clone(self, fs, new_owner=None):
   def clone(self, fs, new_owner=None):
     source_deployment_dir = self.deployment_dir # Needed
     source_deployment_dir = self.deployment_dir # Needed
     nodes = self.node_set.all()
     nodes = self.node_set.all()
-    copy_doc = self.doc.get().copy()
     links = Link.objects.filter(parent__workflow=self)
     links = Link.objects.filter(parent__workflow=self)
 
 
+    name = self.name + '-copy'
+    if new_owner is not None:
+      owner = new_owner
+    else:
+      owner = self.owner
+
+    copy_doc = self.doc.get().copy(name=name, owner=owner)
+
     copy = self
     copy = self
     copy.pk = None
     copy.pk = None
     copy.id = None
     copy.id = None
-    copy.name += '-copy'
+    copy.name = name
     copy.deployment_dir = ''
     copy.deployment_dir = ''
-    if new_owner is not None:
-      copy.owner = new_owner
+    copy.owner = owner
     copy.save()
     copy.save()
 
 
+    copy.doc.all().delete()
+    copy.doc.add(copy_doc)
+
     old_nodes_mapping = {}
     old_nodes_mapping = {}
 
 
     for node in nodes:
     for node in nodes:
@@ -330,11 +339,6 @@ class Workflow(Job):
     copy.end = old_nodes_mapping[self.end.id]
     copy.end = old_nodes_mapping[self.end.id]
     copy.save()
     copy.save()
 
 
-    copy_doc.name = copy.name
-    copy_doc.owner = copy.owner
-    copy_doc.save()
-    copy.doc.add(copy_doc)
-
     try:
     try:
       if copy.is_shared:
       if copy.is_shared:
         perms = 0755
         perms = 0755
@@ -487,7 +491,8 @@ class Workflow(Job):
       except Exception, e:
       except Exception, e:
         LOG.warn('Workflow %s could not be converted to a graph: %s' % (oozie_workflow.id, e))
         LOG.warn('Workflow %s could not be converted to a graph: %s' % (oozie_workflow.id, e))
     finally:
     finally:
-      workflow.delete(skip_trash=True)
+      if workflow.pk is not None:
+        workflow.delete(skip_trash=True)
     return None, []
     return None, []
 
 
   def to_xml(self, mapping=None):
   def to_xml(self, mapping=None):
@@ -513,7 +518,7 @@ class Workflow(Job):
             'jar_path': node.jar_path
             'jar_path': node.jar_path
           }
           }
         }
         }
-    
+
     xml = self.to_xml(mapping=mapping)
     xml = self.to_xml(mapping=mapping)
 
 
     zfile = zipfile.ZipFile(fp, 'w')
     zfile = zipfile.ZipFile(fp, 'w')
@@ -1318,20 +1323,29 @@ class Coordinator(Job):
     return re.sub(re.compile('\s*\n+', re.MULTILINE), '\n', django_mako.render_to_string(tmpl, {'coord': self, 'mapping': mapping})).encode('utf-8', 'xmlcharrefreplace')
     return re.sub(re.compile('\s*\n+', re.MULTILINE), '\n', django_mako.render_to_string(tmpl, {'coord': self, 'mapping': mapping})).encode('utf-8', 'xmlcharrefreplace')
 
 
   def clone(self, new_owner=None):
   def clone(self, new_owner=None):
-    copy_doc = self.doc.get()
     datasets = Dataset.objects.filter(coordinator=self)
     datasets = Dataset.objects.filter(coordinator=self)
     data_inputs = DataInput.objects.filter(coordinator=self)
     data_inputs = DataInput.objects.filter(coordinator=self)
     data_outputs = DataOutput.objects.filter(coordinator=self)
     data_outputs = DataOutput.objects.filter(coordinator=self)
 
 
+    name = self.name + '-copy'
+    if new_owner is not None:
+      owner = new_owner
+    else:
+      owner = self.owner
+
+    copy_doc = self.doc.get().copy(name=name, owner=owner)
+
     copy = self
     copy = self
     copy.pk = None
     copy.pk = None
     copy.id = None
     copy.id = None
-    copy.name += '-copy'
+    copy.name = name
     copy.deployment_dir = ''
     copy.deployment_dir = ''
-    if new_owner is not None:
-      copy.owner = new_owner
+    copy.owner = owner
     copy.save()
     copy.save()
 
 
+    copy.doc.all().delete()
+    copy.doc.add(copy_doc)
+
     old_dataset_mapping = {}
     old_dataset_mapping = {}
 
 
     for dataset in datasets:
     for dataset in datasets:
@@ -1356,12 +1370,6 @@ class Coordinator(Job):
       data_output.dataset = old_dataset_mapping[data_output.dataset.id]
       data_output.dataset = old_dataset_mapping[data_output.dataset.id]
       data_output.save()
       data_output.save()
 
 
-    copy_doc.pk = None
-    copy_doc.id = None
-    copy_doc.owner = copy.owner
-    copy_doc.save()
-    copy.doc.add(copy_doc)
-
     return copy
     return copy
 
 
   @classmethod
   @classmethod
@@ -1622,29 +1630,32 @@ class Bundle(Job):
 
 
   def clone(self, new_owner=None):
   def clone(self, new_owner=None):
     bundleds = BundledCoordinator.objects.filter(bundle=self)
     bundleds = BundledCoordinator.objects.filter(bundle=self)
-    copy_doc = self.doc.get()
+
+    name = self.name + '-copy'
+    if new_owner is not None:
+      owner = new_owner
+    else:
+      owner = self.owner
+
+    copy_doc = self.doc.get().copy(name=name, owner=owner)
 
 
     copy = self
     copy = self
     copy.pk = None
     copy.pk = None
     copy.id = None
     copy.id = None
-    copy.name += '-copy'
+    copy.name = name
     copy.deployment_dir = ''
     copy.deployment_dir = ''
-    if new_owner is not None:
-      copy.owner = new_owner
+    copy.owner = owner
     copy.save()
     copy.save()
 
 
+    copy.doc.all().delete()
+    copy.doc.add(copy_doc)
+
     for bundled in bundleds:
     for bundled in bundleds:
       bundled.pk = None
       bundled.pk = None
       bundled.id = None
       bundled.id = None
       bundled.bundle = copy
       bundled.bundle = copy
       bundled.save()
       bundled.save()
 
 
-    copy_doc.pk = None
-    copy_doc.id = None
-    copy_doc.owner = copy.owner
-    copy_doc.save()
-    copy.doc.add(copy_doc)
-
     return copy
     return copy
 
 
   @classmethod
   @classmethod
@@ -1682,7 +1693,7 @@ class Bundle(Job):
         'deployment_dir': self.deployment_dir
         'deployment_dir': self.deployment_dir
       }
       }
     }
     }
-    
+
     xml = self.to_xml(mapping=mapping)
     xml = self.to_xml(mapping=mapping)
 
 
     zfile = zipfile.ZipFile(fp, 'w')
     zfile = zipfile.ZipFile(fp, 'w')

+ 2 - 1
apps/oozie/src/oozie/templates/editor/list_bundles.mako

@@ -217,8 +217,9 @@ ${ layout.menubar(section='bundles') }
       }
       }
       var can_delete = $(".hueCheckbox[checked='checked'][data-delete-id]");
       var can_delete = $(".hueCheckbox[checked='checked'][data-delete-id]");
       var can_delete_box_count = $(".hueCheckbox[data-delete-id]").length;
       var can_delete_box_count = $(".hueCheckbox[data-delete-id]").length;
-      if (can_delete.length >= 1 && can_delete.length == can_delete_box_count) {
+      if (can_delete.length >= 1 || can_delete.length == can_delete_box_count) {
         $("#trash-btn").removeAttr("disabled");
         $("#trash-btn").removeAttr("disabled");
+        $("#trash-btn-caret").removeAttr("disabled");
       }
       }
     }
     }
 
 

+ 1 - 1
apps/oozie/src/oozie/templates/editor/list_coordinators.mako

@@ -214,7 +214,7 @@ ${ layout.menubar(section='coordinators') }
       }
       }
       var can_delete = $(".hueCheckbox[checked='checked'][data-delete-id]");
       var can_delete = $(".hueCheckbox[checked='checked'][data-delete-id]");
       var can_delete_box_count = $(".hueCheckbox[data-delete-id]").length;
       var can_delete_box_count = $(".hueCheckbox[data-delete-id]").length;
-      if (can_delete.length >= 1 && can_delete.length == can_delete_box_count) {
+      if (can_delete.length >= 1 || can_delete.length == can_delete_box_count) {
         $("#trash-btn").removeAttr("disabled");
         $("#trash-btn").removeAttr("disabled");
         $("#trash-btn-caret").removeAttr("disabled");
         $("#trash-btn-caret").removeAttr("disabled");
       }
       }

+ 1 - 1
apps/oozie/src/oozie/templates/editor/list_workflows.mako

@@ -218,7 +218,7 @@ ${ layout.menubar(section='workflows') }
       }
       }
       var can_delete = $(".hueCheckbox[checked='checked'][data-delete-id]");
       var can_delete = $(".hueCheckbox[checked='checked'][data-delete-id]");
       var can_delete_box_count = $(".hueCheckbox[data-delete-id]").length;
       var can_delete_box_count = $(".hueCheckbox[data-delete-id]").length;
-      if (can_delete.length >= 1 && can_delete.length == can_delete_box_count) {
+      if (can_delete.length >= 1 || can_delete.length == can_delete_box_count) {
         $("#trash-btn").removeAttr("disabled");
         $("#trash-btn").removeAttr("disabled");
         $("#trash-btn-caret").removeAttr("disabled");
         $("#trash-btn-caret").removeAttr("disabled");
       }
       }

+ 5 - 3
apps/oozie/src/oozie/tests.py

@@ -205,8 +205,10 @@ class OozieMockBase(object):
     oozie_api._api_cache = None
     oozie_api._api_cache = None
 
 
     History.objects.all().delete()
     History.objects.all().delete()
-    Coordinator.objects.all().delete()
-    Bundle.objects.all().delete()
+    for coordinator in Coordinator.objects.all():
+      coordinator.delete(skip_trash=True)
+    for bundle in Bundle.objects.all():
+      bundle.delete(skip_trash=True)
 
 
 
 
   def setup_simple_workflow(self):
   def setup_simple_workflow(self):
@@ -3124,7 +3126,7 @@ class TestDashboard(OozieMockBase):
 
 
 
 
   def test_bundles_permissions(self):
   def test_bundles_permissions(self):
-    response = self.c.get(reverse('oozie:list_oozie_bundles')+"?format=json")
+    response = self.c.get(reverse('oozie:list_oozie_bundles') + "?format=json")
     assert_true('MyBundle1' in response.content, response.content)
     assert_true('MyBundle1' in response.content, response.content)
 
 
     # Login as someone else
     # Login as someone else

+ 13 - 1
desktop/core/src/desktop/models.py

@@ -321,6 +321,14 @@ class DocumentManager(models.Manager):
         doc.tags.remove(default_tag)
         doc.tags.remove(default_tag)
     except Exception, e:
     except Exception, e:
       LOG.warn(force_unicode(e))
       LOG.warn(force_unicode(e))
+      
+    # Delete documents with no object
+    try:
+      for doc in Document.objects.all():
+        if doc.content_type is None:
+          doc.delete()
+    except Exception, e:
+      LOG.warn(force_unicode(e))
 
 
 
 
 class Document(models.Model):
 class Document(models.Model):
@@ -412,8 +420,12 @@ class Document(models.Model):
       copy_doc.owner = owner
       copy_doc.owner = owner
     copy_doc.save()
     copy_doc.save()
 
 
+    tags = filter(lambda tag: tag.tag != DocumentTag.EXAMPLE, tags)
+    if not tags:
+      default_tag = DocumentTag.objects.get_default_tag(copy_doc.owner)
+      tags = [default_tag]
     copy_doc.tags.add(*tags)
     copy_doc.tags.add(*tags)
-
+    
     return copy_doc
     return copy_doc
 
 
   @property
   @property