service-capacity-modeling 0.3.57__tar.gz → 0.3.59__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 (96) hide show
  1. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/PKG-INFO +1 -1
  2. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/cassandra.py +37 -8
  3. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/tools/generate_missing.py +4 -3
  4. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling.egg-info/PKG-INFO +1 -1
  5. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/LICENSE +0 -0
  6. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/README.md +0 -0
  7. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/__init__.py +0 -0
  8. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/capacity_planner.py +0 -0
  9. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/__init__.py +0 -0
  10. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/__init__.py +0 -0
  11. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json +0 -0
  12. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_zz-overrides.json +0 -0
  13. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/profiles.txt +0 -0
  14. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5.json +0 -0
  15. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5a.json +0 -0
  16. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5d.json +0 -0
  17. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5n.json +0 -0
  18. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6a.json +0 -0
  19. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6i.json +0 -0
  20. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6id.json +0 -0
  21. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7a.json +0 -0
  22. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7i.json +0 -0
  23. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m4.json +0 -0
  24. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5.json +0 -0
  25. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5n.json +0 -0
  26. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6a.json +0 -0
  27. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6i.json +0 -0
  28. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6id.json +0 -0
  29. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6idn.json +0 -0
  30. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6in.json +0 -0
  31. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7a.json +0 -0
  32. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7i.json +0 -0
  33. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r4.json +0 -0
  34. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5.json +0 -0
  35. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5n.json +0 -0
  36. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6a.json +0 -0
  37. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6i.json +0 -0
  38. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6id.json +0 -0
  39. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6idn.json +0 -0
  40. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6in.json +0 -0
  41. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7a.json +0 -0
  42. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7i.json +0 -0
  43. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_drives.json +0 -0
  44. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json +0 -0
  45. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_services.json +0 -0
  46. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/interface.py +0 -0
  47. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/__init__.py +0 -0
  48. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/common.py +0 -0
  49. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/headroom_strategy.py +0 -0
  50. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/__init__.py +0 -0
  51. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/__init__.py +0 -0
  52. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/aurora.py +0 -0
  53. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/counter.py +0 -0
  54. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/crdb.py +0 -0
  55. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/ddb.py +0 -0
  56. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/elasticsearch.py +0 -0
  57. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/entity.py +0 -0
  58. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/evcache.py +0 -0
  59. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/graphkv.py +0 -0
  60. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/iso_date_math.py +0 -0
  61. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/kafka.py +0 -0
  62. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/key_value.py +0 -0
  63. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/postgres.py +0 -0
  64. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/rds.py +0 -0
  65. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/stateless_java.py +0 -0
  66. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/time_series.py +0 -0
  67. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/time_series_config.py +0 -0
  68. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/wal.py +0 -0
  69. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/org/netflix/zookeeper.py +0 -0
  70. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/models/utils.py +0 -0
  71. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/stats.py +0 -0
  72. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/tools/__init__.py +0 -0
  73. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/tools/auto_shape.py +0 -0
  74. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/tools/fetch_pricing.py +0 -0
  75. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling/tools/instance_families.py +0 -0
  76. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling.egg-info/SOURCES.txt +0 -0
  77. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling.egg-info/dependency_links.txt +0 -0
  78. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling.egg-info/entry_points.txt +0 -0
  79. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling.egg-info/requires.txt +0 -0
  80. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/service_capacity_modeling.egg-info/top_level.txt +0 -0
  81. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/setup.cfg +0 -0
  82. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/setup.py +0 -0
  83. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_arguments.py +0 -0
  84. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_buffers.py +0 -0
  85. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_common.py +0 -0
  86. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_desire_merge.py +0 -0
  87. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_generate_scenarios.py +0 -0
  88. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_hardware.py +0 -0
  89. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_hardware_shapes.py +0 -0
  90. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_headroom_strategy.py +0 -0
  91. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_io2.py +0 -0
  92. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_model_dump.py +0 -0
  93. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_reproducible.py +0 -0
  94. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_simulation.py +0 -0
  95. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_utils.py +0 -0
  96. {service_capacity_modeling-0.3.57 → service_capacity_modeling-0.3.59}/tests/test_working_set.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-capacity-modeling
3
- Version: 0.3.57
3
+ Version: 0.3.59
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com
@@ -4,6 +4,7 @@ from typing import Any
4
4
  from typing import Callable
5
5
  from typing import Dict
6
6
  from typing import Optional
7
+ from typing import Set
7
8
 
8
9
  from pydantic import BaseModel
9
10
  from pydantic import Field
@@ -47,6 +48,9 @@ from service_capacity_modeling.stats import dist_for_interval
47
48
  logger = logging.getLogger(__name__)
48
49
 
49
50
  BACKGROUND_BUFFER = "background"
