service-capacity-modeling 0.3.76__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.

Files changed (37) hide show
  1. service_capacity_modeling/capacity_planner.py +46 -40
  2. service_capacity_modeling/hardware/__init__.py +11 -7
  3. service_capacity_modeling/interface.py +20 -18
  4. service_capacity_modeling/models/__init__.py +21 -2
  5. service_capacity_modeling/models/common.py +20 -19
  6. service_capacity_modeling/models/headroom_strategy.py +2 -1
  7. service_capacity_modeling/models/org/netflix/__init__.py +4 -1
  8. service_capacity_modeling/models/org/netflix/aurora.py +12 -7
  9. service_capacity_modeling/models/org/netflix/cassandra.py +22 -12
  10. service_capacity_modeling/models/org/netflix/counter.py +4 -2
  11. service_capacity_modeling/models/org/netflix/crdb.py +7 -4
  12. service_capacity_modeling/models/org/netflix/ddb.py +9 -5
  13. service_capacity_modeling/models/org/netflix/elasticsearch.py +8 -6
  14. service_capacity_modeling/models/org/netflix/entity.py +5 -3
  15. service_capacity_modeling/models/org/netflix/evcache.py +13 -9
  16. service_capacity_modeling/models/org/netflix/graphkv.py +5 -3
  17. service_capacity_modeling/models/org/netflix/iso_date_math.py +12 -9
  18. service_capacity_modeling/models/org/netflix/kafka.py +13 -7
  19. service_capacity_modeling/models/org/netflix/key_value.py +4 -2
  20. service_capacity_modeling/models/org/netflix/postgres.py +4 -2
  21. service_capacity_modeling/models/org/netflix/rds.py +10 -5
  22. service_capacity_modeling/models/org/netflix/stateless_java.py +4 -2
  23. service_capacity_modeling/models/org/netflix/time_series.py +4 -2
  24. service_capacity_modeling/models/org/netflix/time_series_config.py +3 -3
  25. service_capacity_modeling/models/org/netflix/wal.py +4 -2
  26. service_capacity_modeling/models/org/netflix/zookeeper.py +5 -3
  27. service_capacity_modeling/stats.py +14 -11
  28. service_capacity_modeling/tools/auto_shape.py +10 -6
  29. service_capacity_modeling/tools/fetch_pricing.py +13 -6
  30. service_capacity_modeling/tools/generate_missing.py +4 -3
  31. service_capacity_modeling/tools/instance_families.py +4 -1
  32. {service_capacity_modeling-0.3.76.dist-info → service_capacity_modeling-0.3.77.dist-info}/METADATA +1 -1
  33. {service_capacity_modeling-0.3.76.dist-info → service_capacity_modeling-0.3.77.dist-info}/RECORD +37 -37
  34. {service_capacity_modeling-0.3.76.dist-info → service_capacity_modeling-0.3.77.dist-info}/WHEEL +0 -0
  35. {service_capacity_modeling-0.3.76.dist-info → service_capacity_modeling-0.3.77.dist-info}/entry_points.txt +0 -0
  36. {service_capacity_modeling-0.3.76.dist-info → service_capacity_modeling-0.3.77.dist-info}/licenses/LICENSE +0 -0
  37. {service_capacity_modeling-0.3.76.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(user_desires, extra_model_arguments):
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(user_desires, extra_model_arguments):
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(low, mid, high, confidence):
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(low, mid, high, confidence):
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
- cost = (beta_dist.cdf(low, alpha, beta) - low_p) ** 2
109
- cost += (beta_dist.cdf(high, alpha, beta) - high_p) ** 2
110
- return cost
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
- elif interval.model_with == IntervalModel.gamma:
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, io_perf: Optional[IOPerformance], scale: Fraction, data: Dict
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, Instance]] = {"instances": {}}
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
- instances[instance_type] = {"annual_cost": annual_cost}
75
- if "deprecated" in instance_type.lower():
76
- instances[instance_type]["lifecycle"] = "deprecated"
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 # pylint: disable=import-error
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) -> list:
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,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-capacity-modeling
3
- Version: 0.3.76
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
@@ -1,8 +1,8 @@
1
1
  service_capacity_modeling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- service_capacity_modeling/capacity_planner.py,sha256=B6e0esOAvV6qMkEeLIO9rEveTftRG_Ut_d9gYgSIM0w,31914
