add Provider interface generation

Signed-off-by: Muvaffak Onus <onus.muvaffak@gmail.com>
This commit is contained in:
Muvaffak Onus 2019-12-19 16:45:40 +03:00
parent 61fa1eff2a
commit 212d1ec090
No known key found for this signature in database
GPG Key ID: 86E282DC72236827
5 changed files with 73 additions and 6 deletions

Binary file not shown.

View File

@ -57,12 +57,13 @@ func main() {
var (
app = kingpin.New(filepath.Base(os.Args[0]), "Generates Crossplane API type methods.").DefaultEnvars()
methodsets = app.Command("generate-methodsets", "Generate a Crossplane method sets.")
headerFile = methodsets.Flag("header-file", "The contents of this file will be added to the top of all generated files.").ExistingFile()
filenameManaged = methodsets.Flag("filename-managed", "The filename of generated managed resource files.").Default("zz_generated.managed.go").String()
filenameClaim = methodsets.Flag("filename-claim", "The filename of generated resource claim files.").Default("zz_generated.claim.go").String()
filenameClass = methodsets.Flag("filename-class", "The filename of generated resource class files.").Default("zz_generated.class.go").String()
pattern = methodsets.Arg("packages", "Package(s) for which to generate methods, for example github.com/crossplaneio/crossplane/apis/...").String()
methodsets = app.Command("generate-methodsets", "Generate a Crossplane method sets.")
headerFile = methodsets.Flag("header-file", "The contents of this file will be added to the top of all generated files.").ExistingFile()
filenameManaged = methodsets.Flag("filename-managed", "The filename of generated managed resource files.").Default("zz_generated.managed.go").String()
filenameClaim = methodsets.Flag("filename-claim", "The filename of generated resource claim files.").Default("zz_generated.claim.go").String()
filenameClass = methodsets.Flag("filename-class", "The filename of generated resource class files.").Default("zz_generated.class.go").String()
filenameProvider = methodsets.Flag("filename-provider", "The filename of generated provider files.").Default("zz_generated.provider.go").String()
pattern = methodsets.Arg("packages", "Package(s) for which to generate methods, for example github.com/crossplaneio/crossplane/apis/...").String()
)
kingpin.MustParse(app.Parse(os.Args[1:]))
@ -83,6 +84,7 @@ func main() {
kingpin.FatalIfError(GenerateManaged(*filenameManaged, header, p), "cannot write managed resource method set for package %s", p.PkgPath)
kingpin.FatalIfError(GenerateClaim(*filenameClaim, header, p), "cannot write resource claim method set for package %s", p.PkgPath)
kingpin.FatalIfError(GenerateClass(*filenameClass, header, p), "cannot write resource class method set for package %s", p.PkgPath)
kingpin.FatalIfError(GenerateProvider(*filenameProvider, header, p), "cannot write provider method set for package %s", p.PkgPath)
}
}
@ -175,3 +177,24 @@ func GenerateClass(filename, header string, p *packages.Package) error {
return errors.Wrap(err, "cannot write resource class methods")
}
// GenerateProvider generates the resource.Provider method set.
func GenerateProvider(filename, header string, p *packages.Package) error {
receiver := "p"
methods := method.Set{
"SetCredentialsSecretReference": method.NewSetCredentialsSecretReference(receiver, RuntimeImport),
"GetCredentialsSecretReference": method.NewGetCredentialsSecretReference(receiver, RuntimeImport),
}
err := generate.WriteMethods(p, methods, filepath.Join(filepath.Dir(p.GoFiles[0]), filename),
generate.WithHeaders(header),
generate.WithImportAliases(map[string]string{RuntimeImport: RuntimeAlias}),
generate.WithMatcher(match.AllOf(
match.Provider(),
match.DoesNotHaveMarker(comments.In(p), DisableMarker, "false")),
),
)
return errors.Wrap(err, "cannot write provider methods")
}

View File

@ -34,6 +34,7 @@ const (
NameResourceStatus = "ResourceStatus"
NameResourceClaimSpec = "ResourceClaimSpec"
NameClassSpecTemplate = "ClassSpecTemplate"
NameProviderSpec = "ProviderSpec"
NameItems = "Items"
)
@ -50,6 +51,7 @@ const (
TypeSuffixResourceClaimSpec = "github.com/crossplaneio/crossplane-runtime/apis/core/v1alpha1.ResourceClaimSpec"
TypeSuffixResourceClaimStatus = "github.com/crossplaneio/crossplane-runtime/apis/core/v1alpha1.ResourceClaimStatus"
TypeSuffixClassSpecTemplate = "github.com/crossplaneio/crossplane-runtime/apis/core/v1alpha1.ClassSpecTemplate"
TypeSuffixProviderSpec = "github.com/crossplaneio/crossplane-runtime/apis/core/v1alpha1.ProviderSpec"
)
func matches(s *types.Struct, m Matcher) bool {
@ -203,6 +205,12 @@ func IsClassSpecTemplate() Matcher {
return IsTypeNamed(TypeSuffixClassSpecTemplate, NameClassSpecTemplate)
}
// IsProviderSpec returns a Matcher that returns true if the supplied field
// appears to be a Crossplane provider spec.
func IsProviderSpec() Matcher {
return IsTypeNamed(TypeSuffixProviderSpec, NameProviderSpec)
}
// IsItems returns a Matcher that returns true if the supplied field appears to
// be the Items of a Kubernetes list.
func IsItems() Matcher {

View File

@ -74,6 +74,20 @@ func Claim() Object {
}
}
// Provider returns an Object matcher that returns true if the supplied Object is a
// Crossplane Provider.
func Provider() Object {
return func(o types.Object) bool {
return fields.Has(o,
fields.IsTypeMeta().And(fields.IsEmbedded()),
fields.IsObjectMeta().And(fields.IsEmbedded()),
fields.IsSpec().And(fields.HasFieldThat(
fields.IsProviderSpec().And(fields.IsEmbedded()),
)),
)
}
}
// HasMarker returns an Object matcher that returns true if the supplied Object
// has a comment marker k with the value v. Comment markers are read from the
// supplied Comments.

View File

@ -279,3 +279,25 @@ func NewGetReclaimPolicy(receiver, runtime, field string) New {
)
}
}
// NewGetCredentialsSecretReference returns a NewMethod that writes a
// GetCredentialsSecretReference method for the supplied Object to the supplied file.
func NewGetCredentialsSecretReference(receiver, runtime string) New {
return func(f *jen.File, o types.Object) {
f.Commentf("GetCredentialsSecretReference of this %s.", o.Name())
f.Func().Params(jen.Id(receiver).Op("*").Id(o.Name())).Id("GetCredentialsSecretReference").Params().Qual(runtime, "SecretKeySelector").Block(
jen.Return(jen.Id(receiver).Dot(fields.NameSpec).Dot("CredentialsSecretRef")),
)
}
}
// NewSetCredentialsSecretReference returns a NewMethod that writes a
// SetCredentialsSecretReference method for the supplied Object to the supplied file.
func NewSetCredentialsSecretReference(receiver, runtime string) New {
return func(f *jen.File, o types.Object) {
f.Commentf("SetCredentialsSecretReference of this %s.", o.Name())
f.Func().Params(jen.Id(receiver).Op("*").Id(o.Name())).Id("SetCredentialsSecretReference").Params(jen.Id("r").Qual(runtime, "SecretKeySelector")).Block(
jen.Id(receiver).Dot(fields.NameSpec).Dot("CredentialsSecretRef").Op("=").Id("r"),
)
}
}