summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/pgraph.rb9
-rw-r--r--lib/puppet/transaction.rb12
-rw-r--r--lib/puppet/type.rb2
3 files changed, 19 insertions, 4 deletions
diff --git a/lib/puppet/pgraph.rb b/lib/puppet/pgraph.rb
index a8ff952ed..e7247418c 100644
--- a/lib/puppet/pgraph.rb
+++ b/lib/puppet/pgraph.rb
@@ -20,10 +20,15 @@ class Puppet::PGraph < GRATR::Digraph
@edge_number.clear
end
end
+
+ # Which resources a given resource depends upon.
+ def dependents(resource)
+ tree_from_vertex(resource, :dfs).keys
+ end
- # The dependencies for a given resource.
+ # The which resources depend upon the given resource.
def dependencies(resource)
- tree_from_vertex(resource, :dfs).keys
+ reversal.tree_from_vertex(resource, :dfs).keys
end
# Override this method to use our class instead.
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index 99b03b435..67d016c15 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -44,6 +44,16 @@ class Transaction
# And then return
return []
end
+
+ # If a resource is going to be deleted but it still has dependencies, then
+ # don't delete it unless it's implicit.
+ if ! resource.implicit? and deps = @relgraph.dependents(resource) and ! deps.empty? and changes.detect { |change|
+ change.state.name == :ensure and change.should == :absent
+ }
+ resource.warning "%s still depend%s on me -- not deleting" %
+ [deps.collect { |r| r.ref }.join(","), if deps.length > 1; ""; else "s"; end]
+ return []
+ end
unless changes.is_a? Array
changes = [changes]
@@ -237,7 +247,7 @@ class Transaction
# enough to check the immediate dependencies, which is why we use
# a tree from the reversed graph.
skip = false
- @relgraph.reversal.tree_from_vertex(resource, :dfs).keys.each do |dep|
+ @relgraph.dependencies(resource).each do |dep|
if fails = failed?(dep)
resource.notice "Dependency %s[%s] has %s failures" %
[dep.class.name, dep.name, @failures[dep]]
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index 2c99e3343..e55f9f5ae 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -334,7 +334,7 @@ class Type < Puppet::Element
# Return the "type[name]" style reference.
def ref
- "%s[%s]" % [self.class.name, self.title]
+ "%s[%s]" % [self.class.name.to_s.capitalize, self.title]
end
# Retrieve the title of an object. If no title was set separately,