2017-11-11 04:44:02 +00:00
|
|
|
package types
|
|
|
|
|
|
|
|
import (
|
2017-11-28 21:28:25 +00:00
|
|
|
"fmt"
|
|
|
|
|
2017-12-29 22:09:30 +00:00
|
|
|
"github.com/rancher/norman/types/convert"
|
2017-11-11 04:44:02 +00:00
|
|
|
"github.com/rancher/norman/types/definition"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Mapper interface {
|
|
|
|
FromInternal(data map[string]interface{})
|
|
|
|
ToInternal(data map[string]interface{})
|
|
|
|
ModifySchema(schema *Schema, schemas *Schemas) error
|
|
|
|
}
|
|
|
|
|
2017-11-21 20:46:30 +00:00
|
|
|
type Mappers []Mapper
|
|
|
|
|
|
|
|
func (m Mappers) FromInternal(data map[string]interface{}) {
|
|
|
|
for _, mapper := range m {
|
|
|
|
mapper.FromInternal(data)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m Mappers) ToInternal(data map[string]interface{}) {
|
|
|
|
for i := len(m) - 1; i >= 0; i-- {
|
|
|
|
m[i].ToInternal(data)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m Mappers) ModifySchema(schema *Schema, schemas *Schemas) error {
|
|
|
|
for _, mapper := range m {
|
|
|
|
if err := mapper.ModifySchema(schema, schemas); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type typeMapper struct {
|
2017-11-11 04:44:02 +00:00
|
|
|
Mappers []Mapper
|
2017-12-23 06:15:02 +00:00
|
|
|
root bool
|
2017-11-11 04:44:02 +00:00
|
|
|
typeName string
|
|
|
|
subSchemas map[string]*Schema
|
|
|
|
subArraySchemas map[string]*Schema
|
|
|
|
}
|
|
|
|
|
2017-11-21 20:46:30 +00:00
|
|
|
func (t *typeMapper) FromInternal(data map[string]interface{}) {
|
2017-11-11 04:44:02 +00:00
|
|
|
for fieldName, schema := range t.subSchemas {
|
|
|
|
if schema.Mapper == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fieldData, _ := data[fieldName].(map[string]interface{})
|
|
|
|
schema.Mapper.FromInternal(fieldData)
|
|
|
|
}
|
|
|
|
|
|
|
|
for fieldName, schema := range t.subArraySchemas {
|
|
|
|
if schema.Mapper == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
datas, _ := data[fieldName].([]interface{})
|
|
|
|
for _, fieldData := range datas {
|
|
|
|
mapFieldData, _ := fieldData.(map[string]interface{})
|
|
|
|
schema.Mapper.FromInternal(mapFieldData)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-21 20:46:30 +00:00
|
|
|
Mappers(t.Mappers).FromInternal(data)
|
2017-11-11 04:44:02 +00:00
|
|
|
|
2017-12-23 06:15:02 +00:00
|
|
|
if _, ok := data["type"]; !ok && data != nil {
|
|
|
|
data["type"] = t.typeName
|
|
|
|
}
|
|
|
|
|
|
|
|
if data != nil && t.root {
|
2017-11-21 20:46:30 +00:00
|
|
|
name, _ := data["name"].(string)
|
2017-11-28 21:28:25 +00:00
|
|
|
namespace, _ := data["namespaceId"].(string)
|
2017-11-21 20:46:30 +00:00
|
|
|
|
2017-12-30 02:14:39 +00:00
|
|
|
if _, ok := data["id"]; ok {
|
|
|
|
if namespace != "" {
|
|
|
|
id, _ := data["id"].(string)
|
|
|
|
data["id"] = namespace + ":" + id
|
|
|
|
}
|
|
|
|
} else {
|
2017-11-21 20:46:30 +00:00
|
|
|
if name != "" {
|
|
|
|
if namespace == "" {
|
|
|
|
data["id"] = name
|
|
|
|
} else {
|
|
|
|
data["id"] = namespace + ":" + name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-11-11 04:44:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-21 20:46:30 +00:00
|
|
|
func (t *typeMapper) ToInternal(data map[string]interface{}) {
|
|
|
|
Mappers(t.Mappers).ToInternal(data)
|
2017-11-11 04:44:02 +00:00
|
|
|
|
|
|
|
for fieldName, schema := range t.subArraySchemas {
|
|
|
|
if schema.Mapper == nil {
|
|
|
|
continue
|
|
|
|
}
|
2017-12-29 22:09:30 +00:00
|
|
|
datas, _ := data[fieldName].([]interface{})
|
2017-11-11 04:44:02 +00:00
|
|
|
for _, fieldData := range datas {
|
2017-12-29 22:09:30 +00:00
|
|
|
schema.Mapper.ToInternal(convert.ToMapInterface(fieldData))
|
2017-11-11 04:44:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for fieldName, schema := range t.subSchemas {
|
|
|
|
if schema.Mapper == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fieldData, _ := data[fieldName].(map[string]interface{})
|
|
|
|
schema.Mapper.ToInternal(fieldData)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-21 20:46:30 +00:00
|
|
|
func (t *typeMapper) ModifySchema(schema *Schema, schemas *Schemas) error {
|
2017-11-11 04:44:02 +00:00
|
|
|
t.subSchemas = map[string]*Schema{}
|
|
|
|
t.subArraySchemas = map[string]*Schema{}
|
2017-11-28 21:28:25 +00:00
|
|
|
t.typeName = fmt.Sprintf("%s/schemas/%s", schema.Version.Path, schema.ID)
|
2017-11-11 04:44:02 +00:00
|
|
|
|
|
|
|
mapperSchema := schema
|
|
|
|
if schema.InternalSchema != nil {
|
|
|
|
mapperSchema = schema.InternalSchema
|
|
|
|
}
|
|
|
|
for name, field := range mapperSchema.ResourceFields {
|
|
|
|
fieldType := field.Type
|
|
|
|
targetMap := t.subSchemas
|
|
|
|
if definition.IsArrayType(fieldType) {
|
|
|
|
fieldType = definition.SubType(fieldType)
|
|
|
|
targetMap = t.subArraySchemas
|
|
|
|
}
|
|
|
|
|
|
|
|
schema := schemas.Schema(&schema.Version, fieldType)
|
|
|
|
if schema != nil {
|
|
|
|
targetMap[name] = schema
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-21 20:46:30 +00:00
|
|
|
return Mappers(t.Mappers).ModifySchema(schema, schemas)
|
2017-11-11 04:44:02 +00:00
|
|
|
}
|