capistrano-platform-resources 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,4 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Capistrano::Configuration::Resources::PlatformResources::VERSION
17
17
 
18
18
  gem.add_dependency("capistrano")
19
+ gem.add_development_dependency("net-scp", "~> 1.0.4")
20
+ gem.add_development_dependency("net-ssh", "~> 2.2.2")
21
+ gem.add_development_dependency("vagrant", "~> 1.0.6")
19
22
  end
@@ -8,25 +8,43 @@ module Capistrano
8
8
  def self.extended(configuration)
9
9
  configuration.load {
10
10
  namespace(:platform) {
11
- _cset(:platform_identifier) { platform.identifier(fetch(:platform_identifier_options, {})) }
12
- def identifier(options={})
11
+ _cset(:platform_family) { platform.family(fetch(:platform_family_options, {})) }
12
+ def family(options={})
13
13
  capture((<<-EOS).gsub(/\s+/, " "), options).strip.to_sym
14
14
  if test -f /etc/debian_version; then
15
+ echo debian;
16
+ elif test -f /etc/redhat-release; then
17
+ echo redhat;
18
+ else
19
+ echo unknown;
20
+ fi;
21
+ EOS
22
+ end
23
+
24
+ _cset(:platform_identifier) { platform.identifier(fetch(:platform_identifier_options, {})) }
25
+ def identifier(options={})
26
+ options = options.dup
27
+ family = ( options.delete(:family) || fetch(:platform_family) )
28
+ case family
29
+ when :debian
30
+ capture((<<-EOS).gsub(/\s+/, " "), options).strip.to_sym
15
31
  if test -f /etc/lsb-release && grep -i -q DISTRIB_ID=Ubuntu /etc/lsb-release; then
16
32
  echo ubuntu;
17
33
  else
18
34
  echo debian;
19
35
  fi;
20
- elif test -f /etc/redhat-release; then
36
+ EOS
37
+ when :redhat
38
+ capture((<<-EOS).gsub(/\s+/, " "), options).strip.to_sym
21
39
  if test -f /etc/centos-release; then
22
40
  echo centos;
23
41
  else
24
42
  echo redhat;
25
43
  fi;
26
- else
27
- echo unknown;
28
- fi;
29
- EOS
44
+ EOS
45
+ else
46
+ :unknown
47
+ end
30
48
  end
31
49
 
32
50
  _cset(:platform_architecture) { platform.architecture(fetch(:platform_architecture_options, {})) }
@@ -42,32 +60,79 @@ module Capistrano
42
60
 
43
61
  namespace(:packages) {
44
62
  def installed?(packages=[], options={})
63
+ options = options.dup
45
64
  packages = [ packages ].flatten
46
- identifier = ( options.delete(:identifier) || fetch(:platform_identifier) )
65
+ family = ( options.delete(:family) || fetch(:platform_family) )
47
66
  if packages.empty?
48
67
  true
49
68
  else
50
- not /not-installed/ =~ case identifier
51
- when :debian, :ubuntu
69
+ not /not-installed/ =~ case family
70
+ when :debian
52
71
  capture("dpkg-query -s #{packages.map { |x| x.dump }.join(" ")} 1>/dev/null 2>&1 || echo not-installed")
53
- when :centos, :redhat
72
+ when :redhat
54
73
  capture("rpm -qi #{packages.map { |x| x.dump }.join(" ")} 1>/dev/null 2>&1 || echo not-installed")
55
74
  end
56
75
  end
57
76
  end
58
77
 
59
78
  def install(packages=[], options={})
79
+ try_update(options)
80
+ options = options.dup
60
81
  packages = [ packages ].flatten
61
- identifier = ( options.delete(:identifier) || fetch(:platform_identifier) )
82
+ family = ( options.delete(:family) || fetch(:platform_family) )
62
83
  unless packages.empty?
63
- case identifier
64
- when :debian, :ubuntu
84
+ case family
85
+ when :debian
65
86
  sudo("apt-get install -q -y #{packages.map { |x| x.dump }.join(" ")}", options)
66
- when :centos, :redhat
87
+ when :redhat
67
88
  sudo("yum install -q -y #{packages.map { |x| x.dump }.join(" ")}", options)
68
89
  end
69
90
  end
70
91
  end
92
+
93
+ def uninstall(packages=[], options={})
94
+ options = options.dup
95
+ packages = [ packages ].flatten
96
+ family = ( options.delete(:family) || fetch(:platform_family) )
97
+ unless packages.empty?
98
+ case family
99
+ when :debian
100
+ sudo("apt-get purge -q -y #{packages.map { |x| x.dump }.join(" ")}", options)
101
+ when :redhat
102
+ sudo("yum remove -q -y #{packages.map { |x| x.dump }.join(" ")}", options)
103
+ end
104
+ end
105
+ end
106
+
107
+ def try_update(options={})
108
+ unless fetch(:platform_packages_updated, false)
109
+ update(options)
110
+ set(:platform_packages_updated, true)
111
+ end
112
+ end
113
+
114
+ def update(options={})
115
+ options = options.dup
116
+ family = ( options.delete(:family) || fetch(:platform_family) )
117
+ case family
118
+ when :debian
119
+ sudo("apt-get update -q -y", options)
120
+ when :redhat
121
+ sudo("yum check-update -q -y", options)
122
+ end
123
+ end
124
+
125
+ def upgrade(options={})
126
+ try_update(options)
127
+ options = options.dup
128
+ family = ( options.delete(:family) || fetch(:platform_family) )
129
+ case family
130
+ when :debian
131
+ sudo("apt-get upgrade -q -y", options)
132
+ when :redhat
133
+ sudo("yum upgrade -q -y", options)
134
+ end
135
+ end
71
136
  }
72
137
  }
73
138
  }
