diff --git a/pkg/core/resources/manager/manager.go b/pkg/core/resources/manager/manager.go index 0670c0555027..34c1b84d56a1 100644 --- a/pkg/core/resources/manager/manager.go +++ b/pkg/core/resources/manager/manager.go @@ -49,10 +49,17 @@ func (r *resourcesManager) List(ctx context.Context, list model.ResourceList, fs } func (r *resourcesManager) Create(ctx context.Context, resource model.Resource, fs ...store.CreateOptionsFunc) error { + opts := store.NewCreateOptions(fs...) + + // Create temporary meta so validation can see the meta that the store will set + existingMeta := resource.GetMeta() + if existingMeta == nil { + resource.SetMeta(metaFromCreateOpts(resource.Descriptor(), *opts)) + } if err := model.Validate(resource); err != nil { return err } - opts := store.NewCreateOptions(fs...) + resource.SetMeta(existingMeta) var owner model.Resource if resource.Descriptor().Scope == model.ScopeMesh { diff --git a/pkg/core/resources/manager/meta.go b/pkg/core/resources/manager/meta.go new file mode 100644 index 000000000000..08b859305741 --- /dev/null +++ b/pkg/core/resources/manager/meta.go @@ -0,0 +1,63 @@ +package manager + +import ( + "time" + + "github.com/kumahq/kuma/pkg/core/resources/model" + core_model "github.com/kumahq/kuma/pkg/core/resources/model" + "github.com/kumahq/kuma/pkg/core/resources/store" +) + +type resourceMetaObject struct { + Name string + Version string + Mesh string + CreationTime time.Time + ModificationTime time.Time + Labels map[string]string +} + +var _ core_model.ResourceMeta = &resourceMetaObject{} + +func (r *resourceMetaObject) GetName() string { + return r.Name +} + +func (r *resourceMetaObject) GetNameExtensions() core_model.ResourceNameExtensions { + return core_model.ResourceNameExtensionsUnsupported +} + +func (r *resourceMetaObject) GetVersion() string { + return r.Version +} + +func (r *resourceMetaObject) GetMesh() string { + return r.Mesh +} + +func (r *resourceMetaObject) GetCreationTime() time.Time { + return r.CreationTime +} + +func (r *resourceMetaObject) GetModificationTime() time.Time { + return r.ModificationTime +} + +func (r *resourceMetaObject) GetLabels() map[string]string { + return r.Labels +} + +func metaFromCreateOpts(descriptor model.ResourceTypeDescriptor, fs store.CreateOptions) core_model.ResourceMeta { + if fs.Name == "" { + return nil + } + if fs.Mesh == "" && descriptor.Scope == model.ScopeMesh { + return nil + } + return &resourceMetaObject{ + Name: fs.Name, + Mesh: fs.Mesh, + CreationTime: fs.CreationTime, + Labels: fs.Labels, + } +}