3
- service_capacity_modeling/interface.py,sha256=WLCVqrRgH4Vz3YhzZAct0QMXrBOow7v5ipZLoJ7AfSc,38826
4
- service_capacity_modeling/stats.py,sha256=8HIPwVnmvbauBwXhn6vbNYO7-CzWPuymnq0eX7ZA1_w,5849
5
- service_capacity_modeling/hardware/__init__.py,sha256=kzIHnIymwnf4qQYDpfIChIAxTF8b87XtnBg1TwF_J9E,8974
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=XK7rTBW8ZXQY5L9Uy2FwjuFN_KBW3hKw7IrhG1piajs,13567
49
- service_capacity_modeling/models/common.py,sha256=ntBx5Rku4UfJiKwZ0tkv75gXBzUlGT6hOUTLvENlElA,36534
50
- service_capacity_modeling/models/headroom_strategy.py,sha256=QIkP_K_tK2EGAjloaGfXeAPH5M0UDCN8FlAtwV9xxTA,651
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=m7IaQbo85NEbDvfoPJREIznpzg0YHTCrKP5C1GvnOYM,2378
54
- service_capacity_modeling/models/org/netflix/aurora.py,sha256=Mi9zd48k64GkKIjAs3J1S2qThguNvyWIy2dUmhwrVhc,12883
55
- service_capacity_modeling/models/org/netflix/cassandra.py,sha256=MnTD7X3-mm05LtM_CjWatIVyeMCfPqVsxszTDb8s7ao,38632
56
- service_capacity_modeling/models/org/netflix/counter.py,sha256=hOVRRCgCPU-A5TdLKQXc_mWTQpkKOWRNjOeECdDP7kA,9205
57
- service_capacity_modeling/models/org/netflix/crdb.py,sha256=ELIbxwfNsJcEkNGW7qtz0SEzt3Vj6wj8QL5QQeebIlo,20635
58
- service_capacity_modeling/models/org/netflix/ddb.py,sha256=GDoXVIpDDY6xDB0dsiaz7RAPPj-qffTrM9N6w5-5ndg,26311
59
- service_capacity_modeling/models/org/netflix/elasticsearch.py,sha256=AfyqfC4Y_QDyvYLBbeq8_ReM9q54RUNrZkOsSBjBgIc,25085
60
- service_capacity_modeling/models/org/netflix/entity.py,sha256=M0vzwhf8UAbVxnXspAkN4GEbq3rix6yoky6W2oDG6a0,8648
61
- service_capacity_modeling/models/org/netflix/evcache.py,sha256=mLSoecrXwwfrt9ZRu1LZ2po8lD50orQAFnpvW0YTmI8,25396
62
- service_capacity_modeling/models/org/netflix/graphkv.py,sha256=iS5QDDv9_hNY6nIgdL-umB439qP7-jN-n6_Tl6d-ZSo,8557
63
- service_capacity_modeling/models/org/netflix/iso_date_math.py,sha256=CPGHLmbGeNqkcYcmCkLKhPZcAU-yTJ2HjvuXdnNyCYc,996
64
- service_capacity_modeling/models/org/netflix/kafka.py,sha256=MDHaht5cWsOJ113uMl6nQ7nllSATrlBCQ-TXLkqMWEk,25466
65
- service_capacity_modeling/models/org/netflix/key_value.py,sha256=yL5moU0SJD4ocBU9zeGhPYE4KY7oSSq5yqfVWd_Ot2g,9336
66
- service_capacity_modeling/models/org/netflix/postgres.py,sha256=R3Tog-ZW1Yx6gO3AKqI_wquSm30s01QX9yWR7Jvgk9A,4055
67
- service_capacity_modeling/models/org/netflix/rds.py,sha256=z9egFBg4Ltqyuz_WHk-_hw-xL-EQNzl1JopJoWdNli8,10768
68
- service_capacity_modeling/models/org/netflix/stateless_java.py,sha256=1la-z5tG5CGr7QM5SHBGguxzkA7BxJPAoUWhthADe8s,11306
69
- service_capacity_modeling/models/org/netflix/time_series.py,sha256=XDujp-m7bRQWFDXKY7nto0OQUq3v1z56HZKs3eO8o_I,8167
70
- service_capacity_modeling/models/org/netflix/time_series_config.py,sha256=Qrtngn6VQq13NF55h_oRsSNA8lVnOOIb-c-dsQn6TH4,7311
71
- service_capacity_modeling/models/org/netflix/wal.py,sha256=9GA7V5pZF1mKu9mM7kI9XN_i6U7Ap1oh6REzXO2ZxOM,4409
72
- service_capacity_modeling/models/org/netflix/zookeeper.py,sha256=BHLjnVDyx15wMGrc0QFmv9v6M95snU30WR7mhIRoa4Q,7601
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=Pe9a7vbFxqIy8eL8ssENTu9FNnFLjlZgmD-ZH2fexZs,14976
75
- service_capacity_modeling/tools/fetch_pricing.py,sha256=JkgJPTE0SVj8sdGQvo0HN-Hdv3nfA2tu7C_Arad5aX8,3762
76
- service_capacity_modeling/tools/generate_missing.py,sha256=XqUs54CPfli4XtK0rEiFKqDvpwCiMAD8wrl7fAxpYHs,3062
77
- service_capacity_modeling/tools/instance_families.py,sha256=5Y4_aJ5ML-JPzwaWcS_caUeZ28CmUVoqjYYLaRl01vg,9148
78
- service_capacity_modeling-0.3.76.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
79
- service_capacity_modeling-0.3.76.dist-info/METADATA,sha256=D9ttOS9ax1L4S-134-aa8tD5vW_4wydeQyberACrxmQ,10361
80
- service_capacity_modeling-0.3.76.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
81
- service_capacity_modeling-0.3.76.dist-info/entry_points.txt,sha256=ZsjzpG5SomWpT1zCE19n1uSXKH2gTI_yc33sdl0vmJg,146
82
- service_capacity_modeling-0.3.76.dist-info/top_level.txt,sha256=H8XjTCLgR3enHq5t3bIbxt9SeUkUT8HT_SDv2dgIT_A,26
83
- service_capacity_modeling-0.3.76.dist-info/RECORD,,
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,,