Compare commits

..

113 Commits

Author SHA1 Message Date
Jianbo Sun
bb6b050d15 Merge pull request #745 from ryanzhang-oss/ack-cleanup
make Vela work with ACK and clean up imports and scripts
2020-12-09 11:59:35 +08:00
Jianbo Sun
ec8427c419 Merge pull request #746 from ryan4yin/fix-appfile
fix: load appfile
2020-12-09 11:55:16 +08:00
ryan
3211c89610 fix: load appfile 2020-12-09 11:33:26 +08:00
Ryan Zhang
92f31a100e make vela work with ACK and clean up 2020-12-08 17:33:27 -08:00
guoxudong
960322c21f Docs update (#741)
* update docs

* add blog

* fix
2020-12-08 10:17:24 -08:00
912988434
f0596c4914 fix task( k8s job ) restartpolicy default Always (#723)
* fix task( k8s job ) restrtpolicy default Always

* Update the parameter policy to  restartPolicy

* Update the parameter restartPolicy to restart

* Update charts/vela-core/templates/defwithtemplate/task.yaml

Co-authored-by: Ryan Zhang <yangzhangrice@hotmail.com>

* Update hack/vela-templates/cue/task.cue

Co-authored-by: 李帅 <lishuai@MacBook-Pro.local>
Co-authored-by: Katacoda Scenario <scenario@katacoda.com>
Co-authored-by: Jianbo Sun <wonderflow.sun@gmail.com>
Co-authored-by: Ryan Zhang <yangzhangrice@hotmail.com>
2020-12-08 16:04:06 +08:00
Jianbo Sun
4ff9639daa Merge pull request #737 from wonderflow/addrelease
add release version into README
2020-12-08 10:06:53 +08:00
Jianbo Sun
8513c40b62 Merge pull request #738 from wonderflow/updateo
update owners file
2020-12-07 21:08:26 +08:00
天元
9224e8eb47 fix CI 2020-12-07 20:15:40 +08:00
天元
ee547ec441 add release version into README 2020-12-07 15:30:39 +08:00
天元
dc4071d0bc update owners file 2020-12-07 15:22:26 +08:00
Jianbo Sun
1ec07b0198 Merge pull request #722 from wonderflow/doc
add some detail for route design
2020-12-07 11:29:13 +08:00
Jianbo Sun
a848dd1bf3 Merge pull request #732 from zzxwill/design-docs
Fix broken link
2020-12-07 09:48:29 +08:00
zzxwill
901b1ef83e Fix broken link
Fixed broken link for `Capability Oriented` in appfile-design.md
2020-12-05 23:50:09 +08:00
Jianbo Sun
79c2209d19 Merge pull request #729 from wonderflow/setup
fix build issue
2020-12-05 16:00:04 +08:00
天元
c018b4e722 fix log 2020-12-05 15:15:02 +08:00
Jianbo Sun
28ede4adca Merge pull request #726 from LeoLiuYan/fix_restapi
Fix function `GetCapabilityDir` error handler and variable `env` typo
2020-12-05 10:39:18 +08:00
liuyan
c61efb1352 Fix function GetCapabilityDir error handler and variable env typo 2020-12-05 09:26:35 +08:00
lllwan
b36bfa02a6 Add JSON format appfile support (#691)
* Add JSON format appfile support

Co-authored-by: 摩羯 <wangxun@cai-inc.com>
Co-authored-by: wangxun <wangxun@zcydeMBP.lan>
2020-12-05 08:06:25 +08:00
Hongchao Deng
6f9d49be52 Merge pull request #717 from wonderflow/lockversion
build version into vela-core and lock helm version on release
2020-12-04 16:04:10 -08:00
Jianbo Sun
f702b845be Merge pull request #711 from zzxwill/faq
Add "warning: Namespace cert-manager exists" in FAQ
2020-12-04 18:37:54 +08:00
Jianbo Sun
2a2bc40282 Merge pull request #725 from Cweiping/feature/fix_port_forword_long_text
fix long text port forword
2020-12-04 18:26:02 +08:00
Weiping Cai
305360b755 fix long text port forword 2020-12-04 18:06:25 +08:00
天元
799bcf9cef add some detail for route design 2020-12-04 17:27:41 +08:00
天元
21cae61f93 build version into vela-core and lock helm version on release 2020-12-04 16:45:37 +08:00
Jianbo Sun
89507ec8ef Merge pull request #716 from zzxwill/official-site
Fix Webservice/worker reference link 404 and add Scaler link
2020-12-04 16:23:32 +08:00
zzxwill
2bd0e0af81 Fix Webservice/worker reference link 404 and add Scaler link
To fix 404 issue https://kubevela.io/#/en/developers/references/workload-types/web-service
and add manualscalertrait link
2020-12-04 16:11:57 +08:00
Hongchao Deng
169b02f965 Merge pull request #713 from wonderflow/fixjob
fix task(k8s job) definition
2020-12-03 20:10:33 -08:00
天元
9f44bb128f fix job definition 2020-12-04 11:52:13 +08:00
zzxwill
b7d16f7188 Add "warning: Namespace cert-manager exists" in FAQ
Added another case in FAQ.
Fix #701
2020-12-04 10:57:14 +08:00
Zheng Xi Zhou
06585fea92 Support disable installation of builtin capabilities (#687)
* Support disable installation of builtin capabilities

Added vela core bootstrap flag `--enable-caps` to support no
installation for builtin capabiliteis

Feature #658

* revert flag to "disable-cpas"

Co-authored-by: Jianbo Sun <wonderflow.sun@gmail.com>

* Address comments

Co-authored-by: Jianbo Sun <wonderflow.sun@gmail.com>
2020-12-04 10:03:25 +08:00
Jianbo Sun
7d3397ac31 Merge pull request #673 from zzxwill/docs-reference
Auto-generate reference docs
2020-12-03 18:11:49 +08:00
Jianbo Sun
8f9104387e Merge pull request #706 from zzxwill/faq
FAQ
2020-12-03 17:51:37 +08:00
zzxwill
2c3c97560d FAQ
Add FAQ on installation related questions in `Reference` section of
the official site
2020-12-03 17:17:11 +08:00
Jian.Li
ee906dbd5a Using CUE to implement OAM model on Kubernetes server side (#669)
Init: Using CUE to implement OAM model on Kubernetes server side
* vela server

* fix refator

* lint code

* vela server

* fix refator

* lint code

* rebase upstream

* remove lister

* add vela-server sample

* fix lint error

* fix lint error

* fix check-diff error

* add test case

* add test case for application controller

* add reconciler test with ginkgo

* remove make server

* remove the kustomize scripts

* fix units test bug

* config direct

* suite test

* add application validater

Co-authored-by: lj176172 <lj176172@alibaba-inc.com>
2020-12-03 17:09:55 +08:00
Jianbo Sun
a4e68dd604 add doc for users to migrate from oam-runtime to kubevela (#697)
* add doc for users to migrate from oam-runtime to kubevela

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Zheng Xi Zhou <zzxwill@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Zheng Xi Zhou <zzxwill@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Zheng Xi Zhou <zzxwill@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Zheng Xi Zhou <zzxwill@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Zheng Xi Zhou <zzxwill@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Zheng Xi Zhou <zzxwill@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>

* add disable webhook

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>

* address comments

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>

* Update design/vela-core/migrate-from-oam-runtime.md

Co-authored-by: Hongchao Deng <hongchaodeng1@gmail.com>

Co-authored-by: Zheng Xi Zhou <zzxwill@gmail.com>
Co-authored-by: Lei Zhang (Harry) <resouer@gmail.com>
Co-authored-by: Hongchao Deng <hongchaodeng1@gmail.com>
2020-12-03 15:29:56 +08:00
Jianbo Sun
b45b9dd6c7 Merge pull request #703 from hongchaodeng/export
add export command and argo gitops sample
2020-12-03 15:17:10 +08:00
Hongchao Deng
c52847eaaa add codecov threshold 2020-12-02 22:33:13 -08:00
Hongchao Deng
306b21459e add export command and argo gitops sample
Signed-off-by: Hongchao Deng <hongchaodeng1@gmail.com>
2020-12-02 22:25:57 -08:00
Jianbo Sun
af5bdd713f Merge pull request #702 from zzxwill/issue-template
Remove automatically prefixed "[BUG]" in the issue title
2020-12-03 12:10:58 +08:00
zzxwill
2bd770d88d Remove automatically prefixed "[BUG]" in the issue title
Remove "[BUG]" from the default issue as maintainers can
use labeling mechanism to tell whether it is
2020-12-03 11:54:02 +08:00
zzxwill
39db378bcd Put error as return for sub-functions and update description for definitions 2020-12-02 15:29:20 +08:00
Jianbo Sun
0c22a4c72e Merge pull request #690 from wonderflow/tip
add a tip for make diff fail
2020-12-02 14:49:23 +08:00
天元
1a37228e03 add a tip for make diff fail
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-12-02 13:54:19 +08:00
Jianbo Sun
c02e1eae9e Merge pull request #689 from horis233/move-GetConfig
Move GetConfig into specific commands
2020-12-02 13:51:14 +08:00
Jiaming Hu
014513d55e Add unit test for PersistentPreRunE 2020-12-01 22:49:03 -05:00
Jiaming Hu
5e4f270b1e move GetConfig function into specific commands 2020-12-01 21:44:06 -05:00
Jianbo Sun
ec388b11bb Merge pull request #683 from hongchaodeng/contrib
CONTRIBUTING: add merge regulations
2020-12-01 15:13:24 +08:00
Hongchao Deng
fb40432309 CONTRIBUTING: add merge regulations 2020-11-30 23:10:53 -08:00
Jianbo Sun
e7ab480e40 Merge pull request #678 from wonderflow/fixroute
fix route reconcile too frequency and replace oam-runtime imports
2020-12-01 15:01:45 +08:00
天元
9aae23e163 fix route reconcile too frequency and replace oam-runtime imports
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-12-01 14:05:12 +08:00
zzxwill
f7718b4c08 Auto-generate reference docs
Automatically generate reference docs for all workloads and traits.
1) moved design part from hack/references/configurations/rollout.yaml to design/vela-core/rollout.md
2) added usages for all workloads/traits, except route (#672)
3) renamed some reference docs

Attention: atuo-generation of specifications for all parameters has NOT been implemented, they are generated
based on files under `hack/references/configurations`

Co-authored-by: Jianbo Sun <wonderflow.sun@gmail.com>
2020-12-01 13:56:24 +08:00
Jianbo Sun
6ef0605542 Merge pull request #670 from captainroy-hy/fix-webhook-applyto
fix webhook about Trait-Applyto
2020-11-30 15:49:18 +08:00
roy wang
12a2eb8491 fix minor lint issues
add unit tests

Signed-off-by: roy wang <seiwy2010@gmail.com>
2020-11-30 16:11:48 +09:00
roy wang
8b27ade1cb fix validating-webhook about Trait-ApplyTo feature
Signed-off-by: roy wang <seiwy2010@gmail.com>
2020-11-30 15:23:07 +09:00
Jianbo Sun
b8f18153b3 Merge pull request #667 from zzxwill/install
Install KubeVela Cli by script
2020-11-30 13:26:20 +08:00
zzxwill
7658a05b84 indicates the source from 2020-11-30 11:42:57 +08:00
Jianbo Sun
ba2d945079 Merge pull request #663 from wonderflow/mergecode
Merging oam-runtime into vela-core
2020-11-27 20:24:06 +08:00
天元
6b931d9b32 fix unstable test as workload changed by reconcile
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-27 20:11:26 +08:00
天元
43754e89b6 merge CI and makefile
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-27 12:16:36 +08:00
天元
26b4e3c2d5 merge main.go
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-27 11:08:58 +08:00
天元
cfadfd8763 merge tests and run on CI
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-27 11:08:58 +08:00
天元
6480873e81 change import headers
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-27 11:08:54 +08:00
天元
2e975e678c merge code: apis,pkg all moved
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-27 11:07:50 +08:00
Jianbo Sun
fa7b6fa85f Merge pull request #664 from captainroy-hy/fix-lint-pkg-controller
fix lint issues
2020-11-27 11:07:20 +08:00
zzxwill
d31a983c7e Install KubeVela Cli by script
Supported macOS/Linux/Windows platform
2020-11-26 19:22:29 +08:00
roy wang
6303d311c8 fix lint issues in /pkg/*
fix lint issues in /cmd/*

Signed-off-by: roy wang <seiwy2010@gmail.com>
2020-11-26 17:18:54 +09:00
roy wang
bfb0f94b82 fix lint issues in /pkg/controller
fix lint issues in /apis

Signed-off-by: roy wang <seiwy2010@gmail.com>
2020-11-26 16:12:03 +09:00
Yue Wang
855f194228 doc for apply-once-only (#649)
* doc for apply-once-only

Signed-off-by: roy wang <seiwy2010@gmail.com>

* Update design/vela-core/apply-once-only.md

Co-authored-by: Jianbo Sun <wonderflow.sun@gmail.com>
2020-11-26 10:29:52 +08:00
Hongchao Deng
db03c6e291 Merge pull request #660 from wonderflow/refactor
Refactor standardize project structure
2020-11-25 18:27:39 -08:00
天元
be8403dc0d standardize project structure: move v1alpha1 into standard.oam.dev group
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-25 21:46:31 +08:00
Jianbo Sun
edaac86304 Merge pull request #659 from captainroy-hy/fix-lint
fix lint issues in /pkg/commands
2020-11-25 17:33:24 +08:00
天元
fc805214c7 standardize project structure: change api to apis
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-25 17:28:09 +08:00
roy wang
ee9b44fa80 fix lint issues in /pkg/commands
Signed-off-by: roy wang <seiwy2010@gmail.com>
2020-11-25 18:01:31 +09:00
Jianbo Sun
aa5a11bcdd Merge pull request #653 from laojianzi/fix-lint
fix lints for pkg/commands/init.go and pkg/server/util/middleware.go
2020-11-24 21:15:42 +08:00
laojianzi
80d4a8bfd1 fix lints in pkg/server/util/middleware.go 2020-11-24 20:56:20 +08:00
laojianzi
31e5eb05c5 fix lints in pkg/commands/init.go 2020-11-24 20:40:23 +08:00
Jianbo Sun
615f81c251 Merge pull request #650 from fengxsong/patch-1
correct usage of flag 'log-file-path'
2020-11-24 16:11:51 +08:00
fengxsong
899e7e1647 correct usage of flag 'log-file-path' 2020-11-24 15:34:55 +08:00
Jianbo Sun
c7bb52a4d4 Merge pull request #648 from horis233/fix-lints-in-appHandlers.go
Fix lints in appHandlers.go
2020-11-24 15:00:07 +08:00
Jiaming Hu
31012bc7e5 Fix lints in appHandlers.go 2020-11-23 23:51:52 -05:00
Jianbo Sun
03259630c2 Merge pull request #614 from wonderflow/golanci
add more strict golangci check
2020-11-23 19:06:13 +08:00
天元
2876d2f921 fix more golints and leave TODOs for no fixed package or files 2020-11-23 18:21:43 +08:00
天元
ba7a4a33fc add more strict golangci check
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>

add description for export const variable and function, fix golint

Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-23 16:19:20 +08:00
Jianbo Sun
e6397723db Merge pull request #643 from wonderflow/fixlint
part of lint fixes detected by #614
2020-11-23 16:18:46 +08:00
Jianbo Sun
2165624ba8 Merge pull request #642 from morlay/master
Version tags should handle in workflow docker.yml
2020-11-23 15:58:39 +08:00
天元
3c233d3a9b fix lint 2020-11-23 15:55:46 +08:00
Morlay
ecae9e4785 version tags should in workflow docker.yml too 2020-11-23 14:55:10 +08:00
Jianbo Sun
32921796e8 Merge pull request #631 from morlay/master
multi-arch images support
2020-11-23 11:48:57 +08:00
Zheng Xi Zhou
83ed11e254 ComponentTrait composing and trait CR naming design (#628)
* Componenttrait composing and trait CR naming design

Add the design docs for OAM Kubernetes Runtime PR
https://github.com/crossplane/oam-kubernetes-runtime/pull/305

Co-authored-by: Jianbo Sun <wonderflow.sun@gmail.com>

* Update design/vela-core/componenttrait-composing-and-trait-CR-naming.md

* Update design/vela-core/componenttrait-composing-and-trait-CR-naming.md

* Update design/vela-core/componenttrait-composing-and-trait-CR-naming.md

Co-authored-by: Jianbo Sun <wonderflow.sun@gmail.com>
2020-11-23 11:13:07 +08:00
Jianbo Sun
461968ab5c Merge pull request #640 from weibaohui/master
support contour ingress controller
2020-11-23 10:28:52 +08:00
weibaohui
d42aff9fb2 support contour ingress controller 2020-11-21 16:50:39 +08:00
Jianbo Sun
5a6cfa401c Merge pull request #639 from leonrodenburg/patch-1
Fix typo in 'Setting Routes' doc
2020-11-21 11:01:50 +08:00
Léon Rodenburg
9027a78c4f Fix typo in 'Setting Routes' doc 2020-11-20 09:44:34 +01:00
Jianbo Sun
816b7d2d6f Merge pull request #637 from wonderflow/display
add tips about vela install capability not ready instead of directly fail
2020-11-20 10:21:35 +08:00
Jianbo Sun
050b66b5d0 Merge pull request #636 from wonderflow/check
check helm release first before add repo and install chart
2020-11-20 09:53:08 +08:00
天元
6862435594 add tips about vela install capability not ready instead of directly fail, it could self-heal after background installation succeed
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-20 09:51:22 +08:00
天元
c195580126 check helm release first before add repo and install chart 2020-11-20 09:39:59 +08:00
Hongchao Deng
0747b03c50 Merge pull request #635 from hongchaodeng/hide_ui
hide dashboard command
2020-11-19 17:27:27 -08:00
Jianbo Sun
25558b2c86 Merge pull request #633 from zzxwill/docs-cli
Update vela Cli description
2020-11-20 09:22:56 +08:00
Hongchao Deng
f1ff1564fb hide dashboard command 2020-11-19 17:12:31 -08:00
Hongchao Deng
ebfd1dfe15 Merge pull request #634 from resouer/doc
Fix broken link in introduction
2020-11-19 15:38:55 -08:00
Harry Zhang
51873e0b4d Fix broken link in introduction 2020-11-19 15:32:25 -08:00
zzxwill
bcd6fb08cc Update vela Cli description
To make it consistent to the description of KubeVela repo
2020-11-19 16:22:34 +08:00
Morlay
7457c39f48 multi-arch images support
Signed-off-by: Morlay <morlay.null@gmail.com>
2020-11-19 14:16:17 +08:00
Jianbo Sun
7a81bba7ca Merge pull request #627 from wonderflow/newname
change demo app name to avoid see unhealthy status too quick
2020-11-18 17:03:57 +08:00
天元
5a4b70479c change demo app name to avoid see unhealthy status too quick 2020-11-18 17:00:40 +08:00
Jianbo Sun
2becbebceb Merge pull request #624 from oam-dev/wonderflow-patch-1
Update install.md
2020-11-18 16:40:13 +08:00
Jianbo Sun
cf57610e20 Update install.md
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-18 16:39:21 +08:00
Hongchao Deng
244b3f7f48 Merge pull request #622 from wonderflow/gosec
fix go sec and remove unnecessary code
2020-11-17 20:34:21 -08:00
天元
42c9e68512 fix go sec and remove unnecessary code
Signed-off-by: 天元 <jianbo.sjb@alibaba-inc.com>
2020-11-18 10:34:22 +08:00
Jianbo Sun
17b4a2c966 Merge pull request #623 from resouer/fix
Update design description
2020-11-18 10:15:54 +08:00
Harry Zhang
5266274c60 Update design description 2020-11-17 16:47:18 -08:00
363 changed files with 35883 additions and 4844 deletions

View File

@@ -1,7 +1,7 @@
---
name: Bug report
name: "\U0001F41B Bug report"
about: Create a report to help us improve
title: "[BUG]"
title: ""
labels: kind/bug
assignees: ''

View File

@@ -1,5 +1,5 @@
---
name: Feature request
name: "\U0001F680 Feature request"
about: Suggest an idea for this project
title: "[Feature]"
labels: kind/feature

View File

@@ -13,7 +13,7 @@ defaults:
working-directory: ./dashboard
jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
strategy:
matrix:
node-version: [10.x]

View File

@@ -3,23 +3,54 @@ on:
push:
branches:
- master
tags:
- "v*"
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Publish to Github Docker Package Registry
uses: elgohr/Publish-Docker-Github-Action@2.21
- name: Get the version
id: get_version
run: |
VERSION=${GITHUB_REF#refs/tags/}
if [[ ${GITHUB_REF} == "refs/heads/master" ]]; then
VERSION=latest
fi
echo ::set-output name=VERSION::${VERSION}
- name: Get git revision
id: vars
shell: bash
run: |
echo "::set-output name=git_revision::$(git rev-parse --short HEAD)"
- name: Login ghcr.io
uses: docker/login-action@v1
with:
name: oam-dev/kubevela/vela-core
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
registry: docker.pkg.github.com
tags: "latest"
- name: Publish to Docker Hub Registry
uses: elgohr/Publish-Docker-Github-Action@2.21
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.CR_PAT }}
- name: Login docker.io
uses: docker/login-action@v1
with:
name: oamdev/vela-core
registry: docker.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
tags: "latest"
- uses: docker/setup-qemu-action@v1
- uses: docker/setup-buildx-action@v1
- uses: docker/build-push-action@v2
name: Build & Pushing
with:
context: .
file: Dockerfile
labels: |-
org.opencontainers.image.source=https://github.com/${{ github.repository }}
org.opencontainers.image.revision=${{ github.sha }}
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
build-args: |
GITVERSION=git-${{ steps.vars.outputs.git_revision }}
VERSION=${{ steps.get_version.outputs.VERSION }}
tags: |-
ghcr.io/${{ github.repository }}/vela-core:${{ steps.get_version.outputs.VERSION }}
docker.io/oamdev/vela-core:${{ steps.get_version.outputs.VERSION }}

View File

@@ -1,51 +0,0 @@
name: E2E
on:
push:
branches: [master]
pull_request:
branches: [master]
paths-ignore:
- 'docs/**'
- '**.md'
jobs:
build:
name: e2e-tests
runs-on: aliyun
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get dependencies
run: |
go get -v -t -d ./...
- name: Setup Kind Cluster
uses: engineerd/setup-kind@v0.5.0
with:
version: "v0.7.0"
skipClusterCreation: true
- name: Setup Kind Cluster
run: |
kind delete cluster
kind create cluster
kubectl version
kubectl cluster-info
- name: Load Image to kind cluster
run: make kind-load
- name: Run Make
run: make
- name: Run Make Manager
run: make manager
- name: Run e2e tests
run: |
make e2e-cleanup
make e2e-setup
make e2e-test
make e2e-api-test

View File

@@ -2,26 +2,45 @@ name: Go
on:
push:
branches: [master]
branches:
- master
- release-*
workflow_dispatch: {}
pull_request:
branches: [master]
paths-ignore:
- 'docs/**'
- '**.md'
env:
# Common versions
GO_VERSION: '1.14'
GOLANGCI_VERSION: 'v1.31'
DOCKER_BUILDX_VERSION: 'v0.4.2'
KIND_VERSION: 'v0.7.0'
jobs:
build:
name: unit-tests
unit-tests:
runs-on: ubuntu-20.04
steps:
- name: Set up Go 1.14
uses: actions/setup-go@v1
with:
go-version: 1.14
go-version: ${{ env.GO_VERSION }}
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v2
with:
submodules: true
- name: Cache Go Dependencies
uses: actions/cache@v2
with:
path: .work/pkg
key: ${{ runner.os }}-pkg-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-pkg-
- name: Install ginkgo
run: |
@@ -30,7 +49,7 @@ jobs:
- name: Setup Kind Cluster
uses: engineerd/setup-kind@v0.5.0
with:
version: "v0.7.0"
version: ${{ env.KIND_VERSION }}
- name: install Kubebuilder
uses: wonderflow/kubebuilder-action@v1.1
@@ -45,3 +64,98 @@ jobs:
file: ./coverage.txt
flags: unittests
name: codecov-umbrella
e2e-tests:
runs-on: aliyun
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get dependencies
run: |
go get -v -t -d ./...
- name: Setup Kind Cluster
uses: engineerd/setup-kind@v0.5.0
with:
version: ${{ env.KIND_VERSION }}
skipClusterCreation: true
- name: Setup Kind Cluster
run: |
kind delete cluster
kind create cluster
kubectl version
kubectl cluster-info
- name: Load Image to kind cluster
run: make kind-load
- name: Run Make
run: make
- name: Run Make Manager
run: make manager
- name: Prepare for e2e tests
run: |
make e2e-cleanup
make e2e-setup
- name: Wait for e2e preparation ready
run: |
timeout 60 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:38081/api/workloads)" != "200" ]]; do sleep 5; done' || false
- name: Run e2e tests
run: |
make e2e-api-test
make e2e-test
lint:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: true
- name: Cache Go Dependencies
uses: actions/cache@v2
with:
path: .work/pkg
key: ${{ runner.os }}-pkg-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-pkg-
# This action uses its own setup-go, which always seems to use the latest
# stable version of Go. We could run 'make lint' to ensure our desired Go
# version, but we prefer this action because it leaves 'annotations' (i.e.
# it comments on PRs to point out linter violations).
- name: Lint
uses: golangci/golangci-lint-action@v2
with:
version: ${{ env.GOLANGCI_VERSION }}
check-diff:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: true
- name: Setup Go
uses: actions/setup-go@v2
with:
go-version: ${{ env.GO_VERSION }}
- name: Cache Go Dependencies
uses: actions/cache@v2
with:
path: .work/pkg
key: ${{ runner.os }}-pkg-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-pkg-
- name: Check Diff
run: make check-diff

View File

@@ -20,6 +20,9 @@ jobs:
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get the version
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/}
- name: Use Node.js 10.x
uses: actions/setup-node@v1
with:
@@ -28,6 +31,10 @@ jobs:
run: make npm-install
- name: Run npm build
run: make npm-build
- name: Tag helm chart image
run: |
sed -i 's/latest/${{ steps.get_version.outputs.VERSION }}/g' charts/vela-core/values.yaml
sed -i 's/0.1.0/${{ steps.get_version.outputs.VERSION }}/g' charts/vela-core/Chart.yaml
- name: Run generate-source
run: make generate-source
- name: Run cross-build
@@ -40,9 +47,6 @@ jobs:
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
- name: Get the version
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/}
- name: Upload Linux tar.gz
uses: actions/upload-release-asset@v1.0.2
with:
@@ -91,19 +95,4 @@ jobs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./_bin/sha256sums.txt
asset_name: sha256sums.txt
asset_content_type: text/plain
- name: Publish to Github Docker Package Registry
uses: elgohr/Publish-Docker-Github-Action@2.21
with:
name: oam-dev/kubevela/vela-core
username: $GITHUB_ACTOR
password: ${{ secrets.GITHUB_TOKEN }}
registry: docker.pkg.github.com
tags: "${{ steps.get_version.outputs.VERSION }}"
- name: Publish to Docker Hub Registry
uses: elgohr/Publish-Docker-Github-Action@2.21
with:
name: oamdev/vela-core
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
tags: "${{ steps.get_version.outputs.VERSION }}"
asset_content_type: text/plain

206
.golangci.yml Normal file
View File

@@ -0,0 +1,206 @@
run:
timeout: 10m
skip-files:
- "zz_generated\\..+\\.go$"
- ".*_test.go$"
skip-dirs:
- "hack"
- "e2e"
output:
# colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number"
format: colored-line-number
linters-settings:
errcheck:
# report about not checking of errors in type assetions: `a := b.(MyStruct)`;
# default is false: such cases aren't reported by default.
check-type-assertions: false
# report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
# default is false: such cases aren't reported by default.
check-blank: false
# [deprecated] comma-separated list of pairs of the form pkg:regex
# the regex is used to ignore names within pkg. (default "fmt:.*").
# see https://github.com/kisielk/errcheck#the-deprecated-method for details
ignore: fmt:.*,io/ioutil:^Read.*
exhaustive:
# indicates that switch statements are to be considered exhaustive if a
# 'default' case is present, even if all enum members aren't listed in the
# switch
default-signifies-exhaustive: true
govet:
# report about shadowed variables
check-shadowing: false
golint:
# minimal confidence for issues, default is 0.8
min-confidence: 0.8
gofmt:
# simplify code: gofmt with `-s` option, true by default
simplify: true
goimports:
# put imports beginning with prefix after 3rd-party packages;
# it's a comma-separated list of prefixes
local-prefixes: github.com/oam-dev/kubevela
gocyclo:
# minimal code complexity to report, 30 by default (but we recommend 10-20)
min-complexity: 30
maligned:
# print struct with more effective memory layout or not, false by default
suggest-new: true
dupl:
# tokens count to trigger issue, 150 by default
threshold: 100
goconst:
# minimal length of string constant, 3 by default
min-len: 3
# minimal occurrences count to trigger, 3 by default
min-occurrences: 5
lll:
# tab width in spaces. Default to 1.
tab-width: 1
unused:
# treat code as a program (not a library) and report unused exported identifiers; default is false.
# XXX: if you enable this setting, unused will report a lot of false-positives in text editors:
# if it's called for subdir of a project it can't find funcs usages. All text editor integrations
# with golangci-lint call it on a directory with the changed file.
check-exported: false
unparam:
# Inspect exported functions, default is false. Set to true if no external program/library imports your code.
# XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:
# if it's called for subdir of a project it can't find external interfaces. All text editor integrations
# with golangci-lint call it on a directory with the changed file.
check-exported: false
nakedret:
# make an issue if func has more lines of code than this setting and it has naked returns; default is 30
max-func-lines: 30
gocritic:
# Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint` run to see all tags and checks.
# Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags".
enabled-tags:
- performance
settings: # settings passed to gocritic
captLocal: # must be valid enabled check name
paramsOnly: true
rangeValCopy:
sizeThreshold: 32
linters:
enable:
- megacheck
- govet
- gocyclo
- gocritic
- interfacer
- goconst
- goimports
- gofmt # We enable this as well as goimports for its simplify mode.
- golint
- unconvert
- misspell
- nakedret
presets:
- bugs
- unused
fast: false
issues:
# Excluding configuration per-path and per-linter
exclude-rules:
# Exclude some linters from running on tests files.
- path: _test(ing)?\.go
linters:
- gocyclo
- errcheck
- dupl
- gosec
- scopelint
- unparam
# Ease some gocritic warnings on test files.
- path: _test\.go
text: "(unnamedResult|exitAfterDefer)"
linters:
- gocritic
# These are performance optimisations rather than style issues per se.
# They warn when function arguments or range values copy a lot of memory
# rather than using a pointer.
- text: "(hugeParam|rangeValCopy):"
linters:
- gocritic
# This "TestMain should call os.Exit to set exit code" warning is not clever
# enough to notice that we call a helper method that calls os.Exit.
- text: "SA3000:"
linters:
- staticcheck
- text: "k8s.io/api/core/v1"
linters:
- goimports
# This is a "potential hardcoded credentials" warning. It's triggered by
# any variable with 'secret' in the same, and thus hits a lot of false
# positives in Kubernetes land where a Secret is an object type.
- text: "G101:"
linters:
- gosec
- gas
# This is an 'errors unhandled' warning that duplicates errcheck.
- text: "G104:"
linters:
- gosec
- gas
# The Azure AddToUserAgent method appends to the existing user agent string.
# It returns an error if you pass it an empty string lettinga you know the
# user agent did not change, making it more of a warning.
- text: \.AddToUserAgent
linters:
- errcheck
- text: "don't use an underscore"
linters:
- golint
# Independently from option `exclude` we use default exclude patterns,
# it can be disabled by this option. To list all
# excluded by default patterns execute `golangci-lint run --help`.
# Default value for this option is true.
exclude-use-default: false
# Show only new issues: if there are unstaged changes or untracked files,
# only those changes are analyzed, else only changes in HEAD~ are analyzed.
# It's a super-useful option for integration of golangci-lint into existing
# large codebase. It's not practical to fix all existing issues at the moment
# of integration: much better don't allow issues in new code.
# Default is false.
new: false
# Maximum issues count per one linter. Set to 0 to disable. Default is 50.
max-per-linter: 0
# Maximum count of issues with the same text. Set to 0 to disable. Default is 3.
max-same-issues: 0

View File

@@ -1,4 +1,4 @@
# CONTRIBUTING
# CONTRIBUTING Guide
## About KubeVela
@@ -7,7 +7,10 @@ KubeVela project is initialized and maintained by the cloud native community sin
This doc explains how to set up a development environment, so you can get started
contributing to `kubevela` or build a PoC (Proof of Concept).
## Prerequisites
## Development
### Prerequisites
1. Golang version 1.13+
2. Kubernetes version v1.16+ with `~/.kube/config` configured.
@@ -16,7 +19,7 @@ contributing to `kubevela` or build a PoC (Proof of Concept).
We also recommend you to learn about KubeVela's [design](docs/en/design.md) before dive into its code.
## Build
### Build
* Clone this project
@@ -63,7 +66,7 @@ make core-run
This command will run controller locally, it will use your local KubeConfig which means you need to have a k8s cluster
locally. If you don't have a one, we suggest that you could setup up a cluster with [kind](https://kind.sigs.k8s.io/).
## Use
### Use
* Create environment
@@ -132,7 +135,7 @@ $ vela delete abc
delete apps succeed abc from default
```
## Tests
## Testing
### Unit test
@@ -156,3 +159,11 @@ make e2e-test
## Make a pull request
Remember to write unit-test and e2e test before making a pull request.
## Merge Regulations
Before merging, the pull request should obey the following rules:
- The commit title and message should be clear about what this PR does.
- All test CI should pass green.
- The `codecov/project` should pass. This means the coverage should not drop. See [Codecov commit status](https://docs.codecov.io/docs/commit-status#project-status).

View File

@@ -1,5 +1,5 @@
# Build the manager binary
FROM golang:1.13 as builder
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.14 as builder
WORKDIR /workspace
# Copy the Go Modules manifests
@@ -11,18 +11,28 @@ RUN go mod download
# Copy the go source
COPY cmd/core/main.go main.go
COPY api/ api/
COPY apis/ apis/
COPY pkg/ pkg/
COPY version/ version/
# Build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -o manager main.go
ARG TARGETARCH
ARG VERSION
ARG GITVERSION
RUN CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} GO111MODULE=on \
go build -a -ldflags "-X github.com/oam-dev/kubevela/version.VelaVersion=${VERSION:-undefined} -X github.com/oam-dev/kubevela/version.GitRevision=${GITVERSION:-undefined}" \
-o manager-${TARGETARCH} main.go
# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
# oamdev/gcr.io-distroless-static:nonroot is syncd from gcr.io/distroless/static:nonroot as somewhere can't reach gcr.io
FROM oamdev/gcr.io-distroless-static:nonroot
# Could use `--build-arg=BASE_DISTROLESS=gcr.io/distroless/static:nonroot` to overwrite
ARG BASE_DISTROLESS
FROM ${BASE_DISTROLESS:-gcr.io/distroless/static:nonroot}
WORKDIR /
COPY --from=builder /workspace/manager .
ARG TARGETARCH
COPY --from=builder /workspace/manager-${TARGETARCH} /manager
USER nonroot:nonroot
ENTRYPOINT ["/manager"]

View File

@@ -1,7 +1,8 @@
# Vela version
VELA_VERSION ?= 0.1.0
VELA_VERSION ?= master
# Repo info
GIT_COMMIT ?= git-$(shell git rev-parse --short HEAD)
GIT_COMMIT_LONG ?= $(shell git rev-parse HEAD)
VELA_VERSION_VAR := github.com/oam-dev/kubevela/version.VelaVersion
VELA_GITVERSION_VAR := github.com/oam-dev/kubevela/version.GitRevision
LDFLAGS ?= "-X $(VELA_VERSION_VAR)=$(VELA_VERSION) -X $(VELA_GITVERSION_VAR)=$(GIT_COMMIT)"
@@ -10,6 +11,22 @@ GOX = go run github.com/mitchellh/gox
TARGETS := darwin/amd64 linux/amd64 windows/amd64
DIST_DIRS := find * -type d -exec
TIME_LONG = `date +%Y-%m-%d' '%H:%M:%S`
TIME_SHORT = `date +%H:%M:%S`
TIME = $(TIME_SHORT)
BLUE := $(shell printf "\033[34m")
YELLOW := $(shell printf "\033[33m")
RED := $(shell printf "\033[31m")
GREEN := $(shell printf "\033[32m")
CNone := $(shell printf "\033[0m")
INFO = echo ${TIME} ${BLUE}[ .. ]${CNone}
WARN = echo ${TIME} ${YELLOW}[WARN]${CNone}
ERR = echo ${TIME} ${RED}[FAIL]${CNone}
OK = echo ${TIME} ${GREEN}[ OK ]${CNone}
FAIL = (echo ${TIME} ${RED}[FAIL]${CNone} && false)
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
ifeq (,$(shell go env GOBIN))
GOBIN=$(shell go env GOPATH)/bin
@@ -22,12 +39,14 @@ all: build
# Run tests
test: vet lint
go test -race -coverprofile=coverage.txt -covermode=atomic ./pkg/... ./cmd/...
@$(OK) unit-tests pass
# Build manager binary
build: fmt vet lint
go run hack/chart/generate.go
go build -o bin/vela -ldflags ${LDFLAGS} cmd/vela/main.go
git checkout cmd/vela/fake/chart_source.go
@$(OK) build succeed
vela-cli:
go build -o bin/vela -ldflags ${LDFLAGS} cmd/vela/main.go
@@ -41,6 +60,7 @@ npm-install:
doc-gen:
rm -r docs/en/cli/*
go run hack/docgen/gen.go
go run hack/references/generate.go
generate-source:
go run hack/frontend/source.go
@@ -51,6 +71,8 @@ cross-build:
compress:
( \
echo "\n## Release Info\nVERSION: $(VELA_VERSION)" >> README.md && \
echo "GIT_COMMIT: $(GIT_COMMIT_LONG)\n" >> README.md && \
cd _bin && \
$(DIST_DIRS) cp ../LICENSE {} \; && \
$(DIST_DIRS) cp ../README.md {} \; && \
@@ -64,21 +86,29 @@ run: fmt vet
go run ./cmd/core/main.go
# Run go fmt against code
fmt: goimports
fmt: goimports installcue
go fmt ./...
$(GOIMPORTS) -local github.com/oam-dev/kubevela -w ./pkg ./cmd
./hack/cue-fmt.sh
$(CUE) fmt ./hack/vela-templates/cue/*
# Run go vet against code
vet:
go vet ./...
lint: golangci
$(GOLANGCILINT) run --timeout 10m -E golint,goimports ./...
$(GOLANGCILINT) run ./...
reviewable: fmt vet lint manifests
go mod tidy
# Execute auto-gen code commands and ensure branch is clean.
check-diff: reviewable
git diff --quiet || ($(ERR) please run 'make reviewable' to include all changes && false)
@$(OK) branch is clean
# Build the docker image
docker-build: test
docker build . -t ${IMG}
docker-build:
docker build --build-arg=VERSION=$(VELA_VERSION) --build-arg=GITVERSION=$(GIT_COMMIT) . -t ${IMG}
# Push the docker image
docker-push:
@@ -94,6 +124,10 @@ e2e-setup:
e2e-test:
# Run e2e test
ginkgo -v -skipPackage capability,setup,apiserver -r e2e
ginkgo -v ./test/e2e-test
# integration test will clean environment, please don't put test behind it.
CGO_ENABLED=0 go test -timeout 1h -count=1 -v -tags 'integration' ./test/integration
@$(OK) tests pass
e2e-api-test:
# Run e2e test
@@ -110,19 +144,17 @@ kind-load:
# Image URL to use all building/pushing image targets
IMG ?= vela-core:latest
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
CRD_OPTIONS ?= "crd:crdVersions=v1"
# Run tests
core-test: generate fmt vet manifests
core-test: fmt vet manifests
go test ./pkg/... -coverprofile cover.out
# Build manager binary
manager: generate fmt vet lint manifests
manager: fmt vet lint manifests
go build -o bin/manager ./cmd/core/main.go
# Run against the configured Kubernetes cluster in ~/.kube/config
core-run: generate fmt vet manifests
core-run: fmt vet manifests
go run ./cmd/core/main.go
# Install CRDs and Definitions of Vela Core into a cluster, this is for develop convenient.
@@ -133,6 +165,7 @@ core-install: manifests
kubectl apply -f charts/vela-core/templates/definitions/
kubectl apply -f charts/vela-core/templates/velaConfig.yaml
bin/vela workloads
@$(OK) install succeed
# Uninstall CRDs and Definitions of Vela Core from a cluster, this is for develop convenient.
core-uninstall: manifests
@@ -141,32 +174,10 @@ core-uninstall: manifests
kubectl delete -f charts/vela-core/crds/
# Generate manifests e.g. CRD, RBAC etc.
manifests: controller-gen
$(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=charts/vela-core/crds
go generate $(foreach t,pkg api,./$(t)/...)
manifests:
go generate $(foreach t,pkg apis,./$(t)/...)
./hack/vela-templates/gen_definitions.sh
# Generate code
generate: controller-gen
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..."
# find or download controller-gen
# download controller-gen if necessary
controller-gen:
ifeq (, $(shell which controller-gen))
@{ \
set -e ;\
CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ;\
cd $$CONTROLLER_GEN_TMP_DIR ;\
go mod init tmp ;\
go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.5 ;\
rm -rf $$CONTROLLER_GEN_TMP_DIR ;\
}
CONTROLLER_GEN=$(GOBIN)/controller-gen
else
CONTROLLER_GEN=$(shell which controller-gen)
endif
GOLANGCILINT_VERSION ?= v1.29.0
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
HOSTARCH := $(shell uname -m)
@@ -197,4 +208,16 @@ ifeq (, $(shell which goimports))
GOIMPORTS=$(GOBIN)/goimports
else
GOIMPORTS=$(shell which goimports)
endif
.PHONY: installcue
installcue:
ifeq (, $(shell which cue))
@{ \
set -e ;\
GO111MODULE=off go get -u cuelang.org/go/cmd/cue ;\
}
CUE=$(GOBIN)/cue
else
CUE=$(shell which cue)
endif

1
OWNERS
View File

@@ -5,5 +5,4 @@ approvers:
reviewers:
- kubevela-controller
- kubevela-dashboard
- oam-k8s-runtime
- oam-spec

View File

@@ -14,14 +14,7 @@ aliases:
- hongchaodeng
- zzxwill
- ryanzhang-oss
oam-k8s-runtime: # inherit from https://github.com/crossplane/oam-kubernetes-runtime/blob/master/OWNERS.md
- hongchaodeng
- wonderflow
- ryanzhang-oss
- captainroy-hy
- negz
- hasheddan
oam-spec: # inherit from https://github.com/oam-dev/spec/blob/master/OWNERS.md
- hongchaodeng

View File

@@ -1,2 +0,0 @@
// package api contains all api types of KubeVela
package api

View File

@@ -1,35 +0,0 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package v1alpha2 contains API Schema definitions for the core.oam.dev v1alpha2 API group
// +kubebuilder:object:generate=true
// +groupName=core.oam.dev
package v1alpha2
import (
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/scheme"
)
var (
// SchemeGroupVersion is group version used to register these objects
SchemeGroupVersion = schema.GroupVersion{Group: "core.oam.dev", Version: "v1alpha2"}
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
// AddToScheme adds the types in this group-version to the given scheme.
AddToScheme = SchemeBuilder.AddToScheme
)

View File

@@ -1,115 +0,0 @@
// +build !ignore_autogenerated
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Code generated by controller-gen. DO NOT EDIT.
package v1alpha2
import (
runtime "k8s.io/apimachinery/pkg/runtime"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ApplicationDeployment) DeepCopyInto(out *ApplicationDeployment) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
in.Status.DeepCopyInto(&out.Status)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationDeployment.
func (in *ApplicationDeployment) DeepCopy() *ApplicationDeployment {
if in == nil {
return nil
}
out := new(ApplicationDeployment)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ApplicationDeployment) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ApplicationDeploymentList) DeepCopyInto(out *ApplicationDeploymentList) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]ApplicationDeployment, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationDeploymentList.
func (in *ApplicationDeploymentList) DeepCopy() *ApplicationDeploymentList {
if in == nil {
return nil
}
out := new(ApplicationDeploymentList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ApplicationDeploymentList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ApplicationDeploymentSpec) DeepCopyInto(out *ApplicationDeploymentSpec) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationDeploymentSpec.
func (in *ApplicationDeploymentSpec) DeepCopy() *ApplicationDeploymentSpec {
if in == nil {
return nil
}
out := new(ApplicationDeploymentSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ApplicationDeploymentStatus) DeepCopyInto(out *ApplicationDeploymentStatus) {
*out = *in
in.ConditionedStatus.DeepCopyInto(&out.ConditionedStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationDeploymentStatus.
func (in *ApplicationDeploymentStatus) DeepCopy() *ApplicationDeploymentStatus {
if in == nil {
return nil
}
out := new(ApplicationDeploymentStatus)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,8 +0,0 @@
// +build generate
// See the below link for details on what is happening here.
// https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module
//go:generate go run ../hack/crd/update.go ../charts/vela-core/crds/
package api

View File

@@ -1,12 +0,0 @@
package types
import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/rest"
)
// Args is args for controller-runtime client
type Args struct {
Config *rest.Config
Schema *runtime.Scheme
}

2
apis/apis.go Normal file
View File

@@ -0,0 +1,2 @@
// Package apis contains all api types of KubeVela
package apis

View File

@@ -0,0 +1,37 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package core_oam_dev contains API Schema definitions for the core.oam.dev v1alpha2 API group
package core_oam_dev
import (
"k8s.io/apimachinery/pkg/runtime"
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
)
func init() {
// Register the types with the Scheme so the resources can map objects to GroupVersionKinds and back
AddToSchemes = append(AddToSchemes, v1alpha2.SchemeBuilder.AddToScheme)
}
// AddToSchemes may be used to add all resources defined in the project to a Scheme
var AddToSchemes runtime.SchemeBuilder
// AddToScheme adds all Resources to the Scheme
func AddToScheme(s *runtime.Scheme) error {
return AddToSchemes.AddToScheme(s)
}

View File

@@ -1,5 +1,5 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -25,12 +25,12 @@ import (
// ApplicationDeploymentSpec defines the desired state of ApplicationDeployment
type ApplicationDeploymentSpec struct {
//TODO add spec here
// TODO add spec here
}
// ApplicationDeploymentStatus defines the observed state of ApplicationDeployment
type ApplicationDeploymentStatus struct {
//TODO add status field here
// TODO add status field here
runtimev1alpha1.ConditionedStatus `json:",inline"`
}
@@ -53,7 +53,3 @@ type ApplicationDeploymentList struct {
metav1.ListMeta `json:"metadata,omitempty"`
Items []ApplicationDeployment `json:"items"`
}
func init() {
SchemeBuilder.Register(&ApplicationDeployment{}, &ApplicationDeploymentList{})
}

View File

@@ -0,0 +1,73 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1alpha2
import (
"k8s.io/apimachinery/pkg/runtime"
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
// ApplicationPhase is a label for the condition of a application at the current time
type ApplicationPhase string
const (
// ApplicationRendering means the app is rendering
ApplicationRendering ApplicationPhase = "rendering"
// ApplicationRunning means the app finished rendering and applied result to the cluster
ApplicationRunning ApplicationPhase = "running"
)
// AppStatus defines the observed state of Application
type AppStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
runtimev1alpha1.ConditionedStatus `json:",inline"`
Phase ApplicationPhase `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// Application is the Schema for the applications API
// +kubebuilder:subresource:status
type Application struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
// +kubebuilder:pruning:PreserveUnknownFields
Spec runtime.RawExtension `json:"spec,omitempty"`
Status AppStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// ApplicationList contains a list of Application
type ApplicationList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Application `json:"items"`
}
func init() {
SchemeBuilder.Register(&Application{}, &ApplicationList{})
}

View File

@@ -0,0 +1,104 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1alpha2
import (
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/oam-dev/kubevela/pkg/oam"
)
// HealthStatus represents health status strings.
type HealthStatus string
const (
// StatusHealthy represents healthy status.
StatusHealthy HealthStatus = "HEALTHY"
// StatusUnhealthy represents unhealthy status.
StatusUnhealthy = "UNHEALTHY"
// StatusUnknown represents unknown status.
StatusUnknown = "UNKNOWN"
)
var _ oam.Scope = &HealthScope{}
// A HealthScopeSpec defines the desired state of a HealthScope.
type HealthScopeSpec struct {
// ProbeTimeout is the amount of time in seconds to wait when receiving a response before marked failure.
ProbeTimeout *int32 `json:"probe-timeout,omitempty"`
// ProbeInterval is the amount of time in seconds between probing tries.
ProbeInterval *int32 `json:"probe-interval,omitempty"`
// WorkloadReferences to the workloads that are in this scope.
WorkloadReferences []runtimev1alpha1.TypedReference `json:"workloadRefs"`
}
// A HealthScopeStatus represents the observed state of a HealthScope.
type HealthScopeStatus struct {
runtimev1alpha1.ConditionedStatus `json:",inline"`
// ScopeHealthCondition represents health condition summary of the scope
ScopeHealthCondition ScopeHealthCondition `json:"scopeHealthCondition"`
// WorkloadHealthConditions represents health condition of workloads in the scope
WorkloadHealthConditions []*WorkloadHealthCondition `json:"healthConditions,omitempty"`
}
// ScopeHealthCondition represents health condition summary of a scope.
type ScopeHealthCondition struct {
HealthStatus HealthStatus `json:"healthStatus"`
Total int64 `json:"total,omitempty"`
HealthyWorkloads int64 `json:"healthyWorkloads,omitempty"`
UnhealthyWorkloads int64 `json:"unhealthyWorkloads,omitempty"`
UnknownWorkloads int64 `json:"unknownWorkloads,omitempty"`
}
// WorkloadHealthCondition represents informative health condition.
type WorkloadHealthCondition struct {
// ComponentName represents the component name if target is a workload
ComponentName string `json:"componentName,omitempty"`
TargetWorkload runtimev1alpha1.TypedReference `json:"targetWorkload,omitempty"`
HealthStatus HealthStatus `json:"healthStatus"`
Diagnosis string `json:"diagnosis,omitempty"`
// WorkloadStatus represents status of workloads whose HealthStatus is UNKNOWN.
WorkloadStatus string `json:"workloadStatus,omitempty"`
}
// +kubebuilder:object:root=true
// A HealthScope determines an aggregate health status based of the health of components.
// +kubebuilder:resource:categories={crossplane,oam}
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:JSONPath=".status.health",name=HEALTH,type=string
type HealthScope struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec HealthScopeSpec `json:"spec,omitempty"`
Status HealthScopeStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// HealthScopeList contains a list of HealthScope.
type HealthScopeList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []HealthScope `json:"items"`
}

View File

@@ -0,0 +1,63 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1alpha2
import (
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/oam-dev/kubevela/pkg/oam"
)
var _ oam.Trait = &ManualScalerTrait{}
// A ManualScalerTraitSpec defines the desired state of a ManualScalerTrait.
type ManualScalerTraitSpec struct {
// ReplicaCount of the workload this trait applies to.
ReplicaCount int32 `json:"replicaCount"`
// WorkloadReference to the workload this trait applies to.
WorkloadReference runtimev1alpha1.TypedReference `json:"workloadRef"`
}
// A ManualScalerTraitStatus represents the observed state of a
// ManualScalerTrait.
type ManualScalerTraitStatus struct {
runtimev1alpha1.ConditionedStatus `json:",inline"`
}
// +kubebuilder:object:root=true
// A ManualScalerTrait determines how many replicas a workload should have.
// +kubebuilder:resource:categories={crossplane,oam}
// +kubebuilder:subresource:status
type ManualScalerTrait struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec ManualScalerTraitSpec `json:"spec,omitempty"`
Status ManualScalerTraitStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// ManualScalerTraitList contains a list of ManualScalerTrait.
type ManualScalerTraitList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ManualScalerTrait `json:"items"`
}

View File

@@ -0,0 +1,548 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1alpha2
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
)
// A DefinitionReference refers to a CustomResourceDefinition by name.
type DefinitionReference struct {
// Name of the referenced CustomResourceDefinition.
Name string `json:"name"`
// Version indicate which version should be used if CRD has multiple versions
// by default it will use the first one if not specified
Version string `json:"version,omitempty"`
}
// A ChildResourceKind defines a child Kubernetes resource kind with a selector
type ChildResourceKind struct {
// APIVersion of the child resource
APIVersion string `json:"apiVersion"`
// Kind of the child resource
Kind string `json:"kind"`
// Selector to select the child resources that the workload wants to expose to traits
Selector map[string]string `json:"selector,omitempty"`
}
// A WorkloadDefinitionSpec defines the desired state of a WorkloadDefinition.
type WorkloadDefinitionSpec struct {
// Reference to the CustomResourceDefinition that defines this workload kind.
Reference DefinitionReference `json:"definitionRef"`
// ChildResourceKinds are the list of GVK of the child resources this workload generates
ChildResourceKinds []ChildResourceKind `json:"childResourceKinds,omitempty"`
// RevisionLabel indicates which label for underlying resources(e.g. pods) of this workload
// can be used by trait to create resource selectors(e.g. label selector for pods).
// +optional
RevisionLabel string `json:"revisionLabel,omitempty"`
// PodSpecPath indicates where/if this workload has K8s podSpec field
// if one workload has podSpec, trait can do lot's of assumption such as port, env, volume fields.
// +optional
PodSpecPath string `json:"podSpecPath,omitempty"`
// Extension is used for extension needs by OAM platform builders
// +optional
// +kubebuilder:pruning:PreserveUnknownFields
Extension *runtime.RawExtension `json:"extension,omitempty"`
}
// +kubebuilder:object:root=true
// A WorkloadDefinition registers a kind of Kubernetes custom resource as a
// valid OAM workload kind by referencing its CustomResourceDefinition. The CRD
// is used to validate the schema of the workload when it is embedded in an OAM
// Component.
// +kubebuilder:printcolumn:JSONPath=".spec.definitionRef.name",name=DEFINITION-NAME,type=string
// +kubebuilder:resource:scope=Cluster,categories={crossplane,oam}
type WorkloadDefinition struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec WorkloadDefinitionSpec `json:"spec,omitempty"`
}
// +kubebuilder:object:root=true
// WorkloadDefinitionList contains a list of WorkloadDefinition.
type WorkloadDefinitionList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []WorkloadDefinition `json:"items"`
}
// A TraitDefinitionSpec defines the desired state of a TraitDefinition.
type TraitDefinitionSpec struct {
// Reference to the CustomResourceDefinition that defines this trait kind.
Reference DefinitionReference `json:"definitionRef"`
// Revision indicates whether a trait is aware of component revision
// +optional
RevisionEnabled bool `json:"revisionEnabled,omitempty"`
// WorkloadRefPath indicates where/if a trait accepts a workloadRef object
// +optional
WorkloadRefPath string `json:"workloadRefPath,omitempty"`
// AppliesToWorkloads specifies the list of workload kinds this trait
// applies to. Workload kinds are specified in kind.group/version format,
// e.g. server.core.oam.dev/v1alpha2. Traits that omit this field apply to
// all workload kinds.
// +optional
AppliesToWorkloads []string `json:"appliesToWorkloads,omitempty"`
// Extension is used for extension needs by OAM platform builders
// +optional
// +kubebuilder:pruning:PreserveUnknownFields
Extension *runtime.RawExtension `json:"extension,omitempty"`
}
// +kubebuilder:object:root=true
// A TraitDefinition registers a kind of Kubernetes custom resource as a valid
// OAM trait kind by referencing its CustomResourceDefinition. The CRD is used
// to validate the schema of the trait when it is embedded in an OAM
// ApplicationConfiguration.
// +kubebuilder:printcolumn:JSONPath=".spec.definitionRef.name",name=DEFINITION-NAME,type=string
// +kubebuilder:resource:scope=Cluster,categories={crossplane,oam}
type TraitDefinition struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec TraitDefinitionSpec `json:"spec,omitempty"`
}
// +kubebuilder:object:root=true
// TraitDefinitionList contains a list of TraitDefinition.
type TraitDefinitionList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []TraitDefinition `json:"items"`
}
// A ScopeDefinitionSpec defines the desired state of a ScopeDefinition.
type ScopeDefinitionSpec struct {
// Reference to the CustomResourceDefinition that defines this scope kind.
Reference DefinitionReference `json:"definitionRef"`
// WorkloadRefsPath indicates if/where a scope accepts workloadRef objects
WorkloadRefsPath string `json:"workloadRefsPath,omitempty"`
// AllowComponentOverlap specifies whether an OAM component may exist in
// multiple instances of this kind of scope.
AllowComponentOverlap bool `json:"allowComponentOverlap"`
// Extension is used for extension needs by OAM platform builders
// +optional
// +kubebuilder:pruning:PreserveUnknownFields
Extension *runtime.RawExtension `json:"extension,omitempty"`
}
// +kubebuilder:object:root=true
// A ScopeDefinition registers a kind of Kubernetes custom resource as a valid
// OAM scope kind by referencing its CustomResourceDefinition. The CRD is used
// to validate the schema of the scope when it is embedded in an OAM
// ApplicationConfiguration.
// +kubebuilder:printcolumn:JSONPath=".spec.definitionRef.name",name=DEFINITION-NAME,type=string
// +kubebuilder:resource:scope=Cluster,categories={crossplane,oam}
type ScopeDefinition struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec ScopeDefinitionSpec `json:"spec,omitempty"`
}
// +kubebuilder:object:root=true
// ScopeDefinitionList contains a list of ScopeDefinition.
type ScopeDefinitionList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ScopeDefinition `json:"items"`
}
// A ComponentParameter defines a configurable parameter of a component.
type ComponentParameter struct {
// Name of this parameter. OAM ApplicationConfigurations will specify
// parameter values using this name.
Name string `json:"name"`
// FieldPaths specifies an array of fields within this Component's workload
// that will be overwritten by the value of this parameter. The type of the
// parameter (e.g. int, string) is inferred from the type of these fields;
// All fields must be of the same type. Fields are specified as JSON field
// paths without a leading dot, for example 'spec.replicas'.
FieldPaths []string `json:"fieldPaths"`
// +kubebuilder:default:=false
// Required specifies whether or not a value for this parameter must be
// supplied when authoring an ApplicationConfiguration.
// +optional
Required *bool `json:"required,omitempty"`
// Description of this parameter.
// +optional
Description *string `json:"description,omitempty"`
}
// A ComponentSpec defines the desired state of a Component.
type ComponentSpec struct {
// A Workload that will be created for each ApplicationConfiguration that
// includes this Component. Workload is an instance of a workloadDefinition.
// We either use the GVK info or a special "type" field in the workload to associate
// the content of the workload with its workloadDefinition
// +kubebuilder:validation:EmbeddedResource
// +kubebuilder:pruning:PreserveUnknownFields
Workload runtime.RawExtension `json:"workload"`
// Parameters exposed by this component. ApplicationConfigurations that
// reference this component may specify values for these parameters, which
// will in turn be injected into the embedded workload.
// +optional
Parameters []ComponentParameter `json:"parameters,omitempty"`
}
// A ComponentStatus represents the observed state of a Component.
type ComponentStatus struct {
// The generation observed by the component controller.
// +optional
ObservedGeneration int64 `json:"observedGeneration"`
runtimev1alpha1.ConditionedStatus `json:",inline"`
// LatestRevision of component
// +optional
LatestRevision *Revision `json:"latestRevision,omitempty"`
// One Component should only be used by one AppConfig
}
// Revision has name and revision number
type Revision struct {
Name string `json:"name"`
Revision int64 `json:"revision"`
}
// +kubebuilder:object:root=true
// A Component describes how an OAM workload kind may be instantiated.
// +kubebuilder:resource:categories={crossplane,oam}
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:JSONPath=".spec.workload.kind",name=WORKLOAD-KIND,type=string
// +kubebuilder:printcolumn:name="age",type="date",JSONPath=".metadata.creationTimestamp"
type Component struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec ComponentSpec `json:"spec,omitempty"`
Status ComponentStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// ComponentList contains a list of Component.
type ComponentList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Component `json:"items"`
}
// A ComponentParameterValue specifies a value for a named parameter. The
// associated component must publish a parameter with this name.
type ComponentParameterValue struct {
// Name of the component parameter to set.
Name string `json:"name"`
// Value to set.
Value intstr.IntOrString `json:"value"`
}
// A ComponentTrait specifies a trait that should be applied to a component.
type ComponentTrait struct {
// A Trait that will be created for the component
// +kubebuilder:validation:EmbeddedResource
// +kubebuilder:pruning:PreserveUnknownFields
Trait runtime.RawExtension `json:"trait"`
// DataOutputs specify the data output sources from this trait.
// +optional
DataOutputs []DataOutput `json:"dataOutputs,omitempty"`
// DataInputs specify the data input sinks into this trait.
// +optional
DataInputs []DataInput `json:"dataInputs,omitempty"`
}
// A ComponentScope specifies a scope in which a component should exist.
type ComponentScope struct {
// A ScopeReference must refer to an OAM scope resource.
ScopeReference runtimev1alpha1.TypedReference `json:"scopeRef"`
}
// An ApplicationConfigurationComponent specifies a component of an
// ApplicationConfiguration. Each component is used to instantiate a workload.
type ApplicationConfigurationComponent struct {
// ComponentName specifies a component whose latest revision will be bind
// with ApplicationConfiguration. When the spec of the referenced component
// changes, ApplicationConfiguration will automatically migrate all trait
// affect from the prior revision to the new one. This is mutually exclusive
// with RevisionName.
// +optional
ComponentName string `json:"componentName,omitempty"`
// RevisionName of a specific component revision to which to bind
// ApplicationConfiguration. This is mutually exclusive with componentName.
// +optional
RevisionName string `json:"revisionName,omitempty"`
// DataOutputs specify the data output sources from this component.
DataOutputs []DataOutput `json:"dataOutputs,omitempty"`
// DataInputs specify the data input sinks into this component.
DataInputs []DataInput `json:"dataInputs,omitempty"`
// ParameterValues specify values for the the specified component's
// parameters. Any parameter required by the component must be specified.
// +optional
ParameterValues []ComponentParameterValue `json:"parameterValues,omitempty"`
// Traits of the specified component.
// +optional
Traits []ComponentTrait `json:"traits,omitempty"`
// Scopes in which the specified component should exist.
// +optional
Scopes []ComponentScope `json:"scopes,omitempty"`
}
// An ApplicationConfigurationSpec defines the desired state of a
// ApplicationConfiguration.
type ApplicationConfigurationSpec struct {
// Components of which this ApplicationConfiguration consists. Each
// component will be used to instantiate a workload.
Components []ApplicationConfigurationComponent `json:"components"`
}
// A TraitStatus represents the state of a trait.
type TraitStatus string
// A WorkloadTrait represents a trait associated with a workload and its status
type WorkloadTrait struct {
// Status is a place holder for a customized controller to fill
// if it needs a single place to summarize the status of the trait
Status TraitStatus `json:"status,omitempty"`
// Reference to a trait created by an ApplicationConfiguration.
Reference runtimev1alpha1.TypedReference `json:"traitRef"`
// Message will allow controller to leave some additional information for this trait
Message string `json:"message,omitempty"`
}
// A ScopeStatus represents the state of a scope.
type ScopeStatus string
// A WorkloadScope represents a scope associated with a workload and its status
type WorkloadScope struct {
// Status is a place holder for a customized controller to fill
// if it needs a single place to summarize the status of the scope
Status ScopeStatus `json:"status,omitempty"`
// Reference to a scope created by an ApplicationConfiguration.
Reference runtimev1alpha1.TypedReference `json:"scopeRef"`
}
// A WorkloadStatus represents the status of a workload.
type WorkloadStatus struct {
// Status is a place holder for a customized controller to fill
// if it needs a single place to summarize the entire status of the workload
Status string `json:"status,omitempty"`
// ComponentName that produced this workload.
ComponentName string `json:"componentName,omitempty"`
// ComponentRevisionName of current component
ComponentRevisionName string `json:"componentRevisionName,omitempty"`
// Reference to a workload created by an ApplicationConfiguration.
Reference runtimev1alpha1.TypedReference `json:"workloadRef,omitempty"`
// Traits associated with this workload.
Traits []WorkloadTrait `json:"traits,omitempty"`
// Scopes associated with this workload.
Scopes []WorkloadScope `json:"scopes,omitempty"`
}
// HistoryWorkload contain the old component revision that are still running
type HistoryWorkload struct {
// Revision of this workload
Revision string `json:"revision,omitempty"`
// Reference to running workload.
Reference runtimev1alpha1.TypedReference `json:"workloadRef,omitempty"`
}
// A ApplicationStatus represents the state of the entire application.
type ApplicationStatus string
// An ApplicationConfigurationStatus represents the observed state of a
// ApplicationConfiguration.
type ApplicationConfigurationStatus struct {
runtimev1alpha1.ConditionedStatus `json:",inline"`
// Status is a place holder for a customized controller to fill
// if it needs a single place to summarize the status of the entire application
Status ApplicationStatus `json:"status,omitempty"`
Dependency DependencyStatus `json:"dependency,omitempty"`
// Workloads created by this ApplicationConfiguration.
Workloads []WorkloadStatus `json:"workloads,omitempty"`
// The generation observed by the appConfig controller.
// +optional
ObservedGeneration int64 `json:"observedGeneration"`
// HistoryWorkloads will record history but still working revision workloads.
HistoryWorkloads []HistoryWorkload `json:"historyWorkloads,omitempty"`
}
// DependencyStatus represents the observed state of the dependency of
// an ApplicationConfiguration.
type DependencyStatus struct {
Unsatisfied []UnstaifiedDependency `json:"unsatisfied,omitempty"`
}
// UnstaifiedDependency describes unsatisfied dependency flow between
// one pair of objects.
type UnstaifiedDependency struct {
Reason string `json:"reason"`
From DependencyFromObject `json:"from"`
To DependencyToObject `json:"to"`
}
// DependencyFromObject represents the object that dependency data comes from.
type DependencyFromObject struct {
runtimev1alpha1.TypedReference `json:",inline"`
FieldPath string `json:"fieldPath,omitempty"`
}
// DependencyToObject represents the object that dependency data goes to.
type DependencyToObject struct {
runtimev1alpha1.TypedReference `json:",inline"`
FieldPaths []string `json:"fieldPaths,omitempty"`
}
// +kubebuilder:object:root=true
// An ApplicationConfiguration represents an OAM application.
// +kubebuilder:resource:shortName=appconfig,categories={crossplane,oam}
// +kubebuilder:subresource:status
type ApplicationConfiguration struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec ApplicationConfigurationSpec `json:"spec,omitempty"`
Status ApplicationConfigurationStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// ApplicationConfigurationList contains a list of ApplicationConfiguration.
type ApplicationConfigurationList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ApplicationConfiguration `json:"items"`
}
// DataOutput specifies a data output source from an object.
type DataOutput struct {
// Name is the unique name of a DataOutput in an ApplicationConfiguration.
Name string `json:"name,omitempty"`
// FieldPath refers to the value of an object's field.
FieldPath string `json:"fieldPath,omitempty"`
// Conditions specify the conditions that should be satisfied before emitting a data output.
// Different conditions are AND-ed together.
// If no conditions is specified, it is by default to check output value not empty.
// +optional
Conditions []ConditionRequirement `json:"conditions,omitempty"`
}
// DataInput specifies a data input sink to an object.
// If input is array, it will be appended to the target field paths.
type DataInput struct {
// ValueFrom specifies the value source.
ValueFrom DataInputValueFrom `json:"valueFrom,omitempty"`
// ToFieldPaths specifies the field paths of an object to fill passed value.
ToFieldPaths []string `json:"toFieldPaths,omitempty"`
}
// DataInputValueFrom specifies the value source for a data input.
type DataInputValueFrom struct {
// DataOutputName matches a name of a DataOutput in the same AppConfig.
DataOutputName string `json:"dataOutputName"`
}
// ConditionRequirement specifies the requirement to match a value.
type ConditionRequirement struct {
Operator ConditionOperator `json:"op"`
// +optional
// Value specifies an expected value
// This is mutually exclusive with ValueFrom
Value string `json:"value,omitempty"`
// +optional
// ValueFrom specifies expected value from AppConfig
// This is mutually exclusive with Value
ValueFrom ValueFrom `json:"valueFrom,omitempty"`
// +optional
// FieldPath specifies got value from workload/trait object
FieldPath string `json:"fieldPath,omitempty"`
}
// ValueFrom gets value from AppConfig object by specifying a path
type ValueFrom struct {
FieldPath string `json:"fieldPath"`
}
// ConditionOperator specifies the operator to match a value.
type ConditionOperator string
const (
// ConditionEqual indicates equal to given value
ConditionEqual ConditionOperator = "eq"
// ConditionNotEqual indicates not equal to given value
ConditionNotEqual ConditionOperator = "notEq"
// ConditionNotEmpty indicates given value not empty
ConditionNotEmpty ConditionOperator = "notEmpty"
)

View File

@@ -0,0 +1,409 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package v1alpha2
package v1alpha2
import (
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"github.com/oam-dev/kubevela/pkg/oam"
)
// An OperatingSystem required by a containerised workload.
type OperatingSystem string
// Supported operating system types.
const (
OperatingSystemLinux OperatingSystem = "linux"
OperatingSystemWindows OperatingSystem = "windows"
)
// A CPUArchitecture required by a containerised workload.
type CPUArchitecture string
// Supported architectures
const (
CPUArchitectureI386 CPUArchitecture = "i386"
CPUArchitectureAMD64 CPUArchitecture = "amd64"
CPUArchitectureARM CPUArchitecture = "arm"
CPUArchitectureARM64 CPUArchitecture = "arm64"
)
// A SecretKeySelector is a reference to a secret key in an arbitrary namespace.
type SecretKeySelector struct {
// The name of the secret.
Name string `json:"name"`
// The key to select.
Key string `json:"key"`
}
// TODO(negz): The OAM spec calls for float64 quantities in some cases, but this
// is incompatible with controller-gen and Kubernetes API conventions. We should
// reassess whether resource.Quantity is appropriate after resolving
// https://github.com/oam-dev/spec/issues/313
// CPUResources required by a container.
type CPUResources struct {
// Required CPU count. 1.0 represents one CPU core.
Required resource.Quantity `json:"required"`
}
// MemoryResources required by a container.
type MemoryResources struct {
// Required memory.
Required resource.Quantity `json:"required"`
}
// GPUResources required by a container.
type GPUResources struct {
// Required GPU count.
Required resource.Quantity `json:"required"`
}
// DiskResource required by a container.
type DiskResource struct {
// Required disk space.
Required resource.Quantity `json:"required"`
// Ephemeral specifies whether an external disk needs to be mounted.
// +optional
Ephemeral *bool `json:"ephemeral,omitempty"`
}
// A VolumeAccessMode determines how a volume may be accessed.
type VolumeAccessMode string
// Volume access modes.
const (
VolumeAccessModeRO VolumeAccessMode = "RO"
VolumeAccessModeRW VolumeAccessMode = "RW"
)
// A VolumeSharingPolicy determines how a volume may be shared.
type VolumeSharingPolicy string
// Volume sharing policies.
const (
VolumeSharingPolicyExclusive VolumeSharingPolicy = "Exclusive"
VolumeSharingPolicyShared VolumeSharingPolicy = "Shared"
)
// VolumeResource required by a container.
type VolumeResource struct {
// Name of this volume. Must be unique within its container.
Name string `json:"name"`
// MountPath at which this volume will be mounted within its container.
MountPath string `json:"mountPath"`
// TODO(negz): Use +kubebuilder:default marker to default AccessMode to RW
// and SharingPolicy to Exclusive once we're generating v1 CRDs.
// AccessMode of this volume; RO (read only) or RW (read and write).
// +optional
// +kubebuilder:validation:Enum=RO;RW
AccessMode *VolumeAccessMode `json:"accessMode,omitempty"`
// SharingPolicy of this volume; Exclusive or Shared.
// +optional
// +kubebuilder:validation:Enum=Exclusive;Shared
SharingPolicy *VolumeSharingPolicy `json:"sharingPolicy,omitempty"`
// Disk requirements of this volume.
// +optional
Disk *DiskResource `json:"disk,omitempty"`
}
// ExtendedResource required by a container.
type ExtendedResource struct {
// Name of the external resource. Resource names are specified in
// kind.group/version format, e.g. motionsensor.ext.example.com/v1.
Name string `json:"name"`
// Required extended resource(s), e.g. 8 or "very-cool-widget"
Required intstr.IntOrString `json:"required"`
}
// ContainerResources specifies a container's required compute resources.
type ContainerResources struct {
// CPU required by this container.
CPU CPUResources `json:"cpu"`
// Memory required by this container.
Memory MemoryResources `json:"memory"`
// GPU required by this container.
// +optional
GPU *GPUResources `json:"gpu,omitempty"`
// Volumes required by this container.
// +optional
Volumes []VolumeResource `json:"volumes,omitempty"`
// Extended resources required by this container.
// +optional
Extended []ExtendedResource `json:"extended,omitempty"`
}
// A ContainerEnvVar specifies an environment variable that should be set within
// a container.
type ContainerEnvVar struct {
// Name of the environment variable. Must be composed of valid Unicode
// letter and number characters, as well as _ and -.
// +kubebuilder:validation:Pattern=^[-_a-zA-Z0-9]+$
Name string `json:"name"`
// Value of the environment variable.
// +optional
Value *string `json:"value,omitempty"`
// FromSecret is a secret key reference which can be used to assign a value
// to the environment variable.
// +optional
FromSecret *SecretKeySelector `json:"fromSecret,omitempty"`
}
// A ContainerConfigFile specifies a configuration file that should be written
// within a container.
type ContainerConfigFile struct {
// Path within the container at which the configuration file should be
// written.
Path string `json:"path"`
// Value that should be written to the configuration file.
// +optional
Value *string `json:"value,omitempty"`
// FromSecret is a secret key reference which can be used to assign a value
// to be written to the configuration file at the given path in the
// container.
// +optional
FromSecret *SecretKeySelector `json:"fromSecret,omitempty"`
}
// A TransportProtocol represents a transport layer protocol.
type TransportProtocol string
// Transport protocols.
const (
TransportProtocolTCP TransportProtocol = "TCP"
TransportProtocolUDP TransportProtocol = "UDP"
)
// A ContainerPort specifies a port that is exposed by a container.
type ContainerPort struct {
// Name of this port. Must be unique within its container. Must be lowercase
// alphabetical characters.
// +kubebuilder:validation:Pattern=^[a-z]+$
Name string `json:"name"`
// Port number. Must be unique within its container.
Port int32 `json:"containerPort"`
// TODO(negz): Use +kubebuilder:default marker to default Protocol to TCP
// once we're generating v1 CRDs.
// Protocol used by the server listening on this port.
// +kubebuilder:validation:Enum=TCP;UDP
// +optional
Protocol *TransportProtocol `json:"protocol,omitempty"`
}
// An ExecProbe probes a container's health by executing a command.
type ExecProbe struct {
// Command to be run by this probe.
Command []string `json:"command"`
}
// A HTTPHeader to be passed when probing a container.
type HTTPHeader struct {
// Name of this HTTP header. Must be unique per probe.
Name string `json:"name"`
// Value of this HTTP header.
Value string `json:"value"`
}
// A HTTPGetProbe probes a container's health by sending an HTTP GET request.
type HTTPGetProbe struct {
// Path to probe, e.g. '/healthz'.
Path string `json:"path"`
// Port to probe.
Port int32 `json:"port"`
// HTTPHeaders to send with the GET request.
// +optional
HTTPHeaders []HTTPHeader `json:"httpHeaders,omitempty"`
}
// A TCPSocketProbe probes a container's health by connecting to a TCP socket.
type TCPSocketProbe struct {
// Port this probe should connect to.
Port int32 `json:"port"`
}
// A ContainerHealthProbe specifies how to probe the health of a container.
// Exactly one of Exec, HTTPGet, or TCPSocket must be specified.
type ContainerHealthProbe struct {
// Exec probes a container's health by executing a command.
// +optional
Exec *ExecProbe `json:"exec,omitempty"`
// HTTPGet probes a container's health by sending an HTTP GET request.
// +optional
HTTPGet *HTTPGetProbe `json:"httpGet,omitempty"`
// TCPSocketProbe probes a container's health by connecting to a TCP socket.
// +optional
TCPSocket *TCPSocketProbe `json:"tcpSocket,omitempty"`
// InitialDelaySeconds after a container starts before the first probe.
// +optional
InitialDelaySeconds *int32 `json:"initialDelaySeconds,omitempty"`
// TODO(negz): Use +kubebuilder:default marker to default PeriodSeconds,
// TimeoutSeconds, SuccessThreshold, and FailureThreshold to 10, 1, 1, and 3
// respectively once we're generating v1 CRDs.
// PeriodSeconds between probes.
// +optional
PeriodSeconds *int32 `json:"periodSeconds,omitempty"`
// TimeoutSeconds after which the probe times out.
// +optional
TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty"`
// SuccessThreshold specifies how many consecutive probes must success in
// order for the container to be considered healthy.
// +optional
SuccessThreshold *int32 `json:"successThreshold,omitempty"`
// FailureThreshold specifies how many consecutive probes must fail in order
// for the container to be considered healthy.
// +optional
FailureThreshold *int32 `json:"failureThreshold,omitempty"`
}
// A Container represents an Open Containers Initiative (OCI) container.
type Container struct {
// Name of this container. Must be unique within its workload.
Name string `json:"name"`
// Image this container should run. Must be a path-like or URI-like
// representation of an OCI image. May be prefixed with a registry address
// and should be suffixed with a tag.
Image string `json:"image"`
// Resources required by this container
// +optional
Resources *ContainerResources `json:"resources,omitempty"`
// Command to be run by this container.
// +optional
Command []string `json:"command,omitempty"`
// Arguments to be passed to the command run by this container.
// +optional
Arguments []string `json:"args,omitempty"`
// Environment variables that should be set within this container.
// +optional
Environment []ContainerEnvVar `json:"env,omitempty"`
// ConfigFiles that should be written within this container.
// +optional
ConfigFiles []ContainerConfigFile `json:"config,omitempty"`
// Ports exposed by this container.
// +optional
Ports []ContainerPort `json:"ports,omitempty"`
// A LivenessProbe assesses whether this container is alive. Containers that
// fail liveness probes will be restarted.
// +optional
LivenessProbe *ContainerHealthProbe `json:"livenessProbe,omitempty"`
// A ReadinessProbe assesses whether this container is ready to serve
// requests. Containers that fail readiness probes will be withdrawn from
// service.
// +optional
ReadinessProbe *ContainerHealthProbe `json:"readinessProbe,omitempty"`
// TODO(negz): Ideally the key within this secret would be configurable, but
// the current OAM spec allows only a secret name.
// ImagePullSecret specifies the name of a Secret from which the
// credentials required to pull this container's image can be loaded.
// +optional
ImagePullSecret *string `json:"imagePullSecret,omitempty"`
}
// A ContainerizedWorkloadSpec defines the desired state of a
// ContainerizedWorkload.
type ContainerizedWorkloadSpec struct {
// OperatingSystem required by this workload.
// +kubebuilder:validation:Enum=linux;windows
// +optional
OperatingSystem *OperatingSystem `json:"osType,omitempty"`
// CPUArchitecture required by this workload.
// +kubebuilder:validation:Enum=i386;amd64;arm;arm64
// +optional
CPUArchitecture *CPUArchitecture `json:"arch,omitempty"`
// Containers of which this workload consists.
Containers []Container `json:"containers"`
}
// A ContainerizedWorkloadStatus represents the observed state of a
// ContainerizedWorkload.
type ContainerizedWorkloadStatus struct {
runtimev1alpha1.ConditionedStatus `json:",inline"`
// Resources managed by this containerised workload.
Resources []runtimev1alpha1.TypedReference `json:"resources,omitempty"`
}
var _ oam.Workload = &ContainerizedWorkload{}
// +kubebuilder:object:root=true
// A ContainerizedWorkload is a workload that runs OCI containers.
// +kubebuilder:resource:categories={crossplane,oam}
// +kubebuilder:subresource:status
type ContainerizedWorkload struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec ContainerizedWorkloadSpec `json:"spec,omitempty"`
Status ContainerizedWorkloadStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// ContainerizedWorkloadList contains a list of ContainerizedWorkload.
type ContainerizedWorkloadList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ContainerizedWorkload `json:"items"`
}

View File

@@ -0,0 +1,22 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package v1alpha2 contains resources relating to the Open Application Model.
// See https://github.com/oam-dev/spec for more details.
// +kubebuilder:object:generate=true
// +groupName=core.oam.dev
// +versionName=v1alpha2
package v1alpha2

View File

@@ -0,0 +1,93 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// This code is manually implemented, but should be generated in the future.
package v1alpha2
import (
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
)
// GetCondition of this ManualScalerTrait.
func (tr *ManualScalerTrait) GetCondition(ct runtimev1alpha1.ConditionType) runtimev1alpha1.Condition {
return tr.Status.GetCondition(ct)
}
// SetConditions of this ManualScalerTrait.
func (tr *ManualScalerTrait) SetConditions(c ...runtimev1alpha1.Condition) {
tr.Status.SetConditions(c...)
}
// GetWorkloadReference of this ManualScalerTrait.
func (tr *ManualScalerTrait) GetWorkloadReference() runtimev1alpha1.TypedReference {
return tr.Spec.WorkloadReference
}
// SetWorkloadReference of this ManualScalerTrait.
func (tr *ManualScalerTrait) SetWorkloadReference(r runtimev1alpha1.TypedReference) {
tr.Spec.WorkloadReference = r
}
// GetCondition of this ApplicationConfiguration.
func (ac *ApplicationConfiguration) GetCondition(ct runtimev1alpha1.ConditionType) runtimev1alpha1.Condition {
return ac.Status.GetCondition(ct)
}
// SetConditions of this ApplicationConfiguration.
func (ac *ApplicationConfiguration) SetConditions(c ...runtimev1alpha1.Condition) {
ac.Status.SetConditions(c...)
}
// GetCondition of this Component.
func (cm *Component) GetCondition(ct runtimev1alpha1.ConditionType) runtimev1alpha1.Condition {
return cm.Status.GetCondition(ct)
}
// SetConditions of this Component.
func (cm *Component) SetConditions(c ...runtimev1alpha1.Condition) {
cm.Status.SetConditions(c...)
}
// GetCondition of this ContainerizedWorkload.
func (wl *ContainerizedWorkload) GetCondition(ct runtimev1alpha1.ConditionType) runtimev1alpha1.Condition {
return wl.Status.GetCondition(ct)
}
// SetConditions of this ContainerizedWorkload.
func (wl *ContainerizedWorkload) SetConditions(c ...runtimev1alpha1.Condition) {
wl.Status.SetConditions(c...)
}
// GetCondition of this HealthScope.
func (hs *HealthScope) GetCondition(ct runtimev1alpha1.ConditionType) runtimev1alpha1.Condition {
return hs.Status.GetCondition(ct)
}
// SetConditions of this HealthScope.
func (hs *HealthScope) SetConditions(c ...runtimev1alpha1.Condition) {
hs.Status.SetConditions(c...)
}
// GetWorkloadReferences to get all workload references for scope.
func (hs *HealthScope) GetWorkloadReferences() []runtimev1alpha1.TypedReference {
return hs.Spec.WorkloadReferences
}
// AddWorkloadReference to add a workload reference to this scope.
func (hs *HealthScope) AddWorkloadReference(r runtimev1alpha1.TypedReference) {
hs.Spec.WorkloadReferences = append(hs.Spec.WorkloadReferences, r)
}

View File

@@ -0,0 +1,114 @@
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1alpha2
import (
"reflect"
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/scheme"
)
// Package type metadata.
const (
Group = "core.oam.dev"
Version = "v1alpha2"
)
var (
// SchemeGroupVersion is group version used to register these objects
SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version}
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
)
// WorkloadDefinition type metadata.
var (
WorkloadDefinitionKind = reflect.TypeOf(WorkloadDefinition{}).Name()
WorkloadDefinitionGroupKind = schema.GroupKind{Group: Group, Kind: WorkloadDefinitionKind}.String()
WorkloadDefinitionKindAPIVersion = WorkloadDefinitionKind + "." + SchemeGroupVersion.String()
WorkloadDefinitionGroupVersionKind = SchemeGroupVersion.WithKind(WorkloadDefinitionKind)
)
// TraitDefinition type metadata.
var (
TraitDefinitionKind = reflect.TypeOf(TraitDefinition{}).Name()
TraitDefinitionGroupKind = schema.GroupKind{Group: Group, Kind: TraitDefinitionKind}.String()
TraitDefinitionKindAPIVersion = TraitDefinitionKind + "." + SchemeGroupVersion.String()
TraitDefinitionGroupVersionKind = SchemeGroupVersion.WithKind(TraitDefinitionKind)
)
// ScopeDefinition type metadata.
var (
ScopeDefinitionKind = reflect.TypeOf(ScopeDefinition{}).Name()
ScopeDefinitionGroupKind = schema.GroupKind{Group: Group, Kind: ScopeDefinitionKind}.String()
ScopeDefinitionKindAPIVersion = ScopeDefinitionKind + "." + SchemeGroupVersion.String()
ScopeDefinitionGroupVersionKind = SchemeGroupVersion.WithKind(ScopeDefinitionKind)
)
// Component type metadata.
var (
ComponentKind = reflect.TypeOf(Component{}).Name()
ComponentGroupKind = schema.GroupKind{Group: Group, Kind: ComponentKind}.String()
ComponentKindAPIVersion = ComponentKind + "." + SchemeGroupVersion.String()
ComponentGroupVersionKind = SchemeGroupVersion.WithKind(ComponentKind)
)
// ApplicationConfiguration type metadata.
var (
ApplicationConfigurationKind = reflect.TypeOf(ApplicationConfiguration{}).Name()
ApplicationConfigurationGroupKind = schema.GroupKind{Group: Group, Kind: ApplicationConfigurationKind}.String()
ApplicationConfigurationKindAPIVersion = ApplicationConfigurationKind + "." + SchemeGroupVersion.String()
ApplicationConfigurationGroupVersionKind = SchemeGroupVersion.WithKind(ApplicationConfigurationKind)
)
// ContainerizedWorkload type metadata.
var (
ContainerizedWorkloadKind = reflect.TypeOf(ContainerizedWorkload{}).Name()
ContainerizedWorkloadGroupKind = schema.GroupKind{Group: Group, Kind: ContainerizedWorkloadKind}.String()
ContainerizedWorkloadKindAPIVersion = ContainerizedWorkloadKind + "." + SchemeGroupVersion.String()
ContainerizedWorkloadGroupVersionKind = SchemeGroupVersion.WithKind(ContainerizedWorkloadKind)
)
// ManualScalerTrait type metadata.
var (
ManualScalerTraitKind = reflect.TypeOf(ManualScalerTrait{}).Name()
ManualScalerTraitGroupKind = schema.GroupKind{Group: Group, Kind: ManualScalerTraitKind}.String()
ManualScalerTraitKindAPIVersion = ManualScalerTraitKind + "." + SchemeGroupVersion.String()
ManualScalerTraitGroupVersionKind = SchemeGroupVersion.WithKind(ManualScalerTraitKind)
)
// HealthScope type metadata.
var (
HealthScopeKind = reflect.TypeOf(HealthScope{}).Name()
HealthScopeGroupKind = schema.GroupKind{Group: Group, Kind: HealthScopeKind}.String()
HealthScopeKindAPIVersion = HealthScopeKind + "." + SchemeGroupVersion.String()
HealthScopeGroupVersionKind = SchemeGroupVersion.WithKind(HealthScopeKind)
)
func init() {
SchemeBuilder.Register(&WorkloadDefinition{}, &WorkloadDefinitionList{})
SchemeBuilder.Register(&TraitDefinition{}, &TraitDefinitionList{})
SchemeBuilder.Register(&ScopeDefinition{}, &ScopeDefinitionList{})
SchemeBuilder.Register(&Component{}, &ComponentList{})
SchemeBuilder.Register(&ApplicationConfiguration{}, &ApplicationConfigurationList{})
SchemeBuilder.Register(&ContainerizedWorkload{}, &ContainerizedWorkloadList{})
SchemeBuilder.Register(&ManualScalerTrait{}, &ManualScalerTraitList{})
SchemeBuilder.Register(&HealthScope{}, &HealthScopeList{})
SchemeBuilder.Register(&ApplicationDeployment{}, &ApplicationDeploymentList{})
}

File diff suppressed because it is too large Load Diff

21
apis/generate.go Normal file
View File

@@ -0,0 +1,21 @@
// +build generate
// See the below link for details on what is happening here.
// https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module
// NOTE(@wonderflow) We don't remove existing CRDs here, because the crd folders contain not only auto generated.
// Generate deepcopy methodsets and CRD manifests
//go:generate go run -tags generate sigs.k8s.io/controller-tools/cmd/controller-gen object:headerFile=../hack/boilerplate.go.txt paths=./... crd:crdVersions=v1 output:artifacts:config=../charts/vela-core/crds
// Generate legacy_support for K8s 1.12~1.15 versions CRD manifests
//go:generate go run -tags generate sigs.k8s.io/controller-tools/cmd/controller-gen object:headerFile=../hack/boilerplate.go.txt paths=./... crd:trivialVersions=true output:artifacts:config=../legacy/charts/vela-core-legacy/crds
//go:generate go run ../legacy/convert/main.go ../legacy/charts/vela-core-legacy/crds
//go:generate go run ../hack/crd/update.go ../charts/vela-core/crds/
package apis
import (
_ "sigs.k8s.io/controller-tools/cmd/controller-gen" //nolint:typecheck
)

View File

@@ -18,9 +18,10 @@ package v1alpha1
import (
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
"github.com/crossplane/oam-kubernetes-runtime/pkg/oam"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"github.com/oam-dev/kubevela/pkg/oam"
)
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.

View File

@@ -18,9 +18,10 @@ package v1alpha1
import (
cpv1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
"github.com/crossplane/oam-kubernetes-runtime/pkg/oam"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/oam-dev/kubevela/pkg/oam"
)
// PodSpecWorkloadSpec defines the desired state of PodSpecWorkload

View File

@@ -18,9 +18,10 @@ package v1alpha1
import (
runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
"github.com/crossplane/oam-kubernetes-runtime/pkg/oam"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"github.com/oam-dev/kubevela/pkg/oam"
)
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.

View File

@@ -1,7 +1,7 @@
// +build !ignore_autogenerated
/*
Copyright 2020 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

23
apis/types/args.go Normal file
View File

@@ -0,0 +1,23 @@
package types
import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client/config"
)
// Args is args for controller-runtime client
type Args struct {
Config *rest.Config
Schema *runtime.Scheme
}
// SetConfig insert kubeconfig into Args
func (a *Args) SetConfig() error {
restConf, err := config.GetConfig()
if err != nil {
return err
}
a.Config = restConf
return nil
}

View File

@@ -51,7 +51,7 @@ type Capability struct {
Status string `json:"status,omitempty"`
Description string `json:"description,omitempty"`
//trait only
// trait only
AppliesTo []string `json:"appliesTo,omitempty"`
// Plugin Source
@@ -73,7 +73,7 @@ type Chart struct {
// Installation defines the installation method for this Capability, currently only helm is supported
type Installation struct {
Helm Chart `json:"helm"`
//TODO(wonderflow) add raw yaml file support for install capability
// TODO(wonderflow) add raw yaml file support for install capability
}
// CapType defines the type of capability
@@ -119,6 +119,7 @@ func SetFlagBy(flags *pflag.FlagSet, v Parameter) {
if v.Alias != "" {
name = v.Alias
}
// nolint:exhaustive
switch v.Type {
case cue.IntKind:
var vv int64
@@ -150,6 +151,8 @@ func SetFlagBy(flags *pflag.FlagSet, v Parameter) {
vv = val
}
flags.Float64P(name, v.Short, vv, v.Usage)
default:
// other types not supported yet
}
}
@@ -160,6 +163,7 @@ var CapabilityCmpOptions = []cmp.Option{
a.Usage != b.Usage || a.Type != b.Type {
return false
}
// nolint:exhaustive
switch a.Type {
case cue.IntKind:
var va, vb int64
@@ -208,9 +212,11 @@ var CapabilityCmpOptions = []cmp.Option{
case int:
vb = float64(valb)
case float64:
vb = float64(valb)
vb = valb
}
return va == vb
default:
// complex type not supported, will regard them as not changed.
}
return true
})}

View File

@@ -27,47 +27,31 @@ spec:
description: An ApplicationConfiguration represents an OAM application.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: An ApplicationConfigurationSpec defines the desired state
of a ApplicationConfiguration.
description: An ApplicationConfigurationSpec defines the desired state of a ApplicationConfiguration.
properties:
components:
description: Components of which this ApplicationConfiguration consists.
Each component will be used to instantiate a workload.
description: Components of which this ApplicationConfiguration consists. Each component will be used to instantiate a workload.
items:
description: An ApplicationConfigurationComponent specifies a component
of an ApplicationConfiguration. Each component is used to instantiate
a workload.
description: An ApplicationConfigurationComponent specifies a component of an ApplicationConfiguration. Each component is used to instantiate a workload.
properties:
componentName:
description: ComponentName specifies a component whose latest
revision will be bind with ApplicationConfiguration. When
the spec of the referenced component changes, ApplicationConfiguration
will automatically migrate all trait affect from the prior
revision to the new one. This is mutually exclusive with RevisionName.
description: ComponentName specifies a component whose latest revision will be bind with ApplicationConfiguration. When the spec of the referenced component changes, ApplicationConfiguration will automatically migrate all trait affect from the prior revision to the new one. This is mutually exclusive with RevisionName.
type: string
dataInputs:
description: DataInputs specify the data input sinks into this
component.
description: DataInputs specify the data input sinks into this component.
items:
description: DataInput specifies a data input sink to an object.
If input is array, it will be appended to the target field
paths.
description: DataInput specifies a data input sink to an object. If input is array, it will be appended to the target field paths.
properties:
toFieldPaths:
description: ToFieldPaths specifies the field paths of
an object to fill passed value.
description: ToFieldPaths specifies the field paths of an object to fill passed value.
items:
type: string
type: array
@@ -75,8 +59,7 @@ spec:
description: ValueFrom specifies the value source.
properties:
dataOutputName:
description: DataOutputName matches a name of a DataOutput
in the same AppConfig.
description: DataOutputName matches a name of a DataOutput in the same AppConfig.
type: string
required:
- dataOutputName
@@ -84,38 +67,26 @@ spec:
type: object
type: array
dataOutputs:
description: DataOutputs specify the data output sources from
this component.
description: DataOutputs specify the data output sources from this component.
items:
description: DataOutput specifies a data output source from
an object.
description: DataOutput specifies a data output source from an object.
properties:
conditions:
description: Conditions specify the conditions that should
be satisfied before emitting a data output. Different
conditions are AND-ed together. If no conditions is
specified, it is by default to check output value not
empty.
description: Conditions specify the conditions that should be satisfied before emitting a data output. Different conditions are AND-ed together. If no conditions is specified, it is by default to check output value not empty.
items:
description: ConditionRequirement specifies the requirement
to match a value.
description: ConditionRequirement specifies the requirement to match a value.
properties:
fieldPath:
description: FieldPath specifies got value from
workload/trait object
description: FieldPath specifies got value from workload/trait object
type: string
op:
description: ConditionOperator specifies the operator
to match a value.
description: ConditionOperator specifies the operator to match a value.
type: string
value:
description: Value specifies an expected value This
is mutually exclusive with ValueFrom
description: Value specifies an expected value This is mutually exclusive with ValueFrom
type: string
valueFrom:
description: ValueFrom specifies expected value
from AppConfig This is mutually exclusive with
Value
description: ValueFrom specifies expected value from AppConfig This is mutually exclusive with Value
properties:
fieldPath:
type: string
@@ -127,23 +98,17 @@ spec:
type: object
type: array
fieldPath:
description: FieldPath refers to the value of an object's
field.
description: FieldPath refers to the value of an object's field.
type: string
name:
description: Name is the unique name of a DataOutput in
an ApplicationConfiguration.
description: Name is the unique name of a DataOutput in an ApplicationConfiguration.
type: string
type: object
type: array
parameterValues:
description: ParameterValues specify values for the the specified
component's parameters. Any parameter required by the component
must be specified.
description: ParameterValues specify values for the the specified component's parameters. Any parameter required by the component must be specified.
items:
description: A ComponentParameterValue specifies a value for
a named parameter. The associated component must publish
a parameter with this name.
description: A ComponentParameterValue specifies a value for a named parameter. The associated component must publish a parameter with this name.
properties:
name:
description: Name of the component parameter to set.
@@ -160,20 +125,15 @@ spec:
type: object
type: array
revisionName:
description: RevisionName of a specific component revision to
which to bind ApplicationConfiguration. This is mutually exclusive
with componentName.
description: RevisionName of a specific component revision to which to bind ApplicationConfiguration. This is mutually exclusive with componentName.
type: string
scopes:
description: Scopes in which the specified component should
exist.
description: Scopes in which the specified component should exist.
items:
description: A ComponentScope specifies a scope in which a
component should exist.
description: A ComponentScope specifies a scope in which a component should exist.
properties:
scopeRef:
description: A ScopeReference must refer to an OAM scope
resource.
description: A ScopeReference must refer to an OAM scope resource.
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -199,20 +159,15 @@ spec:
traits:
description: Traits of the specified component.
items:
description: A ComponentTrait specifies a trait that should
be applied to a component.
description: A ComponentTrait specifies a trait that should be applied to a component.
properties:
dataInputs:
description: DataInputs specify the data input sinks into
this trait.
description: DataInputs specify the data input sinks into this trait.
items:
description: DataInput specifies a data input sink to
an object. If input is array, it will be appended
to the target field paths.
description: DataInput specifies a data input sink to an object. If input is array, it will be appended to the target field paths.
properties:
toFieldPaths:
description: ToFieldPaths specifies the field paths
of an object to fill passed value.
description: ToFieldPaths specifies the field paths of an object to fill passed value.
items:
type: string
type: array
@@ -220,8 +175,7 @@ spec:
description: ValueFrom specifies the value source.
properties:
dataOutputName:
description: DataOutputName matches a name of
a DataOutput in the same AppConfig.
description: DataOutputName matches a name of a DataOutput in the same AppConfig.
type: string
required:
- dataOutputName
@@ -229,38 +183,26 @@ spec:
type: object
type: array
dataOutputs:
description: DataOutputs specify the data output sources
from this trait.
description: DataOutputs specify the data output sources from this trait.
items:
description: DataOutput specifies a data output source
from an object.
description: DataOutput specifies a data output source from an object.
properties:
conditions:
description: Conditions specify the conditions that
should be satisfied before emitting a data output.
Different conditions are AND-ed together. If no
conditions is specified, it is by default to check
output value not empty.
description: Conditions specify the conditions that should be satisfied before emitting a data output. Different conditions are AND-ed together. If no conditions is specified, it is by default to check output value not empty.
items:
description: ConditionRequirement specifies the
requirement to match a value.
description: ConditionRequirement specifies the requirement to match a value.
properties:
fieldPath:
description: FieldPath specifies got value
from workload/trait object
description: FieldPath specifies got value from workload/trait object
type: string
op:
description: ConditionOperator specifies the
operator to match a value.
description: ConditionOperator specifies the operator to match a value.
type: string
value:
description: Value specifies an expected value
This is mutually exclusive with ValueFrom
description: Value specifies an expected value This is mutually exclusive with ValueFrom
type: string
valueFrom:
description: ValueFrom specifies expected
value from AppConfig This is mutually exclusive
with Value
description: ValueFrom specifies expected value from AppConfig This is mutually exclusive with Value
properties:
fieldPath:
type: string
@@ -272,12 +214,10 @@ spec:
type: object
type: array
fieldPath:
description: FieldPath refers to the value of an
object's field.
description: FieldPath refers to the value of an object's field.
type: string
name:
description: Name is the unique name of a DataOutput
in an ApplicationConfiguration.
description: Name is the unique name of a DataOutput in an ApplicationConfiguration.
type: string
type: object
type: array
@@ -296,8 +236,7 @@ spec:
- components
type: object
status:
description: An ApplicationConfigurationStatus represents the observed
state of a ApplicationConfiguration.
description: An ApplicationConfigurationStatus represents the observed state of a ApplicationConfiguration.
properties:
conditions:
description: Conditions of the resource.
@@ -305,25 +244,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime
@@ -333,17 +267,14 @@ spec:
type: object
type: array
dependency:
description: DependencyStatus represents the observed state of the
dependency of an ApplicationConfiguration.
description: DependencyStatus represents the observed state of the dependency of an ApplicationConfiguration.
properties:
unsatisfied:
items:
description: UnstaifiedDependency describes unsatisfied dependency
flow between one pair of objects.
description: UnstaifiedDependency describes unsatisfied dependency flow between one pair of objects.
properties:
from:
description: DependencyFromObject represents the object
that dependency data comes from.
description: DependencyFromObject represents the object that dependency data comes from.
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -367,8 +298,7 @@ spec:
reason:
type: string
to:
description: DependencyToObject represents the object that
dependency data goes to.
description: DependencyToObject represents the object that dependency data goes to.
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -399,14 +329,12 @@ spec:
type: array
type: object
historyWorkloads:
description: HistoryWorkloads will record history but still working
revision workloads.
description: HistoryWorkloads will record history but still working revision workloads.
items:
description: HistoryWorkload contain the old component revision
that are still running
description: HistoryWorkload contain the old component revision that are still running
properties:
revision:
description: component revision of this workload
description: Revision of this workload
type: string
workloadRef:
description: Reference to running workload.
@@ -435,9 +363,7 @@ spec:
format: int64
type: integer
status:
description: Status is a place holder for a customized controller
to fill if it needs a single place to summarize the status of the
entire application
description: Status is a place holder for a customized controller to fill if it needs a single place to summarize the status of the entire application
type: string
workloads:
description: Workloads created by this ApplicationConfiguration.
@@ -453,8 +379,7 @@ spec:
scopes:
description: Scopes associated with this workload.
items:
description: A WorkloadScope represents a scope associated
with a workload and its status
description: A WorkloadScope represents a scope associated with a workload and its status
properties:
scopeRef:
description: Reference to a scope created by an ApplicationConfiguration.
@@ -477,29 +402,25 @@ spec:
- name
type: object
status:
description: Status is a place holder for a customized
controller to fill if it needs a single place to summarize
the status of the scope
description: Status is a place holder for a customized controller to fill if it needs a single place to summarize the status of the scope
type: string
required:
- scopeRef
type: object
type: array
status:
description: Status is a place holder for a customized controller
to fill if it needs a single place to summarize the entire
status of the workload
description: Status is a place holder for a customized controller to fill if it needs a single place to summarize the entire status of the workload
type: string
traits:
description: Traits associated with this workload.
items:
description: A WorkloadTrait represents a trait associated
with a workload and its status
description: A WorkloadTrait represents a trait associated with a workload and its status
properties:
message:
description: Message will allow controller to leave some additional information for this trait
type: string
status:
description: Status is a place holder for a customized
controller to fill if it needs a single place to summarize
the status of the trait
description: Status is a place holder for a customized controller to fill if it needs a single place to summarize the status of the trait
type: string
traitRef:
description: Reference to a trait created by an ApplicationConfiguration.

View File

@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.5
controller-gen.kubebuilder.io/version: v0.2.4
creationTimestamp: null
name: applicationdeployments.core.oam.dev
spec:
@@ -21,18 +21,13 @@ spec:
- name: v1alpha2
schema:
openAPIV3Schema:
description: ApplicationDeployment is the Schema for the ApplicationDeployment
API
description: ApplicationDeployment is the Schema for the ApplicationDeployment API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -40,8 +35,7 @@ spec:
description: ApplicationDeploymentSpec defines the desired state of ApplicationDeployment
type: object
status:
description: ApplicationDeploymentStatus defines the observed state of
ApplicationDeployment
description: ApplicationDeploymentStatus defines the observed state of ApplicationDeployment
properties:
conditions:
description: Conditions of the resource.
@@ -49,25 +43,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime

View File

@@ -0,0 +1,80 @@
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.4
creationTimestamp: null
name: applications.core.oam.dev
spec:
group: core.oam.dev
names:
kind: Application
listKind: ApplicationList
plural: applications
singular: application
scope: Namespaced
versions:
- name: v1alpha2
schema:
openAPIV3Schema:
description: Application is the Schema for the applications API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
type: object
x-kubernetes-preserve-unknown-fields: true
status:
description: AppStatus defines the observed state of Application
properties:
conditions:
description: Conditions of the resource.
items:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime
- reason
- status
- type
type: object
type: array
status:
description: ApplicationPhase is a label for the condition of a application at the current time
type: string
type: object
type: object
served: true
storage: true
subresources:
status: {}
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []

View File

@@ -32,14 +32,10 @@ spec:
description: A Component describes how an OAM workload kind may be instantiated.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -47,34 +43,24 @@ spec:
description: A ComponentSpec defines the desired state of a Component.
properties:
parameters:
description: Parameters exposed by this component. ApplicationConfigurations
that reference this component may specify values for these parameters,
which will in turn be injected into the embedded workload.
description: Parameters exposed by this component. ApplicationConfigurations that reference this component may specify values for these parameters, which will in turn be injected into the embedded workload.
items:
description: A ComponentParameter defines a configurable parameter
of a component.
description: A ComponentParameter defines a configurable parameter of a component.
properties:
description:
description: Description of this parameter.
type: string
fieldPaths:
description: FieldPaths specifies an array of fields within
this Component's workload that will be overwritten by the
value of this parameter. The type of the parameter (e.g. int,
string) is inferred from the type of these fields; All fields
must be of the same type. Fields are specified as JSON field
paths without a leading dot, for example 'spec.replicas'.
description: FieldPaths specifies an array of fields within this Component's workload that will be overwritten by the value of this parameter. The type of the parameter (e.g. int, string) is inferred from the type of these fields; All fields must be of the same type. Fields are specified as JSON field paths without a leading dot, for example 'spec.replicas'.
items:
type: string
type: array
name:
description: Name of this parameter. OAM ApplicationConfigurations
will specify parameter values using this name.
description: Name of this parameter. OAM ApplicationConfigurations will specify parameter values using this name.
type: string
required:
default: false
description: Required specifies whether or not a value for this
parameter must be supplied when authoring an ApplicationConfiguration.
description: Required specifies whether or not a value for this parameter must be supplied when authoring an ApplicationConfiguration.
type: boolean
required:
- fieldPaths
@@ -82,10 +68,7 @@ spec:
type: object
type: array
workload:
description: A Workload that will be created for each ApplicationConfiguration
that includes this Component. Workload is an instance of a workloadDefinition.
We either use the GVK info or a special "type" field in the workload
to associate the content of the workload with its workloadDefinition
description: A Workload that will be created for each ApplicationConfiguration that includes this Component. Workload is an instance of a workloadDefinition. We either use the GVK info or a special "type" field in the workload to associate the content of the workload with its workloadDefinition
type: object
x-kubernetes-embedded-resource: true
x-kubernetes-preserve-unknown-fields: true
@@ -101,25 +84,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime

View File

@@ -25,20 +25,15 @@ spec:
description: A ContainerizedWorkload is a workload that runs OCI containers.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: A ContainerizedWorkloadSpec defines the desired state of
a ContainerizedWorkload.
description: A ContainerizedWorkloadSpec defines the desired state of a ContainerizedWorkload.
properties:
arch:
description: CPUArchitecture required by this workload.
@@ -51,12 +46,10 @@ spec:
containers:
description: Containers of which this workload consists.
items:
description: A Container represents an Open Containers Initiative
(OCI) container.
description: A Container represents an Open Containers Initiative (OCI) container.
properties:
args:
description: Arguments to be passed to the command run by this
container.
description: Arguments to be passed to the command run by this container.
items:
type: string
type: array
@@ -66,16 +59,12 @@ spec:
type: string
type: array
config:
description: ConfigFiles that should be written within this
container.
description: ConfigFiles that should be written within this container.
items:
description: A ContainerConfigFile specifies a configuration
file that should be written within a container.
description: A ContainerConfigFile specifies a configuration file that should be written within a container.
properties:
fromSecret:
description: FromSecret is a secret key reference which
can be used to assign a value to be written to the configuration
file at the given path in the container.
description: FromSecret is a secret key reference which can be used to assign a value to be written to the configuration file at the given path in the container.
properties:
key:
description: The key to select.
@@ -88,27 +77,22 @@ spec:
- name
type: object
path:
description: Path within the container at which the configuration
file should be written.
description: Path within the container at which the configuration file should be written.
type: string
value:
description: Value that should be written to the configuration
file.
description: Value that should be written to the configuration file.
type: string
required:
- path
type: object
type: array
env:
description: Environment variables that should be set within
this container.
description: Environment variables that should be set within this container.
items:
description: A ContainerEnvVar specifies an environment variable
that should be set within a container.
description: A ContainerEnvVar specifies an environment variable that should be set within a container.
properties:
fromSecret:
description: FromSecret is a secret key reference which
can be used to assign a value to the environment variable.
description: FromSecret is a secret key reference which can be used to assign a value to the environment variable.
properties:
key:
description: The key to select.
@@ -121,9 +105,7 @@ spec:
- name
type: object
name:
description: Name of the environment variable. Must be
composed of valid Unicode letter and number characters,
as well as _ and -.
description: Name of the environment variable. Must be composed of valid Unicode letter and number characters, as well as _ and -.
pattern: ^[-_a-zA-Z0-9]+$
type: string
value:
@@ -134,22 +116,16 @@ spec:
type: object
type: array
image:
description: Image this container should run. Must be a path-like
or URI-like representation of an OCI image. May be prefixed
with a registry address and should be suffixed with a tag.
description: Image this container should run. Must be a path-like or URI-like representation of an OCI image. May be prefixed with a registry address and should be suffixed with a tag.
type: string
imagePullSecret:
description: ImagePullSecret specifies the name of a Secret
from which the credentials required to pull this container's
image can be loaded.
description: ImagePullSecret specifies the name of a Secret from which the credentials required to pull this container's image can be loaded.
type: string
livenessProbe:
description: A LivenessProbe assesses whether this container
is alive. Containers that fail liveness probes will be restarted.
description: A LivenessProbe assesses whether this container is alive. Containers that fail liveness probes will be restarted.
properties:
exec:
description: Exec probes a container's health by executing
a command.
description: Exec probes a container's health by executing a command.
properties:
command:
description: Command to be run by this probe.
@@ -160,24 +136,19 @@ spec:
- command
type: object
failureThreshold:
description: FailureThreshold specifies how many consecutive
probes must fail in order for the container to be considered
healthy.
description: FailureThreshold specifies how many consecutive probes must fail in order for the container to be considered healthy.
format: int32
type: integer
httpGet:
description: HTTPGet probes a container's health by sending
an HTTP GET request.
description: HTTPGet probes a container's health by sending an HTTP GET request.
properties:
httpHeaders:
description: HTTPHeaders to send with the GET request.
items:
description: A HTTPHeader to be passed when probing
a container.
description: A HTTPHeader to be passed when probing a container.
properties:
name:
description: Name of this HTTP header. Must be
unique per probe.
description: Name of this HTTP header. Must be unique per probe.
type: string
value:
description: Value of this HTTP header.
@@ -199,8 +170,7 @@ spec:
- port
type: object
initialDelaySeconds:
description: InitialDelaySeconds after a container starts
before the first probe.
description: InitialDelaySeconds after a container starts before the first probe.
format: int32
type: integer
periodSeconds:
@@ -208,14 +178,11 @@ spec:
format: int32
type: integer
successThreshold:
description: SuccessThreshold specifies how many consecutive
probes must success in order for the container to be considered
healthy.
description: SuccessThreshold specifies how many consecutive probes must success in order for the container to be considered healthy.
format: int32
type: integer
tcpSocket:
description: TCPSocketProbe probes a container's health
by connecting to a TCP socket.
description: TCPSocketProbe probes a container's health by connecting to a TCP socket.
properties:
port:
description: Port this probe should connect to.
@@ -225,33 +192,28 @@ spec:
- port
type: object
timeoutSeconds:
description: TimeoutSeconds after which the probe times
out.
description: TimeoutSeconds after which the probe times out.
format: int32
type: integer
type: object
name:
description: Name of this container. Must be unique within its
workload.
description: Name of this container. Must be unique within its workload.
type: string
ports:
description: Ports exposed by this container.
items:
description: A ContainerPort specifies a port that is exposed
by a container.
description: A ContainerPort specifies a port that is exposed by a container.
properties:
containerPort:
description: Port number. Must be unique within its container.
format: int32
type: integer
name:
description: Name of this port. Must be unique within
its container. Must be lowercase alphabetical characters.
description: Name of this port. Must be unique within its container. Must be lowercase alphabetical characters.
pattern: ^[a-z]+$
type: string
protocol:
description: Protocol used by the server listening on
this port.
description: Protocol used by the server listening on this port.
enum:
- TCP
- UDP
@@ -262,13 +224,10 @@ spec:
type: object
type: array
readinessProbe:
description: A ReadinessProbe assesses whether this container
is ready to serve requests. Containers that fail readiness
probes will be withdrawn from service.
description: A ReadinessProbe assesses whether this container is ready to serve requests. Containers that fail readiness probes will be withdrawn from service.
properties:
exec:
description: Exec probes a container's health by executing
a command.
description: Exec probes a container's health by executing a command.
properties:
command:
description: Command to be run by this probe.
@@ -279,24 +238,19 @@ spec:
- command
type: object
failureThreshold:
description: FailureThreshold specifies how many consecutive
probes must fail in order for the container to be considered
healthy.
description: FailureThreshold specifies how many consecutive probes must fail in order for the container to be considered healthy.
format: int32
type: integer
httpGet:
description: HTTPGet probes a container's health by sending
an HTTP GET request.
description: HTTPGet probes a container's health by sending an HTTP GET request.
properties:
httpHeaders:
description: HTTPHeaders to send with the GET request.
items:
description: A HTTPHeader to be passed when probing
a container.
description: A HTTPHeader to be passed when probing a container.
properties:
name:
description: Name of this HTTP header. Must be
unique per probe.
description: Name of this HTTP header. Must be unique per probe.
type: string
value:
description: Value of this HTTP header.
@@ -318,8 +272,7 @@ spec:
- port
type: object
initialDelaySeconds:
description: InitialDelaySeconds after a container starts
before the first probe.
description: InitialDelaySeconds after a container starts before the first probe.
format: int32
type: integer
periodSeconds:
@@ -327,14 +280,11 @@ spec:
format: int32
type: integer
successThreshold:
description: SuccessThreshold specifies how many consecutive
probes must success in order for the container to be considered
healthy.
description: SuccessThreshold specifies how many consecutive probes must success in order for the container to be considered healthy.
format: int32
type: integer
tcpSocket:
description: TCPSocketProbe probes a container's health
by connecting to a TCP socket.
description: TCPSocketProbe probes a container's health by connecting to a TCP socket.
properties:
port:
description: Port this probe should connect to.
@@ -344,8 +294,7 @@ spec:
- port
type: object
timeoutSeconds:
description: TimeoutSeconds after which the probe times
out.
description: TimeoutSeconds after which the probe times out.
format: int32
type: integer
type: object
@@ -356,8 +305,7 @@ spec:
description: CPU required by this container.
properties:
required:
description: Required CPU count. 1.0 represents one
CPU core.
description: Required CPU count. 1.0 represents one CPU core.
type: string
required:
- required
@@ -368,16 +316,13 @@ spec:
description: ExtendedResource required by a container.
properties:
name:
description: Name of the external resource. Resource
names are specified in kind.group/version format,
e.g. motionsensor.ext.example.com/v1.
description: Name of the external resource. Resource names are specified in kind.group/version format, e.g. motionsensor.ext.example.com/v1.
type: string
required:
anyOf:
- type: integer
- type: string
description: Required extended resource(s), e.g. 8
or "very-cool-widget"
description: Required extended resource(s), e.g. 8 or "very-cool-widget"
x-kubernetes-int-or-string: true
required:
- name
@@ -408,8 +353,7 @@ spec:
description: VolumeResource required by a container.
properties:
accessMode:
description: AccessMode of this volume; RO (read only)
or RW (read and write).
description: AccessMode of this volume; RO (read only) or RW (read and write).
enum:
- RO
- RW
@@ -418,8 +362,7 @@ spec:
description: Disk requirements of this volume.
properties:
ephemeral:
description: Ephemeral specifies whether an external
disk needs to be mounted.
description: Ephemeral specifies whether an external disk needs to be mounted.
type: boolean
required:
description: Required disk space.
@@ -428,16 +371,13 @@ spec:
- required
type: object
mountPath:
description: MountPath at which this volume will be
mounted within its container.
description: MountPath at which this volume will be mounted within its container.
type: string
name:
description: Name of this volume. Must be unique within
its container.
description: Name of this volume. Must be unique within its container.
type: string
sharingPolicy:
description: SharingPolicy of this volume; Exclusive
or Shared.
description: SharingPolicy of this volume; Exclusive or Shared.
enum:
- Exclusive
- Shared
@@ -466,8 +406,7 @@ spec:
- containers
type: object
status:
description: A ContainerizedWorkloadStatus represents the observed state
of a ContainerizedWorkload.
description: A ContainerizedWorkloadStatus represents the observed state of a ContainerizedWorkload.
properties:
conditions:
description: Conditions of the resource.
@@ -475,25 +414,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime
@@ -505,9 +439,7 @@ spec:
resources:
description: Resources managed by this containerised workload.
items:
description: A TypedReference refers to an object by Name, Kind,
and APIVersion. It is commonly used to reference cluster-scoped
objects or objects where the namespace is already known.
description: A TypedReference refers to an object by Name, Kind, and APIVersion. It is commonly used to reference cluster-scoped objects or objects where the namespace is already known.
properties:
apiVersion:
description: APIVersion of the referenced object.

View File

@@ -26,18 +26,13 @@ spec:
name: v1alpha2
schema:
openAPIV3Schema:
description: A HealthScope determines an aggregate health status based of
the health of components.
description: A HealthScope determines an aggregate health status based of the health of components.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -45,22 +40,17 @@ spec:
description: A HealthScopeSpec defines the desired state of a HealthScope.
properties:
probe-interval:
description: ProbeInterval is the amount of time in seconds between
probing tries.
description: ProbeInterval is the amount of time in seconds between probing tries.
format: int32
type: integer
probe-timeout:
description: ProbeTimeout is the amount of time in seconds to wait
when receiving a response before marked failure.
description: ProbeTimeout is the amount of time in seconds to wait when receiving a response before marked failure.
format: int32
type: integer
workloadRefs:
description: WorkloadReferences to the workloads that are in this
scope.
description: WorkloadReferences to the workloads that are in this scope.
items:
description: A TypedReference refers to an object by Name, Kind,
and APIVersion. It is commonly used to reference cluster-scoped
objects or objects where the namespace is already known.
description: A TypedReference refers to an object by Name, Kind, and APIVersion. It is commonly used to reference cluster-scoped objects or objects where the namespace is already known.
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -92,25 +82,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime
@@ -120,15 +105,12 @@ spec:
type: object
type: array
healthConditions:
description: WorkloadHealthConditions represents health condition
of workloads in the scope
description: WorkloadHealthConditions represents health condition of workloads in the scope
items:
description: WorkloadHealthCondition represents informative health
condition.
description: WorkloadHealthCondition represents informative health condition.
properties:
componentName:
description: ComponentName represents the component name if
target is a workload
description: ComponentName represents the component name if target is a workload
type: string
diagnosis:
type: string
@@ -136,9 +118,7 @@ spec:
description: HealthStatus represents health status strings.
type: string
targetWorkload:
description: A TypedReference refers to an object by Name, Kind,
and APIVersion. It is commonly used to reference cluster-scoped
objects or objects where the namespace is already known.
description: A TypedReference refers to an object by Name, Kind, and APIVersion. It is commonly used to reference cluster-scoped objects or objects where the namespace is already known.
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -158,16 +138,14 @@ spec:
- name
type: object
workloadStatus:
description: WorkloadStatus represents status of workloads whose
HealthStatus is UNKNOWN.
description: WorkloadStatus represents status of workloads whose HealthStatus is UNKNOWN.
type: string
required:
- healthStatus
type: object
type: array
scopeHealthCondition:
description: ScopeHealthCondition represents health condition summary
of the scope
description: ScopeHealthCondition represents health condition summary of the scope
properties:
healthStatus:
description: HealthStatus represents health status strings.

View File

@@ -22,18 +22,13 @@ spec:
- name: v1alpha2
schema:
openAPIV3Schema:
description: A ManualScalerTrait determines how many replicas a workload should
have.
description: A ManualScalerTrait determines how many replicas a workload should have.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -45,8 +40,7 @@ spec:
format: int32
type: integer
workloadRef:
description: WorkloadReference to the workload this trait applies
to.
description: WorkloadReference to the workload this trait applies to.
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -70,8 +64,7 @@ spec:
- workloadRef
type: object
status:
description: A ManualScalerTraitStatus represents the observed state of
a ManualScalerTrait.
description: A ManualScalerTraitStatus represents the observed state of a ManualScalerTrait.
properties:
conditions:
description: Conditions of the resource.
@@ -79,25 +72,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime

View File

@@ -26,20 +26,13 @@ spec:
name: v1alpha2
schema:
openAPIV3Schema:
description: A ScopeDefinition registers a kind of Kubernetes custom resource
as a valid OAM scope kind by referencing its CustomResourceDefinition. The
CRD is used to validate the schema of the scope when it is embedded in an
OAM ApplicationConfiguration.
description: A ScopeDefinition registers a kind of Kubernetes custom resource as a valid OAM scope kind by referencing its CustomResourceDefinition. The CRD is used to validate the schema of the scope when it is embedded in an OAM ApplicationConfiguration.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -47,27 +40,26 @@ spec:
description: A ScopeDefinitionSpec defines the desired state of a ScopeDefinition.
properties:
allowComponentOverlap:
description: AllowComponentOverlap specifies whether an OAM component
may exist in multiple instances of this kind of scope.
description: AllowComponentOverlap specifies whether an OAM component may exist in multiple instances of this kind of scope.
type: boolean
definitionRef:
description: Reference to the CustomResourceDefinition that defines
this scope kind.
description: Reference to the CustomResourceDefinition that defines this scope kind.
properties:
name:
description: Name of the referenced CustomResourceDefinition.
type: string
version:
description: Version indicate which version should be used if CRD has multiple versions by default it will use the first one if not specified
type: string
required:
- name
type: object
extension:
description: Extension is used for extension needs by OAM platform
builders
description: Extension is used for extension needs by OAM platform builders
type: object
x-kubernetes-preserve-unknown-fields: true
workloadRefsPath:
description: WorkloadRefsPath indicates if/where a scope accepts workloadRef
objects
description: WorkloadRefsPath indicates if/where a scope accepts workloadRef objects
type: string
required:
- allowComponentOverlap

View File

@@ -26,20 +26,13 @@ spec:
name: v1alpha2
schema:
openAPIV3Schema:
description: A TraitDefinition registers a kind of Kubernetes custom resource
as a valid OAM trait kind by referencing its CustomResourceDefinition. The
CRD is used to validate the schema of the trait when it is embedded in an
OAM ApplicationConfiguration.
description: A TraitDefinition registers a kind of Kubernetes custom resource as a valid OAM trait kind by referencing its CustomResourceDefinition. The CRD is used to validate the schema of the trait when it is embedded in an OAM ApplicationConfiguration.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -47,35 +40,31 @@ spec:
description: A TraitDefinitionSpec defines the desired state of a TraitDefinition.
properties:
appliesToWorkloads:
description: AppliesToWorkloads specifies the list of workload kinds
this trait applies to. Workload kinds are specified in kind.group/version
format, e.g. server.core.oam.dev/v1alpha2. Traits that omit this
field apply to all workload kinds.
description: AppliesToWorkloads specifies the list of workload kinds this trait applies to. Workload kinds are specified in kind.group/version format, e.g. server.core.oam.dev/v1alpha2. Traits that omit this field apply to all workload kinds.
items:
type: string
type: array
definitionRef:
description: Reference to the CustomResourceDefinition that defines
this trait kind.
description: Reference to the CustomResourceDefinition that defines this trait kind.
properties:
name:
description: Name of the referenced CustomResourceDefinition.
type: string
version:
description: Version indicate which version should be used if CRD has multiple versions by default it will use the first one if not specified
type: string
required:
- name
type: object
extension:
description: Extension is used for extension needs by OAM platform
builders
description: Extension is used for extension needs by OAM platform builders
type: object
x-kubernetes-preserve-unknown-fields: true
revisionEnabled:
description: Revision indicates whether a trait is aware of component
revision
description: Revision indicates whether a trait is aware of component revision
type: boolean
workloadRefPath:
description: WorkloadRefPath indicates where/if a trait accepts a
workloadRef object
description: WorkloadRefPath indicates where/if a trait accepts a workloadRef object
type: string
required:
- definitionRef

View File

@@ -26,20 +26,13 @@ spec:
name: v1alpha2
schema:
openAPIV3Schema:
description: A WorkloadDefinition registers a kind of Kubernetes custom resource
as a valid OAM workload kind by referencing its CustomResourceDefinition.
The CRD is used to validate the schema of the workload when it is embedded
in an OAM Component.
description: A WorkloadDefinition registers a kind of Kubernetes custom resource as a valid OAM workload kind by referencing its CustomResourceDefinition. The CRD is used to validate the schema of the workload when it is embedded in an OAM Component.
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -47,11 +40,9 @@ spec:
description: A WorkloadDefinitionSpec defines the desired state of a WorkloadDefinition.
properties:
childResourceKinds:
description: ChildResourceKinds are the list of GVK of the child resources
this workload generates
description: ChildResourceKinds are the list of GVK of the child resources this workload generates
items:
description: A ChildResourceKind defines a child Kubernetes resource
kind with a selector
description: A ChildResourceKind defines a child Kubernetes resource kind with a selector
properties:
apiVersion:
description: APIVersion of the child resource
@@ -62,8 +53,7 @@ spec:
selector:
additionalProperties:
type: string
description: Selector to select the child resources that the
workload wants to expose to traits
description: Selector to select the child resources that the workload wants to expose to traits
type: object
required:
- apiVersion
@@ -71,29 +61,26 @@ spec:
type: object
type: array
definitionRef:
description: Reference to the CustomResourceDefinition that defines
this workload kind.
description: Reference to the CustomResourceDefinition that defines this workload kind.
properties:
name:
description: Name of the referenced CustomResourceDefinition.
type: string
version:
description: Version indicate which version should be used if CRD has multiple versions by default it will use the first one if not specified
type: string
required:
- name
type: object
extension:
description: Extension is used for extension needs by OAM platform
builders
description: Extension is used for extension needs by OAM platform builders
type: object
x-kubernetes-preserve-unknown-fields: true
podSpecPath:
description: PodSpecPath indicates where/if this workload has K8s
podSpec field if one workload has podSpec, trait can do lot's of
assumption such as port, env, volume fields.
description: PodSpecPath indicates where/if this workload has K8s podSpec field if one workload has podSpec, trait can do lot's of assumption such as port, env, volume fields.
type: string
revisionLabel:
description: RevisionLabel indicates which label for underlying resources(e.g.
pods) of this workload can be used by trait to create resource selectors(e.g.
label selector for pods).
description: RevisionLabel indicates which label for underlying resources(e.g. pods) of this workload can be used by trait to create resource selectors(e.g. label selector for pods).
type: string
required:
- definitionRef

View File

@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.5
controller-gen.kubebuilder.io/version: v0.2.4
creationTimestamp: null
name: autoscalers.standard.oam.dev
spec:
@@ -24,14 +24,10 @@ spec:
description: Autoscaler is the Schema for the autoscalers API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -47,9 +43,7 @@ spec:
format: int32
type: integer
targetWorkload:
description: TargetWorkload specify the workload which is going to
be scaled, it could be WorkloadReference or the child resource of
it
description: TargetWorkload specify the workload which is going to be scaled, it could be WorkloadReference or the child resource of it
properties:
apiVersion:
type: string
@@ -71,8 +65,7 @@ spec:
description: Condition set the condition when to trigger scaling
type: object
name:
description: Name is the trigger name, if not set, it will be
automatically generated and make it globally unique
description: Name is the trigger name, if not set, it will be automatically generated and make it globally unique
type: string
type:
description: Type allows value in [cpu/memory/storage/ephemeral-storage、cron、pps、qps/rps、custom]
@@ -114,25 +107,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime

View File

@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.5
controller-gen.kubebuilder.io/version: v0.2.4
creationTimestamp: null
name: metricstraits.standard.oam.dev
spec:
@@ -24,14 +24,10 @@ spec:
description: MetricsTrait is the Schema for the metricstraits API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -45,8 +41,7 @@ spec:
description: The default is true
type: boolean
format:
description: The format of the metrics data, The default and only
supported format is "prometheus" for now
description: The format of the metrics data, The default and only supported format is "prometheus" for now
type: string
path:
description: HTTP path to scrape for metrics. default is /metrics
@@ -55,27 +50,19 @@ spec:
anyOf:
- type: integer
- type: string
description: Number or name of the port to access on the pods
targeted by the service. The default is discovered automatically
from podTemplate, metricTrait will create a service for the
workload
description: Number or name of the port to access on the pods targeted by the service. The default is discovered automatically from podTemplate, metricTrait will create a service for the workload
x-kubernetes-int-or-string: true
scheme:
description: Scheme at which metrics should be scraped The default
and only supported scheme is "http"
description: Scheme at which metrics should be scraped The default and only supported scheme is "http"
type: string
selector:
additionalProperties:
type: string
description: Route service traffic to pods with label keys and
values matching this The default is discovered automatically
from podTemplate. If no podTemplate, use the labels specified
here, or use the labels of the workload
description: Route service traffic to pods with label keys and values matching this The default is discovered automatically from podTemplate. If no podTemplate, use the labels specified here, or use the labels of the workload
type: object
type: object
workloadRef:
description: WorkloadReference to the workload whose metrics needs
to be exposed
description: WorkloadReference to the workload whose metrics needs to be exposed
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -106,25 +93,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.5
controller-gen.kubebuilder.io/version: v0.2.4
creationTimestamp: null
name: routes.standard.oam.dev
spec:
@@ -24,14 +24,10 @@ spec:
description: Route is the Schema for the routes API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
@@ -42,8 +38,7 @@ spec:
description: Host is the host of the route
type: string
provider:
description: Provider indicate which ingress controller implementation
the route trait will use, by default it's nginx-ingress
description: Provider indicate which ingress controller implementation the route trait will use, by default it's nginx-ingress
type: string
rules:
description: Rules contain multiple rules of route
@@ -51,46 +46,38 @@ spec:
description: Rule defines to route rule
properties:
backend:
description: Backend indicate how to connect backend service
If it's nil, will auto discovery
description: Backend indicate how to connect backend service If it's nil, will auto discovery
properties:
backendService:
description: BackendService specifies the backend K8s service
and port, it's optional
description: BackendService specifies the backend K8s service and port, it's optional
properties:
port:
anyOf:
- type: integer
- type: string
description: Port allow you direct specify backend service
port.
description: Port allow you direct specify backend service port.
x-kubernetes-int-or-string: true
serviceName:
description: ServiceName allow you direct specify K8s
service for backend service.
description: ServiceName allow you direct specify K8s service for backend service.
type: string
required:
- port
- serviceName
type: object
readTimeout:
description: ReadTimeout used for setting read timeout duration
for backend service, the unit is second.
description: ReadTimeout used for setting read timeout duration for backend service, the unit is second.
type: integer
sendTimeout:
description: SendTimeout used for setting send timeout duration
for backend service, the unit is second.
description: SendTimeout used for setting send timeout duration for backend service, the unit is second.
type: integer
type: object
customHeaders:
additionalProperties:
type: string
description: CustomHeaders pass a custom list of headers to
the backend service.
description: CustomHeaders pass a custom list of headers to the backend service.
type: object
defaultBackend:
description: DefaultBackend will become the ingress default
backend if the backend is not available
description: DefaultBackend will become the ingress default backend if the backend is not available
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -110,34 +97,28 @@ spec:
- name
type: object
name:
description: Name will become the suffix of underlying ingress
created by this rule, if not, will use index as suffix.
description: Name will become the suffix of underlying ingress created by this rule, if not, will use index as suffix.
type: string
path:
description: Path is location Path, default for "/"
type: string
rewriteTarget:
description: RewriteTarget will rewrite request from Path to
RewriteTarget path.
description: RewriteTarget will rewrite request from Path to RewriteTarget path.
type: string
type: object
type: array
tls:
description: TLS indicate route trait will create SSL secret using
cert-manager with specified issuer If this is nil, route trait will
use a selfsigned issuer
description: TLS indicate route trait will create SSL secret using cert-manager with specified issuer If this is nil, route trait will use a selfsigned issuer
properties:
issuerName:
type: string
type:
default: Issuer
description: Type indicate the issuer is ClusterIssuer or Issuer(namespace
issuer), by default, it's Issuer
description: Type indicate the issuer is ClusterIssuer or Issuer(namespace issuer), by default, it's Issuer
type: string
type: object
workloadRef:
description: WorkloadReference to the workload whose metrics needs
to be exposed
description: WorkloadReference to the workload whose metrics needs to be exposed
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -168,25 +149,20 @@ spec:
description: A Condition that may apply to a resource.
properties:
lastTransitionTime:
description: LastTransitionTime is the last time this condition
transitioned from one status to another.
description: LastTransitionTime is the last time this condition transitioned from one status to another.
format: date-time
type: string
message:
description: A Message containing details about this condition's
last transition from one status to another, if any.
description: A Message containing details about this condition's last transition from one status to another, if any.
type: string
reason:
description: A Reason for this condition's last transition from
one status to another.
description: A Reason for this condition's last transition from one status to another.
type: string
status:
description: Status of this condition; is it currently True,
False, or Unknown?
description: Status of this condition; is it currently True, False, or Unknown?
type: string
type:
description: Type of this condition. At most one of each condition
type may apply to a resource at any point in time.
description: Type of this condition. At most one of each condition type may apply to a resource at any point in time.
type: string
required:
- lastTransitionTime
@@ -197,9 +173,7 @@ spec:
type: array
ingresses:
items:
description: A TypedReference refers to an object by Name, Kind,
and APIVersion. It is commonly used to reference cluster-scoped
objects or objects where the namespace is already known.
description: A TypedReference refers to an object by Name, Kind, and APIVersion. It is commonly used to reference cluster-scoped objects or objects where the namespace is already known.
properties:
apiVersion:
description: APIVersion of the referenced object.
@@ -220,9 +194,7 @@ spec:
type: object
type: array
service:
description: A TypedReference refers to an object by Name, Kind, and
APIVersion. It is commonly used to reference cluster-scoped objects
or objects where the namespace is already known.
description: A TypedReference refers to an object by Name, Kind, and APIVersion. It is commonly used to reference cluster-scoped objects or objects where the namespace is already known.
properties:
apiVersion:
description: APIVersion of the referenced object.

View File

@@ -840,7 +840,7 @@ spec:
ports:
- name: https
port: 443
targetPort: 10250
targetPort: 13622
selector:
app.kubernetes.io/component: webhook
app.kubernetes.io/instance: cert-manager
@@ -881,7 +881,7 @@ spec:
valueFrom:
fieldRef:
fieldPath: metadata.namespace
image: quay.io/jetstack/cert-manager-cainjector:v1.0.3
image: quay.io/jetstack/cert-manager-cainjector:v1.1.0
imagePullPolicy: IfNotPresent
name: cert-manager
resources: {}
@@ -926,7 +926,7 @@ spec:
valueFrom:
fieldRef:
fieldPath: metadata.namespace
image: quay.io/jetstack/cert-manager-controller:v1.0.3
image: quay.io/jetstack/cert-manager-controller:v1.1.0
imagePullPolicy: IfNotPresent
name: cert-manager
ports:
@@ -963,7 +963,7 @@ spec:
containers:
- args:
- --v=2
- --secure-port=10250
- --secure-port=13622
- --dynamic-serving-ca-secret-namespace=$(POD_NAMESPACE)
- --dynamic-serving-ca-secret-name=cert-manager-webhook-ca
- --dynamic-serving-dns-names=cert-manager-webhook,cert-manager-webhook.cert-manager,cert-manager-webhook.cert-manager.svc
@@ -972,7 +972,7 @@ spec:
valueFrom:
fieldRef:
fieldPath: metadata.namespace
image: quay.io/jetstack/cert-manager-webhook:v1.0.3
image: quay.io/jetstack/cert-manager-webhook:v1.1.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
@@ -986,7 +986,7 @@ spec:
timeoutSeconds: 1
name: cert-manager
ports:
- containerPort: 10250
- containerPort: 13622
name: https
readinessProbe:
failureThreshold: 3

View File

@@ -1,9 +1,10 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: autoscale
annotations:
definition.oam.dev/description: "Automatically scale the app following certain triggers or metrics"
definition.oam.dev/description: "`Autoscale` is used to automatically scale workloads by resource utilization metrics or cron triggers."
spec:
appliesToWorkloads:
- webservice
@@ -58,24 +59,24 @@ spec:
}
parameter: {
// +usage=minimal replicas of the workload
// +usage=Minimal replicas of the workload
min: int
// +usage=maximal replicas of the workload
// +usage=Maximal replicas of the workload
max: int
// +usage=specify the value for CPU utilization, like 80, which means 80%
// +usage=Specify the value for CPU utilization, like 80, which means 80%
// +alias=cpu-percent
cpuPercent?: int
// +usage=just for `appfile`, not available for Cli usage
// +usage=Cron type auto-scaling. Just for `appfile`, not available for Cli usage
cron?: {
// +usage=the time to start scaling, like `08:00`
// +usage=The time to start scaling, like `08:00`
startAt: string
// +usage=for how long the scaling will last
// +usage=For how long the scaling will last
duration: string
// +usage=several workdays or weekends, like "Monday, Tuesday"
// +usage=Several workdays or weekends, like "Monday, Tuesday"
days: string
// +usage=the target replicas to be scaled to
// +usage=The target replicas to be scaled to
replicas: int
// +usage=timezone, like "America/Los_Angeles"
// +usage=Timezone, like "America/Los_Angeles"
timezone: string
}
}

View File

@@ -1,8 +1,9 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
annotations:
definition.oam.dev/description: "Manually scale the app"
definition.oam.dev/description: "`Scaler` is used to configure replicas for your service."
name: scaler
spec:
appliesToWorkloads:
@@ -22,6 +23,7 @@ spec:
}
parameter: {
//+short=r
//+usage=Replicas of the workload
replicas: *1 | int
}

View File

@@ -1,9 +1,10 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: metrics
annotations:
definition.oam.dev/description: "Configure metrics targets to be monitored for the app"
definition.oam.dev/description: "`Metrics` is used to configure monitoring metrics for your service."
spec:
appliesToWorkloads:
- webservice
@@ -22,16 +23,17 @@ spec:
}
}
parameter: {
// +usage=format of the metrics, default as prometheus
// +usage=Format of the metrics, default as prometheus
// +short=f
format: *"prometheus" | string
// +usage= the metrics path of the service
path: *"/metrics" | string
// +usage=The metrics path of the service
path: *"/metrics" | string
// +usage=The way to retrieve data which can take the values `http` or `https`
scheme: *"http" | string
enabled: *true | bool
// +usage= the port for metrics, will discovery automatically by default
// +usage=The port for metrics, will discovery automatically by default
port: *0 | >=1024 & <=65535 & int
// +usage= the label selector for the pods, will discovery automatically by default
// +usage=The label selector for the pods, will discovery automatically by default
selector?: [string]: string
}

View File

@@ -1,9 +1,10 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: rollout
annotations:
definition.oam.dev/description: "Configure canary deployment strategy to release the app"
definition.oam.dev/description: "`Rollout` is used to configure Canary deployment strategy for your application."
spec:
appliesToWorkloads:
- webservice
@@ -41,11 +42,12 @@ spec:
}
}
parameter: {
// +usage=total replicas of the workload
// +usage=Total replicas of the workload
replicas: *2 | int
// +alias=step-weight
// +usage=weight percent of every step in rolling update
// +usage=Weight percent of every step in rolling update
stepWeight: *50 | int
interval: *"30s" | string
// +usage=Schedule interval time
interval: *"30s" | string
}

View File

@@ -1,9 +1,10 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: route
annotations:
definition.oam.dev/description: "Configure route policy to the app"
definition.oam.dev/description: "`Route` is used to configure external access to your service."
spec:
appliesToWorkloads:
- webservice
@@ -30,7 +31,9 @@ spec:
}
}
parameter: {
// +usage= Domain name
domain: *"" | string
issuer: *"" | string
rules?: [...{
path: string

View File

@@ -1,21 +1,23 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: WorkloadDefinition
metadata:
name: task
annotations:
definition.oam.dev/description: "One-off task to run a piece of code or script to completion"
definition.oam.dev/description: "`Task` is a workload type to describe jobs that run code or a script to completion."
spec:
definitionRef:
name: jobs
name: jobs.batch
extension:
template: |
output: {
apiVersion: "v1"
apiVersion: "batch/v1"
kind: "Job"
spec: {
parallelism: parameter.count
completions: parameter.count
template: spec: {
restartPolicy: parameter.restart
containers: [{
name: context.name
image: parameter.image
@@ -36,6 +38,10 @@ spec:
// +short=i
image: string
// +usage=Define the job restart policy, the value can only be Never or OnFailure. By default, it's Never.
restart: *"Never" | string
// +usage=Commands to run in the container
cmd?: [...string]
}

View File

@@ -1,9 +1,11 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: WorkloadDefinition
metadata:
name: webservice
annotations:
definition.oam.dev/description: "Long-running scalable service with stable endpoint to receive external traffic"
definition.oam.dev/description: "`Webservice` is a workload type to describe long-running, scalable, containerized services that have a stable network endpoint to receive external network traffic from customers.
If workload type is skipped for any service defined in Appfile, it will be defaulted to `Web Service` type."
spec:
definitionRef:
name: deployments.apps
@@ -61,19 +63,26 @@ spec:
// +short=i
image: string
// +usage=Commands to run in the container
cmd?: [...string]
// +usage=Which port do you want customer traffic sent to
// +short=p
port: *80 | int
// +usage=Define arguments by using environment variables
env?: [...{
name: string
// +usage=Environment variable name
name: string
// +usage=The value of the environment variable
value?: string
// +usage=Specifies a source the value of this var should come from
valueFrom?: {
// +usage=Selects a key of a secret in the pod's namespace
secretKeyRef: {
// +usage=The name of the secret in the pod's namespace to select from
name: string
key: string
// +usage=The key of the secret to select from. Must be a valid secret key
key: string
}
}
}]

View File

@@ -1,9 +1,10 @@
# Code generated by KubeVela templates. DO NOT EDIT.
apiVersion: core.oam.dev/v1alpha2
kind: WorkloadDefinition
metadata:
name: worker
annotations:
definition.oam.dev/description: "Long-running scalable backend worker without network endpoint"
definition.oam.dev/description: "`Worker` is a workload type to describe long-running, scalable, containerized services that running at backend. They do NOT have network endpoint to receive external network traffic."
spec:
definitionRef:
name: deployments.apps
@@ -44,7 +45,7 @@ spec:
// +usage=Which image would you like to use for your service
// +short=i
image: string
// +usage=Commands to run in the container
cmd?: [...string]
}

View File

@@ -111,8 +111,11 @@ spec:
- "--use-webhook=true"
- "--webhook-port={{ .Values.webhookService.port }}"
- "--webhook-cert-dir={{ .Values.certificate.mountPath }}"
{{ end }}
- "--health-addr=:{{ .Values.healthCheck.port }}"
{{ end }}
{{ if ne .Values.disableCaps "" }}
- "--disable-caps={{ .Values.disableCaps }}"
{{ end }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
imagePullPolicy: {{ quote .Values.image.pullPolicy }}
resources:

View File

@@ -4,6 +4,8 @@
replicaCount: 1
useWebhook: true
# By default, don't disable any builtin capabilities
disableCaps: ""
image:
repository: oamdev/vela-core
tag: latest

View File

@@ -12,12 +12,10 @@ import (
"syscall"
"time"
"github.com/oam-dev/kubevela/version"
monitoring "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/crossplane/crossplane-runtime/pkg/logging"
oamcore "github.com/crossplane/oam-kubernetes-runtime/apis/core"
oamcontroller "github.com/crossplane/oam-kubernetes-runtime/pkg/controller"
oamv1alpha2 "github.com/crossplane/oam-kubernetes-runtime/pkg/controller/v1alpha2"
oamwebhook "github.com/crossplane/oam-kubernetes-runtime/pkg/webhook/v1alpha2"
"github.com/go-logr/logr"
injectorv1alpha1 "github.com/oam-dev/trait-injector/api/v1alpha1"
injectorcontroller "github.com/oam-dev/trait-injector/controllers"
@@ -35,11 +33,15 @@ import (
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
velacoreoamdev "github.com/oam-dev/kubevela/api/core.oam.dev/v1alpha2"
velacore "github.com/oam-dev/kubevela/api/v1alpha1"
oamcore "github.com/oam-dev/kubevela/apis/core.oam.dev"
velacore "github.com/oam-dev/kubevela/apis/standard.oam.dev/v1alpha1"
velacontroller "github.com/oam-dev/kubevela/pkg/controller"
oamcontroller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
oamv1alpha2 "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2"
"github.com/oam-dev/kubevela/pkg/controller/dependency"
"github.com/oam-dev/kubevela/pkg/controller/utils"
velawebhook "github.com/oam-dev/kubevela/pkg/webhook"
oamwebhook "github.com/oam-dev/kubevela/pkg/webhook/core.oam.dev/v1alpha2"
)
const (
@@ -59,7 +61,6 @@ func init() {
_ = oamcore.AddToScheme(scheme)
_ = monitoring.AddToScheme(scheme)
_ = velacore.AddToScheme(scheme)
_ = velacoreoamdev.AddToScheme(scheme)
_ = injectorv1alpha1.AddToScheme(scheme)
_ = certmanager.AddToScheme(scheme)
_ = kedav1alpha1.AddToScheme(scheme)
@@ -67,7 +68,7 @@ func init() {
}
func main() {
var metricsAddr, logFilePath string
var metricsAddr, logFilePath, leaderElectionNamespace string
var enableLeaderElection, logCompress bool
var logRetainDate int
var certDir string
@@ -75,6 +76,7 @@ func main() {
var useWebhook, useTraitInjector bool
var controllerArgs oamcontroller.Args
var healthAddr string
var disableCaps string
flag.BoolVar(&useWebhook, "use-webhook", false, "Enable Admission Webhook")
flag.BoolVar(&useTraitInjector, "use-trait-injector", false, "Enable TraitInjector")
@@ -83,12 +85,17 @@ func main() {
flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "enable-leader-election", false,
"Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.")
flag.StringVar(&logFilePath, "log-file-path", "", "The address the metric endpoint binds to.")
flag.StringVar(&leaderElectionNamespace, "leader-election-namespace", "",
"Determines the namespace in which the leader election configmap will be created.")
flag.StringVar(&logFilePath, "log-file-path", "", "The file to write logs to.")
flag.IntVar(&logRetainDate, "log-retain-date", 7, "The number of days of logs history to retain.")
flag.BoolVar(&logCompress, "log-compress", true, "Enable compression on the rotated logs.")
flag.IntVar(&controllerArgs.RevisionLimit, "revision-limit", 50,
"RevisionLimit is the maximum number of revisions that will be maintained. The default value is 50.")
flag.StringVar(&healthAddr, "health-addr", ":9440", "The address the health endpoint binds to.")
flag.BoolVar(&controllerArgs.ApplyOnceOnly, "apply-once-only", false,
"For the purpose of some production environment that workload or trait should not be affected if no spec change")
flag.StringVar(&disableCaps, "disable-caps", "", "To be disabled builtin capability list.")
flag.Parse()
// setup logging
@@ -108,6 +115,9 @@ func main() {
o.DestWritter = w
}))
setupLog.Info(fmt.Sprintf("KubeVela Version: %s, GIT Revision: %s.", version.VelaVersion, version.GitRevision))
setupLog.Info(fmt.Sprintf("Disable Capabilities: %s.", disableCaps))
// install dependency charts first
k8sClient, err := client.New(ctrl.GetConfigOrDie(), client.Options{Scheme: scheme})
if err != nil {
@@ -117,13 +127,14 @@ func main() {
go dependency.Install(k8sClient)
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
LeaderElection: enableLeaderElection,
LeaderElectionID: kubevelaName,
Port: webhookPort,
CertDir: certDir,
HealthProbeBindAddress: healthAddr,
Scheme: scheme,
MetricsBindAddress: metricsAddr,
LeaderElection: enableLeaderElection,
LeaderElectionNamespace: leaderElectionNamespace,
LeaderElectionID: kubevelaName,
Port: webhookPort,
CertDir: certDir,
HealthProbeBindAddress: healthAddr,
})
if err != nil {
setupLog.Error(err, "unable to create a controller manager")
@@ -135,13 +146,18 @@ func main() {
os.Exit(1)
}
if err := utils.CheckDisabledCapabilities(disableCaps); err != nil {
setupLog.Error(err, "unable to get enabled capabilities")
os.Exit(1)
}
if useWebhook {
setupLog.Info("vela webhook enabled, will serving at :" + strconv.Itoa(webhookPort))
if err = oamwebhook.Add(mgr); err != nil {
setupLog.Error(err, "unable to setup oam runtime webhook")
os.Exit(1)
}
velawebhook.Register(mgr)
velawebhook.Register(mgr, disableCaps)
if err := waitWebhookSecretVolume(certDir, waitSecretTimeout, waitSecretInterval); err != nil {
setupLog.Error(err, "unable to get webhook secret")
os.Exit(1)
@@ -153,7 +169,7 @@ func main() {
os.Exit(1)
}
if err = velacontroller.Setup(mgr); err != nil {
if err = velacontroller.Setup(mgr, disableCaps); err != nil {
setupLog.Error(err, "unable to setup the vela core controller")
os.Exit(1)
}
@@ -177,6 +193,10 @@ func main() {
}
setupLog.Info("starting the vela controller manager")
if controllerArgs.ApplyOnceOnly {
setupLog.Info("applyOnceOnly is enabled that means workload or trait only apply once if no spec change even they are changed by others")
}
if err := mgr.Start(makeSignalHandler(setupLog, k8sClient)); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
@@ -209,14 +229,18 @@ func waitWebhookSecretVolume(certDir string, timeout, interval time.Duration) er
int64(time.Since(start).Seconds()), int64(timeout.Seconds())))
if _, err := os.Stat(certDir); !os.IsNotExist(err) {
ready := func() bool {
f, _ := os.Open(certDir)
f, err := os.Open(filepath.Clean(certDir))
if err != nil {
return false
}
// nolint
defer f.Close()
// check if dir is empty
if _, err := f.Readdir(1); err == io.EOF {
if _, err := f.Readdir(1); errors.Is(err, io.EOF) {
return false
}
// check if secret files are empty
err := filepath.Walk(certDir, func(path string, info os.FileInfo, err error) error {
err = filepath.Walk(certDir, func(path string, info os.FileInfo, err error) error {
// even Cert dir is created, cert files are still empty for a while
if info.Size() == 0 {
return errors.New("secret is not ready")
@@ -237,6 +261,7 @@ func waitWebhookSecretVolume(certDir string, timeout, interval time.Duration) er
}
}
//nolint:unparam
func makeSignalHandler(log logr.Logger, kubecli client.Client) (stopCh <-chan struct{}) {
stop := make(chan struct{})
c := make(chan os.Signal, 2)

View File

@@ -1,3 +1,6 @@
coverage:
status:
project:
default:
threshold: 0.5%
patch: off

View File

@@ -0,0 +1,146 @@
# Vela Server
## example
In this Demo, Application application-sample will be converted to appconfig and component
The fields in the application spec come from the parametes defined in the definition template
, so we must install Definition at first
Step 1: Install Workload Definition & Trait Definition
```
kubectl apply -f template.yaml
```
Step 2: Create a sample application in the cluster
```
kubectl apply -f application-sample.yaml
```
Step 3: View the application status
```
kubectl get -f application-sample.yaml -oyaml
// You can see the following
apiVersion: core.oam.dev/v1alpha2
kind: Application
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"core.oam.dev/v1alpha2","kind":"Application","metadata":{"annotations":{},"name":"application-sample","namespace":"oam-test"},"spec":{"template":"services:\n myweb:\n type: worker\n image: \"busybox\"\n cmd:\n - sleep\n - \"1000\"\n scaler:\n replicas: 10"}}
name: application-sample
namespace: oam-test
spec:
services:
myweb:
cmd:
- sleep
- "1000"
image: busybox
scaler:
replicas: 10
type: worker
status:
conditions:
- lastTransitionTime: "2020-12-02T12:12:52Z"
reason: Available
status: "True"
type: Parsed
- lastTransitionTime: "2020-12-02T12:12:52Z"
reason: Available
status: "True"
type: Built
- lastTransitionTime: "2020-12-02T12:12:52Z"
reason: Available
status: "True"
type: Applied
status: running
```
Step 4: View the oam CR generated by application
```
kubectl get appconfig/application-sample -oyaml
// appconfig is as follows
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
labels:
application.oam.dev: application-sample
name: application-sample
namespace: oam-test
ownerReferences:
- apiVersion: core.oam.dev/v1alpha2
controller: true
kind: Application
name: application-sample
uid: dca7acc3-664c-422b-aa52-4fe012e37974
spec:
components:
- componentName: myweb
traits:
- trait:
apiVersion: core.oam.dev/v1alpha2
kind: ManualScalerTrait
spec:
replicaCount: 10
status:
conditions:
- lastTransitionTime: "2020-12-02T12:12:52Z"
reason: Successfully reconciled resource
status: "True"
type: Synced
dependency: {}
workloads:
- componentName: myweb
componentRevisionName: myweb-v1
traits:
- traitRef:
apiVersion: core.oam.dev/v1alpha2
kind: ManualScalerTrait
name: myweb-trait-78fdd467d6
workloadRef:
apiVersion: apps/v1
kind: Deployment
name: myweb
kubectl get component/myweb -oyaml
// component is as follows
apiVersion: core.oam.dev/v1alpha2
kind: Component
metadata:
labels:
application.oam.dev: application-sample
name: myweb
namespace: oam-test
ownerReferences:
- apiVersion: core.oam.dev/v1alpha2
controller: true
kind: Application
name: application-sample
uid: dca7acc3-664c-422b-aa52-4fe012e37974
spec:
workload:
apiVersion: apps/v1
kind: Deployment
spec:
selector:
matchLabels:
app.oam.dev/component: myweb
template:
metadata:
labels:
app.oam.dev/component: myweb
spec:
containers:
- command:
- sleep
- "1000"
image: busybox
name: myweb
status:
latestRevision:
name: myweb-v1
revision: 1
```

View File

@@ -0,0 +1,14 @@
apiVersion: core.oam.dev/v1alpha2
kind: Application
metadata:
name: application-sample
spec:
services:
myweb:
type: worker
image: "busybox"
cmd:
- sleep
- "1000"
scaler:
replicas: 10

View File

@@ -0,0 +1,76 @@
apiVersion: core.oam.dev/v1alpha2
kind: WorkloadDefinition
metadata:
name: worker
annotations:
definition.oam.dev/description: "Long-running scalable backend worker without network endpoint"
spec:
definitionRef:
name: deployments.apps
extension:
template: |
output: {
apiVersion: "apps/v1"
kind: "Deployment"
spec: {
selector: matchLabels: {
"app.oam.dev/component": context.name
}
template: {
metadata: labels: {
"app.oam.dev/component": context.name
}
spec: {
containers: [{
name: context.name
image: parameter.image
if parameter["cmd"] != _|_ {
command: parameter.cmd
}
}]
}
}
selector:
matchLabels:
"app.oam.dev/component": context.name
}
}
parameter: {
// +usage=Which image would you like to use for your service
// +short=i
image: string
cmd?: [...string]
}
---
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
annotations:
definition.oam.dev/description: "Manually scale the app"
name: scaler
spec:
appliesToWorkloads:
- webservice
- worker
definitionRef:
name: manualscalertraits.core.oam.dev
workloadRefPath: spec.workloadRef
extension:
template: |-
output: {
apiVersion: "core.oam.dev/v1alpha2"
kind: "ManualScalerTrait"
spec: {
replicaCount: parameter.replicas
}
}
parameter: {
//+short=r
replicas: *1 | int
}

View File

@@ -72,7 +72,7 @@ It will build container image, render deployment manifests in yaml, and apply th
### Extensible Design
The Appfile could be extended with more configurations by adding more capabilities to the OAM system. The config fields in Appfile are strongly correlated to the [capabilities system of OAM](https://github.com/oam-dev/kubevela/blob/master/docs/design.md#2-capability-oriented-architecture) Config fields are registered in the capabilities system and exposed via a [CUE template](https://cuelang.org/).
The Appfile could be extended with more configurations by adding more capabilities to the OAM system. The config fields in Appfile are strongly correlated to the [capabilities system of OAM](../../docs/en/design.md#capability-oriented) Config fields are registered in the capabilities system and exposed via a [CUE template](https://cuelang.org/).
Here is an example of a capability definition that platform builders register:
@@ -140,7 +140,7 @@ In the following, we will discuss technical details of the proposed design.
### Registration via Definition/Capability
Vela allows platform builders to extend Appfile config fields by registering them via [capabilities system of OAM](https://github.com/oam-dev/kubevela/blob/master/docs/design.md#2-capability-oriented-architecture).
Vela allows platform builders to extend Appfile config fields by registering them via [capabilities system of OAM](../../docs/en/design.md#capability-oriented).
The entire template should be put under `spec.extension.template` as raw string:

View File

@@ -0,0 +1,129 @@
# Apply-Once-Only: Apply workload/trait only when spec is changed
- Owner: Yue Wang(@captainroy-hy), Jianbo Sun(@wonderflow)
- Date: 11/24/2020
- Status: Implemented
## Intro
When an ApplicationConfiguration is deployed,
vela-core will create(apply) corresponding workload/trait instances and keep them stay align with the `spec` defined in ApplicationConfiguration through periodical reconciliation.
If we run vela-core with `--apply-once-only` flag enabled, vela-core will never apply the workload and trait instance after they are applied once. Even if they are changed by others (e.g., trait controller, workload controller,etc).
Since the create operation is the only one apply operation occurring on workload/trait, we call this mechanism as `Apply Once Only`.
## A Motivational Example
Here is a scenario from production environment to demonstrate how `Apply Once Only` works.
```yaml
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
---
apiVersion: core.oam.dev/v1alpha2
kind: Component
metadata:
name: example-component
spec:
workload:
apiVersion: apps/v1
kind: Deployment
spec:
...
template:
spec:
containers:
- image: sample/app:1.0
name: sample-app
```
After deploying above ApplicationConfiguration, vela-core will create a Deployment with corresponding `PodTemplateSpec`.
In production env, it's possible to change the Deployment according to particular requirements, e.g., RolloutTrait, AutoscalerTrait,etc.
Currently, we just use `kubectl` to simulate workload is changed bypass changing the ApplicationConfiguration.
Below cmd changes `spec.template.spec.containers[0].image` of the Deployment from `sample/app:1.0` to `sample/app:2.0`.
```shell
cat <<EOF | kubectl patch deployment example-deploy --patch
spec:
template:
spec:
containers:
- name: sample-app
image: sample/app:2.0
EOF
```
Above change will trigger recreate of Pods owned by the Deployment.
But vela-core will change it back to `sample/app:1.0` in the following reconciliation soon or late.
That's not what we expect in some scenarios.
Instead, we hope vela-core ignore reconciling the workload we changed and leave them as what they are now until we change the `spec` of their parent ApplicationConfiguration .
## Goals
Add a startup parameter for vela-core controller to allow users choose whether to enable apply only once or not.
If enabled, workload/trait will be applied only one time for each resource generation (only when the corresponding appconfig/component is created or updated).
After workload/trait created/updated and aligned to the generation of appconfig, vela-core will not apply them EXCEPT below situations:
- The `spec` of ApplicationConfiguration is changed (new generation created)
- The revision of Component is changed
By default, the mechanism is disabled, vela-core will always reconcile and apply workload/trait periodically as usual.
## Implementation
In each round of reconciliation, vela-core compares below Labels & Annotations of existing workload/trait with newly rendered ones before applying.
After deploying the ApplicationConfiguration in the motivational example, the Deployment created by vela-core will have such lables and annotations.
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
app.oam.dev/generation: "1"
generation: 1
labels:
app.oam.dev/component: example-component
app.oam.dev/name: example-appconfig
app.oam.dev/resourceType: WORKLOAD
app.oam.dev/revision: example-component-v1
...
```
- `annotations["app.oam.dev/generation"]:"1" ` refers to the generation of AppConfig
- `labels["app.oam.dev/revision"]:"example-component-v1" ` refers to the revision of Component
These crucial two are propogated from AppConfig and Component during reconciliation.
Any change applied to the Deployment directly has no impact on these labels and annotations, e.g., change the Deployment spec just like what we do in the [motivational example](#a-motivational-example).
If `--apply-once-only` is enabled, since no discrepancy is found on lables and annotations,
vela-core controller will ignore applying the Deployment and leave it as what it is at that moment.
By contrast, changes on AppConfig (changing `spec` creates new generation) and Component (updating Component creates new revision) will change the value of these labels and annotations.
For example, if we update the spec of AppConfig, newly rendered workload is supposed to contain such labels and annotations.
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
app.oam.dev/generation: "2" # generation of AppConfig changed
generation: 1
labels:
app.oam.dev/component: example-component
app.oam.dev/name: example-appconfig
app.oam.dev/resourceType: WORKLOAD
app.oam.dev/revision: example-component-v1
...
```
Since discrepancy is found, vela-core controller will apply(update) the Deployment with newly rendered one.
Thus, the changes we made to the Deployment before will also be eliminated.
The same mechanism also works for Trait as well as Workload.

View File

@@ -0,0 +1,155 @@
# ComponentTrait Composing and Trait CR Naming
* Owner: Jianbo Sun (@wonderflow), Zhou Zheng Xi (@zzxwill)
* Reviewers: KubeVela/Crossplane Maintainers
* Status: Draft
## Background
Now definition name is no longer coupled with CRD name, it's align to capability name in KubeVela,
and two TraitDefinition resources can both refer to the same CRD. So it's necessary to specify how to assemble trait CR
in ApplicationConfiguration and to set the CR name in a friendly way.
## Several ways to assemble trait CR in ApplicationConfiguration
- If the name of TraitDefinition is the same with the referenced CRD
The normal way to assemble a trait CR works as below.
```
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: core.oam.dev/v1alpha2
kind: ManualScalerTrait
spec:
replicaCount: 3
```
- If the name of TraitDefinition is different to that of Trait CRD
The definition name `autoscale` is different to the trait name `autoscalers.standard.oam.dev`, we have two ways to compose ComponentTrait.
```
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: autoscale
spec:
definitionRef:
name: autoscalers.standard.oam.dev
```
1) Use label `trait.oam.dev/type`
```
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: standard.oam.dev/v1alpha2
kind: Autoscalers
metadata:
labels:
trait.oam.dev/type: autoscale
spec:
replicaCount: 3
```
When rendering trait, the TraitDefinition could be retrieved by the label.
2) Use `name` field
```
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: standard.oam.dev/v1alpha2
kind: Autoscalers
name: autoscale
spec:
replicaCount: 3
```
The mutating handler will, at the very beginning, convert `name:autoscale` to the labels above.
In summary, among these two ways to compose ComponentTrait, using labeling is recommended.
While in KubeVela, you don't need to worry about either `label` or `name`, just use command `vela TraitType` or `vela up` to attach the trait to
a component.
## Set the CR name in a friendly way
Currently, we named all trait name in the format of `${ComponentName}-trait-${HashTag}`. This will lead to confusions
when listing CRs of all Traits of a component.
In this proposal, we propose to change the naming rule to `${ComponentName}-${TraitDefinitionName}-${HashTag}`.
For example, if the name of TraitDefinition is `autoscale`, we name the trait CR to `example-component-autoscale-xyzfa32r`.
```
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: standard.oam.dev/v1alpha2
kind: Autoscalers
metadata:
labels:
trait.oam.dev/type: autoscale
spec:
replicaCount: 3
```
If the name is the same as the CRD name, like `manualscalertraits.core.oam.dev`, we name it to `example-component-manualscalertraits-rq234rrw`
by choosing the first part.
```
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: core.oam.dev/v1alpha2
kind: ManualScalerTrait
spec:
replicaCount: 3
---
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: manualscalertraits.core.oam.dev
spec:
workloadRefPath: spec.workloadRef
definitionRef:
name: manualscalertraits.core.oam.dev
```
After OAM Kubernetes Runtime is upgraded, the old trait CR name `example-component-trait-uewf77eu` will stay unchanged for previous version compatibility.

View File

@@ -0,0 +1,152 @@
# How to upgrade to KubeVela
What if I want to upgrade from [oam-kubernetes-runtime](https://github.com/crossplane/oam-kubernetes-runtime) to KubeVela? Here's a detailed guide!
## For users who are using OAM runtime as standalone controller
If you are using OAM Runtime as Standalone Controller, upgrading to KubeVela to KubeVela is very straight forward.
Server-side KubeVela(We call it `vela-core` for convenience) now includes following **BUILT-IN** CRDs and controllers.
| Type | CRD | Controller | From |
| ---- | ---- | ---- | ---- |
| Control Plane Object | `applicationconfigurations.core.oam.dev` | Yes | OAM Runtime |
| Control Plane Object | `components.core.oam.dev` | Yes | OAM Runtime |
| Workload Type | `containerizedworklaods.core.oam.dev` | Yes | OAM Runtime |
| Scope | `healthscope.core.oam.dev` | Yes | OAM Runtime |
| Trait | `manualscalertraits.core.oam.dev` | Yes | OAM Runtime |
| Control Plane Object | `scopedefinitions.core.oam.dev` | No | OAM Runtime |
| Control Plane Object | `traitdefinitions.core.oam.dev` | No | OAM Runtime |
| Control Plane Object | `workloaddefinitions.core.oam.dev` | No | OAM Runtime |
| Trait | `autoscalers.standard.oam.dev` | Yes | New in KubeVela |
| Trait | `metricstraits.standard.oam.dev` | Yes | New in KubeVela |
| Workload Type | `podspecworkloads.standard.oam.dev` | Yes | New in KubeVela |
| Trait | `route.standard.oam.dev` | Yes | New in KubeVela |
CRDs and Controllers in the table from 'OAM Runtime' are exactly the same to those in `oam-kubernetes-runtime`.
So in KubeVela we have added 4 more new CRDs with controller.
### Option 1: I only want to have OAM control plane objects only, no additional traits and workload types.
1. Find you deployment
```shell script
$ kubectl -n oam-system get deployment -l app.kubernetes.io/name=oam-kubernetes-runtime
NAME READY UP-TO-DATE AVAILABLE AGE
oam-kubernetes-runtime-oam 1/1 1 1 62s
```
2. Update the deployment
In this case, the deployment name of OAM runtime is `oam-kubernetes-runtime-oam`, let's edit it to update the image:
```shell script
$ kubectl -n oam-system edit deployment oam-kubernetes-runtime-oam
```
There are two changes:
- update the image from `crossplane/oam-kubernetes-runtime:latest` to `oamdev/vela-core:latest`
- add an args `- "--disable-caps=all"`, which will disable all additional workloads and traits built in vela-core described in the following table.
| Type | Current KubeVela Additional CRD |
| ---- | ---- |
| Trait | `autoscalers.standard.oam.dev` |
| Trait | `metricstraits.standard.oam.dev` |
| Workload | `podspecworkloads.standard.oam.dev` |
| Trait | `route.standard.oam.dev` |
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: oam-kubernetes-runtime-oam
...
containers:
- name: oam
args:
- "--metrics-addr=:8080"
- "--enable-leader-election"
+ - "--disable-caps=all"
- image: crossplane/oam-kubernetes-runtime:latest
+ image: oamdev/vela-core:latest
imagePullPolicy: "Always"
...
```
### Option 2: I want full featured KubeVela, including its built-in workload types and traits.
1. Install Additional CRDs
```shell script
$ kubectl apply -f charts/vela-core/crds
```
2. Install Definition files
```shell script
$ kubectl apply -f charts/vela-core/templates/defwithtemplate
```
3. Create namespace, vela-core use `vela-system` as default
```shell script
$ kubectl create ns vela-system
```
4. Install Cert Manager
```shell script
$ kubectl apply -f charts/vela-core/templates/cert-manager.yaml
```
5. Install Vela Dependency ConfigMap
```shell script
$ kubectl apply -f charts/vela-core/templates/velaConfig.yaml
```
6. Delete your old oam-runtime deployment
Find the running deployment.
```shell script
$ kubectl -n oam-system get deployment -l app.kubernetes.io/name=oam-kubernetes-runtime
NAME READY UP-TO-DATE AVAILABLE AGE
oam-kubernetes-runtime-oam 1/1 1 1 62s
```
Delete the deployment found.
```shell script
$ kubectl -n oam-system delete deployment oam-kubernetes-runtime-oam
```
7. Install Certificate and Webhook for the new controller
```shell script
$ helm template --release-name kubevela -n vela-system -s templates/webhook.yaml charts/vela-core/ | kubectl apply -f -
```
8. Install the new controller
```shell script
$ helm template --release-name kubevela -n vela-system -s templates/kubevela-controller.yaml charts/vela-core/ | kubectl apply -f -
```
> TIPS: If you want to disable webhook, change 'useWebhook' to be 'false' in `charts/vela-core/values.yaml`
Then you have successfully migrate from oam-kubernetes-runtime to KubeVela.
## For users who are importing OAM runtime as library
If you are importing `oam-kubernetes-runtime` as library, you can update your import headers.
Files are refactored as below:
| OLD | NEW | Usage |
| ---- | ---- | ---- |
| `github.com/crossplane/oam-kubernetes-runtime/apis/core` | `github.com/oam-dev/kubevela/apis/core.oam.dev` | API Spec Code |
| `github.com/crossplane/oam-kubernetes-runtime/pkg/controller` | `github.com/oam-dev/kubevela/pkg/controller/core.oam.dev` | OAM Controller Code |
| `github.com/crossplane/oam-kubernetes-runtime/pkg/oam` | `github.com/oam-dev/kubevela/pkg/oam` | OAM Common Lib Code |
| `github.com/crossplane/oam-kubernetes-runtime/pkg/webhook` | `github.com/oam-dev/kubevela/pkg/webhook/core.oam.dev` | OAM Webhook Code |

View File

@@ -0,0 +1,27 @@
# Rollout
## Conflicts With
### `Autoscale`
When `Rollout` and `Autoscle` traits are attached to the same service, they two will fight over the number of instances during rollout. Thus, it's by design that `Rollout` will take over replicas control (specified by `.replicas` field) during rollout.
> Note: in up coming releases, KubeVela will introduce a separate section in Appfile to define release phase configurations such as `Rollout`.
## How `Rollout` works?
`Rollout` trait implements progressive release process to rollout your app following [Canary strategy](https://martinfowler.com/bliki/CanaryRelease.html).
In detail, `Rollout` controller will create a canary of your app , and then gradually shift traffic to the canary while measuring key performance indicators like HTTP requests success rate at the same time.
![alt](../../docs/resources/traffic-shifting-analysis.png)
In this sample, for every `10s`, `5%` traffic will be shifted to canary from the primary, until the traffic on canary reached `50%`. At the mean time, the instance number of canary will automatically scale to `replicas: 2` per configured in Appfile.
Based on analysis result of the KPIs during this traffic shifting, a canary will be promoted or aborted if analysis is failed. If promoting, the primary will be upgraded from v1 to v2, and traffic will be fully shifted back to the primary instances. So as result, canary instances will be deleted after the promotion finished.
![alt](../../docs/resources/promotion.png)
> Note: KubeVela's `Rollout` trait is implemented with [Weaveworks Flagger](https://flagger.app/) operator.

View File

@@ -94,9 +94,34 @@ It's required and will be used to generate mTLS secrets.
Route Trait designed to be compatible with different ingress controller implementations, the `provider` field will allow
you to give a specified ingress controller type. Currently, only nginx-ingress is supported.
The `tls` field allow you to specify a TLS for this route with an IssuerName, the IssuerName pointing to an Issuer Object
The `tls` field allow you to specify a TLS for this route with an IssuerName, the IssuerName pointing to an [Issuer Object](https://cert-manager.io/docs/concepts/issuer/)
created by cert-manager. Cert-manager and ingress controller will handle certificate creation and binding.
If not specified, mTLS was disabled and you can only visit by http.
Currently, vela-cli will create an Issuer Object automatically by using the email defined in `vela init` workflow.
```yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: oam-env-<env.name>
namespace: <env.namespace>
spec:
acme:
# Email address used for ACME registration
email: <env.email>
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Name of a secret used to store the ACME account private key, the key will be automatically created by cert-manager
privateKeySecretRef:
name: oam-env-<env.name>.key
# Enable the HTTP-01 challenge provider, there are many other solvers besides http01.
solvers:
- http01:
ingress:
class: nginx
```
If `tls` field in route trait not specified, mTLS will be disabled by default. You can also manually configure ingress later.
If no rule specified, route trait will create one rule automatically and match with the port.

View File

@@ -1,5 +1,6 @@
- [Home](/)
<!-- - [Blog](/en/blog/README.md) -->
- [Docs](/en/quick-start)
- [Blog](/blog/en/)
<!-- - Language
- [中文](/zh-cn/)
- [English](/en/) -->

6
docs/blog/_navbar.md Normal file
View File

@@ -0,0 +1,6 @@
- [Home](/)
- [Docs](/en/quick-start)
- [Blog](/blog/en/)
- Language
- [中文](/blog/zh/)
- [English](/blog/en/)

4
docs/blog/en/README.md Normal file
View File

@@ -0,0 +1,4 @@
# Blog
- [KubeVela: The Extensible App Platform Based on Open Application Model and Kubernetes](/blog/en/kubevela-the-extensible-app-platform-based-on-open-application-model-and-kubernetes.md)

2
docs/blog/en/_sidebar.md Normal file
View File

@@ -0,0 +1,2 @@
- Blog
- [KubeVela: The Extensible App Platform Based on Open Application Model and Kubernetes](/blog/en/kubevela-the-extensible-app-platform-based-on-open-application-model-and-kubernetes.md)

View File

@@ -0,0 +1,138 @@
# KubeVela: The Extensible App Platform Based on Open Application Model and Kubernetes
>7 Dec 2020 12:33pm, by Lei Zhang and Fei Guo
![image](https://tva1.sinaimg.cn/large/ad5fbf65gy1glgj5q8inej208g049aa6.jpg)
Last month at KubeCon+CloudNativeCon 2020, the [Open Application Model (OAM)](https://github.com/oam-dev/spec) community launched [KubeVela](https://github.com/oam-dev/kubevela/), an easy-to-use yet highly extensible application platform based on OAM and Kubernetes.
For developers, KubeVela is an easy-to-use tool that enables you to describe and ship applications to Kubernetes with minimal effort, yet for platform builders, KubeVela serves as a framework that empowers them to create developer-facing yet fully extensible platforms at ease.
The trend of cloud native technology is moving towards pursuing consistent application delivery across clouds and on-premises infrastructures using Kubernetes as the common abstraction layer. Kubernetes, although excellent in abstracting low-level infrastructure details, does introduce extra complexity to application developers, namely understanding the concepts of pods, port exposing, privilege escalation, resource claims, CRD, and so on. Weve seen the nontrivial learning curve and the lack of developer-facing abstraction have impacted user experiences, slowed down productivity, led to unexpected errors or misconfigurations in production.
Abstracting Kubernetes to serve developers requirements is a highly opinionated process, and the resultant abstractions would only make sense had the decision-makers been the platform builders. Unfortunately, the platform builders today face the following dilemma: There is no tool or framework for them to easily extend the abstractions if any.
Thus, many platforms today introduce restricted abstractions and add-on mechanisms despite the extensibility of Kubernetes. This makes easily extending such platforms for developers requirements or to wider scenarios almost impossible.
In the end, developers complain those platforms are too rigid and slow in response to feature requests or improvements. The platform builders do want to help but the engineering effort is daunting: any simple API change in the platform could easily become a marathon negotiation around the opinionated abstraction design.
## Introducing KubeVela
With KubeVela, we aim to solve these two challenges in an approach that separates concerns of developers and platform builders.
For developers, KubeVela is an easy-to-use yet extensible tool that enables you to describe and deploy microservices applications with minimal effort. And instead of managing a handful of Kubernetes YAML files, a simple docker-compose style `appfile` is all you need.
### A Sample Appfile
In this example, we will create a vela.yaml along with your app. This file describes how to build the image, how to deploy the image to Kubernetes, how to access the application and how the system would scale it automatically.
```yaml
name: testapp
services:
express-server:
image: oamdev/testapp:v1
build:
docker:
file: Dockerfile
contrxt: .
cmd: ["node", "server.js"]
port: 8080
cpu: "0.01"
route:
domain: example.com
rules:
- path: /testapp
rewriteTarget: /
autoscale:
min: 1
max: 4
cpuPercent: 5
```
Just do: `$ vela up`, your app will then be alive on https://example.com/testapp.
### Behind the Appfile
The `appfile` in KubeVela does not have a fixed schema specification, instead, what you can define in this file is determined by what kind of workload types and traits are available in your platform. These two concepts are core concepts from OAM, in detail:
- [Workload type](https://kubevela.io/%23/en/concepts?id=workload-type-amp-trait), which declares the characteristics that runtime infrastructure should take into account in application deployment. In the sample above, it defines a “Web Service” workload named `express-server` as part of your application.
- [Trait](https://kubevela.io/%23/en/concepts?id=workload-type-amp-trait), which represents the operation configurations that are attached to an instance of workload type. Traits augment a workload type instance with operational features. In the sample above, it defines a route trait to access the application and an autoscale trait for the CPU based horizontal automatic scaling policy.
Whenever a new workload type or trait is added, it would become immediately available to be declared in the `appfile`. Lets say, a new trait named metrics is added, developers could check the schema of this trait by simply `$ vela show metrics` and define it in the previous sample `appfile`:
```yaml
name: testapp
services:
express-server:
type: webservice
image: oamdev/testapp:v1
build:
docker:
file: Dockerfile
contrxt: .
cmd: ["node", "server.js"]
port: 8080
cpu: "0.01"
route:
domain: example.com
rules:
- path: /testapp
rewriteTarget: /
autoscale:
min: 1
max: 4
cpuPercent: 5
metrices:
port: 8080
path: "/metrics"
scheme: "http"
enabled: true
```
## Vela Up
The `vela up` command deploys the application defined in `appfile` to Kubernetes. After deployment, you can use `vela status` to check how to access your application following the `route` trait declared in `appfile`.
![](https://tvax2.sinaimg.cn/large/ad5fbf65gy1glf9pyhr42j20la0kiafn.jpg)
Apps deployed with KubeVela will receive a URL (and versioned pre-release URLs) with valid TLS certificate automatically generated via [cert-manager](https://cert-manager.io/docs/). KubeVela also provides a set of commands (i.e. `vela logs, vela exec`) to best support your application management without becoming a Kubernetes expert. [Learn more about vela up and appfile](https://kubevela.io/%23/en/developers/learn-appfile).
## KubeVela for Platform Builders
The above experience cannot be achieved without KubeVelas innovative offerings to the platform builders as an extensible platform engine. These features are the hidden gems that make KubeVela unique. In details, KubeVela relieves the pains of building developer facing platforms on Kubernetes by doing the following:
- **Application Centric**. Behind the appfile, KubeVela enforces “application” as its main API and all KubeVelas capabilities serve the applications requirements only. This is how KubeVela brings application-centric context to the platform by default and changes building such platforms into working around application architecture.
- **Extending Natively**. As mentioned in the developer section, an application described by appfile is composed of various pluggable workload types and operation features (i.e. traits). Capabilities from Kubernetes ecosystem can be added to KubeVela as new workload types or traits through Kubernetes CRD registry mechanism at any time.
- **Simple yet Extensible User Interface**. Behind the `appfile`, KubeVela uses [CUELang](https://github.com/cuelang/cue) as the “last mile” abstraction engine between user-facing schema and the control plane objects. KubeVela provides a set of built-in abstractions to start with and the platform builders are free to modify them at any time. Capability adding/updating or abstraction changes will all take effect at runtime, neither recompilation nor redeployment of KubeVela is required.
Under the hood, KubeVela core is built on top of Crossplane OAM Kubernetes Runtime with KEDA, Flagger, Prometheus, etc as dependencies, yet its feature pool is “unlimited” and can be extended at any time.
![](https://tva2.sinaimg.cn/large/ad5fbf65gy1glf9sktkdxj20q00dsacl.jpg)
With KubeVela, platform builders now have the tooling support to design and ship any new capabilities with abstractions to end-users with high confidence and low turnaround time. And for a developer, you only need to learn these abstractions, describe the app with them in a single file, and then ship it.
## Not Another PaaS System
Most typical Platform-as-a-Service (PaaS) systems also provide full application management capabilities and aim to improve developer experience and efficiency. In this context, KubeVela shares the same goal.
Though unlike most typical PaaS systems which are either inextensible or create their own addon systems maintained by their own communities. KubeVela is designed to fully leverage the Kubernetes ecosystems as its capability pool. Hence, theres no additional addon system introduced in this project. For platform builders, a new capability can be installed in KubeVela at any time by simply registering its API resource to OAM and providing a CUE template. We hope and expect that with the help of the open source community, the number of the KubeVelas capabilities will grow dramatically over time. [Learn more about using community capabilities by $vela cap](https://kubevela.io/%23/en/developers/cap-center).
So in a nutshell, KubeVela is a Kubernetes plugin for building application-centric abstractions. It leverages the native Kubernetes extensibility and capabilities to resolve a hard problem making application management enjoyable on Kubernetes.
## Learn More
KubeVela is incubated by the OAM community as the successor of [Rudr](https://github.com/oam-dev/rudr) project, while rather than being a reference implementation, KubeVela intends to be an end-to-end implementation that could be used in wider scenarios. The design of KubeVelas appfile is also part of the experimental attempt in OAM specification to bring a simplified user experience to developers.
To learn more about KubeVela, please visit KubeVelas [documentation site](https://kubevela.io/). The following content are also good next steps:
- Try out KubeVela following the [step-by-step tutorial](https://kubevela.io/%23/en/quick-start) in its Quick Start page.
- Give us feedback! KubeVela is still in its early stage and we are happy to ask the community for feedback via OAM [Gitter](https://gitter.im/oam-dev/community) or [Slack channel](https://cloud-native.slack.com/archives/C01BLQ3HTJA).
- [Extend KubeVela](https://kubevela.io/%23/en/platform-engineers/trait) to build your own platforms. If you have an idea for a new workload type, trait or try to build something more complex like a database or AI PaaS with KubeVela, post your idea as a GitHub Issue or propose it to the OAM community, we are eager to know.
- [Contribute to KubeVela](https://github.com/oam-dev/kubevela/blob/master/CONTRIBUTING.md). KubeVela is initialized by the open source community with [bootstrap contributors](https://github.com/oam-dev/kubevela/blob/bbb2c527d96d3e1a0694e2f49b3d1d1168e72c53/OWNERS_ALIASES%23L35) from 8+ different organizations. We intend to donate this project to a neutral foundation as soon as it gets stable.

4
docs/blog/zh/README.md Normal file
View File

@@ -0,0 +1,4 @@
# 博客
- [KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎](/blog/zh/kubevela-the-extensible-app-platform-based-on-open-application-model-and-kubernetes.md)

2
docs/blog/zh/_sidebar.md Normal file
View File

@@ -0,0 +1,2 @@
- 博客
- [KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎](/blog/zh/kubevela-the-extensible-app-platform-based-on-open-application-model-and-kubernetes.md)

View File

@@ -0,0 +1,180 @@
# KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
>2020年12月7日 12:33, by Lei Zhang and Fei Guo
![image](https://tva1.sinaimg.cn/large/ad5fbf65gy1glgj5q8inej208g049aa6.jpg)
美国西部时间 2020 年 11 月 18 日,在云原生技术“最高盛宴”的 KubeCon 北美峰会 2020 上CNCF 应用交付领域小组CNCF SIG App Delivery) 与 Open Application Model (OAM) 社区,以及来自阿里云、微软云的 OAM 项目维护者们在演讲中共同宣布了 KubeVela 开源项目的正式发布。
从 11 月 18 号到 20 号,在为期三天的 KubeCon 北美峰会上有连续 3 场技术演讲,会从不同维度介绍关于 KubeVela 项目的具体细节,其中还包括一个长达 1 个半小时的 KubeVela 互动教学环节。多个重量级组织以如此规模和密度在 KubeCon 北美峰会演讲中介绍一个首次发布的社区开源项目,在 KubeCon 诞生以来并不多见。
KubeVela Github 地址:[https://github.com/oam-dev/kubevela/](https://github.com/oam-dev/kubevela/)
## 什么是 KubeVela
一言以蔽之,**KubeVela 是一个简单易用且高度可扩展的应用管理平台与核心引擎**。KubeVela 是基于 Kubernetes 与 OAM 技术构建的。
详细的说对于应用开发人员来讲KubeVela 是一个非常低心智负担的云原生应用管理平台,核心功能是让开发人员方便快捷地在 Kubernetes 上定义与交付现代微服务应用,无需了解任何 Kubernetes 本身相关的细节。在这一点上KubeVela 可以被认为是**云原生社区的 Heroku**。
另一方面对于平台团队来讲KubeVela 是一个强大并且高可扩展的云原生应用平台核心引擎。基于这样一个引擎,平台团队可以快速、高效地以 Kubernetes 原生的方式在 KubeVela 中植入任何来自云原生社区的应用管理能力,从而基于 KubeVela 打造出自己需要的云原生平台,比如:云原生数据库 PaaS、云原生 AI 平台、甚至 Serverless 服务。在这一点上KubeVela 可以被认为是**一个“以应用为中心”的 Kubernetes 发行版**,以 OAM 为核心,让平台团队可以基于 KubeVela 快速打造出属于自己的 PaaS、Serverless 乃至任何面向用户的云原生平台项目。
## KubeVela 解决了什么问题?
现如今,云原生技术的迅猛发展可能让很多人都感觉到眼花缭乱,但实际上,这个生态的总体发展趋势和主旋律,是通过 Kubernetes 搭建了一个统一的基础设施抽象层,为平台团队屏蔽掉了“计算”、“网络”、“存储”等过去我们不得不关注的基础设施概念,使得我们能够基于 Kubernetes 方便地构建出任何我们想要的垂直业务系统而无需关心任何基础设施层的细节。这正是 Kubernetes 被称为云计算界的 Linux 以及 “Platform for Platforms” 的根本原因。
但是,当我们把视角从平台团队提升到垂直业务系统的最终用户(如:应用开发人员)的时候,我们会发现 Kubernetes 这样的定位和设计在解决了平台团队的大问题之后,却也为应用开发者们带来了挑战和困扰。比如,太多的用户都在抱怨 Kubernetes “太复杂了”。究其原因,其实在于 Kubernetes 中的核心概念与体系Pod、sidecar、Service、资源管理、调度算法和 CRD 等等,主要是面向平台团队而非最终用户设计的。缺乏面向用户的设计不仅带来了陡峭的学习曲线,影响了用户的使用体验,拖慢了研发效能,甚至在很多情况下还会引发错误操作乃至生产故障(毕竟不可能每个业务开发人员都是 Kubernetes 专家)。
这也是为什么在云原生生态中,几乎每一个平台团队都会基于 Kubernetes 构建一个上层平台给用户使用。最简单的也会给 Kubernetes 做一个图形界面,稍微正式一些的则往往会基于 Kubernetes 开发一个类 PaaS 平台来满足自己的需求。理论上讲,在 Kubernetes 生态中各种能力已经非常丰富的今天,开发一个类 PaaS 平台应该是比较容易的。
然而现实却往往不尽如人意。在大量的社区访谈当中,我们发现在云原生技术极大普及的今天,基于 Kubernetes 构建一个功能完善、用户友好的上层应用平台,依然是中大型公司们的“专利”。这里的原因在于:
> Kubernetes 生态本身的能力池固然丰富但是社区里却并没有一个可扩展的、方便快捷的方式能够帮助平台团队把这些能力快速“组装”成面向最终用户的功能Feature
这种困境带来的结果,就是尽管大家今天都在基于 Kubernetes 在构建上层应用平台,但这些平台本质上却并不能够与 Kubernetes 生态完全打通,而都变成一个又一个的垂直“烟囱”。
在开源社区中,这个问题会更加明显。在今天的 Kubernetes 社区中,不乏各种“面向用户”、“面向应用”的 Kubernetes 上层系统。但正如前文所述,这些平台都无一例外的引入了自己的专属上层抽象、用户界面和插件机制。这里最典型的例子包括经典 PaaS 项目比如 Cloud Foundry也包括各种 Serverless 平台。作为一个公司的平台团队,我们实际上只有两个选择:要么把自己局限在某种垂直的场景中来适配和采纳某个开源上层平台项目;要么就只能自研一个符合自己诉求的上层平台并且造无数个社区中已经存在的“轮子”。
那么,有没有”第三种选择”能够让平台团队在不造轮子、完全打通 Kubernetes 生态的前提下,轻松的构建面向用户的上层平台呢?
## KubeVela 如何解决上述问题?
KubeVela 项目的创立初衷就是以一个统一的方式同时解决上述最终用户与平台团队所面临的困境。这也是为何在设计中KubeVela 对最终用户和平台团队这两种群体进行了单独的画像,以满足他们不同的诉求。
由于 KubeVela 默认的功能集与“Heroku”类似主要面向应用开发人员所以在下文中我们会以应用开发人员或者开发者来代替最终用户。但我们很快也会讲到KubeVela 里的每一个功能,都是一个插件,作为平台团队,你可以轻松地“卸载”它的所有内置能力、然后“安装”自己需要的任何社区能力,让 KubeVela 变成一个完全不一样的系统。
### 1. 应用开发者眼中的 KubeVela
前面已经提到对于开发者来说KubeVela 是一个简单、易用、又高可扩展的云原生应用管理工具,它可以让开发者以极低的心智负担和上手成本在 Kubernetes 上定义与部署应用。而关于整个系统的使用,开发者只需要编写一个 docker-compose 风格应用描述文件 Appfile 即可,不需要接触和学习任何 Kubernetes 层的相关细节。
#### 1一个 Appfile 示例
在下述例子中,我们会将一个叫做 vela.yaml 的 Appfile 放在你的应用代码目录中(比如应用的 GitHub Repo。这个 Appfile 定义了如何将这个应用编译成 Docker 镜像,如何将镜像部署到 Kubernetes如何配置外界访问应用的路由和域名又如何让 Kubernetes 自动根据 CPU 使用量来水平扩展这个应用。
```yaml
name: testapp
services:
express-server:
image: oamdev/testapp:v1
build:
docker:
file: Dockerfile
contrxt: .
cmd: ["node", "server.js"]
port: 8080
cpu: "0.01"
route:
domain: example.com
rules:
- path: /testapp
rewriteTarget: /
autoscale:
min: 1
max: 4
cpuPercent: 5
```
只要有了这个 20 行的配置文件,你接下来唯一需要的事情就是 $ vela up这个应用就会被部署到 Kubernetes 中然后被外界以 https://example.com/testapp 的方式访问到。
#### 2Appfile 是如何工作的?
在 KubeVela 的 Appfile 背后,有着非常精妙的设计。首先需要指出的就是,**这个 Appfile 是没有固定的 Schema 的**。
什么意思呢?这个 Appfile 里面你能够填写的每一个字段都是直接取决于当前平台中有哪些工作负载类型Workload Types和应用特征Traits是可用的。而熟悉 OAM 的同学都知道,这两个概念,正是 OAM 规范的核心内容,其中:
- [工作负载类型Workload Type](https://kubevela.io/#/en/concepts?id=workload-type-amp-trait),定义的是底层基础设施如何运行这个应用。在上面的例子中,我们声明:名叫 testapp 的应用会启动一个类型为“在线 Web 服务Web Service” 的工作负载,其实例的名字是 express-server。
- [应用特征Traits](https://kubevela.io/#/en/concepts?id=workload-type-amp-trait),则为工作负载实例加上了运维时配置。在上面的例子中,我们定义了一个 Route Trait 来描述应用如何被从外界访问,以及一个 Autoscale Trait 来描述应用如何根据 CPU 使用量进行自动的水平扩容。
而正是基于这种模块化的设计,这个 Appfile 本身是高度可扩展的。当任何一个新的 Workload Type 或者 Trait 被安装到平台后,用户就可以立刻在 Appfile 里声明使用这个新增的能力。举个例子,比如后面平台团队新开发了一个用来配置应用监控属性的运维侧能力,叫做 Metrics。那么只需要举手之捞应用开发者就可以立刻使用 $ vela show metrics 命令查看这个新增能力的详情,并且在 Appfile 中使用它,如下所示:
```yaml
name: testapp
services:
express-server:
type: webservice
image: oamdev/testapp:v1
build:
docker:
file: Dockerfile
contrxt: .
cmd: ["node", "server.js"]
port: 8080
cpu: "0.01"
route:
domain: example.com
rules:
- path: /testapp
rewriteTarget: /
autoscale:
min: 1
max: 4
cpuPercent: 5
metrices:
port: 8080
path: "/metrics"
scheme: "http"
enabled: true
```
这种简单友好、又高度敏捷的使用体验,正是 KubeVela 在最终用户侧提供的主要体感。
#### 3Vela Up 命令
前面提到,一旦 Appfile 准备好,开发者只需要一句 vela up 命令就可以把整个应用连同它的运维特征部署到 Kubernetes 中。部署成功后,你可以使用 vela status 来查看整个应用的详情,包括如何访问这个应用。
![](https://tvax2.sinaimg.cn/large/ad5fbf65gy1glf9pyhr42j20la0kiafn.jpg)
通过 KubeVela 部署的应用会被自动设置好访问 URL以及不同版本对应的不同 URL并且会由 cert-manager 生成好证书。与此同时KubeVela 还提供了一系列辅助命令比如vela logs 和 vela exec来帮助你在无需成为 Kubernetes 专家的情况下更好地管理和调试你的应用。如果你对上述由 KubeVela 带来的开发者体验感兴趣的话,欢迎前往 KubeVela 项目的用户使用文档来了解更多。
而接下来,我们要切换一下视角,感受一下平台团队眼中的 KubeVela 又是什么样子的。
### 2. 平台工程师眼中的 KubeVela
实际上,前面介绍到的所有开发者侧体验,都离不开 KubeVela 在平台侧进行的各种创新性设计与实现。也正是这些设计的存在,才使得 KubeVela 不是一个简单的 PaaS 或者 Serverless**而是一个可以由平台工程师扩展成任意垂直系统的云原生平台内核**。
具体来说KubeVela 为平台工程师提供了三大核心能力,使得基于 Kubernetes 构建上述面向用户的云原生平台从“阳春白雪”变成了“小菜一碟”:
**第一:以应用为中心**。在 Appfile 背后,其实就是“应用”这个概念,它是基于 OAM 模型实现的。通过这样的方式KubeVela 让“应用”这个概念成为了整个平台对用户暴露的核心 API。KubeVela 中的所有能力,都是围绕着“应用”展开的。这正是为何基于 KubeVela 扩展和构建出来的平台,天然是用户友好的:对于一个开发者来说,他只关心“应用”,而不是容器或者 Kubernetes而 KubeVela 会确保构建整个平台的过程,也只与应用层的需求有关。
**第二Kubernetes 原生的高可扩展性**。在前面我们已经提到过Appfile 是一个由 Workload Type 和 Trait 组成的、完全模块化的对象。而 OAM 模型的一个特点,就是任意一个 Kubernetes API 资源,都可以直接基于 Kubernetes 的 CRD 发现机制注册为一个 Workload Type 或者 Trait。这种可扩展性使得 KubeVela 并不需要设计任何“插件系统”:**KubeVela 里的每一个能力,都是插件,而整个 Kubernetes 社区,就是 KubeVela 原生的插件中心**。
**第三:简单友好但高度可扩展的用户侧抽象体系**。在了解了 Appfile 之后你可能已经对这个对象的实现方式产生了好奇。实际上KubeVela 中并不是简单的实现了一个 Appfile。在平台层KubeVela 在 OAM 模型层实现中集成了CUELang 这种简洁强大的模板语言,从而为平台工程师基于 Kubernetes API 对象定义用户侧抽象(即:“最后一公里”抽象)提供了一个标准、通用的配置工具。更重要的是,平台工程师或者系统管理员,可以随时随地的每个能力对应的 CUE 模板进行修改,这些修改一旦提交到 Kubernetes用户在 Appfile 里就可以立刻使用到新的抽象,不需要重新部署或者安装 KubeVela。
在具体实现层KubeVela 是基于 OAM Kubernetes Runtime 构建的,同时采用 KEDA FlaggerPrometheus 等生态项目作为 Trait 的背后的依赖。当然,这些依赖只是 KubeVela 的选型,你可以随时为 KubeVela 定制和安装你喜欢的任何能力作为 Workload Type 或者 Trait。综合以上讲解KubeVela 项目的整体架构由**用户界面层,模型层,和能力管理层**三部分组成,如下所示:
![](https://tva2.sinaimg.cn/large/ad5fbf65gy1glf9sktkdxj20q00dsacl.jpg)
有了 KubeVela平台工程师终于拥有了一个可以方便快捷地将任何一个 Kubernetes 社区能力封装抽象成一个面向用户的上层平台特性的强大工具。而作为这个平台的最终用户,应用开发者们只需要学习这些上层抽象,在一个配置文件中描述应用,就可以一键交付出去。
### 3. KubeVela VS 经典 PaaS
很多人可能会问KubeVela 跟经典 PaaS 的主要区别和联系是什么呢?
事实上,大多数经典 PaaS 都能提供完整的应用生命周期管理功能同时也非常关注提供简单友好的用户体验提升研发效能。在这些点上KubeVela 跟经典 PaaS 的目标,是非常一致的。
但另一方面,经典 PaaS 往往是不可扩展的(比如 Rancher 的 Rio 项目),或者会引入属于自己的插件生态(哪怕这个 PaaS 是完全基于 Kubernetes 构建的),以此来确保平台本身的用户体验和能力的可控制性(比如 Cloud Foundry 或者 Heroku 的[插件中心](https://elements.heroku.com/addons))。
相比之下KubeVela 的设计是完全不同的。KubeVela 的目标,从一开始就是利用整个 Kubernetes 社区作为自己的“插件中心”并且“故意”把它的每一个内置能力都设计成是独立的、可插拔的插件。这种高度可扩展的模型背后其实有着精密的设计与实现。比如KubeVela 如何确保某个完全独立的 Trait 一定能够绑定于某种 Workload Type如何检查这些相互独立的 Trait 是否冲突?这些挑战,正是 Open Application ModelOAM作为 KubeVela 模型层的起到的关键作用一言以蔽之OAM 是一个高度可扩展的应用定义与能力管理模型。
KubeVela 和 OAM 社区欢迎大家设计和制作任何 Workload Type 和 Trait 的定义文件。只要把它们存放在 GitHub 上,全世界任何一个 KubeVela 用户就都可以在自己的 Appfile 里使用你所设计的能力。具体的方式,请参考 `$ vela cap` (即:插件能力管理命令)的[使用文档](https://kubevela.io/#/en/developers/cap-center)。
## 了解更多
KubeVela 项目是 OAM 社区的官方项目,旨在取代原先的 Rudr 项目。不过,与 [Rudr](https://github.com/oam-dev/rudr) 主要作为“参考实现”的定位不同KubeVela 既是一个端到端、面向全量场景的 OAM Kubernetes 完整实现,同时也是阿里云 EDAS 服务和内部多个核心 PaaS/Serverless 生产系统底层的核心组件。 此外KubeVela 中 Apppfile 的设计,也是 OAM 社区在 OAM 规范中即将引入的“面向用户侧对象”的核心部分。
如果你想要更好的了解 KubeVela 项目,欢迎前往其官方网站上[学习具体的示例和手册](https://kubevela.io/)。以下也是一些非常好的学习内容和方式:
- 前往学习 [KubeVela Quick Start新手教程](https://kubevela.io/#/en/quick-start),一步步了解 KubeVela 的使用方法。
- 前往 OAM 社区深入交流和反馈。中文:钉钉群 23310022英文[Gitter](https://gitter.im/oam-dev/community) 和 [CNCF Slack](https://cloud-native.slack.com/archives/C01BLQ3HTJA)。
- 尝试为 [KubeVela 添加来自开源社区的插件能力](https://kubevela.io/#/en/platform-engineers/trait)。此外,如果你有任何关于扩展 KubeVela 的奇妙想法,比如,基于 KubeVela 开发一个自己的云原生数据库 PaaS 或者 AI PaaS欢迎前往 OAM 社区通过 Issue 来进行讨论。
- 为 KubeVela 贡献代码. KubeVela 项目是一个诞生自云原生社区的开源项目(感谢来自 8 家不同公司的[初始贡献者](https://github.com/oam-dev/kubevela/blob/bbb2c527d96d3e1a0694e2f49b3d1d1168e72c53/OWNERS_ALIASES#L35),并特别鸣谢 KubeVela 网站的发起者 [guoxudong](https://github.com/sunny0826))。
**KubeVela 项目的维护者会在项目稳定后,即将整个项目所有权捐赠给中立开源基金会。**

View File

@@ -33,14 +33,15 @@
- [Appfile](/en/developers/references/devex/appfile.md)
- Capabilities
- Workload Types
- [Web Service](/en/developers/references/workload-types/web-service.md)
- [Webservice](/en/developers/references/workload-types/webservice.md)
- [Task](/en/developers/references/workload-types/task.md)
- [Worker](/en/developers/references/workload-types/backend-worker.md)
- [Worker](/en/developers/references/workload-types/worker.md)
- Traits
- [Route](/en/developers/references/traits/route.md)
- [Autoscale](/en/developers/references/traits/autoscale.md)
- [Rollout](/en/developers/references/traits/rollout.md)
- [Metrics](/en/developers/references/traits/metrics.md)
- [Scaler](/en/developers/references/traits/scaler.md)
- CLI
- General
- [vela config](/en/cli/vela_config.md)
@@ -66,7 +67,7 @@
- [vela route](/en/cli/vela_route.md)
- [vela autoscale](/en/cli/vela_autoscale.md)
- [vela rollout](/en/cli/vela_rollout.md)
- [vela metrics](/en/cli/vela_metric.md)
- [vela metrics](/en/cli/vela_metrics.md)
- System
- [vela completion](/en/cli/vela_completion.md)
- [vela dashboard](/en/cli/vela_dashboard.md)
@@ -74,3 +75,4 @@
- [vela template](/en/cli/vela_template.md)
- Extensibility
- [vela cap](/en/cli/vela_cap.md)
- [FAQ](/en/developers/references/devex/faq.md)

View File

@@ -1 +0,0 @@
## Some blog

View File

@@ -1 +0,0 @@
- [Blog](/en/blog/README.md)

View File

@@ -126,11 +126,11 @@ Overall, as illustrated in the following figure, KubeVela is composed of **two c
![alt](../resources/arch.png)
### KubeVela User Interfaces
They include `appfile`, `cli` and `dashboard`.
The main user interface of KubeVela is `appfile` (i.e. `Application`), with `cli` and `dashboard` build around this concept.
### KubeVela Core
It is a server side controller which is composed of:
- [Crossplane OAM Kubernetes runtime](https://github.com/crossplane/oam-kubernetes-runtime) which provides Control Plane Objects such as `Component` and `Application Configuration` etc.
- [Crossplane OAM Kubernetes runtime](https://github.com/crossplane/oam-kubernetes-runtime) which implements OAM control plane specification including `Component` and `Application Configuration` etc.
- Built-in workload and trait implementations which provide core capabilities such as `webservice`, `route` and `rollout` etc.
- A capability manager which manages features of KubeVela as independent add-ons following the design of _Capability Oriented Architecture_ mentioned above.
- A CRD registry which registers and discovers Kubernetes controllers by their CRDs. This enables KubeVela to automatically install dependent controllers/operators when adding a new CRD.
- A CRD registry which registers and discovers Kubernetes controllers/operators by their CRDs. This enables KubeVela to install dependent controllers/operators automatically when a new CRD based capability is added.

View File

@@ -147,7 +147,7 @@ spec:
## [Optional] Configure another workload type
By now we have deployed a *[Web Service](references/workload-types/web-service.md)*, which is the default workload type in KubeVela. We can also add another service of *[Task](references/workload-types/task.md)* type in the same app:
By now we have deployed a *[Web Service](references/workload-types/webservice.md)*, which is the default workload type in KubeVela. We can also add another service of *[Task](references/workload-types/task.md)* type in the same app:
```yaml
services:

View File

@@ -0,0 +1,223 @@
# FAQ
- [Install](#install)
* [Error: unable to create new content in namespace cert-manager because it is being terminated](#error-unable-to-create-new-content-in-namespace-cert-manager-because-it-is-being-terminated)
* [Error: ScopeDefinition exists](#error-scopedefinition-exists)
* [Warning: capability rollout was not ready](#warning-capability-rollout-was-not-ready)
* [You have reached your pull rate limit](#You-have-reached-your-pull-rate-limit)
* [Warning: Namespace cert-manager exists](#warning-namespace-cert-manager-exists)
## Install
### Error: unable to create new content in namespace cert-manager because it is being terminated
Occasionally you might hit the issue as below. It happens when the last KubeVela release deletion hasn't completed.
```
$ vela install
- Installing Vela Core Chart:
install chart vela-core, version 0.1.0, desc : A Helm chart for Kube Vela core, contains 35 file
Failed to install the chart with error: serviceaccounts "cert-manager-cainjector" is forbidden: unable to create new content in namespace cert-manager because it is being terminated
failed to create resource
helm.sh/helm/v3/pkg/kube.(*Client).Update.func1
/home/runner/go/pkg/mod/helm.sh/helm/v3@v3.2.4/pkg/kube/client.go:190
...
Error: failed to create resource: serviceaccounts "cert-manager-cainjector" is forbidden: unable to create new content in namespace cert-manager because it is being terminated
```
Take a break and try again in a few seconds.
```
$ vela install
- Installing Vela Core Chart:
Vela system along with OAM runtime already exist.
Automatically discover capabilities successfully ✅ Add(0) Update(0) Delete(8)
TYPE CATEGORY DESCRIPTION
-task workload One-off task to run a piece of code or script to completion
-webservice workload Long-running scalable service with stable endpoint to receive external traffic
-worker workload Long-running scalable backend worker without network endpoint
-autoscale trait Automatically scale the app following certain triggers or metrics
-metrics trait Configure metrics targets to be monitored for the app
-rollout trait Configure canary deployment strategy to release the app
-route trait Configure route policy to the app
-scaler trait Manually scale the app
- Finished successfully.
```
And manually apply all WorkloadDefinition and TraitDefinition manifests to have all capabilities back.
```
$ kubectl apply -f charts/vela-core/templates/defwithtemplate
traitdefinition.core.oam.dev/autoscale created
traitdefinition.core.oam.dev/scaler created
traitdefinition.core.oam.dev/metrics created
traitdefinition.core.oam.dev/rollout created
traitdefinition.core.oam.dev/route created
workloaddefinition.core.oam.dev/task created
workloaddefinition.core.oam.dev/webservice created
workloaddefinition.core.oam.dev/worker created
$ vela workloads
Automatically discover capabilities successfully ✅ Add(8) Update(0) Delete(0)
TYPE CATEGORY DESCRIPTION
+task workload One-off task to run a piece of code or script to completion
+webservice workload Long-running scalable service with stable endpoint to receive external traffic
+worker workload Long-running scalable backend worker without network endpoint
+autoscale trait Automatically scale the app following certain triggers or metrics
+metrics trait Configure metrics targets to be monitored for the app
+rollout trait Configure canary deployment strategy to release the app
+route trait Configure route policy to the app
+scaler trait Manually scale the app
NAME DESCRIPTION
task One-off task to run a piece of code or script to completion
webservice Long-running scalable service with stable endpoint to receive external traffic
worker Long-running scalable backend worker without network endpoint
```
### Error: ScopeDefinition exists
Occasionally you might hit the issue as below. It happens when there is an old OAM Kubernetes Runtime release, or you applied `ScopeDefinition` before.
```
$ vela install
- Installing Vela Core Chart:
install chart vela-core, version 0.1.0, desc : A Helm chart for Kube Vela core, contains 35 file
Failed to install the chart with error: ScopeDefinition "healthscopes.core.oam.dev" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key "meta.helm.sh/release-name" must equal "kubevela": current value is "oam"; annotation validation error: key "meta.helm.sh/release-namespace" must equal "vela-system": current value is "oam-system"
rendered manifests contain a resource that already exists. Unable to continue with install
helm.sh/helm/v3/pkg/action.(*Install).Run
/home/runner/go/pkg/mod/helm.sh/helm/v3@v3.2.4/pkg/action/install.go:274
...
Error: rendered manifests contain a resource that already exists. Unable to continue with install: ScopeDefinition "healthscopes.core.oam.dev" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key "meta.helm.sh/release-name" must equal "kubevela": current value is "oam"; annotation validation error: key "meta.helm.sh/release-namespace" must equal "vela-system": current value is "oam-system"
```
Delete `ScopeDefinition` "healthscopes.core.oam.dev" and try again.
```
$ kubectl delete ScopeDefinition "healthscopes.core.oam.dev"
scopedefinition.core.oam.dev "healthscopes.core.oam.dev" deleted
$ vela install
- Installing Vela Core Chart:
install chart vela-core, version 0.1.0, desc : A Helm chart for Kube Vela core, contains 35 file
Successfully installed the chart, status: deployed, last deployed time = 2020-12-03 16:26:41.491426 +0800 CST m=+4.026069452
WARN: handle workload template `containerizedworkloads.core.oam.dev` failed: no template found, you will unable to use this workload capabilityWARN: handle trait template `manualscalertraits.core.oam.dev` failed
: no template found, you will unable to use this trait capabilityAutomatically discover capabilities successfully ✅ Add(8) Update(0) Delete(0)
TYPE CATEGORY DESCRIPTION
+task workload One-off task to run a piece of code or script to completion
+webservice workload Long-running scalable service with stable endpoint to receive external traffic
+worker workload Long-running scalable backend worker without network endpoint
+autoscale trait Automatically scale the app following certain triggers or metrics
+metrics trait Configure metrics targets to be monitored for the app
+rollout trait Configure canary deployment strategy to release the app
+route trait Configure route policy to the app
+scaler trait Manually scale the app
- Finished successfully.
```
### Warning: capability rollout was not ready
If you hit the issue as below, it means cert-manager is creating a certificate for Trait Rollout.
Just wait a few minutes, and the issue will be self-healed.
```
$ vela install
- Installing Vela Core Chart:
created namespace vela-system
install chart vela-core, version 0.1.0, desc : A Helm chart for Kube Vela core, contains 35 file
Successfully installed the chart, status: deployed, last deployed time = 2020-12-02 22:16:03.504685599 +0800 CST m=+4.949923921
- Vela-Core was installed successfully while some capabilities were still installing background, try running 'vela workloads' or 'vela traits' to check after a while, details timeout checking capability ready: capability 'rollout' was not ready: no matches for flagger.app/, Resource=canaries
$ kubectl get all -n vela-system
NAME READY STATUS RESTARTS AGE
pod/kubevela-vela-core-77f4494f8f-hmrc8 0/1 ContainerCreating 0 13m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kubevela-vela-core 0/1 1 0 13m
$ kubectl describe deployment kubevela-vela-core -n vela-system
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 15m default-scheduler Successfully assigned vela-system/kubevela-vela-core-77f4494f8f-hmrc8 to node1
Warning FailedMount <invalid> kubelet, node1 Unable to attach or mount volumes: unmounted volumes=[tls-cert-vol], unattached volumes=[kubevela-vela-core-token-dztdl tls-cert-vol]: timed out waiting for the condition
Warning FailedMount <invalid> (x5 over 2m22s) kubelet, node1 Unable to attach or mount volumes: unmounted volumes=[tls-cert-vol], unattached volumes=[tls-cert-vol kubevela-vela-core-token-dztdl]: timed out waiting for the condition
Warning FailedMount <invalid> (x15 over 4m25s) kubelet, node1 MountVolume.SetUp failed for volume "tls-cert-vol" : secret "webhook-server-cert" not found
```
### You have reached your pull rate limit
When you look into the logs of Pod kubevela-vela-core and found the issue as below.
```
$ kubectl get pod -n vela-system -l app.kubernetes.io/name=vela-core
NAME READY STATUS RESTARTS AGE
kubevela-vela-core-f8b987775-wjg25 0/1 - 0 35m
```
>Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by
>authenticating and upgrading: https://www.docker.com/increase-rate-limit
You can use github container registry instead.
```
$ docker pull ghcr.io/oam-dev/kubevela/vela-core:latest
```
### Warning: Namespace cert-manager exists
If you hit the issue as below, an `cert-manager` release might exist whose namespace and RBAC related resource conflict
with KubeVela.
```
$ vela install
- Installing Vela Core Chart:
install chart vela-core, version 0.1.0, desc : A Helm chart for Kube Vela core, contains 35 file
Failed to install the chart with error: Namespace "cert-manager" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "kubevela"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "vela-system"
rendered manifests contain a resource that already exists. Unable to continue with install
helm.sh/helm/v3/pkg/action.(*Install).Run
/home/runner/go/pkg/mod/helm.sh/helm/v3@v3.2.4/pkg/action/install.go:274
...
/opt/hostedtoolcache/go/1.14.12/x64/src/runtime/asm_amd64.s:1373
Error: rendered manifests contain a resource that already exists. Unable to continue with install: Namespace "cert-manager" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "kubevela"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "vela-system"
```
Try these steps to fix the problem.
- Delete release `cert-manager`
- Delete namespace `cert-manager`
- Install KubeVela again
```
$ helm delete cert-manager -n cert-manager
release "cert-manager" uninstalled
$ kubectl delete ns cert-manager
namespace "cert-manager" deleted
$ vela install
- Installing Vela Core Chart:
install chart vela-core, version 0.1.0, desc : A Helm chart for Kube Vela core, contains 35 file
Successfully installed the chart, status: deployed, last deployed time = 2020-12-04 10:46:46.782617 +0800 CST m=+4.248889379
Automatically discover capabilities successfully ✅ (no changes)
TYPE CATEGORY DESCRIPTION
task workload One-off task to run a piece of code or script to completion
webservice workload Long-running scalable service with stable endpoint to receive external traffic
worker workload Long-running scalable backend worker without network endpoint
autoscale trait Automatically scale the app following certain triggers or metrics
metrics trait Configure metrics targets to be monitored for the app
rollout trait Configure canary deployment strategy to release the app
route trait Configure route policy to the app
scaler trait Manually scale the app
- Finished successfully.
```

View File

@@ -1,10 +1,12 @@
# Autoscale
## Description
`Autoscale` is used to automatically scale workloads by resource utilization metrics and cron
`Autoscale` is used to automatically scale workloads by resource utilization metrics or cron triggers.
## Specification
List of all available properties for a `Autoscale` trait.
List of all configuration options for a `Autoscale` trait.
```yaml
name: testapp
@@ -26,20 +28,20 @@ express-server:
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
min | int | minimal replicas of the workload | required
max | int | maximal replicas of the workload | required
cpuPercent | int | specify the value for CPU utilization, like 80, which means 80% |
cron | [{Cron}](#Cron) | just for `appfile`, not available for Cli usage |
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
min | Minimal replicas of the workload | int | true |
max | Maximal replicas of the workload | int | true |
cpuPercent | Specify the value for CPU utilization, like 80, which means 80% | int | false |
cron | Cron type auto-scaling. Just for `appfile`, not available for Cli usage | [cron](#cron) | false |
### Cron
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
startAt | string | the time to start scaling, like `08:00` |
duration | string | for how long the scaling will last |
days | string | several workdays or weekends, like "Monday, Tuesday" |
replicas | int | the target replicas to be scaled to |
timezone | string | timezone, like "America/Los_Angeles" |
### cron
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
startAt | The time to start scaling, like `08:00` | string | true |
duration | For how long the scaling will last | string | true |
days | Several workdays or weekends, like "Monday, Tuesday" | string | true |
replicas | The target replicas to be scaled to | int | true |
timezone | Timezone, like "America/Los_Angeles" | string | true |

View File

@@ -2,11 +2,11 @@
## Description
`Metrics` is used to configure monitoring metrics to your service.
`Metrics` is used to configure monitoring metrics for your service.
## Specification
List of all available properties for a `Route` trait.
List of all configuration options for a `Metrics` trait.
```yaml
name: my-app-name
@@ -24,11 +24,11 @@ services:
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Path** | **string** | the metrics path of the service | [default to /metrics]
**Format** | **string** | +format of the metrics, default as prometheus | [default to prometheus]
**Scheme** | **string** | | [default to http]
**Enabled** | **bool** | | [default to true]
**Port** | **int32** | the port for metrics, will discovery automatically by default | [default to 0], >=1024 & <=65535
**Selector** | **map[string]string** | the label selector for the pods, will discovery automatically by default | [optional]
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
path | The metrics path of the service | string | true | /metrics
format | Format of the metrics, default as prometheus | string | true | prometheus
scheme | The way to retrieve data which can take the values `http` or `https` | string | true | http
enabled | | bool | true | true
port | The port for metrics, will discovery automatically by default | int | true | 0
selector | The label selector for the pods, will discovery automatically by default | map[string]string | false |

View File

@@ -2,19 +2,11 @@
## Description
`Rollout` is used to configure Canary deployment strategy to your application.
## Conflicts With
### `Autoscale`
When `Rollout` and `Autoscle` traits are attached to the same service, they two will fight over the number of instances during rollout. Thus, it's by design that `Rollout` will take over replicas control (specified by `.replicas` field) during rollout.
> Note: in up coming releases, KubeVela will introduce a separate section in Appfile to define release phase configurations such as `Rollout`.
`Rollout` is used to configure Canary deployment strategy for your application.
## Specification
List of all available properties for a `Rollout` trait.
List of all configuration options for a `Rollout` trait.
```yaml
servcies:
@@ -29,26 +21,8 @@ servcies:
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**replicas** | **string** | replicas number of the service instance per revision | [ default to 2 ]
**stepWeight** | **string** | canary increment step percentage (0-100)| [default to 50 ]
**interval** | **string** | wait interval for every rolling update step | [default to '30s']
## How `Rollout` works?
`Rollout` trait implements progressive release process to rollout your app following [Canary strategy](https://martinfowler.com/bliki/CanaryRelease.html).
In detail, `Rollout` controller will create a canary of your app , and then gradually shift traffic to the canary while measuring key performance indicators like HTTP requests success rate at the same time.
![alt](../../../../resources/traffic-shifting-analysis.png)
In this sample, for every `10s`, `5%` traffic will be shifted to canary from the primary, until the traffic on canary reached `50%`. At the mean time, the instance number of canary will automatically scale to `replicas: 2` per configured in Appfile.
Based on analysis result of the KPIs during this traffic shifting, a canary will be promoted or aborted if analysis is failed. If promoting, the primary will be upgraded from v1 to v2, and traffic will be fully shifted back to the primary instances. So as result, canary instances will be deleted after the promotion finished.
![alt](../../../../resources/promotion.png)
> Note: KubeVela's `Rollout` trait is implemented with [Weaveworks Flagger](https://flagger.app/) operator.
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
interval | Schedule interval time | string | true | 30s
stepWeight | Weight percent of every step in rolling update | int | true | 50
replicas | Total replicas of the workload | int | true | 2

View File

@@ -6,7 +6,7 @@
## Specification
List of all available properties for a `Route` trait.
List of all configuration options for a `Route` trait.
```yaml
name: my-app-name
@@ -24,16 +24,17 @@ services:
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Domain** | **string** | specify your host url for this app | [ default to (empty) ]
**Issuer** | **string** | specify your certificate issue | [default to no tls]
**Rules** | [**[]RouteRules**](#routerules) | | [optional]
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
domain | Domain name | string | true | empty
issuer | | string | true | empty
rules | | [[]rules](#rules) | false |
### RouteRules
### rules
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Path** | **string** | | [ default to (empty) ]
**RewriteTarget** | **string** | | [ default to (empty) ]
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
path | | string | true |
rewriteTarget | | string | true | empty

View File

@@ -1,25 +0,0 @@
# Scaler
## Description
`Scaler` is used to configure replicas to your service.
## Specification
List of all available properties for a `Scaler` trait.
```yaml
name: my-app-name
services:
my-service-name:
...
scaler:
replicas: 100
```
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Replica** | **int32** | | [default to 1]

View File

@@ -0,0 +1,25 @@
# Scaler
## Description
`Scaler` is used to configure replicas for your service.
## Specification
List of all configuration options for a `Scaler` trait.
```yaml
name: my-app-name
services:
my-service-name:
...
scaler:
replicas: 100
```
## Properties
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
replicas | Replicas of the workload | int | true | 1

View File

@@ -19,11 +19,10 @@ services:
cmd: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
```
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Cmd** | **[]string** | | [optional]
**Count** | **int32** | specify number of tasks to run in parallel | [default to 1]
**Image** | **string** | Which image would you like to use for your service |
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
cmd | Commands to run in the container | []string | false |
count | specify number of tasks to run in parallel | int | true | 1
image | Which image would you like to use for your service | string | true |

View File

@@ -1,63 +0,0 @@
# Web Service
## Description
`Web Service` is a workload type to describe long-running, scalable, containerized services that have a stable network endpoint to receive external network traffic from customers.
If workload type is skipped for any service defined in Appfile, it will be defaulted to `Web Service` type.
## Specification
List of all configuration options for a `Web Service` workload type.
```yaml
name: my-app-name
services:
my-service-name:
type: webservice # could be skipped
image: oamdev/testapp:v1
cmd: ["node", "server.js"]
port: 8080
cpu: "0.1"
env:
- name: FOO
value: bar
- name: FOO
valueFrom:
secretKeyRef:
name: bar
key: bar
```
## Parameters
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Cmd** | **[]string** | | [optional]
**Env** | [**[]WebserviceEnv**](#webserviceenv) | | [optional]
**Image** | **string** | Which image would you like to use for your service |
**Port** | **int32** | Which port do you want customer traffic sent to | [default to 80]
**cpu** | **string** | Number of CPU units for the service, like `0.5` (0.5 CPU core), `1` (1 CPU core) | [optional]
### WebserviceEnv
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** | |
**Value** | **string** | | [optional]
**ValueFrom** | [**WebserviceValueFrom**](#webservicevaluefrom) | | [optional]
### WebserviceValueFrom
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**SecretKeyRef** | [**WebserviceValueFromSecretKeyRef**](#webservicevaluefromsecretkeyref) | |
### WebserviceValueFromSecretKeyRef
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** | |
**Key** | **string** | |

View File

@@ -0,0 +1,64 @@
# Webservice
## Description
`Webservice` is a workload type to describe long-running, scalable, containerized services that have a stable network endpoint to receive external network traffic from customers. If workload type is skipped for any service defined in Appfile, it will be defaulted to `Web Service` type.
## Specification
List of all configuration options for a `Webservice` workload type.
```yaml
name: my-app-name
services:
my-service-name:
type: webservice # could be skipped
image: oamdev/testapp:v1
cmd: ["node", "server.js"]
port: 8080
cpu: "0.1"
env:
- name: FOO
value: bar
- name: FOO
valueFrom:
secretKeyRef:
name: bar
key: bar
```
## Properties
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
cmd | Commands to run in the container | []string | false |
env | Define arguments by using environment variables | [[]env](#env) | false |
image | Which image would you like to use for your service | string | true |
port | Which port do you want customer traffic sent to | int | true | 80
cpu | Number of CPU units for the service, like `0.5` (0.5 CPU core), `1` (1 CPU core) | string | false |
### env
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
name | Environment variable name | string | true |
value | The value of the environment variable | string | false |
valueFrom | Specifies a source the value of this var should come from | [valueFrom](#valueFrom) | false |
#### valueFrom
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
secretKeyRef | Selects a key of a secret in the pod's namespace | [secretKeyRef](#secretKeyRef) | true |
##### secretKeyRef
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
name | The name of the secret in the pod's namespace to select from | string | true |
key | The key of the secret to select from. Must be a valid secret key | string | true |

View File

@@ -18,9 +18,9 @@ services:
cmd: ["node", "server.js"]
```
## Parameters
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Cmd** | **[]string** | | [optional]
**Image** | **string** | pecify app image |
Name | Description | Type | Required | Default
------------ | ------------- | ------------- | ------------- | -------------
cmd | Commands to run in the container | []string | false |
image | Which image would you like to use for your service | string | true |

Some files were not shown because too many files have changed in this diff Show More