Skip to content

Commit 11fa6fd

Browse files
committed
add savings plans to frontend
1 parent ba13825 commit 11fa6fd

File tree

7 files changed

+72
-3
lines changed

7 files changed

+72
-3
lines changed

next/app/AWSClient.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import Filters from "@/components/Filters";
77
import { useMemo } from "react";
88
import dynamicallyDecompress from "@/utils/dynamicallyDecompress";
99
import { AtomKeyWhereInstanceIs } from "@/components/InstanceTable";
10-
import { reservedTermOptions } from "@/utils/dataMappings";
10+
import {
11+
reservedTermOptions,
12+
SupportedSavingsPlanOptions,
13+
} from "@/utils/dataMappings";
1114
import { MarketingSchema } from "@/schemas/marketing";
1215
import Advert from "@/components/Advert";
1316
import type { CurrencyItem } from "@/utils/loadCurrencies";
@@ -17,6 +20,7 @@ type RootProps<Instance extends { instance_type: string }> = {
1720
regions: Region;
1821
marketingData: MarketingSchema;
1922
currencies: CurrencyItem[];
23+
savingsPlanSupported?: SupportedSavingsPlanOptions[];
2024
};
2125

2226
type AWSClientProps<
@@ -103,8 +107,15 @@ export default function AWSClient<
103107
<Filters
104108
columnAtomKey={props.columnAtomKey}
105109
regions={props.regions}
106-
reservedTermOptions={reservedTermOptions}
110+
reservedTermOptions={reservedTermOptions(
111+
props.savingsPlanSupported,
112+
)}
107113
currencies={props.currencies}
114+
reservedLabel={
115+
props.savingsPlanSupported
116+
? "Reserved/Savings Plan"
117+
: undefined
118+
}
108119
/>
109120
<div className="flex-1 min-h-0">
110121
<InstanceTable

