solid 0.1.6.rc3 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source :gemcutter
2
+
3
+ gem "net-ssh"
4
+ gem "crack"
5
+ gem "json_pure"
@@ -0,0 +1,89 @@
1
+ # solid
2
+
3
+ Version: 0.1.6.beta2
4
+
5
+ master $ solid
6
+
7
+ **** Welcome to Solid ******
8
+ **** Version 0.1.6.beta2 ****
9
+ **** json config file required ****
10
+
11
+ master $
12
+
13
+
14
+ Solid is a CLI that uses ssh to remote into your servers and run chef-solo.
15
+
16
+ Solid uses Chef 9.8 and Chef-Solo to build servers remotely. Its goal is to be very easy to use. Chef-Solo is a command-line application that can execute the chef recipes once installed on the server. Chef-Solo has to be executed on the server node, but we want to execute it remotely. So "Solid" uses the Net::SSH library to connect securely and run chef-solo. It also checks to see if chef-solo is installed, and if it is not, it installs chef. Solid takes one parameter, a path to a configuration json file. This file contains all the attributes you would like to pass to chef-solo, plus some additional attributes that instruct Solid on how to connect to your server nodes, and the location of your cookbooks.
17
+
18
+ solid configuration.json
19
+
20
+ # configuration.json
21
+
22
+ {
23
+ "servers": ["server1","server2"],
24
+ "ssh-auth": "key",
25
+ "run_list": ["role[name]"],
26
+ "user": "[USER]",
27
+ "group": "[GROUP]"
28
+ }
29
+
30
+
31
+
32
+ ## Requirements
33
+
34
+ * Ruby
35
+ * RubyGems
36
+ * net/ssh
37
+
38
+ ## Install
39
+
40
+ gem install solid
41
+
42
+ ## Download Source
43
+
44
+ http://github.com/jackhq/solid
45
+
46
+
47
+ ## What is a dna.json file?
48
+
49
+ It is a file that contains instructions for chef on how to setup and configure your servers, and applications. To learn more go to http://opscode.com
50
+
51
+ {
52
+ "servers": ["server1","server2"],
53
+ "ssh-auth": "key",
54
+ "run_list": ["role[name]"],
55
+ "user": "[USER]",
56
+ "group": "[GROUP]"
57
+ }
58
+
59
+ ## How to use
60
+
61
+ * Create your dna.json file
62
+
63
+ * Make sure it has the following root attributes:
64
+
65
+ * servers - array of servers
66
+ * ssh-auth - (key|pwd) - type ssh authentication
67
+ * key - if ssh authentication is key based
68
+ * password - if ssh authentication is pwd based
69
+ * port
70
+
71
+ * Execute
72
+
73
+ solid dna.json
74
+
75
+
76
+
77
+ ## Note on Patches/Pull Requests
78
+
79
+ * Fork the project.
80
+ * Make your feature addition or bug fix.
81
+ * Add tests for it. This is important so I don't break it in a
82
+ future version unintentionally.
83
+ * Commit, do not mess with rakefile, version, or history.
84
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
85
+ * Send me a pull request. Bonus points for topic branches.
86
+
87
+ == Copyright
88
+
89
+ Copyright (c) 2010 Thing-3. See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6.rc3
1
+ 0.1.6
data/bin/solid CHANGED
@@ -6,10 +6,14 @@ require 'fileutils'
6
6
  require File.dirname(__FILE__) + '/../lib/solid'
7
7
 
8
8
  args = ARGV.dup
9
-
10
- #puts args.first
11
- if args.first == 'logs'
12
- Solid::Commands.logs
9
+ if args.length > 0
10
+ Solid::Commands.new(args[0]) { run_chef }
13
11
  else
14
- Solid::Commands.send(args.first, args[1])
15
- end
12
+ puts <<-MSG
13
+
14
+ **** Welcome to Solid ******
15
+ **** Version 0.1.6.beta2 ****
16
+ **** json config file required ****
17
+
18
+ MSG
19
+ end
@@ -1,8 +1,9 @@
1
1
  require 'net/ssh'
2
2
  require 'crack'
3
3
  require 'json/pure'
