Skip to content

Commit 4b2144a

Browse files
committed
Merge branch 'master' into rpc_from_proto
2 parents 913c789 + 79dea34 commit 4b2144a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+11310
-2045
lines changed

.github/workflows/codeql-analysis.yml

+18
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ on:
1313
- '202[0-9][0-9][0-9]'
1414
workflow_dispatch:
1515

16+
env:
17+
BUILD_BRANCH: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.base.ref || github.ref_name }}
18+
19+
1620
jobs:
1721
analyze:
1822
name: Analyze
@@ -31,6 +35,20 @@ jobs:
3135
- name: Checkout repository
3236
uses: actions/checkout@v3
3337

38+
# Checkout sonic-mgmt-common repository which is used by sonic-gnmi
39+
- name: Checkout sonic-mgmt-common repository
40+
uses: actions/checkout@v3
41+
with:
42+
repository: sonic-net/sonic-mgmt-common
43+
path: sonic-mgmt-common
44+
ref: refs/heads/${{ env.BUILD_BRANCH }}
45+
46+
# Update go.mod to use local sonic-mgmt-common.
47+
# This is the same hack used in the CI pipeline. See lgtm.yml.
48+
# We should find a better way to do this.
49+
- name: Update go.mod for sonic-mgmt-common
50+
run: sed -i 's@replace github.com/Azure/sonic-mgmt-common => ../sonic-mgmt-common@replace github.com/Azure/sonic-mgmt-common => ./sonic-mgmt-common@g' go.mod
51+
3452
# Initializes the CodeQL tools for scanning.
3553
- name: Initialize CodeQL
3654
uses: github/codeql-action/[email protected]

.gitignore

+20-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
1+
# Build directory
12
build/
3+
4+
# Debian packaging files
25
debian/.debhelper/
36
debian/files
47
debian/sonic-telemetry.debhelper.log
58
debian/sonic-telemetry.substvars
69
debian/sonic-telemetry/
7-
vendor
8-
src
9-
cvl
10-
translib
11-
__pycache__
10+
debian/sonic-gnmi.debhelper.log
11+
debian/sonic-gnmi.substvars
12+
debian/sonic-gnmi/
13+
14+
# Vendor directory
15+
vendor/
16+
17+
# Source directories
18+
src/
19+
cvl/
20+
translib/
21+
22+
# SWSS common generated files
23+
swsscommon/swsscommon.go
24+
swsscommon/swsscommon.i
25+
swsscommon/swsscommon_wrap.cxx
26+
swsscommon/swsscommon_wrap.h

Makefile

+56-16
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ export GOBIN := $(abspath $(BUILD_DIR))
2727
export PATH := $(PATH):$(GOBIN):$(shell dirname $(GO))
2828
export CGO_LDFLAGS := -lswsscommon -lhiredis
2929
export CGO_CXXFLAGS := -I/usr/include/swss -w -Wall -fpermissive
30+
export MEMCHECK_CGO_LDFLAGS := $(CGO_LDFLAGS) -fsanitize=address
31+
export MEMCHECK_CGO_CXXFLAGS := $(CGO_CXXFLAGS) -fsanitize=leak
3032

3133
ifeq ($(ENABLE_TRANSLIB_WRITE),y)
3234
BLD_TAGS := gnmi_translib_write
@@ -39,6 +41,11 @@ ifneq ($(BLD_TAGS),)
3941
BLD_FLAGS := -tags "$(strip $(BLD_TAGS))"
4042
endif
4143

44+
MEMCHECK_TAGS := $(BLD_TAGS) gnmi_memcheck
45+
ifneq ($(MEMCHECK_TAGS),)
46+
MEMCHECK_FLAGS := -tags "$(strip $(MEMCHECK_TAGS))"
47+
endif
48+
4249
ENABLE_DIALOUT_VALUE := 1
4350
ifeq ($(ENABLE_DIALOUT),n)
4451
ENABLE_DIALOUT_VALUE = 0
@@ -55,18 +62,18 @@ go.mod:
5562