next/app/aws/ec2/[slug]/page.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ export async function generateMetadata({
107107
}
108108

109109
const reservedTermOptions: [string, string][] = [
110+
["Savings.noUpfront", "No Upfront (Savings Plan)"],
111+
["Savings.partialUpfront", "Partial Upfront (Savings Plan)"],
112+
["Savings.allUpfront", "All Upfront (Savings Plan)"],
110113
["Standard.noUpfront", "No Upfront"],
111114
["Standard.partialUpfront", "Partial Upfront"],
112115
["Standard.allUpfront", "All Upfront"],

next/app/aws/rds/[slug]/page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ export async function generateMetadata({
8989
}
9090

9191
const reservedTermOptions: [string, string][] = [
92+
["Savings.noUpfront", "No Upfront (Savings Plan)"],
9293
["Standard.noUpfront", "No Upfront"],
9394
["Standard.partialUpfront", "Partial Upfront"],
9495
["Standard.allUpfront", "All Upfront"],

next/app/page.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ export default async function Home() {
5151
compressedInstances={compressedInstances}
5252
compressedDataPathTemplate={`/remaining-instances-p{}.msgpack.xz?cache=${instancesHash}`}
5353
columnAtomKey="ec2"
54+
savingsPlanSupported={[
55+
"yrTerm1Savings.noUpfront",
56+
"yrTerm1Savings.partialUpfront",
57+
"yrTerm1Savings.allUpfront",
58+
"yrTerm3Savings.noUpfront",
59+
"yrTerm3Savings.partialUpfront",
60+
"yrTerm3Savings.allUpfront",
61+
]}
5462
/>
5563
</>
5664
);

next/app/rds/page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export default async function RDS() {
4949
compressedDataPathTemplate={`/remaining-rds-instances.msgpack.xz?cache=${instancesHash}`}
5050
columnAtomKey="rds"
5151
marketingData={marketingData}
52+
savingsPlanSupported={["yrTerm1Savings.noUpfront"]}
5253
/>
5354
</>
5455
);

next/llms/generateAwsInstances.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ const tableColumns = [
99
["spot_min", "Spot Min"],
1010
["spot_avg", "Spot Avg"],
1111
["spot_max", "Spot Max"],
12+
["yrTerm1Savings.noUpfront", "1yr No Upfront (Savings Plan)"],
13+
["yrTerm1Savings.partialUpfront", "1yr Partial Upfront (Savings Plan)"],
14+
["yrTerm1Savings.allUpfront", "1yr All Upfront (Savings Plan)"],
15+
["yrTerm3Savings.noUpfront", "3yr No Upfront (Savings Plan)"],
16+
["yrTerm3Savings.partialUpfront", "3yr Partial Upfront (Savings Plan)"],
17+
["yrTerm3Savings.allUpfront", "3yr All Upfront (Savings Plan)"],
1218
["yrTerm1Standard.noUpfront", "1yr No Upfront"],
1319
["yrTerm1Standard.partialUpfront", "1yr Partial Upfront"],
1420
["yrTerm1Standard.allUpfront", "1yr All Upfront"],
@@ -118,6 +124,12 @@ function generateInstanceMarkdown(
118124
region,
119125
instance.pricing[region]?.[platform]?.[column],
120126
);
127+
case "yrTerm1Savings.noUpfront":
128+
case "yrTerm1Savings.partialUpfront":
129+
case "yrTerm1Savings.allUpfront":
130+
case "yrTerm3Savings.noUpfront":
131+
case "yrTerm3Savings.partialUpfront":
132+
case "yrTerm3Savings.allUpfront":
121133
case "yrTerm1Standard.noUpfront":
122134
case "yrTerm1Standard.partialUpfront":
123135
case "yrTerm1Standard.allUpfront":

next/utils/dataMappings.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const durationOptions: { value: CostDuration; label: string }[] = [
1717
{ value: "annually", label: "Annually" },
1818
] as const;
1919

20-
export const reservedTermOptions = [
20+
const sharedReservedTermOptions = [
2121
{ value: "yrTerm1Standard.noUpfront", label: "1-year - No Upfront" },
2222
{
2323
value: "yrTerm1Standard.partialUpfront",
@@ -55,3 +55,36 @@ export const reservedTermOptions = [
5555
label: "3-year convertible - Full Upfront",
5656
},
5757
];
58+
59+
const savingsPlanExtras = {
60+
"yrTerm1Savings.noUpfront": "1-year Savings Plan - No Upfront",
61+
"yrTerm1Savings.partialUpfront": "1-year Savings Plan - Partial Upfront",
62+
"yrTerm1Savings.allUpfront": "1-year Savings Plan - Full Upfront",
63+
"yrTerm3Savings.noUpfront": "3-year Savings Plan - No Upfront",
64+
"yrTerm3Savings.partialUpfront": "3-year Savings Plan - Partial Upfront",
65+
"yrTerm3Savings.allUpfront": "3-year Savings Plan - Full Upfront",
66+
};
67+
68+
const savingsPlanCache = new Map<string, { value: string; label: string }[]>();
69+
70+
export type SupportedSavingsPlanOptions = keyof typeof savingsPlanExtras;
71+
72+
export const reservedTermOptions = (
73+
savingsPlanSupported: SupportedSavingsPlanOptions[] | undefined,
74+
) => {
75+
if (!savingsPlanSupported) return sharedReservedTermOptions;
76+
const key = savingsPlanSupported.join(",");
77+
const cached = savingsPlanCache.get(key);
78+
if (cached) return cached;
79+
80+
const extras: { value: string; label: string }[] = [];
81+
for (const sp of savingsPlanSupported) {
82+
const label = savingsPlanExtras[sp];
83+
if (label) {
84+
extras.push({ value: sp, label });
85+
}
86+
}
87+
const options = [...extras, ...sharedReservedTermOptions];
88+
savingsPlanCache.set(key, options);
89+
return options;
90+
};

0 commit comments

Comments
 (0)