service-capacity-modeling 0.3.74__tar.gz → 0.3.76__tar.gz

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 (103) hide show
  1. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/PKG-INFO +9 -5
  2. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/README.md +3 -3
  3. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/interface.py +29 -5
  4. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/common.py +257 -180
  5. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/cassandra.py +14 -9
  6. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/evcache.py +10 -18
  7. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling.egg-info/PKG-INFO +9 -5
  8. service_capacity_modeling-0.3.76/service_capacity_modeling.egg-info/requires.txt +7 -0
  9. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/setup.py +4 -1
  10. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_buffers.py +119 -0
  11. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_common.py +230 -18
  12. service_capacity_modeling-0.3.74/service_capacity_modeling.egg-info/requires.txt +0 -10
  13. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/LICENSE +0 -0
  14. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/__init__.py +0 -0
  15. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/capacity_planner.py +0 -0
  16. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/__init__.py +0 -0
  17. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/__init__.py +0 -0
  18. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json +0 -0
  19. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_zz-overrides.json +0 -0
  20. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/profiles.txt +0 -0
  21. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5.json +0 -0
  22. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5a.json +0 -0
  23. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5d.json +0 -0
  24. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5n.json +0 -0
  25. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6a.json +0 -0
  26. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6i.json +0 -0
  27. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6id.json +0 -0
  28. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7a.json +0 -0
  29. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7i.json +0 -0
  30. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c8i.json +0 -0
  31. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_i3en.json +0 -0
  32. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_i4i.json +0 -0
  33. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_i7i.json +0 -0
  34. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m4.json +0 -0
  35. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5.json +0 -0
  36. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5n.json +0 -0
  37. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6a.json +0 -0
  38. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6i.json +0 -0
  39. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6id.json +0 -0
  40. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6idn.json +0 -0
  41. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6in.json +0 -0
  42. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7a.json +0 -0
  43. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7i.json +0 -0
  44. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m8i.json +0 -0
  45. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r4.json +0 -0
  46. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5.json +0 -0
  47. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5n.json +0 -0
  48. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6a.json +0 -0
  49. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6i.json +0 -0
  50. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6id.json +0 -0
  51. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6idn.json +0 -0
  52. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6in.json +0 -0
  53. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7a.json +0 -0
  54. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7i.json +0 -0
  55. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r8i.json +0 -0
  56. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_drives.json +0 -0
  57. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json +0 -0
  58. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_services.json +0 -0
  59. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/__init__.py +0 -0
  60. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/headroom_strategy.py +0 -0
  61. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/__init__.py +0 -0
  62. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/__init__.py +0 -0
  63. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/aurora.py +0 -0
  64. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/counter.py +0 -0
  65. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/crdb.py +0 -0
  66. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/ddb.py +0 -0
  67. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/elasticsearch.py +0 -0
  68. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/entity.py +0 -0
  69. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/graphkv.py +0 -0
  70. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/iso_date_math.py +0 -0
  71. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/kafka.py +0 -0
  72. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/key_value.py +0 -0
  73. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/postgres.py +0 -0
  74. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/rds.py +0 -0
  75. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/stateless_java.py +0 -0
  76. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/time_series.py +0 -0
  77. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/time_series_config.py +0 -0
  78. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/wal.py +0 -0
  79. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/org/netflix/zookeeper.py +0 -0
  80. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/models/utils.py +0 -0
  81. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/stats.py +0 -0
  82. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/tools/__init__.py +0 -0
  83. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/tools/auto_shape.py +0 -0
  84. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/tools/fetch_pricing.py +0 -0
  85. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/tools/generate_missing.py +0 -0
  86. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling/tools/instance_families.py +0 -0
  87. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling.egg-info/SOURCES.txt +0 -0
  88. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling.egg-info/dependency_links.txt +0 -0
  89. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling.egg-info/entry_points.txt +0 -0
  90. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/service_capacity_modeling.egg-info/top_level.txt +0 -0
  91. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/setup.cfg +0 -0
  92. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_arguments.py +0 -0
  93. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_desire_merge.py +0 -0
  94. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_generate_scenarios.py +0 -0
  95. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_hardware.py +0 -0
  96. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_hardware_shapes.py +0 -0
  97. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_headroom_strategy.py +0 -0
  98. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_io2.py +0 -0
  99. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_model_dump.py +0 -0
  100. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_reproducible.py +0 -0
  101. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_simulation.py +0 -0
  102. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_utils.py +0 -0
  103. {service_capacity_modeling-0.3.74 → service_capacity_modeling-0.3.76}/tests/test_working_set.py +0 -0
@@ -1,19 +1,22 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-capacity-modeling
3
- Version: 0.3.74
3
+ Version: 0.3.76
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 py38
50
+ $ tox -e py39
47
51
 
48
52
  # Run a single test with a debugger attached if the test fails
