puppet-module 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/CHANGES.markdown +91 -0
  2. data/LICENSE +17 -0
  3. data/README.markdown +221 -0
  4. data/Rakefile +87 -0
  5. data/VERSION +1 -0
  6. data/bin/puppet-module +7 -0
  7. data/lib/puppet/module/tool.rb +124 -0
  8. data/lib/puppet/module/tool/applications.rb +18 -0
  9. data/lib/puppet/module/tool/applications/application.rb +83 -0
  10. data/lib/puppet/module/tool/applications/builder.rb +88 -0
  11. data/lib/puppet/module/tool/applications/checksummer.rb +38 -0
  12. data/lib/puppet/module/tool/applications/cleaner.rb +14 -0
  13. data/lib/puppet/module/tool/applications/freezer.rb +20 -0
  14. data/lib/puppet/module/tool/applications/generator.rb +117 -0
  15. data/lib/puppet/module/tool/applications/installer.rb +83 -0
  16. data/lib/puppet/module/tool/applications/registrar.rb +34 -0
  17. data/lib/puppet/module/tool/applications/releaser.rb +48 -0
  18. data/lib/puppet/module/tool/applications/searcher.rb +34 -0
  19. data/lib/puppet/module/tool/applications/unpacker.rb +69 -0
  20. data/lib/puppet/module/tool/applications/unreleaser.rb +42 -0
  21. data/lib/puppet/module/tool/cache.rb +56 -0
  22. data/lib/puppet/module/tool/checksums.rb +52 -0
  23. data/lib/puppet/module/tool/cli.rb +127 -0
  24. data/lib/puppet/module/tool/contents_description.rb +84 -0
  25. data/lib/puppet/module/tool/dependency.rb +26 -0
  26. data/lib/puppet/module/tool/metadata.rb +80 -0
  27. data/lib/puppet/module/tool/modulefile.rb +47 -0
  28. data/lib/puppet/module/tool/repository.rb +74 -0
  29. data/lib/puppet/module/tool/skeleton.rb +39 -0
  30. data/lib/puppet/module/tool/utils.rb +9 -0
  31. data/lib/puppet/module/tool/utils/interrogation.rb +39 -0
  32. data/lib/puppet/module/tool/utils/settings.rb +36 -0
  33. data/lib/puppet/module/tool/utils/uri.rb +16 -0
  34. data/spec/fixtures/releases/jamtur01-apache/Modulefile +2 -0
  35. data/spec/fixtures/releases/jamtur01-apache/files/httpd +24 -0
  36. data/spec/fixtures/releases/jamtur01-apache/files/test.vhost +18 -0
  37. data/spec/fixtures/releases/jamtur01-apache/lib/puppet/provider/a2mod/debian.rb +21 -0
  38. data/spec/fixtures/releases/jamtur01-apache/lib/puppet/type/a2mod.rb +12 -0
  39. data/spec/fixtures/releases/jamtur01-apache/manifests/dev.pp +5 -0
  40. data/spec/fixtures/releases/jamtur01-apache/manifests/init.pp +34 -0
  41. data/spec/fixtures/releases/jamtur01-apache/manifests/params.pp +17 -0
  42. data/spec/fixtures/releases/jamtur01-apache/manifests/php.pp +5 -0
  43. data/spec/fixtures/releases/jamtur01-apache/manifests/ssl.pp +15 -0
  44. data/spec/fixtures/releases/jamtur01-apache/manifests/vhost.pp +15 -0
  45. data/spec/fixtures/releases/jamtur01-apache/metadata.json +1 -0
  46. data/spec/fixtures/releases/jamtur01-apache/templates/vhost-default.conf.erb +20 -0
  47. data/spec/fixtures/releases/jamtur01-apache/tests/apache.pp +1 -0
  48. data/spec/fixtures/releases/jamtur01-apache/tests/dev.pp +1 -0
  49. data/spec/fixtures/releases/jamtur01-apache/tests/init.pp +1 -0
  50. data/spec/fixtures/releases/jamtur01-apache/tests/php.pp +1 -0
  51. data/spec/fixtures/releases/jamtur01-apache/tests/ssl.pp +1 -0
  52. data/spec/fixtures/releases/jamtur01-apache/tests/vhost.pp +2 -0
  53. data/spec/integration/cli_spec.rb +373 -0
  54. data/spec/spec.opts +1 -0
  55. data/spec/spec_helper.rb +15 -0
  56. data/spec/support/output_support.rb +19 -0
  57. data/spec/support/stub_http_support.rb +14 -0
  58. data/spec/support/testdir_support.rb +26 -0
  59. data/spec/unit/application_spec.rb +25 -0
  60. data/spec/unit/repository_spec.rb +51 -0
  61. data/templates/generator/Modulefile.erb +5 -0
  62. data/templates/generator/README.erb +3 -0
  63. data/templates/generator/files/README.markdown +22 -0
  64. data/templates/generator/lib/puppet/facter/README.markdown +22 -0
  65. data/templates/generator/lib/puppet/parser/functions/README.markdown +17 -0
  66. data/templates/generator/lib/puppet/provider/README.markdown +14 -0
  67. data/templates/generator/lib/puppet/type/README.markdown +14 -0
  68. data/templates/generator/manifests/README.markdown +28 -0
  69. data/templates/generator/manifests/init.pp.erb +17 -0
  70. data/templates/generator/metadata.json +12 -0
  71. data/templates/generator/spec/README.markdown +7 -0
  72. data/templates/generator/spec/spec.opts +6 -0
  73. data/templates/generator/spec/spec_helper.rb +18 -0
  74. data/templates/generator/spec/unit/puppet/provider/README.markdown +4 -0
  75. data/templates/generator/spec/unit/puppet/type/README.markdown +4 -0
  76. data/templates/generator/templates/README.markdown +23 -0
  77. data/templates/generator/tests/init.pp.erb +1 -0
  78. data/vendor/facets-2.8.2-partial/lib/facets/kernel/returning.rb +23 -0
  79. data/vendor/facets-2.8.2-partial/lib/facets/kernel/tap.rb +39 -0
  80. data/vendor/multipart-post-1.0/Manifest.txt +9 -0
  81. data/vendor/multipart-post-1.0/README.txt +61 -0
  82. data/vendor/multipart-post-1.0/Rakefile +21 -0
  83. data/vendor/multipart-post-1.0/lib/composite_io.rb +89 -0
  84. data/vendor/multipart-post-1.0/lib/multipartable.rb +13 -0
  85. data/vendor/multipart-post-1.0/lib/net/http/post/multipart.rb +27 -0
  86. data/vendor/multipart-post-1.0/lib/parts.rb +66 -0
  87. data/vendor/multipart-post-1.0/test/net/http/post/test_multipart.rb +55 -0
  88. data/vendor/multipart-post-1.0/test/test_composite_io.rb +50 -0
  89. data/vendor/thor-852190ae/CHANGELOG.rdoc +89 -0
  90. data/vendor/thor-852190ae/LICENSE +20 -0
  91. data/vendor/thor-852190ae/README.rdoc +297 -0
  92. data/vendor/thor-852190ae/REVISION +1 -0
  93. data/vendor/thor-852190ae/Thorfile +69 -0
  94. data/vendor/thor-852190ae/bin/rake2thor +86 -0
  95. data/vendor/thor-852190ae/bin/thor +6 -0
  96. data/vendor/thor-852190ae/lib/thor.rb +244 -0
  97. data/vendor/thor-852190ae/lib/thor/actions.rb +275 -0
  98. data/vendor/thor-852190ae/lib/thor/actions/create_file.rb +103 -0
  99. data/vendor/thor-852190ae/lib/thor/actions/directory.rb +91 -0
  100. data/vendor/thor-852190ae/lib/thor/actions/empty_directory.rb +134 -0
  101. data/vendor/thor-852190ae/lib/thor/actions/file_manipulation.rb +223 -0
  102. data/vendor/thor-852190ae/lib/thor/actions/inject_into_file.rb +104 -0
  103. data/vendor/thor-852190ae/lib/thor/base.rb +540 -0
  104. data/vendor/thor-852190ae/lib/thor/core_ext/file_binary_read.rb +9 -0
  105. data/vendor/thor-852190ae/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  106. data/vendor/thor-852190ae/lib/thor/core_ext/ordered_hash.rb +100 -0
  107. data/vendor/thor-852190ae/lib/thor/error.rb +30 -0
  108. data/vendor/thor-852190ae/lib/thor/group.rb +271 -0
  109. data/vendor/thor-852190ae/lib/thor/invocation.rb +180 -0
  110. data/vendor/thor-852190ae/lib/thor/parser.rb +4 -0
  111. data/vendor/thor-852190ae/lib/thor/parser/argument.rb +67 -0
  112. data/vendor/thor-852190ae/lib/thor/parser/arguments.rb +150 -0
  113. data/vendor/thor-852190ae/lib/thor/parser/option.rb +128 -0
  114. data/vendor/thor-852190ae/lib/thor/parser/options.rb +169 -0
  115. data/vendor/thor-852190ae/lib/thor/rake_compat.rb +66 -0
  116. data/vendor/thor-852190ae/lib/thor/runner.rb +314 -0
  117. data/vendor/thor-852190ae/lib/thor/shell.rb +83 -0
  118. data/vendor/thor-852190ae/lib/thor/shell/basic.rb +239 -0
  119. data/vendor/thor-852190ae/lib/thor/shell/color.rb +108 -0
  120. data/vendor/thor-852190ae/lib/thor/task.rb +102 -0
  121. data/vendor/thor-852190ae/lib/thor/util.rb +230 -0
  122. data/vendor/thor-852190ae/lib/thor/version.rb +3 -0
  123. data/vendor/thor-852190ae/spec/actions/create_file_spec.rb +170 -0
  124. data/vendor/thor-852190ae/spec/actions/directory_spec.rb +131 -0
  125. data/vendor/thor-852190ae/spec/actions/empty_directory_spec.rb +91 -0
  126. data/vendor/thor-852190ae/spec/actions/file_manipulation_spec.rb +271 -0
  127. data/vendor/thor-852190ae/spec/actions/inject_into_file_spec.rb +135 -0
  128. data/vendor/thor-852190ae/spec/actions_spec.rb +292 -0
  129. data/vendor/thor-852190ae/spec/base_spec.rb +263 -0
  130. data/vendor/thor-852190ae/spec/core_ext/hash_with_indifferent_access_spec.rb +43 -0
  131. data/vendor/thor-852190ae/spec/core_ext/ordered_hash_spec.rb +115 -0
  132. data/vendor/thor-852190ae/spec/fixtures/application.rb +2 -0
  133. data/vendor/thor-852190ae/spec/fixtures/bundle/execute.rb +6 -0
  134. data/vendor/thor-852190ae/spec/fixtures/bundle/main.thor +1 -0
  135. data/vendor/thor-852190ae/spec/fixtures/doc/%file_name%.rb.tt +1 -0
  136. data/vendor/thor-852190ae/spec/fixtures/doc/README +3 -0
  137. data/vendor/thor-852190ae/spec/fixtures/doc/config.rb +1 -0
  138. data/vendor/thor-852190ae/spec/fixtures/group.thor +83 -0
  139. data/vendor/thor-852190ae/spec/fixtures/invoke.thor +112 -0
  140. data/vendor/thor-852190ae/spec/fixtures/script.thor +140 -0
  141. data/vendor/thor-852190ae/spec/fixtures/task.thor +10 -0
  142. data/vendor/thor-852190ae/spec/group_spec.rb +171 -0
  143. data/vendor/thor-852190ae/spec/invocation_spec.rb +107 -0
  144. data/vendor/thor-852190ae/spec/parser/argument_spec.rb +47 -0
  145. data/vendor/thor-852190ae/spec/parser/arguments_spec.rb +64 -0
  146. data/vendor/thor-852190ae/spec/parser/option_spec.rb +202 -0
  147. data/vendor/thor-852190ae/spec/parser/options_spec.rb +292 -0
  148. data/vendor/thor-852190ae/spec/rake_compat_spec.rb +68 -0
  149. data/vendor/thor-852190ae/spec/runner_spec.rb +202 -0
  150. data/vendor/thor-852190ae/spec/shell/basic_spec.rb +205 -0
  151. data/vendor/thor-852190ae/spec/shell/color_spec.rb +41 -0
  152. data/vendor/thor-852190ae/spec/shell_spec.rb +34 -0
  153. data/vendor/thor-852190ae/spec/spec.opts +1 -0
  154. data/vendor/thor-852190ae/spec/spec_helper.rb +54 -0
  155. data/vendor/thor-852190ae/spec/task_spec.rb +69 -0
  156. data/vendor/thor-852190ae/spec/thor_spec.rb +237 -0
  157. data/vendor/thor-852190ae/spec/util_spec.rb +167 -0
  158. data/vendor/thor-852190ae/thor.gemspec +120 -0
  159. metadata +229 -0
