Skip to content

Commit 95ccaf4

Browse files
add etag support in network resources (#7458)
1 parent 8f0923c commit 95ccaf4

34 files changed

+828
-264
lines changed

pkg/azclient/Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ build: ## Build manager binary.
6767
pushd client-gen; CGO_ENABLED=0 go build -o ../bin/client-gen ./cmd/client-gen/ ;popd
6868
pushd client-gen; CGO_ENABLED=0 go build -o ../bin/typescaffold ./cmd/typescaffold/;popd
6969

70+
.PHONY: test
71+
test: ## Run tests.
72+
go test -v ./...
73+
7074
.PHONY: generate
7175
generate: install-dependencies build generatecode generateimpl fmt vet-all
7276

pkg/azclient/client-gen/cmd/typescaffold/type_scaffold.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type TypeScaffoldOptions struct {
3939
Expand bool
4040
RateLimitKey string
4141
CrossSubFactory bool
42+
Etag bool
4243
}
4344

4445
var (
@@ -71,7 +72,7 @@ import (
7172
)
7273
`
7374
TypeResourceTemplate = `
74-
// +azure:client:verbs={{join .Verbs ";"}},resource={{.Resource}},packageName={{.Package}},packageAlias={{tolower .PackageAlias}},clientName={{.ClientName}},expand={{.Expand}}{{with .RateLimitKey}},rateLimitKey={{.}}{{end}}
75+
// +azure:client:verbs={{join .Verbs ";"}},resource={{.Resource}},packageName={{.Package}},packageAlias={{tolower .PackageAlias}},clientName={{.ClientName}},expand={{.Expand}}{{with .RateLimitKey}},rateLimitKey={{.}}{{end}}{{with .Etag}},etag={{.}}{{end}}
7576
type Interface interface {
7677
{{ $expandable := .Expand}}
7778
{{ $packageAlias := .PackageAlias}}
@@ -193,6 +194,8 @@ func main() {
193194
rootCmd.Flags().StringVar(&scaffoldOptions.SubResource, "subresource", "", "subresource name")
194195
rootCmd.Flags().StringVar(&scaffoldOptions.RateLimitKey, "ratelimitkey", "", "ratelimit config key")
195196
rootCmd.Flags().BoolVar(&scaffoldOptions.CrossSubFactory, "cross-sub-factory-support", false, "cross sub factory support")
197+
rootCmd.Flags().BoolVar(&scaffoldOptions.Etag, "etag", false, "support etag")
198+
196199
err := rootCmd.Execute()
197200
if err != nil {
198201
fmt.Printf("failed to generate interface %s\n", err.Error())

pkg/azclient/client-gen/generator/codegenerator.go

+1-8
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,7 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
126126
if err := factoryGenerator.Generate(ctx); err != nil {
127127
return err
128128
}
129-
130-
fmt.Println("Run go test ")
131-
132-
//nolint:gosec // G204 ignore this!
133-
cmd = exec.Command("go", "test", "./...", "--timeout=30m")
134-
cmd.Stdout = os.Stdout
135-
cmd.Stderr = os.Stderr
136-
return cmd.Run()
129+
return nil
137130
}
138131

139132
func (Generator) CheckFilter() loader.NodeFilter {

pkg/azclient/client-gen/generator/genclientfactory_action.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,8 @@ func (generator *ClientFactoryGenerator) Generate(_ *genall.GenerationContext) e
9696
}
9797
for _, v := range generator.clientRegistry {
9898
if v.ClientGenConfig.CrossSubFactory {
99-
importList["sync"] = map[string]struct{}{}
100-
importList["strings"] = map[string]struct{}{}
101-
break
99+
importList["sync"] = make(map[string]struct{})
100+
importList["strings"] = make(map[string]struct{})
102101
}
103102
}
104103

pkg/azclient/client-gen/generator/gencode_action.go

+4
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ func generateClient(ctx *genall.GenerationContext, root *loader.Package, _ strin
8888
if markerConf.OutOfSubscriptionScope && len(markerConf.Verbs) > 0 {
8989
importList["go.opentelemetry.io/otel/attribute"] = make(map[string]struct{})
9090
}
91+
if markerConf.Etag {
92+
importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"] = make(map[string]struct{})
93+
importList["sigs.k8s.io/cloud-provider-azure/pkg/azclient/policy/etag"] = make(map[string]struct{})
94+
}
9195
if err := WriteToFile(ctx, root, "zz_generated_client.go", headerText, importList, &outContent); err != nil {
9296
return err
9397
}

pkg/azclient/client-gen/generator/gentest_action.go

+3
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ func generateTestCase(ctx *genall.GenerationContext, root *loader.Package, _ str
106106

107107
importList["context"] = make(map[string]struct{})
108108
importList["github.com/onsi/ginkgo/v2"] = map[string]struct{}{}
109+
if markerConf.Etag {
110+
importList["github.com/Azure/azure-sdk-for-go/sdk/azcore/to"] = make(map[string]struct{})
111+
}
109112
return WriteToFile(ctx, root, root.Name+"_test.go", headerText, importList, &outContent)
110113
}
111114

pkg/azclient/client-gen/generator/template.go

+25-15
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type ClientGenConfig struct {
2929
Expand bool `marker:"expand,optional"`
3030
RateLimitKey string `marker:"rateLimitKey,optional"`
3131
CrossSubFactory bool `marker:"crossSubFactory,optional"`
32+
Etag bool `marker:"etag,optional"`
3233
}
3334

3435
var ClientTemplate = template.Must(template.New("object-scaffolding-client-struct").Parse(`
@@ -45,7 +46,9 @@ func New({{if not .OutOfSubscriptionScope}}subscriptionID string, {{end}}credent
4546
options = utils.GetDefaultOption()
4647
}
4748
tr := options.TracingProvider.NewTracer(utils.ModuleName, utils.ModuleVersion)
48-
49+
{{with .Etag}}
50+
options.ClientOptions.PerCallPolicies = append(options.ClientOptions.PerCallPolicies, utils.FuncPolicyWrapper(etag.AppendEtag))
51+
{{- end}}
4952
client, err := {{.PackageAlias}}.New{{.ClientName}}({{if not .OutOfSubscriptionScope}}subscriptionID,{{end}} credential, options)
5053
if err != nil {
5154
return nil, err
@@ -294,8 +297,8 @@ var _ = ginkgo.Describe("{{.ClientName}}",ginkgo.Ordered, func() {
294297
}
295298
296299
{{if $HasCreateOrUpdate}}
297-
ginkgo.When("creation requests are raised", func() {
298-
ginkgo.It("should not return error", func(ctx context.Context) {
300+
ginkgo.When("creation requests are raised", func() {
301+
ginkgo.It("should not return error", func(ctx context.Context) {
299302
newResource, err := realClient.CreateOrUpdate(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName, *newResource)
300303
gomega.Expect(err).NotTo(gomega.HaveOccurred())
301304
gomega.Expect(newResource).NotTo(gomega.BeNil())
@@ -304,51 +307,58 @@ ginkgo.It("should not return error", func(ctx context.Context) {
304307
})
305308
{{end -}}
306309
{{if $HasGet}}
307-
ginkgo.When("get requests are raised", func() {
308-
ginkgo.It("should not return error", func(ctx context.Context) {
310+
ginkgo.When("get requests are raised", func() {
311+
ginkgo.It("should not return error", func(ctx context.Context) {
309312
newResource, err := realClient.Get(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName{{if .Expand}}, nil{{end}})
310313
gomega.Expect(err).NotTo(gomega.HaveOccurred())
311314
gomega.Expect(newResource).NotTo(gomega.BeNil())
312315
})
313316
})
314-
ginkgo.When("invalid get requests are raised", func() {
315-
ginkgo.It("should return 404 error", func(ctx context.Context) {
317+
ginkgo.When("invalid get requests are raised", func() {
318+
ginkgo.It("should return 404 error", func(ctx context.Context) {
316319
newResource, err := realClient.Get(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName+"notfound"{{if .Expand}}, nil{{end}})
317320
gomega.Expect(err).To(gomega.HaveOccurred())
318321
gomega.Expect(newResource).To(gomega.BeNil())
319322
})
320323
})
321324
{{end -}}
322325
{{if $HasCreateOrUpdate}}
323-
ginkgo.When("update requests are raised", func() {
324-
ginkgo.It("should not return error", func(ctx context.Context) {
326+
ginkgo.When("update requests are raised", func() {
327+
ginkgo.It("should not return error", func(ctx context.Context) {
325328
newResource, err := realClient.CreateOrUpdate(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName, *newResource)
326329
gomega.Expect(err).NotTo(gomega.HaveOccurred())
327330
gomega.Expect(newResource).NotTo(gomega.BeNil())
328331
})
332+
{{if .Etag}}
333+
ginkgo.It("should return error", func(ctx context.Context) {
334+
newResource.Etag = to.Ptr("invalid")
335+
_, err := realClient.CreateOrUpdate(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName, *newResource)
336+
gomega.Expect(err).To(gomega.HaveOccurred())
337+
})
338+
{{end -}}
329339
})
330340
{{end -}}
331341
{{if or $HasListByRG $HasList}}
332-
ginkgo.When("list requests are raised", func() {
333-
ginkgo.It("should not return error", func(ctx context.Context) {
342+
ginkgo.When("list requests are raised", func() {
343+
ginkgo.It("should not return error", func(ctx context.Context) {
334344
resourceList, err := realClient.List(ctx, resourceGroupName,{{with .SubResource}}parentResourceName{{end}})
335345
gomega.Expect(err).NotTo(gomega.HaveOccurred())
336346
gomega.Expect(resourceList).NotTo(gomega.BeNil())
337347
gomega.Expect(len(resourceList)).To(gomega.Equal(1))
338348
gomega.Expect(*resourceList[0].Name).To(gomega.Equal(resourceName))
339349
})
340350
})
341-
ginkgo.When("invalid list requests are raised", func() {
342-
ginkgo.It("should return error", func(ctx context.Context) {
351+
ginkgo.When("invalid list requests are raised", func() {
352+
ginkgo.It("should return error", func(ctx context.Context) {
343353
resourceList, err := realClient.List(ctx, resourceGroupName+"notfound",{{with .SubResource}}parentResourceName{{end}})
344354
gomega.Expect(err).To(gomega.HaveOccurred())
345355
gomega.Expect(resourceList).To(gomega.BeNil())
346356
})
347357
})
348358
{{end -}}
349359
{{if $HasDelete}}
350-
ginkgo.When("deletion requests are raised", func() {
351-
ginkgo.It("should not return error", func(ctx context.Context) {
360+
ginkgo.When("deletion requests are raised", func() {
361+
ginkgo.It("should not return error", func(ctx context.Context) {
352362
err = realClient.Delete(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName)
353363
gomega.Expect(err).NotTo(gomega.HaveOccurred())
354364
})

pkg/azclient/loadbalancerclient/interface.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"sigs.k8s.io/cloud-provider-azure/pkg/azclient/utils"
2626
)
2727

28-
// +azure:client:verbs=get;createorupdate;delete;list,resource=LoadBalancer,packageName=github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6,packageAlias=armnetwork,clientName=LoadBalancersClient,expand=true,rateLimitKey=loadBalancerRateLimit
28+
// +azure:client:verbs=get;createorupdate;delete;list,resource=LoadBalancer,packageName=github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6,packageAlias=armnetwork,clientName=LoadBalancersClient,expand=true,rateLimitKey=loadBalancerRateLimit,etag=true
2929
type Interface interface {
3030
utils.GetWithExpandFunc[armnetwork.LoadBalancer]
3131
utils.CreateOrUpdateFunc[armnetwork.LoadBalancer]

pkg/azclient/loadbalancerclient/loadbalancerclient_test.go

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)