diff --git a/vendor.conf b/vendor.conf index bb50091b..5e5e37fb 100644 --- a/vendor.conf +++ b/vendor.conf @@ -3,5 +3,5 @@ github.com/rancher/types k8s.io/kubernetes v1.8.3 transitive=true,staging=true bitbucket.org/ww/goautoneg a547fc61f48d567d5b4ec6f8aee5573d8efce11d https://github.com/rancher/goautoneg.git -github.com/rancher/norman e656484b264ad1d6d4c4b1f1bd5112f9eb0def0b +github.com/rancher/norman 8c0d4bfe2e63a801e4e21906d6b37a5173dadcbb golang.org/x/sync fd80eb99c8f653c847d294a001bdf2a3a6f768f5 diff --git a/vendor/github.com/rancher/norman/generator/lifecycle_template.go b/vendor/github.com/rancher/norman/generator/lifecycle_template.go index 6a8ded31..67a76c5f 100644 --- a/vendor/github.com/rancher/norman/generator/lifecycle_template.go +++ b/vendor/github.com/rancher/norman/generator/lifecycle_template.go @@ -9,25 +9,37 @@ import ( ) type {{.schema.CodeName}}Lifecycle interface { - Create(obj *{{.prefix}}{{.schema.CodeName}}) error - Remove(obj *{{.prefix}}{{.schema.CodeName}}) error - Updated(obj *{{.prefix}}{{.schema.CodeName}}) error + Create(obj *{{.prefix}}{{.schema.CodeName}}) (*{{.prefix}}{{.schema.CodeName}}, error) + Remove(obj *{{.prefix}}{{.schema.CodeName}}) (*{{.prefix}}{{.schema.CodeName}}, error) + Updated(obj *{{.prefix}}{{.schema.CodeName}}) (*{{.prefix}}{{.schema.CodeName}}, error) } type {{.schema.ID}}LifecycleAdapter struct { lifecycle {{.schema.CodeName}}Lifecycle } -func (w *{{.schema.ID}}LifecycleAdapter) Create(obj runtime.Object) error { - return w.lifecycle.Create(obj.(*{{.prefix}}{{.schema.CodeName}})) +func (w *{{.schema.ID}}LifecycleAdapter) Create(obj runtime.Object) (runtime.Object, error) { + o, err := w.lifecycle.Create(obj.(*{{.prefix}}{{.schema.CodeName}})) + if o == nil { + return nil, err + } + return o, err } -func (w *{{.schema.ID}}LifecycleAdapter) Finalize(obj runtime.Object) error { - return w.lifecycle.Remove(obj.(*{{.prefix}}{{.schema.CodeName}})) +func (w *{{.schema.ID}}LifecycleAdapter) Finalize(obj runtime.Object) (runtime.Object, error) { + o, err := w.lifecycle.Remove(obj.(*{{.prefix}}{{.schema.CodeName}})) + if o == nil { + return nil, err + } + return o, err } -func (w *{{.schema.ID}}LifecycleAdapter) Updated(obj runtime.Object) error { - return w.lifecycle.Updated(obj.(*{{.prefix}}{{.schema.CodeName}})) +func (w *{{.schema.ID}}LifecycleAdapter) Updated(obj runtime.Object) (runtime.Object, error) { + o, err := w.lifecycle.Updated(obj.(*{{.prefix}}{{.schema.CodeName}})) + if o == nil { + return nil, err + } + return o, err } func New{{.schema.CodeName}}LifecycleAdapter(name string, client {{.schema.CodeName}}Interface, l {{.schema.CodeName}}Lifecycle) {{.schema.CodeName}}HandlerFunc { diff --git a/vendor/github.com/rancher/norman/lifecycle/object.go b/vendor/github.com/rancher/norman/lifecycle/object.go index d7d0791e..6302d9ca 100644 --- a/vendor/github.com/rancher/norman/lifecycle/object.go +++ b/vendor/github.com/rancher/norman/lifecycle/object.go @@ -13,9 +13,9 @@ var ( ) type ObjectLifecycle interface { - Create(obj runtime.Object) error - Finalize(obj runtime.Object) error - Updated(obj runtime.Object) error + Create(obj runtime.Object) (runtime.Object, error) + Finalize(obj runtime.Object) (runtime.Object, error) + Updated(obj runtime.Object) (runtime.Object, error) } type objectLifecycleAdapter struct { @@ -51,7 +51,14 @@ func (o *objectLifecycleAdapter) sync(key string, obj runtime.Object) error { return err } - return o.lifecycle.Updated(obj.DeepCopyObject()) + if newObj, err := o.lifecycle.Updated(obj); err != nil { + return err + } else if newObj != nil { + _, err = o.objectClient.Update(metadata.GetName(), newObj) + return err + } + + return nil } func (o *objectLifecycleAdapter) finalize(metadata metav1.Object, obj runtime.Object) (bool, error) { @@ -79,11 +86,14 @@ func (o *objectLifecycleAdapter) finalize(metadata metav1.Object, obj runtime.Ob } metadata.SetFinalizers(finalizers) - if err := o.lifecycle.Finalize(obj); err != nil { + if newObj, err := o.lifecycle.Finalize(obj); err != nil { return false, err + } else if newObj != nil { + _, err = o.objectClient.Update(metadata.GetName(), newObj) + } else { + _, err = o.objectClient.Update(metadata.GetName(), obj) } - _, err = o.objectClient.Update(metadata.GetName(), obj) return false, err } @@ -110,7 +120,10 @@ func (o *objectLifecycleAdapter) create(metadata metav1.Object, obj runtime.Obje metadata.SetFinalizers(append(metadata.GetFinalizers(), o.name)) metadata.GetLabels()[initialized] = "true" - if err := o.lifecycle.Create(obj); err != nil { + if newObj, err := o.lifecycle.Create(obj); err != nil { + return false, err + } else if newObj != nil { + _, err = o.objectClient.Update(metadata.GetName(), newObj) return false, err } diff --git a/vendor/github.com/rancher/norman/types/schemas.go b/vendor/github.com/rancher/norman/types/schemas.go index f0b4509e..9457b50b 100644 --- a/vendor/github.com/rancher/norman/types/schemas.go +++ b/vendor/github.com/rancher/norman/types/schemas.go @@ -7,6 +7,7 @@ import ( "github.com/rancher/norman/name" "github.com/rancher/norman/types/convert" + "github.com/rancher/norman/types/definition" ) type SchemaCollection struct { @@ -17,10 +18,16 @@ type SchemaInitFunc func(*Schemas) *Schemas type MappersFactory func() []Mapper +type BackReference struct { + FieldName string + Schema *Schema +} + type Schemas struct { schemasByPath map[string]map[string]*Schema schemasBySubContext map[string]*Schema mappers map[string]map[string][]Mapper + references map[string][]BackReference DefaultMappers MappersFactory DefaultPostMappers MappersFactory versions []APIVersion @@ -33,6 +40,7 @@ func NewSchemas() *Schemas { schemasByPath: map[string]map[string]*Schema{}, schemasBySubContext: map[string]*Schema{}, mappers: map[string]map[string][]Mapper{}, + references: map[string][]BackReference{}, } } @@ -92,6 +100,22 @@ func (s *Schemas) AddSchema(schema Schema) *Schemas { if _, ok := schemas[schema.ID]; !ok { schemas[schema.ID] = &schema s.schemas = append(s.schemas, &schema) + + for name, field := range schema.ResourceFields { + if !definition.IsReferenceType(field.Type) { + continue + } + + refType := definition.SubType(field.Type) + if !strings.HasPrefix(refType, "/") { + refType = convert.ToFullReference(schema.Version.Path, refType) + } + + s.references[refType] = append(s.references[refType], BackReference{ + FieldName: name, + Schema: &schema, + }) + } } if schema.SubContext != "" { @@ -101,6 +125,11 @@ func (s *Schemas) AddSchema(schema Schema) *Schemas { return s } +func (s *Schemas) References(schema *Schema) []BackReference { + refType := convert.ToFullReference(schema.Version.Path, schema.ID) + return s.references[refType] +} + func (s *Schemas) AddMapper(version *APIVersion, schemaID string, mapper Mapper) *Schemas { mappers, ok := s.mappers[version.Path] if !ok { diff --git a/vendor/github.com/rancher/norman/types/server_types.go b/vendor/github.com/rancher/norman/types/server_types.go index 4d4c3870..d8c2aa9b 100644 --- a/vendor/github.com/rancher/norman/types/server_types.go +++ b/vendor/github.com/rancher/norman/types/server_types.go @@ -147,6 +147,7 @@ type URLBuilder interface { ReverseSort(order SortOrder) string Sort(field string) string SetSubContext(subContext string) + FilterLink(schema *Schema, fieldName string, value string) string } type Store interface {