Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[generic-config-updater] Improving CreateOnly validator and marking /…
…LOOPBACK_INTERFACE/LOOPBACK#/vrf_name as create-only (sonic-net#1969) #### What I did Fix sonic-net#1962 Updated `create-only` flag meaning. From, Field is not replaceable but can be added or deleted. In other words: - Field can be added - Field can be deleted - Field cannot be replaced To, Field is only created, but never modified/updated. In other words: - Field cannot be added, only if the parent is added - Field cannot be deleted, only if the parent is deleted - Field cannot be replaced Also marked `/LOOPBACK_INTERFACE/LOOPBACK#/vrf_name` as `create-only` #### How I did it - Field was already not replaceable -- so no changes - If field is added, but parent already exist -- fail create-only validation - If field is deleted, but parent remain -- fail create-only validation #### How to verify it unit-test #### Examples Check issue to see how `apply-patch` behaved before this fix. Each example below we show configdb, vrf_01, vrf_02, and ip interfaces before and after the update. **Adding vrf_name** ```sh admin@vlab-01:~/lo$ show run all | grep -i 'loopback0\|vrf_01' -a3 } }, "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} }, "MAP_PFC_PRIORITY_TO_QUEUE": { "AZURE": { -- } }, "VRF": { "Vrf_01": {}, "Vrf_02": {} }, "WRED_PROFILE": { admin@vlab-01:~/lo$ show ip route vrf Vrf_01 admin@vlab-01:~/lo$ show ip route vrf Vrf_02 admin@vlab-01:~/lo$ show ip interfaces | grep -i loopback0 Loopback0 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~/lo$ sudo config apply-patch add-lo0-vrf01.json-patch -i /BGP_NEIGHBOR -i /DEVICE_METADATA -i /FEATURE -i /FLEX_COUNTER_TABLE -i /VLAN/Vlan1000/members -i /SCHEDULER -i /QUEUE Patch Applier: Patch application starting. Patch Applier: Patch: [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0/vrf_name", "value": "Vrf_01"}] Patch Applier: Getting current config db. Patch Applier: Simulating the target full config after applying the patch. Patch Applier: Validating target config does not have empty tables, since they do not show up in ConfigDb. Patch Applier: Sorting patch updates. Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, libyang[0]: Must condition "(current() = ../../LOOPBACK_INTERFACE_LIST[name=current()]/name)" not satisfied. (path: /sonic-loopback-interface:sonic-loopback-interface/LOOPBACK_INTERFACE/LOOPBACK_INTERFACE_IPPREFIX_LIST[name='Loopback0'][ip-prefix='10.1.0.32/32']/name) libyang[0]: Must condition not satisfied, Try adding lo<>: {}, Example: 'lo1': {} (path: /sonic-loopback-interface:sonic-loopback-interface/LOOPBACK_INTERFACE/LOOPBACK_INTERFACE_IPPREFIX_LIST[name='Loopback0'][ip-prefix='10.1.0.32/32']/name) sonic_yang(3):Data Loading Failed:Must condition not satisfied, Try adding lo<>: {}, Example: 'lo1': {} Patch Applier: The patch was sorted into 4 changes: Patch Applier: * [{"op": "remove", "path": "/LOOPBACK_INTERFACE"}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE", "value": {"Loopback0": {"vrf_name": "Vrf_01"}}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132", "value": {}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128", "value": {}}] Patch Applier: Applying 4 changes in order: Patch Applier: * [{"op": "remove", "path": "/LOOPBACK_INTERFACE"}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE", "value": {"Loopback0": {"vrf_name": "Vrf_01"}}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132", "value": {}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128", "value": {}}] Patch Applier: Verifying patch updates are reflected on ConfigDB. Patch Applier: Patch application completed. Patch applied successfully. admin@vlab-01:~/lo$ show run all | grep -i 'loopback0\|vrf_01' -a3 } }, "LOOPBACK_INTERFACE": { "Loopback0": { "vrf_name": "Vrf_01" }, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} }, "MAP_PFC_PRIORITY_TO_QUEUE": { "AZURE": { -- } }, "VRF": { "Vrf_01": {}, "Vrf_02": {} }, "WRED_PROFILE": { admin@vlab-01:~/lo$ show ip route vrf Vrf_01 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued, r - rejected, b - backup VRF Vrf_01: C>* 10.1.0.32/32 is directly connected, Loopback0, 00:00:19 admin@vlab-01:~/lo$ show ip route vrf Vrf_02 admin@vlab-01:~/lo$ show ip interfaces | grep -i loopback0 Loopback0 Vrf_01 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~/lo$ ``` **Replacing vrf_name** ```sh admin@vlab-01:~/lo$ show run all | grep -i 'loopback0\|vrf_01' -a3 } }, "LOOPBACK_INTERFACE": { "Loopback0": { "vrf_name": "Vrf_01" }, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} }, "MAP_PFC_PRIORITY_TO_QUEUE": { "AZURE": { -- } }, "VRF": { "Vrf_01": {}, "Vrf_02": {} }, "WRED_PROFILE": { admin@vlab-01:~/lo$ show ip route vrf Vrf_01 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued, r - rejected, b - backup VRF Vrf_01: C>* 10.1.0.32/32 is directly connected, Loopback0, 00:00:19 admin@vlab-01:~/lo$ show ip route vrf Vrf_02 admin@vlab-01:~/lo$ show ip interfaces | grep -i loopback0 Loopback0 Vrf_01 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~/lo$ sudo config apply-patch replace-lo0-vrf02.json-patch -i /BGP_NEIGHBOR -i /DEVICE_METADATA -i /FEATURE -i /FLEX_COUNTER_TABLE -i /VLAN/Vlan1000/members -i /SCHEDULER -i /QUEUE Patch Applier: Patch application starting. Patch Applier: Patch: [{"op": "replace", "path": "/LOOPBACK_INTERFACE/Loopback0/vrf_name", "value": "Vrf_02"}] Patch Applier: Getting current config db. Patch Applier: Simulating the target full config after applying the patch. Patch Applier: Validating target config does not have empty tables, since they do not show up in ConfigDb. Patch Applier: Sorting patch updates. Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, libyang[0]: Must condition "(current() = ../../LOOPBACK_INTERFACE_LIST[name=current()]/name)" not satisfied. (path: /sonic-loopback-interface:sonic-loopback-interface/LOOPBACK_INTERFACE/LOOPBACK_INTERFACE_IPPREFIX_LIST[name='Loopback0'][ip-prefix='10.1.0.32/32']/name) libyang[0]: Must condition not satisfied, Try adding lo<>: {}, Example: 'lo1': {} (path: /sonic-loopback-interface:sonic-loopback-interface/LOOPBACK_INTERFACE/LOOPBACK_INTERFACE_IPPREFIX_LIST[name='Loopback0'][ip-prefix='10.1.0.32/32']/name) sonic_yang(3):Data Loading Failed:Must condition not satisfied, Try adding lo<>: {}, Example: 'lo1': {} Patch Applier: The patch was sorted into 4 changes: Patch Applier: * [{"op": "remove", "path": "/LOOPBACK_INTERFACE"}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE", "value": {"Loopback0": {"vrf_name": "Vrf_02"}}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132", "value": {}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128", "value": {}}] Patch Applier: Applying 4 changes in order: Patch Applier: * [{"op": "remove", "path": "/LOOPBACK_INTERFACE"}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE", "value": {"Loopback0": {"vrf_name": "Vrf_02"}}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132", "value": {}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128", "value": {}}] Patch Applier: Verifying patch updates are reflected on ConfigDB. Patch Applier: Patch application completed. Patch applied successfully. admin@vlab-01:~/lo$ show run all | grep -i 'loopback0\|vrf_01' -a3 } }, "LOOPBACK_INTERFACE": { "Loopback0": { "vrf_name": "Vrf_02" }, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} }, "MAP_PFC_PRIORITY_TO_QUEUE": { "AZURE": { -- } }, "VRF": { "Vrf_01": {}, "Vrf_02": {} }, "WRED_PROFILE": { admin@vlab-01:~/lo$ show ip route vrf Vrf_01 admin@vlab-01:~/lo$ show ip route vrf Vrf_02 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued, r - rejected, b - backup VRF Vrf_02: C>* 10.1.0.32/32 is directly connected, Loopback0, 00:00:29 admin@vlab-01:~/lo$ show ip interfaces | grep -i loopback0 Loopback0 Vrf_02 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~/lo$ ``` **Removing vrf_name** ```sh admin@vlab-01:~/lo$ show run all | grep -i 'loopback0\|vrf_01' -a3 } }, "LOOPBACK_INTERFACE": { "Loopback0": { "vrf_name": "Vrf_02" }, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} }, "MAP_PFC_PRIORITY_TO_QUEUE": { "AZURE": { -- } }, "VRF": { "Vrf_01": {}, "Vrf_02": {} }, "WRED_PROFILE": { admin@vlab-01:~/lo$ show ip route vrf Vrf_01 admin@vlab-01:~/lo$ show ip route vrf Vrf_02 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued, r - rejected, b - backup VRF Vrf_02: C>* 10.1.0.32/32 is directly connected, Loopback0, 00:00:29 admin@vlab-01:~/lo$ show ip interfaces | grep -i loopback0 Loopback0 Vrf_02 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~/lo$ sudo config apply-patch remove-lo0-vrf02.json-patch -i /BGP_NEIGHBOR -i /DEVICE_METADATA -i /FEATURE -i /FLEX_COUNTER_TABLE -i /VLAN/Vlan1000/members -i /SCHEDULER -i /QUEUE Patch Applier: Patch application starting. Patch Applier: Patch: [{"op": "remove", "path": "/LOOPBACK_INTERFACE/Loopback0/vrf_name"}] Patch Applier: Getting current config db. Patch Applier: Simulating the target full config after applying the patch. Patch Applier: Validating target config does not have empty tables, since they do not show up in ConfigDb. Patch Applier: Sorting patch updates. Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, Note: Below table(s) have no YANG models: BGP_PEER_RANGE, CABLE_LENGTH, CONSOLE_SWITCH, DEVICE_NEIGHBOR_METADATA, DHCP_SERVER, KDUMP, RESTAPI, SNMP, SNMP_COMMUNITY, SYSLOG_SERVER, TELEMETRY, libyang[0]: Must condition "(current() = ../../LOOPBACK_INTERFACE_LIST[name=current()]/name)" not satisfied. (path: /sonic-loopback-interface:sonic-loopback-interface/LOOPBACK_INTERFACE/LOOPBACK_INTERFACE_IPPREFIX_LIST[name='Loopback0'][ip-prefix='10.1.0.32/32']/name) libyang[0]: Must condition not satisfied, Try adding lo<>: {}, Example: 'lo1': {} (path: /sonic-loopback-interface:sonic-loopback-interface/LOOPBACK_INTERFACE/LOOPBACK_INTERFACE_IPPREFIX_LIST[name='Loopback0'][ip-prefix='10.1.0.32/32']/name) sonic_yang(3):Data Loading Failed:Must condition not satisfied, Try adding lo<>: {}, Example: 'lo1': {} Patch Applier: The patch was sorted into 4 changes: Patch Applier: * [{"op": "remove", "path": "/LOOPBACK_INTERFACE"}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE", "value": {"Loopback0": {}}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132", "value": {}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128", "value": {}}] Patch Applier: Applying 4 changes in order: Patch Applier: * [{"op": "remove", "path": "/LOOPBACK_INTERFACE"}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE", "value": {"Loopback0": {}}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|10.1.0.32~132", "value": {}}] Patch Applier: * [{"op": "add", "path": "/LOOPBACK_INTERFACE/Loopback0|FC00:1::32~1128", "value": {}}] Patch Applier: Verifying patch updates are reflected on ConfigDB. Patch Applier: Patch application completed. Patch applied successfully. admin@vlab-01:~/lo$ show run all | grep -i 'loopback0\|vrf_01' -a3 } }, "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.0.32/32": {}, "Loopback0|FC00:1::32/128": {} }, "MAP_PFC_PRIORITY_TO_QUEUE": { "AZURE": { -- } }, "VRF": { "Vrf_01": {}, "Vrf_02": {} }, "WRED_PROFILE": { admin@vlab-01:~/lo$ show ip route vrf Vrf_01 admin@vlab-01:~/lo$ show ip route vrf Vrf_02 admin@vlab-01:~/lo$ show ip interfaces | grep -i loopback0 Loopback0 10.1.0.32/32 up/up N/A N/A admin@vlab-01:~/lo$ ```
- Loading branch information