49
- $ .tox/py38/bin/pytest -n0 -k test_java_heap_heavy --pdb --pdbcls=IPython.terminal.debugger:Pdb
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 py38 -- -k test_<your_functionality> --pdb --pdbcls=IPython.terminal.debugger:Pdb
254
+ tox -e py39 -- -k test_<your_functionality> --pdb --pdbcls=IPython.terminal.debugger:Pdb
251
255
  ```
252
256
 
253
257
  ### Pre-commit / Linting
@@ -13,10 +13,10 @@ remember this repository is public when making changes to it.
13
13
  Run the tests:
14
14
  ```bash
15
15
  # Test the capacity planner on included netflix models
16
- $ tox -e py38
16
+ $ tox -e py39
17
17
 
18
18
  # Run a single test with a debugger attached if the test fails
19
- $ .tox/py38/bin/pytest -n0 -k test_java_heap_heavy --pdb --pdbcls=IPython.terminal.debugger:Pdb
19
+ $ .tox/py39/bin/pytest -n0 -k test_java_heap_heavy --pdb --pdbcls=IPython.terminal.debugger:Pdb
20
20
 
21
21
  # Verify all type contracts
22
22
  $ tox -e mypy
@@ -217,7 +217,7 @@ To contribute to this project:
217
217
  2. Write a unit test using `pytest` in the `tests` folder.
218
218
  3. Ensure your tests pass via `tox` or debug them with:
219
219
  ```
220
- tox -e py38 -- -k test_<your_functionality> --pdb --pdbcls=IPython.terminal.debugger:Pdb
220
+ tox -e py39 -- -k test_<your_functionality> --pdb --pdbcls=IPython.terminal.debugger:Pdb
221
221
  ```
222
222
 
223
223
  ### Pre-commit / Linting
@@ -264,14 +264,14 @@ class Drive(ExcludeUnsetModel):
264
264
  return max(self.block_size_kib, self.group_size_kib)
265
265
 
266
266
  @property
267
- def max_size_gib(self):
267
+ def max_size_gib(self) -> int:
268
268
  if self.max_scale_size_gib != 0:
269
269
  return self.max_scale_size_gib
270
270
  else:
271
271
  return self.size_gib
272
272
 
273
273
  @property
274
- def max_io_per_s(self):
274
+ def max_io_per_s(self) -> int:
275
275
  if self.max_scale_io_per_s != 0:
276
276
  return self.max_scale_io_per_s
277
277
  else:
@@ -779,23 +779,48 @@ class BufferComponent(str, Enum):
779
779
  compute = "compute"
780
780
  # [Data Shape] a.k.a. "Dataset" related buffers, e.g. Disk and Memory
781
781
  storage = "storage"
782
-
783
782
  # Resource specific component
784
783
  cpu = "cpu"
785
784
  network = "network"
786
785
  disk = "disk"
787
786
  memory = "memory"
788
787
 
788
+ @staticmethod
789
+ def is_generic(component: str) -> bool:
790
+ return component in {BufferComponent.compute, BufferComponent.storage}
791
+
792
+ @staticmethod
793
+ def is_specific(component: str) -> bool:
794
+ return not BufferComponent.is_generic(component)
795
+
789
796
 
790
797
  class BufferIntent(str, Enum):
791
798
  # Most buffers show "desired" buffer, this is the default
792
799
  desired = "desired"
793
800
  # ratio on top of existing buffers to ensure exists. Generally combined
794
801
  # with a different desired buffer to ensure we don't just scale needlessly
802
+ # This means we can scale up or down as as long as we meet the desired buffer.
795
803
  scale = "scale"
796
- # Ignore model preferences, just preserve existing buffers
804
+
805
+ # DEPRECATED: Use scale_up/scale_down instead
806
+ # Ignores model preferences, just preserve existing buffers
807
+ # We rarely actually want to do this since it can cause severe over provisioning
797
808
  preserve = "preserve"
798
809
 
810
+ # Scale up if necessary to meet the desired buffer.
811
+ # If the existing resource is over-provisioned, do not reduce the requirement.
812
+ # If under-provisioned, the requirement can be increased to meet the desired buffer.
813
+ # Example: need 20 cores but have 10 → scale up to 20 cores.
814
+ # Example 2: need 20 cores but have 40 → do not scale down and require at
815
+ # least 40 cores
816
+ scale_up = "scale_up"
817
+ # Scale down if necessary to meet the desired buffer.
818
+ # If the existing resource is under-provisioned, do not increase the requirement.
819
+ # If over-provisioned, the requirement can be decreased to meet the desired buffer.
820
+ # Example: need 20 cores but have 10 → maintain buffer and do not scale up.
821
+ # Example 2: need 20 cores but have 40 → scale down to 20 cores.
822
+ scale_down = "scale_down"
823
+
799
824
 
800
825
  class Buffer(ExcludeUnsetModel):
801
826
  # The value of the buffer expressed as a ratio over "normal" load e.g. 1.5x
@@ -819,7 +844,6 @@ class Buffers(ExcludeUnsetModel):
819
844
  "compute": Buffer(ratio: 1.5),
820
845
  }
821
846
  )
822
-
823
847
  And then models layer in their buffers, for example if a workload
824
848
  requires 10 CPU cores, but the operator of that workload likes to build in
825
849
  2x buffer for background work (20 cores provisioned), they would express that