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



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

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

#coda_count=(size) ⇒ Object



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

def coda_count=(size)
  @coda_count = size
end

#coda_flavorObject



102
103
104
# File 'lib/konzertmeister/backend.rb', line 102

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

#coda_flavor=(input_flavor) ⇒ Object



106
107
108
109
110
111
112
# File 'lib/konzertmeister/backend.rb', line 106

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



143
144
145
146
147
148
149
# File 'lib/konzertmeister/backend.rb', line 143

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



151
152
153
# File 'lib/konzertmeister/backend.rb', line 151

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

#enroll_in_early_access_program(eap) ⇒ Object



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

def enroll_in_early_access_program(eap)
  params = { program_key: eap.key }
  Konzertmeister.session.post("/backends/id/#{self.id}/early_access_grants", params)
end

#fqdn(scope = nil) ⇒ Object



170
171
172
173
174
175
176
177
178
# File 'lib/konzertmeister/backend.rb', line 170

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

#full_nameObject



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

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



126
127
128
129
130
131
132
# File 'lib/konzertmeister/backend.rb', line 126

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



134
135
136
# File 'lib/konzertmeister/backend.rb', line 134

def meta_version=(input_mv)
  @meta_version = input_mv
end

#postgres_flavorObject



114
115
116
# File 'lib/konzertmeister/backend.rb', line 114

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

#postgres_flavor=(input_flavor) ⇒ Object



118
119
120
121
122
123
124
# File 'lib/konzertmeister/backend.rb', line 118

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)


180
181
182
# File 'lib/konzertmeister/backend.rb', line 180

def production?
  @kind == 'production'
end

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



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

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

#proxy_hostObject



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

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

#proxy_portObject



159
160
161
# File 'lib/konzertmeister/backend.rb', line 159

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



202
203
204
205
# File 'lib/konzertmeister/backend.rb', line 202

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



197
198
199
200
# File 'lib/konzertmeister/backend.rb', line 197

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

#set_latest_meta_versionObject



138
139
140
141
# File 'lib/konzertmeister/backend.rb', line 138

def set_latest_meta_version
  mv = Konzertmeister::MetaVersion.all.last
  Konzertmeister.session.put("/backends/id/#{self.id}", {'meta_version' => { 'meta_version_id' => mv.id }})
end

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



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

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



207
208
209
210
211
212
213
214
215
# File 'lib/konzertmeister/backend.rb', line 207

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