4
-
5
- require File.dirname(__FILE__) + '/solid/base'
6
- require File.dirname(__FILE__) + '/solid/chef_solo'
4
+ require File.dirname(__FILE__) + '/solid/constants'
5
+ require File.dirname(__FILE__) + '/solid/errors'
6
+ require File.dirname(__FILE__) + '/solid/json'
7
+ require File.dirname(__FILE__) + '/solid/ssh'
7
8
  require File.dirname(__FILE__) + '/solid/chef'
8
9
  require File.dirname(__FILE__) + '/solid/commands'
@@ -1,81 +1,88 @@
1
1
  module Solid
2
2
 
3
- class Chef < Solid::Base
4
- APT_GET = %w{ ruby ruby1.8-dev libopenssl-ruby1.8 rdoc ri irb build-essential git-core xfsprogs }
5
- RUBYGEMS_DIR = 'rubygems-1.3.7'
6
- RUBYGEMS_FILE = "#{RUBYGEMS_DIR}.tgz"
7
- RUBYGEMS_URL = "http://rubyforge.org/frs/download.php/70696/#{RUBYGEMS_FILE}"
3
+ class Chef
4
+ include Solid::Constants
5
+ include Solid::SSH
8
6
 
9
- def initialize(server, user, options = {})
7
+ def initialize(server, dna, logger=Logger.new(STDOUT), &block)
10
8
  @server = server
11
- @user = user
12
- @options = options
9
+ @dna = dna
10
+ @logger = logger
11
+ @level = "info"
12
+ @user = @dna["user"]
13
+ @cookbooks = @dna["cookbooks"]
14
+ self.instance_eval(&block) if block_given?
13
15
  end
14
16
 
15
17
  def install
16
18
  unless installed?
17
- Net::SSH.start(@server, @user, @options) do |ssh|
18
- puts "installing..."
19
- install_chef_prereqs ssh
20
- install_chef_gems ssh
21
- build_solo_rb ssh
22
- end
19
+ @logger.info "installing..."
20
+ install_chef_prereqs
21
+ install_chef_gems
22
+ build_solo_rb
23
23
  end
24
24
  end
25
25
 
26
26
  def installed?
27
27
  result = false
28
- Net::SSH.start(@server, @user, @options) do |ssh|
29
- puts "checking if installed"
28
+ @logger.info "checking if installed"
29
+ Net::SSH.start(@server, @user, self.options) do |ssh|
30
30
  result = ssh.exec!("which chef-solo")
31
31
  end
32
32
  result =~ /chef-solo/
33
33
  end
34
34
 
35
- def solo(dna, cookbooks, sudo=true)
36
- puts @options.inspect
37
- Net::SSH.start(@server, @user, @options) do |ssh|
38
- puts "deploying..."
39
- build_json dna, ssh
40
- run_solo cookbooks, ssh
41
- end
35
+ def run_solo
36
+ @logger.info "deploying..."
37
+ build_json
38
+ run_chef_solo
42
39
  end
43
40
 
44
- private
41
+ protected
42
+
43
+ def options
44
+ o = @dna['ssh-auth'] == 'key' ? { :keys => @dna["key"] } : { :password => @dna["password"] }
45
+ o.merge!(:port => @dna['port']) if @dna['port']
46
+ o
47
+ end
48
+
49
+ private
50
+
45
51
 
46
52
  def sudo_cmd
47
53
  'sudo '
48
54
  end
55
+
49
56
 
50
- def install_chef_prereqs ssh
57
+ def install_chef_prereqs
51
58
  [ sudo_cmd + "apt-get update -y",
52
59
  sudo_cmd + "apt-get install #{APT_GET.join(' ')} -y",
53
60
  "wget #{RUBYGEMS_URL} && tar zxf #{RUBYGEMS_FILE} && cd #{RUBYGEMS_DIR} && sudo ruby setup.rb && sudo ln -sfv /usr/bin/gem1.8 /usr/bin/gem",
54
61
  sudo_cmd + "gem update --system"].each do |line|
55
- ssh.exec! line
62
+ ssh_exec line
56
63
  end
57
64
  end
58
65
 
59
- def install_chef_gems ssh
66
+ def install_chef_gems
60
67
  CHEF_GEMS.each do |gem|
