Class: EY::Model::Environment

Inherits:
Object
  • Object
show all
Defined in:
lib/engineyard/model/environment.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#ignore_bad_masterObject

Returns the value of attribute ignore_bad_master.



8
9
10
# File 'lib/engineyard/model/environment.rb', line 8

def ignore_bad_master
  @ignore_bad_master
end

Class Method Details

.from_arrayObject



20
21
22
# File 'lib/engineyard/model/environment.rb', line 20

def self.from_array(*)
  Collection::Environments.new(super)
end

.from_hash(hash) ⇒ Object



10
11
12
13
14
15
16
17
18
# File 'lib/engineyard/model/environment.rb', line 10

def self.from_hash(hash)
  super.tap do |env|
    env.username = hash['ssh_username']
    env.apps = App.from_array(env.apps, :api => env.api)
    env. = Account.from_hash(env.)
    env.instances = Instance.from_array(hash['instances'], :environment => env)
    env.app_master = Instance.from_hash(env.app_master.merge(:environment => env)) if env.app_master
  end
end

Instance Method Details

#app_master!Object



28
29
30
31
32
33
34
35
36
# File 'lib/engineyard/model/environment.rb', line 28

def app_master!
  master = app_master
  if master.nil?
    raise NoAppMasterError.new(name)
  elsif !ignore_bad_master && master.status != "running"
    raise BadAppMasterStatusError.new(master.status)
  end
  master
end

#configurationObject Also known as: config



125
126
127
# File 'lib/engineyard/model/environment.rb', line 125

def configuration
  EY.config.environments[self.name] || {}
end

#default_branchObject



130
131
132
# File 'lib/engineyard/model/environment.rb', line 130

def default_branch
  EY.config.default_branch(name)
end

#deploy(app, ref, deploy_options = {}) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/engineyard/model/environment.rb', line 38

def deploy(app, ref, deploy_options={})
  app_master!.deploy(app,
    ref,
    migration_command(app, deploy_options),
    config.merge(deploy_options['extras']),
    deploy_options['verbose'])
end

#download_recipesObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/engineyard/model/environment.rb', line 68

def download_recipes
  if File.exist?('cookbooks')
    raise EY::Error, "Could not download, cookbooks already exists"
  end

  require 'tempfile'
  tmp = Tempfile.new("recipes")
  tmp.write(api.request("/environments/#{id}/recipes"))
  tmp.flush
  tmp.close

  cmd = "tar xzf '#{tmp.path}' cookbooks"

  unless system(cmd)
    raise EY::Error, "Could not unarchive recipes.\nCommand `#{cmd}` exited with an error."
  end
end

#launchObject



138
139
140
# File 'lib/engineyard/model/environment.rb', line 138

def launch
  Launchy.open(app_master!.hostname_url)
end

#logsObject



24
25
26
# File 'lib/engineyard/model/environment.rb', line 24

def logs
  Log.from_array(api_get("/environments/#{id}/logs")["logs"])
end

#migration_command(app, deploy_options) ⇒ Object



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/engineyard/model/environment.rb', line 142

def migration_command(app, deploy_options)
  # regarding deploy_options['migrate']:
  #
  # missing means migrate how the yaml file says to
  # nil means don't migrate
  # true means migrate w/custom command (if present) or default
  # a string means migrate with this specific command
  return nil if no_migrate?(deploy_options)
  command = migration_command_from_command_line(deploy_options)
  unless command
    return nil if no_migrate?(config)
    command = migration_command_from_config
  end
  command = migration_command_from_environment(app) unless command
  command
end

#put_up_maintenance_page(app, verbose = false) ⇒ Object



56
57
58
# File 'lib/engineyard/model/environment.rb', line 56

def put_up_maintenance_page(app, verbose=false)
  app_master!.put_up_maintenance_page(app, verbose)
end

#rebuildObject



60
61
62
# File 'lib/engineyard/model/environment.rb', line 60

def rebuild
  api.request("/environments/#{id}/update_instances", :method => :put)
end

#resolve_branch(branch, allow_non_default_branch = false) ⇒ Object



118
119
120
121
122
123
# File 'lib/engineyard/model/environment.rb', line 118

def resolve_branch(branch, allow_non_default_branch=false)
  if !allow_non_default_branch && branch && default_branch && (branch != default_branch)
    raise BranchMismatchError.new(default_branch, branch)
  end
  branch || default_branch
end

#rollback(app, extra_deploy_hook_options = {}, verbose = false) ⇒ Object



46
47
48
49
50
# File 'lib/engineyard/model/environment.rb', line 46

def rollback(app, extra_deploy_hook_options={}, verbose=false)
  app_master!.rollback(app,
    config.merge(extra_deploy_hook_options),
    verbose)
end

#run_custom_recipesObject



64
65
66
# File 'lib/engineyard/model/environment.rb', line 64

def run_custom_recipes
  api.request("/environments/#{id}/run_custom_recipes", :method => :put)
end

#shorten_name_for(app) ⇒ Object



134
135
136
# File 'lib/engineyard/model/environment.rb', line 134

def shorten_name_for(app)
  name.gsub(/^#{Regexp.quote(app.name)}_/, '')
end

#take_down_maintenance_page(app, verbose = false) ⇒ Object



52
53
54
# File 'lib/engineyard/model/environment.rb', line 52

def take_down_maintenance_page(app, verbose=false)
  app_master!.take_down_maintenance_page(app, verbose)
end

#tar_and_upload_recipes_in_cookbooks_dirObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/engineyard/model/environment.rb', line 95

def tar_and_upload_recipes_in_cookbooks_dir
  require 'tempfile'
  unless File.exist?("cookbooks")
    raise EY::Error, "Could not find chef recipes. Please run from the root of your recipes repo."
  end

  recipes_file = Tempfile.new("recipes")
  cmd = "tar czf '#{recipes_file.path}' cookbooks/"

  unless system(cmd)
    raise EY::Error, "Could not archive recipes.\nCommand `#{cmd}` exited with an error."
  end

  upload_recipes(recipes_file)
end

#upload_recipes(file_to_upload) ⇒ Object



111
112
113
114
115
116
# File 'lib/engineyard/model/environment.rb', line 111

def upload_recipes(file_to_upload)
  api.request("/environments/#{id}/recipes", {
    :method => :post,
    :params => {:file => file_to_upload}
  })
end

#upload_recipes_at_path(recipes_path) ⇒ Object



86
87
88
89
90
91
92
93
# File 'lib/engineyard/model/environment.rb', line 86

def upload_recipes_at_path(recipes_path)
  recipes_path = Pathname.new(recipes_path)
  if recipes_path.exist?
    upload_recipes recipes_path.open('rb')
  else
    raise EY::Error, "Recipes file not found: #{recipes_path}"
  end
end