class Pvcglue::Minion

Public Instance Methods

build!() click to toggle source
# File lib/pvcglue/minion.rb, line 5
def build!
  minion = self # for readability

  Pvcglue.logger.info('BUILD') { "Building #{machine_name}" }
  Pvcglue.docs.level_1_roles(minion)

  Pvcglue::Packages::SshKeyCheck.apply(minion)
  Pvcglue::Packages::AptRepos.apply(minion)
  Pvcglue::Packages::AptUpdate.apply(minion)
  Pvcglue::Packages::AptUpgrade.apply(minion)
  Pvcglue::Packages::Swap.apply(minion)
  Pvcglue::Packages::Apt.apply(minion)
  Pvcglue::Packages::Firewall.apply(minion)
  Pvcglue::Packages::UnattendedUpgrades.apply(minion)
  Pvcglue::Packages::Users.apply(minion)
  Pvcglue::Packages::AuthorizedKeys.apply(minion)
  Pvcglue::Packages::Slack.apply(minion)
  Pvcglue::Packages::Roles.apply(minion)


  # puts '='*175
end
create!() click to toggle source
# File lib/pvcglue/minion.rb, line 54
def create!
  Pvcglue.logger.warn("Provisioning a machine for #{machine_name} on #{pvc_cloud_provider.name}...")

  # TODO:  Tags.  production, staging, load-balancer, web, worker, database, postgress, cache, memcache...

  name = machine_name
  capacity = pvc_cloud_provider.options.capacity
  image = pvc_cloud_provider.options.image
  region = pvc_cloud_provider.options.region
  if pvc_cloud_provider.options.initial_users
    ssh_keys = pvc_cloud_provider.options.initial_users.map { |description, ssh_key| ssh_key }
  else
    ssh_keys = []
  end
  # backups = cloud_provider.backups.nil? ? true : cloud_provider.backups # default to true -- safety first!
  backups = pvc_cloud_provider.options.backups.nil? ? true : machine_options.cloud_provider.backups # default to true -- safety first!
  tags = pvc_cloud_provider.options.tags
  group = pvc_cloud_provider.options.group

  options = ::SafeMash.new(
      name: name,
      region: region,
      image: image,
      capacity: capacity,
      ssh_keys: ssh_keys,
      backups: backups,
      ipv6: false,
      tags: tags,
      group: group,
  )

  machine = pvc_cloud_provider.create(options)
  self.machine = machine
  true
