Skip to content

Commit 676c31b

Browse files
authored
Add verification for override (sonic-net#2305)
What I did Add Yang verification for config override-config-table How I did it Make 3 step verification: running config, golden input, final config How to verify it Run unit test.
1 parent 48997c2 commit 676c31b

File tree

5 files changed

+397
-19
lines changed

5 files changed

+397
-19
lines changed

config/main.py

+59-19
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import sys
1313
import time
1414
import itertools
15+
import copy
1516

1617
from collections import OrderedDict
1718
from generic_config_updater.generic_updater import GenericUpdater, ConfigFormat
@@ -46,7 +47,7 @@
4647
from . import vlan
4748
from . import vxlan
4849
from . import plugins
49-
from .config_mgmt import ConfigMgmtDPB
50+
from .config_mgmt import ConfigMgmtDPB, ConfigMgmt
5051
from . import mclag
5152
from . import syslog
5253

@@ -1885,27 +1886,66 @@ def override_config_table(db, input_config_db, dry_run):
18851886

18861887
config_db = db.cfgdb
18871888

1889+
# Read config from configDB
1890+
current_config = config_db.get_config()
1891+
# Serialize to the same format as json input
1892+
sonic_cfggen.FormatConverter.to_serialized(current_config)
1893+
1894+
updated_config = update_config(current_config, config_input)
1895+
1896+
yang_enabled = device_info.is_yang_config_validation_enabled(config_db)
1897+
if yang_enabled:
1898+
# The ConfigMgmt will load YANG and running
1899+
# config during initialization.
1900+
try:
1901+
cm = ConfigMgmt()
1902+
cm.validateConfigData()
1903+
except Exception as ex:
1904+
click.secho("Failed to validate running config. Error: {}".format(ex), fg="magenta")
1905+
sys.exit(1)
1906+
1907+
# Validate input config
1908+
validate_config_by_cm(cm, config_input, "config_input")
1909+
# Validate updated whole config
1910+
validate_config_by_cm(cm, updated_config, "updated_config")
1911+
18881912
if dry_run:
1889-
# Read config from configDB
1890-
current_config = config_db.get_config()
1891-
# Serialize to the same format as json input
1892-
sonic_cfggen.FormatConverter.to_serialized(current_config)
1893-
# Override current config with golden config
1894-
for table in config_input:
1895-
current_config[table] = config_input[table]
1896-
print(json.dumps(current_config, sort_keys=True,
1913+
print(json.dumps(updated_config, sort_keys=True,
18971914
indent=4, cls=minigraph_encoder))
18981915
else:
1899-
# Deserialized golden config to DB recognized format
1900-
sonic_cfggen.FormatConverter.to_deserialized(config_input)
1901-
# Delete table from DB then mod_config to apply golden config
1902-
click.echo("Removing configDB overriden table first ...")
1903-
for table in config_input:
1904-
config_db.delete_table(table)
1905-
click.echo("Overriding input config to configDB ...")
1906-
data = sonic_cfggen.FormatConverter.output_to_db(config_input)
1907-
config_db.mod_config(data)
1908-
click.echo("Overriding completed. No service is restarted.")
1916+
override_config_db(config_db, config_input)
1917+
1918+
1919+
def validate_config_by_cm(cm, config_json, jname):
1920+
tmp_config_json = copy.deepcopy(config_json)
1921+
try:
1922+
cm.loadData(tmp_config_json)
1923+
cm.validateConfigData()
1924+
except Exception as ex:
1925+
click.secho("Failed to validate {}. Error: {}".format(jname, ex), fg="magenta")
1926+
sys.exit(1)
1927+
1928+
1929+
def update_config(current_config, config_input):
1930+
updated_config = copy.deepcopy(current_config)
1931+
# Override current config with golden config
1932+
for table in config_input:
1933+
updated_config[table] = config_input[table]
1934+
return updated_config
1935+
1936+
1937+
def override_config_db(config_db, config_input):
1938+
# Deserialized golden config to DB recognized format
1939+
sonic_cfggen.FormatConverter.to_deserialized(config_input)
1940+
# Delete table from DB then mod_config to apply golden config
1941+
click.echo("Removing configDB overriden table first ...")
1942+
for table in config_input:
1943+
config_db.delete_table(table)
1944+
click.echo("Overriding input config to configDB ...")
1945+
data = sonic_cfggen.FormatConverter.output_to_db(config_input)
1946+
config_db.mod_config(data)
1947+
click.echo("Overriding completed. No service is restarted.")
1948+
19091949

19101950
#
19111951
# 'hostname' command
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"running_config": {
3+
"ACL_TABLE": {
4+
"DATAACL": {
5+
"policy_desc": "DATAACL",
6+
"ports": [
7+
"Ethernet4"
8+
],
9+
"stage": "ingress",
10+
"type": "L3"
11+
},
12+
"NTP_ACL": {
13+
"policy_desc": "NTP_ACL",
14+
"services": [
15+
"NTP"
16+
],
17+
"stage": "ingress",
18+
"type": "CTRLPLANE"
19+
}
20+
},
21+
"AUTO_TECHSUPPORT_FEATURE": {
22+
"bgp": {
23+
"rate_limit_interval": "600",
24+
"state": "enabled"
25+
},
26+
"database": {
27+
"rate_limit_interval": "600",
28+
"state": "enabled"
29+
}
30+
},
31+
"PORT": {
32+
"Ethernet4": {
33+
"admin_status": "up",
34+
"alias": "fortyGigE0/4",
35+
"description": "Servers0:eth0",
36+
"index": "1",
37+
"lanes": "29,30,31,32",
38+
"mtu": "9100",
39+
"pfc_asym": "off",
40+
"speed": "40000",
41+
"tpid": "0x8100"
42+
},
43+
"Ethernet8": {
44+
"admin_status": "up",
45+
"alias": "fortyGigE0/8",
46+
"description": "Servers1:eth0",
47+
"index": "2",
48+
"lanes": "33,34,35,36",
49+
"mtu": "9100",
50+
"pfc_asym": "off",
51+
"speed": "40000",
52+
"tpid": "0x8100"
53+
}
54+
}
55+
},
56+
"golden_config": {
57+
"PORT": {
58+
"Ethernet12": {
59+
"admin_status": "up",
60+
"alias": "fortyGigE0/12",
61+
"description": "Servers2:eth0",
62+
"index": "3",
63+
"lanes": "37,38,39,40",
64+
"mtu": "9100",
65+
"pfc_asym": "off",
66+
"speed": "40000",
67+
"tpid": "0x8100"
68+
}
69+
}
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
{
2+
"running_config": {
3+
"ACL_TABLE": {
4+
"DATAACL": {
5+
"policy_desc": "DATAACL",
6+
"ports": [
7+
"Ethernet4"
8+
],
9+
"stage": "ingress",
10+
"type": "L3"
11+
},
12+
"NTP_ACL": {
13+
"policy_desc": "NTP_ACL",
14+
"services": [
15+
"NTP"
16+
],
17+
"stage": "ingress",
18+
"type": "CTRLPLANE"
19+
}
20+
},
21+
"AUTO_TECHSUPPORT_FEATURE": {
22+
"bgp": {
23+
"rate_limit_interval": "600",
24+
"state": "enabled"
25+
},
26+
"database": {
27+
"rate_limit_interval": "600",
28+
"state": "enabled"
29+
}
30+
},
31+
"PORT": {
32+
"Ethernet4": {
33+
"admin_status": "up",
34+
"alias": "fortyGigE0/4",
35+
"description": "Servers0:eth0",
36+
"index": "1",
37+
"lanes": "29,30,31,32",
38+
"mtu": "9100",
39+
"pfc_asym": "off",
40+
"speed": "40000",
41+
"tpid": "0x8100"
42+
},
43+
"Ethernet8": {
44+
"admin_status": "up",
45+
"alias": "fortyGigE0/8",
46+
"description": "Servers1:eth0",
47+
"index": "2",
48+
"lanes": "33,34,35,36",
49+
"mtu": "9100",
50+
"pfc_asym": "off",
51+
"speed": "40000",
52+
"tpid": "0x8100"
53+
}
54+
}
55+
},
56+
"golden_config": {
57+
"ACL_TABLE": {
58+
"EVERFLOWV6": {
59+
"policy_desc": "EVERFLOWV6",
60+
"ports": [
61+
"Ethernet0"
62+
],
63+
"stage": "ingress",
64+
"type": "MIRRORV6"
65+
}
66+
},
67+
"AUTO_TECHSUPPORT_FEATURE": {
68+
"bgp": {
69+
"state": "disabled"
70+
},
71+
"database": {
72+
"state": "disabled"
73+
}
74+
},
75+
"PORT": {
76+
"Ethernet12": {
77+
"admin_status": "up",
78+
"alias": "fortyGigE0/12",
79+
"description": "Servers2:eth0",
80+
"index": "3",
81+
"lanes": "37,38,39,40",
82+
"mtu": "9100",
83+
"pfc_asym": "off",
84+
"speed": "40000",
85+
"tpid": "0x8100"
86+
}
87+
}
88+
}
89+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
{
2+
"running_config": {
3+
"ACL_TABLE": {
4+
"DATAACL": {
5+
"policy_desc": "DATAACL",
6+
"ports": [
7+
"Ethernet0"
8+
],
9+
"stage": "ingress",
10+
"type": "L3"
11+
},
12+
"NTP_ACL": {
13+
"policy_desc": "NTP_ACL",
14+
"services": [
15+
"NTP"
16+
],
17+
"stage": "ingress",
18+
"type": "CTRLPLANE"
19+
}
20+
},
21+
"AUTO_TECHSUPPORT_FEATURE": {
22+
"bgp": {
23+
"rate_limit_interval": "600",
24+
"state": "enabled"
25+
},
26+
"database": {
27+
"rate_limit_interval": "600",
28+
"state": "enabled"
29+
}
30+
},
31+
"PORT": {
32+
"Ethernet4": {
33+
"admin_status": "up",
34+
"alias": "fortyGigE0/4",
35+
"description": "Servers0:eth0",
36+
"index": "1",
37+
"lanes": "29,30,31,32",
38+
"mtu": "9100",
39+
"pfc_asym": "off",
40+
"speed": "40000",
41+
"tpid": "0x8100"
42+
},
43+
"Ethernet8": {
44+
"admin_status": "up",
45+
"alias": "fortyGigE0/8",
46+
"description": "Servers1:eth0",
47+
"index": "2",
48+
"lanes": "33,34,35,36",
49+
"mtu": "9100",
50+
"pfc_asym": "off",
51+
"speed": "40000",
52+
"tpid": "0x8100"
53+
}
54+
}
55+
},
56+
"golden_config": {
57+
"ACL_TABLE": {
58+
"EVERFLOWV6": {
59+
"policy_desc": "EVERFLOWV6",
60+
"ports": [
61+
"Ethernet12"
62+
],
63+
"stage": "ingress",
64+
"type": "MIRRORV6"
65+
}
66+
},
67+
"AUTO_TECHSUPPORT_FEATURE": {
68+
"bgp": {
69+
"state": "disabled"
70+
},
71+
"database": {
72+
"state": "disabled"
73+
}
74+
},
75+
"PORT": {
76+
"Ethernet12": {
77+
"admin_status": "up",
78+
"alias": "fortyGigE0/12",
79+
"description": "Servers2:eth0",
80+
"index": "3",
81+
"lanes": "37,38,39,40",
82+
"mtu": "9100",
83+
"pfc_asym": "off",
84+
"speed": "40000",
85+
"tpid": "0x8100"
86+
}
87+
}
88+
}
89+
}

0 commit comments

Comments
 (0)