61
- puts ssh.exec! sudo_cmd + %Q{ gem install #{gem[:name]} -v #{gem[:version]} --no-ri --no-rdoc }
68
+ ssh_exec "#{sudo_cmd} gem install #{gem[:name]} -v #{gem[:version]}"
62
69
  end
63
70
  end
64
71
 
65
- def build_solo_rb ssh
72
+ def build_solo_rb
66
73
  ['file_cache_path "/tmp/chef-solo"',
67
74
  'cookbook_path ["/tmp/chef-solo/cookbooks", "/tmp/chef-solo/site-cookbooks"]'].each do |line|
68
- ssh.exec! "echo '#{line}' >> solo.rb"
75
+ ssh_exec "echo '#{line}' >> solo.rb"
69
76
  end
70
77
  end
71
78
 
72
- def build_json dna, ssh
73
- ssh.exec!("echo \"#{dna.to_json.gsub('"','\"')}\" > dna.json")
79
+ def build_json
80
+ ssh_exec "echo \"#{@dna.to_json.gsub('"','\"')}\" > dna.json"
74
81
  end
75
82
 
76
- def run_solo cookbooks, ssh
77
- puts ssh.exec!(sudo_cmd + " chef-solo -c ~/solo.rb -l debug -j dna.json -r #{cookbooks}")
83
+ def run_chef_solo
84
+ ssh_exec sudo_cmd + " chef-solo -c ~/solo.rb -l #{@level} -j dna.json -r #{@cookbooks}"
78
85
  end
79
-
86
+
80
87
  end
81
88
  end
@@ -1,57 +1,28 @@
1
1
  module Solid
2
-
3
- module Commands
4
-
5
- class << self
6
-
7
- def init(dna_file)
8
- chef_solo = ChefSolo.new
9
- chef_solo.install
10
- end
11
-
12
-
13
- def deploy(dna_file)
14
- dna = Crack::JSON.parse(get_dna(dna_file))
15
- dna["servers"].each do |s|
16
- run(s, dna)
17
- end
18
- end
19
-
20
- def rollback(dna_file)
21
- dna = Crack::JSON.parse(get_dna(dna_file))
22
- dna.merge!(:action => 'rollback')
23
- dna["servers"].each do |s|
24
- run(s, dna)
25
- end
26
-
27
- end
2
+ class Commands
3
+ include Solid::Errors
4
+ include Solid::Json
28
5
 
29
- def logs
30
- puts "Comming Soon!"
31
- end
32
-
33
-
34
-
35
-
36
- private
37
-
38
- def run(s, dna)
39
- options = dna['ssh-auth'] == 'key' ? { :keys => dna["key"] } : { :password => dna["password"] }
40
- options.merge!(:port => dna['port']) if dna['port']
41
- chef = Chef.new(s, dna["user"], options)
42
- chef.install
43
- chef.solo dna, dna["cookbooks"]
44
- end
6
+ def initialize with_dna_file, &block
7
+ @dna = parse_dna(with_dna_file)
8
+ validate_dna
9
+ self.instance_eval(&block) if block_given?
10
+ end
45
11
 
46
-
47
- def get_dna(dna_file)
48
- dna = ""
49
- File.open(dna_file, 'r') do |f|
50
- dna = f.read
51
- end
52
- dna
12
+ def run_chef
13
+ @dna["servers"].each do |server|
14
+ run server
53
15
  end
54
-
55
16
  end
17
+
18
+
19
+ private
20
+
21
+ def run server
22
+ Chef.new(server, @dna) do
23
+ install
24
+ run_solo
25
+ end
26
+ end
56
27
  end
57
28
  end
@@ -0,0 +1,30 @@
1
+ module Solid
2
+ module Constants
3
+ APT_GET = %w{ ruby ruby1.8-dev libopenssl-ruby1.8 rdoc ri irb build-essential git-core xfsprogs }
4
+ RUBYGEMS_DIR = 'rubygems-1.3.7'
5
+ RUBYGEMS_FILE = "#{RUBYGEMS_DIR}.tgz"
6
+ RUBYGEMS_URL = "http://rubyforge.org/frs/download.php/70696/#{RUBYGEMS_FILE}"
7
+
8
+ CHEF_GEMS = [
9
+ {:name => 'uuidtools', :version => '2.1.1'},
10
+ {:name => 'highline', :version => '1.6.1'},
11
+ {:name => 'moneta', :version => '0.6.0'},
12
+ {:name => 'extlib', :version => '0.9.15'},
13
+ {:name => 'abstract', :version => '1.0.0'},
14
+ {:name => 'erubis', :version => '2.6.6'},
15
+ {:name => 'json', :version => '1.4.2'},
16
+ {:name => 'bunny', :version => '0.6.0'},
17
+ {:name => 'mime-types', :version => '1.16'},
18
+ {:name => 'rest-client', :version => '1.5.1'},
19
+ {:name => 'systemu', :version => '1.2.0'},
20
+ {:name => 'mixlib-cli', :version => '1.2.0'},
21
+ {:name => 'mixlib-config', :version => '1.1.2'},
22
+ {:name => 'mixlib-log', :version => '1.1.0'},
23
+ {:name => 'mixlib-authentication', :version => '1.1.4'},
24
+ {:name => 'ohai', :version => '0.5.6'},
25
+ {:name => 'chef', :version => '0.9.8'}
26
+ ]
27
+
28
+
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ module Solid
2
+ module Errors
3
+ SERVER_REQUIRED = "Servers Node Required!"
4
+ SSH_AUTH_REQUIRED = "SSH AUTH Node Required! (key or pwd)"
5
+ SSH_KEY_REQUIRED = "SSH Key node required!"
6
+ SSH_PWD_REQUIRED = "SSH Password node required!"
7
+
8
+ private
9
+
10
+ def validate_dna
11
+ validate_dna_server
12
+ validate_ssh_auth
13
+ validate_ssh_key if @dna['ssh-auth'] == 'key'
14
+ validate_ssh_pwd if @dna['ssh-auth'] == 'pwd'
15
+ end
16
+
17
+ def validate_dna_server
18
+ raise SERVER_REQUIRED unless @dna['servers']
19
+ end
20
+
21
+ def validate_ssh_auth
22
+ raise SSH_AUTH_REQUIRED unless @dna['ssh-auth'] =~ /key|pwd/
23
+ end
24
+
25
+ def validate_ssh_key
26
+ raise SSH_KEY_REQUIRED unless @dna['key']
27
+ end
28
+
29
+ def validate_ssh_pwd
30
+ raise SSH_PWD_REQUIRED unless @dna['password']
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,13 @@
1
+ module Solid
2
+ module Json
3
+
4
+ private
5
+ def parse_dna(with_file)
6
+ Crack::JSON.parse(read_dna(with_file))
7
+ end
8
+
9
+ def read_dna file
10
+ File.open(file, 'r') { |f| f.read }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Solid
2
+ module SSH
3
+ def ssh_exec command
4
+ Net::SSH.start(@server, @user, options) do |ssh|
5
+ @logger.info ssh.exec! command
6
+ end
7
+ end
8
+ end
9
+ end
@@ -5,51 +5,62 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{solid}
8
- s.version = "0.1.6.rc3"
8
+ s.version = "0.1.6"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Thing-3"]
12
- s.date = %q{2010-08-10}
12
+ s.date = %q{2010-08-18}
13
13
  s.default_executable = %q{solid}
14
14
  s.description = %q{ssh deployment application}
15
15
  s.email = %q{thing3@jackhq.com}
16
16
  s.executables = ["solid"]
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
19
- "README.rdoc"
19
+ "README.md"
20
20
  ]
