1
// Copyright Istio Authors
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
7
// http://www.apache.org/licenses/LICENSE-2.0
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
22
. "github.com/onsi/gomega"
24
"istio.io/istio/pilot/cmd/pilot-agent/status/testserver"
28
liveServerStats = "cluster_manager.cds.update_success: 1\nlistener_manager.lds.update_success: 1\nserver.state: 0\nlistener_manager.workers_started: 1"
29
onlyServerStats = "server.state: 0"
30
initServerStats = "cluster_manager.cds.update_success: 1\nlistener_manager.lds.update_success: 1\nserver.state: 2"
34
func TestEnvoyStatsCompleteAndSuccessful(t *testing.T) {
37
server := testserver.CreateAndStartServer(liveServerStats)
39
ctx, cancel := context.WithCancel(context.Background())
41
probe := Probe{AdminPort: uint16(server.Listener.Addr().(*net.TCPAddr).Port)}
46
g.Expect(err).NotTo(HaveOccurred())
49
func TestEnvoyDraining(t *testing.T) {
52
server := testserver.CreateAndStartServer(liveServerStats)
54
ctx, cancel := context.WithCancel(context.Background())
55
probe := Probe{AdminPort: uint16(server.Listener.Addr().(*net.TCPAddr).Port), Context: ctx}
58
err := probe.isEnvoyReady()
60
g.Expect(err).To(HaveOccurred())
63
func TestEnvoyStats(t *testing.T) {
71
"listener_manager.lds.update_success: 1",
72
"config not fully received from XDS server: cds updates: 0 successful, 0 rejected; lds updates: 1 successful, 0 rejected",
76
"cluster_manager.cds.update_success: 1",
77
"config not fully received from XDS server: cds updates: 1 successful, 0 rejected; lds updates: 0 successful, 0 rejected",
81
`cluster_manager.cds.update_rejected: 1
82
listener_manager.lds.update_success: 1`,
83
"config received from XDS server, but was rejected: cds updates: 0 successful, 1 rejected; lds updates: 1 successful, 0 rejected",
88
"config not received from XDS server (is Istiod running?): cds updates: 0 successful, 0 rejected; lds updates: 0 successful, 0 rejected",
91
"workers not started",
93
cluster_manager.cds.update_success: 1
94
listener_manager.lds.update_success: 1
95
listener_manager.workers_started: 0
97
"workers have not yet started",
102
cluster_manager.cds.update_success: 1
103
listener_manager.lds.update_success: 1
104
listener_manager.workers_started: 1
110
for _, tt := range cases {
111
t.Run(tt.name, func(t *testing.T) {
112
server := testserver.CreateAndStartServer(tt.stats)
114
ctx, cancel := context.WithCancel(context.Background())
116
probe := Probe{AdminPort: uint16(server.Listener.Addr().(*net.TCPAddr).Port)}
123
t.Fatalf("Expected no error, got: %v", err)
128
if err.Error() != tt.result {
129
t.Fatalf("Expected: \n'%v', got: \n'%v'", tt.result, err.Error())
135
func TestEnvoyInitializing(t *testing.T) {
138
server := testserver.CreateAndStartServer(initServerStats)
140
ctx, cancel := context.WithCancel(context.Background())
142
probe := Probe{AdminPort: uint16(server.Listener.Addr().(*net.TCPAddr).Port)}
146
g.Expect(err).To(HaveOccurred())
149
func TestEnvoyNoClusterManagerStats(t *testing.T) {
152
server := testserver.CreateAndStartServer(onlyServerStats)
154
ctx, cancel := context.WithCancel(context.Background())
156
probe := Probe{AdminPort: uint16(server.Listener.Addr().(*net.TCPAddr).Port)}
160
g.Expect(err).To(HaveOccurred())
163
func TestEnvoyNoServerStats(t *testing.T) {
166
server := testserver.CreateAndStartServer(noServerStats)
168
ctx, cancel := context.WithCancel(context.Background())
170
probe := Probe{AdminPort: uint16(server.Listener.Addr().(*net.TCPAddr).Port)}
174
g.Expect(err).To(HaveOccurred())
177
func TestEnvoyReadinessCache(t *testing.T) {
180
server := testserver.CreateAndStartServer(noServerStats)
181
ctx, cancel := context.WithCancel(context.Background())
183
probe := Probe{AdminPort: uint16(server.Listener.Addr().(*net.TCPAddr).Port)}
186
g.Expect(err).To(HaveOccurred())
187
g.Expect(probe.atleastOnceReady).Should(BeFalse())
189
g.Expect(err).To(HaveOccurred())
190
g.Expect(probe.atleastOnceReady).Should(BeFalse())
193
server = testserver.CreateAndStartServer(liveServerStats)
194
probe.AdminPort = uint16(server.Listener.Addr().(*net.TCPAddr).Port)
196
g.Expect(err).NotTo(HaveOccurred())
197
g.Expect(probe.atleastOnceReady).Should(BeTrue())
200
server = testserver.CreateAndStartServer(noServerStats)
201
probe.AdminPort = uint16(server.Listener.Addr().(*net.TCPAddr).Port)
203
g.Expect(err).NotTo(HaveOccurred())
204
g.Expect(probe.atleastOnceReady).Should(BeTrue())
208
g.Expect(err).NotTo(HaveOccurred())
209
g.Expect(probe.atleastOnceReady).Should(BeTrue())