end
get_authorized_keys_data(users) click to toggle source
# File lib/pvcglue/minion.rb, line 174
def get_authorized_keys_data(users)
  data = []
  users.each do |user|
    keys = []
    keys += user.public_keys.values if user.public_keys
    keys += get_github_authorized_keys(user)
    keys.each do |public_key|
      line = %Q(environment="PVCGLUE_USER=#{user.name}" #{public_key})
      # line = %Q(command="export PVCGLUE_USER=#{user.name}" #{public_key})
      # line = %Q(command="path/to/script",environment="LEVEL=1" command="export PVCGLUE_USER=#{user.name}" #{public_key})
      data << line
    end
  end
  data
end
get_cloud_provider_options() click to toggle source
# File lib/pvcglue/minion.rb, line 42
def get_cloud_provider_options
  # Merge default and machine options
  options = machine_options.cloud_provider || ::SafeMash.new
  options.reverse_merge(default_cloud_provider)
end
get_github_authorized_keys(user) click to toggle source

def get_root_authorized_keys

get_authorized_keys(get_root_users)

end

def get_users_authorized_keys

get_authorized_keys(get_users)

end

def get_authorized_keys(users)

keys = []
users.each do |user|
  user.public_keys.each do |id, public_key|
    keys << public_key
  end
end
keys

end

# File lib/pvcglue/minion.rb, line 168
def get_github_authorized_keys(user)
  return [] unless user.github_user_name.present?
  uri = URI("https://github.com/#{user.github_user_name}.keys")
  Net::HTTP.get(uri).split("\n")
end
get_root_authorized_keys_data() click to toggle source
# File lib/pvcglue/minion.rb, line 142
def get_root_authorized_keys_data
  get_authorized_keys_data(get_root_users)
end
get_root_users() click to toggle source
# File lib/pvcglue/minion.rb, line 126
def get_root_users
  if minion_manager?
    get_users_from_group('==manager_root_users==')
  else
    get_users_from_group('==lead_developers==')
  end
end
get_user(user_name) click to toggle source
# File lib/pvcglue/minion.rb, line 107
def get_user(user_name)
  Pvcglue.cloud.data.users.detect { |user| user.name == user_name }
end
get_users() click to toggle source
# File lib/pvcglue/minion.rb, line 134
def get_users
  if minion_manager?
    get_users_from_group('==manager_users==')
  else
    get_users_from_group('==developers==')
  end
end
get_users_authorized_keys_data() click to toggle source
# File lib/pvcglue/minion.rb, line 146
def get_users_authorized_keys_data
  get_authorized_keys_data(get_users)
end
get_users_from_group(names) click to toggle source
# File lib/pvcglue/minion.rb, line 111
def get_users_from_group(names)
  names = Array(names)
  users = []
  names.each do |name|
    if name =~ /\A==.*==\z/
      group = Pvcglue.cloud.data.groups[name[2..-3]]
      # ap group
      users.concat(get_users_from_group(group))
    else
      users << get_user(name)
    end
  end
  users
end
has_role?(roles) click to toggle source
# File lib/pvcglue/minion.rb, line 90
def has_role?(roles)
  return true if roles == 'all'
  !(Array(roles).map(&:to_sym) & roles_to_sym).empty?
end
has_roles?(roles) click to toggle source
# File lib/pvcglue/minion.rb, line 95
def has_roles?(roles)
  has_role?(roles)
end
minion_manager?() click to toggle source
# File lib/pvcglue/minion.rb, line 103
def minion_manager?
  has_role?('manager')
end
provision!() click to toggle source

def build_manager!

Pvcglue.logger.info('MANAGER') { "Building #{machine_name}" }
Pvcglue.cloud.set_manager_as_project
build!

end

# File lib/pvcglue/minion.rb, line 34
def provision!
  create! unless provisioned?
end
provisioned?() click to toggle source
# File lib/pvcglue/minion.rb, line 38
def provisioned?
  public_ip.present?
end
pvc_cloud_provider() click to toggle source
# File lib/pvcglue/minion.rb, line 48
def pvc_cloud_provider
  options = get_cloud_provider_options
  # raise("Unknown cloud provider '#{get_cloud_provider_name}'") unless get_cloud_provider_name
  @pvc_cloud_provider ||= Pvcglue::CloudProviders.init(options)
end
quiet_all_sidekiq_workers_cmd() click to toggle source
# File lib/pvcglue/minion.rb, line 209
def quiet_all_sidekiq_workers_cmd
  cmd = []
  return cmd unless stage_options.sidekiq_queues
  stage_options.sidekiq_queues.each do |name, options|
    cmd << "sudo systemctl kill -s USR1 --kill-who=main #{sidekiq_service_name(name)}"
  end
  cmd
end
quiet_all_workers_cmd() click to toggle source
# File lib/pvcglue/minion.rb, line 236
def quiet_all_workers_cmd
  quiet_all_sidekiq_workers_cmd.join('; ')
end
roles_to_sym() click to toggle source
# File lib/pvcglue/minion.rb, line 99
def roles_to_sym
  roles.map(&:to_sym)
end
sidekiq_service_file_name(name) click to toggle source
# File lib/pvcglue/minion.rb, line 200
def sidekiq_service_file_name(name) # /lib/systemd/system/pvc-sidekiq-project-stage-name.service
  "#{Pvcglue.cloud.service_directory}#{sidekiq_service_name(name)}#{Pvcglue.cloud.service_extension}"
end
sidekiq_service_name(name) click to toggle source
# File lib/pvcglue/minion.rb, line 204
def sidekiq_service_name(name) # pvc-sidekiq-project-stage-name
  "#{sidekiq_worker_base_name}#{name}"
end
sidekiq_worker_base_name() click to toggle source

def update_from(another_minion)

self.private_ip = another_minion.private_ip
self.public_ip = another_minion.public_ip
self.cloud_id = another_minion.cloud_id

end

# File lib/pvcglue/minion.rb, line 196
def sidekiq_worker_base_name # pvc-sidekiq-project-stage-
  "pvc-sidekiq-#{remote_user_name}-"
end
start_all_sidekiq_workers_cmd() click to toggle source
# File lib/pvcglue/minion.rb, line 227
def start_all_sidekiq_workers_cmd
  cmd = []
  return cmd unless stage_options.sidekiq_queues
  stage_options.sidekiq_queues.each do |name, options|
    cmd << "sudo systemctl start #{sidekiq_service_name(name)}"
  end
  cmd
end
start_all_workers_cmd() click to toggle source
# File lib/pvcglue/minion.rb, line 245
def start_all_workers_cmd
  start_all_sidekiq_workers_cmd.join(' && ')
end
stop_all_sidekiq_workers_cmd() click to toggle source
# File lib/pvcglue/minion.rb, line 218
def stop_all_sidekiq_workers_cmd
  cmd = []
  return cmd unless stage_options.sidekiq_queues
  stage_options.sidekiq_queues.each do |name, options|
    cmd << "sudo systemctl stop #{sidekiq_service_name(name)}"
  end
  cmd
end
stop_all_workers_cmd() click to toggle source
# File lib/pvcglue/minion.rb, line 241
def stop_all_workers_cmd
  stop_all_sidekiq_workers_cmd.join(' && ')
end