service-capacity-modeling 0.3.94__py3-none-any.whl → 0.3.98__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json +10 -37
- service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_rds.json +159 -0
- service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_zz-overrides.json +1 -9
- service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r6g.json +95 -0
- service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r6i.json +121 -0
- service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r7g.json +95 -0
- service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r7i.json +121 -0
- service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json +2 -2
- service_capacity_modeling/tools/auto_shape.py +247 -34
- service_capacity_modeling/tools/fetch_pricing.py +81 -19
- {service_capacity_modeling-0.3.94.dist-info → service_capacity_modeling-0.3.98.dist-info}/METADATA +1 -1
- {service_capacity_modeling-0.3.94.dist-info → service_capacity_modeling-0.3.98.dist-info}/RECORD +16 -11
- {service_capacity_modeling-0.3.94.dist-info → service_capacity_modeling-0.3.98.dist-info}/WHEEL +1 -1
- {service_capacity_modeling-0.3.94.dist-info → service_capacity_modeling-0.3.98.dist-info}/entry_points.txt +0 -0
- {service_capacity_modeling-0.3.94.dist-info → service_capacity_modeling-0.3.98.dist-info}/licenses/LICENSE +0 -0
- {service_capacity_modeling-0.3.94.dist-info → service_capacity_modeling-0.3.98.dist-info}/top_level.txt +0 -0
|
@@ -632,15 +632,6 @@
|
|
|
632
632
|
"dl1.24xlarge": {
|
|
633
633
|
"annual_cost": 43178.0
|
|
634
634
|
},
|
|
635
|
-
"f1.16xlarge": {
|
|
636
|
-
"annual_cost": 50230.0
|
|
637
|
-
},
|
|
638
|
-
"f1.2xlarge": {
|
|
639
|
-
"annual_cost": 6278.67
|
|
640
|
-
},
|
|
641
|
-
"f1.4xlarge": {
|
|
642
|
-
"annual_cost": 12557.33
|
|
643
|
-
},
|
|
644
635
|
"g4ad.16xlarge": {
|
|
645
636
|
"annual_cost": 13331.67
|
|
646
637
|
},
|
|
@@ -1574,26 +1565,20 @@
|
|
|
1574
1565
|
"m8g.xlarge": {
|
|
1575
1566
|
"annual_cost": 621.0
|
|
1576
1567
|
},
|
|
1577
|
-
"p3.16xlarge": {
|
|
1578
|
-
"annual_cost": 69054.67
|
|
1579
|
-
},
|
|
1580
|
-
"p3.2xlarge": {
|
|
1581
|
-
"annual_cost": 8631.67
|
|
1582
|
-
},
|
|
1583
|
-
"p3.8xlarge": {
|
|
1584
|
-
"annual_cost": 34527.33
|
|
1585
|
-
},
|
|
1586
1568
|
"p3dn.24xlarge": {
|
|
1587
1569
|
"annual_cost": 79416.67
|
|
1588
1570
|
},
|
|
1589
1571
|
"p4d.24xlarge": {
|
|
1590
|
-
"annual_cost":
|
|
1572
|
+
"annual_cost": 71473.33
|
|
1591
1573
|
},
|
|
1592
1574
|
"p4de.24xlarge": {
|
|
1593
|
-
"annual_cost":
|
|
1575
|
+
"annual_cost": 89341.67
|
|
1594
1576
|
},
|
|
1595
1577
|
"p5.48xlarge": {
|
|
1596
|
-
"annual_cost":
|
|
1578
|
+
"annual_cost": 181288.67
|
|
1579
|
+
},
|
|
1580
|
+
"p5.4xlarge": {
|
|
1581
|
+
"annual_cost": 22661.0
|
|
1597
1582
|
},
|
|
1598
1583
|
"r3.2xlarge": {
|
|
1599
1584
|
"annual_cost": 2043.33
|
|
@@ -2303,15 +2288,6 @@
|
|
|
2303
2288
|
"trn1n.32xlarge": {
|
|
2304
2289
|
"annual_cost": 70804.67
|
|
2305
2290
|
},
|
|
2306
|
-
"u-12tb1.112xlarge": {
|
|
2307
|
-
"annual_cost": 267960.67
|
|
2308
|
-
},
|
|
2309
|
-
"u-18tb1.112xlarge": {
|
|
2310
|
-
"annual_cost": 401266.33
|
|
2311
|
-
},
|
|
2312
|
-
"u-24tb1.112xlarge": {
|
|
2313
|
-
"annual_cost": 535022.0
|
|
2314
|
-
},
|
|
2315
2291
|
"u-3tb1.56xlarge": {
|
|
2316
2292
|
"annual_cost": 66877.67
|
|
2317
2293
|
},
|
|
@@ -2321,20 +2297,17 @@
|
|
|
2321
2297
|
"u-6tb1.56xlarge": {
|
|
2322
2298
|
"annual_cost": 113677.33
|
|
2323
2299
|
},
|
|
2324
|
-
"u-9tb1.112xlarge": {
|
|
2325
|
-
"annual_cost": 200970.33
|
|
2326
|
-
},
|
|
2327
2300
|
"u7i-12tb.224xlarge": {
|
|
2328
|
-
"annual_cost":
|
|
2301
|
+
"annual_cost": 308159.0
|
|
2329
2302
|
},
|
|
2330
2303
|
"u7in-16tb.224xlarge": {
|
|
2331
|
-
"annual_cost":
|
|
2304
|
+
"annual_cost": 442117.0
|
|
2332
2305
|
},
|
|
2333
2306
|
"u7in-24tb.224xlarge": {
|
|
2334
|
-
"annual_cost":
|
|
2307
|
+
"annual_cost": 663219.67
|
|
2335
2308
|
},
|
|
2336
2309
|
"u7in-32tb.224xlarge": {
|
|
2337
|
-
"annual_cost":
|
|
2310
|
+
"annual_cost": 884322.0
|
|
2338
2311
|
},
|
|
2339
2312
|
"vt1.24xlarge": {
|
|
2340
2313
|
"annual_cost": 17127.67
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
{
|
|
2
|
+
"us-east-1": {
|
|
3
|
+
"drives": {},
|
|
4
|
+
"instances": {
|
|
5
|
+
"db.r5.12xlarge": {
|
|
6
|
+
"annual_cost": 21258.0
|
|
7
|
+
},
|
|
8
|
+
"db.r5.16xlarge": {
|
|
9
|
+
"annual_cost": 28344.0
|
|
10
|
+
},
|
|
11
|
+
"db.r5.24xlarge": {
|
|
12
|
+
"annual_cost": 42516.0
|
|
13
|
+
},
|
|
14
|
+
"db.r5.2xlarge": {
|
|
15
|
+
"annual_cost": 3543.0
|
|
16
|
+
},
|
|
17
|
+
"db.r5.4xlarge": {
|
|
18
|
+
"annual_cost": 7086.0
|
|
19
|
+
},
|
|
20
|
+
"db.r5.8xlarge": {
|
|
21
|
+
"annual_cost": 14172.0
|
|
22
|
+
},
|
|
23
|
+
"db.r5.large": {
|
|
24
|
+
"annual_cost": 885.67
|
|
25
|
+
},
|
|
26
|
+
"db.r5.xlarge": {
|
|
27
|
+
"annual_cost": 1771.33
|
|
28
|
+
},
|
|
29
|
+
"db.r6g.12xlarge": {
|
|
30
|
+
"annual_cost": 19024.0
|
|
31
|
+
},
|
|
32
|
+
"db.r6g.16xlarge": {
|
|
33
|
+
"annual_cost": 25365.33
|
|
34
|
+
},
|
|
35
|
+
"db.r6g.2xlarge": {
|
|
36
|
+
"annual_cost": 3170.67
|
|
37
|
+
},
|
|
38
|
+
"db.r6g.4xlarge": {
|
|
39
|
+
"annual_cost": 6341.33
|
|
40
|
+
},
|
|
41
|
+
"db.r6g.8xlarge": {
|
|
42
|
+
"annual_cost": 12682.67
|
|
43
|
+
},
|
|
44
|
+
"db.r6g.large": {
|
|
45
|
+
"annual_cost": 792.67
|
|
46
|
+
},
|
|
47
|
+
"db.r6g.xlarge": {
|
|
48
|
+
"annual_cost": 1585.33
|
|
49
|
+
},
|
|
50
|
+
"db.r6gd.12xlarge": {
|
|
51
|
+
"annual_cost": 34765.33
|
|
52
|
+
},
|
|
53
|
+
"db.r6gd.16xlarge": {
|
|
54
|
+
"annual_cost": 46353.67
|
|
55
|
+
},
|
|
56
|
+
"db.r6gd.2xlarge": {
|
|
57
|
+
"annual_cost": 5794.33
|
|
58
|
+
},
|
|
59
|
+
"db.r6gd.4xlarge": {
|
|
60
|
+
"annual_cost": 11588.33
|
|
61
|
+
},
|
|
62
|
+
"db.r6gd.8xlarge": {
|
|
63
|
+
"annual_cost": 23177.0
|
|
64
|
+
},
|
|
65
|
+
"db.r6gd.xlarge": {
|
|
66
|
+
"annual_cost": 2897.0
|
|
67
|
+
},
|
|
68
|
+
"db.r6i.12xlarge": {
|
|
69
|
+
"annual_cost": 21256.0
|
|
70
|
+
},
|
|
71
|
+
"db.r6i.16xlarge": {
|
|
72
|
+
"annual_cost": 28341.33
|
|
73
|
+
},
|
|
74
|
+
"db.r6i.24xlarge": {
|
|
75
|
+
"annual_cost": 42512.0
|
|
76
|
+
},
|
|
77
|
+
"db.r6i.2xlarge": {
|
|
78
|
+
"annual_cost": 3542.67
|
|
79
|
+
},
|
|
80
|
+
"db.r6i.32xlarge": {
|
|
81
|
+
"annual_cost": 56682.67
|
|
82
|
+
},
|
|
83
|
+
"db.r6i.4xlarge": {
|
|
84
|
+
"annual_cost": 7085.33
|
|
85
|
+
},
|
|
86
|
+
"db.r6i.8xlarge": {
|
|
87
|
+
"annual_cost": 14170.67
|
|
88
|
+
},
|
|
89
|
+
"db.r6i.large": {
|
|
90
|
+
"annual_cost": 885.67
|
|
91
|
+
},
|
|
92
|
+
"db.r6i.xlarge": {
|
|
93
|
+
"annual_cost": 1771.33
|
|
94
|
+
},
|
|
95
|
+
"db.r6id.24xlarge": {
|
|
96
|
+
"annual_cost": 77553.33
|
|
97
|
+
},
|
|
98
|
+
"db.r6id.32xlarge": {
|
|
99
|
+
"annual_cost": 103404.33
|
|
100
|
+
},
|
|
101
|
+
"db.r7g.12xlarge": {
|
|
102
|
+
"annual_cost": 30796.33
|
|
103
|
+
},
|
|
104
|
+
"db.r7g.16xlarge": {
|
|
105
|
+
"annual_cost": 41061.67
|
|
106
|
+
},
|
|
107
|
+
"db.r7g.2xlarge": {
|
|
108
|
+
"annual_cost": 5132.67
|
|
109
|
+
},
|
|
110
|
+
"db.r7g.4xlarge": {
|
|
111
|
+
"annual_cost": 10265.33
|
|
112
|
+
},
|
|
113
|
+
"db.r7g.8xlarge": {
|
|
114
|
+
"annual_cost": 20530.67
|
|
115
|
+
},
|
|
116
|
+
"db.r7g.large": {
|
|
117
|
+
"annual_cost": 1283.33
|
|
118
|
+
},
|
|
119
|
+
"db.r7g.xlarge": {
|
|
120
|
+
"annual_cost": 2566.33
|
|
121
|
+
},
|
|
122
|
+
"db.t3.large": {
|
|
123
|
+
"annual_cost": 622.67
|
|
124
|
+
},
|
|
125
|
+
"db.t3.medium": {
|
|
126
|
+
"annual_cost": 311.33
|
|
127
|
+
},
|
|
128
|
+
"db.t4g.large": {
|
|
129
|
+
"annual_cost": 550.0
|
|
130
|
+
},
|
|
131
|
+
"db.t4g.medium": {
|
|
132
|
+
"annual_cost": 275.0
|
|
133
|
+
},
|
|
134
|
+
"db.x2g.12xlarge": {
|
|
135
|
+
"annual_cost": 27726.33
|
|
136
|
+
},
|
|
137
|
+
"db.x2g.16xlarge": {
|
|
138
|
+
"annual_cost": 36968.67
|
|
139
|
+
},
|
|
140
|
+
"db.x2g.2xlarge": {
|
|
141
|
+
"annual_cost": 4621.0
|
|
142
|
+
},
|
|
143
|
+
"db.x2g.4xlarge": {
|
|
144
|
+
"annual_cost": 9242.0
|
|
145
|
+
},
|
|
146
|
+
"db.x2g.8xlarge": {
|
|
147
|
+
"annual_cost": 18484.33
|
|
148
|
+
},
|
|
149
|
+
"db.x2g.large": {
|
|
150
|
+
"annual_cost": 1155.33
|
|
151
|
+
},
|
|
152
|
+
"db.x2g.xlarge": {
|
|
153
|
+
"annual_cost": 2310.67
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
"services": {},
|
|
157
|
+
"zones_in_region": 3
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -3,15 +3,7 @@
|
|
|
3
3
|
"instances": {
|
|
4
4
|
"f5.large.deprecated": {"annual_cost": 300.0, "lifecycle": "deprecated"},
|
|
5
5
|
"m6id.4xlarge": {"annual_cost": 3126.64},
|
|
6
|
-
"m6id.xlarge": {"annual_cost": 781.66}
|
|
7
|
-
"db.r5.large": {"annual_cost": 885.7},
|
|
8
|
-
"db.r5.xlarge": {"annual_cost": 1771.3},
|
|
9
|
-
"db.r5.2xlarge": {"annual_cost": 3543},
|
|
10
|
-
"db.r5.4xlarge": {"annual_cost": 7086},
|
|
11
|
-
"db.r5.8xlarge": {"annual_cost": 14171.7},
|
|
12
|
-
"db.r5.12xlarge": {"annual_cost": 21258},
|
|
13
|
-
"db.r5.16xlarge": {"annual_cost": 28343.3},
|
|
14
|
-
"db.r5.24xlarge": {"annual_cost": 42516}
|
|
6
|
+
"m6id.xlarge": {"annual_cost": 781.66}
|
|
15
7
|
},
|
|
16
8
|
"drives": {
|
|
17
9
|
"gp2": {"annual_cost_per_gib": 1.2},
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"instances": {
|
|
3
|
+
"db.r6g.large": {
|
|
4
|
+
"name": "db.r6g.large",
|
|
5
|
+
"cpu": 2,
|
|
6
|
+
"cpu_cores": 2,
|
|
7
|
+
"cpu_ghz": 2.5,
|
|
8
|
+
"cpu_ipc_scale": 1.5,
|
|
9
|
+
"ram_gib": 15.26,
|
|
10
|
+
"net_mbps": 750.0,
|
|
11
|
+
"drive": null,
|
|
12
|
+
"platforms": [
|
|
13
|
+
"Aurora PostgreSQL"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"db.r6g.xlarge": {
|
|
17
|
+
"name": "db.r6g.xlarge",
|
|
18
|
+
"cpu": 4,
|
|
19
|
+
"cpu_cores": 4,
|
|
20
|
+
"cpu_ghz": 2.5,
|
|
21
|
+
"cpu_ipc_scale": 1.5,
|
|
22
|
+
"ram_gib": 30.52,
|
|
23
|
+
"net_mbps": 1250.0,
|
|
24
|
+
"drive": null,
|
|
25
|
+
"platforms": [
|
|
26
|
+
"Aurora PostgreSQL"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"db.r6g.2xlarge": {
|
|
30
|
+
"name": "db.r6g.2xlarge",
|
|
31
|
+
"cpu": 8,
|
|
32
|
+
"cpu_cores": 8,
|
|
33
|
+
"cpu_ghz": 2.5,
|
|
34
|
+
"cpu_ipc_scale": 1.5,
|
|
35
|
+
"ram_gib": 61.04,
|
|
36
|
+
"net_mbps": 2500.0,
|
|
37
|
+
"drive": null,
|
|
38
|
+
"platforms": [
|
|
39
|
+
"Aurora PostgreSQL"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"db.r6g.4xlarge": {
|
|
43
|
+
"name": "db.r6g.4xlarge",
|
|
44
|
+
"cpu": 16,
|
|
45
|
+
"cpu_cores": 16,
|
|
46
|
+
"cpu_ghz": 2.5,
|
|
47
|
+
"cpu_ipc_scale": 1.5,
|
|
48
|
+
"ram_gib": 122.07,
|
|
49
|
+
"net_mbps": 5000.0,
|
|
50
|
+
"drive": null,
|
|
51
|
+
"platforms": [
|
|
52
|
+
"Aurora PostgreSQL"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"db.r6g.8xlarge": {
|
|
56
|
+
"name": "db.r6g.8xlarge",
|
|
57
|
+
"cpu": 32,
|
|
58
|
+
"cpu_cores": 32,
|
|
59
|
+
"cpu_ghz": 2.5,
|
|
60
|
+
"cpu_ipc_scale": 1.5,
|
|
61
|
+
"ram_gib": 244.14,
|
|
62
|
+
"net_mbps": 12000.0,
|
|
63
|
+
"drive": null,
|
|
64
|
+
"platforms": [
|
|
65
|
+
"Aurora PostgreSQL"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"db.r6g.12xlarge": {
|
|
69
|
+
"name": "db.r6g.12xlarge",
|
|
70
|
+
"cpu": 48,
|
|
71
|
+
"cpu_cores": 48,
|
|
72
|
+
"cpu_ghz": 2.5,
|
|
73
|
+
"cpu_ipc_scale": 1.5,
|
|
74
|
+
"ram_gib": 366.21,
|
|
75
|
+
"net_mbps": 20000.0,
|
|
76
|
+
"drive": null,
|
|
77
|
+
"platforms": [
|
|
78
|
+
"Aurora PostgreSQL"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"db.r6g.16xlarge": {
|
|
82
|
+
"name": "db.r6g.16xlarge",
|
|
83
|
+
"cpu": 64,
|
|
84
|
+
"cpu_cores": 64,
|
|
85
|
+
"cpu_ghz": 2.5,
|
|
86
|
+
"cpu_ipc_scale": 1.5,
|
|
87
|
+
"ram_gib": 488.28,
|
|
88
|
+
"net_mbps": 25000.0,
|
|
89
|
+
"drive": null,
|
|
90
|
+
"platforms": [
|
|
91
|
+
"Aurora PostgreSQL"
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"instances": {
|
|
3
|
+
"db.r6i.large": {
|
|
4
|
+
"name": "db.r6i.large",
|
|
5
|
+
"cpu": 2,
|
|
6
|
+
"cpu_cores": 1,
|
|
7
|
+
"cpu_ghz": 3.5,
|
|
8
|
+
"cpu_ipc_scale": 1.0,
|
|
9
|
+
"ram_gib": 15.26,
|
|
10
|
+
"net_mbps": 781.0,
|
|
11
|
+
"drive": null,
|
|
12
|
+
"platforms": [
|
|
13
|
+
"Aurora PostgreSQL"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"db.r6i.xlarge": {
|
|
17
|
+
"name": "db.r6i.xlarge",
|
|
18
|
+
"cpu": 4,
|
|
19
|
+
"cpu_cores": 2,
|
|
20
|
+
"cpu_ghz": 3.5,
|
|
21
|
+
"cpu_ipc_scale": 1.0,
|
|
22
|
+
"ram_gib": 30.52,
|
|
23
|
+
"net_mbps": 1562.0,
|
|
24
|
+
"drive": null,
|
|
25
|
+
"platforms": [
|
|
26
|
+
"Aurora PostgreSQL"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"db.r6i.2xlarge": {
|
|
30
|
+
"name": "db.r6i.2xlarge",
|
|
31
|
+
"cpu": 8,
|
|
32
|
+
"cpu_cores": 4,
|
|
33
|
+
"cpu_ghz": 3.5,
|
|
34
|
+
"cpu_ipc_scale": 1.0,
|
|
35
|
+
"ram_gib": 61.04,
|
|
36
|
+
"net_mbps": 3125.0,
|
|
37
|
+
"drive": null,
|
|
38
|
+
"platforms": [
|
|
39
|
+
"Aurora PostgreSQL"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"db.r6i.4xlarge": {
|
|
43
|
+
"name": "db.r6i.4xlarge",
|
|
44
|
+
"cpu": 16,
|
|
45
|
+
"cpu_cores": 8,
|
|
46
|
+
"cpu_ghz": 3.5,
|
|
47
|
+
"cpu_ipc_scale": 1.0,
|
|
48
|
+
"ram_gib": 122.07,
|
|
49
|
+
"net_mbps": 6250.0,
|
|
50
|
+
"drive": null,
|
|
51
|
+
"platforms": [
|
|
52
|
+
"Aurora PostgreSQL"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"db.r6i.8xlarge": {
|
|
56
|
+
"name": "db.r6i.8xlarge",
|
|
57
|
+
"cpu": 32,
|
|
58
|
+
"cpu_cores": 16,
|
|
59
|
+
"cpu_ghz": 3.5,
|
|
60
|
+
"cpu_ipc_scale": 1.0,
|
|
61
|
+
"ram_gib": 244.14,
|
|
62
|
+
"net_mbps": 12500.0,
|
|
63
|
+
"drive": null,
|
|
64
|
+
"platforms": [
|
|
65
|
+
"Aurora PostgreSQL"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"db.r6i.12xlarge": {
|
|
69
|
+
"name": "db.r6i.12xlarge",
|
|
70
|
+
"cpu": 48,
|
|
71
|
+
"cpu_cores": 24,
|
|
72
|
+
"cpu_ghz": 3.5,
|
|
73
|
+
"cpu_ipc_scale": 1.0,
|
|
74
|
+
"ram_gib": 366.21,
|
|
75
|
+
"net_mbps": 18750.0,
|
|
76
|
+
"drive": null,
|
|
77
|
+
"platforms": [
|
|
78
|
+
"Aurora PostgreSQL"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"db.r6i.16xlarge": {
|
|
82
|
+
"name": "db.r6i.16xlarge",
|
|
83
|
+
"cpu": 64,
|
|
84
|
+
"cpu_cores": 32,
|
|
85
|
+
"cpu_ghz": 3.5,
|
|
86
|
+
"cpu_ipc_scale": 1.0,
|
|
87
|
+
"ram_gib": 488.28,
|
|
88
|
+
"net_mbps": 25000.0,
|
|
89
|
+
"drive": null,
|
|
90
|
+
"platforms": [
|
|
91
|
+
"Aurora PostgreSQL"
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
"db.r6i.24xlarge": {
|
|
95
|
+
"name": "db.r6i.24xlarge",
|
|
96
|
+
"cpu": 96,
|
|
97
|
+
"cpu_cores": 48,
|
|
98
|
+
"cpu_ghz": 3.5,
|
|
99
|
+
"cpu_ipc_scale": 1.0,
|
|
100
|
+
"ram_gib": 732.42,
|
|
101
|
+
"net_mbps": 37500.0,
|
|
102
|
+
"drive": null,
|
|
103
|
+
"platforms": [
|
|
104
|
+
"Aurora PostgreSQL"
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
"db.r6i.32xlarge": {
|
|
108
|
+
"name": "db.r6i.32xlarge",
|
|
109
|
+
"cpu": 128,
|
|
110
|
+
"cpu_cores": 64,
|
|
111
|
+
"cpu_ghz": 3.5,
|
|
112
|
+
"cpu_ipc_scale": 1.0,
|
|
113
|
+
"ram_gib": 976.56,
|
|
114
|
+
"net_mbps": 50000.0,
|
|
115
|
+
"drive": null,
|
|
116
|
+
"platforms": [
|
|
117
|
+
"Aurora PostgreSQL"
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"instances": {
|
|
3
|
+
"db.r7g.large": {
|
|
4
|
+
"name": "db.r7g.large",
|
|
5
|
+
"cpu": 2,
|
|
6
|
+
"cpu_cores": 2,
|
|
7
|
+
"cpu_ghz": 2.6,
|
|
8
|
+
"cpu_ipc_scale": 1.5,
|
|
9
|
+
"ram_gib": 15.26,
|
|
10
|
+
"net_mbps": 937.0,
|
|
11
|
+
"drive": null,
|
|
12
|
+
"platforms": [
|
|
13
|
+
"Aurora PostgreSQL"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"db.r7g.xlarge": {
|
|
17
|
+
"name": "db.r7g.xlarge",
|
|
18
|
+
"cpu": 4,
|
|
19
|
+
"cpu_cores": 4,
|
|
20
|
+
"cpu_ghz": 2.6,
|
|
21
|
+
"cpu_ipc_scale": 1.5,
|
|
22
|
+
"ram_gib": 30.52,
|
|
23
|
+
"net_mbps": 1876.0,
|
|
24
|
+
"drive": null,
|
|
25
|
+
"platforms": [
|
|
26
|
+
"Aurora PostgreSQL"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"db.r7g.2xlarge": {
|
|
30
|
+
"name": "db.r7g.2xlarge",
|
|
31
|
+
"cpu": 8,
|
|
32
|
+
"cpu_cores": 8,
|
|
33
|
+
"cpu_ghz": 2.6,
|
|
34
|
+
"cpu_ipc_scale": 1.5,
|
|
35
|
+
"ram_gib": 61.04,
|
|
36
|
+
"net_mbps": 3750.0,
|
|
37
|
+
"drive": null,
|
|
38
|
+
"platforms": [
|
|
39
|
+
"Aurora PostgreSQL"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"db.r7g.4xlarge": {
|
|
43
|
+
"name": "db.r7g.4xlarge",
|
|
44
|
+
"cpu": 16,
|
|
45
|
+
"cpu_cores": 16,
|
|
46
|
+
"cpu_ghz": 2.6,
|
|
47
|
+
"cpu_ipc_scale": 1.5,
|
|
48
|
+
"ram_gib": 122.07,
|
|
49
|
+
"net_mbps": 7500.0,
|
|
50
|
+
"drive": null,
|
|
51
|
+
"platforms": [
|
|
52
|
+
"Aurora PostgreSQL"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"db.r7g.8xlarge": {
|
|
56
|
+
"name": "db.r7g.8xlarge",
|
|
57
|
+
"cpu": 32,
|
|
58
|
+
"cpu_cores": 32,
|
|
59
|
+
"cpu_ghz": 2.6,
|
|
60
|
+
"cpu_ipc_scale": 1.5,
|
|
61
|
+
"ram_gib": 244.14,
|
|
62
|
+
"net_mbps": 15000.0,
|
|
63
|
+
"drive": null,
|
|
64
|
+
"platforms": [
|
|
65
|
+
"Aurora PostgreSQL"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"db.r7g.12xlarge": {
|
|
69
|
+
"name": "db.r7g.12xlarge",
|
|
70
|
+
"cpu": 48,
|
|
71
|
+
"cpu_cores": 48,
|
|
72
|
+
"cpu_ghz": 2.6,
|
|
73
|
+
"cpu_ipc_scale": 1.5,
|
|
74
|
+
"ram_gib": 366.21,
|
|
75
|
+
"net_mbps": 22500.0,
|
|
76
|
+
"drive": null,
|
|
77
|
+
"platforms": [
|
|
78
|
+
"Aurora PostgreSQL"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"db.r7g.16xlarge": {
|
|
82
|
+
"name": "db.r7g.16xlarge",
|
|
83
|
+
"cpu": 64,
|
|
84
|
+
"cpu_cores": 64,
|
|
85
|
+
"cpu_ghz": 2.6,
|
|
86
|
+
"cpu_ipc_scale": 1.5,
|
|
87
|
+
"ram_gib": 488.28,
|
|
88
|
+
"net_mbps": 30000.0,
|
|
89
|
+
"drive": null,
|
|
90
|
+
"platforms": [
|
|
91
|
+
"Aurora PostgreSQL"
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"instances": {
|
|
3
|
+
"db.r7i.large": {
|
|
4
|
+
"name": "db.r7i.large",
|
|
5
|
+
"cpu": 2,
|
|
6
|
+
"cpu_cores": 1,
|
|
7
|
+
"cpu_ghz": 3.2,
|
|
8
|
+
"cpu_ipc_scale": 1.25,
|
|
9
|
+
"ram_gib": 15.26,
|
|
10
|
+
"net_mbps": 781.0,
|
|
11
|
+
"drive": null,
|
|
12
|
+
"platforms": [
|
|
13
|
+
"Aurora PostgreSQL"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"db.r7i.xlarge": {
|
|
17
|
+
"name": "db.r7i.xlarge",
|
|
18
|
+
"cpu": 4,
|
|
19
|
+
"cpu_cores": 2,
|
|
20
|
+
"cpu_ghz": 3.2,
|
|
21
|
+
"cpu_ipc_scale": 1.25,
|
|
22
|
+
"ram_gib": 30.52,
|
|
23
|
+
"net_mbps": 1562.0,
|
|
24
|
+
"drive": null,
|
|
25
|
+
"platforms": [
|
|
26
|
+
"Aurora PostgreSQL"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"db.r7i.2xlarge": {
|
|
30
|
+
"name": "db.r7i.2xlarge",
|
|
31
|
+
"cpu": 8,
|
|
32
|
+
"cpu_cores": 4,
|
|
33
|
+
"cpu_ghz": 3.2,
|
|
34
|
+
"cpu_ipc_scale": 1.25,
|
|
35
|
+
"ram_gib": 61.04,
|
|
36
|
+
"net_mbps": 3125.0,
|
|
37
|
+
"drive": null,
|
|
38
|
+
"platforms": [
|
|
39
|
+
"Aurora PostgreSQL"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"db.r7i.4xlarge": {
|
|
43
|
+
"name": "db.r7i.4xlarge",
|
|
44
|
+
"cpu": 16,
|
|
45
|
+
"cpu_cores": 8,
|
|
46
|
+
"cpu_ghz": 3.2,
|
|
47
|
+
"cpu_ipc_scale": 1.25,
|
|
48
|
+
"ram_gib": 122.07,
|
|
49
|
+
"net_mbps": 6250.0,
|
|
50
|
+
"drive": null,
|
|
51
|
+
"platforms": [
|
|
52
|
+
"Aurora PostgreSQL"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"db.r7i.8xlarge": {
|
|
56
|
+
"name": "db.r7i.8xlarge",
|
|
57
|
+
"cpu": 32,
|
|
58
|
+
"cpu_cores": 16,
|
|
59
|
+
"cpu_ghz": 3.2,
|
|
60
|
+
"cpu_ipc_scale": 1.25,
|
|
61
|
+
"ram_gib": 244.14,
|
|
62
|
+
"net_mbps": 12500.0,
|
|
63
|
+
"drive": null,
|
|
64
|
+
"platforms": [
|
|
65
|
+
"Aurora PostgreSQL"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"db.r7i.12xlarge": {
|
|
69
|
+
"name": "db.r7i.12xlarge",
|
|
70
|
+
"cpu": 48,
|
|
71
|
+
"cpu_cores": 24,
|
|
72
|
+
"cpu_ghz": 3.2,
|
|
73
|
+
"cpu_ipc_scale": 1.25,
|
|
74
|
+
"ram_gib": 366.21,
|
|
75
|
+
"net_mbps": 18750.0,
|
|
76
|
+
"drive": null,
|
|
77
|
+
"platforms": [
|
|
78
|
+
"Aurora PostgreSQL"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"db.r7i.16xlarge": {
|
|
82
|
+
"name": "db.r7i.16xlarge",
|
|
83
|
+
"cpu": 64,
|
|
84
|
+
"cpu_cores": 32,
|
|
85
|
+
"cpu_ghz": 3.2,
|
|
86
|
+
"cpu_ipc_scale": 1.25,
|
|
87
|
+
"ram_gib": 488.28,
|
|
88
|
+
"net_mbps": 25000.0,
|
|
89
|
+
"drive": null,
|
|
90
|
+
"platforms": [
|
|
91
|
+
"Aurora PostgreSQL"
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
"db.r7i.24xlarge": {
|
|
95
|
+
"name": "db.r7i.24xlarge",
|
|
96
|
+
"cpu": 96,
|
|
97
|
+
"cpu_cores": 48,
|
|
98
|
+
"cpu_ghz": 3.2,
|
|
99
|
+
"cpu_ipc_scale": 1.25,
|
|
100
|
+
"ram_gib": 732.42,
|
|
101
|
+
"net_mbps": 37500.0,
|
|
102
|
+
"drive": null,
|
|
103
|
+
"platforms": [
|
|
104
|
+
"Aurora PostgreSQL"
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
"db.r7i.48xlarge": {
|
|
108
|
+
"name": "db.r7i.48xlarge",
|
|
109
|
+
"cpu": 192,
|
|
110
|
+
"cpu_cores": 96,
|
|
111
|
+
"cpu_ghz": 3.2,
|
|
112
|
+
"cpu_ipc_scale": 1.25,
|
|
113
|
+
"ram_gib": 1464.84,
|
|
114
|
+
"net_mbps": 50000.0,
|
|
115
|
+
"drive": null,
|
|
116
|
+
"platforms": [
|
|
117
|
+
"Aurora PostgreSQL"
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -378,7 +378,7 @@
|
|
|
378
378
|
"cpu": 64,
|
|
379
379
|
"cpu_ghz": 3.1,
|
|
380
380
|
"ram_gib": 512,
|
|
381
|
-
"net_mbps":
|
|
381
|
+
"net_mbps": 20000,
|
|
382
382
|
"drive": null,
|
|
383
383
|
"platforms": ["Aurora MySQL","Aurora PostgreSQL"]
|
|
384
384
|
},
|
|
@@ -387,7 +387,7 @@
|
|
|
387
387
|
"cpu": 96,
|
|
388
388
|
"cpu_ghz": 3.1,
|
|
389
389
|
"ram_gib": 768,
|
|
390
|
-
"net_mbps":
|
|
390
|
+
"net_mbps": 25000,
|
|
391
391
|
"drive": null,
|
|
392
392
|
"platforms": ["Aurora MySQL","Aurora PostgreSQL"]
|
|
393
393
|
}
|
|
@@ -110,6 +110,42 @@ def _gb_to_gib(inp: float) -> int:
|
|
|
110
110
|
return int(round((inp * 10**9) / 2.0**30))
|
|
111
111
|
|
|
112
112
|
|
|
113
|
+
def deduce_cpu_ipc_scale(
|
|
114
|
+
vcpu_count: int,
|
|
115
|
+
cpu_cores: int,
|
|
116
|
+
cpu_perf: Optional[CPUPerformance] = None,
|
|
117
|
+
) -> float:
|
|
118
|
+
"""
|
|
119
|
+
Deduce CPU IPC scale factor from vCPU and core counts.
|
|
120
|
+
If all vCPUs are full cores (no SMT), use 1.5, otherwise 1.0.
|
|
121
|
+
"""
|
|
122
|
+
if cpu_perf is not None and cpu_perf.ipc_scale_factor is not None:
|
|
123
|
+
return cpu_perf.ipc_scale_factor
|
|
124
|
+
if vcpu_count == cpu_cores:
|
|
125
|
+
return 1.5
|
|
126
|
+
return 1.0
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def convert_mib_to_gib(size_mib: float) -> float:
|
|
130
|
+
"""Convert AWS MiB memory size to GiB."""
|
|
131
|
+
return round(size_mib * 10**6 / 2.0**30, 2)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def convert_gbps_to_mbps(bandwidth_gbps: float) -> float:
|
|
135
|
+
"""Convert AWS Gbps network bandwidth to Mbps."""
|
|
136
|
+
return round(bandwidth_gbps * 1000)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _engine_to_platform(engine: str) -> str:
|
|
140
|
+
"""
|
|
141
|
+
Map RDS engine name to Platform enum value.
|
|
142
|
+
Currently only supports aurora-postgresql.
|
|
143
|
+
"""
|
|
144
|
+
if engine == "aurora-postgresql":
|
|
145
|
+
return "aurora_postgres"
|
|
146
|
+
raise ValueError(f"Engine '{engine}' is not supported")
|
|
147
|
+
|
|
148
|
+
|
|
113
149
|
def _drive(
|
|
114
150
|
drive_type: DriveType,
|
|
115
151
|
io_perf: Optional[IOPerformance],
|
|
@@ -233,24 +269,19 @@ def pull_family(
|
|
|
233
269
|
print(name)
|
|
234
270
|
|
|
235
271
|
drive = _drive(disk_type, io_perf, scale=normalized_size, data=data)
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
if data["VCpuInfo"].get("DefaultThreadsPerCore", 2) == 1:
|
|
240
|
-
cpu_ipc_scale_factor = 1.5
|
|
241
|
-
else:
|
|
242
|
-
cpu_ipc_scale_factor = 1.0
|
|
272
|
+
vcpu_count = data["VCpuInfo"]["DefaultVCpus"]
|
|
273
|
+
cpu_cores = data["VCpuInfo"]["DefaultCores"]
|
|
274
|
+
cpu_ipc_scale_factor = deduce_cpu_ipc_scale(vcpu_count, cpu_cores, cpu_perf)
|
|
243
275
|
|
|
244
276
|
new_shape = Instance(
|
|
245
277
|
name=data["InstanceType"],
|
|
246
|
-
cpu=
|
|
247
|
-
cpu_cores=
|
|
278
|
+
cpu=vcpu_count,
|
|
279
|
+
cpu_cores=cpu_cores,
|
|
248
280
|
cpu_ghz=data["ProcessorInfo"]["SustainedClockSpeedInGhz"],
|
|
249
281
|
cpu_ipc_scale=cpu_ipc_scale_factor,
|
|
250
|
-
ram_gib=
|
|
251
|
-
net_mbps=
|
|
282
|
+
ram_gib=convert_mib_to_gib(data["MemoryInfo"]["SizeInMiB"]),
|
|
283
|
+
net_mbps=convert_gbps_to_mbps(
|
|
252
284
|
data["NetworkInfo"]["NetworkCards"][0]["BaselineBandwidthInGbps"]
|
|
253
|
-
* 10**3
|
|
254
285
|
),
|
|
255
286
|
drive=drive,
|
|
256
287
|
)
|
|
@@ -260,6 +291,124 @@ def pull_family(
|
|
|
260
291
|
return results
|
|
261
292
|
|
|
262
293
|
|
|
294
|
+
def lookup_ec2_instance_specs(
|
|
295
|
+
ec2_client: Any,
|
|
296
|
+
instance_type: str,
|
|
297
|
+
debug: bool = False,
|
|
298
|
+
) -> Tuple[int, int, float, float, float]:
|
|
299
|
+
"""
|
|
300
|
+
Look up EC2 instance specifications.
|
|
301
|
+
Returns: (vcpu_count, cpu_cores, cpu_ghz, ram_gib, net_mbps)
|
|
302
|
+
Returns zeros/defaults if lookup fails.
|
|
303
|
+
"""
|
|
304
|
+
try:
|
|
305
|
+
ec2_response = ec2_client.describe_instance_types(InstanceTypes=[instance_type])
|
|
306
|
+
if ec2_response["InstanceTypes"]:
|
|
307
|
+
ec2_data = ec2_response["InstanceTypes"][0]
|
|
308
|
+
vcpu_count = ec2_data["VCpuInfo"]["DefaultVCpus"]
|
|
309
|
+
cpu_cores = ec2_data["VCpuInfo"]["DefaultCores"]
|
|
310
|
+
cpu_ghz = ec2_data["ProcessorInfo"]["SustainedClockSpeedInGhz"]
|
|
311
|
+
ram_gib = convert_mib_to_gib(ec2_data["MemoryInfo"]["SizeInMiB"])
|
|
312
|
+
net_mbps = convert_gbps_to_mbps(
|
|
313
|
+
ec2_data["NetworkInfo"]["NetworkCards"][0]["BaselineBandwidthInGbps"]
|
|
314
|
+
)
|
|
315
|
+
if debug:
|
|
316
|
+
print(
|
|
317
|
+
f"Looked up {instance_type} -> {vcpu_count} vCPUs, "
|
|
318
|
+
f"{cpu_cores} cores, {cpu_ghz} GHz, {ram_gib} GiB, {net_mbps} Mbps",
|
|
319
|
+
file=sys.stderr,
|
|
320
|
+
)
|
|
321
|
+
return vcpu_count, cpu_cores, cpu_ghz, ram_gib, net_mbps
|
|
322
|
+
else:
|
|
323
|
+
raise RuntimeError("No EC2 instance types returned")
|
|
324
|
+
except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e:
|
|
325
|
+
if debug:
|
|
326
|
+
print(
|
|
327
|
+
f"WARNING: Could not look up {instance_type}: {e}. Using defaults.",
|
|
328
|
+
file=sys.stderr,
|
|
329
|
+
)
|
|
330
|
+
return 0, 0, 2.5, 0.0, 1000.0
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def pull_rds_family( # pylint: disable=too-many-locals
|
|
334
|
+
rds_client: Any,
|
|
335
|
+
family: str,
|
|
336
|
+
db_engines: Sequence[str],
|
|
337
|
+
cpu_perf: Optional[CPUPerformance] = None,
|
|
338
|
+
debug: bool = False,
|
|
339
|
+
) -> Sequence[Instance]:
|
|
340
|
+
"""
|
|
341
|
+
Pull RDS Instance shapes from AWS RDS APIs.
|
|
342
|
+
Queries describe_orderable_db_instance_options for the specified engines
|
|
343
|
+
and family, then constructs Instance objects with appropriate platform tags.
|
|
344
|
+
Returns a list of Instance for hardware shapes.
|
|
345
|
+
"""
|
|
346
|
+
|
|
347
|
+
def debug_log(msg: str) -> None:
|
|
348
|
+
if debug:
|
|
349
|
+
print(msg, file=sys.stderr)
|
|
350
|
+
|
|
351
|
+
ec2_client = boto3.client("ec2", region_name=rds_client.meta.region_name)
|
|
352
|
+
instance_data_map = {}
|
|
353
|
+
for engine in db_engines:
|
|
354
|
+
debug_log(f"Querying RDS API for engine={engine}, family=db.{family}.*")
|
|
355
|
+
paginator = rds_client.get_paginator("describe_orderable_db_instance_options")
|
|
356
|
+
page_iterator = paginator.paginate(Engine=engine)
|
|
357
|
+
for page in page_iterator:
|
|
358
|
+
for option in page["OrderableDBInstanceOptions"]:
|
|
359
|
+
db_instance_class = option["DBInstanceClass"]
|
|
360
|
+
if not db_instance_class.startswith(f"db.{family}."):
|
|
361
|
+
continue
|
|
362
|
+
if db_instance_class not in instance_data_map:
|
|
363
|
+
instance_data_map[db_instance_class] = {
|
|
364
|
+
"data": option,
|
|
365
|
+
"platforms": set(),
|
|
366
|
+
}
|
|
367
|
+
platform = _engine_to_platform(engine)
|
|
368
|
+
instance_data_map[db_instance_class]["platforms"].add(platform)
|
|
369
|
+
if not instance_data_map:
|
|
370
|
+
print(
|
|
371
|
+
f"ERROR: No RDS instances found for family 'db.{family}' "
|
|
372
|
+
f"with engines {db_engines}",
|
|
373
|
+
file=sys.stderr,
|
|
374
|
+
)
|
|
375
|
+
return []
|
|
376
|
+
debug_log(f"Found {len(instance_data_map)} unique instance classes")
|
|
377
|
+
results = []
|
|
378
|
+
for db_instance_class, info in instance_data_map.items():
|
|
379
|
+
option = info["data"]
|
|
380
|
+
platforms = sorted(info["platforms"])
|
|
381
|
+
_, size = db_instance_class.rsplit(".", 1)
|
|
382
|
+
ec2_instance_type = f"{family}.{size}"
|
|
383
|
+
vcpu_count, cpu_cores, cpu_ghz, ram_gib, net_mbps = lookup_ec2_instance_specs(
|
|
384
|
+
ec2_client, ec2_instance_type, debug
|
|
385
|
+
)
|
|
386
|
+
cpu_ipc_scale_factor = deduce_cpu_ipc_scale(vcpu_count, cpu_cores, cpu_perf)
|
|
387
|
+
debug_log(
|
|
388
|
+
f"{db_instance_class}: cpu={vcpu_count}, cores={cpu_cores}, "
|
|
389
|
+
f"ghz={cpu_ghz}, ram={ram_gib} GiB, net={net_mbps} Mbps, "
|
|
390
|
+
f"platforms={platforms}"
|
|
391
|
+
)
|
|
392
|
+
from service_capacity_modeling.interface import Platform
|
|
393
|
+
|
|
394
|
+
new_instance = Instance(
|
|
395
|
+
name=db_instance_class,
|
|
396
|
+
cpu=vcpu_count,
|
|
397
|
+
cpu_cores=cpu_cores,
|
|
398
|
+
cpu_ghz=cpu_ghz,
|
|
399
|
+
cpu_ipc_scale=cpu_ipc_scale_factor,
|
|
400
|
+
ram_gib=ram_gib,
|
|
401
|
+
net_mbps=net_mbps,
|
|
402
|
+
drive=None,
|
|
403
|
+
platforms=[Platform[p] for p in platforms],
|
|
404
|
+
)
|
|
405
|
+
results.append(new_instance)
|
|
406
|
+
results = sorted(
|
|
407
|
+
results, key=lambda i: normalized_aws_size(i.name.replace("db.", ""))
|
|
408
|
+
)
|
|
409
|
+
return results
|
|
410
|
+
|
|
411
|
+
|
|
263
412
|
def parse_iops(inp: Optional[str]) -> Optional[Tuple[int, int]]:
|
|
264
413
|
"""Parses strings like 100,000/50,000 to (100000, 50000)"""
|
|
265
414
|
if inp is None:
|
|
@@ -278,6 +427,19 @@ def parse_iops(inp: Optional[str]) -> Optional[Tuple[int, int]]:
|
|
|
278
427
|
)
|
|
279
428
|
|
|
280
429
|
|
|
430
|
+
def parse_db_engines(engines_str: str) -> Sequence[str]:
|
|
431
|
+
"""Parse comma-separated database engines. Currently only aurora-postgresql is supported."""
|
|
432
|
+
engines = [e.strip() for e in engines_str.split(",")]
|
|
433
|
+
supported_engines = {"aurora-postgresql"}
|
|
434
|
+
for engine in engines:
|
|
435
|
+
if engine not in supported_engines:
|
|
436
|
+
raise argparse.ArgumentTypeError(
|
|
437
|
+
f"Database engine '{engine}' is not implemented yet. "
|
|
438
|
+
f"Currently supported: {', '.join(sorted(supported_engines))}"
|
|
439
|
+
)
|
|
440
|
+
return engines
|
|
441
|
+
|
|
442
|
+
|
|
281
443
|
def _parse_family(family: str) -> Tuple[str, int, str]:
|
|
282
444
|
series = family[0]
|
|
283
445
|
num = re.findall(r"\d+", family)
|
|
@@ -348,23 +510,53 @@ def deduce_cpu_perf(
|
|
|
348
510
|
|
|
349
511
|
def main(args: Any) -> int:
|
|
350
512
|
for family in args.families:
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
513
|
+
is_rds = family.startswith("db.")
|
|
514
|
+
if is_rds:
|
|
515
|
+
rds_family = family[3:]
|
|
516
|
+
if not args.db_engines:
|
|
517
|
+
print(
|
|
518
|
+
f"ERROR: Family '{family}' appears to be RDS (starts with 'db.'), "
|
|
519
|
+
"but --db-engines was not specified. Please provide "
|
|
520
|
+
"--db-engines with comma-separated list like 'aurora-postgresql'",
|
|
521
|
+
file=sys.stderr,
|
|
522
|
+
)
|
|
523
|
+
return 1
|
|
524
|
+
if args.xl_iops or args.io_latency_curve != "ssd":
|
|
525
|
+
print(
|
|
526
|
+
"WARNING: --xl-iops and --io-latency-curve are ignored for RDS "
|
|
527
|
+
"instances (db.* families) as they use managed storage.",
|
|
528
|
+
file=sys.stderr,
|
|
529
|
+
)
|
|
530
|
+
cpu_perf = deduce_cpu_perf(
|
|
531
|
+
family=rds_family,
|
|
532
|
+
ipc_scale_factor=args.cpu_ipc_scale,
|
|
533
|
+
)
|
|
534
|
+
rds_client = boto3.client("rds", region_name=args.region)
|
|
535
|
+
family_shapes = pull_rds_family(
|
|
536
|
+
rds_client=rds_client,
|
|
537
|
+
family=rds_family,
|
|
538
|
+
db_engines=args.db_engines,
|
|
539
|
+
cpu_perf=cpu_perf,
|
|
540
|
+
debug=args.debug,
|
|
541
|
+
)
|
|
542
|
+
output_filename = f"auto_db_{rds_family}.json"
|
|
543
|
+
else:
|
|
544
|
+
io_perf = deduce_io_perf(
|
|
545
|
+
family=family, curve=args.io_latency_curve, iops=args.xl_iops
|
|
546
|
+
)
|
|
547
|
+
cpu_perf = deduce_cpu_perf(
|
|
548
|
+
family=family,
|
|
549
|
+
ipc_scale_factor=args.cpu_ipc_scale,
|
|
550
|
+
)
|
|
551
|
+
ec2_client = boto3.client("ec2", region_name=args.region)
|
|
552
|
+
family_shapes = pull_family(
|
|
553
|
+
ec2_client=ec2_client,
|
|
554
|
+
family=family,
|
|
555
|
+
cpu_perf=cpu_perf,
|
|
556
|
+
io_perf=io_perf,
|
|
557
|
+
debug=args.debug,
|
|
558
|
+
)
|
|
559
|
+
output_filename = f"auto_{family}.json"
|
|
368
560
|
json_shapes: Dict[str, Dict[str, Any]] = {"instances": {}}
|
|
369
561
|
for shape in family_shapes:
|
|
370
562
|
model_dict = shape.model_dump(exclude_unset=True)
|
|
@@ -377,23 +569,19 @@ def main(args: Any) -> int:
|
|
|
377
569
|
and "annual_cost" in model_dict["drive"]
|
|
378
570
|
):
|
|
379
571
|
del model_dict["drive"]["annual_cost"]
|
|
380
|
-
|
|
381
572
|
json_shapes["instances"][shape.name] = model_dict
|
|
382
|
-
|
|
383
573
|
print(f"[{family}] Hardware Shapes", file=sys.stderr)
|
|
384
574
|
print(json.dumps(json_shapes, indent=2))
|
|
385
|
-
|
|
386
575
|
# Write to JSON file if requested
|
|
387
576
|
if args.output_path is not None:
|
|
388
577
|
path: Path = args.output_path
|
|
389
578
|
if path.is_dir():
|
|
390
|
-
output_path = Path(path,
|
|
579
|
+
output_path = Path(path, output_filename)
|
|
391
580
|
else:
|
|
392
581
|
output_path = path
|
|
393
582
|
with open(output_path, "wt", encoding="utf-8") as fd:
|
|
394
583
|
json.dump(json_shapes, fd, indent=2)
|
|
395
584
|
fd.write("\n")
|
|
396
|
-
|
|
397
585
|
return 0
|
|
398
586
|
|
|
399
587
|
|
|
@@ -417,6 +605,21 @@ if __name__ == "__main__":
|
|
|
417
605
|
for offering in offerings:
|
|
418
606
|
families.add(offering["InstanceType"].rsplit(".", 1)[0])
|
|
419
607
|
|
|
608
|
+
try:
|
|
609
|
+
rds_client = boto3.client("rds", region_name="us-east-1")
|
|
610
|
+
paginator = rds_client.get_paginator("describe_orderable_db_instance_options")
|
|
611
|
+
page_iterator = paginator.paginate(Engine="aurora-postgresql")
|
|
612
|
+
for page in page_iterator:
|
|
613
|
+
for option in page["OrderableDBInstanceOptions"]:
|
|
614
|
+
db_instance_class = option["DBInstanceClass"]
|
|
615
|
+
families.add(db_instance_class.rsplit(".", 1)[0])
|
|
616
|
+
except botocore.exceptions.ClientError:
|
|
617
|
+
print(
|
|
618
|
+
"Unable to connect to RDS. Do you have AWS credentials refreshed?",
|
|
619
|
+
file=sys.stderr,
|
|
620
|
+
)
|
|
621
|
+
sys.exit(1)
|
|
622
|
+
|
|
420
623
|
parser = argparse.ArgumentParser(
|
|
421
624
|
prog="Project shapes from instance family filter",
|
|
422
625
|
description="Input the target instance family filter like m7a.* and generates shape data",
|
|
@@ -445,6 +648,16 @@ if __name__ == "__main__":
|
|
|
445
648
|
"full cores (not threads) in which case it will be 1.5 by default."
|
|
446
649
|
),
|
|
447
650
|
)
|
|
651
|
+
parser.add_argument(
|
|
652
|
+
"--db-engines",
|
|
653
|
+
type=parse_db_engines,
|
|
654
|
+
default=None,
|
|
655
|
+
help=(
|
|
656
|
+
"Comma-separated list of database engines for RDS instances. "
|
|
657
|
+
"Required when family starts with 'db.'. "
|
|
658
|
+
"Currently supported: aurora-postgresql"
|
|
659
|
+
),
|
|
660
|
+
)
|
|
448
661
|
parser.add_argument("--region", choices=regions, default="us-east-1")
|
|
449
662
|
parser.add_argument(
|
|
450
663
|
"--output-path",
|
|
@@ -38,11 +38,7 @@ def extract_3yr_upfront_price(price_data: Dict[str, Any]) -> Optional[float]:
|
|
|
38
38
|
return None
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def
|
|
42
|
-
# Initialize pricing client
|
|
43
|
-
pricing_client = boto3.client("pricing", region_name=region)
|
|
44
|
-
|
|
45
|
-
# Get all EC2 pricing for Reserved Instances
|
|
41
|
+
def fetch_ec2_pricing(pricing_client: Any) -> Dict[str, Dict[str, Union[float, str]]]:
|
|
46
42
|
paginator = pricing_client.get_paginator("get_products")
|
|
47
43
|
|
|
48
44
|
instances = {}
|
|
@@ -81,39 +77,105 @@ def fetch_pricing(region: str) -> None:
|
|
|
81
77
|
if "deprecated" in str(instance_type).lower():
|
|
82
78
|
instance_info["lifecycle"] = "deprecated"
|
|
83
79
|
instances[instance_type] = instance_info
|
|
80
|
+
return instances
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def fetch_rds_pricing(pricing_client: Any) -> Dict[str, Dict[str, Union[float, str]]]:
|
|
84
|
+
paginator = pricing_client.get_paginator("get_products")
|
|
85
|
+
|
|
86
|
+
instances = {}
|
|
87
|
+
|
|
88
|
+
filter_params = {
|
|
89
|
+
"ServiceCode": "AmazonRDS",
|
|
90
|
+
"Filters": [
|
|
91
|
+
{
|
|
92
|
+
"Type": "TERM_MATCH",
|
|
93
|
+
"Field": "location",
|
|
94
|
+
"Value": "US East (N. Virginia)",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"Type": "TERM_MATCH",
|
|
98
|
+
"Field": "databaseEngine",
|
|
99
|
+
"Value": "Aurora PostgreSQL",
|
|
100
|
+
},
|
|
101
|
+
{"Type": "TERM_MATCH", "Field": "deploymentOption", "Value": "Single-AZ"},
|
|
102
|
+
],
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
for page in paginator.paginate(**filter_params):
|
|
106
|
+
for price_item in page["PriceList"]:
|
|
107
|
+
price_data = json.loads(price_item)
|
|
108
|
+
|
|
109
|
+
# Extract instance type
|
|
110
|
+
attributes = price_data.get("product", {}).get("attributes", {})
|
|
111
|
+
instance_type = attributes.get("instanceType")
|
|
112
|
+
|
|
113
|
+
if not instance_type:
|
|
114
|
+
continue
|
|
115
|
+
|
|
116
|
+
annual_cost = extract_3yr_upfront_price(price_data)
|
|
117
|
+
if annual_cost:
|
|
118
|
+
instance_info: Dict[str, Union[float, str]] = {
|
|
119
|
+
"annual_cost": annual_cost
|
|
120
|
+
}
|
|
121
|
+
if "deprecated" in str(instance_type).lower():
|
|
122
|
+
instance_info["lifecycle"] = "deprecated"
|
|
123
|
+
instances[instance_type] = instance_info
|
|
124
|
+
return instances
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def fetch_pricing(region: str) -> None:
|
|
128
|
+
pricing_client = boto3.client("pricing", region_name=region)
|
|
129
|
+
ec2_instances = fetch_ec2_pricing(pricing_client)
|
|
130
|
+
rds_instances = fetch_rds_pricing(pricing_client)
|
|
84
131
|
|
|
85
|
-
|
|
132
|
+
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
133
|
+
ec2_output_file = os.path.join(
|
|
134
|
+
project_root,
|
|
135
|
+
"hardware",
|
|
136
|
+
"profiles",
|
|
137
|
+
"pricing",
|
|
138
|
+
"aws",
|
|
139
|
+
"3yr-reserved_ec2.json",
|
|
140
|
+
)
|
|
86
141
|
# we bolt on the other info, as a hack until we can improve prior layers
|
|
87
|
-
|
|
142
|
+
ec2_output = {
|
|
88
143
|
"us-east-1": {
|
|
89
|
-
"instances":
|
|
144
|
+
"instances": ec2_instances,
|
|
90
145
|
"drives": {},
|
|
91
146
|
"services": {},
|
|
92
147
|
"zones_in_region": 3,
|
|
93
148
|
}
|
|
94
149
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
150
|
+
with open(ec2_output_file, "w", encoding="utf-8") as f:
|
|
151
|
+
json.dump(ec2_output, f, indent=2, sort_keys=True)
|
|
152
|
+
f.write("\n")
|
|
153
|
+
print(f"\nEC2 pricing data written to {ec2_output_file}")
|
|
154
|
+
rds_output_file = os.path.join(
|
|
99
155
|
project_root,
|
|
100
|
-
"service_capacity_modeling",
|
|
101
156
|
"hardware",
|
|
102
157
|
"profiles",
|
|
103
158
|
"pricing",
|
|
104
159
|
"aws",
|
|
105
|
-
"3yr-
|
|
160
|
+
"3yr-reserved_rds.json",
|
|
106
161
|
)
|
|
107
|
-
|
|
108
|
-
|
|
162
|
+
rds_output = {
|
|
163
|
+
"us-east-1": {
|
|
164
|
+
"instances": rds_instances,
|
|
165
|
+
"drives": {},
|
|
166
|
+
"services": {},
|
|
167
|
+
"zones_in_region": 3,
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
with open(rds_output_file, "w", encoding="utf-8") as f:
|
|
171
|
+
json.dump(rds_output, f, indent=2, sort_keys=True)
|
|
109
172
|
f.write("\n")
|
|
110
|
-
|
|
111
|
-
print(f"Pricing data written to {output_file}")
|
|
173
|
+
print(f"RDS pricing data written to {rds_output_file}")
|
|
112
174
|
|
|
113
175
|
|
|
114
176
|
def main() -> None:
|
|
115
177
|
parser = argparse.ArgumentParser(
|
|
116
|
-
description="Fetch EC2 Reserved Instance pricing data."
|
|
178
|
+
description="Fetch EC2 and RDS Reserved Instance pricing data."
|
|
117
179
|
)
|
|
118
180
|
parser.add_argument(
|
|
119
181
|
"--region",
|
{service_capacity_modeling-0.3.94.dist-info → service_capacity_modeling-0.3.98.dist-info}/RECORD
RENAMED
|
@@ -6,8 +6,9 @@ service_capacity_modeling/stats.py,sha256=LCNUcQPfwF5hhIZwsfAsDe4ZbnuhDnl3vQHKfp
|
|
|
6
6
|
service_capacity_modeling/hardware/__init__.py,sha256=P5ostvoSOMUqPODtepeFYb4qfTVH0E73mMFraP49rYU,9196
|
|
7
7
|
service_capacity_modeling/hardware/profiles/__init__.py,sha256=7-y3JbCBkgzaAjFla2RIymREcImdZ51HTl3yn3vzoGw,1602
|
|
8
8
|
service_capacity_modeling/hardware/profiles/profiles.txt,sha256=tOfSR3B0E0uAOaXd5SLI3ioq83UYZ3yhK7UHhsK4awQ,49
|
|
9
|
-
service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json,sha256=
|
|
10
|
-
service_capacity_modeling/hardware/profiles/pricing/aws/3yr-
|
|
9
|
+
service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json,sha256=beqldIMtUxoKGAC1deK7XdaeppHMoQbjE0Bi9-O2_f4,52198
|
|
10
|
+
service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_rds.json,sha256=e_BNVQSEv8OnPKOk-pyXVBpFufkhqEbIKDDwrK_MuwA,3410
|
|
11
|
+
service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_zz-overrides.json,sha256=rK3OZNz1avC2VX6nj61AxG0ezPEzFVTe1paWDm47Qm4,1884
|
|
11
12
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5.json,sha256=epluPmSzdil-tTKQ_wYlXgfMjqUEGXQoC8dXdZXvlTA,1740
|
|
12
13
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5a.json,sha256=8s7Ek0codNDESJwRjmUlzGA4cCp_-f_q_QyL7myl_zM,1764
|
|
13
14
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5d.json,sha256=7uVla6lab2uLA18ZjHbN9twvc0MEfzibdfOeCeVm1Ls,4617
|
|
@@ -18,6 +19,10 @@ service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6id.json,sha256=eYk
|
|
|
18
19
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7a.json,sha256=lsdIAFd-CIgAaz4Qpv8ZMy5smYDJQdYrAjI_saLvOQY,2414
|
|
19
20
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7i.json,sha256=ZweQIQNbVLet5KnWFwFf7COXp4Q5gE1JTDYL_Dcpdec,1996
|
|
20
21
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_c8i.json,sha256=n63Kj0B3esSZix7fmPGa8gn-JitgPkakqru328SNbs8,2435
|
|
22
|
+
service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r6g.json,sha256=dMWrkbMGEMSLWdHWgciPB-a0f1daZvHFtcUMDH7nsQY,1989
|
|
23
|
+
service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r6i.json,sha256=shYz0c8GLbObIUZgQG3Hn1OwV9EMVilCADxtfsXYHGg,2559
|
|
24
|
+
service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r7g.json,sha256=QF8EwWZj3-nlH3UNyg-qax0cxkoZPFRTRtDybUSsdVM,1989
|
|
25
|
+
service_capacity_modeling/hardware/profiles/shapes/aws/auto_db_r7i.json,sha256=bXUEYbpe13WZq2KBgdABq6rGflmYK2n84p0mExT0LHM,2569
|
|
21
26
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_i3en.json,sha256=xdWvo_qbSQtlSOpy78Rsc6SbHOAYetswakr8DOKyY3U,4074
|
|
22
27
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_i4i.json,sha256=vyo2qpbayKprN_wqUl2KGoJhv_Xjm8PpHPTVz-9wLaA,5231
|
|
23
28
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_i7i.json,sha256=M2j1UT6XTvErjGKqHAFBFlenztNNhOz-9BETs1e8nCw,5289
|
|
@@ -44,7 +49,7 @@ service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7a.json,sha256=-ZrE
|
|
|
44
49
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7i.json,sha256=o6LqdWUwgLRplzGMJkGbkz1CjYvb8tGwZxrXHk5qR-g,2002
|
|
45
50
|
service_capacity_modeling/hardware/profiles/shapes/aws/auto_r8i.json,sha256=CxRt67LhBmKbzHXHIWDGPCMNEJaANw_zlOWTkAlLm9U,2442
|
|
46
51
|
service_capacity_modeling/hardware/profiles/shapes/aws/manual_drives.json,sha256=0qxEciNTb0yGhAmX1bI6hV-4SSkGMp1FZ8OQvaOET64,1709
|
|
47
|
-
service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json,sha256=-
|
|
52
|
+
service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json,sha256=-6Nsy-LlDuxm6LNp-hm7LkEf_6yGRxNSqU77pFtFHeY,12457
|
|
48
53
|
service_capacity_modeling/hardware/profiles/shapes/aws/manual_services.json,sha256=h63675KKmu5IrI3BORDN8fiAqLjAyYHArErKbC7-T30,776
|
|
49
54
|
service_capacity_modeling/models/__init__.py,sha256=03Y1aOe1fNgRKOO-x50SbrtfHTfdAqEs0ipeAx0WzMc,13940
|
|
50
55
|
service_capacity_modeling/models/common.py,sha256=Bs-G1eHrb9qmS9qEWzx0rzN9QjQ419UomQu78dFoxXk,36704
|
|
@@ -73,13 +78,13 @@ service_capacity_modeling/models/org/netflix/time_series_config.py,sha256=usV7y9
|
|
|
73
78
|
service_capacity_modeling/models/org/netflix/wal.py,sha256=QtRlqP_AIVpTg-XEINAfvf7J7J9EzXMY5PrxE3DIOU0,4482
|
|
74
79
|
service_capacity_modeling/models/org/netflix/zookeeper.py,sha256=T_CkmRqoEVqpERCFPU8xihyaxlNfUHDJXz7dMHM8GD0,7679
|
|
75
80
|
service_capacity_modeling/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
-
service_capacity_modeling/tools/auto_shape.py,sha256=
|
|
77
|
-
service_capacity_modeling/tools/fetch_pricing.py,sha256=
|
|
81
|
+
service_capacity_modeling/tools/auto_shape.py,sha256=K248-DayPrcZwLw1dYr47lpeQQwL0ylh1WAoVSdLNxw,23621
|
|
82
|
+
service_capacity_modeling/tools/fetch_pricing.py,sha256=fO84h77cqiiIHF4hZt490RwbZ6JqjB45UsnPpV2AXD4,6122
|
|
78
83
|
service_capacity_modeling/tools/generate_missing.py,sha256=F7YqvMJAV4nZc20GNrlIsnQSF8_77sLgwYZqc5k4LDg,3099
|
|
79
84
|
service_capacity_modeling/tools/instance_families.py,sha256=e5RuYkCLUITvsAazDH12B6KjX_PaBsv6Ne3mj0HK_sQ,9223
|
|
80
|
-
service_capacity_modeling-0.3.
|
|
81
|
-
service_capacity_modeling-0.3.
|
|
82
|
-
service_capacity_modeling-0.3.
|
|
83
|
-
service_capacity_modeling-0.3.
|
|
84
|
-
service_capacity_modeling-0.3.
|
|
85
|
-
service_capacity_modeling-0.3.
|
|
85
|
+
service_capacity_modeling-0.3.98.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
|
|
86
|
+
service_capacity_modeling-0.3.98.dist-info/METADATA,sha256=_XVCm9T7EhrvHCSswx_57lwhTsn7R1O6-vYdPQOjQrE,10366
|
|
87
|
+
service_capacity_modeling-0.3.98.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
88
|
+
service_capacity_modeling-0.3.98.dist-info/entry_points.txt,sha256=ZsjzpG5SomWpT1zCE19n1uSXKH2gTI_yc33sdl0vmJg,146
|
|
89
|
+
service_capacity_modeling-0.3.98.dist-info/top_level.txt,sha256=H8XjTCLgR3enHq5t3bIbxt9SeUkUT8HT_SDv2dgIT_A,26
|
|
90
|
+
service_capacity_modeling-0.3.98.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|