51
+ CRITICAL_TIERS: Set[int] = {0, 1}
52
+ # cluster size aka nodes per ASG
53
+ CRITICAL_TIER_MIN_CLUSTER_SIZE = 2
50
54
 
51
55
 
52
56
  def _write_buffer_gib_zone(
@@ -362,10 +366,7 @@ def _estimate_cassandra_cluster_zonal( # pylint: disable=too-many-positional-ar
362
366
  # Cassandra clusters should aim to be at least 2 nodes per zone to start
363
367
  # out with for tier 0 or tier 1. This gives us more room to "up-color"]
364
368
  # clusters.
365
- min_count = 0
366
- if desires.service_tier <= 1:
367
- min_count = 2
368
-
369
+ min_count = 2 if desires.service_tier in CRITICAL_TIERS else 0
369
370
  base_mem = _get_base_memory(desires)
370
371
 
371
372
  heap_fn = _cass_heap_for_write_buffer(
@@ -583,6 +584,33 @@ class NflxCassandraArguments(BaseModel):
583
584
 
584
585
 
585
586
  class NflxCassandraCapacityModel(CapacityModel):
587
+ @staticmethod
588
+ def get_required_cluster_size(tier, extra_model_arguments):
589
+ required_cluster_size: Optional[int] = (
590
+ math.ceil(extra_model_arguments["required_cluster_size"])
591
+ if "required_cluster_size" in extra_model_arguments
592
+ else None
593
+ )
594
+
595
+ if tier not in CRITICAL_TIERS or required_cluster_size is None:
596
+ return required_cluster_size
597
+
598
+ # If the upstream explicitly set a cluster size, make sure it is
599
+ # at least CRITICAL_TIER_MIN_CLUSTER_SIZE. We cannot do a max
600
+ # of the two because the horizontal scaling is disabled
601
+ if required_cluster_size < CRITICAL_TIER_MIN_CLUSTER_SIZE:
602
+ raise ValueError(
603
+ f"Required cluster size must be at least "
604
+ f"{CRITICAL_TIER_MIN_CLUSTER_SIZE=} when "
605
+ f"service tier({tier}) is a "
606
+ f"critical tier({CRITICAL_TIERS})."
607
+ f"If it is an existing cluster, horizontally "
608
+ f"scale the cluster to be >= "
609
+ f"{CRITICAL_TIER_MIN_CLUSTER_SIZE}"
610
+ )
611
+
612
+ return required_cluster_size
613
+
586
614
  @staticmethod
587
615
  def capacity_plan(
588
616
  instance: Instance,
@@ -601,11 +629,12 @@ class NflxCassandraCapacityModel(CapacityModel):
601
629
  require_attached_disks: bool = extra_model_arguments.get(
602
630
  "require_attached_disks", False
603
631
  )
604
- required_cluster_size: Optional[int] = (
605
- math.ceil(extra_model_arguments["required_cluster_size"])
606
- if "required_cluster_size" in extra_model_arguments
607
- else None
632
+ required_cluster_size: Optional[
633
+ int
634
+ ] = NflxCassandraCapacityModel.get_required_cluster_size(
635
+ desires.service_tier, extra_model_arguments
608
636
  )
637
+
609
638
  max_rps_to_disk: int = extra_model_arguments.get("max_rps_to_disk", 500)
610
639
  max_regional_size: int = extra_model_arguments.get("max_regional_size", 192)
611
640
  max_local_disk_gib: int = extra_model_arguments.get("max_local_disk_gib", 5120)
@@ -40,7 +40,7 @@ def build_command(family: str, params: Dict[str, Any], output_path: Path) -> lis
40
40
  return cmd
41
41
 
42
42
 
43
- def main(debug: bool = True, execute: bool = False):
43
+ def main(debug: bool = True, execute: bool = False, force: bool = False):
44
44
  expected_path = (
45
45
  Path(__file__).resolve().parent.parent / "hardware/profiles/shapes/aws"
46
46
  )
@@ -51,7 +51,7 @@ def main(debug: bool = True, execute: bool = False):
51
51
  missing_families = {
52
52
  family: params
53
53
  for family, params in INSTANCE_TYPES.items()
54
- if not (expected_path / f"auto_{family}.json").exists()
54
+ if force or not (expected_path / f"auto_{family}.json").exists()
55
55
  }
56
56
 
57
57
  if not missing_families:
@@ -87,5 +87,6 @@ if __name__ == "__main__":
87
87
  # Parse arguments to determine whether to execute commands
88
88
  execute_mode = "--execute" in sys.argv
89
89
  debug_mode = "--debug" in sys.argv or not execute_mode
90
+ force_mode = "--force" in sys.argv
90
91
 
91
- main(debug=debug_mode, execute=execute_mode)
92
+ main(debug=debug_mode, execute=execute_mode, force=force_mode)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-capacity-modeling
3
- Version: 0.3.57
3
+ Version: 0.3.59
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com