# OAM Spec v0.2.2 Working Draft Hi all, this is the issue tracker to finalize the design of OAM spec v0.2.2. It reflects the high level ideas of the existing working draft in master branch with considerations on backward compatibility in existing releases. > As a working draft, the below design is open for revise, but we should try best to keep the changes minimal. ## 1. ComponentDefinition > Purpose: refactor `Component` in v0.2.1 and `ComponentSchematic` of v1alpha1 to combine all the schematic primitives in one object, w/o any instance values. > Target user: component provider, software distributor ```yaml apiVersion: core.oam.dev/v1alpha3 kind: ComponentDefinition metadata: name: webservice namespace: foo # install this component in namespace foo spec: workload: # workload type descriptor type: core.oam.dev.containerizedworkload # ref to a WorkloadDefinition via name definition: # mutually exclusive to workload.type, a embedded WorkloadDefinition apiVersion: core.oam.dev/v1alpha2 kind: ContainerizedWorkload schematic: kube: # this section is same with v0.2.1 component spec (i.e. raw k8s resource template) template: apiVersion: core.oam.dev/v1alpha2 kind: ContainerizedWorkload spec: ... containers: - name: my-cool-workload image: example/very-cool-workload:0.1.2@sha256:verytrustworthyhash resources: cpu: required: 1.0 memory: required: 100MB cmd: - "bash lscpu" parameters: - name: image required: true fieldPaths: - "spec.containers[0].image" - name: cmd required: true fieldPaths: - "spec.containers[0].cmd" cue: # cue template and parameters helm: # a helm chart arm: # Azure ARM template & parameter schema status: parameters: # a generated json schema of parameters, equivalent to spec.parameters but friendly to k8s impl ``` > The implementation will auto generate the jsonschema of module parameters and patch it to the status of `ComponentDefinition`. ## 2. WorkloadDefinition > Purpose: equivalent to `WorkloadDefinition` in v0.2.1, a missing concept in v1alpha1 > Target user: this is an optional system level object, the main use case is for custom workload type discovering. ```yaml apiVersion: core.oam.dev/v1alpha2 kind: WorkloadDefinition metadata: name: core.oam.dev.containerizedworkload spec: definitionRef: # crd of this workload apiVersion: core.oam.dev/v1alpha2 kind: ContainerizedWorkload childResources: - apiVersion: apps/v1 kind: Deployment ``` ## 3. Application > Purpose: equivalent to `ApplicationConfiguration` in v0.2.1 and v1alpha1 > Target user: app dev, app ops, end users ```yaml apiVersion: core.oam.dev/v1alpha2 kind: Application metadata: name: application-sample spec: components: - name: myweb type: foo/webservice # ref to ComponentDefinition, optionally, in namespace foo settings: # workload settings - consistency image: "busybox" cmd: - sleep - "1000" traits: # assume traits are in oam system namespace for now - name: scaler properties: replicas: 10 - name: sidecar properties: name: "sidecar-test" image: "nginx" ``` ## 4. TraitDefinition > Purpose: equivalent to `TraitDefinition` in v0.2.1 and `Trait` of v1alpha1 > Target user: infra ops, platform builders, traits are platform provided capabilities, end users should not modify traits - they only use them ```yaml apiVersion: core.oam.dev/v1alpha2 kind: TraitDefinition metadata: name: scaler spec: appliesToWorkloads: - core.oam.dev.containerizedworkload # arbitrary workload definition # support k8s label selector in the future definitionRef: apiVersion: xxx kind: xxx schematic: # seems we don't need kube type for trait, definitionRef is enough cue: # cue template and parameters helm: # a helm chart ... # could have more module types in the future status: parameters: # a optional generated json schema of parameters, equivalent to spec.parameters but friendly to k8s impl ``` ## 5. ApplicationScope No change with spec v0.2.1 ## Open Questions ### 1. Behavior of traits for revisioned components. Traits are attached to component __instances__, and those instances are revisioned. Should we replica the traits then (e.g. ingress vs. {ingress-v1, ingress-v2})? In previous code, as a workaround, we tagged `TraitDefinition` as `revisionEnabled` to control this behavior, though recently we fallback to assume ALL traits are replicated but have to leave `rollout` to a seperate field (since it is across-revisions).