in k8s/pricing.py [0:0]
def get_reserved(region, instance_type):
"""Get savings plans rates for a specific instance type in a region."""
savingsplans_client = boto3.client("savingsplans", region_name="us-east-1")
def request():
results = []
nt = None
while True:
kwargs = dict(
filters=[
{"name": "instanceType", "values": [instance_type]},
{"name": "region", "values": [region]},
{"name": "tenancy", "values": ["shared"]},
{"name": "productDescription", "values": ["Linux/UNIX"]},
],
serviceCodes=["AmazonEC2"],
)
if nt:
kwargs["nextToken"] = nt
response = (
savingsplans_client.describe_savings_plans_offering_rates(
**kwargs
)
)
results.extend(response["searchResults"])
if len(response["nextToken"]) > 0:
nt = response["nextToken"]
else:
break
return results
try:
results = request()
rates = {
"1.0y": {"no": None, "partial": None, "all": None},
"3.0y": {"no": None, "partial": None, "all": None},
}
for result in results:
# Skip unused box entries
if "UnusedBox" in result["usageType"]:
continue
duration_seconds = result["savingsPlanOffering"]["durationSeconds"]
duration_years = duration_seconds / (365 * 24 * 60 * 60)
key = f"{duration_years:.1f}y"
payment_option = (
result["savingsPlanOffering"]["paymentOption"]
.lower()
.split()[0]
) # 'no', 'partial', or 'all'
rate = float(result["rate"])
if key in rates:
rates[key][payment_option] = rate
return (
rates
if any(
any(v is not None for v in year.values())
for year in rates.values()
)
else None
)
except Exception as e:
print(
f"Error getting reserved cost for {instance_type} in {region}: {str(e)}"
)
return None