From 1809b47bb9c8cc90e998fede3d488d8f990c0a9e Mon Sep 17 00:00:00 2001 From: Hongchao Deng Date: Wed, 4 Nov 2020 18:09:29 -0800 Subject: [PATCH] doc: add extending vela (#511) * doc: add extending vela - also rename in `system update` name -> type, type -> category Signed-off-by: Hongchao Deng * github action: fixed ubuntu version Signed-off-by: Hongchao Deng * update --- .github/workflows/go.yml | 3 +- docs/README.md | 1 + docs/developers/references/README.md | 13 +- docs/platform-engineers/extending-kubevela.md | 146 ++++++++++++++++-- pkg/commands/refresh.go | 2 +- resources/kubewatch-notif.jpg | Bin 0 -> 27980 bytes 6 files changed, 144 insertions(+), 21 deletions(-) create mode 100644 resources/kubewatch-notif.jpg diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 8eaa07a7f..705aa820a 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -9,7 +9,7 @@ on: jobs: build: name: unit-tests - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - name: Set up Go 1.14 uses: actions/setup-go@v1 @@ -22,7 +22,6 @@ jobs: - name: Install ginkgo run: | - sudo apt-get update sudo apt-get install -y golang-ginkgo-dev - name: Setup Kind Cluster diff --git a/docs/README.md b/docs/README.md index 413429887..b0e7b0c76 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,6 +21,7 @@ Learn and use KubeVela with tutorials and user stories. - [Port Forward to Container](developers/port-forward.md) - [Configuring data/env in Application](developers/config-app.md) - [Consuming Cloud Services](developers/cloud-service.md) +- [Capability References](developers/references/README.md) **For Platform Engineers** - [Extending KubeVela](platform-engineers/extending-kubevela.md) diff --git a/docs/developers/references/README.md b/docs/developers/references/README.md index 9e40b5ca0..1291b4d83 100644 --- a/docs/developers/references/README.md +++ b/docs/developers/references/README.md @@ -1,8 +1,9 @@ -# KubeVela Workload Types and Traits References. - -Note: All the contents under this directory are designed to be referenced by other documentations as the full schema or usage of specific workload types or traits.. - -In the upcoming releases, we plan to auto-generate all these reference documentations from the CUE templates in KubeVela's definition objects. +# KubeVela Capability References - [workload types](https://github.com/oam-dev/kubevela/tree/master/docs/developers/references/workload-types) -- [trait types](https://github.com/oam-dev/kubevela/tree/master/docs/developers/references/traits) +- [trait](https://github.com/oam-dev/kubevela/tree/master/docs/developers/references/traits) + + +Note: All the contents under this directory are designed to be referenced by other documentations as the full schema or usage of specific workload types or traits. + +In the upcoming releases, we plan to auto-generate all these reference documentations from the CUE templates in KubeVela's definition objects. diff --git a/docs/platform-engineers/extending-kubevela.md b/docs/platform-engineers/extending-kubevela.md index b10fc7c12..65c4954ce 100644 --- a/docs/platform-engineers/extending-kubevela.md +++ b/docs/platform-engineers/extending-kubevela.md @@ -1,22 +1,144 @@ -# Extending KubeVela +# Extending Capabilities in KubeVela -## Add a new application trait to KubeVela +## How Capabilities Work -> TODO: Steps to integrate a external capability, use kubewatch as example is good. +A Capability is a functionality provided by the infrastructure that users can configure to run and operate applications. +Vela has [an extensible capability system](../design.md#2-capability-oriented-architecture) that allows platform builders to bring bespoke infrastructure capabilityes into Vela by writing YAML definitions and CUE templates. -### Step 1: Reference the API resource as capability +In the following tutorial, you will learn how to add a new capability and expose it to users via CLI/Appfile. +The new capability is a type of trait but the same process applies to workload as well. -> TODO: introducing Definition object +## Add A New Capability -### Step 2: Define the capability template +Prerequisites: -> TODO: introducing CUE template +- [helm v3](https://helm.sh/docs/intro/install/) +- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) -### Step 3 (optional): Define the third-party dependencies +### Step 1: Install KubeWatch -> TODO: how to define that my trait relies on Prometheus by using CRD discover mechanism? Manually install and guarantee the dependency for now is fine. +```console +$ helm repo add vela-demo https://wonderflow.info/kubewatch/archives/ +$ helm install kubewatch vela-demo/kubewatch --version 0.1.0 +``` -## Add a new workload type to KubeVela +### Step 2: Add Trait Definition with CUE template -> TODO: Steps to integrate a external capability, use statefulset or cloneset as example is good. - \ No newline at end of file +```console +$ cat << EOF | kubectl apply -f - +apiVersion: core.oam.dev/v1alpha2 +kind: TraitDefinition +metadata: + name: kubewatch + annotations: + definition.oam.dev/apiVersion: labs.bitnami.com/v1alpha1 + definition.oam.dev/kind: KubeWatch + definition.oam.dev/description: "Add a watch for resource" +spec: + appliesToWorkloads: + - "*" + workloadRefPath: spec.workloadRef + definitionRef: + name: kubewatches.labs.bitnami.com + extension: + template: | + output: { + apiVersion: "labs.bitnami.com/v1alpha1" + kind: "KubeWatch" + spec: handler: webhook: url: parameter.webhook + } + parameter: { + webhook: string + } +EOF +``` + +That's it! Once you have applied the definition file the feature will be automatically registered in Vela Server and exposed to users. + +### Step 3: Verify New Trait + +Verify new trait: + +```console +$ vela traits +Synchronizing capabilities from clusterβŒ› ... +Sync capabilities successfully βœ… Add(1) Update(0) Delete(0) +TYPE CATEGORY DESCRIPTION ++kubewatch trait Add a watch for resource + +Listing trait capabilities ... + +NAME DESCRIPTION APPLIES TO +kubewatch Add a watch for resource +... +``` + +### Step 4: Adding Kubewatch Trait to The App + +Write an Appfile: + +```console +$ cat << EOF > vela.yaml +name: testapp +services: + testsvc: + type: webservice + image: crccheck/hello-world + port: 8000 + route: + domain: testsvc.example.com +EOF +``` + +Deploy it: + +```console +$ vela up +... +βœ… App has been deployed πŸš€πŸš€πŸš€ + Port forward: vela port-forward testapp + SSH: vela exec testapp + Logging: vela logs testapp + App status: vela status testapp + Service status: vela status testapp --svc testsvc +``` + +You can use either of the following options to attach the newly added kubewatch trait to the App: + +#### Option 1: Testing in CLI + +Add kubewatch trait to the application: + +```console +$ vela kubewatch testapp --svc testsvc --webhook https://hooks.slack.com/ +Adding kubewatch for app testsvc +β ‹ Checking Status ... +βœ… Application Deployed Successfully! + - Name: testsvc + Type: webservice + HEALTHY Ready: 1/1 + Traits: + - βœ… kubewatch: webhook=https://hooks.slack.com/... + ... +``` + +Check your Slack channel to verify the nofitications: + +![Image of Kubewatch](../../resources/kubewatch-notif.jpg) + +#### Option 2: Testing in Appfile + +Instead of using CLI, you can add `kubewatch` config to Appfile: + +```yaml +$ cat << EOF >> vela.yaml + kubewatch: + webhook: https://hooks.slack.com/ +EOF +``` + +Deploy it: + +``` +$ vela up +``` diff --git a/pkg/commands/refresh.go b/pkg/commands/refresh.go index 1c6d26364..e86c64684 100644 --- a/pkg/commands/refresh.go +++ b/pkg/commands/refresh.go @@ -79,7 +79,7 @@ func RefreshDefinitions(ctx context.Context, c client.Client, ioStreams cmdutil. func printRefreshReport(newCaps, oldCaps []types.Capability, io cmdutil.IOStreams) { report := refreshResultReport(newCaps, oldCaps) table := uitable.New() - table.AddRow("NAME", "TYPE", "DESCRIPTION") + table.AddRow("TYPE", "CATEGORY", "DESCRIPTION") if len(report[added]) == 0 && len(report[updated]) == 0 && len(report[deleted]) == 0 { // no change occurs, just show all existing caps diff --git a/resources/kubewatch-notif.jpg b/resources/kubewatch-notif.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54eacf4dae4f79dec1cba8ce371a847567d8897a GIT binary patch literal 27980 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�T>R95GS`Dz|x z9lF+-0{_bac9DNdsQz3vanKmhINa>3B7G8&;WzYbs;(N4COHa`@KtN|-C-|@@y#<$ zd1iLG1+3Sum&3aS*+|>Z_s)8pr5I0as5-p%;nc84Z_29p9u_;=r9TXS8H#)SLl|(b z5kPgf*?PDcwL50FJl?bsIjYNs*F1tBos~4}U%E3{056BX#s4da#miQypVK|vDl&Rt zOObT)tV!U|CnQh@HXU0U(X;#*cKHazSSZ)lKh(Nfv4Pq5eR6EMWfS@83i7Cx<;OTS zG6T^mly+s-%EEutkSG74_rXqi>s`%}ggK}tFMViA&V>^?H~M`uNq32n2_A)3E?Jzu z!^9t{0ghvXSDU|Fqbv4h`ryGu(d`LV9up<4#%>5t*8Pa*iM^Akt7B#izUS*8lw`R?WdV{H80)?Y7Q=$S z)3B@Q9zV@<*IKsI!fF_)FmrXqgd~Tv+{^!m5@^^*)#ANKF8Be_>^7T!>Bg}cF5Q2E z;MC(G=;pR);A4osZhk*u%l+}?dh{)NI(r$}$ffv{9IqUvb#+nFk1kurPphPb$R}?r z<$u(SsNbo~jGTO{<@9SM^nQ z>RG5w>KbKsP5r@#h#Gq=V!?$PEJ=I7k$_ndZ(`Jg`J;NOPqYDvKF_CCo&rmtL8Q1~ zHzA=Vacw(5@$|#hZz-9H7C??P_1Bs{q#IU|$6Af6V}w;Qi9M3=^@;CYi>VabY|X|W z0LCUq3qBv!-ALJ;5Po@&bN+0LhUp4H9P4luOKDlXdvHdH_?lY->z%)@4L~o1X+PVJ zLcxms5jQ4KlEgXF>hZcj=SQ286PF)`on-G1hvr;;djTEf>MnOD9R9rLjMPUzwFZfe zz^w7ofY;ibf6)D(hvE0szd*LazqOt{^jquz2+L)ZxW)Vk4Q1-JDO{8~vfxe%vba>s zu6!+FXV}AsPY}wamuORr0W-LAf_}xuu2Rj3?q~aH{FA85i-AUgCF@mnJnS6i-pU(8 zTH^FWHOVH=Z=R&Ly?&&M0z4AC5RA4|H8NXF2vKZI{%Fujvnk(i?)AiqS~`9u(G)KN z6@S-tH=zu~Nw>$sX>{Y%fB6IXJ^lY$^Z#!wfd7|PzyI~~{kK`}-=3lW`uY7|OKSSx Gv;PC=Y#&Gf literal 0 HcmV?d00001