@@ -2,7 +2,7 @@ module Capistrano
2
2
  class Configuration
3
3
  module Resources
4
4
  module PlatformResources
5
- VERSION = "0.0.1"
5
+ VERSION = "0.1.0"
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,5 @@
1
+ /.bundle
2
+ /.vagrant
3
+ /known_hosts
4
+ /tmp
5
+ /vendor
@@ -0,0 +1,2 @@
1
+ load "deploy"
2
+ load "../config/deploy"
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec(:path => "../..")
@@ -0,0 +1,99 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant::Config.run do |config|
5
+ # All Vagrant configuration is done here. The most common configuration
6
+ # options are documented and commented below. For a complete reference,
7
+ # please see the online documentation at vagrantup.com.
8
+
9
+ # Every Vagrant virtual environment requires a box to build off of.
10
+ config.vm.box = "centos6-64"
11
+
12
+ # The url from where the 'config.vm.box' box will be fetched if it
13
+ # doesn't already exist on the user's system.
14
+ config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box"
15
+
16
+ # Boot with a GUI so you can see the screen. (Default is headless)
17
+ # config.vm.boot_mode = :gui
18
+
19
+ # Assign this VM to a host-only network IP, allowing you to access it
20
+ # via the IP. Host-only networks can talk to the host machine as well as
21
+ # any other machines on the same network, but cannot be accessed (through this
22
+ # network interface) by any external networks.
23
+ config.vm.network :hostonly, "192.168.33.10"
24
+
25
+ # Assign this VM to a bridged network, allowing you to connect directly to a
26
+ # network using the host's network device. This makes the VM appear as another
27
+ # physical device on your network.
28
+ # config.vm.network :bridged
29
+
30
+ # Forward a port from the guest to the host, which allows for outside
31
+ # computers to access the VM, whereas host only networking does not.
32
+ # config.vm.forward_port 80, 8080
33
+
34
+ # Share an additional folder to the guest VM. The first argument is
35
+ # an identifier, the second is the path on the guest to mount the
36
+ # folder, and the third is the path on the host to the actual folder.
37
+ # config.vm.share_folder "v-data", "/vagrant_data", "../data"
38
+
39
+ # Enable provisioning with Puppet stand alone. Puppet manifests
40
+ # are contained in a directory path relative to this Vagrantfile.
41
+ # You will need to create the manifests directory and a manifest in
42
+ # the file precise-amd64.pp in the manifests_path directory.
43
+ #
44
+ # An example Puppet manifest to provision the message of the day:
45
+ #
46
+ # # group { "puppet":
47
+ # # ensure => "present",
48
+ # # }
49
+ # #
50
+ # # File { owner => 0, group => 0, mode => 0644 }
51
+ # #
52
+ # # file { '/etc/motd':
53
+ # # content => "Welcome to your Vagrant-built virtual machine!
54
+ # # Managed by Puppet.\n"
55
+ # # }
56
+ #
57
+ # config.vm.provision :puppet do |puppet|
58
+ # puppet.manifests_path = "manifests"
59
+ # puppet.manifest_file = "precise-amd64.pp"
60
+ # end
61
+
62
+ # Enable provisioning with chef solo, specifying a cookbooks path, roles
63
+ # path, and data_bags path (all relative to this Vagrantfile), and adding
64
+ # some recipes and/or roles.
65
+ #
66
+ # config.vm.provision :chef_solo do |chef|
67
+ # chef.cookbooks_path = "../my-recipes/cookbooks"
68
+ # chef.roles_path = "../my-recipes/roles"
69
+ # chef.data_bags_path = "../my-recipes/data_bags"
70
+ # chef.add_recipe "mysql"
71
+ # chef.add_role "web"
72
+ #
73
+ # # You may also specify custom JSON attributes:
74
+ # chef.json = { :mysql_password => "foo" }
75
+ # end
76
+
77
+ # Enable provisioning with chef server, specifying the chef server URL,
78
+ # and the path to the validation key (relative to this Vagrantfile).
79
+ #
80
+ # The Opscode Platform uses HTTPS. Substitute your organization for
81
+ # ORGNAME in the URL and validation key.
82
+ #
83
+ # If you have your own Chef Server, use the appropriate URL, which may be
84
+ # HTTP instead of HTTPS depending on your configuration. Also change the
85
+ # validation key to validation.pem.
86
+ #
87
+ # config.vm.provision :chef_client do |chef|
88
+ # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
89
+ # chef.validation_key_path = "ORGNAME-validator.pem"
90
+ # end
91
+ #
92
+ # If you're using the Opscode platform, your validator client is
93
+ # ORGNAME-validator, replacing ORGNAME with your organization name.
94
+ #
95
+ # IF you have your own Chef Server, the default validation client name is
96
+ # chef-validator, unless you changed the configuration.
97
+ #
98
+ # chef.validation_client_name = "ORGNAME-validator"
99
+ end
@@ -0,0 +1,7 @@
1
+ #!/bin/sh -e
2
+
3
+ bundle exec vagrant up
4
+ bundle exec cap test_all
5
+ bundle exec vagrant halt
6
+
7
+ # vim:set ft=sh :
@@ -0,0 +1,58 @@
1
+ set :application, "capistrano-platform-resources"
2
+ set :repository, "."
3
+ set :deploy_to do
4
+ File.join("/home", user, application)
5
+ end
6
+ set :deploy_via, :copy
7
+ set :scm, :none
8
+ set :use_sudo, false
9
+ set :user, "vagrant"
10
+ set :password, "vagrant"
11
+ set :ssh_options, {:user_known_hosts_file => "/dev/null"}
12
+
13
+ role :web, "192.168.33.10"
14
+ role :app, "192.168.33.10"
15
+ role :db, "192.168.33.10", :primary => true
16
+
17
+ $LOAD_PATH.push(File.expand_path("../../lib", File.dirname(__FILE__)))
18
+ require "capistrano/configuration/resources/platform_resources"
19
+
20
+ task(:test_all) {
21
+ find_and_execute_task("test_default")
22
+ }
23
+
24
+ namespace(:test_default) {
25
+ task(:default) {
26
+ methods.grep(/^test_/).each do |m|
27
+ send(m)
28
+ end
29
+ }
30
+ before "test_default", "test_default:setup"
31
+ after "test_default", "test_default:teardown"
32
+
33
+ task(:setup) {
34
+ platform.packages.try_update
35
+ case platform_family
36
+ when :debian
37
+ set(:missing_packages, %w(mercurial))
38
+ when :redhat
39
+ set(:missing_packages, %w(mercurial))
40
+ else
41
+ set(:missing_packages, [])
42
+ end
43
+ }
44
+
45
+ task(:teardown) {
46
+ platform.packages.uninstall(missing_packages)
47
+ }
48
+
49
+ task(:test_installed) {
50
+ platform.packages.uninstall(missing_packages)
51
+ abort("packages must not be installed.") if platform.packages.installed?(missing_packages)
52
+ platform.packages.install(missing_packages)
53
+ abort("packages must be installed.") unless platform.packages.installed?(missing_packages)
54
+ platform.packages.uninstall(missing_packages)
55
+ }
56
+ }
57
+
58
+ # vim:set ft=ruby sw=2 ts=2 :
@@ -0,0 +1,5 @@
1
+ /.bundle
2
+ /.vagrant
3
+ /known_hosts
4
+ /tmp
5
+ /vendor
@@ -0,0 +1,2 @@
1
+ load "deploy"
2
+ load "../config/deploy"
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec(:path => "../..")
@@ -0,0 +1,99 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant::Config.run do |config|
5
+ # All Vagrant configuration is done here. The most common configuration
6
+ # options are documented and commented below. For a complete reference,
7
+ # please see the online documentation at vagrantup.com.
8
+
9
+ # Every Vagrant virtual environment requires a box to build off of.
10
+ config.vm.box = "precise64"
11
+
12
+ # The url from where the 'config.vm.box' box will be fetched if it
13
+ # doesn't already exist on the user's system.
14
+ config.vm.box_url = "http://files.vagrantup.com/precise64.box"
15
+
16
+ # Boot with a GUI so you can see the screen. (Default is headless)
17
+ # config.vm.boot_mode = :gui
18
+
19
+ # Assign this VM to a host-only network IP, allowing you to access it
20
+ # via the IP. Host-only networks can talk to the host machine as well as
21
+ # any other machines on the same network, but cannot be accessed (through this
22
+ # network interface) by any external networks.
23
+ config.vm.network :hostonly, "192.168.33.10"
24
+
25
+ # Assign this VM to a bridged network, allowing you to connect directly to a
26
+ # network using the host's network device. This makes the VM appear as another
27
+ # physical device on your network.
28
+ # config.vm.network :bridged
29
+
30
+ # Forward a port from the guest to the host, which allows for outside
31
+ # computers to access the VM, whereas host only networking does not.
32
+ # config.vm.forward_port 80, 8080
33
+
34
+ # Share an additional folder to the guest VM. The first argument is
35
+ # an identifier, the second is the path on the guest to mount the
36
+ # folder, and the third is the path on the host to the actual folder.
37
+ # config.vm.share_folder "v-data", "/vagrant_data", "../data"
38
+
39
+ # Enable provisioning with Puppet stand alone. Puppet manifests
40
+ # are contained in a directory path relative to this Vagrantfile.
41
+ # You will need to create the manifests directory and a manifest in
42
+ # the file precise-amd64.pp in the manifests_path directory.
43
+ #
44
+ # An example Puppet manifest to provision the message of the day:
45
+ #
46
+ # # group { "puppet":
47
+ # # ensure => "present",
48
+ # # }
49
+ # #
50
+ # # File { owner => 0, group => 0, mode => 0644 }
51
+ # #
52
+ # # file { '/etc/motd':
53
+ # # content => "Welcome to your Vagrant-built virtual machine!
54
+ # # Managed by Puppet.\n"
55
+ # # }
56
+ #
57
+ # config.vm.provision :puppet do |puppet|
58
+ # puppet.manifests_path = "manifests"
59
+ # puppet.manifest_file = "precise-amd64.pp"
60
+ # end
61
+
62
+ # Enable provisioning with chef solo, specifying a cookbooks path, roles
63
+ # path, and data_bags path (all relative to this Vagrantfile), and adding
64
+ # some recipes and/or roles.
65
+ #
66
+ # config.vm.provision :chef_solo do |chef|
67
+ # chef.cookbooks_path = "../my-recipes/cookbooks"
68
+ # chef.roles_path = "../my-recipes/roles"
69
+ # chef.data_bags_path = "../my-recipes/data_bags"
70
+ # chef.add_recipe "mysql"
71
+ # chef.add_role "web"
72
+ #
73
+ # # You may also specify custom JSON attributes:
74
+ # chef.json = { :mysql_password => "foo" }
75
+ # end
76
+
77
+ # Enable provisioning with chef server, specifying the chef server URL,
78
+ # and the path to the validation key (relative to this Vagrantfile).
79
+ #
80
+ # The Opscode Platform uses HTTPS. Substitute your organization for
81
+ # ORGNAME in the URL and validation key.
82
+ #
83
+ # If you have your own Chef Server, use the appropriate URL, which may be
84
+ # HTTP instead of HTTPS depending on your configuration. Also change the
85
+ # validation key to validation.pem.
86
+ #
87
+ # config.vm.provision :chef_client do |chef|
88
+ # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
89
+ # chef.validation_key_path = "ORGNAME-validator.pem"
90
+ # end
91
+ #
92
+ # If you're using the Opscode platform, your validator client is
93
+ # ORGNAME-validator, replacing ORGNAME with your organization name.
94
+ #
95
+ # IF you have your own Chef Server, the default validation client name is
96
+ # chef-validator, unless you changed the configuration.
97
+ #
98
+ # chef.validation_client_name = "ORGNAME-validator"
99
+ end
@@ -0,0 +1,7 @@
1
+ #!/bin/sh -e
2
+
3
+ bundle exec vagrant up
4
+ bundle exec cap test_all
5
+ bundle exec vagrant halt
6
+
7
+ # vim:set ft=sh :
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-platform-resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-25 00:00:00.000000000 Z
12
+ date: 2013-03-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: capistrano
@@ -27,6 +27,54 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: net-scp
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.0.4
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.0.4
46
+ - !ruby/object:Gem::Dependency
47
+ name: net-ssh
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.2.2
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.2.2
62
+ - !ruby/object:Gem::Dependency
63
+ name: vagrant
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.0.6
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.0.6
30
78
  description: A sort of utilities which helps you to manage platform resources.