@@ -0,0 +1,2 @@
1
+ name 'jamtur01-apache'
2
+ version '0.0.1'
@@ -0,0 +1,24 @@
1
+ # Configuration file for the httpd service.
2
+
3
+ #
4
+ # The default processing model (MPM) is the process-based
5
+ # 'prefork' model. A thread-based model, 'worker', is also
6
+ # available, but does not work with some modules (such as PHP).
7
+ # The service must be stopped before changing this variable.
8
+ #
9
+ #HTTPD=/usr/sbin/httpd.worker
10
+
11
+ #
12
+ # To pass additional options (for instance, -D definitions) to the
13
+ # httpd binary at startup, set OPTIONS here.
14
+ #
15
+ #OPTIONS=
16
+ #OPTIONS=-DDOWN
17
+
18
+ #
19
+ # By default, the httpd process is started in the C locale; to
20
+ # change the locale in which the server runs, the HTTPD_LANG
21
+ # variable can be set.
22
+ #
23
+ #HTTPD_LANG=C
24
+ export SHORTHOST=`hostname -s`
@@ -0,0 +1,18 @@
1
+ #
2
+ # Test vhost
3
+ #
4
+ NameVirtualHost *:80
5
+ <VirtualHost *:80>
6
+ ServerName testvhost
7
+ DocumentRoot /tmp/testvhost
8
+ <Directory /tmp/testvhost>
9
+ Options Indexes FollowSymLinks MultiViews
10
+ AllowOverride None
11
+ Order allow,deny
12
+ allow from all
13
+ </Directory>
14
+ ErrorLog /var/log/apache2/error.log
15
+ LogLevel warn
16
+ CustomLog /var/log/apache2/access.log combined
17
+ ServerSignature On
18
+ </VirtualHost>
@@ -0,0 +1,21 @@
1
+ Puppet::Type.type(:a2mod).provide(:debian) do
2
+ desc "Manage Apache 2 modules on Debian-like OSes (e.g. Ubuntu)"
3
+
4
+ commands :encmd => "a2enmod"
5
+ commands :discmd => "a2dismod"
6
+
7
+ defaultfor :operatingsystem => [:debian, :ubuntu]
8
+
9
+ def create
10
+ encmd resource[:name]
11
+ end
12
+
13
+ def destroy
14
+ discmd resource[:name]
15
+ end
16
+
17
+ def exists?
18
+ mod= "/etc/apache2/mods-enabled/" + resource[:name] + ".load"
19
+ File.exists?(mod)
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ Puppet::Type.newtype(:a2mod) do
2
+ @doc = "Manage Apache 2 modules"
3
+
4
+ ensurable
5
+
6
+ newparam(:name) do
7
+ desc "The name of the module to be managed"
8
+
9
+ isnamevar
10
+
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class apache::dev {
2
+ include apache::params
3
+
4
+ package{$apache::params::apache_dev: ensure => installed}
5
+ }
@@ -0,0 +1,34 @@
1
+ # ensure apache is installed
2
+ class apache {
3
+ include apache::params
4
+ package{'httpd':
5
+ name => $apache::params::apache_name,
6
+ ensure => present,
7
+ }
8
+ service { 'httpd':
9
+ name => $apache::params::apache_name,
10
+ ensure => running,
11
+ enable => true,
12
+ subscribe => Package['httpd'],
13
+ }
14
+ #
15
+ # May want to purge all none realize modules using the resources resource type.
16
+ # A2mod resource type is broken. Look into fixing it and moving it into apache.
17
+ #
18
+ A2mod { require => Package['httpd'], notify => Service['httpd']}
19
+ @a2mod {
20
+ 'rewrite' : ensure => present;
21
+ 'headers' : ensure => present;
22
+ 'expires' : ensure => present;
23
+ }
24
+ $vdir = $operatingsystem? {
25
+ 'ubuntu' => '/etc/apache2/sites-enabled/',
26
+ default => '/etc/httpd/conf.d',
27
+ }
28
+ file { $vdir:
29
+ ensure => directory,
30
+ recurse => true,
31
+ purge => true,
32
+ notify => Service['httpd'],
33
+ }
34
+ }
@@ -0,0 +1,17 @@
1
+ class apache::params{
2
+ $user = 'www-data'
3
+ $group = 'www-data'
4
+
5
+ case $operatingsystem {
6
+ "centos": {
7
+ $apache_name = httpd
8
+ $ssl_package = mod_ssl
9
+ $apache_dev = httpd-devel
10
+ }
11
+ "ubuntu": {
12
+ $apache_name = apache2
13
+ $ssl_package = apache-ssl
14
+ $apache_dev = [ libaprutil1-dev, libapr1-dev, apache2-prefork-dev ]
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,5 @@
1
+ class apache::php{
2
+ package{'libapache2-mod-php5':
3
+ ensure => present,
4
+ }
5
+ }
@@ -0,0 +1,15 @@
1
+ class apache::ssl {
2
+ include apache
3
+
4
+
5
+ case $operatingsystem {
6
+ "centos": {
7
+ package { $apache::params::ssl_package:
8
+ require => Package['httpd'],
9
+ }
10
+ }
11
+ "ubuntu": {
12
+ a2mod { "ssl": ensure => present, }
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,15 @@
1
+ define apache::vhost( $port, $docroot, $ssl=true, $template='apache/vhost-default.conf.erb', $priority, $serveraliases = '' ) {
2
+ include apache
3
+ $vdir = $operatingsystem? {
4
+ 'ubuntu' => '/etc/apache2/sites-enabled/',
5
+ default => '/etc/httpd/conf.d',
6
+ }
7
+ file{"${vdir}/${priority}-${name}":
8
+ content => template($template),
9
+ owner => 'root',
10
+ group => 'root',
11
+ mode => '777',
12
+ require => Package['httpd'],
13
+ notify => Service['httpd'],
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ {"dependencies":[],"types":[{"providers":[{"name":"a2mod","doc":"Manage Apache 2 modules on Debian and Ubuntu Required binaries: ``a2enmod``, ``a2dismod``. Default for ``operatingsystem`` == ``debianubuntu``. "}],"parameters":[{"name":"name","doc":"The name of the module to be managed"}],"properties":[{"name":"ensure","doc":"The basic property that the resource should be in. Valid values are ``present``, ``absent``."}],"name":"a2mod","doc":"Manage Apache 2 modules on Debian and Ubuntu"}],"checksums":{"manifests/params.pp":"71734796921dbdbfd58f503622527616","tests/ssl.pp":"191912535199531fd631f911c6329e56","tests/vhost.pp":"1b91e03c8ef89a7ecb6793831ac18399","manifests/php.pp":"b78cc593f1c4cd800c906e0891c9b11f","files/httpd":"295f5e924afe6f752d29327e73fe6d0a","tests/php.pp":"ce7bb9eef69d32b42a32ce32d9653625","lib/puppet/provider/a2mod/a2mod.rb":"18c5bb180b75a2375e95e07f88a94257","files/test.vhost":"0602022c19a7b6b289f218c7b93c1aea","manifests/ssl.pp":"b4334a161a2ba5fa8a62cf7b38f352c8","manifests/dev.pp":"510813942246cc9a7786d8f2d8874a35","manifests/vhost.pp":"cbc4657b0cce5cd432057393d5f6b0c2","tests/init.pp":"4eac4a7ef68499854c54a78879e25535","lib/puppet/type/a2mod.rb":"0e1b4843431413a10320ac1f6a055d15","tests/apache.pp":"4eac4a7ef68499854c54a78879e25535","tests/dev.pp":"4cf15c1fecea3ca86009f182b402c7ab","templates/vhost-default.conf.erb":"9055aed946e1111c30ab81fedac2c8b0","manifests/init.pp":"dc503e26e8021351078813b541c4bd3d","Modulefile":"d43334b4072cd1744121b3b25cd9ed15"},"version":"0.0.1","name":"jamtur01-apache"}
@@ -0,0 +1,20 @@
1
+ NameVirtualHost *:<%= port %>
2
+ <VirtualHost *:<%= port %>>
3
+ ServerName <%= name %>
4
+ <%if serveraliases.is_a? Array -%>
5
+ <% serveraliases.each do |name| -%><%= " ServerAlias #{name}\n" %><% end -%>
6
+ <% elsif serveraliases != '' -%>
7
+ <%= " ServerAlias #{serveraliases}" -%>
8
+ <% end -%>
9
+ DocumentRoot <%= docroot %>
10
+ <Directory <%= docroot %>>
11
+ Options Indexes FollowSymLinks MultiViews
12
+ AllowOverride None
13
+ Order allow,deny
14
+ allow from all
15
+ </Directory>
16
+ ErrorLog /var/log/apache2/<%= name %>_error.log
17
+ LogLevel warn
18
+ CustomLog /var/log/apache2/<%= name %>_access.log combined
19
+ ServerSignature On
20
+ </VirtualHost>
@@ -0,0 +1 @@
1
+ include apache::dev
@@ -0,0 +1 @@
1
+ include apache::php
@@ -0,0 +1 @@
1
+ include apache::ssl
@@ -0,0 +1,2 @@
1
+ include apache
2
+ apache::vhost { 'test.vhost': source => 'puppet:///modules/apache/test.vhost' }
@@ -0,0 +1,373 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ # Directory that contains sample releases.
4
+ RELEASE_FIXTURES_DIR = File.join(File.dirname(File.expand_path(__FILE__)), "..", "fixtures", "releases")
5
+
6
+ # Return the pathname string to the directory containing the release fixture called +name+.
7
+ def release_fixture(name)
8
+ return File.join(RELEASE_FIXTURES_DIR, name)
9
+ end
10
+
11
+ # Copy the release fixture called +name+ into the current working directory.
12
+ def install_release_fixture(name)
13
+ release_fixture(name)
14
+ FileUtils.cp_r(release_fixture(name), name)
15
+ end
16
+
17
+ describe "cli" do
18
+ # Return STDOUT and STDERR output generated from +block+ as it's run within a temporary test directory.
19
+ def run(&block)
20
+ return output_for do
21
+ mktestdircd do
22
+ block.call
23
+ end
24
+ end
25
+ end
26
+
27
+ def app
28
+ return Puppet::Module::Tool::CLI.new
29
+ end
30
+
31
+ before :all do
32
+ Puppet::Module::Tool.prepare_settings
33
+
34
+ @username = "myuser"
35
+ @module_name = "mymodule"
36
+ @full_name = "#{@username}-#{@module_name}"
37
+ @version = "0.0.1"
38
+ @release_name = "#{@full_name}-#{@version}"
39
+ end
40
+
41
+ before :each do
42
+ Puppet::Module::Tool::Cache.clean
43
+ end
44
+
45
+ after :each do
46
+ Puppet::Module::Tool::Cache.clean
47
+ end
48
+
49
+ describe "version" do
50
+ it "should display a version" do
51
+ run do
52
+ app.version
53
+ end.should =~ /#{Puppet::Module::Tool.version}/
54
+ end
55
+ end
56
+
57
+ describe "generate" do
58
+ it "should generate a module if given a dashed name" do
59
+ run do
60
+ app.generate(@full_name)
61
+
62
+ File.directory?(@full_name).should == true
63
+ modulefile = File.join(@full_name, "Modulefile")
64
+ File.file?(modulefile).should == true
65
+ metadata = Puppet::Module::Tool::Metadata.new
66
+ Puppet::Module::Tool::Modulefile.evaluate(metadata, modulefile)
67
+ metadata.full_name.should == @full_name
68
+ metadata.username.should == @username
69
+ metadata.name.should == @module_name
70
+ end.should =~ /Generating module/
71
+ end
72
+
73
+ it "should fail if given an undashed name" do
74
+ run do
75
+ lambda { app.generate("invalid") }.should raise_error(SystemExit)
76
+ end.should =~ /Could not generate directory "invalid", you must specify a dash-separated username and module name./
77
+ end
78
+
79
+ it "should fail if directory already exists" do
80
+ run do
81
+ app.generate(@full_name)
82
+ lambda { app.generate(@full_name) }.should raise_error(SystemExit)
83
+ end.should =~ /already exists/
84
+ end
85
+ end
86
+
87
+ describe "build" do
88
+ it "should build a module in a directory" do
89
+ run do
90
+ app.generate(@full_name)
91
+ app.build(@full_name)
92
+
93
+ File.directory?(File.join(@full_name, "pkg", @release_name)).should == true
94
+ File.file?(File.join(@full_name, "pkg", @release_name + ".tar.gz")).should == true
95
+ metadata_file = File.join(@full_name, "pkg", @release_name, "metadata.json")
96
+ File.file?(metadata_file).should == true
97
+ metadata = PSON.parse(File.read(metadata_file))
98
+ metadata["name"].should == @full_name
99
+ metadata["version"].should == @version
100
+ metadata["checksums"].should be_a_kind_of(Hash)
101
+ metadata["dependencies"].should == []
102
+ metadata["types"].should == []
103
+ end.should =~ /Building.+Built/m
104
+ end
105
+
106
+ it "should build a module's checksums" do
107
+ run do
108
+ app.generate(@full_name)
109
+ app.build(@full_name)
110
+
111
+ metadata_file = File.join(@full_name, "pkg", @release_name, "metadata.json")
112
+ metadata = PSON.parse(File.read(metadata_file))
113
+ metadata["checksums"].should be_a_kind_of(Hash)
114
+
115
+ modulefile_path = Pathname.new(File.join(@full_name, "Modulefile"))
116
+ metadata["checksums"]["Modulefile"].should == Digest::MD5.hexdigest(modulefile_path.read)
117
+ end
118
+ end
119
+
120
+ it "should build a module's types and providers" do
121
+ run do
122
+ name = "jamtur01-apache"
123
+ install_release_fixture name
124
+ app.build(name)
125
+
126
+ metadata_file = File.join(name, "pkg", "#{name}-0.0.1", "metadata.json")
127
+ metadata = PSON.parse(File.read(metadata_file))
128
+
129
+ metadata["types"].size.should == 1
130
+ type = metadata["types"].first
131
+ type["name"].should == "a2mod"
132
+ type["doc"].should == "Manage Apache 2 modules"
133
+
134
+
135
+ type["parameters"].size.should == 1
136
+ type["parameters"].first.tap do |o|
137
+ o["name"].should == "name"
138
+ o["doc"].should == "The name of the module to be managed"
139
+ end
140
+
141
+ type["properties"].size.should == 1
142
+ type["properties"].first.tap do |o|
143
+ o["name"].should == "ensure"
144
+ o["doc"].should =~ /present.+absent/
145
+ end
146
+
147
+ type["providers"].size.should == 1
148
+ type["providers"].first.tap do |o|
149
+ o["name"].should == "debian"
150
+ o["doc"].should =~ /Manage Apache 2 modules on Debian-like OSes/
151
+ end
152
+ end
153
+ end
154
+
155
+ it "should build a module's dependencies" do
156
+ run do
157
+ app.generate(@full_name)
158
+ modulefile = File.join(@full_name, "Modulefile")
159
+
160
+ dependency1_name = "anotheruser-anothermodule"
161
+ dependency1_requirement = ">= 1.2.3"
162
+ dependency2_name = "someuser-somemodule"
163
+ dependency2_requirement = "4.2"
164
+ dependency2_repository = "http://some.repo"
165
+
166
+ File.open(modulefile, "a") do |handle|
167
+ handle.puts "dependency '#{dependency1_name}', '#{dependency1_requirement}'"
168
+ handle.puts "dependency '#{dependency2_name}', '#{dependency2_requirement}', '#{dependency2_repository}'"
169
+ end
170
+
171
+ app.build(@full_name)
172
+
173
+ metadata_file = File.join(@full_name, "pkg", "#{@full_name}-#{@version}", "metadata.json")
174
+ metadata = PSON.parse(File.read(metadata_file))
175
+
176
+ metadata['dependencies'].size.should == 2
177
+ metadata['dependencies'].sort_by{|t| t['name']}.tap do |dependencies|
178
+ dependencies[0].tap do |dependency1|
179
+ dependency1['name'].should == dependency1_name
180
+ dependency1['version_requirement'].should == dependency1_requirement
181
+ dependency1['repository'].should be_nil
182
+ end
183
+
184
+ dependencies[1].tap do |dependency2|
185
+ dependency2['name'].should == dependency2_name
186
+ dependency2['version_requirement'].should == dependency2_requirement
187
+ dependency2['repository'].should == dependency2_repository
188
+ end
189
+ end
190
+ end
191
+ end
192
+
193
+
194
+ it "should rebuild a module in a directory" do
195
+ run do
196
+ app.generate(@full_name)
197
+ app.build(@full_name)
198
+ app.build(@full_name)
199
+ end.should =~ /Building.+Built.+Building.+Built/m
200
+ end
201
+
202
+ it "should build a module in the current directory" do
203
+ run do
204
+ app.generate(@full_name)
205
+ Dir.chdir(@full_name)
206
+ app.build
207
+
208
+ File.file?(File.join("pkg", @release_name + ".tar.gz")).should == true
209
+ end.should =~ /Building.+Built/m
210
+ end
211
+
212
+ it "should fail to build a module without a Modulefile" do
213
+ run do
214
+ app.generate(@full_name)
215
+ FileUtils.rm(File.join(@full_name, "Modulefile"))
216
+
217
+ lambda { app.build(@full_name) }.should raise_error(SystemExit)
218
+ end.should =~ /Could not find a valid module at "#{@full_name}"/
219
+ end
220
+
221
+ it "should fail to build a module directory that doesn't exist" do
222
+ run do
223
+ lambda { app.build(@full_name) }.should raise_error(SystemExit)
224
+ end.should =~ /Could not find a valid module at "#{@full_name}"/
225
+ end
226
+
227
+ it "should fail to build a module in the current directory that's not a module" do
228
+ run do
229
+ lambda { app.build }.should raise_error(SystemExit)
230
+ end.should =~ /Could not find a valid module at current directory/
231
+ end
232
+ end
233
+
234
+ describe "search" do
235
+ it "should display matching modules" do
236
+ run do
237
+ stub_repository_read 200, <<-HERE
238
+ [
239
+ {"full_name": "cli", "version": "1.0"},
240
+ {"full_name": "web", "version": "2.0"}
241
+ ]
242
+ HERE
243
+ app.search("mymodule")
244
+ end.should =~ /2 found.+cli.+1\.0.+web.+2\.0/m
245
+ end
246
+
247
+ it "should display no matches" do
248
+ run do
249
+ stub_repository_read 200, "[]"
250
+ app.search("mymodule")
251
+ end.should =~ /0 found/m
252
+ end
253
+
254
+ it "should fail if can't get a connection" do
255
+ run do
256
+ stub_repository_read 500, "OH NOES!!1!"
257
+ app.search("mymodule")
258
+ end.should =~ /Could not execute search.+HTTP 500/m
259
+ end
260
+ end
261
+
262
+ describe "install" do
263
+ it "should install a module from a filesystem path" do
264
+ run do
265
+ app.generate(@full_name)
266
+ app.build(@full_name)
267
+
268
+ FileUtils.mv("#{@full_name}/pkg/#{@release_name}.tar.gz", "#{@release_name}.tar.gz")
269
+ FileUtils.rm_rf(@full_name)
270
+
271
+ app.install("#{@release_name}.tar.gz")
272
+
273
+ File.directory?(@full_name).should == true
274
+ File.file?(File.join(@full_name, 'metadata.json')).should == true
275
+ end.should =~ /Installed "myuser-mymodule-0.0.1" into directory: myuser-mymodule/
276
+ end
277
+
278
+ it "should install a module from a webserver URL" do
279
+ run do
280
+ app.generate(@full_name)
281
+ app.build(@full_name)
282
+
283
+ stub_cache_read File.read("#{@full_name}/pkg/#{@release_name}.tar.gz")
284
+ FileUtils.rm_rf(@full_name)
285
+
286
+ stub_installer_read <<-HERE
287
+ {"file": "/foo/bar/#{@release_name}.tar.gz", "version": "#{@version}"}
288
+ HERE
289
+
290
+ app.install(@full_name)
291
+
292
+ File.directory?(@full_name).should == true
293
+ File.file?(File.join(@full_name, 'metadata.json')).should == true
294
+ end.should =~ /Installed #{@release_name.inspect} into directory: #{@full_name}/
295
+ end
296
+
297
+ it "should install a module from a webserver URL using a version requirement" # TODO
298
+
299
+ it "should fail if module isn't a slashed name" do
300
+ run do
301
+ lambda { app.install("invalid") }.should raise_error(SystemExit)
302
+ end.should =~ /Could not install module with invalid name/
303
+ end
304
+
305
+ it "should fail if module doesn't exist on webserver" do
306
+ run do
307
+ stub_installer_read "{}"
308
+ lambda { app.install("not-found") }.should raise_error(SystemExit)
309
+ end
310
+ end
311
+
312
+ it "should fail gracefully when receiving invalid PSON" do
313
+ pending "Implement PSON error wrapper" # TODO
314
+ run do
315
+ stub_installer_read "1/0"
316
+ lambda { app.install("not-found") }.should raise_error(SystemExit)
317
+ end
318
+ end
319
+
320
+ it "should fail if installing a module that's already installed" do
321
+ run do
322
+ name = "myuser-mymodule"
323
+ Dir.mkdir name
324
+ lambda { app.install(name) }.should raise_error(SystemExit)
325
+ end.should =~ /already installed/
326
+ end
327
+
328
+ end
329
+
330
+ describe "clean" do
331
+ it "should clean cache" do
332
+ run do
333
+ app.generate(@full_name)
334
+ app.build(@full_name)
335
+ FileUtils.mv("#{@full_name}/pkg/#{@release_name}.tar.gz", "#{@release_name}.tar.gz")
336
+ FileUtils.rm_rf(@full_name)
337
+ app.install("#{@release_name}.tar.gz")
338
+
339
+ Puppet::Module::Tool::Cache.base_path.directory?.should == true
340
+
341
+ app.clean
342
+
343
+ Puppet::Module::Tool::Cache.base_path.directory?.should == false
344
+ end
345
+ end
346
+ end
347
+
348
+ describe "changes" do
349
+ it "should display changes" do
350
+ run do
351
+ app.generate(@full_name)
352
+ app.build(@full_name)
353
+ Dir.chdir("#{@full_name}/pkg/#{@release_name}")
354
+ File.open("Modulefile", "a") do |handle|
355
+ handle.puts
356
+ handle.puts "# Added"
357
+ end
358
+ puts "CHANGES:"
359
+ app.changes(".")
360
+ end.should =~ /CHANGES:.+Modulefile\s*\z/m
361
+ end
362
+ end
363
+
364
+ describe "repository" do
365
+ it "should display repository" do
366
+ run do
367
+ # TODO How to avoid accessing "~/.puppet/puppet.conf" without stubbing parts we want to exercise?
368
+ app.repository
369
+ end.should =~ %r{http://}
370
+ end
371
+ end
372
+
373
+ end