service-capacity-modeling 0.3.91__tar.gz → 0.3.92__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.
Files changed (105) hide show
  1. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/PKG-INFO +1 -1
  2. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/cassandra.py +1 -1
  3. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling.egg-info/PKG-INFO +1 -1
  4. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_reproducible.py +35 -14
  5. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/LICENSE +0 -0
  6. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/README.md +0 -0
  7. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/__init__.py +0 -0
  8. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/capacity_planner.py +0 -0
  9. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/enum_utils.py +0 -0
  10. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/__init__.py +0 -0
  11. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/__init__.py +0 -0
  12. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json +0 -0
  13. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_zz-overrides.json +0 -0
  14. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/profiles.txt +0 -0
  15. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5.json +0 -0
  16. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5a.json +0 -0
  17. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5d.json +0 -0
  18. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5n.json +0 -0
  19. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6a.json +0 -0
  20. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6i.json +0 -0
  21. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6id.json +0 -0
  22. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7a.json +0 -0
  23. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7i.json +0 -0
  24. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c8i.json +0 -0
  25. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_i3en.json +0 -0
  26. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_i4i.json +0 -0
  27. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_i7i.json +0 -0
  28. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m4.json +0 -0
  29. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5.json +0 -0
  30. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5n.json +0 -0
  31. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6a.json +0 -0
  32. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6i.json +0 -0
  33. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6id.json +0 -0
  34. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6idn.json +0 -0
  35. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6in.json +0 -0
  36. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7a.json +0 -0
  37. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7i.json +0 -0
  38. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m8i.json +0 -0
  39. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r4.json +0 -0
  40. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5.json +0 -0
  41. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5n.json +0 -0
  42. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6a.json +0 -0
  43. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6i.json +0 -0
  44. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6id.json +0 -0
  45. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6idn.json +0 -0
  46. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6in.json +0 -0
  47. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7a.json +0 -0
  48. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7i.json +0 -0
  49. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r8i.json +0 -0
  50. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_drives.json +0 -0
  51. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json +0 -0
  52. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_services.json +0 -0
  53. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/interface.py +0 -0
  54. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/__init__.py +0 -0
  55. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/common.py +0 -0
  56. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/headroom_strategy.py +0 -0
  57. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/__init__.py +0 -0
  58. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/__init__.py +0 -0
  59. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/aurora.py +0 -0
  60. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/control.py +0 -0
  61. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/counter.py +0 -0
  62. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/crdb.py +0 -0
  63. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/ddb.py +0 -0
  64. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/elasticsearch.py +0 -0
  65. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/entity.py +0 -0
  66. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/evcache.py +0 -0
  67. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/graphkv.py +0 -0
  68. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/iso_date_math.py +0 -0
  69. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/kafka.py +0 -0
  70. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/key_value.py +0 -0
  71. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/postgres.py +0 -0
  72. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/rds.py +0 -0
  73. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/stateless_java.py +0 -0
  74. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/time_series.py +0 -0
  75. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/time_series_config.py +0 -0
  76. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/wal.py +0 -0
  77. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/org/netflix/zookeeper.py +0 -0
  78. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/models/utils.py +0 -0
  79. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/stats.py +0 -0
  80. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/tools/__init__.py +0 -0
  81. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/tools/auto_shape.py +0 -0
  82. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/tools/fetch_pricing.py +0 -0
  83. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/tools/generate_missing.py +0 -0
  84. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling/tools/instance_families.py +0 -0
  85. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling.egg-info/SOURCES.txt +0 -0
  86. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling.egg-info/dependency_links.txt +0 -0
  87. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling.egg-info/entry_points.txt +0 -0
  88. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling.egg-info/requires.txt +0 -0
  89. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/service_capacity_modeling.egg-info/top_level.txt +0 -0
  90. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/setup.cfg +0 -0
  91. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/setup.py +0 -0
  92. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_arguments.py +0 -0
  93. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_buffers.py +0 -0
  94. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_common.py +0 -0
  95. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_desire_merge.py +0 -0
  96. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_enum_utils.py +0 -0
  97. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_generate_scenarios.py +0 -0
  98. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_hardware.py +0 -0
  99. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_hardware_shapes.py +0 -0
  100. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_headroom_strategy.py +0 -0
  101. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_io2.py +0 -0
  102. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_model_dump.py +0 -0
  103. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_simulation.py +0 -0
  104. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/tests/test_utils.py +0 -0
  105. {service_capacity_modeling-0.3.91 → service_capacity_modeling-0.3.92}/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.91
