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.
21
fuzz "github.com/AdaLogics/go-fuzz-headers"
23
meshconfig "istio.io/api/mesh/v1alpha1"
24
"istio.io/istio/pilot/pkg/serviceregistry"
25
"istio.io/istio/pilot/pkg/serviceregistry/aggregate"
28
var meshHolder fuzzMeshConfigHolder
30
type fuzzMeshConfigHolder struct {
31
trustDomainAliases []string
34
func (mh fuzzMeshConfigHolder) Mesh() *meshconfig.MeshConfig {
35
return &meshconfig.MeshConfig{
36
TrustDomainAliases: mh.trustDomainAliases,
40
// FuzzAggregateController implements a fuzzer
41
// that targets the add and delete registry apis
42
// of the aggregate controller. It does so by
43
// creating a controller with a pseudo-random
44
// Options{} and create pseudo-random service
45
// registries and deleting them.
46
func FuzzAggregateController(data []byte) int {
47
ops := map[int]string{
52
f := fuzz.NewConsumer(data)
53
opts := aggregate.Options{}
54
err := f.GenerateStruct(&opts)
58
opts.MeshHolder = meshHolder
59
c := aggregate.NewController(opts)
61
iterations, err := f.GetInt()
65
for i := 0; i < iterations%30; i++ {
66
opType, err := f.GetInt()
70
switch ops[opType%maxOps] {
72
err = runAddRegistry(f, c)
73
case "DeleteRegistry":
74
err = runDeleteRegistry(f, c)
83
// Helper function to create a registry.
84
func runAddRegistry(f *fuzz.ConsumeFuzzer, c *aggregate.Controller) error {
85
registry := serviceregistry.Simple{}
86
err := f.GenerateStruct(®istry)
90
if registry.DiscoveryController == nil {
91
return fmt.Errorf("registry required")
93
c.AddRegistry(registry)
97
// Helper function to delete a registry.
98
func runDeleteRegistry(f *fuzz.ConsumeFuzzer, c *aggregate.Controller) error {
99
registries := c.GetRegistries()
100
if len(registries) == 0 {
101
return fmt.Errorf("no registries")
103
index, err := f.GetInt()
107
selectedRegistry := registries[index%len(registries)]
108
c.DeleteRegistry(selectedRegistry.Cluster(), selectedRegistry.Provider())