21
21
  s.files = [
22
22
  ".document",
23
23
  ".gitignore",
24
+ "Gemfile",
24
25
  "LICENSE",
25
- "README.rdoc",
26
+ "README.md",
26
27
  "Rakefile",
27
28
  "VERSION",
28
29
  "bin/solid",
29
30
  "lib/solid.rb",
30
- "lib/solid/base.rb",
31
31
  "lib/solid/chef.rb",
32
- "lib/solid/chef_solo.rb",
33
32
  "lib/solid/commands.rb",
33
+ "lib/solid/constants.rb",
34
+ "lib/solid/errors.rb",
35
+ "lib/solid/json.rb",
36
+ "lib/solid/ssh.rb",
34
37
  "solid.gemspec",
35
- "test/helper.rb",
36
- "test/test_solid.rb"
38
+ "spec/fixtures/dna.json",
39
+ "spec/fixtures/error.json",
40
+ "spec/fixtures/no_ssh.json",
41
+ "spec/fixtures/no_ssh_keys.json",
42
+ "spec/fixtures/no_ssh_pwd.json",
43
+ "spec/lib/solid/chef_spec.rb",
44
+ "spec/lib/solid/commands_spec.rb",
45
+ "spec/spec.opts",
46
+ "spec/spec_helper.rb"
37
47
  ]
