syncwrap 1.5.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/History.rdoc +19 -0
  3. data/Manifest.txt +82 -34
  4. data/README.rdoc +96 -48
  5. data/Rakefile +0 -65
  6. data/bin/syncwrap +27 -0
  7. data/examples/LAYOUT.rdoc +70 -0
  8. data/examples/Rakefile +16 -0
  9. data/examples/ec2.rb +44 -0
  10. data/examples/hello.rb +14 -0
  11. data/examples/hello_binding.rb +27 -0
  12. data/examples/jruby.rb +11 -0
  13. data/examples/private/aws.json +4 -0
  14. data/examples/rput.rb +24 -0
  15. data/examples/sync/home/bob/.ssh/authorized_keys +1 -0
  16. data/examples/sync/tmp/sample.erb +3 -0
  17. data/lib/syncwrap/amazon_ec2.rb +236 -0
  18. data/lib/syncwrap/amazon_ws.rb +308 -0
  19. data/lib/syncwrap/base.rb +4 -2
  20. data/lib/syncwrap/cli.rb +328 -0
  21. data/lib/syncwrap/component.rb +443 -0
  22. data/lib/syncwrap/components/commercial_jdk.rb +76 -0
  23. data/lib/syncwrap/components/cruby_vm.rb +144 -0
  24. data/lib/syncwrap/components/etc_hosts.rb +44 -0
  25. data/lib/syncwrap/{geminabox.rb → components/geminabox.rb} +12 -17
  26. data/lib/syncwrap/components/hashdot.rb +97 -0
  27. data/lib/syncwrap/components/iyyov.rb +144 -0
  28. data/lib/syncwrap/components/iyyov_daemon.rb +125 -0
  29. data/lib/syncwrap/components/jruby_vm.rb +122 -0
  30. data/lib/syncwrap/components/mdraid.rb +204 -0
  31. data/lib/syncwrap/components/network.rb +99 -0
  32. data/lib/syncwrap/components/open_jdk.rb +70 -0
  33. data/lib/syncwrap/components/postgresql.rb +159 -0
  34. data/lib/syncwrap/components/qpid.rb +303 -0
  35. data/lib/syncwrap/components/rhel.rb +71 -0
  36. data/lib/syncwrap/components/run_user.rb +99 -0
  37. data/lib/syncwrap/components/ubuntu.rb +85 -0
  38. data/lib/syncwrap/components/users.rb +200 -0
  39. data/lib/syncwrap/context.rb +260 -0
  40. data/lib/syncwrap/distro.rb +53 -60
  41. data/lib/syncwrap/formatter.rb +149 -0
  42. data/lib/syncwrap/host.rb +134 -0
  43. data/lib/syncwrap/main.rb +62 -0
  44. data/lib/syncwrap/path_util.rb +55 -0
  45. data/lib/syncwrap/rsync.rb +227 -0
  46. data/lib/syncwrap/ruby_support.rb +110 -0
  47. data/lib/syncwrap/shell.rb +207 -0
  48. data/lib/syncwrap.rb +367 -1
  49. data/{etc → sync/etc}/gemrc +1 -3
  50. data/sync/etc/hosts.erb +8 -0
  51. data/{etc/init.d/iyyov → sync/etc/init.d/iyyov.erb} +35 -7
  52. data/sync/etc/sysconfig/pgsql/postgresql.erb +2 -0
  53. data/sync/src/hashdot/Makefile.erb +98 -0
  54. data/sync/src/hashdot/profiles/default.hdp.erb +25 -0
  55. data/sync/src/hashdot/profiles/jruby-common.hdp +28 -0
  56. data/sync/src/hashdot/profiles/jruby-shortlived.hdp +9 -0
  57. data/sync/src/hashdot/profiles/jruby.hdp.erb +13 -0
  58. data/sync/src/hashdot/profiles/shortlived.hdp +6 -0
  59. data/sync/var/iyyov/default/config.rb +1 -0
  60. data/sync/var/iyyov/default/daemon.rb.erb +15 -0
  61. data/sync/var/iyyov/jobs.rb.erb +4 -0
  62. data/test/muddled_sync.rb +13 -0
  63. data/test/setup.rb +39 -0
  64. data/test/sync/d1/bar +1 -0
  65. data/test/sync/d1/foo.erb +1 -0
  66. data/test/sync/d3/d2/bar +1 -0
  67. data/test/sync/d3/d2/foo.erb +1 -0
  68. data/test/test_components.rb +108 -0
  69. data/test/test_context.rb +107 -0
  70. data/test/test_context_rput.rb +289 -0
  71. data/test/test_rsync.rb +138 -0
  72. data/test/test_shell.rb +233 -0
  73. data/test/test_space.rb +218 -0
  74. data/test/test_space_main.rb +40 -0
  75. data/test/zfile +1 -0
  76. metadata +204 -71
  77. data/etc/sysconfig/pgsql/postgresql +0 -2
  78. data/lib/syncwrap/aws.rb +0 -448
  79. data/lib/syncwrap/common.rb +0 -161
  80. data/lib/syncwrap/ec2.rb +0 -59
  81. data/lib/syncwrap/hashdot.rb +0 -70
  82. data/lib/syncwrap/iyyov.rb +0 -139
  83. data/lib/syncwrap/java.rb +0 -61
  84. data/lib/syncwrap/jruby.rb +0 -118
  85. data/lib/syncwrap/postgresql.rb +0 -135
  86. data/lib/syncwrap/qpid.rb +0 -251
  87. data/lib/syncwrap/remote_task.rb +0 -199
  88. data/lib/syncwrap/rhel.rb +0 -67
  89. data/lib/syncwrap/ubuntu.rb +0 -78
  90. data/lib/syncwrap/user_run.rb +0 -102
  91. data/test/test_syncwrap.rb +0 -202
  92. data/var/iyyov/jobs.rb +0 -11
  93. /data/{etc → sync/etc}/corosync/corosync.conf +0 -0
  94. /data/{etc → sync/etc}/corosync/uidgid.d/qpid +0 -0
  95. /data/{etc → sync/etc}/init.d/qpidd +0 -0
  96. /data/{etc → sync/etc}/sysctl.d/61-postgresql-shm.conf +0 -0
  97. /data/{usr/local → sync/jruby}/bin/jgem +0 -0
  98. /data/{postgresql → sync/postgresql}/rhel/pg_hba.conf +0 -0
  99. /data/{postgresql → sync/postgresql}/rhel/pg_ident.conf +0 -0
  100. /data/{postgresql → sync/postgresql}/rhel/postgresql.conf +0 -0
  101. /data/{postgresql → sync/postgresql}/ubuntu/environment +0 -0
  102. /data/{postgresql → sync/postgresql}/ubuntu/pg_ctl.conf +0 -0
  103. /data/{postgresql → sync/postgresql}/ubuntu/pg_hba.conf +0 -0
  104. /data/{postgresql → sync/postgresql}/ubuntu/pg_ident.conf +0 -0
  105. /data/{postgresql → sync/postgresql}/ubuntu/postgresql.conf +0 -0
  106. /data/{postgresql → sync/postgresql}/ubuntu/start.conf +0 -0
  107. /data/{usr → sync/usr}/local/etc/qpidd.conf +0 -0
