conjure 0.1.2 → 0.1.3

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.
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