Skip to content

Commit a725f2d

Browse files
authored
Bugfix and bump to v0.8.1 (#87)
* fixing #86 * Remove unused 'name' attributes from failure policies. * Update failure policy references in YAML scenarios * Few bug fixes. Update version to 0.8.1 * improve failure policy assertions in integration tests
1 parent e9b2f61 commit a725f2d

26 files changed

+1218
-157
lines changed

docs/reference/api-full.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ For a curated, example-driven API guide, see **[api.md](api.md)**.
1010
> - **[CLI Reference](cli.md)** - Command-line interface
1111
> - **[DSL Reference](dsl.md)** - YAML syntax guide
1212
13-
**Generated from source code on:** August 06, 2025 at 16:18 UTC
13+
**Generated from source code on:** August 06, 2025 at 21:33 UTC
1414

1515
**Modules auto-discovered:** 53
1616

@@ -432,7 +432,6 @@ Example YAML configuration:
432432
```yaml
433433
failure_policy:
434434
attrs:
435-
name: "Texas Grid Outage Scenario"
436435
description: "Regional power grid failure affecting telecom infrastructure"
437436
fail_risk_groups: true
438437
rules:

docs/reference/dsl.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,6 @@ Defines named failure policies for simulating network failures to test resilienc
411411
```yaml
412412
failure_policy_set:
413413
policy_name_1:
414-
name: "PolicyName" # Optional
415414
fail_risk_groups: true | false
416415
fail_risk_group_children: true | false
417416
use_cache: true | false

ngraph/cli.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ def _inspect_scenario(path: Path, detail: bool = False) -> None:
120120
original_level = logger.level
121121
logger.setLevel(logging.WARNING)
122122
try:
123-
explorer = NetworkExplorer.explore_network(network)
123+
explorer = NetworkExplorer.explore_network(
124+
network, scenario.components_library
125+
)
124126
print("\n Network Hierarchy:")
125127
explorer.print_tree(
126128
max_depth=3 if not detail else None,

ngraph/failure_policy.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ class FailurePolicy:
9797
```yaml
9898
failure_policy:
9999
attrs:
100-
name: "Texas Grid Outage Scenario"
101100
description: "Regional power grid failure affecting telecom infrastructure"
102101
fail_risk_groups: true
103102
rules:

ngraph/scenario.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,6 @@ def _build_failure_policy(
253253
Example:
254254
failure_policy_set:
255255
default:
256-
name: "test" # (Currently unused if present)
257256
fail_risk_groups: true
258257
fail_risk_group_children: false
259258
use_cache: true

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
55
# ---------------------------------------------------------------------
66
[project]
77
name = "ngraph"
8-
version = "0.8.0"
8+
version = "0.8.1"
99
description = "A tool and a library for network modeling and capacity analysis."
1010
readme = "README.md"
1111
authors = [{ name = "Andrey Golovanov" }]

scenarios/nsfnet.yaml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ risk_groups:
156156
failure_policy_set:
157157
availability_1992:
158158
attrs:
159-
name: "historical_availability_1992"
160159
description: >
161160
Approximates 1992 backbone reliability: each physical DS-3 has
162161
~99.9 % monthly availability (p=0.001 failure), and each CNSS or
@@ -174,9 +173,8 @@ failure_policy_set:
174173
rule_type: random
175174
probability: 0.0005 # 0.05 % chance a given node is down
176175

177-
default:
176+
single_random_link_failure:
178177
attrs:
179-
name: single_random_link_failure
180178
description: Fails exactly one random link to test network resilience
181179
rules:
182180
- entity_scope: link
@@ -199,7 +197,7 @@ workflow:
199197
flow_placement: PROPORTIONAL
200198
iterations: 1000
201199
baseline: true
202-
failure_policy: default
200+
failure_policy: single_random_link_failure
203201
store_failure_patterns: true
204202
- step_type: CapacityEnvelopeAnalysis
205203
name: ce_2
@@ -209,7 +207,7 @@ workflow:
209207
parallelism: 8
210208
shortest_path: false
211209
flow_placement: PROPORTIONAL
212-
iterations: 1000000
210+
iterations: 10000
213211
baseline: true
214212
failure_policy: availability_1992
215213
store_failure_patterns: true

scenarios/simple.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,17 +111,15 @@ risk_groups:
111111
- name: srlg_12
112112

113113
failure_policy_set:
114-
default:
114+
single_random_link_failure:
115115
attrs:
116-
name: "single_random_link_failure"
117116
description: "Fails exactly one random link to test network resilience"
118117
rules:
119118
- entity_scope: "link"
120119
rule_type: "choice"
121120
count: 1
122121
single_shared_risk_group_failure:
123122
attrs:
124-
name: "single_shared_risk_group_failure"
125123
description: "Fails exactly one random shared risk group to test network resilience"
126124
rules:
127125
- entity_scope: "risk_group"
@@ -144,7 +142,7 @@ workflow:
144142
seed: 42
145143
iterations: 1000
146144
baseline: true # Enable baseline mode
147-
failure_policy: "default"
145+
failure_policy: "single_random_link_failure"
148146
- step_type: CapacityEnvelopeAnalysis
149147
name: "ce_2"
150148
source_path: "^(spoke_.+)"

tests/integration/expectations.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ def _calculate_scenario_3_total_nodes() -> int:
121121

122122
# Failure policy expectations by scenario
123123
FAILURE_POLICY_EXPECTATIONS = {
124-
"scenario_1": {"name": "anySingleLink", "rules": 1, "scopes": ["link"]},
125-
"scenario_2": {"name": "anySingleLink", "rules": 1, "scopes": ["link"]},
126-
"scenario_3": {"name": None, "rules": 0, "scopes": []}, # No failure policy
124+
"scenario_1": {"rules": 1, "scopes": ["link"]},
125+
"scenario_2": {"rules": 1, "scopes": ["link"]},
126+
"scenario_3": {"rules": 0, "scopes": []}, # No failure policy
127127
}
128128

129129
# Scenario 4: Advanced DSL features with complex data center fabric

tests/integration/helpers.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -251,15 +251,13 @@ def validate_traffic_demands(self, expected_count: int) -> None:
251251

252252
def validate_failure_policy(
253253
self,
254-
expected_name: Optional[str],
255254
expected_rules: int,
256255
expected_scopes: Optional[List[str]] = None,
257256
) -> None:
258257
"""
259258
Validate failure policy configuration.
260259
261260
Args:
262-
expected_name: Expected failure policy name (None if no policy expected)
263261
expected_rules: Expected number of failure rules
264262
expected_scopes: Optional list of expected rule scopes (node/link)
265263
@@ -268,26 +266,19 @@ def validate_failure_policy(
268266
"""
269267
policy = self.scenario.failure_policy_set.get_default_policy()
270268

271-
if expected_name is None:
272-
assert policy is None, (
273-
f"Expected no default failure policy, but found: {policy.attrs.get('name') if policy else None}"
269+
if policy is None:
270+
# No policy exists - only valid if expecting zero rules
271+
assert expected_rules == 0, (
272+
f"Expected a failure policy with {expected_rules} rules, but no default policy found"
274273
)
275274
return
276275

277-
assert policy is not None, "Expected a default failure policy but none found"
278-
279-
# Validate rule count
276+
# Policy exists - validate rule count
280277
actual_rules = len(policy.rules)
281278
assert actual_rules == expected_rules, (
282279
f"Failure policy rule count mismatch: expected {expected_rules}, found {actual_rules}"
283280
)
284281

285-
# Validate policy name
286-
actual_name = policy.attrs.get("name")
287-
assert actual_name == expected_name, (
288-
f"Failure policy name mismatch: expected '{expected_name}', found '{actual_name}'"
289-
)
290-
291282
# Validate rule scopes if specified
292283
if expected_scopes:
293284
actual_scopes = [rule.entity_scope for rule in policy.rules]
@@ -763,7 +754,7 @@ def basic_failure_scenario() -> Scenario:
763754
.with_failure_policy(
764755
"single_link_failure",
765756
{
766-
"attrs": {"name": "single_link", "description": "Single link failure"},
757+
"attrs": {"description": "Single link failure"},
767758
"rules": [{"entity_scope": "link", "rule_type": "choice", "count": 1}],
768759
},
769760
)

0 commit comments

Comments
 (0)