@@ -0,0 +1,8 @@
1
+ 127.0.0.1 localhost
2
+ ::1 ip6-localhost localhost6
3
+
4
+ # Hosts generated by SyncWrap::EtcHosts
5
+ <% etc_host_table.each do |ip, names| %>
6
+ <%= "%-15s %s" % [ ip, names.join( ' ' ) ] %>
7
+
8
+ <% end %>
@@ -1,29 +1,43 @@
1
1
  #!/bin/bash
2
- #
2
+ <% if lsb %>
3
+ ### BEGIN INIT INFO
4
+ # Provides: iyyov
5
+ # Required-Start: $remote_fs $syslog
6
+ # Required-Stop: $remote_fs $syslog
7
+ # Should-Start: $named
8
+ # Default-Start: 2 3 4 5
9
+ # Default-Stop:
10
+ # Short-Description: Iyyov jruby monitor
11
+ # Description: Iyyov jruby monitoring and job control daemon
12
+ ### END INIT INFO
13
+
14
+ . /lib/lsb/init-functions
15
+ <% else %>
3
16
  # iyyov Startup script for Iyyov monitoring daemon
4
17
  #
5
18
  # chkconfig: 2345 88 12
6
- # description: Iyyov monitoring daemon
19
+ # description: Iyyov monitoring and job control daemon
7
20
  # processname: iyyov