38
48
  s.homepage = %q{http://github.com/jackhq/solid}
39
49
  s.rdoc_options = ["--charset=UTF-8"]
40
50
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.6}
51
+ s.rubygems_version = %q{1.3.7}
42
52
  s.summary = %q{ssh deployment application}
43
53
  s.test_files = [
44
- "test/helper.rb",
45
- "test/test_solid.rb"
54
+ "spec/lib/solid/chef_spec.rb",
55
+ "spec/lib/solid/commands_spec.rb",
56
+ "spec/spec_helper.rb"
46
57
  ]
47
58
 
48
59
  if s.respond_to? :specification_version then
49
60
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
61
  s.specification_version = 3
51
62
 
52
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
63
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
64
  s.add_runtime_dependency(%q<net-ssh>, [">= 0"])
54
65
  s.add_runtime_dependency(%q<crack>, [">= 0"])
55
66
  s.add_runtime_dependency(%q<json_pure>, [">= 0"])
@@ -0,0 +1,7 @@
1
+ {
2
+ 'servers': [ 'ec2-184-73-32-12.compute-1.amazonaws.com'],
3
+ 'ssh-auth': 'key',
4
+ 'user': 'ubuntu',
5
+ 'group': 'ubuntu',
6
+ 'key': "~/.ec2/ec2-dev"
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ 'user': 'ubuntu',
3
+ 'group': 'ubuntu'
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ 'servers': [ 'ec2-184-73-32-12.compute-1.amazonaws.com'],
3
+ 'user': 'ubuntu',
4
+ 'group': 'ubuntu',
5
+ 'key': "~/.ec2/ec2-dev"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ 'servers': [ 'ec2-184-73-32-12.compute-1.amazonaws.com'],
3
+ 'ssh-auth': 'key',
4
+ 'user': 'ubuntu',
5
+ 'group': 'ubuntu'
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ 'servers': [ 'ec2-184-73-32-12.compute-1.amazonaws.com'],
3
+ 'ssh-auth': 'pwd',
4
+ 'user': 'ubuntu',
5
+ 'group': 'ubuntu'
6
+ }
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "Solid::Chef" do
4
+ before(:each) do
5
+ @server = 'ec2-184-73-32-12.compute-1.amazonaws.com'
6
+ @with_dna = Crack::JSON.parse(<<-JSON
7
+ {
8
+ 'servers': [ 'ec2-184-73-32-12.compute-1.amazonaws.com'],
9
+ 'ssh-auth': 'key',
10
+ 'user': 'ubuntu',
11
+ 'group': 'ubuntu',
12
+ 'key': "~/.ec2/ec2-dev"
13
+ }
14
+ JSON
15
+ )
16
+ end
17
+
18
+ it "should check if chef is installed" do
19
+ ssh = mock("Net::SSH")
20
+ ssh.stub!(:exec!).and_return("chef-solo")
21
+ Net::SSH.stub!(:start).and_return(ssh)
22
+
23
+ Solid::Chef.new(@server, @with_dna) do
24
+ print installed?
25
+ end
26
+ end
27
+
28
+ it "should install chef on node" do
29
+ ssh = mock("Net::SSH")
30
+ ssh.stub!(:exec!).and_return("chef-solo")
31
+ Net::SSH.stub!(:start).and_return(ssh)
32
+
33
+ Solid::Chef.new(@server, @with_dna) do
34
+ print install
35
+ end
36
+
37
+ end
38
+
39
+ it "should chef solo on node" do
40
+ ssh = mock("Net::SSH")
41
+ ssh.stub!(:exec!).and_return("chef-solo")
42
+ Net::SSH.stub!(:start).and_return(ssh)
43
+
44
+ Solid::Chef.new(@server, @with_dna) do
45
+ print run_solo
46
+ end
47
+
48
+ end
49
+
50
+
51
+ end
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "Solid::Command" do
4
+ before(:each) do
5
+ Solid::Chef.stub!(:new).and_return(true)
6
+ end
7
+
8
+ it "should run chef" do
9
+ file = File.dirname(__FILE__) + '/../../fixtures/dna.json'
10
+ Solid::Commands.new(file) { run_chef }
11
+ end
12
+
13
+ context "should raise exception if missing" do
14
+
15
+ it "required server attribute" do
16
+ test_validate 'error', Solid::Errors::SERVER_REQUIRED
17
+ end
18
+
19
+ it "required ssh_auth attribute" do
20
+ test_validate 'no_ssh', Solid::Errors::SSH_AUTH_REQUIRED
21
+ end
22
+
23
+ it "required ssh_key attribute" do
24
+ test_validate 'no_ssh_keys', Solid::Errors::SSH_KEY_REQUIRED
25
+ end
26
+
27
+ it "required ssh_pwd attribute" do
28
+ test_validate 'no_ssh_pwd', Solid::Errors::SSH_PWD_REQUIRED
29
+ end
30
+
31
+ def test_validate(file_name, error)
32
+ file = File.dirname(__FILE__) + "/../../fixtures/#{file_name}.json"
33
+ lambda { Solid::Commands.new(file) { run_chef } }.should raise_error(error)
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,2 @@
1
+ require 'spec'
2
+ require File.dirname(__FILE__) + '/../lib/solid'
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solid
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: true
4
+ prerelease: false
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
8
  - 6