3
+ Version: 0.3.92
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com
@@ -388,7 +388,7 @@ def _estimate_cassandra_cluster_zonal( # pylint: disable=too-many-positional-ar
388
388
  max_table_buffer_percent: float = 0.11,
389
389
  ) -> Optional[CapacityPlan]:
390
390
  # Netflix Cassandra doesn't like to deploy on really small instances
391
- if instance.cpu < 2 or instance.ram_gib < 14:
391
+ if instance.cpu < 2 or instance.ram_gib <= 16:
392
392
  return None
393
393
 
394
394
  # if we're not allowed to use gp2, skip EBS only types
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-capacity-modeling
3
- Version: 0.3.91
3
+ Version: 0.3.92
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com
@@ -38,6 +38,17 @@ def test_repeated_plans():
38
38
 
39
39
 
40
40
  def test_compositional():
41
+ """Test that key-value composition produces identical Cassandra plans.
42
+
43
+ The key-value model composes with Cassandra via `lambda x: x` (identity),
44
+ meaning the Cassandra sub-model must receive identical inputs and produce
45
+ byte-for-byte identical outputs. This is the strictest possible test of
46
+ compositional correctness.
47
+
48
+ Note: The final least_regret results may differ due to reduce_by_family()
49
+ filtering across both regional and zonal dimensions, but that is a
50
+ presentation concern - the underlying Cassandra planning must be identical.
51
+ """
41
52
  direct_result = planner.plan(
42
53
  model_name="org.netflix.cassandra",
43
54
  region="us-east-1",
@@ -53,20 +64,30 @@ def test_compositional():
53
64
  explain=True,
54
65
  )
55
66
 
56
- count = len(direct_result.least_regret)
57
- direct_clusters = []
58
- for i in range(count):
59
- direct_cluster = direct_result.least_regret[i].candidate_clusters.zonal[0]
60
- direct_clusters.append(direct_cluster)
61
- # FIXME(josephl): It appears that since we are now zipping the
62
- # regional and zonal clusters we can get repeats in the zonal.
63
- # This is odd to me but not related to the 6th gen instances
64
- composed_cluster = composed_result.least_regret[i].candidate_clusters.zonal[0]
65
- assert composed_cluster in direct_clusters
66
-
67
- java = composed_result.least_regret[i].candidate_clusters.regional[0]
67
+ # Strictest test: Cassandra regret clusters must be EXACTLY identical
68
+ # (same plans, same regrets, same order) since key-value uses `lambda x: x`
69
+ direct_cass = direct_result.explanation.regret_clusters_by_model[
70
+ "org.netflix.cassandra"
71
+ ]
72
+ composed_cass = composed_result.explanation.regret_clusters_by_model[
73
+ "org.netflix.cassandra"
74
+ ]
75
+ assert len(direct_cass) == len(composed_cass)
76
+ for i, ((d_plan, _, d_regret), (c_plan, _, c_regret)) in enumerate(
77
+ zip(direct_cass, composed_cass)
78
+ ):
79
+ assert d_plan == c_plan, f"Plan {i} differs"
80
+ assert d_regret == c_regret, f"Regret {i} differs: {d_regret} vs {c_regret}"
81
+
82
+ # Verify the composed results have the expected structure
83
+ for lr in composed_result.least_regret:
84
+ # Zonal cluster should be Cassandra
85
+ assert lr.candidate_clusters.zonal[0].cluster_type == "cassandra"
86
+ # Regional cluster should be the key-value Java app
87
+ java = lr.candidate_clusters.regional[0]
68
88
  assert java.cluster_type == "dgwkv"
69
- # usually like 15 * 4 = ~50
89
+ # Sanity check on Java app sizing (~48 total CPUs: 6 x 8 vCPU instances,
90
+ # but may vary with CPU architecture or pricing improvements)
70
91
  assert 100 > java.count * java.instance.cpu > 20
71
92
 
72
93
 
@@ -80,7 +101,7 @@ def test_multiple_options_diversify_with_more_simulations():
80
101
  # These values happen to work today but may not work in the future with
81
102
  # changes to the CP inputs (instances, costs, performance).
82
103
  # Feel free to change the numbers as long as it fits the below assertion
83
- arbitrary_num_results = 8
104
+ arbitrary_num_results = 12
84
105
  arbitrary_small_number = 12
85
106
  arbitrary_large_number = 1024
86
107
  assert arbitrary_small_number < arbitrary_large_number