Documentation ¶
Overview ¶
Package generator
Package generator ¶
Package generator ¶
Package generator ¶
Package generator
Index ¶
- Constants
- Variables
- func DumpToWriter(writer io.Writer, headerText string, importList map[string]map[string]struct{}, ...) error
- func WriteToFile(ctx *genall.GenerationContext, root *loader.Package, fileName string, ...) error
- type ClientEntryConfig
- type ClientFactoryGenerator
- type ClientGenConfig
- type Generator
- type ImportStatement
Constants ¶
View Source
const ( FuncCreateOrUpdate = "CreateOrUpdate" FuncGet = "Get" FuncDelete = "Delete" FuncListByRG = "ListByRG" FuncList = "List" )
Variables ¶
View Source
var AbstractClientFactoryImplTemplate = template.Must(template.New("object-factory-impl").Parse(
`
type ClientFactoryImpl struct {
armConfig *ARMClientConfig
facotryConfig *ClientFactoryConfig
cred azcore.TokenCredential
clientOptionsMutFn []func(option *arm.ClientOptions)
{{range $key, $client := . -}}
{{ if $client.CrossSubFactory -}}
{{ $key }} sync.Map
{{ else -}}
{{ $key }} {{.PkgAlias}}.{{.InterfaceTypeName}}
{{end -}}
{{end -}}
}
func NewClientFactory(config *ClientFactoryConfig, armConfig *ARMClientConfig, cred azcore.TokenCredential, clientOptionsMutFn ...func(option *arm.ClientOptions)) (ClientFactory,error) {
if config == nil {
config = &ClientFactoryConfig{}
}
if cred == nil {
cred = &azidentity.DefaultAzureCredential{}
}
var err error
factory := &ClientFactoryImpl{
armConfig: armConfig,
facotryConfig: config,
cred: cred,
clientOptionsMutFn: clientOptionsMutFn,
}
{{range $key, $client := . }}
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
//initialize {{.PkgAlias}}
{{ if $client.CrossSubFactory -}}
_, err = factory.Get{{$resource}}ClientForSub(config.SubscriptionID)
{{ else -}}
factory.{{$key}}, err = factory.create{{$resource}}Client(config.SubscriptionID)
{{ end -}}
if err != nil {
return nil, err
}
{{end -}}
return factory, nil
}
{{range $key, $client := . }}
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
func (factory *ClientFactoryImpl) create{{$resource}}Client(subscription string)({{.PkgAlias}}.{{.InterfaceTypeName}},error) {
//initialize {{.PkgAlias}}
options, err := GetDefaultResourceClientOption(factory.armConfig, factory.facotryConfig)
if err != nil {
return nil, err
}
{{with $client.RateLimitKey}}
//add ratelimit policy
ratelimitOption := factory.facotryConfig.GetRateLimitConfig("{{.}}")
rateLimitPolicy := ratelimit.NewRateLimitPolicy(ratelimitOption)
if rateLimitPolicy != nil {
options.ClientOptions.PerCallPolicies = append(options.ClientOptions.PerCallPolicies, rateLimitPolicy)
}
{{- end }}
for _, optionMutFn := range factory.clientOptionsMutFn {
if optionMutFn != nil {
optionMutFn(options)
}
}
return {{.PkgAlias}}.New(subscription, factory.cred, options)
}
{{ if $client.CrossSubFactory }}
func (factory *ClientFactoryImpl) Get{{$resource}}Client(){{.PkgAlias}}.{{.InterfaceTypeName}} {
clientImp,_:= factory.{{ $key }}.Load(strings.ToLower(factory.facotryConfig.SubscriptionID))
return clientImp.({{.PkgAlias}}.{{.InterfaceTypeName}})
}
func (factory *ClientFactoryImpl) Get{{$resource}}ClientForSub(subscriptionID string)({{.PkgAlias}}.{{.InterfaceTypeName}},error) {
if subscriptionID == "" {
subscriptionID = factory.facotryConfig.SubscriptionID
}
clientImp,loaded:= factory.{{ $key }}.Load(strings.ToLower(subscriptionID))
if loaded {
return clientImp.({{.PkgAlias}}.{{.InterfaceTypeName}}), nil
}
//It's not thread safe, but it's ok for now. because it will be called once.
clientImp, err := factory.create{{$resource}}Client(subscriptionID)
if err != nil {
return nil, err
}
factory.{{ $key }}.Store(strings.ToLower(subscriptionID), clientImp)
return clientImp.({{.PkgAlias}}.{{.InterfaceTypeName}}), nil
}
{{- else }}
func (factory *ClientFactoryImpl) Get{{$resource}}Client(){{.PkgAlias}}.{{.InterfaceTypeName}} {
return factory.{{ $key }}
}
{{ end }}
{{ end }}
`))
View Source
var AbstractClientFactoryInterfaceTemplate = template.Must(template.New("object-factory-impl").Parse(
`
type ClientFactory interface {
{{- range $key, $client := . }}
{{$resource := $client.Resource }}
{{- if (gt (len $client.SubResource) 0) }}
{{- $resource = $client.SubResource -}}
{{- end -}}
Get{{$resource}}Client(){{.PkgAlias}}.{{.InterfaceTypeName}}
{{- if .CrossSubFactory }}
Get{{$resource}}ClientForSub(subscriptionID string)({{.PkgAlias}}.{{.InterfaceTypeName}},error)
{{- end }}
{{- end }}
}
`))
View Source
var ClientFactoryTemplate = template.Must(template.New("object-scaffolding-factory").Parse(`
func New(subscriptionID string, credential azcore.TokenCredential, options *arm.ClientOptions) (Interface, error) {
if options == nil {
options = utils.GetDefaultOption()
}
tr := options.TracingProvider.NewTracer(utils.ModuleName, utils.ModuleVersion)
client, err := {{.PackageAlias}}.New{{.ClientName}}(subscriptionID, credential, options)
if err != nil {
return nil, err
}
return &Client{
{{.ClientName}}: client,
subscriptionID: subscriptionID,
tracer: tr,
}, nil
}
`))
View Source
var ClientTemplate = template.Must(template.New("object-scaffolding-client-struct").Parse(`
type Client struct{
*{{.PackageAlias}}.{{.ClientName}}
subscriptionID string
tracer tracing.Tracer
}
`))
View Source
var CreateOrUpdateFuncTemplate = template.Must(template.New("object-scaffolding-create-func").Parse(`
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
const CreateOrUpdateOperationName = "{{.ClientName}}.Create"
// CreateOrUpdate creates or updates a {{$resource}}.
func (client *Client) CreateOrUpdate(ctx context.Context, resourceGroupName string, resourceName string,{{with .SubResource}}parentResourceName string, {{end}} resource {{.PackageAlias}}.{{$resource}}) (result *{{.PackageAlias}}.{{$resource}},err error) {
ctx = utils.ContextWithClientName(ctx, "{{.ClientName}}")
ctx = utils.ContextWithRequestMethod(ctx, "CreateOrUpdate")
ctx = utils.ContextWithResourceGroupName(ctx, resourceGroupName)
ctx = utils.ContextWithSubscriptionID(ctx, client.subscriptionID)
ctx, endSpan := runtime.StartSpan(ctx, CreateOrUpdateOperationName, client.tracer, nil)
defer endSpan(err)
resp, err := utils.NewPollerWrapper(client.{{.ClientName}}.BeginCreateOrUpdate(ctx, resourceGroupName, resourceName,{{with .SubResource}}parentResourceName,{{end}} resource, nil)).WaitforPollerResp(ctx)
if err != nil {
return nil, err
}
if resp != nil {
return &resp.{{$resource}}, nil
}
return nil, nil
}
`))
View Source
var DeleteFuncTemplate = template.Must(template.New("object-scaffolding-delete-func").Parse(`
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
const DeleteOperationName = "{{.ClientName}}.Delete"
// Delete deletes a {{$resource}} by name.
func (client *Client) Delete(ctx context.Context, resourceGroupName string, {{with .SubResource}} parentResourceName string, {{end}}resourceName string) (err error) {
ctx = utils.ContextWithClientName(ctx, "{{.ClientName}}")
ctx = utils.ContextWithRequestMethod(ctx, "Delete")
ctx = utils.ContextWithResourceGroupName(ctx, resourceGroupName)
ctx = utils.ContextWithSubscriptionID(ctx, client.subscriptionID)
ctx, endSpan := runtime.StartSpan(ctx, DeleteOperationName, client.tracer, nil)
defer endSpan(err)
_, err = utils.NewPollerWrapper(client.BeginDelete(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName, nil)).WaitforPollerResp(ctx)
return err
}
`))
View Source
var FactoryTestCaseTemplate = template.Must(template.New("factory-test-case").Parse(
`
var _ = Describe("Factory", func() {
When("config is nil", func() {
{{- range $key, $client := . }}
{{$resource := $client.Resource }}
{{- if (gt (len $client.SubResource) 0) }}
{{- $resource = $client.SubResource -}}
{{- end -}}
It("should create factory instance without painc - {{$resource}}", func() {
factory, err := NewClientFactory(nil, nil, nil)
Expect(err).NotTo(HaveOccurred())
Expect(factory).NotTo(BeNil())
client := factory.Get{{$resource}}Client()
Expect(client).NotTo(BeNil())
})
{{- end }}
})
})
`))
View Source
var GetFuncTemplate = template.Must(template.New("object-scaffolding-get-func").Parse(`
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
const GetOperationName = "{{.ClientName}}.Get"
// Get gets the {{$resource}}
func (client *Client) Get(ctx context.Context, resourceGroupName string, {{with .SubResource}}parentResourceName string,{{end}} resourceName string{{if .Expand}}, expand *string{{end}}) (result *{{.PackageAlias}}.{{$resource}}, rerr error) {
{{ if .Expand}}var ops *{{.PackageAlias}}.{{.ClientName}}GetOptions
if expand != nil {
ops = &{{.PackageAlias}}.{{.ClientName}}GetOptions{ Expand: expand }
}{{- end}}
ctx = utils.ContextWithClientName(ctx, "{{.ClientName}}")
ctx = utils.ContextWithRequestMethod(ctx, "Get")
ctx = utils.ContextWithResourceGroupName(ctx, resourceGroupName)
ctx = utils.ContextWithSubscriptionID(ctx, client.subscriptionID)
ctx, endSpan := runtime.StartSpan(ctx, GetOperationName, client.tracer, nil)
defer endSpan(rerr)
resp, err := client.{{.ClientName}}.Get(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName,{{if .Expand}}ops{{else}}nil{{end}} )
if err != nil {
return nil, err
}
//handle statuscode
return &resp.{{$resource}}, nil
}
`))
View Source
var ImportTemplate = template.Must(template.New("import").Parse(
`
import (
{{ range $package, $Entry := . }}
{{- range $alias, $flag := $Entry}}{{$alias}} {{end}}"{{$package}}"
{{ end -}}
)
`))
View Source
var ListByRGFuncTemplate = template.Must(template.New("object-scaffolding-list-func").Parse(`
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
const ListOperationName = "{{.ClientName}}.List"
// List gets a list of {{$resource}} in the resource group.
func (client *Client) List(ctx context.Context, resourceGroupName string{{with .SubResource}}, parentResourceName string{{end}}) (result []*{{.PackageAlias}}.{{$resource}}, rerr error) {
ctx = utils.ContextWithClientName(ctx, "{{.ClientName}}")
ctx = utils.ContextWithRequestMethod(ctx, "List")
ctx = utils.ContextWithResourceGroupName(ctx, resourceGroupName)
ctx = utils.ContextWithSubscriptionID(ctx, client.subscriptionID)
ctx, endSpan := runtime.StartSpan(ctx, ListOperationName, client.tracer, nil)
defer endSpan(rerr)
pager := client.{{.ClientName}}.NewListByResourceGroupPager(resourceGroupName, nil)
for pager.More() {
nextResult, err := pager.NextPage(ctx)
if err != nil {
return nil, err
}
result = append(result, nextResult.Value...)
}
return result, nil
}
`))
View Source
var ListFuncTemplate = template.Must(template.New("object-scaffolding-list-func").Parse(`
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
const ListOperationName = "{{.ClientName}}.List"
// List gets a list of {{$resource}} in the resource group.
func (client *Client) List(ctx context.Context, resourceGroupName string{{with .SubResource}}, parentResourceName string{{end}}) (result []*{{.PackageAlias}}.{{$resource}}, rerr error) {
ctx = utils.ContextWithClientName(ctx, "{{.ClientName}}")
ctx = utils.ContextWithRequestMethod(ctx, "List")
ctx = utils.ContextWithResourceGroupName(ctx, resourceGroupName)
ctx = utils.ContextWithSubscriptionID(ctx, client.subscriptionID)
ctx, endSpan := runtime.StartSpan(ctx, ListOperationName, client.tracer, nil)
defer endSpan(rerr)
pager := client.{{.ClientName}}.NewListPager(resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} nil)
for pager.More() {
nextResult, err := pager.NextPage(ctx)
if err != nil {
return nil, err
}
result = append(result, nextResult.Value...)
}
return result, nil
}
`))
View Source
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) {
}
}
`))
View Source
var TestCaseTemplate = template.Must(template.New("object-scaffolding-test-case").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 -}}
var beforeAllFunc func(context.Context)
var afterAllFunc func(context.Context)
var additionalTestCases func()
{{if or $HasCreateOrUpdate}}var newResource *{{.PackageAlias}}.{{$resource}} = &{{.PackageAlias}}.{{$resource}}{} {{- end }}
var _ = Describe("{{.ClientName}}", Ordered, func() {
if beforeAllFunc != nil {
BeforeAll(beforeAllFunc)
}
if additionalTestCases != nil {
additionalTestCases()
}
{{if $HasCreateOrUpdate}}
When("creation requests are raised", func() {
It("should not return error", func(ctx context.Context) {
newResource, err := realClient.CreateOrUpdate(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName, *newResource)
Expect(err).NotTo(HaveOccurred())
Expect(newResource).NotTo(BeNil())
Expect(strings.EqualFold(*newResource.Name,resourceName)).To(BeTrue())
})
})
{{end -}}
{{if $HasGet}}
When("get requests are raised", func() {
It("should not return error", func(ctx context.Context) {
newResource, err := realClient.Get(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName{{if .Expand}}, nil{{end}})
Expect(err).NotTo(HaveOccurred())
Expect(newResource).NotTo(BeNil())
})
})
When("invalid get requests are raised", func() {
It("should return 404 error", func(ctx context.Context) {
newResource, err := realClient.Get(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName+"notfound"{{if .Expand}}, nil{{end}})
Expect(err).To(HaveOccurred())
Expect(newResource).To(BeNil())
})
})
{{end -}}
{{if $HasCreateOrUpdate}}
When("update requests are raised", func() {
It("should not return error", func(ctx context.Context) {
newResource, err := realClient.CreateOrUpdate(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName, *newResource)
Expect(err).NotTo(HaveOccurred())
Expect(newResource).NotTo(BeNil())
})
})
{{end -}}
{{if or $HasListByRG $HasList}}
When("list requests are raised", func() {
It("should not return error", func(ctx context.Context) {
resourceList, err := realClient.List(ctx, resourceGroupName,{{with .SubResource}}parentResourceName{{end}})
Expect(err).NotTo(HaveOccurred())
Expect(resourceList).NotTo(BeNil())
Expect(len(resourceList)).To(Equal(1))
Expect(*resourceList[0].Name).To(Equal(resourceName))
})
})
When("invalid list requests are raised", func() {
It("should return error", func(ctx context.Context) {
resourceList, err := realClient.List(ctx, resourceGroupName+"notfound",{{with .SubResource}}parentResourceName{{end}})
Expect(err).To(HaveOccurred())
Expect(resourceList).To(BeNil())
})
})
{{end -}}
{{if $HasDelete}}
When("deletion requests are raised", func() {
It("should not return error", func(ctx context.Context) {
err = realClient.Delete(ctx, resourceGroupName,{{with .SubResource}}parentResourceName,{{end}} resourceName)
Expect(err).NotTo(HaveOccurred())
})
})
{{end -}}
if afterAllFunc != nil {
AfterAll(afterAllFunc)
}
})
`))
View Source
var TestSuiteTemplate = template.Must(template.New("object-scaffolding-test-suite").Parse(
`
{{- $resource := .Resource}}
{{- if (gt (len .SubResource) 0) }}
{{- $resource = .SubResource}}
{{- end }}
func TestClient(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Client Suite")
}
var resourceGroupName = "aks-cit-{{$resource}}"
var resourceName = "testResource"
{{if .SubResource}}var parentResourceName = "testParentResource"{{- end }}
var subscriptionID string
var location = "eastus"
var resourceGroupClient *armresources.ResourceGroupsClient
var err error
var recorder *recording.Recorder
var realClient Interface
var _ = BeforeSuite(func(ctx context.Context) {
recorder, err = recording.NewRecorder("testdata/{{$resource}}")
Expect(err).ToNot(HaveOccurred())
subscriptionID = recorder.SubscriptionID()
Expect(err).NotTo(HaveOccurred())
cred := recorder.TokenCredential()
resourceGroupClient, err = armresources.NewResourceGroupsClient(subscriptionID, cred, &arm.ClientOptions{
ClientOptions: azcore.ClientOptions{
Transport: recorder.HTTPClient(),
TracingProvider: utils.TracingProvider,
},
})
Expect(err).NotTo(HaveOccurred())
realClient, err = New(subscriptionID, recorder.TokenCredential(), &arm.ClientOptions{
ClientOptions: azcore.ClientOptions{
Transport: recorder.HTTPClient(),
},
})
Expect(err).NotTo(HaveOccurred())
_, err = resourceGroupClient.CreateOrUpdate(
ctx,
resourceGroupName,
armresources.ResourceGroup{
Location: to.Ptr(location),
},
nil)
Expect(err).NotTo(HaveOccurred())
})
var _ = AfterSuite(func(ctx context.Context) {
_, err := resourceGroupClient.BeginDelete(ctx, resourceGroupName, nil)
Expect(err).NotTo(HaveOccurred())
err = recorder.Stop()
Expect(err).ToNot(HaveOccurred())
})
`))
Functions ¶
func DumpToWriter ¶
Types ¶
type ClientEntryConfig ¶
type ClientEntryConfig struct { ClientGenConfig PkgAlias string PkgPath string InterfaceTypeName string }
type ClientFactoryGenerator ¶
type ClientFactoryGenerator struct {
// contains filtered or unexported fields
}
func NewGenerator ¶
func NewGenerator(headerText string) *ClientFactoryGenerator
func (*ClientFactoryGenerator) Generate ¶
func (generator *ClientFactoryGenerator) Generate(_ *genall.GenerationContext) error
func (*ClientFactoryGenerator) RegisterClient ¶
func (generator *ClientFactoryGenerator) RegisterClient(_ *genall.GenerationContext, root *loader.Package, typeName string, markerConf ClientGenConfig, _ string) error
type ClientGenConfig ¶
type ClientGenConfig struct { Verbs []string `marker:",optional"` Resource string SubResource string `marker:"subResource,optional"` PackageName string PackageAlias string ClientName string Expand bool `marker:"expand,optional"` RateLimitKey string `marker:"rateLimitKey,optional"` CrossSubFactory bool `marker:"crossSubFactory,optional"` }
type Generator ¶
type Generator struct { // HeaderFile specifies the header text (e.g. license) to prepend to generated files. HeaderFile string `marker:",optional"` }
+controllertools:marker:generateHelp Generator generates client code for azure services.
func (Generator) CheckFilter ¶
func (Generator) CheckFilter() loader.NodeFilter
type ImportStatement ¶
Click to show internal directories.
Click to hide internal directories.