31
79
  email:
32
80
  - yamashita@geishatokyo.com
@@ -42,6 +90,17 @@ files:
42
90
  - capistrano-platform-resources.gemspec
43
91
  - lib/capistrano/configuration/resources/platform_resources.rb
44
92
  - lib/capistrano/configuration/resources/platform_resources/version.rb
93
+ - test/centos6-64/.gitignore
94
+ - test/centos6-64/Capfile
95
+ - test/centos6-64/Gemfile
96
+ - test/centos6-64/Vagrantfile
97
+ - test/centos6-64/run.sh
98
+ - test/config/deploy.rb
99
+ - test/precise64/.gitignore
100
+ - test/precise64/Capfile
101
+ - test/precise64/Gemfile
102
+ - test/precise64/Vagrantfile
103
+ - test/precise64/run.sh
45
104
  homepage: https://github.com/yyuu/capistrano-platform-resources
46
105
  licenses: []
47
106
  post_install_message:
@@ -66,4 +125,15 @@ rubygems_version: 1.8.23
66
125
  signing_key:
67
126
  specification_version: 3
68
127
  summary: A sort of utilities which helps you to manage platform resources.
69
- test_files: []
128
+ test_files:
129
+ - test/centos6-64/.gitignore
130
+ - test/centos6-64/Capfile
131
+ - test/centos6-64/Gemfile
132
+ - test/centos6-64/Vagrantfile
133
+ - test/centos6-64/run.sh
134
+ - test/config/deploy.rb
135
+ - test/precise64/.gitignore
136
+ - test/precise64/Capfile
137
+ - test/precise64/Gemfile
138
+ - test/precise64/Vagrantfile
139
+ - test/precise64/run.sh