8
21
  # config: /opt/var/iyyov/jobs.rb
9
22
 
10
23
  . /etc/rc.d/init.d/functions
24
+ <% end %>
11
25
 
12
26
  # Gem home directory
13
27
  # Set to match system "jgem environment path"
14
- gem_home="/usr/local/lib/jruby/gems"
28
+ gem_home="<%= local_root %>/lib/jruby/gems"
15
29
 
16
30
  # (Exact) Gem version of iyyov to run
17
- version="1.1.4"
31
+ version="<%= iyyov_version %>"
18
32
 
19
33
  # User to run the daemon as (should own rundir)
20
- user="runr"
34
+ user="<%= run_user %>"
21
35
 
22
36
  # Running directory (for jobs.rb config, log, and pid file)
23
- rundir="/var/local/runr/iyyov"
37
+ rundir="<%= run_dir %>/iyyov"
24
38
 
25
39
  # Add PATH to jruby if non-standard
26
- export PATH=$PATH:/usr/local/bin
40
+ export PATH=$PATH:<%= local_root %>/bin
27
41
 
28
42
  prog="iyyov"
29
43
  daemon="${gem_home}/gems/iyyov-${version}-java/init/${prog}"
@@ -37,11 +51,18 @@ start() {
37
51
  [ -f "$config" ] || exit 6
38
52
  [ -d "$rundir" ] || exit 7
39
53
 
54
+ <% if lsb %>
55
+ log_daemon_msg "Starting Iyyov Daemon" "iyyov"
56
+ start-stop-daemon --start -d $rundir -c $user --exec $daemon -- $config
57
+ RETVAL=$?
58
+ log_end_msg $RETVAL
59
+ <% else %>
40
60
  echo -n $"Starting $prog: "
41
61
  runuser -c "cd $rundir && $daemon $config" $user
42
62
  RETVAL=$?
43
63
  [ $RETVAL -eq 0 ] && success $"$prog startup" || failure $"$prog startup"
44
64
  echo
65
+ <% end %>
45
66
  }
46
67
 
