diff --git a/apis/workload.cattle.io/v1/schema/mapper/init_container.go b/apis/workload.cattle.io/v1/schema/mapper/init_container.go index 650fa3d3..8dda9b11 100644 --- a/apis/workload.cattle.io/v1/schema/mapper/init_container.go +++ b/apis/workload.cattle.io/v1/schema/mapper/init_container.go @@ -19,14 +19,16 @@ func (e InitContainerMapper) FromInternal(data map[string]interface{}) { containers = append(containers, initContainer) } - data["containers"] = containers + if data != nil { + data["containers"] = containers + } } func (e InitContainerMapper) ToInternal(data map[string]interface{}) { newContainers := []interface{}{} newInitContainers := []interface{}{} - for _, container := range convert.ToMapSlice(data["container"]) { + for _, container := range convert.ToMapSlice(data["containers"]) { if convert.ToBool(container["initContainer"]) { newInitContainers = append(newInitContainers, container) } else { @@ -35,8 +37,10 @@ func (e InitContainerMapper) ToInternal(data map[string]interface{}) { delete(container, "initContainer") } - data["containers"] = newContainers - data["initContainers"] = newInitContainers + if data != nil { + data["containers"] = newContainers + data["initContainers"] = newInitContainers + } } func (e InitContainerMapper) ModifySchema(schema *types.Schema, schemas *types.Schemas) error { diff --git a/apis/workload.cattle.io/v1/schema/mapper/namespace.go b/apis/workload.cattle.io/v1/schema/mapper/namespace.go new file mode 100644 index 00000000..8911f322 --- /dev/null +++ b/apis/workload.cattle.io/v1/schema/mapper/namespace.go @@ -0,0 +1,39 @@ +package mapper + +import ( + "github.com/rancher/norman/types" + "github.com/rancher/norman/types/mapper" +) + +type NamespaceIDMapper struct { + Move *mapper.Move +} + +func (n *NamespaceIDMapper) FromInternal(data map[string]interface{}) { + if n.Move != nil { + n.Move.FromInternal(data) + } +} + +func (n *NamespaceIDMapper) ToInternal(data map[string]interface{}) { + if n.Move != nil { + n.Move.ToInternal(data) + } +} + +func (n *NamespaceIDMapper) ModifySchema(schema *types.Schema, schemas *types.Schemas) error { + field, ok := schema.ResourceFields["namespace"] + if !ok { + return nil + } + + field.Type = "reference[namespace]" + schema.ResourceFields["namespace"] = field + + n.Move = &mapper.Move{ + From: "namespace", + To: "namespaceId", + } + + return n.Move.ModifySchema(schema, schemas) +} diff --git a/apis/workload.cattle.io/v1/schema/mapper/workload.go b/apis/workload.cattle.io/v1/schema/mapper/workload.go index 92195755..231081ee 100644 --- a/apis/workload.cattle.io/v1/schema/mapper/workload.go +++ b/apis/workload.cattle.io/v1/schema/mapper/workload.go @@ -12,5 +12,6 @@ func NewWorkloadTypeMapper() types.Mapper { &m.Move{From: "metadata/labels", To: "labels", NoDeleteFromField: true}, &m.Move{From: "metadata/annotations", To: "annotations", NoDeleteFromField: true}, &m.Drop{Field: "metadata"}, + &NamespaceIDMapper{}, } } diff --git a/apis/workload.cattle.io/v1/schema/schema.go b/apis/workload.cattle.io/v1/schema/schema.go index a8be020b..e18a4d14 100644 --- a/apis/workload.cattle.io/v1/schema/schema.go +++ b/apis/workload.cattle.io/v1/schema/schema.go @@ -21,8 +21,9 @@ var ( } Schemas = factory.Schemas(&Version). - Init(podTypes). + // Namespace must be first Init(namespaceTypes). + Init(podTypes). Init(nodeTypes). Init(deploymentTypes). Init(statefulSetTypes). @@ -292,8 +293,15 @@ func podTypes(schemas *types.Schemas) *types.Schemas { AddMapperForType(&Version, v1.ResourceRequirements{}, mapper.PivotMapper{Plural: true}, ). - AddMapperForType(&Version, v1.Pod{}, mapper.Status{}). + AddMapperForType(&Version, v1.Pod{}, + mapper.Status{}, + &mapper.NamespaceIDMapper{}, + ). // Must import handlers before Container + MustImport(&Version, v1.Capabilities{}, struct { + Add []string `norman:"type=array[enum],options=AUDIT_CONTROL|AUDIT_WRITE|BLOCK_SUSPEND|CHOWN|DAC_OVERRIDE|DAC_READ_SEARCH|FOWNER|FSETID|IPC_LOCK|IPC_OWNER|KILL|LEASE|LINUX_IMMUTABLE|MAC_ADMIN|MAC_OVERRIDE|MKNOD|NET_ADMIN|NET_BIND_SERVICE|NET_BROADCAST|NET_RAW|SETFCAP|SETGID|SETPCAP|SETUID|SYSLOG|SYS_ADMIN|SYS_BOOT|SYS_CHROOT|SYS_MODULE|SYS_NICE|SYS_PACCT|SYS_PTRACE|SYS_RAWIO|SYS_RESOURCE|SYS_TIME|SYS_TTY_CONFIG|WAKE_ALARM"` + Drop []string `norman:"type=array[enum],options=AUDIT_CONTROL|AUDIT_WRITE|BLOCK_SUSPEND|CHOWN|DAC_OVERRIDE|DAC_READ_SEARCH|FOWNER|FSETID|IPC_LOCK|IPC_OWNER|KILL|LEASE|LINUX_IMMUTABLE|MAC_ADMIN|MAC_OVERRIDE|MKNOD|NET_ADMIN|NET_BIND_SERVICE|NET_BROADCAST|NET_RAW|SETFCAP|SETGID|SETPCAP|SETUID|SYSLOG|SYS_ADMIN|SYS_BOOT|SYS_CHROOT|SYS_MODULE|SYS_NICE|SYS_PACCT|SYS_PTRACE|SYS_RAWIO|SYS_RESOURCE|SYS_TIME|SYS_TTY_CONFIG|WAKE_ALARM"` + }{}). MustImport(&Version, v1.Handler{}, handlerOverride{}). MustImport(&Version, v1.Probe{}, handlerOverride{}). MustImport(&Version, v1.Container{}, struct { diff --git a/generator/generator.go b/generator/generator.go index 83d0e8f0..719231e8 100644 --- a/generator/generator.go +++ b/generator/generator.go @@ -1,8 +1,9 @@ package generator import ( + "fmt" "path" - + "reflect" "strings" "github.com/rancher/norman/generator" @@ -27,6 +28,27 @@ func Generate(schemas *types.Schemas) { } } +func GenerateNativeTypes(objs ...interface{}) { + pkgNamePaths := strings.Split(reflect.TypeOf(objs[0]).PkgPath(), "/") + version := pkgNamePaths[len(pkgNamePaths)-1] + group := pkgNamePaths[len(pkgNamePaths)-2] + groupPath := group + + if group == "core" { + group = "" + } + + k8sOutputPackage := path.Join(basePackage, baseK8s, groupPath, version) + + if err := generator.GenerateControllerForTypes(&types.APIVersion{ + Version: version, + Group: group, + Path: fmt.Sprintf("/k8s/%s-%s", groupPath, version), + }, k8sOutputPackage, objs...); err != nil { + panic(err) + } +} + func getVersion(schemas *types.Schemas) *types.APIVersion { var version types.APIVersion for _, schema := range schemas.Schemas() { diff --git a/main.go b/main.go index 63498f3c..bd98e178 100644 --- a/main.go +++ b/main.go @@ -8,10 +8,15 @@ import ( clusterSchema "github.com/rancher/types/apis/cluster.cattle.io/v1/schema" workloadSchema "github.com/rancher/types/apis/workload.cattle.io/v1/schema" "github.com/rancher/types/generator" + "k8s.io/api/apps/v1beta2" + "k8s.io/api/core/v1" ) func main() { generator.Generate(clusterSchema.Schemas) generator.Generate(workloadSchema.Schemas) generator.Generate(authzSchema.Schemas) + // Group by API group + generator.GenerateNativeTypes(v1.Pod{}) + generator.GenerateNativeTypes(v1beta2.Deployment{}) }