diff --git a/.azure-pipelines/build-template.yml b/.azure-pipelines/build-template.yml index a4b607efe..ac424f587 100644 --- a/.azure-pipelines/build-template.yml +++ b/.azure-pipelines/build-template.yml @@ -84,12 +84,32 @@ jobs: patterns: | target/debs/${{ parameters.debian_version }}/libyang-*.deb target/debs/${{ parameters.debian_version }}/libyang_*.deb + target/debs/${{ parameters.debian_version }}/libyang-cpp_*.deb + target/debs/${{ parameters.debian_version }}/python3-yang_*.deb displayName: "Download libyang from ${{ parameters.arch }} common lib" - script: | set -ex sudo dpkg -i $(find ./download -name *.deb) workingDirectory: $(Build.ArtifactStagingDirectory) displayName: "Install libyang from common lib" + - task: DownloadPipelineArtifact@2 + inputs: + source: specific + project: build + pipeline: 142 + artifact: sonic-buildimage.vs + runVersion: 'latestFromBranch' + runBranch: 'refs/heads/$(BUILD_BRANCH)' + path: $(Build.ArtifactStagingDirectory)/download + patterns: | + target/python-wheels/${{ parameters.debian_version }}/sonic_yang_mgmt-1.0-py3-none-any.whl + target/python-wheels/${{ parameters.debian_version }}/sonic_yang_models-1.0-py3-none-any.whl + displayName: "Download yang wheel from latest sonic-buildimage build" + - script: | + set -ex + sudo pip3 install $(find ./download -name *.whl) + workingDirectory: $(Build.ArtifactStagingDirectory) + displayName: "Install yang wheel from common lib" - script: | set -ex rm ../*.deb || true @@ -107,7 +127,7 @@ jobs: sudo sed -ri 's/^unixsocketperm .../unixsocketperm 777/' /etc/redis/redis.conf sudo sed -ri 's/redis-server.sock/redis.sock/' /etc/redis/redis.conf sudo service redis-server restart - sudo mkdir /usr/local/yang-models + sudo mkdir -p /usr/local/yang-models sudo dpkg -i libswsscommon_*.deb sudo dpkg -i libswsscommon-dev_*.deb diff --git a/azure-pipelines.yml b/azure-pipelines.yml index eb9743886..b18e8c45f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -78,7 +78,7 @@ stages: displayName: "Install dependencies" - script: | ./autogen.sh - dpkg-buildpackage -rfakeroot -us -uc -b -j$(nproc) && cp ../*.deb . + DEB_CONFIGURE_EXTRA_FLAGS='--enable-pregenerated-schema' dpkg-buildpackage -rfakeroot -us -uc -b -j$(nproc) && cp ../*.deb . displayName: "Compile sonic swss common" - script: | bazel build //... @@ -105,6 +105,7 @@ stages: sudo pip3 install pytest sudo apt-get install -y python sudo apt-get install cmake libgtest-dev libgmock-dev libyang-dev + cd /usr/src/gtest && sudo cmake . && sudo make ARCH=$(dpkg --print-architecture) set -x @@ -114,7 +115,7 @@ stages: displayName: "Install dependencies" - script: | ./autogen.sh - dpkg-buildpackage -rfakeroot -us -uc -Pnopython2 -b -j$(nproc) && cp ../*.deb . + DEB_CONFIGURE_EXTRA_FLAGS='--enable-pregenerated-schema' dpkg-buildpackage -rfakeroot -us -uc -Pnopython2 -b -j$(nproc) && cp ../*.deb . displayName: "Compile sonic swss common" - script: | bazel build //... diff --git a/common/Makefile.am b/common/Makefile.am index 4c9a08976..0e447309b 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -1,4 +1,3 @@ - lib_LTLIBRARIES += common/libswsscommon.la dist_swss_DATA = \ @@ -17,6 +16,30 @@ swsscommondir = /var/run/redis/sonic-db bin_PROGRAMS += common/swssloglevel +# Generate cfg_schema.h before building the library +BUILT_SOURCES = common/cfg_schema.h + +# Choose between pre-generated schema and dynamically generated schema +if USE_PREGENERATED_SCHEMA +# Use pre-generated schema file (for environments without proper dependencies) +common/cfg_schema.h: FORCE + @if [ -f $(srcdir)/common/cfg_schema.h.pregenerated ]; then \ + echo "Using pre-generated schema file"; \ + cp $(srcdir)/common/cfg_schema.h.pregenerated $@; \ + else \ + echo "ERROR: Pre-generated schema file not found but USE_PREGENERATED_SCHEMA is enabled"; \ + exit 1; \ + fi +else +# Generate schema dynamically (default behavior) +common/cfg_schema.h: FORCE + $(AM_V_GEN)$(PYTHON) $(srcdir)/gen_cfg_schema.py -o $@ +endif + +# FORCE target to ensure cfg_schema.h is always regenerated +.PHONY: FORCE +FORCE: + common_libswsscommon_la_SOURCES = \ common/events_common.cpp \ common/events_service.cpp \ diff --git a/common/cfg_schema.h.pregenerated b/common/cfg_schema.h.pregenerated new file mode 100644 index 000000000..e6cdead65 --- /dev/null +++ b/common/cfg_schema.h.pregenerated @@ -0,0 +1,227 @@ +#ifndef CFG_SCHEMA_H +#define CFG_SCHEMA_H + +// Macros for table names are autogenerated by gen_cfg_schema.py. Manual update will not be preserved. +#ifdef __cplusplus +namespace swss { +#endif + +#define CFG_AAA_TABLE_NAME "AAA" +#define CFG_ACL_RULE_TABLE_NAME "ACL_RULE" +#define CFG_ACL_TABLE_TABLE_NAME "ACL_TABLE" +#define CFG_ACL_TABLE_TYPE_TABLE_NAME "ACL_TABLE_TYPE" +#define CFG_ASIC_SENSORS_TABLE_NAME "ASIC_SENSORS" +#define CFG_AS_PATH_SET_TABLE_NAME "AS_PATH_SET" +#define CFG_AUTO_TECHSUPPORT_TABLE_NAME "AUTO_TECHSUPPORT" +#define CFG_AUTO_TECHSUPPORT_FEATURE_TABLE_NAME "AUTO_TECHSUPPORT_FEATURE" +#define CFG_BANNER_MESSAGE_TABLE_NAME "BANNER_MESSAGE" +#define CFG_BGP_ALLOWED_PREFIXES_TABLE_NAME "BGP_ALLOWED_PREFIXES" +#define CFG_BGP_BBR_TABLE_NAME "BGP_BBR" +#define CFG_BGP_DEVICE_GLOBAL_TABLE_NAME "BGP_DEVICE_GLOBAL" +#define CFG_BGP_GLOBALS_TABLE_NAME "BGP_GLOBALS" +#define CFG_BGP_GLOBALS_AF_TABLE_NAME "BGP_GLOBALS_AF" +#define CFG_BGP_GLOBALS_AF_AGGREGATE_ADDR_TABLE_NAME "BGP_GLOBALS_AF_AGGREGATE_ADDR" +#define CFG_BGP_GLOBALS_AF_NETWORK_TABLE_NAME "BGP_GLOBALS_AF_NETWORK" +#define CFG_BGP_GLOBALS_LISTEN_PREFIX_TABLE_NAME "BGP_GLOBALS_LISTEN_PREFIX" +#define CFG_BGP_INTERNAL_NEIGHBOR_TABLE_NAME "BGP_INTERNAL_NEIGHBOR" +#define CFG_BGP_MONITORS_TABLE_NAME "BGP_MONITORS" +#define CFG_BGP_NEIGHBOR_TABLE_NAME "BGP_NEIGHBOR" +#define CFG_BGP_NEIGHBOR_AF_TABLE_NAME "BGP_NEIGHBOR_AF" +#define CFG_BGP_PEER_GROUP_TABLE_NAME "BGP_PEER_GROUP" +#define CFG_BGP_PEER_GROUP_AF_TABLE_NAME "BGP_PEER_GROUP_AF" +#define CFG_BGP_PEER_RANGE_TABLE_NAME "BGP_PEER_RANGE" +#define CFG_BGP_SENTINELS_TABLE_NAME "BGP_SENTINELS" +#define CFG_BGP_VOQ_CHASSIS_NEIGHBOR_TABLE_NAME "BGP_VOQ_CHASSIS_NEIGHBOR" +#define CFG_BMP_TABLE_NAME "BMP" +#define CFG_BREAKOUT_CFG_TABLE_NAME "BREAKOUT_CFG" +#define CFG_BUFFER_PG_TABLE_NAME "BUFFER_PG" +#define CFG_BUFFER_POOL_TABLE_NAME "BUFFER_POOL" +#define CFG_BUFFER_PORT_EGRESS_PROFILE_LIST_TABLE_NAME "BUFFER_PORT_EGRESS_PROFILE_LIST" +#define CFG_BUFFER_PORT_INGRESS_PROFILE_LIST_TABLE_NAME "BUFFER_PORT_INGRESS_PROFILE_LIST" +#define CFG_BUFFER_PROFILE_TABLE_NAME "BUFFER_PROFILE" +#define CFG_BUFFER_QUEUE_TABLE_NAME "BUFFER_QUEUE" +#define CFG_CABLE_LENGTH_TABLE_NAME "CABLE_LENGTH" +#define CFG_CHASSIS_MODULE_TABLE_NAME "CHASSIS_MODULE" +#define CFG_COMMUNITY_SET_TABLE_NAME "COMMUNITY_SET" +#define CFG_CONSOLE_PORT_TABLE_NAME "CONSOLE_PORT" +#define CFG_CONSOLE_SWITCH_TABLE_NAME "CONSOLE_SWITCH" +#define CFG_COPP_GROUP_TABLE_NAME "COPP_GROUP" +#define CFG_COPP_TRAP_TABLE_NAME "COPP_TRAP" +#define CFG_CRM_TABLE_NAME "CRM" +#define CFG_DASH_ACL_GROUP_TABLE_NAME "DASH_ACL_GROUP" +#define CFG_DASH_ACL_IN_TABLE_NAME "DASH_ACL_IN" +#define CFG_DASH_ACL_OUT_TABLE_NAME "DASH_ACL_OUT" +#define CFG_DASH_ACL_RULE_TABLE_NAME "DASH_ACL_RULE" +#define CFG_DASH_APPLIANCE_TABLE_NAME "DASH_APPLIANCE" +#define CFG_DASH_ENI_TABLE_NAME "DASH_ENI" +#define CFG_DASH_QOS_TABLE_NAME "DASH_QOS" +#define CFG_DASH_ROUTE_TABLE_TABLE_NAME "DASH_ROUTE_TABLE" +#define CFG_DASH_ROUTING_TYPE_TABLE_NAME "DASH_ROUTING_TYPE" +#define CFG_DASH_VNET_TABLE_NAME "DASH_VNET" +#define CFG_DASH_VNET_MAPPING_TABLE_TABLE_NAME "DASH_VNET_MAPPING_TABLE" +#define CFG_DEFAULT_LOSSLESS_BUFFER_PARAMETER_TABLE_NAME "DEFAULT_LOSSLESS_BUFFER_PARAMETER" +#define CFG_DEVICE_METADATA_TABLE_NAME "DEVICE_METADATA" +#define CFG_DEVICE_NEIGHBOR_TABLE_NAME "DEVICE_NEIGHBOR" +#define CFG_DEVICE_NEIGHBOR_METADATA_TABLE_NAME "DEVICE_NEIGHBOR_METADATA" +#define CFG_DHCP_RELAY_TABLE_NAME "DHCP_RELAY" +#define CFG_DHCP_SERVER_TABLE_NAME "DHCP_SERVER" +#define CFG_DHCP_SERVER_IPV4_TABLE_NAME "DHCP_SERVER_IPV4" +#define CFG_DHCP_SERVER_IPV4_CUSTOMIZED_OPTIONS_TABLE_NAME "DHCP_SERVER_IPV4_CUSTOMIZED_OPTIONS" +#define CFG_DHCP_SERVER_IPV4_PORT_TABLE_NAME "DHCP_SERVER_IPV4_PORT" +#define CFG_DHCP_SERVER_IPV4_RANGE_TABLE_NAME "DHCP_SERVER_IPV4_RANGE" +#define CFG_DNS_NAMESERVER_TABLE_NAME "DNS_NAMESERVER" +#define CFG_DOT1P_TO_TC_MAP_TABLE_NAME "DOT1P_TO_TC_MAP" +#define CFG_DPUS_TABLE_NAME "DPUS" +#define CFG_DPU_PORT_TABLE_NAME "DPU_PORT" +#define CFG_DSCP_TO_FC_MAP_TABLE_NAME "DSCP_TO_FC_MAP" +#define CFG_DSCP_TO_TC_MAP_TABLE_NAME "DSCP_TO_TC_MAP" +#define CFG_EXP_TO_FC_MAP_TABLE_NAME "EXP_TO_FC_MAP" +#define CFG_EXTENDED_COMMUNITY_SET_TABLE_NAME "EXTENDED_COMMUNITY_SET" +#define CFG_FABRIC_MONITOR_TABLE_NAME "FABRIC_MONITOR" +#define CFG_FABRIC_PORT_TABLE_NAME "FABRIC_PORT" +#define CFG_FEATURE_TABLE_NAME "FEATURE" +#define CFG_FG_NHG_TABLE_NAME "FG_NHG" +#define CFG_FG_NHG_MEMBER_TABLE_NAME "FG_NHG_MEMBER" +#define CFG_FG_NHG_PREFIX_TABLE_NAME "FG_NHG_PREFIX" +#define CFG_FIPS_TABLE_NAME "FIPS" +#define CFG_FLEX_COUNTER_TABLE_TABLE_NAME "FLEX_COUNTER_TABLE" +#define CFG_FLOW_COUNTER_ROUTE_PATTERN_TABLE_NAME "FLOW_COUNTER_ROUTE_PATTERN" +#define CFG_GNMI_TABLE_NAME "GNMI" +#define CFG_GNMI_CLIENT_CERT_TABLE_NAME "GNMI_CLIENT_CERT" +#define CFG_GRPCCLIENT_TABLE_NAME "GRPCCLIENT" +#define CFG_INTERFACE_TABLE_NAME "INTERFACE" +#define CFG_KDUMP_TABLE_NAME "KDUMP" +#define CFG_KUBERNETES_MASTER_TABLE_NAME "KUBERNETES_MASTER" +#define CFG_LDAP_TABLE_NAME "LDAP" +#define CFG_LDAP_SERVER_TABLE_NAME "LDAP_SERVER" +#define CFG_LLDP_TABLE_NAME "LLDP" +#define CFG_LLDP_PORT_TABLE_NAME "LLDP_PORT" +#define CFG_LOGGER_TABLE_NAME "LOGGER" +#define CFG_LOOPBACK_INTERFACE_TABLE_NAME "LOOPBACK_INTERFACE" +#define CFG_LOSSLESS_TRAFFIC_PATTERN_TABLE_NAME "LOSSLESS_TRAFFIC_PATTERN" +#define CFG_MACSEC_PROFILE_TABLE_NAME "MACSEC_PROFILE" +#define CFG_MAP_PFC_PRIORITY_TO_QUEUE_TABLE_NAME "MAP_PFC_PRIORITY_TO_QUEUE" +#define CFG_MCLAG_DOMAIN_TABLE_NAME "MCLAG_DOMAIN" +#define CFG_MCLAG_INTERFACE_TABLE_NAME "MCLAG_INTERFACE" +#define CFG_MCLAG_UNIQUE_IP_TABLE_NAME "MCLAG_UNIQUE_IP" +#define CFG_MEMORY_STATISTICS_TABLE_NAME "MEMORY_STATISTICS" +#define CFG_MGMT_INTERFACE_TABLE_NAME "MGMT_INTERFACE" +#define CFG_MGMT_PORT_TABLE_NAME "MGMT_PORT" +#define CFG_MGMT_VRF_CONFIG_TABLE_NAME "MGMT_VRF_CONFIG" +#define CFG_MID_PLANE_BRIDGE_TABLE_NAME "MID_PLANE_BRIDGE" +#define CFG_MIRROR_SESSION_TABLE_NAME "MIRROR_SESSION" +#define CFG_MPLS_TC_TO_TC_MAP_TABLE_NAME "MPLS_TC_TO_TC_MAP" +#define CFG_MUX_CABLE_TABLE_NAME "MUX_CABLE" +#define CFG_MUX_LINKMGR_TABLE_NAME "MUX_LINKMGR" +#define CFG_NAT_BINDINGS_TABLE_NAME "NAT_BINDINGS" +#define CFG_NAT_GLOBAL_TABLE_NAME "NAT_GLOBAL" +#define CFG_NAT_POOL_TABLE_NAME "NAT_POOL" +#define CFG_NEIGH_TABLE_NAME "NEIGH" +#define CFG_NTP_TABLE_NAME "NTP" +#define CFG_NTP_KEY_TABLE_NAME "NTP_KEY" +#define CFG_NTP_SERVER_TABLE_NAME "NTP_SERVER" +#define CFG_NVGRE_TUNNEL_TABLE_NAME "NVGRE_TUNNEL" +#define CFG_NVGRE_TUNNEL_MAP_TABLE_NAME "NVGRE_TUNNEL_MAP" +#define CFG_PASSW_HARDENING_TABLE_NAME "PASSW_HARDENING" +#define CFG_PBH_HASH_TABLE_NAME "PBH_HASH" +#define CFG_PBH_HASH_FIELD_TABLE_NAME "PBH_HASH_FIELD" +#define CFG_PBH_RULE_TABLE_NAME "PBH_RULE" +#define CFG_PBH_TABLE_TABLE_NAME "PBH_TABLE" +#define CFG_PEER_SWITCH_TABLE_NAME "PEER_SWITCH" +#define CFG_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE_NAME "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP" +#define CFG_PFC_WD_TABLE_NAME "PFC_WD" +#define CFG_POLICER_TABLE_NAME "POLICER" +#define CFG_PORT_TABLE_NAME "PORT" +#define CFG_PORTCHANNEL_TABLE_NAME "PORTCHANNEL" +#define CFG_PORTCHANNEL_INTERFACE_TABLE_NAME "PORTCHANNEL_INTERFACE" +#define CFG_PORTCHANNEL_MEMBER_TABLE_NAME "PORTCHANNEL_MEMBER" +#define CFG_PORT_QOS_MAP_TABLE_NAME "PORT_QOS_MAP" +#define CFG_PORT_STORM_CONTROL_TABLE_NAME "PORT_STORM_CONTROL" +#define CFG_PREFIX_TABLE_NAME "PREFIX" +#define CFG_PREFIX_LIST_TABLE_NAME "PREFIX_LIST" +#define CFG_PREFIX_SET_TABLE_NAME "PREFIX_SET" +#define CFG_QUEUE_TABLE_NAME "QUEUE" +#define CFG_RADIUS_TABLE_NAME "RADIUS" +#define CFG_RADIUS_SERVER_TABLE_NAME "RADIUS_SERVER" +#define CFG_RESTAPI_TABLE_NAME "RESTAPI" +#define CFG_ROUTE_MAP_TABLE_NAME "ROUTE_MAP" +#define CFG_ROUTE_MAP_SET_TABLE_NAME "ROUTE_MAP_SET" +#define CFG_ROUTE_REDISTRIBUTE_TABLE_NAME "ROUTE_REDISTRIBUTE" +#define CFG_SCHEDULER_TABLE_NAME "SCHEDULER" +#define CFG_SERIAL_CONSOLE_TABLE_NAME "SERIAL_CONSOLE" +#define CFG_SFLOW_TABLE_NAME "SFLOW" +#define CFG_SFLOW_COLLECTOR_TABLE_NAME "SFLOW_COLLECTOR" +#define CFG_SFLOW_SESSION_TABLE_NAME "SFLOW_SESSION" +#define CFG_SNMP_TABLE_NAME "SNMP" +#define CFG_SNMP_AGENT_ADDRESS_CONFIG_TABLE_NAME "SNMP_AGENT_ADDRESS_CONFIG" +#define CFG_SNMP_COMMUNITY_TABLE_NAME "SNMP_COMMUNITY" +#define CFG_SNMP_USER_TABLE_NAME "SNMP_USER" +#define CFG_SRV6_MY_LOCATORS_TABLE_NAME "SRV6_MY_LOCATORS" +#define CFG_SRV6_MY_SIDS_TABLE_NAME "SRV6_MY_SIDS" +#define CFG_SSH_SERVER_TABLE_NAME "SSH_SERVER" +#define CFG_STATIC_NAPT_TABLE_NAME "STATIC_NAPT" +#define CFG_STATIC_NAT_TABLE_NAME "STATIC_NAT" +#define CFG_STATIC_ROUTE_TABLE_NAME "STATIC_ROUTE" +#define CFG_SUBNET_DECAP_TABLE_NAME "SUBNET_DECAP" +#define CFG_SUPPRESS_ASIC_SDK_HEALTH_EVENT_TABLE_NAME "SUPPRESS_ASIC_SDK_HEALTH_EVENT" +#define CFG_SWITCH_HASH_TABLE_NAME "SWITCH_HASH" +#define CFG_SYSLOG_CONFIG_TABLE_NAME "SYSLOG_CONFIG" +#define CFG_SYSLOG_CONFIG_FEATURE_TABLE_NAME "SYSLOG_CONFIG_FEATURE" +#define CFG_SYSLOG_SERVER_TABLE_NAME "SYSLOG_SERVER" +#define CFG_SYSTEM_DEFAULTS_TABLE_NAME "SYSTEM_DEFAULTS" +#define CFG_SYSTEM_PORT_TABLE_NAME "SYSTEM_PORT" +#define CFG_TACPLUS_TABLE_NAME "TACPLUS" +#define CFG_TACPLUS_SERVER_TABLE_NAME "TACPLUS_SERVER" +#define CFG_TC_TO_DSCP_MAP_TABLE_NAME "TC_TO_DSCP_MAP" +#define CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME "TC_TO_PRIORITY_GROUP_MAP" +#define CFG_TC_TO_QUEUE_MAP_TABLE_NAME "TC_TO_QUEUE_MAP" +#define CFG_TELEMETRY_TABLE_NAME "TELEMETRY" +#define CFG_TELEMETRY_CLIENT_TABLE_NAME "TELEMETRY_CLIENT" +#define CFG_TUNNEL_TABLE_NAME "TUNNEL" +#define CFG_VERSIONS_TABLE_NAME "VERSIONS" +#define CFG_VLAN_TABLE_NAME "VLAN" +#define CFG_VLAN_INTERFACE_TABLE_NAME "VLAN_INTERFACE" +#define CFG_VLAN_MEMBER_TABLE_NAME "VLAN_MEMBER" +#define CFG_VLAN_SUB_INTERFACE_TABLE_NAME "VLAN_SUB_INTERFACE" +#define CFG_VNET_TABLE_NAME "VNET" +#define CFG_VNET_ROUTE_TUNNEL_TABLE_NAME "VNET_ROUTE_TUNNEL" +#define CFG_VOQ_INBAND_INTERFACE_TABLE_NAME "VOQ_INBAND_INTERFACE" +#define CFG_VRF_TABLE_NAME "VRF" +#define CFG_VXLAN_EVPN_NVO_TABLE_NAME "VXLAN_EVPN_NVO" +#define CFG_VXLAN_TUNNEL_TABLE_NAME "VXLAN_TUNNEL" +#define CFG_VXLAN_TUNNEL_MAP_TABLE_NAME "VXLAN_TUNNEL_MAP" +#define CFG_WARM_RESTART_TABLE_NAME "WARM_RESTART" +#define CFG_WRED_PROFILE_TABLE_NAME "WRED_PROFILE" +#define CFG_XCVRD_LOG_TABLE_NAME "XCVRD_LOG" +// #define CFG_alpm-parity-error_TABLE_NAME "alpm-parity-error" +// #define CFG_asic-sdk-health-event_TABLE_NAME "asic-sdk-health-event" +// #define CFG_bgp-state_TABLE_NAME "bgp-state" +#define CFG_chk_crm_threshold_TABLE_NAME "chk_crm_threshold" +// #define CFG_cpu-usage_TABLE_NAME "cpu-usage" +// #define CFG_dhcp-relay-bind-failure_TABLE_NAME "dhcp-relay-bind-failure" +// #define CFG_dhcp-relay-discard_TABLE_NAME "dhcp-relay-discard" +// #define CFG_dhcp-relay-disparity_TABLE_NAME "dhcp-relay-disparity" +// #define CFG_disk-usage_TABLE_NAME "disk-usage" +// #define CFG_event-disk_TABLE_NAME "event-disk" +// #define CFG_event-down-ctr_TABLE_NAME "event-down-ctr" +// #define CFG_event-kernel_TABLE_NAME "event-kernel" +// #define CFG_event-seu_TABLE_NAME "event-seu" +// #define CFG_event-sshd_TABLE_NAME "event-sshd" +// #define CFG_event-stopped-ctr_TABLE_NAME "event-stopped-ctr" +// #define CFG_if-state_TABLE_NAME "if-state" +// #define CFG_invalid-freelist_TABLE_NAME "invalid-freelist" +// #define CFG_mem-threshold-exceeded_TABLE_NAME "mem-threshold-exceeded" +// #define CFG_memory-usage_TABLE_NAME "memory-usage" +#define CFG_notification_TABLE_NAME "notification" +// #define CFG_pfc-storm_TABLE_NAME "pfc-storm" +// #define CFG_process-exited-unexpectedly_TABLE_NAME "process-exited-unexpectedly" +// #define CFG_process-not-running_TABLE_NAME "process-not-running" +// #define CFG_select-operation-failure_TABLE_NAME "select-operation-failure" +// #define CFG_syncd-failure_TABLE_NAME "syncd-failure" +// #define CFG_watchdog-timeout_TABLE_NAME "watchdog-timeout" +// #define CFG_zebra-no-buff_TABLE_NAME "zebra-no-buff" + +#ifdef __cplusplus +} +#endif +#endif diff --git a/common/schema.h b/common/schema.h index f814f0a45..2c8dc0478 100644 --- a/common/schema.h +++ b/common/schema.h @@ -1,6 +1,8 @@ #ifndef __SCHEMA__ #define __SCHEMA__ +#include "cfg_schema.h" + #ifdef __cplusplus namespace swss { #endif @@ -315,170 +317,55 @@ namespace swss { #define FLEX_COUNTER_DELAY_STATUS_FIELD "FLEX_COUNTER_DELAY_STATUS" /***** CONFIGURATION DATABASE *****/ - -#define CFG_PORT_TABLE_NAME "PORT" +/* +Stop adding CFG_* tables here. The CFG_* macro will be auto-generated by cfg_schema.h +and included in schema.h as long as YANG model is defined. The CFG_* table will all be +removed later. +To check how many tables are defined in cfg_schema.h, check common/cfg_schema.h +after libswsscommon deb make. +*/ #define CFG_PORT_CABLE_LEN_TABLE_NAME "CABLE_LENGTH" - #define CFG_SEND_TO_INGRESS_PORT_TABLE_NAME "SEND_TO_INGRESS_PORT" - #define CFG_GEARBOX_TABLE_NAME "GEARBOX" - #define CFG_INTF_TABLE_NAME "INTERFACE" -#define CFG_LOOPBACK_INTERFACE_TABLE_NAME "LOOPBACK_INTERFACE" -#define CFG_MGMT_INTERFACE_TABLE_NAME "MGMT_INTERFACE" #define CFG_LAG_INTF_TABLE_NAME "PORTCHANNEL_INTERFACE" #define CFG_VLAN_INTF_TABLE_NAME "VLAN_INTERFACE" #define CFG_VLAN_SUB_INTF_TABLE_NAME "VLAN_SUB_INTERFACE" - -#define CFG_ASIC_SENSORS_TABLE_NAME "ASIC_SENSORS" - #define CFG_LAG_TABLE_NAME "PORTCHANNEL" #define CFG_LAG_MEMBER_TABLE_NAME "PORTCHANNEL_MEMBER" -#define CFG_VLAN_TABLE_NAME "VLAN" -#define CFG_VLAN_MEMBER_TABLE_NAME "VLAN_MEMBER" #define CFG_VLAN_STACKING_TABLE_NAME "VLAN_STACKING" #define CFG_VLAN_TRANSLATION_TABLE_NAME "VLAN_TRANSLATION" #define CFG_FDB_TABLE_NAME "FDB" #define CFG_SWITCH_TABLE_NAME "SWITCH" -#define CFG_VRF_TABLE_NAME "VRF" -#define CFG_CRM_TABLE_NAME "CRM" -#define CFG_MGMT_VRF_CONFIG_TABLE_NAME "MGMT_VRF_CONFIG" - -#define CFG_DHCP_SERVER_TABLE_NAME "DHCP_SERVER" #define CFG_NTP_GLOBAL_TABLE_NAME "NTP" -#define CFG_NTP_SERVER_TABLE_NAME "NTP_SERVER" -#define CFG_NTP_KEY_TABLE_NAME "NTP_KEY" -#define CFG_SYSLOG_SERVER_TABLE_NAME "SYSLOG_SERVER" -#define CFG_SYSLOG_CONFIG_TABLE_NAME "SYSLOG_CONFIG" - -#define CFG_BGP_NEIGHBOR_TABLE_NAME "BGP_NEIGHBOR" -#define CFG_BGP_INTERNAL_NEIGHBOR_TABLE_NAME "BGP_INTERNAL_NEIGHBOR" -#define CFG_BGP_MONITORS_TABLE_NAME "BGP_MONITORS" -#define CFG_BGP_PEER_RANGE_TABLE_NAME "BGP_PEER_RANGE" -#define CFG_BGP_DEVICE_GLOBAL_TABLE_NAME "BGP_DEVICE_GLOBAL" -#define CFG_BMP_TABLE_NAME "BMP" - -#define CFG_SWITCH_HASH_TABLE_NAME "SWITCH_HASH" -#define CFG_DEVICE_METADATA_TABLE_NAME "DEVICE_METADATA" - -#define CFG_DEVICE_NEIGHBOR_TABLE_NAME "DEVICE_NEIGHBOR" -#define CFG_DEVICE_NEIGHBOR_METADATA_TABLE_NAME "DEVICE_NEIGHBOR_METADATA" - -#define CFG_MIRROR_SESSION_TABLE_NAME "MIRROR_SESSION" -#define CFG_ACL_TABLE_TABLE_NAME "ACL_TABLE" -#define CFG_ACL_TABLE_TYPE_TABLE_NAME "ACL_TABLE_TYPE" -#define CFG_ACL_RULE_TABLE_NAME "ACL_RULE" -#define CFG_PFC_WD_TABLE_NAME "PFC_WD" #define CFG_FLEX_COUNTER_TABLE_NAME "FLEX_COUNTER_TABLE" #define CFG_WATERMARK_TABLE_NAME "WATERMARK_TABLE" - -#define CFG_PBH_TABLE_TABLE_NAME "PBH_TABLE" -#define CFG_PBH_RULE_TABLE_NAME "PBH_RULE" -#define CFG_PBH_HASH_TABLE_NAME "PBH_HASH" -#define CFG_PBH_HASH_FIELD_TABLE_NAME "PBH_HASH_FIELD" - -#define CFG_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE_NAME "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP" -#define CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME "TC_TO_PRIORITY_GROUP_MAP" #define CFG_PFC_PRIORITY_TO_QUEUE_MAP_TABLE_NAME "MAP_PFC_PRIORITY_TO_QUEUE" -#define CFG_TC_TO_QUEUE_MAP_TABLE_NAME "TC_TO_QUEUE_MAP" -#define CFG_DSCP_TO_TC_MAP_TABLE_NAME "DSCP_TO_TC_MAP" -#define CFG_MPLS_TC_TO_TC_MAP_TABLE_NAME "MPLS_TC_TO_TC_MAP" -#define CFG_SCHEDULER_TABLE_NAME "SCHEDULER" -#define CFG_PORT_QOS_MAP_TABLE_NAME "PORT_QOS_MAP" -#define CFG_WRED_PROFILE_TABLE_NAME "WRED_PROFILE" -#define CFG_QUEUE_TABLE_NAME "QUEUE" -#define CFG_DOT1P_TO_TC_MAP_TABLE_NAME "DOT1P_TO_TC_MAP" -#define CFG_DSCP_TO_FC_MAP_TABLE_NAME "DSCP_TO_FC_MAP" -#define CFG_EXP_TO_FC_MAP_TABLE_NAME "EXP_TO_FC_MAP" -#define CFG_TC_TO_DSCP_MAP_TABLE_NAME "TC_TO_DSCP_MAP" #define CFG_TC_TO_DOT1P_MAP_TABLE_NAME "TC_TO_DOT1P_MAP" - -#define CFG_BUFFER_POOL_TABLE_NAME "BUFFER_POOL" -#define CFG_BUFFER_PROFILE_TABLE_NAME "BUFFER_PROFILE" -#define CFG_BUFFER_QUEUE_TABLE_NAME "BUFFER_QUEUE" -#define CFG_BUFFER_PG_TABLE_NAME "BUFFER_PG" #define CFG_BUFFER_PORT_INGRESS_PROFILE_LIST_NAME "BUFFER_PORT_INGRESS_PROFILE_LIST" #define CFG_BUFFER_PORT_EGRESS_PROFILE_LIST_NAME "BUFFER_PORT_EGRESS_PROFILE_LIST" - #define CFG_DEFAULT_LOSSLESS_BUFFER_PARAMETER "DEFAULT_LOSSLESS_BUFFER_PARAMETER" - -#define CFG_POLICER_TABLE_NAME "POLICER" - -#define CFG_WARM_RESTART_TABLE_NAME "WARM_RESTART" - -#define CFG_VXLAN_TUNNEL_TABLE_NAME "VXLAN_TUNNEL" -#define CFG_VXLAN_TUNNEL_MAP_TABLE_NAME "VXLAN_TUNNEL_MAP" -#define CFG_VXLAN_EVPN_NVO_TABLE_NAME "VXLAN_EVPN_NVO" -#define CFG_VNET_TABLE_NAME "VNET" -#define CFG_NEIGH_TABLE_NAME "NEIGH" #define CFG_NEIGH_SUPPRESS_VLAN_TABLE_NAME "SUPPRESS_VLAN_NEIGH" - #define CFG_VNET_RT_TABLE_NAME "VNET_ROUTE" #define CFG_VNET_RT_TUNNEL_TABLE_NAME "VNET_ROUTE_TUNNEL" - -#define CFG_NVGRE_TUNNEL_TABLE_NAME "NVGRE_TUNNEL" -#define CFG_NVGRE_TUNNEL_MAP_TABLE_NAME "NVGRE_TUNNEL_MAP" - #define CFG_PASS_THROUGH_ROUTE_TABLE_NAME "PASS_THROUGH_ROUTE_TABLE" -#define CFG_SFLOW_TABLE_NAME "SFLOW" -#define CFG_SFLOW_SESSION_TABLE_NAME "SFLOW_SESSION" - #define CFG_DEBUG_COUNTER_TABLE_NAME "DEBUG_COUNTER" #define CFG_DEBUG_COUNTER_DROP_REASON_TABLE_NAME "DEBUG_COUNTER_DROP_REASON" - -#define CFG_STATIC_NAT_TABLE_NAME "STATIC_NAT" -#define CFG_STATIC_NAPT_TABLE_NAME "STATIC_NAPT" -#define CFG_NAT_POOL_TABLE_NAME "NAT_POOL" -#define CFG_NAT_BINDINGS_TABLE_NAME "NAT_BINDINGS" -#define CFG_NAT_GLOBAL_TABLE_NAME "NAT_GLOBAL" - #define CFG_STP_GLOBAL_TABLE_NAME "STP" #define CFG_STP_VLAN_TABLE_NAME "STP_VLAN" #define CFG_STP_VLAN_PORT_TABLE_NAME "STP_VLAN_PORT" #define CFG_STP_PORT_TABLE_NAME "STP_PORT" - #define CFG_MCLAG_TABLE_NAME "MCLAG_DOMAIN" #define CFG_MCLAG_INTF_TABLE_NAME "MCLAG_INTERFACE" -#define CFG_MCLAG_UNIQUE_IP_TABLE_NAME "MCLAG_UNIQUE_IP" - -#define CFG_PORT_STORM_CONTROL_TABLE_NAME "PORT_STORM_CONTROL" #define CFG_VRRP_TABLE_NAME "VRRP" #define CFG_VRRP6_TABLE_NAME "VRRP6" #define CFG_RATES_TABLE_NAME "RATES" - -#define CFG_FEATURE_TABLE_NAME "FEATURE" - -#define CFG_COPP_TRAP_TABLE_NAME "COPP_TRAP" -#define CFG_COPP_GROUP_TABLE_NAME "COPP_GROUP" - #define CFG_FG_NHG "FG_NHG" #define CFG_FG_NHG_PREFIX "FG_NHG_PREFIX" #define CFG_FG_NHG_MEMBER "FG_NHG_MEMBER" - -#define CFG_MUX_CABLE_TABLE_NAME "MUX_CABLE" -#define CFG_MUX_LINKMGR_TABLE_NAME "MUX_LINKMGR" - -#define CFG_PEER_SWITCH_TABLE_NAME "PEER_SWITCH" - -#define CFG_TUNNEL_TABLE_NAME "TUNNEL" -#define CFG_SUBNET_DECAP_TABLE_NAME "SUBNET_DECAP" - -#define CFG_SYSTEM_PORT_TABLE_NAME "SYSTEM_PORT" -#define CFG_VOQ_INBAND_INTERFACE_TABLE_NAME "VOQ_INBAND_INTERFACE" - -#define CFG_MACSEC_PROFILE_TABLE_NAME "MACSEC_PROFILE" - -#define CHASSIS_APP_SYSTEM_INTERFACE_TABLE_NAME "SYSTEM_INTERFACE" -#define CHASSIS_APP_SYSTEM_NEIGH_TABLE_NAME "SYSTEM_NEIGH" -#define CHASSIS_APP_LAG_TABLE_NAME "SYSTEM_LAG_TABLE" -#define CHASSIS_APP_LAG_MEMBER_TABLE_NAME "SYSTEM_LAG_MEMBER_TABLE" - #define CFG_CHASSIS_MODULE_TABLE "CHASSIS_MODULE" - #define CFG_TWAMP_SESSION_TABLE_NAME "TWAMP_SESSION" -#define CFG_BANNER_MESSAGE_TABLE_NAME "BANNER_MESSAGE" #define CFG_LOGGING_TABLE_NAME "LOGGING" - #define CFG_DHCP_TABLE "DHCP_RELAY" #define CFG_DPU_TABLE "DPU_TABLE" @@ -488,17 +375,25 @@ namespace swss { #define CFG_LOGGER_TABLE_NAME "LOGGER" #define CFG_SAG_TABLE_NAME "SAG" - #define CFG_SUPPRESS_ASIC_SDK_HEALTH_EVENT_NAME "SUPPRESS_ASIC_SDK_HEALTH_EVENT" - -#define CFG_MEMORY_STATISTICS_TABLE_NAME "MEMORY_STATISTICS" - #define CFG_PAC_PORT_CONFIG_TABLE "PAC_PORT_CONFIG_TABLE" #define CFG_PAC_GLOBAL_CONFIG_TABLE "PAC_GLOBAL_CONFIG_TABLE" #define CFG_PAC_HOSTAPD_GLOBAL_CONFIG_TABLE "HOSTAPD_GLOBAL_CONFIG_TABLE" - #define CFG_SRV6_MY_SID_TABLE_NAME "SRV6_MY_SIDS" #define CFG_SRV6_MY_LOCATOR_TABLE_NAME "SRV6_MY_LOCATORS" +#define CFG_DTEL_TABLE_NAME "DTEL" +#define CFG_DTEL_REPORT_SESSION_TABLE_NAME "DTEL_REPORT_SESSION" +#define CFG_DTEL_INT_SESSION_TABLE_NAME "DTEL_INT_SESSION" +#define CFG_DTEL_QUEUE_REPORT_TABLE_NAME "DTEL_QUEUE_REPORT" +#define CFG_DTEL_EVENT_TABLE_NAME "DTEL_EVENT" +#define CFG_FABRIC_MONITOR_DATA_TABLE_NAME "FABRIC_MONITOR" +#define CFG_FABRIC_MONITOR_PORT_TABLE_NAME "FABRIC_PORT" + + +#define CHASSIS_APP_SYSTEM_INTERFACE_TABLE_NAME "SYSTEM_INTERFACE" +#define CHASSIS_APP_SYSTEM_NEIGH_TABLE_NAME "SYSTEM_NEIGH" +#define CHASSIS_APP_LAG_TABLE_NAME "SYSTEM_LAG_TABLE" +#define CHASSIS_APP_LAG_MEMBER_TABLE_NAME "SYSTEM_LAG_MEMBER_TABLE" #define CFG_HIGH_FREQUENCY_TELEMETRY_PROFILE_TABLE_NAME "HIGH_FREQUENCY_TELEMETRY_PROFILE" #define CFG_HIGH_FREQUENCY_TELEMETRY_GROUP_TABLE_NAME "HIGH_FREQUENCY_TELEMETRY_GROUP" @@ -627,14 +522,6 @@ namespace swss { #define DEL_COMMAND "DEL" #define EMPTY_PREFIX "" -#define CFG_DTEL_TABLE_NAME "DTEL" -#define CFG_DTEL_REPORT_SESSION_TABLE_NAME "DTEL_REPORT_SESSION" -#define CFG_DTEL_INT_SESSION_TABLE_NAME "DTEL_INT_SESSION" -#define CFG_DTEL_QUEUE_REPORT_TABLE_NAME "DTEL_QUEUE_REPORT" -#define CFG_DTEL_EVENT_TABLE_NAME "DTEL_EVENT" - -#define CFG_FABRIC_MONITOR_DATA_TABLE_NAME "FABRIC_MONITOR" -#define CFG_FABRIC_MONITOR_PORT_TABLE_NAME "FABRIC_PORT" #define APP_FABRIC_MONITOR_DATA_TABLE_NAME "FABRIC_MONITOR_TABLE" #define APP_FABRIC_MONITOR_PORT_TABLE_NAME "FABRIC_PORT_TABLE" diff --git a/configure.ac b/configure.ac index 287ff2722..de0b4e611 100644 --- a/configure.ac +++ b/configure.ac @@ -44,9 +44,17 @@ AC_ARG_ENABLE(yangmodules, no) yangmodules=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-yangmodules) ;; esac],[yangmodules=true]) +AC_ARG_ENABLE(pregenerated-schema, +[ --enable-pregenerated-schema Use pre-generated schema file], +[case "${enableval}" in + yes) pregenerated_schema=true ;; + no) pregenerated_schema=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pregenerated-schema) ;; +esac],[pregenerated_schema=false]) AM_CONDITIONAL(DEBUG, test x$debug = xtrue) AM_CONDITIONAL(PYTHON2, test x$python2 = xtrue) AM_CONDITIONAL(YANGMODS, test x$yangmodules = xtrue) +AM_CONDITIONAL(USE_PREGENERATED_SCHEMA, test x$pregenerated_schema = xtrue) if test x$CONFIGURED_ARCH = xarmhf && test x$CROSS_BUILD_ENVIRON = xy; then AM_CONDITIONAL(ARCH64, false) else diff --git a/gen_cfg_schema.py b/gen_cfg_schema.py new file mode 100644 index 000000000..41f790d10 --- /dev/null +++ b/gen_cfg_schema.py @@ -0,0 +1,56 @@ +import argparse +import sonic_yang + +YANG_MODELS_DIR = "/usr/local/yang-models" +DEFAULT_OUTPUT_FILE = "common/cfg_schema.h" + +def write_cfg_schema(keys, output_file="cfg_schema.h"): + header = """#ifndef CFG_SCHEMA_H +#define CFG_SCHEMA_H + +// Macros for table names are autogenerated by gen_cfg_schema.py. Manual update will not be preserved. +#ifdef __cplusplus +namespace swss { +#endif +""" + footer = """ +#ifdef __cplusplus +} +#endif +#endif""" + + with open(output_file, "w") as f: + f.write(header) + f.write("\n") + for key in sorted(keys): + if '-' in key: + # Comment out keys with hyphens as they can't be valid C macros + f.write('// #define CFG_{}_TABLE_NAME "{}"\n'.format(key, key)) + else: + f.write('#define CFG_{}_TABLE_NAME "{}"\n'.format(key, key)) + f.write(footer) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-d', + dest='dir', + metavar='yang directory', + type=str, + help='the yang directory to generate cfg_schema.h', + default=YANG_MODELS_DIR) + parser.add_argument('-o', + dest='output', + metavar='output file', + type=str, + help='output file path for cfg_schema.h', + default=DEFAULT_OUTPUT_FILE) + + args = parser.parse_args() + yang_dir = args.dir + sy = sonic_yang.SonicYang(yang_dir) + sy.loadYangModel() + keys = [k for k, v in sy.confDbYangMap.items() if "container" in v] + write_cfg_schema(keys, args.output) + +if __name__ == "__main__": + main() diff --git a/pyext/swsscommon.i b/pyext/swsscommon.i index b3d015e03..bd6aa2021 100644 --- a/pyext/swsscommon.i +++ b/pyext/swsscommon.i @@ -18,6 +18,7 @@ #define SWIG_PYTHON_2_UNICODE #include "schema.h" +#include "cfg_schema.h" // Explicitly include cfg_schema.h to ensure all macros are available #include "dbconnector.h" #include "dbinterface.h" #include "sonicv2connector.h" @@ -265,6 +266,7 @@ T castSelectableObj(swss::Selectable *temp) %newobject swss::DBConnector::newConnector; %include "schema.h" +%include "cfg_schema.h" %include "dbconnector.h" #ifdef ENABLE_YANG_MODULES %include "defaultvalueprovider.h" diff --git a/tests/test_gen_cfg_schema.py b/tests/test_gen_cfg_schema.py new file mode 100644 index 000000000..ecd6a82cf --- /dev/null +++ b/tests/test_gen_cfg_schema.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +import os +import sys +import unittest +import tempfile +import shutil +from unittest.mock import patch, MagicMock + +# Add parent directory to path so we can import the script +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +import gen_cfg_schema + +class TestGenCfgSchema(unittest.TestCase): + def setUp(self): + self.temp_dir = tempfile.mkdtemp() + self.output_file = os.path.join(self.temp_dir, 'cfg_schema.h') + + def tearDown(self): + shutil.rmtree(self.temp_dir) + + @patch('sonic_yang.SonicYang') + def test_main_with_valid_input(self, mock_sonic_yang_class): + """Test the main function with valid input""" + # Mock sonic_yang behavior + mock_sy = MagicMock() + mock_sonic_yang_class.return_value = mock_sy + mock_sy.confDbYangMap = { + 'VLAN': {'container': {}}, + 'PORT': {'container': {}}, + 'memory-usage': {'container': {}} + } + + # Run the script with test arguments + with patch('sys.argv', ['gen_cfg_schema.py', '-o', self.output_file]): + gen_cfg_schema.main() + + # Check if the file exists + self.assertTrue(os.path.exists(self.output_file)) + + with open(self.output_file, 'r') as f: + content = f.read() + + # Check for expected defines + self.assertIn('#define CFG_VLAN_TABLE_NAME "VLAN"', content) + self.assertIn('#define CFG_PORT_TABLE_NAME "PORT"', content) + # Check that memory-usage is commented out due to hyphen + self.assertIn('// #define CFG_memory-usage_TABLE_NAME "memory-usage"', content) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file