Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit c392a3e

Browse files
committedApr 23, 2025·
feat(mgmt): impl Render for Ospf configs
Signed-off-by: Fredi Raspall <fredi@githedgehog.com>
1 parent c8b28a0 commit c392a3e

File tree

4 files changed

+76
-0
lines changed

4 files changed

+76
-0
lines changed
 

‎mgmt/src/frr/renderer/interface.rs

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ impl Render for InterfaceConfig {
4040
config += format!(" description {description}");
4141
}
4242
self.addresses.iter().for_each(|a| config += a.to_string());
43+
if let Some(ospf) = &self.ospf {
44+
config += ospf.render(&());
45+
}
4346
config += "exit";
4447
config += MARKER;
4548
config

‎mgmt/src/frr/renderer/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub mod bgp;
77
pub mod builder;
88
pub mod frr;
99
pub mod interface;
10+
pub mod ospf;
1011
pub mod prefixlist;
1112
pub mod routemap;
1213
pub mod statics;
@@ -49,6 +50,9 @@ impl Render for InternalConfig {
4950
/* Vrf BGP instances */
5051
cfg += self.vrfs.render_vrf_bgp();
5152

53+
/* vrf OSPF instance */
54+
cfg += self.vrfs.render_vrf_ospf();
55+
5256
/* route maps */
5357
cfg += self.rmap_table.render(&());
5458

‎mgmt/src/frr/renderer/ospf.rs

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright Open Network Fabric Authors
3+
4+
use crate::frr::renderer::builder::{ConfigBuilder, MARKER, Render};
5+
6+
use crate::models::internal::routing::ospf::Ospf;
7+
use crate::models::internal::routing::ospf::OspfInterface;
8+
use crate::models::internal::routing::ospf::OspfNetwork;
9+
10+
use std::fmt::Display;
11+
12+
impl Display for OspfNetwork {
13+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14+
match self {
15+
OspfNetwork::Broadcast => write!(f, "broadcast"),
16+
OspfNetwork::NonBroadcast => write!(f, "non-broadcast"),
17+
OspfNetwork::Point2Point => write!(f, "point-to-point"),
18+
OspfNetwork::Point2Multipoint => write!(f, "point-to-multipoint"),
19+
}
20+
}
21+
}
22+
23+
impl Render for Ospf {
24+
type Context = ();
25+
type Output = ConfigBuilder;
26+
fn render(&self, _: &Self::Context) -> ConfigBuilder {
27+
let mut config = ConfigBuilder::new();
28+
let mut heading = "router ospf".to_string();
29+
if let Some(vrf) = &self.vrf {
30+
heading += format!(" vrf {vrf}").as_str();
31+
}
32+
config += heading;
33+
config += format!(" ospf router-id {}", self.router_id);
34+
35+
config += MARKER;
36+
config
37+
}
38+
}
39+
40+
impl Render for OspfInterface {
41+
type Context = ();
42+
type Output = ConfigBuilder;
43+
fn render(&self, _: &Self::Context) -> ConfigBuilder {
44+
let mut config = ConfigBuilder::new();
45+
config += format!(" ip ospf area {}", self.area);
46+
if let Some(network) = &self.network {
47+
config += format!(" ip ospf network {}", network);
48+
}
49+
if let Some(cost) = &self.cost {
50+
config += format!(" ip ospf cost {cost}");
51+
}
52+
if self.passive {
53+
config += " ip ospf passive".to_string();
54+
}
55+
config
56+
}
57+
}

‎mgmt/src/frr/renderer/vrf.rs

+12
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,25 @@ impl VrfConfig {
5050
}
5151
cfg
5252
}
53+
pub fn render_vrf_ospf(&self) -> ConfigBuilder {
54+
let mut cfg = ConfigBuilder::new();
55+
if let Some(ospf) = self.ospf.as_ref() {
56+
cfg += ospf.render(&());
57+
}
58+
cfg
59+
}
5360
}
5461
impl VrfConfigTable {
5562
pub fn render_vrf_bgp(&self) -> ConfigBuilder {
5663
let mut cfg = ConfigBuilder::new();
5764
self.iter().for_each(|vrf| cfg += vrf.render_vrf_bgp());
5865
cfg
5966
}
67+
pub fn render_vrf_ospf(&self) -> ConfigBuilder {
68+
let mut cfg = ConfigBuilder::new();
69+
self.iter().for_each(|vrf| cfg += vrf.render_vrf_ospf());
70+
cfg
71+
}
6072
}
6173

6274
#[cfg(test)]

0 commit comments

Comments
 (0)
Please sign in to comment.