Class: Konzertmeister::Backend

Inherits:
Object
  • Object
show all
Defined in:
lib/konzertmeister/backend.rb

Constant Summary collapse

KINDS =
%w[
  production
  sandbox
  development
  internal
]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data = {}) ⇒ Backend

Returns a new instance of Backend.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/konzertmeister/backend.rb', line 28

def initialize(data = {})
  @data = data
  data.each do |k,value|
    next if %w[hosts customer meta_version program].include?(k)

    if m = k.match(/^backend_(.*)$/)
      key = m[1]
    else
      key = k
    end

    instance_variable_set("@#{key}", value)
  end
end

Instance Attribute Details

#created_atObject (readonly)

Returns the value of attribute created_at.



11
12
13
# File 'lib/konzertmeister/backend.rb', line 11

def created_at
  @created_at
end

#idObject (readonly)

Returns the value of attribute id.



11
12
13
# File 'lib/konzertmeister/backend.rb', line 11

def id
  @id
end

#kindObject

Returns the value of attribute kind.



10
11
12
# File 'lib/konzertmeister/backend.rb', line 10

def kind
  @kind
end

#monthly_costObject (readonly)

Returns the value of attribute monthly_cost.



11
12
13
# File 'lib/konzertmeister/backend.rb', line 11

def monthly_cost
  @monthly_cost
end

#nameObject

Returns the value of attribute name.



10
11
12
# File 'lib/konzertmeister/backend.rb', line 10

def name
  @name
end

#puppet_masterObject (readonly)

Returns the value of attribute puppet_master.



11
12
13
# File 'lib/konzertmeister/backend.rb', line 11

def puppet_master
  @puppet_master
end

#short_nameObject (readonly)

Returns the value of attribute short_name.



11
12
13
# File 'lib/konzertmeister/backend.rb', line 11

def short_name
  @short_name
end

#updated_atObject (readonly)

Returns the value of attribute updated_at.



11
12
13
# File 'lib/konzertmeister/backend.rb', line 11

def updated_at
  @updated_at
end

Class Method Details

.allObject



13
14
15
16
17
18
19
20
21
22
# File 'lib/konzertmeister/backend.rb', line 13

def self.all
  response = Konzertmeister.session.get('/backends')
  if response
    response.map do |data|
      Konzertmeister::Backend.new(data)
    end.sort_by do |b|
      "#{b.customer.short_name} #{b.short_name}"
    end
  end
end

.find_by(attr, value) ⇒ Object



24
25
26
# File 'lib/konzertmeister/backend.rb', line 24

def self.find_by(attr, value)
  Backend.new(Konzertmeister.session.get("/backends/#{attr}/#{value}"))
end

Instance Method Details

#coda_countObject



89
90
91
# File 'lib/konzertmeister/backend.rb', line 89

def coda_count
  @coda_count ||= self.hosts.size
end

#coda_count=(size) ⇒ Object



93
94
95
# File 'lib/konzertmeister/backend.rb', line 93

def coda_count=(size)
  @coda_count = size
end

#coda_flavorObject



97
98
99
# File 'lib/konzertmeister/backend.rb', line 97

def coda_flavor
  @coda_flavor ||= self.hosts.find{|h| h.kind == Konzertmeister::Host::CODA_KIND}.flavor
end

#coda_flavor=(input_flavor) ⇒ Object



101
102
103
104
105
106
107
# File 'lib/konzertmeister/backend.rb', line 101

def coda_flavor=(input_flavor)
  if Konzertmeister::Host::FLAVORS.include?(input_flavor)
    @coda_flavor = input_flavor
  else
    raise "Invalid flavor: #{input_flavor}. Choose one of: #{Konzertmeister::Host::Flavors.join(', ')}"
  end
end

#customerObject



133
134
135
136
137
138
139
# File 'lib/konzertmeister/backend.rb', line 133

def customer
  @customer ||= if @data.key?('customer')
      Konzertmeister::Customer.new(@data.fetch('customer'))
    else
      Backend.find_by('id', self.id).customer
    end
end

#customer=(input_customer) ⇒ Object



141
142
143
# File 'lib/konzertmeister/backend.rb', line 141

def customer=(input_customer)
  @customer = input_customer
end

#early_access_programsObject



79
80
81
82
83
84
85
86
87
# File 'lib/konzertmeister/backend.rb', line 79

def early_access_programs
  if @data.key?('early_access_programs')
    @data.fetch('early_access_programs').map do |program_hash|
      Konzertmeister::EarlyAccessProgram.new(program_hash)
    end
  else
    Backend.find_by('id', self.id).early_access_programs
  end
end

#fqdn(scope = nil) ⇒ Object



160
161
162
163
164
165
166
167
168
# File 'lib/konzertmeister/backend.rb', line 160

def fqdn(scope = nil)
  first = scope.nil? ? full_name : "#{full_name}-admin"
  [
    first,
    "backend",
    "tempoiq",
    "com"
  ].join(".")
end

#full_nameObject



153
154
155
156
157
158
# File 'lib/konzertmeister/backend.rb', line 153

def full_name
  [
    short_name,
    customer.short_name
  ].join("-")
end

#hostsObject



