1
0
mirror of https://github.com/rancher/types.git synced 2025-09-01 05:09:10 +00:00

API Updates

This commit is contained in:
Darren Shepherd
2017-12-04 16:42:18 -07:00
parent 6106f4926c
commit 68600ed35d
17 changed files with 629 additions and 590 deletions

View File

@@ -0,0 +1,298 @@
package schema
import (
"github.com/rancher/norman/types"
m "github.com/rancher/norman/types/mapper"
"github.com/rancher/types/apis/project.cattle.io/v3"
"github.com/rancher/types/factory"
"github.com/rancher/types/mapper"
"k8s.io/api/core/v1"
"k8s.io/kubernetes/staging/src/k8s.io/api/apps/v1beta2"
)
var (
Version = types.APIVersion{
Version: "v3",
Group: "project.cattle.io",
Path: "/v3/projects",
SubContexts: map[string]bool{
"projects": true,
},
}
Schemas = factory.Schemas(&Version).
// Namespace must be first
Init(namespaceTypes).
Init(podTypes).
Init(deploymentTypes).
Init(statefulSetTypes).
Init(replicaSet).
Init(replicationController).
Init(daemonSet).
Init(workloadTypes)
)
func namespaceTypes(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v1.NamespaceStatus{},
&m.Drop{Field: "phase"},
).
AddMapperForType(&Version, v1.NamespaceSpec{},
&m.Drop{Field: "finalizers"},
).
AddMapperForType(&Version, v1.Namespace{},
&m.LabelField{Field: "projectId"},
).
MustImport(&Version, v1.Namespace{}, struct {
ProjectID string `norman:"type=reference[/v3/schemas/project]"`
Templates map[string]string
Answers map[string]interface{}
Prune bool
ExternalID string
Tags []string
}{})
}
func workloadTypes(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v3.WorkloadSpec{},
&m.Embed{Field: "deployConfig"},
&m.Embed{Field: "template"},
).
AddMapperForType(&Version, v3.Workload{}, mapper.NewWorkloadTypeMapper()).
MustImport(&Version, v3.Workload{}, projectOverride{})
}
func statefulSetTypes(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v1beta2.StatefulSetSpec{},
&m.Move{
From: "replicas",
To: "scale",
DestDefined: true,
},
&m.Move{
From: "updateStrategy/rollingUpdate/partition",
To: "deploymentStrategy/orderedConfig/partition",
},
m.SetValue{
From: "updateStrategy/type",
IfEq: "OnDelete",
Value: true,
To: "deploymentStrategy/orderedConfig/onDelete",
},
m.SetValue{
From: "podManagementPolicy",
IfEq: "Parallel",
Value: "Parallel",
To: "deploymentStrategy/kind",
},
m.SetValue{
From: "podManagementPolicy",
IfEq: "OrderedReady",
Value: "Ordered",
To: "deploymentStrategy/kind",
},
m.Drop{Field: "selector"},
&m.Embed{Field: "template"},
).
AddMapperForType(&Version, v1beta2.StatefulSet{}, mapper.NewWorkloadTypeMapper()).
MustImport(&Version, v1beta2.StatefulSetSpec{}, deployOverride{}).
MustImport(&Version, v1beta2.StatefulSet{}, projectOverride{})
}
func replicaSet(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v1beta2.ReplicaSetSpec{},
&m.Move{
From: "replicas",
To: "scale",
DestDefined: true,
},
&m.Move{
From: "minReadySeconds",
To: "deploymentStrategy/parallelConfig/minReadySeconds",
},
m.Drop{Field: "selector"},
&m.Embed{Field: "template"},
).
AddMapperForType(&Version, v1beta2.ReplicaSet{}, mapper.NewWorkloadTypeMapper()).
MustImport(&Version, v1beta2.ReplicaSetSpec{}, deployOverride{}).
MustImportAndCustomize(&Version, v1beta2.ReplicaSet{}, func(schema *types.Schema) {
schema.BaseType = "workload"
}, projectOverride{})
}
func replicationController(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v1.ReplicationControllerSpec{},
&m.Move{
From: "replicas",
To: "scale",
DestDefined: true,
},
&m.Move{
From: "minReadySeconds",
To: "deploymentStrategy/parallelConfig/minReadySeconds",
},
m.Drop{Field: "selector"},
&m.Embed{Field: "template"},
).
AddMapperForType(&Version, v1.ReplicationController{}, mapper.NewWorkloadTypeMapper()).
MustImport(&Version, v1.ReplicationControllerSpec{}, deployOverride{}).
MustImportAndCustomize(&Version, v1.ReplicationController{}, func(schema *types.Schema) {
schema.BaseType = "workload"
}, projectOverride{})
}
func daemonSet(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v1beta2.DaemonSetSpec{},
m.SetValue{
From: "updateStrategy/type",
IfEq: "OnDelete",
Value: true,
To: "deploymentStrategy/globalConfig/onDelete",
},
&m.Move{
From: "minReadySeconds",
To: "deploymentStrategy/globalConfig/minReadySeconds",
},
m.Drop{Field: "selector"},
&m.Embed{Field: "template"},
).
AddMapperForType(&Version, v1beta2.DaemonSet{}, mapper.NewWorkloadTypeMapper()).
MustImport(&Version, v1beta2.DaemonSetSpec{}, deployOverride{}).
MustImportAndCustomize(&Version, v1beta2.DaemonSet{}, func(schema *types.Schema) {
schema.BaseType = "workload"
}, projectOverride{})
}
func deploymentTypes(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v1beta2.DeploymentSpec{},
&m.Move{
From: "replicas",
To: "scale",
DestDefined: true,
},
&m.Move{
From: "minReadySeconds",
To: "deploymentStrategy/parallelConfig/minReadySeconds",
},
&m.Move{
From: "progressDeadlineSeconds",
To: "deploymentStrategy/parallelConfig/progressDeadlineSeconds",
},
mapper.DeploymentStrategyMapper{},
m.Drop{Field: "selector"},
m.Drop{Field: "strategy"},
&m.Embed{Field: "template"},
).
AddMapperForType(&Version, v1beta2.Deployment{}, mapper.NewWorkloadTypeMapper()).
MustImport(&Version, v1beta2.DeploymentSpec{}, deployOverride{}).
MustImportAndCustomize(&Version, v1beta2.Deployment{}, func(schema *types.Schema) {
schema.BaseType = "workload"
}, projectOverride{})
}
func podTypes(schemas *types.Schemas) *types.Schemas {
return schemas.
AddMapperForType(&Version, v1.PodTemplateSpec{},
&m.Embed{Field: "spec"},
).
AddMapperForType(&Version, v1.Capabilities{},
m.Move{From: "add", To: "capAdd"},
m.Move{From: "drop", To: "capDrop"},
).
AddMapperForType(&Version, v1.PodSecurityContext{},
m.Drop{Field: "seLinuxOptions"},
m.Move{From: "runAsUser", To: "uid"},
m.Move{From: "supplementalGroups", To: "gids"},
m.Move{From: "fsGroup", To: "fsgid"},
).
AddMapperForType(&Version, v1.SecurityContext{},
&m.Embed{Field: "capabilities"},
m.Drop{Field: "seLinuxOptions"},
m.Move{From: "readOnlyRootFilesystem", To: "readOnly"},
m.Move{From: "runAsUser", To: "uid"},
).
AddMapperForType(&Version, v1.Container{},
m.Move{From: "command", To: "entrypoint"},
m.Move{From: "args", To: "command"},
m.Move{From: "livenessProbe", To: "healthcheck"},
m.Move{From: "readinessProbe", To: "readycheck"},
m.Move{From: "imagePullPolicy", To: "pullPolicy"},
mapper.EnvironmentMapper{},
&m.Embed{Field: "securityContext"},
&m.Embed{Field: "lifecycle"},
).
AddMapperForType(&Version, v1.ContainerPort{},
m.Drop{Field: "name"},
).
AddMapperForType(&Version, v1.VolumeMount{},
m.Enum{
Field: "mountPropagation",
Values: map[string][]string{
"HostToContainer": {"rslave"},
"Bidirectional": {"rshared", "shared"},
},
},
).
AddMapperForType(&Version, v1.Handler{}, handlerMapper).
AddMapperForType(&Version, v1.Probe{}, handlerMapper).
AddMapperForType(&Version, v1.PodStatus{},
m.Move{From: "hostIP", To: "nodeIp"},
m.Move{From: "podIP", To: "podIp"},
).
AddMapperForType(&Version, v1.PodSpec{},
m.Move{From: "restartPolicy", To: "restart"},
m.Move{From: "imagePullSecrets", To: "pullSecrets"},
mapper.NamespaceMapper{},
mapper.InitContainerMapper{},
mapper.SchedulingMapper{},
&m.Embed{Field: "securityContext"},
&m.Drop{Field: "serviceAccount"},
&m.SliceToMap{
Field: "volumes",
Key: "name",
},
&m.SliceToMap{
Field: "containers",
Key: "name",
},
&m.SliceToMap{
Field: "hostAliases",
Key: "ip",
},
).
AddMapperForType(&Version, v1.ResourceRequirements{},
mapper.PivotMapper{Plural: true},
).
AddMapperForType(&Version, v1.Pod{},
&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 {
Scheduling *Scheduling
Resources *Resources
Environment map[string]string
EnvironmentFrom []EnvironmentFrom
InitContainer bool
}{}).
MustImport(&Version, v1.PodSpec{}, struct {
NodeName string `norman:"type=reference[node]"`
Net string
PID string
IPC string
}{}).
MustImport(&Version, v1.Pod{}, projectOverride{}, struct {
WorkloadID string `norman:"type=reference[workload]"`
}{})
}

