class GClouderUndefinedResources::RemoteResources::Resource

Attributes

data[RW]
name[RW]

Public Class Methods

new(name, data) click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 10
def initialize(name, data)
  if name.nil?
    ap data
    raise StandardError, "can't find name for resource"
  end

  @name = name
  @data = data
end

Public Instance Methods

custom_marker?(type) click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 107
def custom_marker?(type)
  filter.key?("marker")
end
defined?() click to toggle source

check for local regional and local global definitions

# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 59
def defined?
  local_resources = GClouderUndefinedResources.local_resources

  if global?
    local_resources.global?(type, name)
  else
    local_resources.regional?(region, type, name)
  end
end
filter() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 174
def filter
  @filter_rule
end
filter_description() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 136
def filter_description
  description = status_and_description[1]
  if description
    "# #{description}".gray
  else
    "# filter has no description".gray
  end
end
filtered?() click to toggle source

check to see if this resource has been filtered

# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 70
def filtered?
  unless CLIArgs.cli_args[:filter_config_given]
    puts "no filter config given" if CLIArgs.cli_args["verbose"]
    return false
  end

  unless filters.key?("filters")
    raise StandardError, "no filters key found in filter config"
  end

  original_type = @data["@type"]

  filters["filters"].each do |filter|
    if filter["region"] != region && filter["region"] != "*"
      next
    end

    if filter["zone"] != zone && filter["zone"] != "*"
      next
    end

    if filter["type"] != original_type && filter["type"] != "*"
      next
    end

    if (name !~ Regexp.new(filter["name"]) ? true : false) && filter["name"] != "*"
      next
    end

    @filter_rule = filter

    return true
  end

  false
end
formatted_filter_rule() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 193
def formatted_filter_rule
  filter.ai.gsub("\n", "\n          ").gsub(/^{/, "          {")
end
global?() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 46
def global?
  return true if zone.nil? && region.nil?
  #return true if @data.key?("location") && @data["location"] == "global"
  return unless @data.key?("selfLink")
  !@data["selfLink"].match(/.*\/projects\/[^\/]+\/global/).nil?
end
marker(marker, type) click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 111
def marker(marker, type)
  if filters.dig("markers", marker.to_s).nil?
    raise StandardError, "undefined marker type: #{marker}"
  end

  if filters.dig("markers", marker.to_s, type.to_s).nil?
    raise StandardError, "undefined type for marker '#{marker}': #{type}"
  end

  if filters.dig("markers", marker.to_s, type.to_s, "description")
    description = filters["markers"][marker.to_s][type.to_s]["description"]
  else
    description = nil
  end

  symbol = filters["markers"][marker.to_s][type.to_s]["symbol"]
  colour = filters["markers"][marker.to_s][type.to_s]["colour"]

  [symbol.send(colour), description]
end
region() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 22
def region
  # if location is set and its "global" then return..
  return if (@data.key?("location") && @data["location"] == "global")

  #match = @data["location"].downcase if @data.key?("location") && !match[1]
  puts @data["location"] if @data.key?("location")

  # if no selfLink exists then it's not possible to establish the region
  return unless @data.key?("selfLink")

  # establish region from from selfLink
  match = @data["selfLink"].match(/.*\/regions\/([^\/]+)/)
  return match[1] if match

  # if region cant be established but a zone exists, then take region from zone string
  zone[0..-3] if zone
end
status() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 132
def status
  status_and_description[0]
end
status_and_description() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 145
def status_and_description
  if self.defined? && !self.filtered?
    return marker(:unfiltered_default, :defined)
  end

  if !self.defined? && !self.filtered?
    return marker(:unfiltered_default, :undefined)
  end

  if self.defined? && self.filtered?
    if custom_marker?(:defined)
      return marker(filter["marker"], :defined)
    else
      return marker(:filtered_default, :defined)
    end
  end

  if !self.defined? && self.filtered?
    if custom_marker?(:undefined)
      return marker(filter["marker"], :undefined)
    else
      return marker(:filtered_default, :undefined)
    end
  end

  # shouldn't reach this
  raise StandardError, "there was a problem establishing resource state"
end
to_s() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 186
def to_s
  s = "#{status} #{name}"
  s += " #{filter_description}" if CLIArgs.cli_args[:show_filter_name] and filtered?
  s += "\n#{formatted_filter_rule}" if CLIArgs.cli_args[:show_filter_rule] and filtered?
  s
end
type() click to toggle source

type is the Remote version of Local path.., use this to check against local data structure

# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 54
def type
  @type ||= get_type
end
zone() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 40
def zone
  return unless @data.key?("selfLink")
  match = @data["selfLink"].match(/.*\/zones\/([^\/]+)/)
  match[1] if match
end

Private Instance Methods

filters() click to toggle source
# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 199
def filters
  @filters ||= YAML.load_file(CLIArgs.cli_args[:filter_config])
rescue => error
  puts "failed to load filter config: #{error}"
  exit 1
end
get_type() click to toggle source

FIXME - add more types

# File lib/gclouder_undefined_resources/remote_resources/resource.rb, line 207
def get_type
  case @data["@type"]
  when "serviceAccount"
    ["service_accounts"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/cloud.bigstore.api.Bucket"
    ["buckets"]

  when "type.googleapis.com/cloud.dns.api.ManagedZone"
    ["dns", "zones"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/cloud.resourcemanager.Organization"
    ["resource_manager", "organization"]

  when "type.googleapis.com/compute.BackendBucket"
    ["compute", "backend-buckets"]

  when "type.googleapis.com/compute.Disk"
    ["compute", "disks"]

  when "type.googleapis.com/compute.Firewall"
    ["firewall", "rules"]

  when "type.googleapis.com/compute.HealthCheck"
    ["compute", "health_check"]

  when "type.googleapis.com/compute.HttpHealthCheck"
    ["compute", "http_health_check"]

  when "type.googleapis.com/compute.HttpsHealthCheck"
    ["compute", "https_health_check"]

  when "type.googleapis.com/compute.Image"
    ["compute", "images"]

  when "type.googleapis.com/compute.Instance"
    ["compute", "instances"]

  when "type.googleapis.com/compute.InstanceTemplate"
    ["compute", "instance_templates"]

  when "type.googleapis.com/compute.Network"
    ["networks"]

  when "type.googleapis.com/compute.Router"
    ["compute", "router"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/compute.SslCertificate"
    ["compute", "ssl_certificate"]

  when "type.googleapis.com/compute.Subnetwork"
    ["subnets"]

  when "type.googleapis.com/compute.TargetHttpProxy"
    ["compute", "target_http_proxies"]

  when "type.googleapis.com/compute.TargetHttpsProxy"
    ["compute", "target_https_proxies"]

  when "type.googleapis.com/compute.UrlMap"
    ["compute", "url_maps"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.api.servicemanagement.v1.ManagedService"
    ["service_management", "service"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.appengine.v1.Application"
    ["app", "app"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.appengine.v1.Service"
    ["app", "service"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.appengine.v1.Version"
    ["app", "version"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.cloud.billing.v1.BillingAccount"
    ["billing", "account"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.cloud.dataproc.v1.Cluster"
    ["dataproc", "cluster"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.cloudresourcemanager.projects.v1beta1.Project"
    ["project"]

  # TODO: not yet implemented in gclouder
  when "type.googleapis.com/google.cloud.dataproc.v1.Job"
    ["dataproc", "job"]

  else
    puts "error: unknown or no '@type' property found for data:"
    ap @data
    exit 1
  end
end