From ab70663d159ff7b59d116ed69b9a455cb22847c4 Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Wed, 15 Jun 2011 09:40:04 -0700 Subject: [PATCH 1/2] (#3) Add an anchor type to provide containment With Puppet 2.6.x we do not have a way to specify containment relationships. In the use case of class ntp { } declaring ntp::{package,config,service} classes, the ntp class itself should allow the user to specify before and require relationships to the main ntp class. The anchor resource type allows module authors to close the loop on classes composing the main top level module. For example: class ntp { class { 'ntp::package': } -> class { 'ntp::config': } -> class { 'ntp::service': } # These two resources "anchor" the composed classes # such that the end user may use "require" and "before" # relationships with Class['ntp'] anchor { 'ntp::begin': } -> class { 'ntp::package': } class { 'ntp::service': } -> anchor { 'ntp::end': } } Using this pattern, the module user may then simply declare relationships to the ntp class as they expect: class { 'ntp': } -> class { 'mcollective': } # OR class { 'mcollective': } -> class { 'ntp': } --- lib/puppet/type/anchor.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 lib/puppet/type/anchor.rb diff --git a/lib/puppet/type/anchor.rb b/lib/puppet/type/anchor.rb new file mode 100644 index 0000000..0c28b1c --- /dev/null +++ b/lib/puppet/type/anchor.rb @@ -0,0 +1,32 @@ +Puppet::Type.newtype(:anchor) do + desc <<-'ENDOFDESC' + A simple resource type intended to be used as an anchor in a composite class. + + class ntp { + class { 'ntp::package': } + -> class { 'ntp::config': } + -> class { 'ntp::service': } + + # These two resources "anchor" the composed classes + # such that the end user may use "require" and "before" + # relationships with Class['ntp'] + anchor { 'ntp::begin': } -> class { 'ntp::package': } + class { 'ntp::service': } -> anchor { 'ntp::end': } + } + + This resource allows all of the classes in the ntp module to be contained + within the ntp class from a dependency management point of view. + + This allows the end user of the ntp module to establish require and before + relationships easily: + + class { 'ntp': } -> class { 'mcollective': } + class { 'mcollective': } -> class { 'ntp': } + + ENDOFDESC + + newparam :name do + desc "The name of the anchor resource." + end + +end From f13f3c2916c2857a3949d5ac6b884c045804ebac Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Wed, 15 Jun 2011 09:43:22 -0700 Subject: [PATCH 2/2] (#3) Add simple unit test for anchor type Unlike the whit type the anchor type derives from, we are not hacking the stringify method. We expect the resource to be named simply Anchor[foo::bar] where the name is "foo::bar". --- spec/unit/puppet/type/anchor_spec.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 spec/unit/puppet/type/anchor_spec.rb diff --git a/spec/unit/puppet/type/anchor_spec.rb b/spec/unit/puppet/type/anchor_spec.rb new file mode 100644 index 0000000..2030b83 --- /dev/null +++ b/spec/unit/puppet/type/anchor_spec.rb @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby + +require 'puppet' + +anchor = Puppet::Type.type(:anchor).new(:name => "ntp::begin") + +describe anchor do + it "should stringify normally" do + anchor.to_s.should == "Anchor[ntp::begin]" + end +end