require 'ostruct' module OpenShift module Ops class GceHelper MYDIR = File.expand_path(File.dirname(__FILE__)) def self.get_list() cmd = "#{MYDIR}/../inventory/gce/gce.py --list" hosts = %x[#{cmd} 2>&1] raise "Error: failed to list hosts\n#{hosts}" unless $?.exitstatus == 0 return JSON.parse(hosts) end def self.get_tag(tags, selector) tags.each do |tag| return $1 if tag =~ selector end return nil end def self.get_hosts() hosts = get_list() retval = [] hosts['_meta']['hostvars'].each do |host, info| retval << OpenStruct.new({ :name => info['gce_name'], :env => get_tag(info['gce_tags'], /^env-(\w+)$/) || 'UNSET', :public_ip => info['gce_public_ip'], :state => info['gce_status'], :created_by => get_tag(info['gce_tags'], /^created-by-(\w+)$/) || 'UNSET', }) end retval.sort_by! { |h| [h.env, h.state, h.name] } return retval end def self.get_host_details(host) cmd = "#{MYDIR}/../inventory/gce/gce.py --host #{host}" details = %x[#{cmd} 2>&1] raise "Error: failed to get host details\n#{details}" unless $?.exitstatus == 0 retval = JSON.parse(details) raise "Error: host not found [#{host}]" if retval.empty? # Convert OpenShift specific tags to entries retval['gce_tags'].each do |tag| if tag =~ /\Ahost-type-([\w\d-]+)\z/ retval['host-type'] = $1 end if tag =~ /\Aenv-([\w\d]+)\z/ retval['env'] = $1 end end return retval end def self.generate_env_tag(env) return "env-#{env}" end def self.generate_env_tag_name(env) return "tag_#{generate_env_tag(env)}" end def self.generate_host_type_tag(host_type) return "host-type-#{host_type}" end def self.generate_host_type_tag_name(host_type) return "tag_#{generate_host_type_tag(host_type)}" end def self.generate_env_host_type_tag(env, host_type) return "env-host-type-#{env}-#{host_type}" end def self.generate_env_host_type_tag_name(env, host_type) return "tag_#{generate_env_host_type_tag(env, host_type)}" end end end end