View File

@@ -0,0 +1,83 @@
package schema
import (
"github.com/rancher/norman/types"
m "github.com/rancher/norman/types/mapper"
"github.com/rancher/types/apis/project.cattle.io/v3"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
var (
handlerMapper = &m.UnionEmbed{
Fields: []m.UnionMapping{
{
FieldName: "exec",
CheckFields: []string{"command"},
},
{
FieldName: "tcpSocket",
CheckFields: []string{"tcp", "port"},
},
{
FieldName: "httpGet",
CheckFields: []string{"port"},
},
},
}
)
type ScalingGroup struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec interface{} `json:"spec"`
Status interface{} `json:"status"`
}
type handlerOverride struct {
TCP bool
}
type EnvironmentFrom struct {
Source string
SourceName string
SourceKey string
Prefix string
Optional bool
TargetKey string
}
type Resources struct {
CPU *ResourceRequest
Memory *ResourceRequest
NvidiaGPU *ResourceRequest
}
type ResourceRequest struct {
Request string
Limit string
}
type Scheduling struct {
AntiAffinity string
Node *NodeScheduling
Tolerate []string
Scheduler string
Priority *int64
PriorityClassName string
}
type NodeScheduling struct {
Name string
RequireAll []string
RequireAny []string
Preferred []string
}
type deployOverride struct {
v3.DeployConfig
}
type projectOverride struct {
types.Namespaced
ProjectID string `norman:"type=reference[/v3/schemas/project]"`
}

View File

@@ -0,0 +1,56 @@
package v3
import (
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type WorkloadSpec struct {
DeployConfig DeployConfig
Template v1.PodTemplateSpec
}
type WorkloadStatus struct {
}
type Workload struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec WorkloadSpec `json:"spec"`
Status *WorkloadStatus `json:"status"`
}
type DeployConfig struct {
Scale int64
BatchSize string
DeploymentStrategy *DeployStrategy
}
type DeploymentParallelConfig struct {
StartFirst bool
MinReadySeconds int64
ProgressDeadlineSeconds int64
}
type DeploymentJobConfig struct {
BatchLimit int64
ActiveDeadlineSeconds int64
OnDelete bool
}
type DeploymentOrderedConfig struct {
PartitionSize int64
OnDelete bool
}
type DeploymentGlobalConfig struct {
OnDelete bool
}
type DeployStrategy struct {
Kind string
ParallelConfig *DeploymentParallelConfig
JobConfig *DeploymentJobConfig
OrderedConfig *DeploymentOrderedConfig
GlobalConfig *DeploymentGlobalConfig
}