Class: Stackato

Inherits:
Object
  • Object
show all
Defined in:
lib/conan/stackato.rb

Instance Method Summary collapse

Constructor Details

#initialize(paas_user, paas_password, trace = false, dry_run = false) ⇒ Stackato

Returns a new instance of Stackato.



6
7
8
9
10
11
12
13
14
# File 'lib/conan/stackato.rb', line 6

def initialize(paas_user, paas_password, trace=false, dry_run=false)
  @paas_user = paas_user
  @paas_password = paas_password
  @doit = dry_run ? "echo " : ""
  @trace = trace ? "--trace" : ""
  random_str = (0...8).map { ('a'..'z').to_a[rand(26)] }.join
  @paas_token_file = File.join(Dir.tmpdir(), "token_#{random_str}")
  @paas_manifest = "stackato.yml"
end

Instance Method Details

#application_info(app, deployment) ⇒ Object



139
140
141
142
143
144
145
146
147
148
# File 'lib/conan/stackato.rb', line 139

def application_info(app, deployment)
  list_json = `#{@paas_cmd} list --json`
  raise "Stackato list failed" if !$?.success?

  base_name = deployment.name(app)
  active_urls = deployment.active_urls(app)
  inactive_urls = deployment.inactive_urls(app)

  StackatoApplicationInfo.new(list_json, base_name, active_urls, inactive_urls)
end

#bg_clean(app, deployment) ⇒ Object



124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/conan/stackato.rb', line 124

def bg_clean(app, deployment)
  (deployment.paas_target)

  app_info = application_info(app, deployment)

  # Delete inactive app if it exists
  if app_info.inactive_app_name
    puts "Deleting inactive app."
    c = "#{@doit} #{@paas_cmd} delete #{app_info.inactive_app_name} --no-prompt"
    system(c) or raise "Stackato delete failed:  #{c}"
  else
    puts "No inactive app to clean."
  end
end

#bg_deploy(work_dir, app, deployment) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/conan/stackato.rb', line 79

def bg_deploy(work_dir, app, deployment)
  puts ''
  Dir.chdir(work_dir){
    (deployment.paas_target)

    app_info = application_info(app, deployment)
    raise "Please remove inactive app '#{app_info.inactive_app_name}' before proceeding." unless app_info.inactive_app_name.nil?

    puts "Deploying inactive app #{deployment.name(app)}"    
    c = "#{@doit} #{@paas_cmd} --manifest #{@paas_manifest} --no-prompt push"
    system(c) or raise "Stackato push failed: #{c}"
  }
end

#bg_switch(app, deployment) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/conan/stackato.rb', line 93

def bg_switch(app, deployment)
  (deployment.paas_target)

  app_info = application_info(app, deployment)
  
  if app_info.inactive_app_name.nil?
    puts "No inactive app to switch to."
    return
  end

  active_urls = deployment.active_urls(app)
  inactive_urls = deployment.inactive_urls(app)

  appUrlOp = ->(cmd, paas_app_name, url) {
    c = "#{@doit} #{@paas_cmd} #{cmd} #{paas_app_name} #{url}"
    system(c) or raise "Stackato #{cmd} failed:  #{c}"
  }

  # For inactive app, map active urls to it and unmap inactive urls
  puts "Mapping active urls"
  active_urls.each {|active_url| appUrlOp.call("map", app_info.inactive_app_name, active_url)}
  inactive_urls.each {|inactive_url| appUrlOp.call("unmap", app_info.inactive_app_name, inactive_url)}

  # If active app exists, unmap active urls and map inactive urls to it
  if app_info.active_app_name
    puts "Mapping inactive urls"
    inactive_urls.each {|inactive_url| appUrlOp.call("map", app_info.active_app_name, inactive_url)}
    active_urls.each {|active_url| appUrlOp.call("unmap", app_info.active_app_name, active_url)}
  end
end

#deploy(work_dir, app, deployment, force = false) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/conan/stackato.rb', line 27

def deploy(work_dir, app, deployment, force=false) 
  puts ''    
  Dir.chdir(work_dir){      
    (deployment.paas_target)

    paas_app_name = deployment.name(app)
    appCreate = ->(cmd) {
      c = "#{@doit} #{@paas_cmd} --manifest #{@paas_manifest} --no-prompt #{cmd} --no-start"
      system(c) or raise "Stackato #{cmd} failed: #{c}"
    }
    appOperation = ->(cmd) {
      c = "#{@doit} #{@paas_cmd} #{cmd} #{paas_app_name} --no-prompt"
      system(c) or raise "Stackato #{cmd} failed: #{c}"
    }

    yield paas_app_name if block_given?

    stats_status = `#{@paas_cmd} stats #{paas_app_name} 2>&1 >/dev/null`
    puts stats_status
    raise ScriptError, "Stackato authorization failure. Provide user and password" if (stats_status =~ /Not Authorized/)
  
    # print out the stackato.yml for posterity
    puts '------------------------------------------------------------------------------'

    File.open(@paas_manifest, "r") do |f|
      while (line = f.gets)
        puts "#{line}"
      end
    end
    puts '------------------------------------------------------------------------------'
    puts ''

    # A Error 301 will be returned from stackato if the app does not exist, this determins if we should push or update
    if (stats_status =~ /Error 301/)
      appCreate.call "push"
    else
      if (force)
        puts "Replacing #{paas_app_name}. May be force be with you!"
        appOperation.call "delete"
        appCreate.call "push"
      else
        puts "Update #{paas_app_name}"
        appOperation.call "stop"
        appCreate.call "update"
      end
    end

    puts "Starting #{paas_app_name}"
    appOperation.call "start"
  }
end

#login(paas_target) ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/conan/stackato.rb', line 16

def (paas_target)
  # login only one time per target, and only one target at a time
  if (@session != paas_target)
    @session = paas_target
    @paas_cmd = "stackato #{@trace} --target #{paas_target} --token-file #{@paas_token_file}"
    unless @paas_user.nil?
      system( "#{@paas_cmd} login --user #{@paas_user} --password #{@paas_password}" ) or raise "Stackato login failed on #{paas_target}"
    end
  end
end