aws.rb 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # frozen_string_literal: true
  2. require 'accounts'
  3. require 'regions'
  4. require 'mime-types'
  5. require 'fog-aws'
  6. require 's3'
  7. require 'neo4j'
  8. require 'rds'
  9. require 'neoinfra/config'
  10. require 'neoinfra/cloudwatch'
  11. # NeoInfra Account information
  12. module NeoInfra
  13. # Provide informations about the accounts available
  14. class Aws
  15. def initialize
  16. @cfg = NeoInfra::Config.new
  17. neo4j_url = "http://#{@cfg.neo4j[:host]}:#{@cfg.neo4j[:port]}"
  18. Neo4j::Session.open(:server_db, neo4j_url)
  19. end
  20. def regions
  21. account = @cfg.accounts.first
  22. base_conf = {
  23. provider: 'AWS',
  24. aws_access_key_id: account[:key],
  25. aws_secret_access_key: account[:secret]
  26. }
  27. conn = Fog::Compute.new(base_conf)
  28. conn.describe_regions.data[:body]['regionInfo'].collect { |x| x['regionName'] }
  29. end
  30. def region_count
  31. Region.all.length
  32. end
  33. def az_count
  34. Az.all.length
  35. end
  36. def azs(region)
  37. account = @cfg.accounts.first
  38. base_conf = {
  39. provider: 'AWS',
  40. aws_access_key_id: account[:key],
  41. aws_secret_access_key: account[:secret],
  42. region: region
  43. }
  44. conn = Fog::Compute.new(base_conf)
  45. conn.describe_availability_zones.data[:body]['availabilityZoneInfo'].collect { |x| x['zoneName'] }
  46. end
  47. def load_regions
  48. regions.each do |region|
  49. next unless Region.where(region: region).empty?
  50. r = Region.new(
  51. region: region
  52. )
  53. r.save
  54. azs(region).each do |az|
  55. next unless Az.where(az: az).empty?
  56. a = Az.new(az: az)
  57. a.save
  58. AzRegion.create(from_node: a, to_node: Region.where(region: region).first)
  59. end
  60. end
  61. end
  62. def list_buckets
  63. buckets = []
  64. Bucket.all.order('n.size DESC').each do |b|
  65. buckets << {'name' => b.name,
  66. 'size' => b.size,
  67. 'region' => b.region.region,
  68. 'owner' => b.owner.name}
  69. end
  70. return buckets
  71. end
  72. def load_buckets
  73. cw = NeoInfra::Cloudwatch.new
  74. @cfg.accounts.each do |account|
  75. base_conf = {
  76. provider: 'AWS',
  77. aws_access_key_id: account[:key],
  78. aws_secret_access_key: account[:secret]
  79. }
  80. s = Fog::Storage.new(base_conf)
  81. s.directories.each do |bucket|
  82. next unless Bucket.where(name: bucket.key).empty?
  83. b = Bucket.new(
  84. name: bucket.key,
  85. size: cw.get_bucket_size(account[:key], account[:secret], bucket.location, bucket.key)
  86. )
  87. b.save
  88. BucketRegion.create(from_node: b, to_node: Region.where(region: bucket.location).first)
  89. BucketAccount.create(from_node: b, to_node: AwsAccount.where(name: account[:name]).first)
  90. end
  91. end
  92. end
  93. def load_security_groups
  94. @cfg.accounts.each do |account|
  95. base_conf = {
  96. provider: 'AWS',
  97. aws_access_key_id: account[:key],
  98. aws_secret_access_key: account[:secret]
  99. }
  100. self.regions.each do |region|
  101. region_conf = { region: region }
  102. conn = Fog::Compute.new(region_conf.merge(base_conf))
  103. conn.security_groups.all.each do |grp|
  104. next unless SecurityGroup.where(sg_id: grp.group_id).empty?
  105. g = SecurityGroup.new(
  106. sg_id: grp.group_id,
  107. name: grp.name,
  108. description: grp.description,
  109. )
  110. g.save
  111. SecurityGroupOwner.create(from_node: g, to_node: AwsAccount.where(account_id: grp.owner_id).first)
  112. SecurityGroupVpc.create(from_node: g, to_node: Vpc.where(vpc_id: grp.vpc_id).first)
  113. end
  114. end
  115. end
  116. end
  117. def load_rds
  118. @cfg.accounts.each do |account|
  119. base_conf = {
  120. aws_access_key_id: account[:key],
  121. aws_secret_access_key: account[:secret]
  122. }
  123. s = Fog::AWS::RDS.new(base_conf)
  124. s.servers.each do |rds|
  125. next unless Rds.where(name: rds.id).empty?
  126. r = Rds.new(
  127. name: rds.id,
  128. size: rds.flavor_id,
  129. engine: rds.engine,
  130. engine_version: rds.engine_version,
  131. multi_az: rds.multi_az.to_s,
  132. endpoint: rds.endpoint['Address'],
  133. port: rds.endpoint['Port'],
  134. allocated_storage: rds.allocated_storage,
  135. )
  136. r.save
  137. RdsAz.create(from_node: r, to_node: Az.where(az: rds.availability_zone).first)
  138. RdsAccount.create(from_node: r, to_node: AwsAccount.where(name: account[:name]).first)
  139. end
  140. end
  141. end
  142. end
  143. end