Advertisement
sasa2742002

Untitled

Sep 27th, 2023
649
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.06 KB | None | 0 0
  1. from venv import create
  2. import requests
  3. import json
  4. import boto3
  5.  
  6. database_name = ''
  7. db_cluster_arn = ''
  8. db_credentials_secrets_store_arn = ''
  9.  
  10.  
  11. def get_data(url, region_name):
  12.     response = requests.get(url)
  13.     data_info = response.json()
  14.  
  15.     if response.status_code == 200:
  16.         instances = []
  17.         region_data = data_info['regions'].get(region_name, {})
  18.  
  19.         for instance_name, instance_attributes in region_data.items():
  20.             instance = {
  21.                 'Instance Name': instance_name,
  22.                 'Rate Code': instance_attributes.get('rateCode', ''),
  23.                 'Price': instance_attributes.get('price', ''),
  24.                 'Location': instance_attributes.get('Location', ''),
  25.                 'Instance Family': instance_attributes.get('Instance Family', ''),
  26.                 'vCPU': instance_attributes.get('vCPU', ''),
  27.                 'Memory': instance_attributes.get('Memory', ''),
  28.                 'Storage': instance_attributes.get('Storage', ''),
  29.                 'Network Performance': instance_attributes.get('Network Performance', ''),
  30.                 'Operating System': instance_attributes.get('Operating System', ''),
  31.                 'Pre Installed S/W': instance_attributes.get('Pre Installed S/W', ''),
  32.                 'License Model': instance_attributes.get('License Model', ''),
  33.             }
  34.             instances.append(instance)
  35.  
  36.         return instances
  37.     else:
  38.         return None
  39.  
  40.  
  41. def north_america():
  42.     north_america_urls = [
  43.         ["US East (N. Virginia)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/US%20East%20(N.%20Virginia)/Linux/index.json?timestamp=1695335197182"],
  44.         ["US East (N. California)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/US%20West%20(N.%20California)/Linux/index.json?timestamp=1695335943885"],
  45.         ["US West (Oregon)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/US%20West%20(Oregon)/Linux/index.json?timestamp=1695336005767"],
  46.         ["Canada (Central)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Canada%20(Central)/Linux/index.json?timestamp=1695336038545"],
  47.         ["AWS GovCloud (US-East)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/AWS%20GovCloud%20(US-East)/Linux/index.json?timestamp=1695336076977"],
  48.         ["AWS GovCloud (US-West)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/AWS%20GovCloud%20(US)/Linux/index.json?timestamp=1695336143250"]
  49.     ]
  50.  
  51.     north_america = []
  52.     for region_info in north_america_urls:
  53.         region = region_info[0]
  54.         url = region_info[1]
  55.         data = get_data(url, region)
  56.         north_america.append(data)
  57.  
  58.     return north_america
  59.  
  60.  
  61. def africa():
  62.     africa_urls = [
  63.         ["Africa (Cape Town)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Africa%20(Cape%20Town)/Linux/index.json?timestamp=1695336201165"]
  64.     ]
  65.  
  66.     africa = []
  67.     for region_info in africa_urls:
  68.         region = region_info[0]
  69.         url = region_info[1]
  70.         data = get_data(url, region)
  71.         africa.append(data)
  72.  
  73.     return africa
  74.  
  75.  
  76. def asia_pacific():
  77.     asia_pacific = [
  78.         ["Asia Pacific (Hong Kong)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Hong%20Kong)/Linux/index.json?timestamp=1695336236566"],
  79.         ["Asia Pacific (Hyderabad)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Hyderabad)/Linux/index.json?timestamp=1695336267211"],
  80.         ["Asia Pacific (Jakarta)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Jakarta)/Linux/index.json?timestamp=1695336335452"],
  81.         ["Asia Pacific (Melbourne)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Melbourne)/Linux/index.json?timestamp=1695336377353"],
  82.         ["Asia Pacific (Mumbai)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Mumbai)/Linux/index.json?timestamp=1695336414559"],
  83.         ["Asia Pacific (Osaka)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Osaka)/Linux/index.json?timestamp=1695336448367"],
  84.         ["Asia Pacific (Seoul)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Seoul)/Linux/index.json?timestamp=1695336489384"],
  85.         ["Asia Pacific (Singapore)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Asia%20Pacific%20(Singapore)/Linux/index.json?timestamp=1695336516652"],
  86.         ["Asia Pacific (Sydney)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Australia%20(Sydney)/Linux/index.json?timestamp=1695336549342"],
  87.         ["Asia Pacific (Tokyo)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Australia%20(Tokyo)/Linux/index.json?timestamp=1695336572681"]
  88.     ]
  89.  
  90.     asia_pacific = []
  91.     for region_info in asia_pacific:
  92.         region = region_info[0]
  93.         url = region_info[1]
  94.         data = get_data(url, region)
  95.         asia_pacific.append(data)
  96.  
  97.     return asia_pacific
  98.  
  99.  
  100. def europe():
  101.     europe = [
  102.         ["Europe (Frankfurt)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Frankfurt)/Linux/index.json?timestamp=1695336606682"],
  103.         ["Europe (Ireland)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Ireland)/Linux/index.json?timestamp=1695336640824"],
  104.         ["Europe (London)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(London)/Linux/index.json?timestamp=1695336671834"],
  105.         ["Europe (Milan)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Milan)/Linux/index.json?timestamp=1695336709113"],
  106.         ["Europe (Paris)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Paris)/Linux/index.json?timestamp=1695336734334"],
  107.         ["Europe (Spain)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Spain)/Linux/index.json?timestamp=1695336756525"],
  108.         ["Europe (Stockholm)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Stockholm)/Linux/index.json?timestamp=1695336795677"],
  109.         ["Europe (Zurich)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/EU%20(Zurich)/Linux/index.json?timestamp=1695336817871"]
  110.     ]
  111.  
  112.     europe = []
  113.     for region_info in europe:
  114.         region = region_info[0]
  115.         url = region_info[1]
  116.         data = get_data(url, region)
  117.         europe.append(data)
  118.  
  119.     return europe
  120.  
  121.  
  122. def middle_east():
  123.     middle_east = [
  124.         ["Middle East (Bahrain)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Middle%20East%20(Bahrain)/Linux/index.json?timestamp=1695336880976"],
  125.         ["Middle East (UAE)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/Middle%20East%20(UAE)/Linux/index.json?timestamp=1695336906621"]
  126.     ]
  127.  
  128.     middle_east = []
  129.     for region_info in middle_east:
  130.         region = region_info[0]
  131.         url = region_info[1]
  132.         data = get_data(url, region)
  133.         middle_east.append(data)
  134.  
  135.     return middle_east
  136.  
  137.  
  138. def south_america():
  139.     south_america = [
  140.         ["South America (Sao Paulo)", "https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/South%20America%20(Sao%20Paulo)/Linux/index.json?timestamp=1695336944637"]
  141.     ]
  142.  
  143.     south_america = []
  144.     for region_info in south_america:
  145.         region = region_info[0]
  146.         url = region_info[1]
  147.         data = get_data(url, region)
  148.         south_america.append(data)
  149.  
  150.     return south_america
  151.  
  152.  
  153. database_name = ''
  154. db_cluster_arn = ''
  155. db_credentials_secrets_store_arn = ''
  156.  
  157. rds_client = boto3.client('rds')
  158.  
  159.  
  160. def excute_sql(sql, parameters=[]):
  161.     response = rds_client.execute_statement(
  162.    
  163.         secretArn=db_credentials_secrets_store_arn,
  164.         database=database_name,
  165.         resourceArn=db_cluster_arn,
  166.         sql=sql,
  167.         parameters = parameters
  168.     )
  169.     return response
  170.  
  171.  
  172. def create_tables_if_not_exists():
  173.  
  174.     regions = 'CREATE TABLE IF NOT EXISTS regions (region_id INT PRIMARY KEY,region_short_name VARCHAR(15),region_long_name VARCHAR(15));'
  175.     excute_sql(regions)
  176.  
  177.     operating_systems = 'CREATE TABLE IF NOT EXISTS operating_systems (operating_system_id INT PRIMARY KEY,operating_system_name VARCHAR(25));'
  178.     excute_sql(operating_systems)
  179.  
  180.     vcpu_cores = 'CREATE TABLE IF NOT EXISTS vcpu_cores (vcpu_id INT PRIMARY KEY,core_count INT);'
  181.     excute_sql(vcpu_cores)
  182.  
  183.     ec2_instances = 'CREATE TABLE IF NOT EXISTS ec2_instances (instance_id INT PRIMARY KEY,vcpu_id INT,memory INT,storage VARCHAR(20),network_performance DECIMAL(10, 5),operating_system_id INT,instance_name VARCHAR(15),FOREIGN KEY (vcpu_id) REFERENCES vcpu_cores(vcpu_id),FOREIGN KEY (operating_system_id) REFERENCES operating_systems(operating_system_id));'
  184.     excute_sql(ec2_instances)
  185.  
  186.     region_instances = 'CREATE TABLE IF NOT EXISTS region_instances (region_id INT,instance_id INT,price_per_hour DECIMAL(6, 4),FOREIGN KEY (region_id) REFERENCES regions(region_id),FOREIGN KEY (instance_id) REFERENCES ec2_instances(instance_id));'
  187.     excute_sql(region_instances)
  188.  
  189.     return
  190.  
  191.  
  192. def save_data(data):
  193.     # variables
  194.     instance_name = data['Instance Name']
  195.     memory = float(data['Memory'].replace(' GiB', ''))
  196.     storage = data['Storage']
  197.     network_performance = float(
  198.         data['Network Performance'].replace(' Gigabit', ''))
  199.     operating_system_name = data['Operating System']
  200.     vcpu_cores_count = int(data['vCPU'])
  201.     region_name = data['Location']
  202.     price = float(data['Price'].replace('$', ''))
  203.  
  204.     # sql
  205.     insert_region_sql = "INSERT INTO regions (region_long_name) VALUES (:region_name)"
  206.     insert_os_sql = "INSERT INTO operating_systems (operating_system_name) VALUES (:os_name)"
  207.     insert_vcpu_sql = "INSERT INTO vcpu_cores (core_count) VALUES (:core_count)"
  208.  
  209.     # parameters
  210.     region_params = [{"name": "region_long_name",
  211.                       "value": {"stringValue": region_name}}]
  212.     # {"name": "region_short_name", "value": {"stringValue": region_name}}]
  213.     os_params = [{"name": "os_name", "value": {
  214.         "stringValue": operating_system_name}}]
  215.     vcpu_params = [{"name": "core_count",
  216.                     "value": {"longValue": vcpu_cores_count}}]
  217.  
  218.     # excute_sql
  219.     excute_sql(insert_region_sql, region_params)
  220.     excute_sql(insert_os_sql, os_params)
  221.     excute_sql(insert_vcpu_sql, vcpu_params)
  222.  
  223.     # sql
  224.     select_region_sql = "SELECT region_id FROM regions WHERE region_long_name = :region_name"
  225.     select_os_sql = "SELECT operating_system_id FROM operating_systems WHERE operating_system_name = :os_name"
  226.     select_vcpu_sql = "SELECT vcpu_id FROM vcpu_cores WHERE core_count = :core_count"
  227.  
  228.     # excute_sql
  229.     region_id = excute_sql(select_region_sql, region_params)[
  230.         'records'][0][0]['longValue']
  231.     operating_system_id = excute_sql(select_os_sql, os_params)[
  232.         'records'][0][0]['longValue']
  233.     vcpu_id = excute_sql(select_vcpu_sql, vcpu_params)[
  234.         'records'][0][0]['longValue']
  235.  
  236.     # sql
  237.     instance_data = (instance_name, vcpu_id, memory, storage,
  238.                      network_performance, operating_system_id)
  239.     insert_instance_sql = "INSERT INTO ec2_instances (instance_name, vcpu_id, memory, storage, network_performance, operating_system_id) VALUES (:instance_name, :vcpu_id, :memory, :storage, :network_performance, :os_id)"
  240.  
  241.     # parameters
  242.     instance_params = [
  243.         {"name": "instance_name", "value": {"stringValue": instance_name}},
  244.         {"name": "vcpu_id", "value": {"longValue": vcpu_id}},
  245.         {"name": "memory", "value": {"doubleValue": memory}},
  246.         {"name": "storage", "value": {"stringValue": storage}},
  247.         {"name": "network_performance", "value": {
  248.             "doubleValue": network_performance}},
  249.         {"name": "os_id", "value": {"longValue": operating_system_id}}
  250.     ]
  251.  
  252.     # excute_sql
  253.     excute_sql(insert_instance_sql, instance_params)
  254.  
  255.     # sql
  256.     instance_id = excute_sql("SELECT LAST_INSERT_ID()")[
  257.         'records'][0][0]['instance_id']
  258.     insert_region_instance_sql = "INSERT INTO region_instances (region_id, instance_id, price_per_hour) VALUES (:region_id, :instance_id, :price_per_hour)"
  259.  
  260.     # parameters
  261.     region_instance_params = [
  262.         {"name": "region_id", "value": {"longValue": region_id}},
  263.         {"name": "instance_id", "value": {"longValue": instance_id}},
  264.         # {"name": "price_per_hour", "value": {"doubleValue": price_per_hour}}
  265.         # price_per_hour ???
  266.     ]
  267.  
  268.     # excute_sql
  269.     excute_sql(insert_region_instance_sql, region_instance_params)
  270.  
  271.     return
  272.  
  273.  
  274. def main():
  275. #    create_tables_if_not_exists()
  276.  
  277.     # north_america_data = north_america()
  278.     africa_data = africa()
  279.     # asia_pacific_data = asia_pacific()
  280.     # europe_data = europe()
  281.     # middle_east_data = middle_east()
  282.     # south_america_data = south_america()
  283.  
  284.     # save_data(africa_data)
  285.     # save_data(north_america_data)
  286.     # save_data(asia_pacific_data)
  287.     # save_data(europe_data)
  288.     # save_data(middle_east_data)
  289.     # save_data(south_america_data)
  290.  
  291.  
  292. main()
  293.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement