Как отформатировать способ генерации ресурсов провайдера с помощью 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),
    )
...
Другие вопросы по тегам