class Milc::Gcloud::Resource

Attributes

commands[R]
project[R]
resource[R]
service[R]

Public Class Methods

command_def_for(service, resource) click to toggle source
# File lib/milc/gcloud/resource.rb, line 18
def command_def_for(service, resource)
  c = command_defs
  s = c[service.to_s] or raise "service #{service.inspect} not found in #{c.keys.join(', ')}"
  s[resource.to_s] or raise "resource #{resource.inspect} not found in #{s.keys.join(' ')} of #{service.inspect}"
end
command_defs() click to toggle source
# File lib/milc/gcloud/resource.rb, line 14
def command_defs
  @command_defs ||= YAML.load_file(File.expand_path("../commands.yml", __FILE__))
end
lookup(project, service, resource) click to toggle source
# File lib/milc/gcloud/resource.rb, line 24
def lookup(project, service, resource)
  Milc.logger.debug("=" * 100)
  Milc.logger.debug("project: #{project}, service: #{service}, resource: #{resource}")
  service = service.to_s
  resource = resource.to_s
  command_def = command_def_for(service, resource)
  result = new(project, service, resource, command_def['commands'])
  service_module = Milc::Gcloud.const_get(service.classify)
  m = resource.gsub(/-/, '_').camelize.to_sym
  if service_module.constants.include?(m)
    resource_module = service_module.const_get(m)
    Milc.logger.debug("#{m} found as #{resource_module.inspect}")

    result.extend(resource_module)
  else
    Milc.logger.debug("#{m} not found in #{service_module.constants.inspect}")
  end
  result
end
new(project, service, resource, commands) click to toggle source
# File lib/milc/gcloud/resource.rb, line 46
def initialize(project, service, resource, commands)
  @project, @service, @resource = project, service, resource
  @commands = commands || []
end

Public Instance Methods

__gcloud(cmd, options = {}, &block) click to toggle source
# File lib/milc/gcloud/resource.rb, line 51
def __gcloud(cmd, options = {}, &block)
  c = "gcloud #{cmd} --format json"
  c << " --project #{project}" unless c =~ /\s\-\-project[\s\=]/
  res = Gcloud.backend.execute(c, options, &block)
  res ? JSON.parse(res) : nil
end
build_attr_arg(attr_name, value) click to toggle source
# File lib/milc/gcloud/resource.rb, line 58
def build_attr_arg(attr_name, value)
  "--#{attr_name.to_s.gsub(/\_/, '-')} #{value}"
end
build_attr_args(attrs) click to toggle source
# File lib/milc/gcloud/resource.rb, line 62
def build_attr_args(attrs)
  attrs.map{|k,v| build_attr_arg(k,v) }.join(" ")
end
build_sub_attr_args(attrs) click to toggle source
# File lib/milc/gcloud/resource.rb, line 66
def build_sub_attr_args(attrs)
  attrs.map{|k,v| "#{k.to_s.gsub(/\_/, '-')}=#{v}" }.join(",")
end
call_action(action, cmd_args, attrs = nil, &block) click to toggle source
# File lib/milc/gcloud/resource.rb, line 70
def call_action(action, cmd_args, attrs = nil, &block)
  attr_args = attrs.nil? ? '' : build_attr_args(attrs)
  options =
    action =~ /\Alist|\Adescribe|\Aget/ ?
      {returns: :stdout, logging: :stderr} :
      {returns: :none  , logging: :both}
  __gcloud("#{service} #{resource} #{action} #{cmd_args} #{attr_args}", options, &block)
end
call_update(cmd_args, attrs, &block) click to toggle source
# File lib/milc/gcloud/resource.rb, line 79
def call_update(cmd_args, attrs, &block)
  call_action(:update, cmd_args, attrs, &block)
end
compare(attrs, res) click to toggle source
# File lib/milc/gcloud/resource.rb, line 105
def compare(attrs, res)
  Milc.logger.debug("compare\n  attrs: #{attrs.inspect}\n   res: #{res.inspect}")
  res = normalize_keys(res)
  attrs.all?{|k,v| res[k.to_s.gsub(/-/, '_').to_sym] == v }
end
create(cmd_args, attrs, &block) click to toggle source
# File lib/milc/gcloud/resource.rb, line 116
def create(cmd_args, attrs, &block)
  raise_if_invalid(:create)
  name, args = *cmd_args.split(/\s+/, 2)
  r = find(name)
  if r
    return r unless commands.include?('update')
    if compare(attrs, r)
      return r
    else
      return call_update(cmd_args, attrs, &block)
    end
  else
    call_action(:create, cmd_args, attrs, &block)
  end
end
delete(cmd_args, attrs = {}, &block) click to toggle source
# File lib/milc/gcloud/resource.rb, line 141
def delete(cmd_args, attrs = {}, &block)
  raise_if_invalid(:delete)
  name, args = *cmd_args.split(/\s+/, 2)
  r = find(name)
  return nil unless r
  call_action(:delete, cmd_args, attrs, &block)
end
find(name) click to toggle source
# File lib/milc/gcloud/resource.rb, line 83
def find(name)
  r = call_action(:list, name)
  r ? r.first : nil
end
normalize_keys(obj) click to toggle source
# File lib/milc/gcloud/resource.rb, line 93
def normalize_keys(obj)
  case obj
  when Array then obj.map{|o| normalize_keys(o) }
  when Hash  then
    obj.each_with_object({}) do |(k,v), d|
      d[k.to_s.underscore.to_sym] = normalize_keys(v)
    end
  else
    obj
  end
end
raise_if_invalid(command) click to toggle source
# File lib/milc/gcloud/resource.rb, line 88
def raise_if_invalid(command)
  return if commands.include?(command.to_s)
  raise NotImplementedError, "#{service} #{resource} #{command} is not supported."
end
split_sort(str, spliter = /\s+/, &block) click to toggle source
# File lib/milc/gcloud/resource.rb, line 111
def split_sort(str, spliter = /\s+/, &block)
  return nil unless str
  str.split(spliter).sort(&block)
end
update(cmd_args, attrs, &block) click to toggle source
# File lib/milc/gcloud/resource.rb, line 132
def update(cmd_args, attrs, &block)
  raise_if_invalid(:update)
  name, args = *cmd_args.split(/\s+/, 2)
  r = find(name)
  raise "Resource not found #{service} #{resource} #{name}" unless r
  return r if compare(attrs, r)
  call_update(cmd_args, attrs, &block)
end