47
68
  status() {
@@ -59,12 +80,19 @@ reload() {
59
80
  }
60
81
 
61
82
  stop() {
83
+ <% if lsb %>
84
+ log_daemon_msg "Stopping iyyov daemon" "iyyov"
85
+ start-stop-daemon --stop --quiet --oknodo --pidfile $pidfile
86
+ RETVAL=$?
87
+ log_end_msg $RETVAL
88
+ <% else %>
62
89
  echo -n $"Shutting down $prog: "
63
90
  killproc -p $pidfile $prog
64
91
  RETVAL=$?
65
92
  [ $RETVAL -eq 0 ] && success || failure
66
93
  echo
67
94
  return $RETVAL
95
+ <% end %>
68
96
  }
69
97
 
70
98
  case "$1" in
@@ -0,0 +1,2 @@
1
+ # Default
2
+ PGDATA=<%= pg_data_dir %>
@@ -0,0 +1,98 @@
1
+ # JDK used for compiling, a different one can be set at runtime,
2
+ # see profiles/default.hdp
3
+ JAVA_HOME=<%= jdk_dir %>
4
+ # Dependent on apache portable runtime (apr-devel-1.x apr-1.x)
5
+ APR_CONFIG=$(shell which apr-1-config)
6
+
7
+ # Install hashdot binaries to specified directory
8
+ INSTALL_BIN=<%= local_root %>/bin
9
+
10
+ # The set of symlinks (from all below) to install
11
+ INSTALL_SYMLINKS = jruby
12
+
13
+ # Where to install and find profiles (*.hdp)
14
+ # export PROFILE_DIR=./profiles to work in source directory
15
+ PROFILE_DIR?=<%= local_root %>/lib/hashdot/profiles
16
+
17
+ VERSION=1.4.0
18
+
19
+ CC=gcc
20
+ CFLAGS=$(shell ${APR_CONFIG} --cflags --cppflags --includes) -O2 -Wall -fno-strict-aliasing -g \
21
+ -I$(JAVA_HOME)/include \
22
+ -I$(JAVA_HOME)/include/linux \
23
+ -DHASHDOT_PROFILE_DIR=\"${PROFILE_DIR}\" \
24
+ -DHASHDOT_VERSION=\"${VERSION}\"
25
+
26
+ LDFLAGS=$(shell ${APR_CONFIG} --ldflags)
27
+
28
+ # Override platform default (i.e. Mac defaults x32)
29
+ # LDFLAGS += -m64
30
+
31
+ LDLIBS=$(shell ${APR_CONFIG} --libs --link-ld)
32
+
33
+ ALL_SYMLINKS = clj jruby jython groovy rhino scala
34
+
35
+ all: hashdot
36
+
37
+ OBJS = runtime.o daemon.o jvm.o libpath.o main.o pidfile.o property.o
38
+
39
+ hashdot: $(OBJS)
40
+ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
41
+
42
+ Makefile.deps : $(OBJS:%.o=%.c) *.h
43
+ $(CC) -MM $(CFLAGS) $(OBJS:%.o=%.c) > $@
44
+
45
+ # Install to INSTALL_BIN and PROFILE_DIR
46
+ install: hashdot
47
+ install -d $(PROFILE_DIR)
48
+ install -m 644 profiles/*.hdp $(PROFILE_DIR)
49
+ install -d $(INSTALL_BIN)
50
+ install -m 755 hashdot $(INSTALL_BIN)
51
+ cd $(INSTALL_BIN) && \
52
+ for sl in $(INSTALL_SYMLINKS); do \
53
+ test -e $$sl || ln -s hashdot $$sl; \
54
+ done
55
+
56
+ dist: hashdot
57
+ mkdir hashdot-$(VERSION)
58
+ cp -a INSTALL Makefile *.c *.h profiles test doc examples hashdot-$(VERSION)
59
+ tar --exclude '.svn' --exclude '*~' -zcvf hashdot-$(VERSION)-src.tar.gz hashdot-$(VERSION)
60
+ rm -rf hashdot-$(VERSION)
61
+
62
+ publish: dist
63
+ rsync -auP hashdot-$(VERSION)-src.tar.gz dekellum@frs.sourceforge.net:uploads/
64
+ rsync -aP --exclude ’*~’ doc/ dekellum,hashdot@web.sourceforge.net:/home/groups/h/ha/hashdot/htdocs/
65
+
66
+ $(ALL_SYMLINKS): hashdot
67
+ ln -sf hashdot $@
68
+
69
+ test/foo/Bar.class test/foobar.jar : test/foo/Bar.java
70
+ $(JAVA_HOME)/bin/javac $^
71
+ $(JAVA_HOME)/bin/jar -cf test/foobar.jar -C test foo
72
+
73
+ CPATH_TESTS = $(wildcard test/test_class_path_?.rb)
74
+
75
+ test: hashdot jruby test/foo/Bar.class test/foobar.jar
76
+ test/error/error_tests.sh
77
+ test/test_props.rb
78
+ test/test_env.rb
79
+ test/test_chdir.rb
80
+ @for tst in $(CPATH_TESTS); do echo $$tst; $$tst; done
81
+ test/test_daemon.rb
82
+ test/test_cmdline.rb param1 param2 || true
83
+ test/test_pid_file
84
+
85
+ # Requires all profiles working
86
+ EXAMPLES = $(wildcard examples/*)
87
+ test-examples : $(ALL_SYMLINKS)
88
+ @for example in $(EXAMPLES); do echo $$example; $$example; done
89
+
90
+ clean:
91
+ rm -rf hashdot-$(VERSION)-src.tar.gz hashdot hashdot.dSYM
92
+ rm -rf $(ALL_SYMLINKS)
93
+ rm -rf *.o
94
+ rm -rf test/foobar.jar
95
+
96
+ include Makefile.deps
97
+
98
+ .PHONY : test test-examples all install dist publish
@@ -0,0 +1,25 @@
1
+ # HashDot default launch profile
2
+ # This profile is always read before any other profiles or hashdot
3
+ # properties.
4
+
5
+ ## Setup the default JVM
6
+
7
+ # JVM install directory
8
+ hashdot.vm.home = <%= jdk_dir %>
9
+
10
+ # For Linux: amd64, i386, etc.
11
+ # Unused on Mac OS X
12
+ hashdot.vm.arch = amd64
13
+
14
+ # Mode: client, server
15
+ # client is unavailable on platforms like Linux amd64
16
+ # (See override in shortlived.hdp)
17
+ hashdot.vm.mode = server
18
+
19
+ # JVM library to Load
20
+ # Delay expansion (:=) to allow variable overrides
21
+ # Linux:
22
+ hashdot.vm.lib := ${hashdot.vm.home}/jre/lib/${hashdot.vm.arch}/${hashdot.vm.mode}/libjvm.so
23
+ # Mac: hashdot.vm.lib := ${hashdot.vm.home}/Libraries/lib${hashdot.vm.mode}.dylib
24
+
25
+ # user.timezone = America/Los_Angeles
@@ -0,0 +1,28 @@
1
+ # Common setting for multiple version of jruby.
2
+
3
+ # Identical defaults to jruby launcher
4
+ # These can still be overridden by the individual scripts
5
+ hashdot.vm.options += -Xmx768m -Xss1m
6
+
7
+ # Only jruby.jar is required for typical usage (scripts can require
8
+ # bsf.jar or JIP profiler if desired).
9
+ hashdot.vm.options += -Xbootclasspath/a:${jruby.lib}/jruby.jar
10
+
11
+ hashdot.main = org.jruby.Main
12
+
13
+ # Arguments following these flags are _not_ a script to scan for
14
+ # hashdot headers.
15
+ hashdot.parse_flags.value_args = -F -I -r
16
+
17
+ # Give up looking for a script header with any of these
18
+ hashdot.parse_flags.terminal = -C -e -S
19
+
20
+ #JFFI path
21
+ jffi.boot.library.path = ${jruby.home}/lib/native/x86_64-Linux
22
+
23
+ # Disable native extensions
24
+ # Note: Process.pid no longer works without native. Others?
25
+ # jruby.native.enabled = false
26
+
27
+ # JMX setup slows startup and wont be used
28
+ jruby.management.enabled = false
@@ -0,0 +1,9 @@
1
+ # HashDot profile for shortlived jruby scripts.
2
+ #. hashdot.profile = jruby-shortlived
3
+
4
+ # Extends shortlived (client VM) and (jruby) profiles with further
5
+ # startup time tweeks.
6
+ hashdot.profile += jruby shortlived
7
+
8
+ # JMX setup slows startup and wont be used
9
+ jruby.management.enabled=false
@@ -0,0 +1,13 @@
1
+ # HashDot launch profile for JRuby (http://jruby.codehaus.org/)
2
+ #. hashdot.profile = jruby
3
+
4
+ jruby.home = <%= jruby_dist_path %>
5
+ jruby.lib = ${jruby.home}/lib
6
+ jruby.script = jruby
7
+ jruby.shell = /bin/sh
8
+ jruby.bindir = <%= local_root %>/bin
9
+
10
+ hashdot.profile += jruby-common
11
+
12
+ # Rubygems Home (Install)
13
+ jruby.gem.home = <%= local_root %>/lib/jruby/gems
@@ -0,0 +1,6 @@
1
+ # HashDot profile for short lived processes.
2
+ #. hashdot.profile = shortlived
3
+
4
+ # Use client VM
5
+ # Comment out on Linux amd64, as no client vm is available
6
+ # hashdot.vm.mode = client
@@ -0,0 +1 @@
1
+ # Empty config installed by SyncWrap IyyovDaemon deployment
@@ -0,0 +1,15 @@
1
+ Iyyov.context do |c|
2
+
3
+ c.define_daemon do |d|
4
+ d.name = "<%= name %>"
5
+ <% if gem_name != name %>
6
+ d.gem_name = "<%= gem_name %>"
7
+ <% end %>
8
+ <% if instance %>
9
+ d.instance = "<%= instance %>"
10
+ <% end %>
11
+ d.version = "= <%= version %>"
12
+ d.log_rotate
13
+ end
14
+
15
+ end
@@ -0,0 +1,4 @@
1
+ Iyyov.context do |c|
2
+ c.base_dir = '<%= run_dir %>'
3
+ c.load_directory( File.join( File.dirname( __FILE__ ), 'jobs.d' ) )
4
+ end
@@ -0,0 +1,13 @@
1
+
2
+ # This contrived sync file demonstrates evil method polution if loaded
3
+ # without the "wrap". See test_space_main.rb
4
+
5
+ include SyncWrap
6
+
7
+ # A method with name same as what IyyovDaemon#daemon_service_dir needs
8
+ # (and should be picked up via RunUser)
9
+ def service_dir( *args )
10
+ raise "This is bad!"
11
+ end
12
+
13
+ host 'test', RunUser.new, IyyovDaemon.new( name: 'goo', version: '0.0.0' )
data/test/setup.rb ADDED
@@ -0,0 +1,39 @@
1
+ #--
2
+ # Copyright (c) 2011-2014 David Kellum
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
5
+ # may not use this file except in compliance with the License. You
6
+ # may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13
+ # implied. See the License for the specific language governing
14
+ # permissions and limitations under the License.
15
+ #++
16
+
17
+ require 'rubygems'
18
+ require 'bundler/setup'
19
+
20
+ require 'minitest/unit'
21
+ require 'minitest/autorun'
22
+
23
+ begin
24
+ require_relative 'options.rb'
25
+ rescue LoadError
26
+ module TestOptions
27
+ # Set true if local password-less sudo works
28
+ SAFE_SUDO = false
29
+
30
+ # Set to host name for safe (non-modifying) SSH tests
31
+ SAFE_SSH = false
32
+
33
+ # Set true if SAFE_SSH also supports pasword-less sudo
34
+ SAFE_SSH_SUDO = false
35
+
36
+ # See test/sync.rb test/test_vms.rb
37
+ LOCAL_VM_TEST = false
38
+ end
39
+ end
data/test/sync/d1/bar ADDED
@@ -0,0 +1 @@
1
+ bar
@@ -0,0 +1 @@
1
+ bar<%= var %>bar
@@ -0,0 +1 @@
1
+ bar
@@ -0,0 +1 @@
1
+ bar<%= var %>bar
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env jruby
2
+ #.hashdot.profile += jruby-shortlived
3
+
4
+ #--
5
+ # Copyright (c) 2011-2014 David Kellum
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
8
+ # may not use this file except in compliance with the License. You
9
+ # may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied. See the License for the specific language governing
17
+ # permissions and limitations under the License.
18
+ #++
19
+
20
+ require_relative 'setup'
21
+
22
+ require 'syncwrap'
23
+
24
+ module SyncWrap
25
+
26
+ # Each of the following are default auto test construction plans,
27
+ # for all components, used below. The last component is under test
28
+ # and run via #install if implemented. The prior components are
29
+ # known dependencies. A trailing Hash is used to populate required
30
+ # or test-worthy component options. RHEL and Ubuntu are used
31
+ # semi-randomly for <Distro> deps, or both are tested in the case of
32
+ # non-trivial differentiation.
33
+ AUTO_TESTS =
34
+ [ [ RHEL, CommercialJDK ],
35
+ [ Ubuntu, CRubyVM ],
36
+ [ RHEL, CRubyVM ],
37
+ [ EtcHosts ],
38
+ [ RHEL, JRubyVM, RunUser, Iyyov, Geminabox ],
39
+ [ Ubuntu, OpenJDK, JRubyVM, Hashdot ],
40
+ [ RHEL, JRubyVM, RunUser, Iyyov ],
41
+ [ Ubuntu, JRubyVM, RunUser, Iyyov, IyyovDaemon, name: 'test', version: '0' ],
42
+ [ RHEL, JRubyVM ],
43
+ [ RHEL, MDRaid, raw_devices: 1 ],
44
+ [ Ubuntu, MDRaid, raw_devices: 2 ],
45
+ [ Ubuntu, Network ],
46
+ [ RHEL, Network ],
47
+ [ Ubuntu, OpenJDK ],
48
+ [ Ubuntu, PostgreSQL ],
49
+ [ RHEL, PostgreSQL ],
50
+ [ RHEL, Qpid ],
51
+ [ RHEL, QpidRepo, qpid_prebuild_repo: 'http://localhost' ],
52
+ [ RHEL ],
53
+ [ RunUser ],
54
+ [ Ubuntu ],
55
+ [ Users, home_users: [ 'bob' ] ] ]
56
+
57
+ class TestContext < Context
58
+ attr_accessor :commands
59
+
60
+ def initialize( *args )
61
+ @commands = []
62
+ super
63
+ end
64
+
65
+ def capture_stream( *args )
66
+ @commands << args
67
+ [ 0, [] ]
68
+ end
69
+ end
70
+
71
+ class TestComponents < MiniTest::Unit::TestCase
72
+
73
+ def with_test_context( sp, host )
74
+ ctx = TestContext.new( host, sp.default_options )
75
+ ctx.with do
76
+ yield ctx
77
+ end
78
+ end
79
+
80
+ AUTO_TESTS.each_with_index do |comps, i|
81
+ comps = comps.dup
82
+ comp_class_opts = comps.last.is_a?( Hash ) ? comps.pop : {}
83
+ comp_class = comps.pop
84
+ cname = ( comp_class.name =~ /([a-zA-Z0-9]+)$/ ) && $1.downcase
85
+
86
+ define_method( "test_#{cname}_#{i}" ) do
87
+ sp = Space.new
88
+ host = sp.host( 'testhost' )
89
+ comps.each do |dep|
90
+ host.add( dep.new )
91
+ end
92
+ comp = comp_class.new( comp_class_opts )
93
+ host.add( comp )
94
+ pass
95
+ if comp.respond_to?( :install )
96
+ with_test_context( sp, host ) do |ctx|
97
+ comp.install
98
+ ctx.flush
99
+ assert_operator( ctx.commands.length, :>, 0 )
100
+ end
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ end
107
+
108
+ end
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env jruby
2
+ #.hashdot.profile += jruby-shortlived
3
+
4
+ #--
5
+ # Copyright (c) 2011-2014 David Kellum
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
8
+ # may not use this file except in compliance with the License. You
9
+ # may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied. See the License for the specific language governing
17
+ # permissions and limitations under the License.
18
+ #++
19
+
20
+ require_relative 'setup'
21
+
22
+ require 'syncwrap'
23
+
24
+ class TestContext < MiniTest::Unit::TestCase
25
+ include SyncWrap
26
+
27
+ def sp
28
+ @sp ||= Space.new
29
+ end
30
+
31
+ class TestContext < Context
32
+ attr_accessor :run_args
33
+
34
+ def run_shell( command, args )
35
+ @run_args = [ command, args ]
36
+ end
37
+ end
38
+
39
+ def test_context_queue
40
+ host = sp.host( 'localhost' )
41
+ ctx = TestContext.new( host )
42
+
43
+ ctx.with do
44
+ ctx.sh( "c1", user: :root )
45
+ assert_nil( ctx.run_args )
46
+ ctx.sh( "c2", user: :root )
47
+ assert_nil( ctx.run_args )
48
+ ctx.flush
49
+ assert_equal( %w[c1 c2], ctx.run_args[0] )
50
+ assert_equal( { user: :root }, ctx.run_args[1] )
51
+ end
52
+ end
53
+
54
+ def test_context_flush_at_end
55
+ host = sp.host( 'localhost' )
56
+ ctx = TestContext.new( host )
57
+
58
+ ctx.with do
59
+ ctx.sh( "c1", user: :root )
60
+ ctx.sh( "c2", user: :root )
61
+ assert_nil( ctx.run_args )
62
+ end
63
+ assert_equal( %w[c1 c2], ctx.run_args[0] )
64
+ end
65
+
66
+ def test_context_flush_on_opts_change
67
+ host = sp.host( 'localhost' )
68
+ ctx = TestContext.new( host )
69
+
70
+ ctx.with do
71
+ ctx.sh( "c1", user: :root )
72
+ assert_nil( ctx.run_args )
73
+ ctx.sh( "c2" )
74
+ assert_equal( %w[c1], ctx.run_args[0] )
75
+ end
76
+ assert_equal( %w[c2], ctx.run_args[0] )
77
+ end
78
+
79
+ def test_context_with_close
80
+ host = sp.host( 'localhost' )
81
+ ctx = TestContext.new( host )
82
+
83
+ ctx.with do
84
+ ctx.sh( "c1-", close: "-c3" ) do
85
+ ctx.sh( "c2" )
86
+ assert_nil( ctx.run_args )
87
+ end
88
+ assert_nil( ctx.run_args )
89
+ end
90
+ assert_equal( %w[c1- c2 -c3], ctx.run_args[0] )
91
+ end
92
+
93
+ def test_context_nesting_error
94
+ host = sp.host( 'localhost' )
95
+ ctx = TestContext.new( host )
96
+
97
+ assert_raises( NestingError ) do
98
+ ctx.with do
99
+ ctx.sh( "c1-", close: "-c3" ) do
100
+ ctx.sh( "c2", user: :root )
101
+ end
102
+ end
103
+ end
104
+ assert_nil( ctx.run_args )
105
+ end
106
+
107
+ end