conjure 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/History.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### Version 0.1.3
2
+ 2013-11-12
3
+
4
+ * Deploy apps that use MySQL
5
+
1
6
  ### Version 0.1.2
2
7
  2013-11-06
3
8
 
data/README.md CHANGED
@@ -20,8 +20,8 @@ Also, your Rails application requires all of the following:
20
20
  * It must have a `.ruby-version` file indicating which version of
21
21
  Ruby to run
22
22
 
23
- * It must be able to run in production mode with a single
24
- Postgres database (any existing database.yml will be ignored)
23
+ * It must be able to run in production mode with a single Postgres
24
+ or MySQL database (any existing database.yml will be ignored)
25
25
 
26
26
  * It must be checked out locally into a git repository with a valid
27
27
  `origin` remote
@@ -85,15 +85,18 @@ deploy`.
85
85
 
86
86
  #### Export
87
87
 
88
- Produce a Postgres SQL dump of the currently-deployed server's
89
- production database, and save it to the local file `FILE`.
88
+ Produce a native-format (Postgres or MySQL) dump of the
89
+ currently-deployed server's production database, and save it to the
90
+ local file `FILE`.
90
91
 
91
92
  conjure export FILE
92
93
 
93
94
  #### Import
94
95
 
95
96
  Overwrite the production database on the currently-deployed server
96
- with a Postgres SQL dump from the local file `FILE`.
97
+ with a dump from the local file `FILE`. The dump should be in the same
98
+ format as that produced by the `export` command (either a Postgres or
99
+ MySQL dump according to the database type).
97
100
 
98
101
  conjure import FILE
99
102
 
data/lib/conjure.rb CHANGED
@@ -1,9 +1,5 @@
1
1
  module Conjure
2
-
3
- VERSION = "0.1.2" unless defined?(VERSION)
4
- autoload :Command, "conjure/command"
5
- autoload :Config, "conjure/config"
6
- autoload :Service, "conjure/service"
2
+ Dir[File.join(File.dirname(__FILE__), "conjure/**/*.rb")].each { |f| require f }
7
3
 
8
4
  def self.config
9
5
  @config ||= Config.load Dir.pwd
@@ -0,0 +1,25 @@
1
+ module Conjure
2
+ module Service
3
+ class Database
4
+ def self.new(options)
5
+ services_by_gem.each do |gem_name, service_class|
6
+ if options[:codebase].gem_names.include? gem_name
7
+ return service_class.new(
8
+ :docker_host => options[:docker_host],
9
+ :database_name => options[:codebase].database_name,
10
+ :adapter_name => adapters_by_gem[gem_name],
11
+ )
12
+ end
13
+ end
14
+ end
15
+
16
+ def self.services_by_gem
17
+ {"pg" => Postgres, "mysql2" => Mysql, "mysql" => Mysql}
18
+ end
19
+
20
+ def self.adapters_by_gem
21
+ {"pg" => "postgresql", "mysql2" => "mysql2", "mysql" => "mysql"}
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,71 @@
1
+ module Conjure
2
+ module Service
3
+ class Database
4
+ class Mysql
5
+ def initialize(options)
6
+ @host = options[:docker_host]
7
+ @db_name = options[:database_name]
8
+ @adapter_name = options[:adapter_name]
9
+ end
10
+
11
+ def base_image
12
+ @base_image ||= @host.images.create(
13
+ label: "mysql",
14
+ base_image: "ubuntu",
15
+ setup_commands: [
16
+ "apt-get install -y mysql-server mysql-client"
17
+ ],
18
+ )
19
+ end
20
+
21
+ def server_image
22
+ @server_image ||= @host.images.create(
23
+ label: "mysqlserver",
24
+ base_image: base_image,
25
+ setup_commands: [
26
+ "/usr/sbin/mysqld & sleep 5; echo \"GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '' WITH GRANT OPTION\" | /usr/bin/mysql",
27
+ ],
28
+ daemon_command: "/usr/sbin/mysqld --bind-address=0.0.0.0",
29
+ volumes: ["/var/lib/mysql"],
30
+ )
31
+ end
32
+
33
+ def run
34
+ container
35
+ end
36
+
37
+ def container
38
+ @container ||= server_image.run
39
+ end
40
+
41
+ def name
42
+ @db_name
43
+ end
44
+
45
+ def ip_address
46
+ container.ip_address
47
+ end
48
+
49
+ def export(file)
50
+ File.open file, "w" do |f|
51
+ f.write base_image.command("/usr/bin/mysqldump #{client_options}")
52
+ end
53
+ Conjure.log "[export] #{File.size file} bytes exported to #{file}"
54
+ end
55
+
56
+ def import(file)
57
+ base_image.command "echo 'source /files/#{File.basename file}' | /usr/bin/mysql #{client_options}", files: [file]
58
+ Conjure.log "[import] #{File.size file} bytes imported from #{file}"
59
+ end
60
+
61
+ def client_options
62
+ "-u root -h #{ip_address} #{@db_name}"
63
+ end
64
+
65
+ def adapter_name
66
+ @adapter_name || "mysql2"
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,79 @@
1
+ module Conjure
2
+ module Service
3
+ class Database
4
+ class Postgres
5
+ def initialize(options)
6
+ @host = options[:docker_host]
7
+ @db_name = options[:database_name]
8
+ end
9
+
10
+ def base_image
11
+ @base_image ||= @host.images.create(
12
+ label: "postgres",
13
+ base_image: "ubuntu",
14
+ setup_commands: [
15
+ "apt-get install -y python-software-properties software-properties-common",
16
+ "add-apt-repository -y ppa:pitti/postgresql",
17
+ "apt-get update",
18
+ "apt-get install -y postgresql-9.2 postgresql-client-9.2 postgresql-contrib-9.2",
19
+ ],
20
+ )
21
+ end
22
+
23
+ def server_image
24
+ @server_image ||= @host.images.create(
25
+ label: "pgserver",
26
+ base_image: base_image,
27
+ setup_commands: [
28
+ "service postgresql start; su postgres -c 'createuser -d -r -s root; createdb -O root root'; service postgresql stop",
29
+ "echo 'host all all 0.0.0.0/0 trust' >>/etc/postgresql/9.2/main/pg_hba.conf",
30
+ "echo \"listen_addresses='*'\" >>/etc/postgresql/9.2/main/postgresql.conf",
31
+ ],
32
+ daemon_command: "su postgres -c '#{bin_path}/postgres -c config_file=/etc/postgresql/9.2/main/postgresql.conf'",
33
+ volumes: ["/var/lib/postgresql/9.2/main"],
34
+ )
35
+ end
36
+
37
+ def run
38
+ container
39
+ end
40
+
41
+ def container
42
+ @container ||= server_image.run
43
+ end
44
+
45
+ def name
46
+ @db_name
47
+ end
48
+
49
+ def ip_address
50
+ container.ip_address
51
+ end
52
+
53
+ def export(file)
54
+ File.open file, "w" do |f|
55
+ f.write base_image.command("#{bin_path}/pg_dump #{client_options} #{@db_name}")
56
+ end
57
+ Conjure.log "[export] #{File.size file} bytes exported to #{file}"
58
+ end
59
+
60
+ def import(file)
61
+ base_image.command "#{bin_path}/psql #{client_options} -d #{@db_name} -f /files/#{File.basename file}", files: [file]
62
+ Conjure.log "[import] #{File.size file} bytes imported from #{file}"
63
+ end
64
+
65
+ def client_options
66
+ "-U root -h #{ip_address}"
67
+ end
68
+
69
+ def bin_path
70
+ "/usr/lib/postgresql/9.2/bin"
71
+ end
72
+
73
+ def adapter_name
74
+ "postgresql"
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -206,7 +206,8 @@ module Conjure
206
206
  end
207
207
 
208
208
  def find(options)
209
- image_name = options[:image_name]
209
+ image_name = options[:image_name].clone
210
+ image_name << ":" unless image_name.include? ":"
210
211
  id = host.command("ps | grep #{image_name} ; true").strip.split("\n").first.to_s[0..11]
211
212
  id = nil if id == ""
212
213
  Container.new(:host => host, :id => id) if id
@@ -12,7 +12,6 @@ module Conjure
12
12
  def deploy
13
13
  Conjure.log "[deploy] Deploying #{@name}:#{@branch} to #{@environment}"
14
14
  unless @test
15
- database.run
16
15
  codebase.install
17
16
  rails.run
18
17
  Conjure.log "[deploy] Application deployed to #{docker.ip_address}"
@@ -24,11 +23,11 @@ module Conjure
24
23
  end
25
24
 
26
25
  def database
27
- @database ||= Service::PostgresDatabase.new docker, "#{@name}_#{@environment}"
26
+ codebase.database
28
27
  end
29
28
 
30
29
  def codebase
31
- @codebase ||= Service::RailsCodebase.new docker, @origin, @branch, @name, database.ip_address, @environment
30
+ @codebase ||= Service::RailsCodebase.new docker, @origin, @branch, @name, @environment
32
31
  end
33
32
 
34
33
  def rails
@@ -1,15 +1,15 @@
1
1
  module Conjure
2
2
  module Service
3
3
  class RailsCodebase
4
- def initialize(host, github_url, branch, app_name, database_ip_address, rails_environment)
4
+ def initialize(host, github_url, branch, app_name, rails_environment)
5
5
  @github_url = github_url
6
6
  @branch = branch
7
7
  @app_name = app_name
8
- @database_ip_address = database_ip_address
9
8
  @rails_environment = rails_environment
9
+ @host = host
10
10
  github_private_key = Conjure.config.file_contents(:private_key_file).gsub("\n", "\\n")
11
11
  github_public_key = Conjure.config.file_contents(:public_key_file).gsub("\n", "\\n")
12
- @image = host.images.create(
12
+ @image = @host.images.create(
13
13
  label: "codebase",
14
14
  base_image: "ubuntu",
15
15
  setup_commands: [
@@ -26,10 +26,10 @@ module Conjure
26
26
  def database_yml
27
27
  {
28
28
  @rails_environment => {
29
- "adapter" => "postgresql",
30
- "database" => "#{@app_name}_#{@rails_environment}",
29
+ "adapter" => database.adapter_name,
30
+ "database" => database.name,
31
31
  "encoding" => "utf8",
32
- "host" => @database_ip_address,
32
+ "host" => database.ip_address,
33
33
  "username" => "root",
34
34
  "template" => "template0",
35
35
  }
@@ -66,6 +66,19 @@ module Conjure
66
66
  setup = 'Rails.logger = Logger.new "#{Rails.root}/log/#{Rails.env}.log"'
67
67
  @image.command "echo '#{setup}' >/#{@app_name}/config/initializers/z_conjure_logger.rb"
68
68
  end
69
+
70
+ def database_name
71
+ "#{@app_name}_#{@rails_environment}"
72
+ end
73
+
74
+ def gem_names
75
+ gemfile = @image.command "cat #{@app_name}/Gemfile"
76
+ gemfile.scan(/gem ['"]([^'"]+)['"]/).flatten
77
+ end
78
+
79
+ def database
80
+ @database ||= Database.new :docker_host => @host, :codebase => self
81
+ end
69
82
  end
70
83
  end
71
84
  end
@@ -109,7 +109,7 @@ module Conjure
109
109
  end
110
110
 
111
111
  def apt_packages_required_for_gems
112
- ["libpq-dev"]
112
+ ["libpq-dev", "libmysqlclient-dev"]
113
113
  end
114
114
  end
115
115
  end
@@ -0,0 +1,3 @@
1
+ module Conjure
2
+ VERSION = "0.1.3" unless defined?(VERSION)
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conjure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
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-11-06 00:00:00.000000000 Z
12
+ date: 2013-11-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -44,7 +44,7 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  - !ruby/object:Gem::Dependency
47
- name: vagrant
47
+ name: unf
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
@@ -104,12 +104,13 @@ files:
104
104
  - lib/conjure/service/rails_server.rb
105
105
  - lib/conjure/service/rails_codebase.rb
106
106
  - lib/conjure/service/rails_application.rb
107
- - lib/conjure/service/machine_instance.rb
107
+ - lib/conjure/service/database/postgres.rb
108
+ - lib/conjure/service/database/mysql.rb
108
109
  - lib/conjure/service/remote_shell.rb
109
110
  - lib/conjure/service/docker_host.rb
110
- - lib/conjure/service/postgres_database.rb
111
+ - lib/conjure/service/database.rb
111
112
  - lib/conjure/config.rb
112
- - lib/conjure/service.rb
113
+ - lib/conjure/version.rb
113
114
  - lib/conjure/command.rb
114
115
  - README.md
115
116
  - History.md
@@ -1,12 +0,0 @@
1
- module Conjure
2
- module Service
3
- autoload :RailsApplication, "conjure/service/rails_application"
4
- autoload :RailsCodebase, "conjure/service/rails_codebase"
5
- autoload :RailsServer, "conjure/service/rails_server"
6
- autoload :MachineInstance, "conjure/service/machine_instance"
7
- autoload :DockerHost, "conjure/service/docker_host"
8
- autoload :CloudServer, "conjure/service/cloud_server"
9
- autoload :PostgresDatabase, "conjure/service/postgres_database"
10
- autoload :RemoteShell, "conjure/service/remote_shell"
11
- end
12
- end
@@ -1,54 +0,0 @@
1
- require "vagrant"
2
-
3
- module Conjure
4
- module Service
5
- class MachineInstance
6
- def start
7
- @config_path = File.expand_path "../../../../config", __FILE__
8
- load_environment
9
- install_base_image
10
- @vm = @vagrant.primary_vm
11
- start_vm
12
- issue_test_command
13
- end
14
-
15
- def load_environment
16
- @vagrant = Vagrant::Environment.new :cwd => @config_path
17
- end
18
-
19
- def install_base_image
20
- unless @vagrant.boxes.find "precise64"
21
- puts "Downloading 300MB Ubuntu base image for Vagrant, this may take a few minutes..."
22
- @vagrant.boxes.add "precise64", "http://files.vagrantup.com/precise64.box"
23
- load_environment
24
- end
25
- end
26
-
27
- def start_vm
28
- unless @vm.state == :running
29
- puts "Starting a VM..."
30
- @vm.up
31
- end
32
- end
33
-
34
- def ssh_address
35
- info = @vm.ssh.info
36
- "#{info[:username]}@#{info[:host]}"
37
- end
38
-
39
- def ssh_options
40
- info = @vm.ssh.info
41
- "-p #{info[:port]} -i #{info[:private_key_path]}"
42
- end
43
-
44
- def remote_command_output(command)
45
- command.gsub! "'", "'\\\\''"
46
- `ssh #{ssh_address} #{ssh_options} '#{command}'`
47
- end
48
-
49
- def issue_test_command
50
- puts "OS info reported by the VM: #{remote_command_output 'uname -mrs'}"
51
- end
52
- end
53
- end
54
- end
@@ -1,69 +0,0 @@
1
- module Conjure
2
- module Service
3
- class PostgresDatabase
4
- def initialize(host, db_name)
5
- @host = host
6
- @db_name = db_name
7
- end
8
-
9
- def base_image
10
- @base_image ||= @host.images.create(
11
- label: "postgres",
12
- base_image: "ubuntu",
13
- setup_commands: [
14
- "apt-get install -y python-software-properties software-properties-common",
15
- "add-apt-repository -y ppa:pitti/postgresql",
16
- "apt-get update",
17
- "apt-get install -y postgresql-9.2 postgresql-client-9.2 postgresql-contrib-9.2",
18
- ],
19
- )
20
- end
21
-
22
- def server_image
23
- @server_image ||= @host.images.create(
24
- label: "pgserver",
25
- base_image: base_image,
26
- setup_commands: [
27
- "service postgresql start; su postgres -c 'createuser -d -r -s root; createdb -O root root'; service postgresql stop",
28
- "echo 'host all all 0.0.0.0/0 trust' >>/etc/postgresql/9.2/main/pg_hba.conf",
29
- "echo \"listen_addresses='*'\" >>/etc/postgresql/9.2/main/postgresql.conf",
30
- ],
31
- daemon_command: "su postgres -c '#{bin_path}/postgres -c config_file=/etc/postgresql/9.2/main/postgresql.conf'",
32
- volumes: ["/var/lib/postgresql/9.2/main"],
33
- )
34
- end
35
-
36
- def run
37
- container
38
- end
39
-
40
- def container
41
- @container ||= server_image.run
42
- end
43
-
44
- def ip_address
45
- container.ip_address
46
- end
47
-
48
- def export(file)
49
- File.open file, "w" do |f|
50
- f.write base_image.command("#{bin_path}/pg_dump #{client_options} #{@db_name}")
51
- end
52
- Conjure.log "[export] #{File.size file} bytes exported to #{file}"
53
- end
54
-
55
- def import(file)
56
- base_image.command "#{bin_path}/psql #{client_options} -d #{@db_name} -f /files/#{File.basename file}", files: [file]
57
- Conjure.log "[import] #{File.size file} bytes imported from #{file}"
58
- end
59
-
60
- def client_options
61
- "-U root -h #{ip_address}"
62
- end
63
-
64
- def bin_path
65
- "/usr/lib/postgresql/9.2/bin"
66
- end
67
- end
68
- end
69
- end