69
70
71
72
73
74
75
76
77
# File 'lib/konzertmeister/backend.rb', line 69

def hosts
  @hosts ||= if @data.key?('hosts')
      @data.fetch('hosts').map do |host_hash|
        Konzertmeister::Host.new(host_hash)
      end.sort_by(&:hostname)
    else
      Backend.find_by('id', self.id).hosts
    end
end

#meta_versionObject



121
122
123
124
125
126
127
# File 'lib/konzertmeister/backend.rb', line 121

def meta_version
  @meta_version ||= if @data.key?('meta_version')
       Konzertmeister::MetaVersion.new(@data.fetch('meta_version'))
     else
       Backend.find_by('id', self.id).meta_version
     end
end

#meta_version=(input_mv) ⇒ Object



129
130
131
# File 'lib/konzertmeister/backend.rb', line 129

def meta_version=(input_mv)
  @meta_version = input_mv
end

#postgres_flavorObject



109
110
111
# File 'lib/konzertmeister/backend.rb', line 109

def postgres_flavor
  @postgres_flavor ||= self.hosts.find{|h| h.kind == Konzertmeister::Host::POSTGRES_KIND}.flavor
end

#postgres_flavor=(input_flavor) ⇒ Object



113
114
115
116
117
118
119
# File 'lib/konzertmeister/backend.rb', line 113

def postgres_flavor=(input_flavor)
  if Konzertmeister::Host::FLAVORS.include?(input_flavor)
    @postgres_flavor = input_flavor
  else
    raise "Invalid flavor: #{input_flavor}. Choose one of: #{Konzertmeister::Host::Flavors.join(', ')}"
  end
end

#production?Boolean

Returns:

  • (Boolean)


170
171
172
# File 'lib/konzertmeister/backend.rb', line 170

def production?
  @kind == 'production'
end

#proxy_command(host, user, port = 1535, *args) ⇒ Object



182
183
184
185
# File 'lib/konzertmeister/backend.rb', line 182

def proxy_command(host, user, port=1535, *args)
  prefix = ssh_prefix(user, port, *args)
  %Q{#{prefix} #{user}@#{host.management_ip}}
end

#proxy_hostObject



145
146
147
# File 'lib/konzertmeister/backend.rb', line 145

def proxy_host
  @proxy_host ||= @data.fetch('proxy').fetch('proxy_host')
end

#proxy_portObject



149
150
151
# File 'lib/konzertmeister/backend.rb', line 149

def proxy_port
  @proxy_port ||= @data.fetch('proxy').fetch('proxy_port')
end

#rsync_down_command(host, user, file_remote, file_local, port = 1535, *args) ⇒ Object



192
193
194
195
# File 'lib/konzertmeister/backend.rb', line 192

def rsync_down_command(host, user, file_remote, file_local, port=1535, *args)
  prefix = ssh_prefix(user, port, *args)
  %Q{rsync -avzP -e '#{prefix}' #{user}@#{host.management_ip}:#{file_remote} #{file_local}}
end

#rsync_up_command(host, user, file_local, file_remote = "", port = 1535, *args) ⇒ Object



187
188
189
190
# File 'lib/konzertmeister/backend.rb', line 187

def rsync_up_command(host, user, file_local, file_remote="", port=1535, *args)
  prefix = ssh_prefix(user, port, *args)
  %Q{rsync -avzP -e '#{prefix}' #{file_local} #{user}@#{host.management_ip}:#{file_remote}}
end

#saveObject



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
# File 'lib/konzertmeister/backend.rb', line 43

def save
  params = {
    backend_platform: 'Rackspace',
    backend_name: name,
    backend_kind: kind,
    customer: {customer_id: customer.id},
    meta_version: {meta_version_id: meta_version.id},
    coda_count: coda_count,
    coda_flavor: coda_flavor,
    postgres_flavor: postgres_flavor
  }
  puts "Creating with params: #{params}"

  response = Konzertmeister.session.post("/backends", params)
  if response 
    response_object = Konzertmeister::Backend.new(response)
    @id = response_object.id
    @short_name = response_object.short_name
    @puppet_master = response_object.puppet_master
    @monthly_cost = response_object.monthly_cost
    @created_at = response_object.created_at
    @updated_at = response_object.updated_at
    response_object
  end
end

#ssh_prefix(user, port = 1535, *args) ⇒ Object



174
175
176
177
178
179
180
# File 'lib/konzertmeister/backend.rb', line 174

def ssh_prefix(user, port=1535, *args)
  proxy = @data.fetch("proxy")
  proxy_host = proxy.fetch("proxy_host")
  proxy_port = proxy.fetch("proxy_port")

  %Q{ssh -p #{port} -o "ProxyCommand ssh -p #{proxy_port} #{user}@#{proxy_host} nc %h %p" #{args.join(' ')}}
end

#to_sObject



197
198
199
200
201
202
203
204
205
# File 'lib/konzertmeister/backend.rb', line 197

def to_s
  cost = "%1.2f" % monthly_cost

  ([
   "$#{cost}/month #{full_name} (#{kind})",
   "MetaVersion: #{meta_version}",
   "Hosts:"
  ] + hosts.sort_by(&:name).map {|h| " #{h}"}).join("\n")
end