Как отформатировать способ генерации ресурсов провайдера с помощью Crossplane?
Я хочу создать поставщика перекрестных плоскостей для своей организации, однако у меня возникают проблемы с генерацией кода.
Есть ли способ управлять тем, как генерируются имена ресурсов? Инструменты генерации кода Upjet, похоже, не учитывают формат именования определенных ресурсов.
например:
У нас есть ресурс терраформирования с этим форматом.provider_load_balancer
после добавления ресурса и запускаmake generate
ресурс генерируется. Однако генерируется следующее.
├── apis
│ ├── generate.go
│ ├── load
│ │ └── v1alpha1
│ │ ├── zz_balancer_types.go
│ │ ├── zz_generated.deepcopy.go
│ │ ├── zz_generated.managed.go
│ │ ├── zz_generated.managedlist.go
│ │ ├── zz_generated_terraformed.go
│ │ └── zz_groupversion_info.go
├── examples-generated
│ ├── load
│ │ └── balancer.yaml
CRDS, yamls и файловая структура генерируются неправильно. В идеале каталоги и CRDS не должны разделять имя ресурса, а представлять их как одну строку.
Ниже мы видим, что даже методы глубокого копирования генерируются с неправильным именем. Это должно бытьloadbalancer
нетbalancer
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Balancer) DeepCopyInto(out *Balancer) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
in.Spec.DeepCopyInto(&out.Spec)
in.Status.DeepCopyInto(&out.Status)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Balancer.
func (in *Balancer) DeepCopy() *Balancer {
if in == nil {
return nil
}
out := new(Balancer)
in.DeepCopyInto(out)
return out
}
Есть идеи, что я могу здесь сделать?
1 ответ
Вы можете настроить группу для отдельного сгенерированного ресурса, добавивResourceConfigurator
для этого. Об этом кратко упоминается в примере провайдера GitHub в документации upjet .
cat <<EOF > config/repository/config.go
package repository
import "github.com/upbound/upjet/pkg/config"
// Configure configures individual resources by adding custom ResourceConfigurators.
func Configure(p *config.Provider) {
p.AddResourceConfigurator("github_repository", func(r *config.Resource) {
// We need to override the default group that upjet generated for
// this resource, which would be "github"
r.ShortGroup = "repository"
})
}
EOF
Более значимый пример настройки можно найти в поставщике-aws, который использует пользовательскую функцию сопоставления и обрезки для сопоставления определенных имен ресурсов terraform с определенными группами и типами.
// GroupKindOverrides overrides the group and kind of the resource if it matches
// any entry in the GroupMap.
func GroupKindOverrides() config.ResourceOption {
return func(r *config.Resource) {
if f, ok := GroupMap[r.Name]; ok {
r.ShortGroup, r.Kind = f(r.Name)
}
}
}
// KindOverrides overrides the kind of the resources given in KindMap.
func KindOverrides() config.ResourceOption {
return func(r *config.Resource) {
if k, ok := KindMap[r.Name]; ok {
r.Kind = k
}
}
}
Затем он добавляется в config/provider.go для настройки поведения генератора.
// GetProvider returns provider configuration
func GetProvider() *config.Provider {
modulePath := "github.com/upbound/provider-aws"
pc := config.NewProvider([]byte(providerSchema), "aws",
modulePath, providerMetadata,
config.WithShortName("aws"),
config.WithRootGroup("aws.upbound.io"),
...
config.WithDefaultResourceOptions(
GroupKindOverrides(),
KindOverrides(),
...
),
config.WithMainTemplate(hack.MainTemplate),
)
...