9
- - rc3
10
- version: 0.1.6.rc3
9
+ version: 0.1.6
11
10
  platform: ruby
12
11
  authors:
13
12
  - Thing-3
@@ -15,13 +14,14 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-08-10 00:00:00 -04:00
17
+ date: 2010-08-18 00:00:00 -04:00
19
18
  default_executable: solid
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: net-ssh
23
22
  prerelease: false
24
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
@@ -34,6 +34,7 @@ dependencies:
34
34
  name: crack
35
35
  prerelease: false
36
36
  requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
37
38
  requirements:
38
39
  - - ">="
39
40
  - !ruby/object:Gem::Version
@@ -46,6 +47,7 @@ dependencies:
46
47
  name: json_pure
47
48
  prerelease: false
48
49
  requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
49
51
  requirements:
50
52
  - - ">="
51
53
  - !ruby/object:Gem::Version
@@ -62,23 +64,33 @@ extensions: []
62
64
 
63
65
  extra_rdoc_files:
64
66
  - LICENSE
65
- - README.rdoc
67
+ - README.md
66
68
  files:
67
69
  - .document
68
70
  - .gitignore
71
+ - Gemfile
69
72
  - LICENSE
70
- - README.rdoc
73
+ - README.md
71
74
  - Rakefile
72
75
  - VERSION
73
76
  - bin/solid
74
77
  - lib/solid.rb
75
- - lib/solid/base.rb
76
78
  - lib/solid/chef.rb
77
- - lib/solid/chef_solo.rb
78
79
  - lib/solid/commands.rb
80
+ - lib/solid/constants.rb
81
+ - lib/solid/errors.rb
82
+ - lib/solid/json.rb
83
+ - lib/solid/ssh.rb
79
84
  - solid.gemspec
80
- - test/helper.rb
81
- - test/test_solid.rb
85
+ - spec/fixtures/dna.json
86
+ - spec/fixtures/error.json
87
+ - spec/fixtures/no_ssh.json
88
+ - spec/fixtures/no_ssh_keys.json
89
+ - spec/fixtures/no_ssh_pwd.json
90
+ - spec/lib/solid/chef_spec.rb
91
+ - spec/lib/solid/commands_spec.rb
92
+ - spec/spec.opts
93
+ - spec/spec_helper.rb
82
94
  has_rdoc: true
83
95
  homepage: http://github.com/jackhq/solid
84
96
  licenses: []
@@ -89,6 +101,7 @@ rdoc_options:
89
101
  require_paths:
90
102
  - lib
91
103
  required_ruby_version: !ruby/object:Gem::Requirement
104
+ none: false
92
105
  requirements:
93
106
  - - ">="
94
107
  - !ruby/object:Gem::Version
@@ -96,21 +109,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
109
  - 0
97
110
  version: "0"
98
111
  required_rubygems_version: !ruby/object:Gem::Requirement
112
+ none: false
99
113
  requirements:
100
- - - ">"
114
+ - - ">="
101
115
  - !ruby/object:Gem::Version
102
116
  segments:
103
- - 1
104
- - 3
105
- - 1
106
- version: 1.3.1
117
+ - 0
118
+ version: "0"
107
119
  requirements: []
