Class: Fourchette::Heroku

Inherits:
Object
  • Object
show all
Includes:
Logger
Defined in:
lib/fourchette/heroku.rb

Instance Method Summary collapse

Methods included from Logger

#logger

Instance Method Details

#app_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


4
5
6
# File 'lib/fourchette/heroku.rb', line 4

def app_exists? name
  client.app.list.collect { |app| app if app['name'] == name }.reject(&:nil?).any?
end

#clientObject



21
22
23
24
25
26
27
# File 'lib/fourchette/heroku.rb', line 21

def client
  unless @heroku_client
    api_key = ENV['FOURCHETTE_HEROKU_API_KEY']
    @heroku_client = PlatformAPI.connect(api_key)
  end
  @heroku_client
end

#config_vars(app_name) ⇒ Object



29
30
31
# File 'lib/fourchette/heroku.rb', line 29

def config_vars app_name
  client.config_var.info(app_name)
end

#copy_add_ons(from, to) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/fourchette/heroku.rb', line 51

def copy_add_ons from, to
  logger.info "Copying addons from #{from} to #{to}"
  from_addons = client.addon.list(from)
  from_addons.each do |addon|
    name = addon['plan']['name']
    begin
      logger.info "Adding #{name} to #{to}"
      client.addon.create(to, { plan: name })
    rescue Excon::Errors::UnprocessableEntity => e
      logger.error "Failed to copy addon #{name}"
      logger.error e
    end
  end
end

#copy_config(from, to) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/fourchette/heroku.rb', line 42

def copy_config from, to
  logger.info "Copying configs from #{from} to #{to}"
  from_congig_vars = config_vars(from)
  # WE SHOULD NOT MOVE THE HEROKU_POSTGRES_*_URL or DATABASE_URL...
  from_congig_vars.reject! { |k, v| k.start_with?('HEROKU_POSTGRESQL_') && k.end_with?('_URL') }
  from_congig_vars.reject! { |k, v| k == ('DATABASE_URL') }
  client.config_var.update(to, from_congig_vars)
end

#copy_pg(from, to) ⇒ Object



66
67
68
69
70
71
72
73
74
# File 'lib/fourchette/heroku.rb', line 66

def copy_pg from, to
  if pg_enabled?(from)
    logger.info "Copying Postgres's data from #{from} to #{to}"
    backup = Fourchette::Pgbackups.new
    backup.copy(from, to)
  else
    logger.info "Postgres not enabled on #{from}. Skipping data copy."
  end
end

#copy_RACK_AND_RAILS_ENV_again(from, to) ⇒ Object



76
77
78
79
80
81
# File 'lib/fourchette/heroku.rb', line 76

def copy_RACK_AND_RAILS_ENV_again(from, to)
  env_to_update = get_original_env(from)
  unless env_to_update.empty?
    client.config_var.update(to, env_to_update)
  end
end

#create_app(name) ⇒ Object



37
38
39
40
# File 'lib/fourchette/heroku.rb', line 37

def create_app name
  logger.info "Creating #{name}"
  client.app.create({ name: name })
end

#delete(app_name) ⇒ Object



16
17
18
19
# File 'lib/fourchette/heroku.rb', line 16

def delete app_name
  logger.info "Deleting #{app_name}"
  client.app.delete(app_name)
end

#fork(from, to) ⇒ Object



8
9
10
11
12
13
14
# File 'lib/fourchette/heroku.rb', line 8

def fork from, to
  create_app(to)
  copy_config(from, to)
  copy_add_ons(from, to)
  copy_pg(from, to)
  copy_RACK_AND_RAILS_ENV_again(from, to)
end

#get_original_env(from) ⇒ Object



83
84
85
86
87
88
89
90
91
# File 'lib/fourchette/heroku.rb', line 83

def get_original_env(from)
  environments = {}
  ['RACK_ENV', 'RAILS_ENV'].each do |var|
    if client.config_var.info(from)[var]
      environments[var] = client.config_var.info(from)[var]
    end
  end
  environments
end

#git_url(app_name) ⇒ Object



33
34
35
# File 'lib/fourchette/heroku.rb', line 33

def git_url app_name
  client.app.info(app_name)['git_url']
end

#pg_enabled?(app) ⇒ Boolean

Returns:

  • (Boolean)


93
94
95
96
97
# File 'lib/fourchette/heroku.rb', line 93

def pg_enabled?(app)
  client.addon.list(app).any? do |addon|
    addon['addon_service']['name'] == 'heroku-postgresql'
  end
end