5663
$(GO_DEPS): go.mod $(PATCHES) swsscommon_wrap $(GNOI_YANG)
5764
$(GO) mod vendor
58-
$(GO) mod download golang.org/x/[email protected]
59-
$(GO) mod download github.com/jipanyang/[email protected]
60-
cp -r $(GOPATH)/pkg/mod/golang.org/x/[email protected]/* vendor/golang.org/x/crypto/
61-
cp -r $(GOPATH)/pkg/mod/github.com/jipanyang/[email protected]/* vendor/github.com/jipanyang/gnxi/
65+
$(GO) mod download github.com/google/[email protected]
66+
cp -r $(GOPATH)/pkg/mod/github.com/google/[email protected]/* vendor/github.com/google/gnxi/
67+
68+
# Apply patch from sonic-mgmt-common, ignore glog.patch because glog version changed
69+
sed -i 's/patch -d $${DEST_DIR}\/github.com\/golang\/glog/\#patch -d $${DEST_DIR}\/github.com\/golang\/glog/g' $(MGMT_COMMON_DIR)/patches/apply.sh
6270
$(MGMT_COMMON_DIR)/patches/apply.sh vendor
71+
sed -i 's/#patch -d $${DEST_DIR}\/github.com\/golang\/glog/patch -d $${DEST_DIR}\/github.com\/golang\/glog/g' $(MGMT_COMMON_DIR)/patches/apply.sh
72+
6373
chmod -R u+w vendor
64-
patch -d vendor -p0 < patches/gnmi_cli.all.patch
65-
patch -d vendor -p0 < patches/gnmi_set.patch
66-
patch -d vendor -p0 < patches/gnmi_get.patch
6774
patch -d vendor -p0 < patches/gnmi_path.patch
6875
patch -d vendor -p0 < patches/gnmi_xpath.patch
69-
git apply patches/0001-Updated-to-filter-and-write-to-file.patch
76+
7077
touch $@
7178

7279
go-deps: $(GO_DEPS)
@@ -75,31 +82,57 @@ go-deps-clean:
7582
$(RM) -r vendor
7683

7784
sonic-gnmi: $(GO_DEPS)
85+
# advancetls 1.0.0 release need following patch to build by go-1.19
86+
patch -d vendor -p0 < patches/0002-Fix-advance-tls-build-with-go-119.patch
87+
# build service first which depends on advancetls
7888
ifeq ($(CROSS_BUILD_ENVIRON),y)
7989
$(GO) build -o ${GOBIN}/telemetry -mod=vendor $(BLD_FLAGS) github.com/sonic-net/sonic-gnmi/telemetry
8090
ifneq ($(ENABLE_DIALOUT_VALUE),0)
8191
$(GO) build -o ${GOBIN}/dialout_client_cli -mod=vendor $(BLD_FLAGS) github.com/sonic-net/sonic-gnmi/dialout/dialout_client_cli
8292
endif
83-
$(GO) build -o ${GOBIN}/gnmi_get -mod=vendor github.com/jipanyang/gnxi/gnmi_get
84-
$(GO) build -o ${GOBIN}/gnmi_set -mod=vendor github.com/jipanyang/gnxi/gnmi_set
85-
$(GO) build -o ${GOBIN}/gnmi_cli -mod=vendor github.com/openconfig/gnmi/cmd/gnmi_cli
8693
$(GO) build -o ${GOBIN}/gnoi_client -mod=vendor github.com/sonic-net/sonic-gnmi/gnoi_client
8794
$(GO) build -o ${GOBIN}/gnmi_dump -mod=vendor github.com/sonic-net/sonic-gnmi/gnmi_dump
8895
else
8996
$(GO) install -mod=vendor $(BLD_FLAGS) github.com/sonic-net/sonic-gnmi/telemetry
9097
ifneq ($(ENABLE_DIALOUT_VALUE),0)
9198
$(GO) install -mod=vendor $(BLD_FLAGS) github.com/sonic-net/sonic-gnmi/dialout/dialout_client_cli
9299
endif
93-
$(GO) install -mod=vendor github.com/jipanyang/gnxi/gnmi_get
94-
$(GO) install -mod=vendor github.com/jipanyang/gnxi/gnmi_set
95-
$(GO) install -mod=vendor github.com/openconfig/gnmi/cmd/gnmi_cli
96100
$(GO) install -mod=vendor github.com/sonic-net/sonic-gnmi/gnoi_client
97101
$(GO) install -mod=vendor github.com/sonic-net/sonic-gnmi/gnmi_dump
98102
$(GO) install -mod=vendor github.com/sonic-net/sonic-gnmi/build/gnoi_yang/client/gnoi_openconfig_client
99103
$(GO) install -mod=vendor github.com/sonic-net/sonic-gnmi/build/gnoi_yang/client/gnoi_sonic_client
100104

101105
endif
102106

107+
# download and apply patch for gnmi client, which will break advancetls
108+
# backup crypto and gnxi
109+
mkdir backup_crypto
110+
cp -r vendor/golang.org/x/crypto/* backup_crypto/
111+
112+
# download and patch crypto and gnxi
113+
$(GO) mod download golang.org/x/[email protected]
114+
cp -r $(GOPATH)/pkg/mod/golang.org/x/[email protected]/* vendor/golang.org/x/crypto/
115+
chmod -R u+w vendor
116+
patch -d vendor -p0 < patches/gnmi_cli.all.patch
117+
patch -d vendor -p0 < patches/gnmi_set.patch
118+
patch -d vendor -p0 < patches/gnmi_get.patch
119+
git apply patches/0001-Updated-to-filter-and-write-to-file.patch
120+
git apply patches/0003-Fix-client-json-parsing-issue.patch
121+
122+
ifeq ($(CROSS_BUILD_ENVIRON),y)
123+
$(GO) build -o ${GOBIN}/gnmi_get -mod=vendor github.com/google/gnxi/gnmi_get
124+
$(GO) build -o ${GOBIN}/gnmi_set -mod=vendor github.com/google/gnxi/gnmi_set
125+
$(GO) build -o ${GOBIN}/gnmi_cli -mod=vendor github.com/openconfig/gnmi/cmd/gnmi_cli
126+
else
127+
$(GO) install -mod=vendor github.com/google/gnxi/gnmi_get
128+
$(GO) install -mod=vendor github.com/google/gnxi/gnmi_set
129+
$(GO) install -mod=vendor github.com/openconfig/gnmi/cmd/gnmi_cli
130+
endif
131+
132+
# restore old version
133+
rm -rf vendor/golang.org/x/crypto/
134+
mv backup_crypto/ vendor/golang.org/x/crypto/
135+
103136
swsscommon_wrap:
104137
make -C swsscommon
105138

@@ -178,12 +211,19 @@ endif
178211
sudo CGO_LDFLAGS="$(CGO_LDFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" $(GO) test -race -coverprofile=coverage-data.txt -covermode=atomic -mod=vendor -v github.com/sonic-net/sonic-gnmi/sonic_data_client
179212
sudo CGO_LDFLAGS="$(CGO_LDFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" $(GO) test -race -coverprofile=coverage-dbus.txt -covermode=atomic -mod=vendor -v github.com/sonic-net/sonic-gnmi/sonic_service_client
180213
sudo CGO_LDFLAGS="$(CGO_LDFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" $(TESTENV) $(GO) test -race -coverprofile=coverage-translutils.txt -covermode=atomic -mod=vendor -v github.com/sonic-net/sonic-gnmi/transl_utils
181-
$(GO) get github.com/axw/gocov/...
182-
$(GO) get github.com/AlekSi/gocov-xml
214+
$(GO) install github.com/axw/gocov/[email protected]
215+
$(GO) install github.com/AlekSi/gocov-xml@latest
183216
$(GO) mod vendor
184217
gocov convert coverage-*.txt | gocov-xml -source $(shell pwd) > coverage.xml
185218
rm -rf coverage-*.txt
186219

220+
check_memleak: $(DBCONFG) $(ENVFILE)
221+
sudo CGO_LDFLAGS="$(MEMCHECK_CGO_LDFLAGS)" CGO_CXXFLAGS="$(MEMCHECK_CGO_CXXFLAGS)" $(GO) test -coverprofile=coverage-telemetry.txt -covermode=atomic -mod=vendor $(MEMCHECK_FLAGS) -v github.com/sonic-net/sonic-gnmi/telemetry
222+
sudo CGO_LDFLAGS="$(MEMCHECK_CGO_LDFLAGS)" CGO_CXXFLAGS="$(MEMCHECK_CGO_CXXFLAGS)" $(GO) test -coverprofile=coverage-config.txt -covermode=atomic $(MEMCHECK_FLAGS) -v github.com/sonic-net/sonic-gnmi/sonic_db_config
223+
sudo CGO_LDFLAGS="$(MEMCHECK_CGO_LDFLAGS)" CGO_CXXFLAGS="$(MEMCHECK_CGO_CXXFLAGS)" $(GO) test -coverprofile=coverage-gnmi.txt -covermode=atomic -mod=vendor $(MEMCHECK_FLAGS) -v github.com/sonic-net/sonic-gnmi/gnmi_server -coverpkg ../... -run TestGNMINative
224+
sudo CGO_LDFLAGS="$(MEMCHECK_CGO_LDFLAGS)" CGO_CXXFLAGS="$(MEMCHECK_CGO_CXXFLAGS)" $(GO) test -coverprofile=coverage-data.txt -covermode=atomic -mod=vendor $(MEMCHECK_FLAGS) -v github.com/sonic-net/sonic-gnmi/sonic_data_client
225+
226+
187227
clean:
188228
$(RM) -r build
189229
$(RM) -r vendor

azure-pipelines.yml

+24-16
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ variables:
2323
value: $(System.PullRequest.TargetBranch)
2424
${{ else }}:
2525
value: $(Build.SourceBranchName)
26+
- name: UNIT_TEST_FLAG
27+
value: 'ENABLE_TRANSLIB_WRITE=y'
2628

2729
resources:
2830
repositories:
@@ -53,7 +55,7 @@ stages:
5355
DIFF_COVER_WORKING_DIRECTORY: $(System.DefaultWorkingDirectory)/sonic-gnmi
5456

5557
container:
56-
image: sonicdev-microsoft.azurecr.io:443/sonic-slave-bullseye:latest
58+
image: sonicdev-microsoft.azurecr.io:443/sonic-slave-bookworm:latest
5759

5860
steps:
5961
- checkout: self
@@ -80,14 +82,15 @@ stages:
8082
runVersion: 'latestFromBranch'
8183
runBranch: 'refs/heads/$(BUILD_BRANCH)'
8284
patterns: |
83-
target/debs/bullseye/libyang*.deb
84-
target/debs/bullseye/libnl*.deb
85-
target/python-wheels/bullseye/sonic_yang_models*.whl
86-
displayName: "Download bullseye debs"
85+
target/debs/bookworm/libyang*.deb
86+
target/debs/bookworm/libnl*.deb
87+
target/python-wheels/bookworm/sonic_yang_models*.whl
88+
displayName: "Download bookworm debs"
8789

8890
- script: |
8991
# PYTEST
9092
sudo pip3 install -U pytest
93+
sudo pip3 install -U jsonpatch
9194
9295
# REDIS
9396
sudo apt-get update
@@ -98,39 +101,39 @@ stages:
98101
sudo service redis-server start
99102
100103
# LIBYANG
101-
sudo dpkg -i ../target/debs/bullseye/libyang*1.0.73*.deb
104+
sudo dpkg -i ../target/debs/bookworm/libyang*1.0.73*.deb
102105
displayName: "Install dependency"
103106
104107
- script: |
105108
# SONIC YANGS
106109
set -ex
107-
sudo pip3 install ../target/python-wheels/bullseye/sonic_yang_models-1.0-py3-none-any.whl
110+
sudo pip3 install ../target/python-wheels/bookworm/sonic_yang_models-1.0-py3-none-any.whl
108111
displayName: "Install sonic yangs"
109112
110113
- script: |
111114
# LIBSWSSCOMMON
112115
sudo apt-get -y purge libnl-3-dev libnl-route-3-dev
113-
sudo dpkg -i ../target/debs/bullseye/libnl-3-200_*.deb
114-
sudo dpkg -i ../target/debs/bullseye/libnl-genl-3-200_*.deb
115-
sudo dpkg -i ../target/debs/bullseye/libnl-route-3-200_*.deb
116-
sudo dpkg -i ../target/debs/bullseye/libnl-nf-3-200_*.deb
116+
sudo dpkg -i ../target/debs/bookworm/libnl-3-200_*.deb
117+
sudo dpkg -i ../target/debs/bookworm/libnl-genl-3-200_*.deb
118+
sudo dpkg -i ../target/debs/bookworm/libnl-route-3-200_*.deb
119+
sudo dpkg -i ../target/debs/bookworm/libnl-nf-3-200_*.deb
117120
displayName: "Install libswsscommon dependencies"
118121
119122
- script: |
120123
set -ex
121124
# Install .NET CORE
122125
curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
123-
sudo apt-add-repository https://packages.microsoft.com/debian/11/prod
126+
sudo apt-add-repository https://packages.microsoft.com/debian/12/prod
124127
sudo apt-get update
125-
sudo apt-get install -y dotnet-sdk-5.0
128+
sudo apt-get install -y dotnet-sdk-8.0
126129
displayName: "Install .NET CORE"
127130
128131
- task: DownloadPipelineArtifact@2
129132
inputs:
130133
source: specific
131134
project: build
132135
pipeline: Azure.sonic-swss-common
133-
artifact: sonic-swss-common
136+
artifact: sonic-swss-common-bookworm
134137
runVersion: 'latestFromBranch'
135138
runBranch: 'refs/heads/$(BUILD_BRANCH)'
136139
displayName: "Download sonic-swss-common"
@@ -166,8 +169,13 @@ stages:
166169
167170
- script: |
168171
pushd sonic-gnmi
169-
make check_gotest ENABLE_TRANSLIB_WRITE=y
170-
displayName: "Test"
172+
make all && make check_memleak $(UNIT_TEST_FLAG)
173+
displayName: "Check memory leak"
174+
175+
- script: |
176+
pushd sonic-gnmi
177+
make all && make check_gotest $(UNIT_TEST_FLAG)
178+
displayName: "Run unit test"
171179
172180
- publish: $(Build.ArtifactStagingDirectory)/
173181
artifact: sonic-gnmi

common_utils/context.go

+23-4
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import (
66
"sync/atomic"
77
)
88

9-
109
// AuthInfo holds data about the authenticated user
1110
type AuthInfo struct {
1211
// Username
13-
User string
12+
User string
1413
AuthEnabled bool
1514
// Roles
1615
Roles []string
@@ -37,6 +36,7 @@ const requestContextKey contextkey = 0
3736
var requestCounter uint64
3837

3938
type CounterType int
39+
4040
const (
4141
GNMI_GET CounterType = iota
4242
GNMI_GET_FAIL
@@ -51,6 +51,13 @@ const (
5151
DBUS_DELETE_CHECKPOINT
5252
DBUS_CONFIG_SAVE
5353
DBUS_CONFIG_RELOAD
54+
DBUS_STOP_SERVICE
55+
DBUS_RESTART_SERVICE
56+
DBUS_FILE_STAT
57+
DBUS_HALT_SYSTEM
58+
DBUS_IMAGE_DOWNLOAD
59+
DBUS_IMAGE_INSTALL
60+
DBUS_IMAGE_LIST
5461
COUNTER_SIZE
5562
)
5663

@@ -82,14 +89,27 @@ func (c CounterType) String() string {
8289
return "DBUS config save"
8390
case DBUS_CONFIG_RELOAD:
8491
return "DBUS config reload"
92+
case DBUS_STOP_SERVICE:
93+
return "DBUS stop service"
94+
case DBUS_RESTART_SERVICE:
95+
return "DBUS restart service"
96+
case DBUS_FILE_STAT:
97+
return "DBUS file stat"
98+
case DBUS_HALT_SYSTEM:
99+
return "DBUS halt system"
100+
case DBUS_IMAGE_DOWNLOAD:
101+
return "DBUS image download"
102+
case DBUS_IMAGE_INSTALL:
103+
return "DBUS image install"
104+
case DBUS_IMAGE_LIST:
105+
return "DBUS image list"
85106
default:
86107
return ""
87108
}
88109
}
89110

90111
var globalCounters [COUNTER_SIZE]uint64
91112

92-
93113
// GetContext function returns the RequestContext object for a
94114
// gRPC request. RequestContext is maintained as a context value of
95115
// the request. Creates a new RequestContext object is not already
@@ -125,4 +145,3 @@ func IncCounter(cnt CounterType) {
125145
atomic.AddUint64(&globalCounters[cnt], 1)
126146
SetMemCounters(&globalCounters)
127147
}
128-

0 commit comments

Comments
 (0)