108
120
 
109
121
  rubyforge_project:
110
- rubygems_version: 1.3.6
122
+ rubygems_version: 1.3.7
111
123
  signing_key:
112
124
  specification_version: 3
113
125
  summary: ssh deployment application
114
126
  test_files:
115
- - test/helper.rb
116
- - test/test_solid.rb
127
+ - spec/lib/solid/chef_spec.rb
128
+ - spec/lib/solid/commands_spec.rb
129
+ - spec/spec_helper.rb
@@ -1,67 +0,0 @@
1
- = solid
2
-
3
- An awesome way to deploy with chef!
4
-
5
- == Requirements
6
-
7
- * Ruby
8
- * RubyGems
9
- * net/ssh
10
-
11
- == Install
12
-
13
- gem install solid
14
-
15
- == Download Source
16
-
17
- http://github.com/jackhq/solid
18
-
19
-
20
- == What is it?
21
-
22
- Solid is a command line interface that takes a dna.json file as an argument. It uses this file to establish a ssh connection for each of the application servers specified in the document either by user/key or user/password connections. Then it simply looks for chef-solo, if not available, it installs chef, if available it runs chef-solo, with the dna.json file.
23
-
24
- == What is a dna.json file?
25
-
26
- It is a file that contains instructions for chef on how to setup and configure your servers, and applications. To learn more go to http://opscode.com
27
-
28
- == How to use
29
-
30
- * Create your dna.json file
31
-
32
- * Make sure it has the following root attributes:
33
-
34
- * servers - array of servers
35
- * ssh-auth - (key|pwd) - type ssh authentication
36
- * key - if ssh authentication is key based
37
- * password - if ssh authentication is pwd based
38
- * port
39
-
40
- * Execute
41
-
42
- solid deploy dna.json
43
-
44
- * Rollback
45
-
46
- solid rollback dna.json
47
-
48
- * Logs
49
-
50
- solid logs
51
-
52
-
53
-
54
-
55
- == Note on Patches/Pull Requests
56
-
57
- * Fork the project.
58
- * Make your feature addition or bug fix.
59
- * Add tests for it. This is important so I don't break it in a
60
- future version unintentionally.
61
- * Commit, do not mess with rakefile, version, or history.
62
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
63
- * Send me a pull request. Bonus points for topic branches.
64
-
65
- == Copyright
66
-
67
- Copyright (c) 2010 Thing-3. See LICENSE for details.
@@ -1,25 +0,0 @@
1
- module Solid
2
-
3
- class Base
4
- CHEF_GEMS = [
5
- {:name => 'uuidtools', :version => '2.1.1'},
6
- {:name => 'highline', :version => '1.6.1'},
7
- {:name => 'moneta', :version => '0.6.0'},
8
- {:name => 'extlib', :version => '0.9.15'},
9
- {:name => 'erubis', :version => '2.6.6'},
10
- {:name => 'json', :version => '1.4.2'},
11
- {:name => 'bunny', :version => '0.6.0'},
12
- {:name => 'rest-client', :version => '1.5.1'},
13
- {:name => 'systemu', :version => '1.2.0'},
14
- {:name => 'mixlib-authentication', :version => '1.1.4'},
15
- {:name => 'mixlib-log', :version => '1.1.0'},
16
- {:name => 'mixlib-cli', :version => '1.2.0'},
17
- {:name => 'mixlib-config', :version => '1.1.2'},
18
- {:name => 'ohai', :version => '0.5.6'},
19
- {:name => 'chef', :version => '0.9.8'}
20
- ]
21
-
22
-
23
-
24
- end
25
- end
@@ -1,13 +0,0 @@
1
- module Solid
2
-
3
- class ChefSolo < Solid::Base
4
-
5
- def install
6
- CHEF_GEMS.each do |gem|
7
- system "sudo gem install #{gem[:name]} -v #{gem[:version]}"
8
- end
9
- end
10
-
11
- end
12
- end
13
-
@@ -1,10 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'shoulda'
4
-
5
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
- $LOAD_PATH.unshift(File.dirname(__FILE__))
7
- require 'solid'
8
-
9
- class Test::Unit::TestCase
10
- end
@@ -1,7 +0,0 @@
1
- require 'helper'
2
-
3
- class TestSolid < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
6
- end
7
- end