From 6d5bf91c94e79ed2c803c8f2a6e36f856174702a Mon Sep 17 00:00:00 2001 From: Fan Shang Xiang Date: Wed, 6 Nov 2024 12:13:29 +0800 Subject: [PATCH] refactor client-gen and follow outbound rules (#7497) --- pkg/azclient/Makefile | 10 +- .../mock_accountclient/interface.go | 3 +- .../mock_availabilitysetclient/interface.go | 3 +- .../mock_blobcontainerclient/interface.go | 3 +- .../interface.go | 3 +- .../client-gen/cmd/client-gen/main.go | 4 +- ...ientfactory_action.go => clientfactory.go} | 165 ++++++++++-------- .../generator/{codegenerator.go => code.go} | 67 ++----- pkg/azclient/client-gen/generator/files.go | 64 ------- .../client-gen/generator/gencode_action.go | 67 +++---- .../client-gen/generator/genmock_action.go | 55 ------ .../client-gen/generator/gentest_action.go | 62 ++----- pkg/azclient/client-gen/generator/header.go | 42 +++++ pkg/azclient/client-gen/generator/mock.go | 111 ++++++++++++ pkg/azclient/client-gen/generator/template.go | 101 ++++------- .../mock_deploymentclient/interface.go | 3 +- .../diskclient/mock_diskclient/interface.go | 3 +- .../interface.go | 3 +- .../mock_fileshareclient/interface.go | 3 +- .../mock_identityclient/interface.go | 3 +- .../mock_interfaceclient/interface.go | 3 +- .../mock_ipgroupclient/interface.go | 3 +- .../mock_loadbalancerclient/interface.go | 3 +- .../mock_managedclusterclient/interface.go | 3 +- pkg/azclient/mock_azclient/interface.go | 5 +- .../mock_privateendpointclient/interface.go | 3 +- .../interface.go | 3 +- .../mock_privatezoneclient/interface.go | 3 +- .../mock_providerclient/interface.go | 3 +- .../mock_publicipaddressclient/interface.go | 3 +- .../mock_publicipprefixclient/interface.go | 3 +- .../mock_registryclient/interface.go | 3 +- .../mock_resourcegroupclient/interface.go | 3 +- .../mock_roleassignmentclient/interface.go | 3 +- .../mock_roledefinitionclient/interface.go | 3 +- .../mock_routetableclient/interface.go | 3 +- .../mock_secretclient/interface.go | 3 +- .../mock_securitygroupclient/interface.go | 3 +- .../mock_snapshotclient/interface.go | 3 +- .../interface.go | 3 +- .../mock_subnetclient/interface.go | 3 +- .../vaultclient/mock_vaultclient/interface.go | 3 +- .../mock_virtualmachineclient/interface.go | 3 +- .../interface.go | 3 +- .../interface.go | 3 +- .../mock_virtualnetworkclient/interface.go | 3 +- .../interface.go | 3 +- 47 files changed, 432 insertions(+), 426 deletions(-) rename pkg/azclient/client-gen/generator/{genclientfactory_action.go => clientfactory.go} (66%) rename pkg/azclient/client-gen/generator/{codegenerator.go => code.go} (64%) delete mode 100644 pkg/azclient/client-gen/generator/files.go delete mode 100644 pkg/azclient/client-gen/generator/genmock_action.go create mode 100644 pkg/azclient/client-gen/generator/header.go create mode 100644 pkg/azclient/client-gen/generator/mock.go diff --git a/pkg/azclient/Makefile b/pkg/azclient/Makefile index 0845882249..0fdd6f3632 100644 --- a/pkg/azclient/Makefile +++ b/pkg/azclient/Makefile @@ -72,7 +72,7 @@ test: ## Run tests. go test -v ./... .PHONY: generate -generate: install-dependencies build generatecode generateimpl fmt vet-all +generate: install-dependencies build generatecode generateimpl generateclientfactory generatemock fmt vet-all test .PHONY: generatecode generatecode: build ## Generate client @@ -117,6 +117,14 @@ generatecode: build ## Generate client generateimpl: build ## Generate client PATH=$(LOCALBIN):$$PATH $(CLIENTGEN) clientgen:headerFile=../../hack/boilerplate/boilerplate.gomock.txt paths=./... +.PHONY: generatemock +generatemock: build ## Generate client + PATH=$(LOCALBIN):$$PATH $(CLIENTGEN) mockgen:headerFile=../../hack/boilerplate/boilerplate.generatego.txt paths=./... + +.PHONY: generateclientfactory +generateclientfactory: build ## Generate client + PATH=$(LOCALBIN):$$PATH $(CLIENTGEN) clientfactorygen:headerFile=../../hack/boilerplate/boilerplate.gomock.txt paths=./... output:dir=. + .PHONY: vet-all vet-all: golangci-lint ## Run go vet against code. $(LOCALBIN)/golangci-lint run --timeout 10m ./... diff --git a/pkg/azclient/accountclient/mock_accountclient/interface.go b/pkg/azclient/accountclient/mock_accountclient/interface.go index 2b1f72efce..daa7112fe2 100644 --- a/pkg/azclient/accountclient/mock_accountclient/interface.go +++ b/pkg/azclient/accountclient/mock_accountclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: accountclient/interface.go // // Generated by this command: // -// mockgen -package mock_accountclient -source accountclient/interface.go +// mockgen -package mock_accountclient -source accountclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_accountclient is a generated GoMock package. diff --git a/pkg/azclient/availabilitysetclient/mock_availabilitysetclient/interface.go b/pkg/azclient/availabilitysetclient/mock_availabilitysetclient/interface.go index 27c4cc0945..e6d2d3e2a2 100644 --- a/pkg/azclient/availabilitysetclient/mock_availabilitysetclient/interface.go +++ b/pkg/azclient/availabilitysetclient/mock_availabilitysetclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: availabilitysetclient/interface.go // // Generated by this command: // -// mockgen -package mock_availabilitysetclient -source availabilitysetclient/interface.go +// mockgen -package mock_availabilitysetclient -source availabilitysetclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_availabilitysetclient is a generated GoMock package. diff --git a/pkg/azclient/blobcontainerclient/mock_blobcontainerclient/interface.go b/pkg/azclient/blobcontainerclient/mock_blobcontainerclient/interface.go index 46e1a24813..45c4b25ff5 100644 --- a/pkg/azclient/blobcontainerclient/mock_blobcontainerclient/interface.go +++ b/pkg/azclient/blobcontainerclient/mock_blobcontainerclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: blobcontainerclient/interface.go // // Generated by this command: // -// mockgen -package mock_blobcontainerclient -source blobcontainerclient/interface.go +// mockgen -package mock_blobcontainerclient -source blobcontainerclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_blobcontainerclient is a generated GoMock package. diff --git a/pkg/azclient/blobservicepropertiesclient/mock_blobservicepropertiesclient/interface.go b/pkg/azclient/blobservicepropertiesclient/mock_blobservicepropertiesclient/interface.go index 2668e14f62..3a9993671c 100644 --- a/pkg/azclient/blobservicepropertiesclient/mock_blobservicepropertiesclient/interface.go +++ b/pkg/azclient/blobservicepropertiesclient/mock_blobservicepropertiesclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: blobservicepropertiesclient/interface.go // // Generated by this command: // -// mockgen -package mock_blobservicepropertiesclient -source blobservicepropertiesclient/interface.go +// mockgen -package mock_blobservicepropertiesclient -source blobservicepropertiesclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_blobservicepropertiesclient is a generated GoMock package. diff --git a/pkg/azclient/client-gen/cmd/client-gen/main.go b/pkg/azclient/client-gen/cmd/client-gen/main.go index 15ecb3afeb..0c52c4eb26 100644 --- a/pkg/azclient/client-gen/cmd/client-gen/main.go +++ b/pkg/azclient/client-gen/cmd/client-gen/main.go @@ -42,7 +42,9 @@ var ( // each turns into a command line option, // and has options for output forms. allGenerators = map[string]genall.Generator{ - "clientgen": generator.Generator{}, + "clientgen": generator.Generator{}, + "mockgen": generator.MockGenerator{}, + "clientfactorygen": generator.ClientFactoryGenerator{}, } // allOutputRules defines the list of all known output rules, giving // them names for use on the command line. diff --git a/pkg/azclient/client-gen/generator/genclientfactory_action.go b/pkg/azclient/client-gen/generator/clientfactory.go similarity index 66% rename from pkg/azclient/client-gen/generator/genclientfactory_action.go rename to pkg/azclient/client-gen/generator/clientfactory.go index 68882d534b..2d79eacf67 100644 --- a/pkg/azclient/client-gen/generator/genclientfactory_action.go +++ b/pkg/azclient/client-gen/generator/clientfactory.go @@ -18,14 +18,14 @@ limitations under the License. package generator import ( - "bytes" - "fmt" + "go/ast" "html/template" "os" "os/exec" "sigs.k8s.io/controller-tools/pkg/genall" "sigs.k8s.io/controller-tools/pkg/loader" + "sigs.k8s.io/controller-tools/pkg/markers" ) type ClientEntryConfig struct { @@ -36,68 +36,82 @@ type ClientEntryConfig struct { } type ClientFactoryGenerator struct { - clientRegistry map[string]*ClientEntryConfig - importList map[string]map[string]struct{} - headerText string + HeaderFile string `marker:",optional"` } -func NewGenerator(headerText string) *ClientFactoryGenerator { - return &ClientFactoryGenerator{ - clientRegistry: make(map[string]*ClientEntryConfig), - importList: make(map[string]map[string]struct{}), - headerText: headerText, - } +func (ClientFactoryGenerator) RegisterMarkers(into *markers.Registry) error { + return markers.RegisterAll(into, clientGenMarker, enableClientGenMarker) } -func (generator *ClientFactoryGenerator) RegisterClient(_ *genall.GenerationContext, root *loader.Package, typeName string, markerConf ClientGenConfig, _ string) error { - if _, ok := generator.importList[root.PkgPath]; !ok { - generator.importList[root.PkgPath] = make(map[string]struct{}) - } +func (generator ClientFactoryGenerator) Generate(ctx *genall.GenerationContext) error { + clientRegistry := make(map[string]*ClientEntryConfig) + importList := make(map[string]map[string]struct{}) + for _, root := range ctx.Roots { + pkgMakers, err := markers.PackageMarkers(ctx.Collector, root) + if err != nil { + root.AddError(err) + break + } + if _, markedForGeneration := pkgMakers[enableClientGenMarker.Name]; !markedForGeneration { + continue + } + + //visit each type + root.NeedTypesInfo() - generator.clientRegistry[root.Name+typeName] = &ClientEntryConfig{ - ClientGenConfig: markerConf, - PkgAlias: root.Name, - PkgPath: root.PkgPath, - InterfaceTypeName: typeName, + err = markers.EachType(ctx.Collector, root, func(typeInfo *markers.TypeInfo) { + marker := typeInfo.Markers.Get(clientGenMarker.Name) + if marker == nil { + return + } + markerConf := marker.(ClientGenConfig) + if !markerConf.OutOfSubscriptionScope { + if _, ok := importList[root.PkgPath]; !ok { + importList[root.PkgPath] = make(map[string]struct{}) + } + + clientRegistry[root.Name+typeInfo.Name] = &ClientEntryConfig{ + ClientGenConfig: markerConf, + PkgAlias: root.Name, + PkgPath: root.PkgPath, + InterfaceTypeName: typeInfo.Name, + } + } + }) } - return nil -} -func (generator *ClientFactoryGenerator) Generate(_ *genall.GenerationContext) error { { - var outContent bytes.Buffer - if err := AbstractClientFactoryInterfaceTemplate.Execute(&outContent, generator.clientRegistry); err != nil { + file, err := ctx.OutputRule.Open(nil, "factory.go") + if err != nil { return err } - file, err := os.Create("factory.go") + + err = DumpHeaderToWriter(ctx, file, generator.HeaderFile, importList, "azclient") if err != nil { + file.Close() return err } - defer file.Close() - err = DumpToWriter(file, generator.headerText, generator.importList, "azclient", &outContent) - if err != nil { + if err := AbstractClientFactoryInterfaceTemplate.Execute(file, clientRegistry); err != nil { + file.Close() return err } - fmt.Println("Generated client factory interface") + file.Close() } { - var outContent bytes.Buffer - if err := AbstractClientFactoryImplTemplate.Execute(&outContent, generator.clientRegistry); err != nil { - return err - } - file, err := os.Create("factory_gen.go") + file, err := ctx.OutputRule.Open(nil, "factory_gen.go") if err != nil { return err } defer file.Close() - importList := make(map[string]map[string]struct{}) - for k, v := range generator.importList { - importList[k] = v + + codeimportList := make(map[string]map[string]struct{}) + for k, v := range importList { + codeimportList[k] = v } - for _, v := range generator.clientRegistry { + for _, v := range clientRegistry { if v.ClientGenConfig.CrossSubFactory { - importList["sync"] = make(map[string]struct{}) - importList["strings"] = make(map[string]struct{}) + codeimportList["sync"] = make(map[string]struct{}) + codeimportList["strings"] = make(map[string]struct{}) } if v.AzureStackCloudAPIVersion != "" { importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"] = make(map[string]struct{}) @@ -105,65 +119,70 @@ func (generator *ClientFactoryGenerator) Generate(_ *genall.GenerationContext) e } } - importList["github.com/Azure/azure-sdk-for-go/sdk/azcore"] = make(map[string]struct{}) - importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"] = make(map[string]struct{}) - importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/policy/ratelimit"] = make(map[string]struct{}) - importList["github.com/Azure/azure-sdk-for-go/sdk/azidentity"] = make(map[string]struct{}) + codeimportList["github.com/Azure/azure-sdk-for-go/sdk/azcore"] = make(map[string]struct{}) + codeimportList["github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"] = make(map[string]struct{}) + codeimportList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/policy/ratelimit"] = make(map[string]struct{}) + codeimportList["github.com/Azure/azure-sdk-for-go/sdk/azidentity"] = make(map[string]struct{}) - err = DumpToWriter(file, generator.headerText, importList, "azclient", &outContent) + err = DumpHeaderToWriter(ctx, file, generator.HeaderFile, codeimportList, "azclient") if err != nil { return err } - fmt.Println("Generated client factory impl") + + if err := AbstractClientFactoryImplTemplate.Execute(file, clientRegistry); err != nil { + return err + } + } { - var mockCache bytes.Buffer - //nolint:gosec // G204 ignore this! - cmd := exec.Command("mockgen", "-package", "mock_azclient", "sigs.k8s.io/cloud-provider-azure/pkg/azclient", "ClientFactory") - cmd.Stdout = &mockCache - cmd.Stderr = os.Stderr - err := cmd.Run() + file, err := ctx.OutputRule.Open(nil, "factory_test.go") if err != nil { return err } - if err := os.MkdirAll("mock_azclient", 0755); err != nil { - return err + defer file.Close() + testimportList := make(map[string]map[string]struct{}) + for k, v := range importList { + testimportList[k] = v } - mockFile, err := os.Create("mock_azclient/interface.go") + + testimportList["github.com/onsi/ginkgo/v2"] = map[string]struct{}{} + testimportList["github.com/onsi/gomega"] = map[string]struct{}{} + + err = DumpHeaderToWriter(ctx, file, generator.HeaderFile, testimportList, "azclient") if err != nil { return err } - defer mockFile.Close() - err = DumpToWriter(mockFile, generator.headerText, nil, "", &mockCache) - if err != nil { + + if err := FactoryTestCaseTemplate.Execute(file, clientRegistry); err != nil { return err } - fmt.Println("Generated client factory mock") } { - var outContent bytes.Buffer - if err := FactoryTestCaseTemplate.Execute(&outContent, generator.clientRegistry); err != nil { - return err - } - file, err := os.Create("factory_test.go") + mockFile, err := ctx.OutputRule.Open(nil, "mock_azclient/interface.go") if err != nil { return err } - defer file.Close() - importList := make(map[string]map[string]struct{}) - importList["github.com/onsi/ginkgo/v2"] = map[string]struct{}{} - importList["github.com/onsi/gomega"] = map[string]struct{}{} - - err = DumpToWriter(file, generator.headerText, importList, "azclient", &outContent) + defer mockFile.Close() + //nolint:gosec // G204 ignore this! + cmd := exec.Command("mockgen", "-package", "mock_azclient", "-source", "factory.go", "-copyright_file", "../../hack/boilerplate/boilerplate.generatego.txt") + cmd.Stdout = mockFile + cmd.Stderr = os.Stderr + err = cmd.Run() if err != nil { return err } - fmt.Println("Generated client factory test") - } return nil } +func (ClientFactoryGenerator) CheckFilter() loader.NodeFilter { + return func(node ast.Node) bool { + // ignore structs + _, isIface := node.(*ast.InterfaceType) + return isIface + } +} + var AbstractClientFactoryImplTemplate = template.Must(template.New("object-factory-impl").Parse( ` type ClientFactoryImpl struct { diff --git a/pkg/azclient/client-gen/generator/codegenerator.go b/pkg/azclient/client-gen/generator/code.go similarity index 64% rename from pkg/azclient/client-gen/generator/codegenerator.go rename to pkg/azclient/client-gen/generator/code.go index 6315756d64..ffca45ce7a 100644 --- a/pkg/azclient/client-gen/generator/codegenerator.go +++ b/pkg/azclient/client-gen/generator/code.go @@ -18,10 +18,7 @@ limitations under the License. package generator import ( - "fmt" "go/ast" - "os" - "os/exec" "sigs.k8s.io/controller-tools/pkg/genall" "sigs.k8s.io/controller-tools/pkg/loader" @@ -54,23 +51,6 @@ func (Generator) RegisterMarkers(into *markers.Registry) error { } func (g Generator) Generate(ctx *genall.GenerationContext) error { - cmd := exec.Command("go", "get", "go.uber.org/mock/mockgen/model") - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - return err - } - var headerText string - - if g.HeaderFile != "" { - headerBytes, err := ctx.ReadFile(g.HeaderFile) - if err != nil { - return err - } - headerText = string(headerBytes) - } - - factoryGenerator := NewGenerator(headerText) for _, root := range ctx.Roots { pkgMakers, err := markers.PackageMarkers(ctx.Collector, root) @@ -79,10 +59,10 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error { break } if _, markedForGeneration := pkgMakers[enableClientGenMarker.Name]; !markedForGeneration { - fmt.Println("Ignored pkg", root.Name) + continue } - fmt.Println("Generate code for pkg ", root.PkgPath) + //check for syntax error ctx.Checker.Check(root) @@ -90,31 +70,21 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error { root.NeedTypesInfo() err = markers.EachType(ctx.Collector, root, func(typeInfo *markers.TypeInfo) { - if marker := typeInfo.Markers.Get(clientGenMarker.Name); marker != nil { - fmt.Println("Generate code for Type ", typeInfo.Name) - - markerConf := marker.(ClientGenConfig) - - if err := generateClient(ctx, root, typeInfo.Name, markerConf, headerText); err != nil { - root.AddError(err) - return - } - - if err := generateMock(ctx, root, typeInfo.Name, markerConf, headerText); err != nil { - root.AddError(err) - return - } - - if err := generateTest(ctx, root, typeInfo.Name, markerConf, headerText); err != nil { - root.AddError(err) - return - } - if !markerConf.OutOfSubscriptionScope { - if err := factoryGenerator.RegisterClient(ctx, root, typeInfo.Name, markerConf, headerText); err != nil { - root.AddError(err) - return - } - } + marker := typeInfo.Markers.Get(clientGenMarker.Name) + if marker == nil { + return + } + + markerConf := marker.(ClientGenConfig) + + if err := g.generateClient(ctx, root, typeInfo.Name, markerConf); err != nil { + root.AddError(err) + return + } + + if err := g.generateTest(ctx, root, typeInfo.Name, markerConf); err != nil { + root.AddError(err) + return } }) if err != nil { @@ -123,9 +93,6 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error { } } - if err := factoryGenerator.Generate(ctx); err != nil { - return err - } return nil } diff --git a/pkg/azclient/client-gen/generator/files.go b/pkg/azclient/client-gen/generator/files.go deleted file mode 100644 index 4878b5f066..0000000000 --- a/pkg/azclient/client-gen/generator/files.go +++ /dev/null @@ -1,64 +0,0 @@ -// /* -// Copyright The Kubernetes Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// */ - -package generator - -import ( - "bytes" - "fmt" - "io" - - "sigs.k8s.io/controller-tools/pkg/genall" - "sigs.k8s.io/controller-tools/pkg/loader" -) - -func WriteToFile(ctx *genall.GenerationContext, root *loader.Package, fileName string, headerText string, importList map[string]map[string]struct{}, codeSnips *bytes.Buffer) error { - - outputFile, err := ctx.Open(root, fileName) - if err != nil { - return err - } - defer outputFile.Close() - return DumpToWriter(outputFile, headerText, importList, root.Name, codeSnips) -} - -func DumpToWriter(writer io.Writer, headerText string, importList map[string]map[string]struct{}, pkgName string, codeSnips *bytes.Buffer) error { - outContent := new(bytes.Buffer) - - outContent.WriteString(headerText) - outContent.WriteRune('\n') - if len(pkgName) > 0 { - outContent.WriteString("// Code generated by client-gen. DO NOT EDIT.\n") - outContent.WriteString(fmt.Sprintf("package %s\n", pkgName)) - if len(importList) > 0 { - if err := ImportTemplate.Execute(outContent, importList); err != nil { - return err - } - } - } - if _, err := io.Copy(outContent, codeSnips); err != nil { - return err - } - rawBytes := outContent.Bytes() - counter, err := writer.Write(rawBytes) - if err != nil { - return err - } - if counter < len(rawBytes) { - return io.ErrShortWrite - } - return nil -} diff --git a/pkg/azclient/client-gen/generator/gencode_action.go b/pkg/azclient/client-gen/generator/gencode_action.go index 97e1293afd..078bf5c09c 100644 --- a/pkg/azclient/client-gen/generator/gencode_action.go +++ b/pkg/azclient/client-gen/generator/gencode_action.go @@ -18,8 +18,6 @@ limitations under the License. package generator import ( - "bytes" - "fmt" "strings" "sigs.k8s.io/controller-tools/pkg/genall" @@ -27,74 +25,77 @@ import ( ) // generateClient writes out the build tag, package declaration, and imports -func generateClient(ctx *genall.GenerationContext, root *loader.Package, _ string, markerConf ClientGenConfig, headerText string) error { +func (g Generator) generateClient(ctx *genall.GenerationContext, root *loader.Package, _ string, markerConf ClientGenConfig) error { var importList = make(map[string]map[string]struct{}) aliasMap := make(map[string]struct{}) aliasMap[markerConf.PackageAlias] = struct{}{} importList[markerConf.PackageName] = aliasMap - - var outContent bytes.Buffer - if err := ClientTemplate.Execute(&outContent, markerConf); err != nil { - root.AddError(err) - return err + importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"] = make(map[string]struct{}) + importList["github.com/Azure/azure-sdk-for-go/sdk/azcore"] = make(map[string]struct{}) + importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"] = make(map[string]struct{}) + importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing"] = make(map[string]struct{}) + if markerConf.OutOfSubscriptionScope && len(markerConf.Verbs) > 0 { + importList["go.opentelemetry.io/otel/attribute"] = make(map[string]struct{}) } - if err := ClientFactoryTemplate.Execute(&outContent, markerConf); err != nil { - root.AddError(err) + if markerConf.Etag { + importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"] = make(map[string]struct{}) + importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/policy/etag"] = make(map[string]struct{}) + } + + file, err := ctx.Open(root, "zz_generated_client.go") + if err != nil { return err } + defer file.Close() + if len(markerConf.Verbs) > 0 { importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/metrics"] = make(map[string]struct{}) importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"] = make(map[string]struct{}) importList["context"] = make(map[string]struct{}) } + + if err := DumpHeaderToWriter(ctx, file, g.HeaderFile, importList, root.Name); err != nil { + return err + } + + if err := ClientTemplate.Execute(file, markerConf); err != nil { + root.AddError(err) + return err + } + if err := ClientFactoryTemplate.Execute(file, markerConf); err != nil { + root.AddError(err) + return err + } // define structs for _, verb := range markerConf.Verbs { switch true { case strings.EqualFold(FuncCreateOrUpdate, verb): - if err := CreateOrUpdateFuncTemplate.Execute(&outContent, markerConf); err != nil { + if err := CreateOrUpdateFuncTemplate.Execute(file, markerConf); err != nil { root.AddError(err) return err } case strings.EqualFold(FuncDelete, verb): - if err := DeleteFuncTemplate.Execute(&outContent, markerConf); err != nil { + if err := DeleteFuncTemplate.Execute(file, markerConf); err != nil { root.AddError(err) return err } case strings.EqualFold(FuncListByRG, verb): - if err := ListByRGFuncTemplate.Execute(&outContent, markerConf); err != nil { + if err := ListByRGFuncTemplate.Execute(file, markerConf); err != nil { root.AddError(err) return err } case strings.EqualFold(FuncList, verb): - if err := ListFuncTemplate.Execute(&outContent, markerConf); err != nil { + if err := ListFuncTemplate.Execute(file, markerConf); err != nil { root.AddError(err) return err } case strings.EqualFold(FuncGet, verb): - if err := GetFuncTemplate.Execute(&outContent, markerConf); err != nil { + if err := GetFuncTemplate.Execute(file, markerConf); err != nil { root.AddError(err) return err } } } - if outContent.Len() <= 0 { - return nil - } - importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"] = make(map[string]struct{}) - importList["github.com/Azure/azure-sdk-for-go/sdk/azcore"] = make(map[string]struct{}) - importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"] = make(map[string]struct{}) - importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing"] = make(map[string]struct{}) - if markerConf.OutOfSubscriptionScope && len(markerConf.Verbs) > 0 { - importList["go.opentelemetry.io/otel/attribute"] = make(map[string]struct{}) - } - if markerConf.Etag { - importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"] = make(map[string]struct{}) - importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/policy/etag"] = make(map[string]struct{}) - } - if err := WriteToFile(ctx, root, "zz_generated_client.go", headerText, importList, &outContent); err != nil { - return err - } - fmt.Println("Generated zz_generated_client.go in " + root.Name) return nil } diff --git a/pkg/azclient/client-gen/generator/genmock_action.go b/pkg/azclient/client-gen/generator/genmock_action.go deleted file mode 100644 index 6704153cfa..0000000000 --- a/pkg/azclient/client-gen/generator/genmock_action.go +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright 2023 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package generator -package generator - -import ( - "bytes" - "fmt" - "os" - "os/exec" - - "sigs.k8s.io/controller-tools/pkg/genall" - "sigs.k8s.io/controller-tools/pkg/loader" -) - -func generateMock(ctx *genall.GenerationContext, pkg *loader.Package, typeName string, _ ClientGenConfig, headerText string) error { - var mockCache bytes.Buffer - //nolint:gosec // G204 ignore this! - cmd := exec.Command("mockgen", "-package", "mock_"+pkg.Name, "-source", pkg.Name+"/interface.go") - cmd.Stdout = &mockCache - cmd.Stderr = os.Stderr - err := cmd.Run() - if err != nil { - return err - } - if err := os.MkdirAll(pkg.Name+"/mock_"+pkg.Name, 0755); err != nil { - return err - } - mockFile, err := ctx.Open(pkg, "mock_"+pkg.Name+"/interface.go") - if err != nil { - return err - } - defer mockFile.Close() - _, err = mockFile.Write([]byte(headerText + "\n")) - if err != nil { - return err - } - _, err = mockFile.Write(mockCache.Bytes()) - fmt.Println("Generated mock in " + pkg.Name) - return err -} diff --git a/pkg/azclient/client-gen/generator/gentest_action.go b/pkg/azclient/client-gen/generator/gentest_action.go index 2424196c49..e54f3be0e2 100644 --- a/pkg/azclient/client-gen/generator/gentest_action.go +++ b/pkg/azclient/client-gen/generator/gentest_action.go @@ -19,35 +19,25 @@ package generator import ( "bytes" - "fmt" - "os" "strings" "sigs.k8s.io/controller-tools/pkg/genall" "sigs.k8s.io/controller-tools/pkg/loader" ) -func generateTest(ctx *genall.GenerationContext, root *loader.Package, typeName string, markerConf ClientGenConfig, headerText string) error { - if err := generateTestSuite(ctx, root, typeName, markerConf, headerText); err != nil { +func (g Generator) generateTest(ctx *genall.GenerationContext, root *loader.Package, typeName string, markerConf ClientGenConfig) error { + if err := g.generateTestSuite(ctx, root, typeName, markerConf); err != nil { return err } - if err := generateTestCase(ctx, root, typeName, markerConf, headerText); err != nil { + if err := g.generateTestCase(ctx, root, typeName, markerConf); err != nil { return err } - if err := generateTestCaseCustom(ctx, root, typeName, markerConf, headerText); err != nil { - return err - } - - if err := os.MkdirAll(root.Name+"/testdata", 0755); err != nil { - return err - } - fmt.Println("Generated test in " + root.Name) return nil } -func generateTestSuite(ctx *genall.GenerationContext, root *loader.Package, _ string, markerConf ClientGenConfig, headerText string) error { +func (g Generator) generateTestSuite(ctx *genall.GenerationContext, root *loader.Package, _ string, markerConf ClientGenConfig) error { var importList = make(map[string]map[string]struct{}) for _, verb := range markerConf.Verbs { @@ -79,10 +69,11 @@ func generateTestSuite(ctx *genall.GenerationContext, root *loader.Package, _ st importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"] = make(map[string]struct{}) importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"] = make(map[string]struct{}) - return WriteToFile(ctx, root, root.Name+"_suite_test.go", headerText, importList, &outContent) + // return DumpHeaderToWriter(ctx, root, root.Name+"_suite_test.go", headerText, importList, &outContent) + return nil } -func generateTestCase(ctx *genall.GenerationContext, root *loader.Package, _ string, markerConf ClientGenConfig, headerText string) error { +func (g Generator) generateTestCase(ctx *genall.GenerationContext, root *loader.Package, _ string, markerConf ClientGenConfig) error { var importList = make(map[string]map[string]struct{}) for _, verb := range markerConf.Verbs { if strings.EqualFold(FuncCreateOrUpdate, verb) { @@ -95,43 +86,22 @@ func generateTestCase(ctx *genall.GenerationContext, root *loader.Package, _ str if len(markerConf.Verbs) > 0 { importList["github.com/onsi/gomega"] = map[string]struct{}{} } - var outContent bytes.Buffer - if err := TestCaseTemplate.Execute(&outContent, markerConf); err != nil { - root.AddError(err) - } - - if outContent.Len() <= 0 { - return nil - } - importList["context"] = make(map[string]struct{}) importList["github.com/onsi/ginkgo/v2"] = map[string]struct{}{} if markerConf.Etag { importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/to"] = make(map[string]struct{}) } - return WriteToFile(ctx, root, root.Name+"_test.go", headerText, importList, &outContent) -} - -func generateTestCaseCustom(ctx *genall.GenerationContext, root *loader.Package, _ string, markerConf ClientGenConfig, headerText string) error { - if _, err := os.Lstat(root.Name + "/custom_test.go"); err == nil || !os.IsNotExist(err) { - fmt.Println(root.Name + "/custom_test.go already exists, skipping generation of custom test") - return nil + file, err := ctx.Open(root, root.Name+"_test.go") + if err != nil { + return err } + defer file.Close() - var importList = make(map[string]map[string]struct{}) - aliasMap := make(map[string]struct{}) - aliasMap[markerConf.PackageAlias] = struct{}{} - importList[markerConf.PackageName] = aliasMap - - var outContent bytes.Buffer - if err := TestCaseCustomTemplate.Execute(&outContent, markerConf); err != nil { - root.AddError(err) + if err := DumpHeaderToWriter(ctx, file, g.HeaderFile, importList, root.Name); err != nil { + return err } - - if outContent.Len() <= 0 { - return nil + if err := TestCaseTemplate.Execute(file, markerConf); err != nil { + root.AddError(err) } - - importList["context"] = make(map[string]struct{}) - return WriteToFile(ctx, root, "custom_test.go", headerText, importList, &outContent) + return nil } diff --git a/pkg/azclient/client-gen/generator/header.go b/pkg/azclient/client-gen/generator/header.go new file mode 100644 index 0000000000..ec7f4fb0fb --- /dev/null +++ b/pkg/azclient/client-gen/generator/header.go @@ -0,0 +1,42 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package generator + +import ( + "io" + + "sigs.k8s.io/controller-tools/pkg/genall" +) + +func DumpHeaderToWriter(ctx *genall.GenerationContext, writer io.Writer, headerFile string, importList map[string]map[string]struct{}, pkgName string) error { + if headerFile != "" { + headerFileReader, err := ctx.OpenForRead(headerFile) + if err != nil { + return err + } + defer headerFileReader.Close() + if _, err = io.Copy(writer, headerFileReader); err != nil { + return err + } + } + + if err := HeaderTemplate.Execute(writer, HeaderTemplateVariable{PackageName: pkgName, ImportList: importList}); err != nil { + return err + } + + return nil +} diff --git a/pkg/azclient/client-gen/generator/mock.go b/pkg/azclient/client-gen/generator/mock.go new file mode 100644 index 0000000000..fad2bca985 --- /dev/null +++ b/pkg/azclient/client-gen/generator/mock.go @@ -0,0 +1,111 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package generator +package generator + +import ( + "go/ast" + "os" + "os/exec" + + "sigs.k8s.io/controller-tools/pkg/genall" + "sigs.k8s.io/controller-tools/pkg/loader" + "sigs.k8s.io/controller-tools/pkg/markers" +) + +type MockGenerator struct { + HeaderFile string `marker:",optional"` +} + +func (MockGenerator) RegisterMarkers(into *markers.Registry) error { + return markers.RegisterAll(into, clientGenMarker, enableClientGenMarker) +} + +func (generator MockGenerator) Generate(ctx *genall.GenerationContext) error { + cmd := exec.Command("go", "get", "go.uber.org/mock/mockgen/model") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + var err error + if err = cmd.Run(); err != nil { + return err + } + for _, root := range ctx.Roots { + pkgMakers, err := markers.PackageMarkers(ctx.Collector, root) + if err != nil { + root.AddError(err) + break + } + if _, markedForGeneration := pkgMakers[enableClientGenMarker.Name]; !markedForGeneration { + + continue + } + + //visit each type + root.NeedTypesInfo() + + err = markers.EachType(ctx.Collector, root, func(typeInfo *markers.TypeInfo) { + marker := typeInfo.Markers.Get(clientGenMarker.Name) + if marker == nil { + return + } + + mockFile, err := ctx.OutputRule.Open(root, "mock_"+root.Name+"/interface.go") + if err != nil { + root.AddError(err) + return + } + defer mockFile.Close() + //nolint:gosec // G204 ignore this! + cmd := exec.Command("mockgen", "-package", "mock_"+root.Name, "-source", root.Name+"/interface.go", "-copyright_file", generator.HeaderFile) + cmd.Stdout = mockFile + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + root.AddError(err) + return + } + + }) + if err != nil { + break + } + } + return err +} + +func (generator MockGenerator) Help() *markers.DefinitionHelp { + return &markers.DefinitionHelp{ + DetailedHelp: markers.DetailedHelp{ + Summary: "Generate mock for the given package", + Details: `Generate mock for the given package`, + }, + FieldHelp: map[string]markers.DetailedHelp{ + "HeaderFile": { + Summary: "header file path", + Details: `header file path`, + }, + }, + } +} + +func (MockGenerator) CheckFilter() loader.NodeFilter { + return func(node ast.Node) bool { + // ignore structs + _, isIface := node.(*ast.InterfaceType) + return isIface + } +} diff --git a/pkg/azclient/client-gen/generator/template.go b/pkg/azclient/client-gen/generator/template.go index 3c613547df..d6d8800e6a 100644 --- a/pkg/azclient/client-gen/generator/template.go +++ b/pkg/azclient/client-gen/generator/template.go @@ -1,18 +1,18 @@ -/* -Copyright 2023 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ +// /* +// Copyright The Kubernetes Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// */ package generator @@ -20,17 +20,17 @@ import "html/template" type ClientGenConfig struct { Verbs []string `marker:",optional"` - Resource string - SubResource string `marker:"subResource,optional"` - PackageName string - PackageAlias string - ClientName string - OutOfSubscriptionScope bool `marker:"outOfSubscriptionScope,optional"` - Expand bool `marker:"expand,optional"` - RateLimitKey string `marker:"rateLimitKey,optional"` - CrossSubFactory bool `marker:"crossSubFactory,optional"` - Etag bool `marker:"etag,optional"` - AzureStackCloudAPIVersion string `marker:"azureStackCloudAPIVersion,optional"` + Resource string `marker:",optional"` + SubResource string `marker:"subResource,optional"` + PackageName string `marker:",optional"` + PackageAlias string `marker:",optional"` + ClientName string `marker:",optional"` + OutOfSubscriptionScope bool `marker:"outOfSubscriptionScope,optional"` + Expand bool `marker:"expand,optional"` + RateLimitKey string `marker:"rateLimitKey,optional"` + CrossSubFactory bool `marker:"crossSubFactory,optional"` + Etag bool `marker:"etag,optional"` + AzureStackCloudAPIVersion string `marker:"azureStackCloudAPIVersion,optional"` } var ClientTemplate = template.Must(template.New("object-scaffolding-client-struct").Parse(` @@ -186,18 +186,22 @@ func (client *Client) Get(ctx context.Context, resourceGroupName string, {{with } `)) -var ImportTemplate = template.Must(template.New("import").Parse( +var HeaderTemplate = template.Must(template.New("import").Parse( ` + +// Code generated by client-gen. DO NOT EDIT. +package {{.PackageName}} + import ( - {{ range $package, $Entry := . }} + {{ range $package, $Entry := .ImportList }} {{- range $alias, $flag := $Entry}}{{$alias}} {{end}}"{{$package}}" {{ end -}} ) `)) -type ImportStatement struct { - Alias string - Package string +type HeaderTemplateVariable struct { + PackageName string + ImportList map[string]map[string]struct{} } var TestSuiteTemplate = template.Must(template.New("object-scaffolding-test-suite").Parse( @@ -373,38 +377,3 @@ var _ = ginkgo.Describe("{{.ClientName}}",ginkgo.Ordered, func() { } }) `)) - -var TestCaseCustomTemplate = template.Must(template.New("object-scaffolding-test-case-custom").Parse( - ` - {{ $resource := .Resource}} - {{ if (gt (len .SubResource) 0) }} - {{ $resource = .SubResource}} - {{- end -}} - {{- $HasCreateOrUpdate := false }} - {{- $HasGet := false }} - {{- $HasDelete := false }} - {{- $HasListByRG := false }} - {{- $HasList := false }} - {{- range .Verbs}} - {{- if eq . "createorupdate"}}{{$HasCreateOrUpdate = true}}{{end}} - {{- if eq . "get"}}{{$HasGet = true}}{{end}} - {{- if eq . "delete"}}{{$HasDelete = true}}{{end}} - {{- if eq . "listbyrg"}}{{$HasListByRG = true}}{{end}} - {{- if eq . "list"}}{{$HasList = true}}{{end}} - {{- end -}} -func init() { - additionalTestCases = func() { - } - - beforeAllFunc = func(ctx context.Context) { - {{if not $HasCreateOrUpdate}} - newResource = &{{.PackageAlias}}.{{$resource}}{ - {{if not .SubResource}}Location: to.Ptr(location), {{- end -}} - } - {{- end -}} - } - afterAllFunc = func(ctx context.Context) { - } -} - -`)) diff --git a/pkg/azclient/deploymentclient/mock_deploymentclient/interface.go b/pkg/azclient/deploymentclient/mock_deploymentclient/interface.go index 1620aa85e7..3fce069f7e 100644 --- a/pkg/azclient/deploymentclient/mock_deploymentclient/interface.go +++ b/pkg/azclient/deploymentclient/mock_deploymentclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: deploymentclient/interface.go // // Generated by this command: // -// mockgen -package mock_deploymentclient -source deploymentclient/interface.go +// mockgen -package mock_deploymentclient -source deploymentclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_deploymentclient is a generated GoMock package. diff --git a/pkg/azclient/diskclient/mock_diskclient/interface.go b/pkg/azclient/diskclient/mock_diskclient/interface.go index caa92ad896..df59562432 100644 --- a/pkg/azclient/diskclient/mock_diskclient/interface.go +++ b/pkg/azclient/diskclient/mock_diskclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: diskclient/interface.go // // Generated by this command: // -// mockgen -package mock_diskclient -source diskclient/interface.go +// mockgen -package mock_diskclient -source diskclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_diskclient is a generated GoMock package. diff --git a/pkg/azclient/fileservicepropertiesclient/mock_fileservicepropertiesclient/interface.go b/pkg/azclient/fileservicepropertiesclient/mock_fileservicepropertiesclient/interface.go index 7b811a9735..9d4716424d 100644 --- a/pkg/azclient/fileservicepropertiesclient/mock_fileservicepropertiesclient/interface.go +++ b/pkg/azclient/fileservicepropertiesclient/mock_fileservicepropertiesclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: fileservicepropertiesclient/interface.go // // Generated by this command: // -// mockgen -package mock_fileservicepropertiesclient -source fileservicepropertiesclient/interface.go +// mockgen -package mock_fileservicepropertiesclient -source fileservicepropertiesclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_fileservicepropertiesclient is a generated GoMock package. diff --git a/pkg/azclient/fileshareclient/mock_fileshareclient/interface.go b/pkg/azclient/fileshareclient/mock_fileshareclient/interface.go index 0f9e7d4d04..228e692acd 100644 --- a/pkg/azclient/fileshareclient/mock_fileshareclient/interface.go +++ b/pkg/azclient/fileshareclient/mock_fileshareclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: fileshareclient/interface.go // // Generated by this command: // -// mockgen -package mock_fileshareclient -source fileshareclient/interface.go +// mockgen -package mock_fileshareclient -source fileshareclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_fileshareclient is a generated GoMock package. diff --git a/pkg/azclient/identityclient/mock_identityclient/interface.go b/pkg/azclient/identityclient/mock_identityclient/interface.go index 471d9ea3a1..95fd0a8fc4 100644 --- a/pkg/azclient/identityclient/mock_identityclient/interface.go +++ b/pkg/azclient/identityclient/mock_identityclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: identityclient/interface.go // // Generated by this command: // -// mockgen -package mock_identityclient -source identityclient/interface.go +// mockgen -package mock_identityclient -source identityclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_identityclient is a generated GoMock package. diff --git a/pkg/azclient/interfaceclient/mock_interfaceclient/interface.go b/pkg/azclient/interfaceclient/mock_interfaceclient/interface.go index 4c6fbb67fc..7bc13f5303 100644 --- a/pkg/azclient/interfaceclient/mock_interfaceclient/interface.go +++ b/pkg/azclient/interfaceclient/mock_interfaceclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: interfaceclient/interface.go // // Generated by this command: // -// mockgen -package mock_interfaceclient -source interfaceclient/interface.go +// mockgen -package mock_interfaceclient -source interfaceclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_interfaceclient is a generated GoMock package. diff --git a/pkg/azclient/ipgroupclient/mock_ipgroupclient/interface.go b/pkg/azclient/ipgroupclient/mock_ipgroupclient/interface.go index 1310db03e7..9413889ce5 100644 --- a/pkg/azclient/ipgroupclient/mock_ipgroupclient/interface.go +++ b/pkg/azclient/ipgroupclient/mock_ipgroupclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: ipgroupclient/interface.go // // Generated by this command: // -// mockgen -package mock_ipgroupclient -source ipgroupclient/interface.go +// mockgen -package mock_ipgroupclient -source ipgroupclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_ipgroupclient is a generated GoMock package. diff --git a/pkg/azclient/loadbalancerclient/mock_loadbalancerclient/interface.go b/pkg/azclient/loadbalancerclient/mock_loadbalancerclient/interface.go index fa1330fcd2..0d4ab11b36 100644 --- a/pkg/azclient/loadbalancerclient/mock_loadbalancerclient/interface.go +++ b/pkg/azclient/loadbalancerclient/mock_loadbalancerclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: loadbalancerclient/interface.go // // Generated by this command: // -// mockgen -package mock_loadbalancerclient -source loadbalancerclient/interface.go +// mockgen -package mock_loadbalancerclient -source loadbalancerclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_loadbalancerclient is a generated GoMock package. diff --git a/pkg/azclient/managedclusterclient/mock_managedclusterclient/interface.go b/pkg/azclient/managedclusterclient/mock_managedclusterclient/interface.go index 35c78ad201..a83684a57d 100644 --- a/pkg/azclient/managedclusterclient/mock_managedclusterclient/interface.go +++ b/pkg/azclient/managedclusterclient/mock_managedclusterclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: managedclusterclient/interface.go // // Generated by this command: // -// mockgen -package mock_managedclusterclient -source managedclusterclient/interface.go +// mockgen -package mock_managedclusterclient -source managedclusterclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_managedclusterclient is a generated GoMock package. diff --git a/pkg/azclient/mock_azclient/interface.go b/pkg/azclient/mock_azclient/interface.go index d9f82a5da3..2120e1ab8f 100644 --- a/pkg/azclient/mock_azclient/interface.go +++ b/pkg/azclient/mock_azclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. -// Source: sigs.k8s.io/cloud-provider-azure/pkg/azclient (interfaces: ClientFactory) +// Source: factory.go // // Generated by this command: // -// mockgen -package mock_azclient sigs.k8s.io/cloud-provider-azure/pkg/azclient ClientFactory +// mockgen -package mock_azclient -source factory.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_azclient is a generated GoMock package. diff --git a/pkg/azclient/privateendpointclient/mock_privateendpointclient/interface.go b/pkg/azclient/privateendpointclient/mock_privateendpointclient/interface.go index b255b0cf45..f717fb23d1 100644 --- a/pkg/azclient/privateendpointclient/mock_privateendpointclient/interface.go +++ b/pkg/azclient/privateendpointclient/mock_privateendpointclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: privateendpointclient/interface.go // // Generated by this command: // -// mockgen -package mock_privateendpointclient -source privateendpointclient/interface.go +// mockgen -package mock_privateendpointclient -source privateendpointclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_privateendpointclient is a generated GoMock package. diff --git a/pkg/azclient/privatelinkserviceclient/mock_privatelinkserviceclient/interface.go b/pkg/azclient/privatelinkserviceclient/mock_privatelinkserviceclient/interface.go index 630b2663e9..95290b298c 100644 --- a/pkg/azclient/privatelinkserviceclient/mock_privatelinkserviceclient/interface.go +++ b/pkg/azclient/privatelinkserviceclient/mock_privatelinkserviceclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: privatelinkserviceclient/interface.go // // Generated by this command: // -// mockgen -package mock_privatelinkserviceclient -source privatelinkserviceclient/interface.go +// mockgen -package mock_privatelinkserviceclient -source privatelinkserviceclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_privatelinkserviceclient is a generated GoMock package. diff --git a/pkg/azclient/privatezoneclient/mock_privatezoneclient/interface.go b/pkg/azclient/privatezoneclient/mock_privatezoneclient/interface.go index b90d7bdb86..6adaeeab59 100644 --- a/pkg/azclient/privatezoneclient/mock_privatezoneclient/interface.go +++ b/pkg/azclient/privatezoneclient/mock_privatezoneclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: privatezoneclient/interface.go // // Generated by this command: // -// mockgen -package mock_privatezoneclient -source privatezoneclient/interface.go +// mockgen -package mock_privatezoneclient -source privatezoneclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_privatezoneclient is a generated GoMock package. diff --git a/pkg/azclient/providerclient/mock_providerclient/interface.go b/pkg/azclient/providerclient/mock_providerclient/interface.go index 969ec4b8ec..de74d3cb1c 100644 --- a/pkg/azclient/providerclient/mock_providerclient/interface.go +++ b/pkg/azclient/providerclient/mock_providerclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: providerclient/interface.go // // Generated by this command: // -// mockgen -package mock_providerclient -source providerclient/interface.go +// mockgen -package mock_providerclient -source providerclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_providerclient is a generated GoMock package. diff --git a/pkg/azclient/publicipaddressclient/mock_publicipaddressclient/interface.go b/pkg/azclient/publicipaddressclient/mock_publicipaddressclient/interface.go index f83b764537..1e18926c6d 100644 --- a/pkg/azclient/publicipaddressclient/mock_publicipaddressclient/interface.go +++ b/pkg/azclient/publicipaddressclient/mock_publicipaddressclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: publicipaddressclient/interface.go // // Generated by this command: // -// mockgen -package mock_publicipaddressclient -source publicipaddressclient/interface.go +// mockgen -package mock_publicipaddressclient -source publicipaddressclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_publicipaddressclient is a generated GoMock package. diff --git a/pkg/azclient/publicipprefixclient/mock_publicipprefixclient/interface.go b/pkg/azclient/publicipprefixclient/mock_publicipprefixclient/interface.go index 49e499c705..f52d1402dd 100644 --- a/pkg/azclient/publicipprefixclient/mock_publicipprefixclient/interface.go +++ b/pkg/azclient/publicipprefixclient/mock_publicipprefixclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: publicipprefixclient/interface.go // // Generated by this command: // -// mockgen -package mock_publicipprefixclient -source publicipprefixclient/interface.go +// mockgen -package mock_publicipprefixclient -source publicipprefixclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_publicipprefixclient is a generated GoMock package. diff --git a/pkg/azclient/registryclient/mock_registryclient/interface.go b/pkg/azclient/registryclient/mock_registryclient/interface.go index 9f69d66474..22ac3f81ae 100644 --- a/pkg/azclient/registryclient/mock_registryclient/interface.go +++ b/pkg/azclient/registryclient/mock_registryclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: registryclient/interface.go // // Generated by this command: // -// mockgen -package mock_registryclient -source registryclient/interface.go +// mockgen -package mock_registryclient -source registryclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_registryclient is a generated GoMock package. diff --git a/pkg/azclient/resourcegroupclient/mock_resourcegroupclient/interface.go b/pkg/azclient/resourcegroupclient/mock_resourcegroupclient/interface.go index 1170633acc..2dfa041287 100644 --- a/pkg/azclient/resourcegroupclient/mock_resourcegroupclient/interface.go +++ b/pkg/azclient/resourcegroupclient/mock_resourcegroupclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: resourcegroupclient/interface.go // // Generated by this command: // -// mockgen -package mock_resourcegroupclient -source resourcegroupclient/interface.go +// mockgen -package mock_resourcegroupclient -source resourcegroupclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_resourcegroupclient is a generated GoMock package. diff --git a/pkg/azclient/roleassignmentclient/mock_roleassignmentclient/interface.go b/pkg/azclient/roleassignmentclient/mock_roleassignmentclient/interface.go index 257669e59f..dde6985a4a 100644 --- a/pkg/azclient/roleassignmentclient/mock_roleassignmentclient/interface.go +++ b/pkg/azclient/roleassignmentclient/mock_roleassignmentclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: roleassignmentclient/interface.go // // Generated by this command: // -// mockgen -package mock_roleassignmentclient -source roleassignmentclient/interface.go +// mockgen -package mock_roleassignmentclient -source roleassignmentclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_roleassignmentclient is a generated GoMock package. diff --git a/pkg/azclient/roledefinitionclient/mock_roledefinitionclient/interface.go b/pkg/azclient/roledefinitionclient/mock_roledefinitionclient/interface.go index 25a3980699..b8fec2b31b 100644 --- a/pkg/azclient/roledefinitionclient/mock_roledefinitionclient/interface.go +++ b/pkg/azclient/roledefinitionclient/mock_roledefinitionclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: roledefinitionclient/interface.go // // Generated by this command: // -// mockgen -package mock_roledefinitionclient -source roledefinitionclient/interface.go +// mockgen -package mock_roledefinitionclient -source roledefinitionclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_roledefinitionclient is a generated GoMock package. diff --git a/pkg/azclient/routetableclient/mock_routetableclient/interface.go b/pkg/azclient/routetableclient/mock_routetableclient/interface.go index ef6fedb428..48628377e8 100644 --- a/pkg/azclient/routetableclient/mock_routetableclient/interface.go +++ b/pkg/azclient/routetableclient/mock_routetableclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: routetableclient/interface.go // // Generated by this command: // -// mockgen -package mock_routetableclient -source routetableclient/interface.go +// mockgen -package mock_routetableclient -source routetableclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_routetableclient is a generated GoMock package. diff --git a/pkg/azclient/secretclient/mock_secretclient/interface.go b/pkg/azclient/secretclient/mock_secretclient/interface.go index 2f120b3be3..82116005ed 100644 --- a/pkg/azclient/secretclient/mock_secretclient/interface.go +++ b/pkg/azclient/secretclient/mock_secretclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: secretclient/interface.go // // Generated by this command: // -// mockgen -package mock_secretclient -source secretclient/interface.go +// mockgen -package mock_secretclient -source secretclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_secretclient is a generated GoMock package. diff --git a/pkg/azclient/securitygroupclient/mock_securitygroupclient/interface.go b/pkg/azclient/securitygroupclient/mock_securitygroupclient/interface.go index 466a774b7d..a9d719f7ad 100644 --- a/pkg/azclient/securitygroupclient/mock_securitygroupclient/interface.go +++ b/pkg/azclient/securitygroupclient/mock_securitygroupclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: securitygroupclient/interface.go // // Generated by this command: // -// mockgen -package mock_securitygroupclient -source securitygroupclient/interface.go +// mockgen -package mock_securitygroupclient -source securitygroupclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_securitygroupclient is a generated GoMock package. diff --git a/pkg/azclient/snapshotclient/mock_snapshotclient/interface.go b/pkg/azclient/snapshotclient/mock_snapshotclient/interface.go index 75678c12cb..4cb330d9e0 100644 --- a/pkg/azclient/snapshotclient/mock_snapshotclient/interface.go +++ b/pkg/azclient/snapshotclient/mock_snapshotclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: snapshotclient/interface.go // // Generated by this command: // -// mockgen -package mock_snapshotclient -source snapshotclient/interface.go +// mockgen -package mock_snapshotclient -source snapshotclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_snapshotclient is a generated GoMock package. diff --git a/pkg/azclient/sshpublickeyresourceclient/mock_sshpublickeyresourceclient/interface.go b/pkg/azclient/sshpublickeyresourceclient/mock_sshpublickeyresourceclient/interface.go index f62225bcd9..af35fb0a05 100644 --- a/pkg/azclient/sshpublickeyresourceclient/mock_sshpublickeyresourceclient/interface.go +++ b/pkg/azclient/sshpublickeyresourceclient/mock_sshpublickeyresourceclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: sshpublickeyresourceclient/interface.go // // Generated by this command: // -// mockgen -package mock_sshpublickeyresourceclient -source sshpublickeyresourceclient/interface.go +// mockgen -package mock_sshpublickeyresourceclient -source sshpublickeyresourceclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_sshpublickeyresourceclient is a generated GoMock package. diff --git a/pkg/azclient/subnetclient/mock_subnetclient/interface.go b/pkg/azclient/subnetclient/mock_subnetclient/interface.go index 382b6b4f86..ab770ef46d 100644 --- a/pkg/azclient/subnetclient/mock_subnetclient/interface.go +++ b/pkg/azclient/subnetclient/mock_subnetclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: subnetclient/interface.go // // Generated by this command: // -// mockgen -package mock_subnetclient -source subnetclient/interface.go +// mockgen -package mock_subnetclient -source subnetclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_subnetclient is a generated GoMock package. diff --git a/pkg/azclient/vaultclient/mock_vaultclient/interface.go b/pkg/azclient/vaultclient/mock_vaultclient/interface.go index 6bae2094a2..3476734eec 100644 --- a/pkg/azclient/vaultclient/mock_vaultclient/interface.go +++ b/pkg/azclient/vaultclient/mock_vaultclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: vaultclient/interface.go // // Generated by this command: // -// mockgen -package mock_vaultclient -source vaultclient/interface.go +// mockgen -package mock_vaultclient -source vaultclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_vaultclient is a generated GoMock package. diff --git a/pkg/azclient/virtualmachineclient/mock_virtualmachineclient/interface.go b/pkg/azclient/virtualmachineclient/mock_virtualmachineclient/interface.go index ee3625115b..e1a6e132c4 100644 --- a/pkg/azclient/virtualmachineclient/mock_virtualmachineclient/interface.go +++ b/pkg/azclient/virtualmachineclient/mock_virtualmachineclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: virtualmachineclient/interface.go // // Generated by this command: // -// mockgen -package mock_virtualmachineclient -source virtualmachineclient/interface.go +// mockgen -package mock_virtualmachineclient -source virtualmachineclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_virtualmachineclient is a generated GoMock package. diff --git a/pkg/azclient/virtualmachinescalesetclient/mock_virtualmachinescalesetclient/interface.go b/pkg/azclient/virtualmachinescalesetclient/mock_virtualmachinescalesetclient/interface.go index 74cc15a33e..b5cdef9f5a 100644 --- a/pkg/azclient/virtualmachinescalesetclient/mock_virtualmachinescalesetclient/interface.go +++ b/pkg/azclient/virtualmachinescalesetclient/mock_virtualmachinescalesetclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: virtualmachinescalesetclient/interface.go // // Generated by this command: // -// mockgen -package mock_virtualmachinescalesetclient -source virtualmachinescalesetclient/interface.go +// mockgen -package mock_virtualmachinescalesetclient -source virtualmachinescalesetclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_virtualmachinescalesetclient is a generated GoMock package. diff --git a/pkg/azclient/virtualmachinescalesetvmclient/mock_virtualmachinescalesetvmclient/interface.go b/pkg/azclient/virtualmachinescalesetvmclient/mock_virtualmachinescalesetvmclient/interface.go index 8dc196881f..6724a9e0e0 100644 --- a/pkg/azclient/virtualmachinescalesetvmclient/mock_virtualmachinescalesetvmclient/interface.go +++ b/pkg/azclient/virtualmachinescalesetvmclient/mock_virtualmachinescalesetvmclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: virtualmachinescalesetvmclient/interface.go // // Generated by this command: // -// mockgen -package mock_virtualmachinescalesetvmclient -source virtualmachinescalesetvmclient/interface.go +// mockgen -package mock_virtualmachinescalesetvmclient -source virtualmachinescalesetvmclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_virtualmachinescalesetvmclient is a generated GoMock package. diff --git a/pkg/azclient/virtualnetworkclient/mock_virtualnetworkclient/interface.go b/pkg/azclient/virtualnetworkclient/mock_virtualnetworkclient/interface.go index ecb2f44e75..3f0ccf9b41 100644 --- a/pkg/azclient/virtualnetworkclient/mock_virtualnetworkclient/interface.go +++ b/pkg/azclient/virtualnetworkclient/mock_virtualnetworkclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: virtualnetworkclient/interface.go // // Generated by this command: // -// mockgen -package mock_virtualnetworkclient -source virtualnetworkclient/interface.go +// mockgen -package mock_virtualnetworkclient -source virtualnetworkclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_virtualnetworkclient is a generated GoMock package. diff --git a/pkg/azclient/virtualnetworklinkclient/mock_virtualnetworklinkclient/interface.go b/pkg/azclient/virtualnetworklinkclient/mock_virtualnetworklinkclient/interface.go index 3636460528..a603655a6a 100644 --- a/pkg/azclient/virtualnetworklinkclient/mock_virtualnetworklinkclient/interface.go +++ b/pkg/azclient/virtualnetworklinkclient/mock_virtualnetworklinkclient/interface.go @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // */ +// // Code generated by MockGen. DO NOT EDIT. // Source: virtualnetworklinkclient/interface.go // // Generated by this command: // -// mockgen -package mock_virtualnetworklinkclient -source virtualnetworklinkclient/interface.go +// mockgen -package mock_virtualnetworklinkclient -source virtualnetworklinkclient/interface.go -copyright_file ../../hack/boilerplate/boilerplate.generatego.txt // // Package mock_virtualnetworklinkclient is a generated GoMock package.