service-capacity-modeling 0.3.75__py3-none-any.whl → 0.3.77__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.
Potentially problematic release.
This version of service-capacity-modeling might be problematic. Click here for more details.
- service_capacity_modeling/capacity_planner.py +46 -40
- service_capacity_modeling/hardware/__init__.py +11 -7
- service_capacity_modeling/interface.py +20 -18
- service_capacity_modeling/models/__init__.py +21 -2
- service_capacity_modeling/models/common.py +20 -19
- service_capacity_modeling/models/headroom_strategy.py +2 -1
- service_capacity_modeling/models/org/netflix/__init__.py +4 -1
- service_capacity_modeling/models/org/netflix/aurora.py +12 -7
- service_capacity_modeling/models/org/netflix/cassandra.py +22 -12
- service_capacity_modeling/models/org/netflix/counter.py +4 -2
- service_capacity_modeling/models/org/netflix/crdb.py +7 -4
- service_capacity_modeling/models/org/netflix/ddb.py +9 -5
- service_capacity_modeling/models/org/netflix/elasticsearch.py +8 -6
- service_capacity_modeling/models/org/netflix/entity.py +5 -3
- service_capacity_modeling/models/org/netflix/evcache.py +13 -9
- service_capacity_modeling/models/org/netflix/graphkv.py +5 -3
- service_capacity_modeling/models/org/netflix/iso_date_math.py +12 -9
- service_capacity_modeling/models/org/netflix/kafka.py +13 -7
- service_capacity_modeling/models/org/netflix/key_value.py +4 -2
- service_capacity_modeling/models/org/netflix/postgres.py +4 -2
- service_capacity_modeling/models/org/netflix/rds.py +10 -5
- service_capacity_modeling/models/org/netflix/stateless_java.py +4 -2
- service_capacity_modeling/models/org/netflix/time_series.py +4 -2
- service_capacity_modeling/models/org/netflix/time_series_config.py +3 -3
- service_capacity_modeling/models/org/netflix/wal.py +4 -2
- service_capacity_modeling/models/org/netflix/zookeeper.py +5 -3
- service_capacity_modeling/stats.py +14 -11
- service_capacity_modeling/tools/auto_shape.py +10 -6
- service_capacity_modeling/tools/fetch_pricing.py +13 -6
- service_capacity_modeling/tools/generate_missing.py +4 -3
- service_capacity_modeling/tools/instance_families.py +4 -1
- {service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/METADATA +9 -5
- {service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/RECORD +37 -37
- {service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/WHEEL +0 -0
- {service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/entry_points.txt +0 -0
- {service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/licenses/LICENSE +0 -0
- {service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/top_level.txt +0 -0
|
@@ -60,12 +60,12 @@ class TimeSeriesConfiguration:
|
|
|
60
60
|
extra_model_arguments: Dict[str, Any], retention_duration: str
|
|
61
61
|
) -> str:
|
|
62
62
|
if "ts.accept-limit" in extra_model_arguments:
|
|
63
|
-
return _iso_to_proto_duration(extra_model_arguments["ts.accept-limit"])
|
|
63
|
+
return str(_iso_to_proto_duration(extra_model_arguments["ts.accept-limit"]))
|
|
64
64
|
elif retention_duration == "unlimited":
|
|
65
65
|
# For "all-time" tables we have to let them read and write anywhere
|
|
66
66
|
return "0s"
|
|
67
67
|
else:
|
|
68
|
-
return _iso_to_proto_duration("PT10M")
|
|
68
|
+
return str(_iso_to_proto_duration("PT10M"))
|
|
69
69
|
|
|
70
70
|
@staticmethod
|
|
71
71
|
def __get_buckets_per_id(
|
|
@@ -162,7 +162,7 @@ class TimeSeriesConfiguration:
|
|
|
162
162
|
|
|
163
163
|
@staticmethod
|
|
164
164
|
def __get_consistency_target(extra_model_arguments: Dict[str, Any]) -> str:
|
|
165
|
-
val = extra_model_arguments.get("ts.read-consistency", "eventual").lower()
|
|
165
|
+
val = str(extra_model_arguments.get("ts.read-consistency", "eventual")).lower()
|
|
166
166
|
if val in ("best-effort", "eventual"):
|
|
167
167
|
return val
|
|
168
168
|
else:
|
|
@@ -45,7 +45,7 @@ class NflxWALCapacityModel(CapacityModel):
|
|
|
45
45
|
return wal_app
|
|
46
46
|
|
|
47
47
|
@staticmethod
|
|
48
|
-
def description():
|
|
48
|
+
def description() -> str:
|
|
49
49
|
return "Netflix Streaming WAL Model"
|
|
50
50
|
|
|
51
51
|
@staticmethod
|
|
@@ -63,7 +63,9 @@ class NflxWALCapacityModel(CapacityModel):
|
|
|
63
63
|
return ()
|
|
64
64
|
|
|
65
65
|
@staticmethod
|
|
66
|
-
def default_desires(
|
|
66
|
+
def default_desires(
|
|
67
|
+
user_desires: CapacityDesires, extra_model_arguments: Dict[str, Any]
|
|
68
|
+
) -> CapacityDesires:
|
|
67
69
|
return CapacityDesires(
|
|
68
70
|
query_pattern=QueryPattern(
|
|
69
71
|
access_pattern=AccessPattern.latency,
|
|
@@ -106,7 +106,7 @@ class NflxZookeeperCapacityModel(CapacityModel):
|
|
|
106
106
|
return None
|
|
107
107
|
|
|
108
108
|
# We have a viable instance, now either make 3 or 5 depending on tier
|
|
109
|
-
def soln(n) -> ZoneClusterCapacity:
|
|
109
|
+
def soln(n: int) -> ZoneClusterCapacity:
|
|
110
110
|
return ZoneClusterCapacity(
|
|
111
111
|
cluster_type="zk-zonal",
|
|
112
112
|
count=n,
|
|
@@ -140,7 +140,7 @@ class NflxZookeeperCapacityModel(CapacityModel):
|
|
|
140
140
|
)
|
|
141
141
|
|
|
142
142
|
@staticmethod
|
|
143
|
-
def description():
|
|
143
|
+
def description() -> str:
|
|
144
144
|
return "Netflix Zookeeper Coordination Cluster Model"
|
|
145
145
|
|
|
146
146
|
@staticmethod
|
|
@@ -148,7 +148,9 @@ class NflxZookeeperCapacityModel(CapacityModel):
|
|
|
148
148
|
return NflxZookeeperArguments.model_json_schema()
|
|
149
149
|
|
|
150
150
|
@staticmethod
|
|
151
|
-
def default_desires(
|
|
151
|
+
def default_desires(
|
|
152
|
+
user_desires: CapacityDesires, extra_model_arguments: Dict[str, Any]
|
|
153
|
+
) -> CapacityDesires:
|
|
152
154
|
return CapacityDesires(
|
|
153
155
|
query_pattern=QueryPattern(
|
|
154
156
|
access_pattern=AccessPattern.latency,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from functools import lru_cache
|
|
2
|
+
from typing import Callable
|
|
2
3
|
from typing import Sequence
|
|
3
4
|
from typing import Tuple
|
|
4
5
|
|
|
@@ -24,7 +25,9 @@ EPSILON = 0.001
|
|
|
24
25
|
# Gamma distribution G(alpha, beta) with mean alpha * beta
|
|
25
26
|
|
|
26
27
|
|
|
27
|
-
def _gamma_fn_from_params(
|
|
28
|
+
def _gamma_fn_from_params(
|
|
29
|
+
low: float, mid: float, high: float, confidence: float
|
|
30
|
+
) -> Callable[[float], float]:
|
|
28
31
|
assert 0 < low <= mid <= high
|
|
29
32
|
confidence = min(confidence, 0.99)
|
|
30
33
|
confidence = max(confidence, 0.01)
|
|
@@ -40,9 +43,9 @@ def _gamma_fn_from_params(low, mid, high, confidence):
|
|
|
40
43
|
#
|
|
41
44
|
# Then we can use numeric methods to solve for the remaining shape parameter
|
|
42
45
|
|
|
43
|
-
def f(k):
|
|
46
|
+
def f(k: float) -> float:
|
|
44
47
|
zero = high / low
|
|
45
|
-
return gammaf(k, high_p * k / mid) / gammaf(k, low_p * k / mid) - zero
|
|
48
|
+
return float(gammaf(k, high_p * k / mid) / gammaf(k, low_p * k / mid) - zero)
|
|
46
49
|
|
|
47
50
|
return f
|
|
48
51
|
|
|
@@ -89,7 +92,9 @@ def gamma_for_interval(interval: Interval, seed: int = 0xCAFE) -> rv_continuous:
|
|
|
89
92
|
# Beta distribution B(alpha, beta) with mean alpha / (alpha + beta)
|
|
90
93
|
|
|
91
94
|
|
|
92
|
-
def _beta_cost_fn_from_params(
|
|
95
|
+
def _beta_cost_fn_from_params(
|
|
96
|
+
low: float, mid: float, high: float, confidence: float
|
|
97
|
+
) -> Callable[[float], float]:
|
|
93
98
|
assert low <= mid <= high < 1.0
|
|
94
99
|
assert mid > 0
|
|
95
100
|
|
|
@@ -100,14 +105,14 @@ def _beta_cost_fn_from_params(low, mid, high, confidence):
|
|
|
100
105
|
low_p = 0.0 + (1 - confidence) / 2.0
|
|
101
106
|
high_p = 1.0 - (1 - confidence) / 2.0
|
|
102
107
|
|
|
103
|
-
def cost(alpha):
|
|
108
|
+
def cost(alpha: float) -> float:
|
|
104
109
|
beta = alpha / mid - alpha
|
|
105
110
|
if alpha == 0 or beta == 0:
|
|
106
111
|
return float("inf")
|
|
107
112
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return
|
|
113
|
+
cost_val: float = (beta_dist.cdf(low, alpha, beta) - low_p) ** 2
|
|
114
|
+
cost_val += (beta_dist.cdf(high, alpha, beta) - high_p) ** 2
|
|
115
|
+
return cost_val
|
|
111
116
|
|
|
112
117
|
return cost
|
|
113
118
|
|
|
@@ -156,10 +161,8 @@ def beta_for_interval(interval: Interval, seed: int = 0xCAFE) -> rv_continuous:
|
|
|
156
161
|
def dist_for_interval(interval: Interval, seed: int = 0xCAFE) -> rv_continuous:
|
|
157
162
|
if interval.model_with == IntervalModel.beta:
|
|
158
163
|
result = beta_for_interval(interval=interval, seed=seed)
|
|
159
|
-
|
|
164
|
+
else: # IntervalModel.gamma
|
|
160
165
|
result = gamma_for_interval(interval=interval, seed=seed)
|
|
161
|
-
else:
|
|
162
|
-
result = beta_for_interval(interval=interval, seed=seed)
|
|
163
166
|
return result
|
|
164
167
|
|
|
165
168
|
|
|
@@ -4,6 +4,7 @@ import re
|
|
|
4
4
|
import sys
|
|
5
5
|
from fractions import Fraction
|
|
6
6
|
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
7
8
|
from typing import Dict
|
|
8
9
|
from typing import Optional
|
|
9
10
|
from typing import Sequence
|
|
@@ -110,7 +111,10 @@ def _gb_to_gib(inp: float) -> int:
|
|
|
110
111
|
|
|
111
112
|
|
|
112
113
|
def _drive(
|
|
113
|
-
drive_type: DriveType,
|
|
114
|
+
drive_type: DriveType,
|
|
115
|
+
io_perf: Optional[IOPerformance],
|
|
116
|
+
scale: Fraction,
|
|
117
|
+
data: Dict[str, Any],
|
|
114
118
|
) -> Optional[Drive]:
|
|
115
119
|
if drive_type.name.startswith("attached") or io_perf is None:
|
|
116
120
|
return None
|
|
@@ -133,7 +137,7 @@ def _drive(
|
|
|
133
137
|
|
|
134
138
|
|
|
135
139
|
def pull_family(
|
|
136
|
-
ec2_client,
|
|
140
|
+
ec2_client: Any,
|
|
137
141
|
family: str,
|
|
138
142
|
cpu_perf: Optional[CPUPerformance] = None,
|
|
139
143
|
io_perf: Optional[IOPerformance] = None,
|
|
@@ -167,7 +171,7 @@ def pull_family(
|
|
|
167
171
|
],
|
|
168
172
|
}
|
|
169
173
|
|
|
170
|
-
def debug_log(msg: str):
|
|
174
|
+
def debug_log(msg: str) -> None:
|
|
171
175
|
if debug:
|
|
172
176
|
print(msg, file=sys.stderr)
|
|
173
177
|
|
|
@@ -256,7 +260,7 @@ def pull_family(
|
|
|
256
260
|
return results
|
|
257
261
|
|
|
258
262
|
|
|
259
|
-
def parse_iops(inp: str) -> Optional[Tuple[int, int]]:
|
|
263
|
+
def parse_iops(inp: Optional[str]) -> Optional[Tuple[int, int]]:
|
|
260
264
|
"""Parses strings like 100,000/50,000 to (100000, 50000)"""
|
|
261
265
|
if inp is None:
|
|
262
266
|
return None
|
|
@@ -342,7 +346,7 @@ def deduce_cpu_perf(
|
|
|
342
346
|
return CPUPerformance()
|
|
343
347
|
|
|
344
348
|
|
|
345
|
-
def main(args) -> int:
|
|
349
|
+
def main(args: Any) -> int:
|
|
346
350
|
for family in args.families:
|
|
347
351
|
io_perf = deduce_io_perf(
|
|
348
352
|
family=family, curve=args.io_latency_curve, iops=args.xl_iops
|
|
@@ -361,7 +365,7 @@ def main(args) -> int:
|
|
|
361
365
|
io_perf=io_perf,
|
|
362
366
|
debug=args.debug,
|
|
363
367
|
)
|
|
364
|
-
json_shapes: Dict[str, Dict[str,
|
|
368
|
+
json_shapes: Dict[str, Dict[str, Any]] = {"instances": {}}
|
|
365
369
|
for shape in family_shapes:
|
|
366
370
|
model_dict = shape.model_dump(exclude_unset=True)
|
|
367
371
|
# Hardware shouldn't have costs
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import json
|
|
3
3
|
import os
|
|
4
|
+
from typing import Any
|
|
5
|
+
from typing import Dict
|
|
6
|
+
from typing import Optional
|
|
7
|
+
from typing import Union
|
|
4
8
|
|
|
5
9
|
import boto3
|
|
6
10
|
|
|
7
11
|
|
|
8
|
-
def extract_3yr_upfront_price(price_data):
|
|
12
|
+
def extract_3yr_upfront_price(price_data: Dict[str, Any]) -> Optional[float]:
|
|
9
13
|
instance_type = price_data["product"]["attributes"]["instanceType"]
|
|
10
14
|
|
|
11
15
|
# Look through Reserved terms
|
|
@@ -34,7 +38,7 @@ def extract_3yr_upfront_price(price_data):
|
|
|
34
38
|
return None
|
|
35
39
|
|
|
36
40
|
|
|
37
|
-
def fetch_pricing(region: str):
|
|
41
|
+
def fetch_pricing(region: str) -> None:
|
|
38
42
|
# Initialize pricing client
|
|
39
43
|
pricing_client = boto3.client("pricing", region_name=region)
|
|
40
44
|
|
|
@@ -71,9 +75,12 @@ def fetch_pricing(region: str):
|
|
|
71
75
|
|
|
72
76
|
annual_cost = extract_3yr_upfront_price(price_data)
|
|
73
77
|
if annual_cost:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
instance_info: Dict[str, Union[float, str]] = {
|
|
79
|
+
"annual_cost": annual_cost
|
|
80
|
+
}
|
|
81
|
+
if "deprecated" in str(instance_type).lower():
|
|
82
|
+
instance_info["lifecycle"] = "deprecated"
|
|
83
|
+
instances[instance_type] = instance_info
|
|
77
84
|
|
|
78
85
|
# Create final output structure
|
|
79
86
|
# we bolt on the other info, as a hack until we can improve prior layers
|
|
@@ -104,7 +111,7 @@ def fetch_pricing(region: str):
|
|
|
104
111
|
print(f"Pricing data written to {output_file}")
|
|
105
112
|
|
|
106
113
|
|
|
107
|
-
def main():
|
|
114
|
+
def main() -> None:
|
|
108
115
|
parser = argparse.ArgumentParser(
|
|
109
116
|
description="Fetch EC2 Reserved Instance pricing data."
|
|
110
117
|
)
|
|
@@ -4,8 +4,9 @@ import sys
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Any
|
|
6
6
|
from typing import Dict
|
|
7
|
+
from typing import List
|
|
7
8
|
|
|
8
|
-
from instance_families import INSTANCE_TYPES
|
|
9
|
+
from service_capacity_modeling.tools.instance_families import INSTANCE_TYPES
|
|
9
10
|
|
|
10
11
|
print("Loaded instance family count =", len(INSTANCE_TYPES))
|
|
11
12
|
|
|
@@ -16,7 +17,7 @@ def get_auto_shape_path() -> Path:
|
|
|
16
17
|
return current_dir / "auto_shape.py"
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
def build_command(family: str, params: Dict[str, Any], output_path: Path) ->
|
|
20
|
+
def build_command(family: str, params: Dict[str, Any], output_path: Path) -> List[str]:
|
|
20
21
|
"""Build the command to run auto_shape.py with the appropriate parameters"""
|
|
21
22
|
auto_shape_path = get_auto_shape_path()
|
|
22
23
|
cmd = [sys.executable, str(auto_shape_path)]
|
|
@@ -42,7 +43,7 @@ def build_command(family: str, params: Dict[str, Any], output_path: Path) -> lis
|
|
|
42
43
|
return cmd
|
|
43
44
|
|
|
44
45
|
|
|
45
|
-
def main(debug: bool = True, execute: bool = False, force: bool = False):
|
|
46
|
+
def main(debug: bool = True, execute: bool = False, force: bool = False) -> None:
|
|
46
47
|
expected_path = (
|
|
47
48
|
Path(__file__).resolve().parent.parent / "hardware/profiles/shapes/aws"
|
|
48
49
|
)
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
# typical value across a broad range of tests such as those used
|
|
5
5
|
# in common online benchmarks.
|
|
6
6
|
#
|
|
7
|
+
from typing import Any
|
|
8
|
+
from typing import Dict
|
|
9
|
+
|
|
7
10
|
# Intel
|
|
8
11
|
HASWELL_IPC = 0.85
|
|
9
12
|
SKYLAKE_IPC = 1.0
|
|
@@ -17,7 +20,7 @@ ROME_IPC = 1.03
|
|
|
17
20
|
MILAN_IPC = SKYLAKE_IPC * 1.15
|
|
18
21
|
GENOA_IPC = MILAN_IPC * 1.13
|
|
19
22
|
|
|
20
|
-
INSTANCE_TYPES = {
|
|
23
|
+
INSTANCE_TYPES: Dict[str, Dict[str, Any]] = {
|
|
21
24
|
"c5": {
|
|
22
25
|
"xl_iops": None,
|
|
23
26
|
"io_latency_curve": None,
|
{service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/METADATA
RENAMED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: service-capacity-modeling
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.77
|
|
4
4
|
Summary: Contains utilities for modeling capacity for pluggable workloads
|
|
5
5
|
Author: Joseph Lynch
|
|
6
6
|
Author-email: josephl@netflix.com
|
|
7
7
|
License: Apache 2.0
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
9
12
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
10
13
|
Classifier: Operating System :: OS Independent
|
|
14
|
+
Requires-Python: >=3.9,<3.12
|
|
11
15
|
Description-Content-Type: text/markdown
|
|
12
16
|
License-File: LICENSE
|
|
13
17
|
Requires-Dist: pydantic>2.0
|
|
14
18
|
Requires-Dist: scipy
|
|
15
19
|
Requires-Dist: numpy
|
|
16
|
-
Requires-Dist: importlib_resources; python_version < "3.7"
|
|
17
20
|
Requires-Dist: isodate
|
|
18
21
|
Provides-Extra: aws
|
|
19
22
|
Requires-Dist: boto3; extra == "aws"
|
|
@@ -26,6 +29,7 @@ Dynamic: license
|
|
|
26
29
|
Dynamic: license-file
|
|
27
30
|
Dynamic: provides-extra
|
|
28
31
|
Dynamic: requires-dist
|
|
32
|
+
Dynamic: requires-python
|
|
29
33
|
Dynamic: summary
|
|
30
34
|
|
|
31
35
|
# Service Capacity Modeling
|
|
@@ -43,10 +47,10 @@ remember this repository is public when making changes to it.
|
|
|
43
47
|
Run the tests:
|
|
44
48
|
```bash
|
|
45
49
|
# Test the capacity planner on included netflix models
|
|
46
|
-
$ tox -e
|
|
50
|
+
$ tox -e py39
|
|
47
51
|
|
|
48
52
|
# Run a single test with a debugger attached if the test fails
|
|
49
|
-
$ .tox/
|
|
53
|
+
$ .tox/py39/bin/pytest -n0 -k test_java_heap_heavy --pdb --pdbcls=IPython.terminal.debugger:Pdb
|
|
50
54
|
|
|
51
55
|
# Verify all type contracts
|
|
52
56
|
$ tox -e mypy
|
|
@@ -247,7 +251,7 @@ To contribute to this project:
|
|
|
247
251
|
2. Write a unit test using `pytest` in the `tests` folder.
|
|
248
252
|
3. Ensure your tests pass via `tox` or debug them with:
|
|
249
253
|
```
|
|
250
|
-
tox -e
|
|
254
|
+
tox -e py39 -- -k test_<your_functionality> --pdb --pdbcls=IPython.terminal.debugger:Pdb
|
|
251
255
|
```
|
|
252
256
|
|
|
253
257
|
### Pre-commit / Linting
|
{service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/RECORD
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
service_capacity_modeling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
service_capacity_modeling/capacity_planner.py,sha256=
|
|
3
|
-
service_capacity_modeling/interface.py,sha256=
|
|
4
|
-
service_capacity_modeling/stats.py,sha256=
|
|
5
|
-
service_capacity_modeling/hardware/__init__.py,sha256=
|
|
2
|
+
service_capacity_modeling/capacity_planner.py,sha256=nmjAWpUtL5EKbEtQzSGWrM8gPSAVc7EX5M4ApiLbQnA,32828
|
|
3
|
+
service_capacity_modeling/interface.py,sha256=p-pOUQUdA6VA-moTjFSBLQAZCRvcjFaAfb2jOmxMWsY,39074
|
|
4
|
+
service_capacity_modeling/stats.py,sha256=ievz2f1H-a6u8wHwXBQ47e2EhqH9BDrdL6VZAXQDK2w,5964
|
|
5
|
+
service_capacity_modeling/hardware/__init__.py,sha256=P5ostvoSOMUqPODtepeFYb4qfTVH0E73mMFraP49rYU,9196
|
|
6
6
|
service_capacity_modeling/hardware/profiles/__init__.py,sha256=7-y3JbCBkgzaAjFla2RIymREcImdZ51HTl3yn3vzoGw,1602
|
|
7
7
|
service_capacity_modeling/hardware/profiles/profiles.txt,sha256=tOfSR3B0E0uAOaXd5SLI3ioq83UYZ3yhK7UHhsK4awQ,49
|
|
8
8
|
service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json,sha256=JNAj4yotSrEzlsMLamg_GmhqOiiTwKNcDPNs44PTLxI,52798
|
|
@@ -45,39 +45,39 @@ service_capacity_modeling/hardware/profiles/shapes/aws/auto_r8i.json,sha256=CxRt
|
|
|
45
45
|
service_capacity_modeling/hardware/profiles/shapes/aws/manual_drives.json,sha256=0qxEciNTb0yGhAmX1bI6hV-4SSkGMp1FZ8OQvaOET64,1709
|
|
46
46
|
service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json,sha256=-_jxyQgmwKe5JnbfhMD9xDCq0sy7z2fdZn7Fu76IUkk,12457
|
|
47
47
|
service_capacity_modeling/hardware/profiles/shapes/aws/manual_services.json,sha256=h63675KKmu5IrI3BORDN8fiAqLjAyYHArErKbC7-T30,776
|
|
48
|
-
service_capacity_modeling/models/__init__.py,sha256=
|
|
49
|
-
service_capacity_modeling/models/common.py,sha256=
|
|
50
|
-
service_capacity_modeling/models/headroom_strategy.py,sha256=
|
|
48
|
+
service_capacity_modeling/models/__init__.py,sha256=03Y1aOe1fNgRKOO-x50SbrtfHTfdAqEs0ipeAx0WzMc,13940
|
|
49
|
+
service_capacity_modeling/models/common.py,sha256=Bs-G1eHrb9qmS9qEWzx0rzN9QjQ419UomQu78dFoxXk,36704
|
|
50
|
+
service_capacity_modeling/models/headroom_strategy.py,sha256=rGo_d7nxkQDjx0_hIAXKKZAWnQDBtqZhc0eTMouVh8s,682
|
|
51
51
|
service_capacity_modeling/models/utils.py,sha256=WosEEg4o1_WSbTb5mL-M1v8JuWJgvS2oWvnDS3qNz3k,2662
|
|
52
52
|
service_capacity_modeling/models/org/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
-
service_capacity_modeling/models/org/netflix/__init__.py,sha256=
|
|
54
|
-
service_capacity_modeling/models/org/netflix/aurora.py,sha256=
|
|
55
|
-
service_capacity_modeling/models/org/netflix/cassandra.py,sha256=
|
|
56
|
-
service_capacity_modeling/models/org/netflix/counter.py,sha256=
|
|
57
|
-
service_capacity_modeling/models/org/netflix/crdb.py,sha256=
|
|
58
|
-
service_capacity_modeling/models/org/netflix/ddb.py,sha256=
|
|
59
|
-
service_capacity_modeling/models/org/netflix/elasticsearch.py,sha256=
|
|
60
|
-
service_capacity_modeling/models/org/netflix/entity.py,sha256=
|
|
61
|
-
service_capacity_modeling/models/org/netflix/evcache.py,sha256=
|
|
62
|
-
service_capacity_modeling/models/org/netflix/graphkv.py,sha256=
|
|
63
|
-
service_capacity_modeling/models/org/netflix/iso_date_math.py,sha256=
|
|
64
|
-
service_capacity_modeling/models/org/netflix/kafka.py,sha256=
|
|
65
|
-
service_capacity_modeling/models/org/netflix/key_value.py,sha256=
|
|
66
|
-
service_capacity_modeling/models/org/netflix/postgres.py,sha256=
|
|
67
|
-
service_capacity_modeling/models/org/netflix/rds.py,sha256=
|
|
68
|
-
service_capacity_modeling/models/org/netflix/stateless_java.py,sha256=
|
|
69
|
-
service_capacity_modeling/models/org/netflix/time_series.py,sha256=
|
|
70
|
-
service_capacity_modeling/models/org/netflix/time_series_config.py,sha256=
|
|
71
|
-
service_capacity_modeling/models/org/netflix/wal.py,sha256=
|
|
72
|
-
service_capacity_modeling/models/org/netflix/zookeeper.py,sha256=
|
|
53
|
+
service_capacity_modeling/models/org/netflix/__init__.py,sha256=W6rKkhSdPhjD-awm7mYakAhw7VKLNJYkqv-U3LfkMew,2444
|
|
54
|
+
service_capacity_modeling/models/org/netflix/aurora.py,sha256=Js33ZjxCtt34HiDPsWRT9mjKCAsnnCo9du15QArVFMo,13073
|
|
55
|
+
service_capacity_modeling/models/org/netflix/cassandra.py,sha256=biLt-A0FSW5ZXiM3T8Y8TaMG5xJOA-fzf1-OCqxVXx8,39000
|
|
56
|
+
service_capacity_modeling/models/org/netflix/counter.py,sha256=T-lBgxUMxZUojDyMJBR3HQI1u6fJujuPiQ6rGTZaMl4,9278
|
|
57
|
+
service_capacity_modeling/models/org/netflix/crdb.py,sha256=iW7tyG8jpXhHIdXrw3DPYSHRAknPN42MlCRLJO4o9C8,20826
|
|
58
|
+
service_capacity_modeling/models/org/netflix/ddb.py,sha256=9qRiuTqWev9zbYFFzewyowU7M41uALsuLklYx20yAXw,26502
|
|
59
|
+
service_capacity_modeling/models/org/netflix/elasticsearch.py,sha256=zPrC6b2LNrAh3IWE3HCMUEYASacjYbHChbO4WZSMma4,25234
|
|
60
|
+
service_capacity_modeling/models/org/netflix/entity.py,sha256=VHgEwnGtJAKlhvbE2kTif75OZmIsjjjoZrT6kb1LTgA,8750
|
|
61
|
+
service_capacity_modeling/models/org/netflix/evcache.py,sha256=g-Dy1KBctIKJK-x69aZaUXKETjaxdqzoTN-ix-oG3d8,25578
|
|
62
|
+
service_capacity_modeling/models/org/netflix/graphkv.py,sha256=7ncEhx9lLsN_vGIKNHkvWfDdKffG7cYe91Wr-DB7IjU,8659
|
|
63
|
+
service_capacity_modeling/models/org/netflix/iso_date_math.py,sha256=oC5sgIXDqwOp6-5z2bdTkm-bJLlnzhqcONI_tspHjac,1137
|
|
64
|
+
service_capacity_modeling/models/org/netflix/kafka.py,sha256=LT9T189Tvn22ZfiW9VyL8TXqjCGW3DOvVVIIPiT5rnM,25650
|
|
65
|
+
service_capacity_modeling/models/org/netflix/key_value.py,sha256=WH8NblHqHwnAAumB2Zz1Qd4NBFWDQEQ1rpBcP3fVVQk,9409
|
|
66
|
+
service_capacity_modeling/models/org/netflix/postgres.py,sha256=LBxDqkc-lYxDBu2VwNLuf2Q4o4hU3jPwu4YSt33Oe-8,4128
|
|
67
|
+
service_capacity_modeling/models/org/netflix/rds.py,sha256=8GVmpMhTisZPdT-mP1Sx5U7VAF32lnTI27iYPfGg9CY,10930
|
|
68
|
+
service_capacity_modeling/models/org/netflix/stateless_java.py,sha256=1oL74Qd6wSsDIWG_3Qt4x0qwgMQie-mJ6HKB0obgD5g,11379
|
|
69
|
+
service_capacity_modeling/models/org/netflix/time_series.py,sha256=NjZTr0NC6c0tduY4O1Z6Nfm0S8Mt0pKxPgphywIulvQ,8240
|
|
70
|
+
service_capacity_modeling/models/org/netflix/time_series_config.py,sha256=usV7y9NVb8hfGrB6POg63lzSfxUafyBMu0zP-HvPOMo,7326
|
|
71
|
+
service_capacity_modeling/models/org/netflix/wal.py,sha256=QtRlqP_AIVpTg-XEINAfvf7J7J9EzXMY5PrxE3DIOU0,4482
|
|
72
|
+
service_capacity_modeling/models/org/netflix/zookeeper.py,sha256=T_CkmRqoEVqpERCFPU8xihyaxlNfUHDJXz7dMHM8GD0,7679
|
|
73
73
|
service_capacity_modeling/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
74
|
-
service_capacity_modeling/tools/auto_shape.py,sha256=
|
|
75
|
-
service_capacity_modeling/tools/fetch_pricing.py,sha256=
|
|
76
|
-
service_capacity_modeling/tools/generate_missing.py,sha256=
|
|
77
|
-
service_capacity_modeling/tools/instance_families.py,sha256=
|
|
78
|
-
service_capacity_modeling-0.3.
|
|
79
|
-
service_capacity_modeling-0.3.
|
|
80
|
-
service_capacity_modeling-0.3.
|
|
81
|
-
service_capacity_modeling-0.3.
|
|
82
|
-
service_capacity_modeling-0.3.
|
|
83
|
-
service_capacity_modeling-0.3.
|
|
74
|
+
service_capacity_modeling/tools/auto_shape.py,sha256=Jx9H2ay9-H_kUDjtB141owQNxGFu3hRHxUtnDRUD2Kw,15045
|
|
75
|
+
service_capacity_modeling/tools/fetch_pricing.py,sha256=Qp-XMymkY1dvtyS51RufmEpfgOHv-IQ-XyzS8wp2-qM,4021
|
|
76
|
+
service_capacity_modeling/tools/generate_missing.py,sha256=F7YqvMJAV4nZc20GNrlIsnQSF8_77sLgwYZqc5k4LDg,3099
|
|
77
|
+
service_capacity_modeling/tools/instance_families.py,sha256=e5RuYkCLUITvsAazDH12B6KjX_PaBsv6Ne3mj0HK_sQ,9223
|
|
78
|
+
service_capacity_modeling-0.3.77.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
|
|
79
|
+
service_capacity_modeling-0.3.77.dist-info/METADATA,sha256=hD72H-7tgG6_2MkUOy0mn9-RRXfuXomq9OyIPfNJkiw,10361
|
|
80
|
+
service_capacity_modeling-0.3.77.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
81
|
+
service_capacity_modeling-0.3.77.dist-info/entry_points.txt,sha256=ZsjzpG5SomWpT1zCE19n1uSXKH2gTI_yc33sdl0vmJg,146
|
|
82
|
+
service_capacity_modeling-0.3.77.dist-info/top_level.txt,sha256=H8XjTCLgR3enHq5t3bIbxt9SeUkUT8HT_SDv2dgIT_A,26
|
|
83
|
+
service_capacity_modeling-0.3.77.dist-info/RECORD,,
|
{service_capacity_modeling-0.3.75.dist-info → service_capacity_modeling-0.3.77.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|