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