From bf67b7dfc9704267382d52e00ef105bce18cd9ae Mon Sep 17 00:00:00 2001 From: Jianbo Sun Date: Tue, 25 Oct 2022 15:58:10 +0800 Subject: [PATCH 1/2] Feat: addon vela addon dry-run doc Signed-off-by: Jianbo Sun --- docs/end-user/components/more.md | 518 ++++++++++++++++-- .../current/end-user/components/more.md | 460 +++++++++++++++- 2 files changed, 897 insertions(+), 81 deletions(-) diff --git a/docs/end-user/components/more.md b/docs/end-user/components/more.md index b8343069979..67d50fe273a 100644 --- a/docs/end-user/components/more.md +++ b/docs/end-user/components/more.md @@ -26,7 +26,7 @@ vela addon list ```
-The command will show the basic addon info along with all available versions. +The command will show the basic addon info along with all available versions and installed versions. ```console NAME REGISTRY DESCRIPTION AVAILABLE-VERSIONS STATUS @@ -45,6 +45,8 @@ terraform-alibaba KubeVela Kubernetes Terraform Controller ### Install Addon +#### Install with CLI + The simplest command for installing one addon is: ```shell @@ -68,6 +70,8 @@ Addon: fluxcd enabled Successfully. You can also install addons with some advanced flags. +#### Install addon with specified version + * Choose one specific version by adding `--version` flag in this command. e.g: ```shell @@ -88,6 +92,463 @@ By default, the place for installation is specified as control plane cluster or vela addon enable velaux repo= ``` +#### Air-Gapped Installation for Addon + +If your cluster network cannot connect to the community addon registry you can: +- build your custom addon registry. Please refer to [*Build your Own Registry*](../../platform-engineers/addon/addon-registry) for details. +- enable an addon from a local directory. Example: + +```shell +$ tree velaux -L 1 +velaux +├── metadata.yaml +├── readme_cn.md +├── readme.md +├── resources +├── schemas +└── template.yaml + +2 directories, 4 files +``` + +* Enable the addon from local directory. + +``` +vela addon enable ./velaux +``` + +
+expected output + +``` +Addon: velaux enabled successfully +``` +
+ +:::caution +Please notice that, while an addon is being installed in a cluster, it maybe still need pull some images or Helm Charts. If your cluster cannot reach these resources please refer [docs](../../platform-engineers/system-operation/enable-addon-offline) to complete installation without Internet access. +::: + +#### Install addon with UI Console + +If you have installed [VelaUX](../../reference/addons/velaux) which is also one of the addon, you can manage it directly on the UI console with admin privileges. + +![addon list](https://static.kubevela.net/images/1.3/addon-list.jpg) + +In the addon list, you can get the status of the addon and other info. Click the addon name could open the addon detail page, you can get the version list, definitions provided by the addon, and the readme message. + +![addon detail](https://static.kubevela.net/images/1.3/addon-detail.jpg) + +Select a version and deployed clusters, you can click the enable button to install this addon. You can check detail information in this section include: + +- Definitions: The extension capabilities provided by the addon may include component, trait, etc. +- README: Addon description, explain the capabilities and related information. + +#### Install addon by kubectl + +When you want to deploy addon in the format of YAML or using `kubectl` instead of using vela CLI, you can render the yaml out by: + +```shell +vela addon enable velaux --dry-run +``` + + +
+expected output + +``` +apiVersion: core.oam.dev/v1beta1 +kind: Application +metadata: + creationTimestamp: null + labels: + addons.oam.dev/name: velaux + addons.oam.dev/registry: KubeVela + addons.oam.dev/version: v1.5.8 + name: addon-velaux + namespace: vela-system +spec: + components: + - name: apiserver + properties: + cmd: + - apiserver + - --datastore-type=kubeapi + image: oamdev/vela-apiserver:v1.5.8 + ports: + - expose: true + port: 8000 + protocol: TCP + traits: + - properties: + name: kubevela-vela-core + type: service-account + - properties: + replicas: 1 + type: scaler + type: webservice + - dependsOn: + - apiserver + name: velaux + properties: + env: + - name: KUBEVELA_API_URL + value: apiserver.vela-system:8000 + exposeType: ClusterIP + image: oamdev/velaux:v1.5.8 + ports: + - expose: true + port: 80 + protocol: TCP + traits: + - properties: + replicas: 1 + type: scaler + type: webservice +status: {} + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"pvc","label":"PersistentVolumeClaim","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"maxLength":32,"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"mountPath","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"resources","sort":7,"subParameters":[{"jsonKey":"requests","sort":1,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Request + Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"},{"jsonKey":"limits","sort":3,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Limit + Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"}],"validate":{"defaultValue":{"limits":{"storage":"8Gi"},"requests":{"storage":"8Gi"}},"required":true}},{"description":"If + not specified, the cluster default StorageClass is used.","jsonKey":"storageClassName","sort":9},{"jsonKey":"accessModes","sort":11,"validate":{"defaultValue":["ReadWriteOnce"],"required":false}},{"description":"You + can set the value of volumeMode to Block to use a volume as a raw block device.","jsonKey":"volumeMode","sort":12,"uiType":"Select","validate":{"defaultValue":"Filesystem","options":[{"label":"Filesystem","value":"Filesystem"},{"label":"Block","value":"Block"}]}},{"description":"The + VolumeName is the binding reference to the PersistentVolume backing this claim.","jsonKey":"volumeName","sort":14},{"jsonKey":"selector","sort":17},{"description":"It + will create a new volume based on the contents of the specified data source.","jsonKey":"dataSource","sort":19},{"disable":true,"jsonKey":"dataSourceRef","sort":20},{"disable":true,"jsonKey":"mountOnly"}]},{"disable":true,"jsonKey":"secret","sort":3},{"disable":true,"jsonKey":"configMap","sort":5},{"disable":true,"jsonKey":"emptyDir"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: trait-uischema-storage + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"url","label":"URL","sort":1,"subParameters":[{"jsonKey":"value","label":"URL","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"data","sort":3}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-webhook + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"replicas","validate":{"min":0,"required":true}}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: trait-uischema-scaler + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"image","label":"Container Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"description":"Specifies + the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":4,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies + the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":5,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"exposeType","sort":6,"validate":null},{"jsonKey":"ports","label":"Service + Ports","sort":7,"subParameters":[{"jsonKey":"port","sort":1,"validate":{"min":1,"required":true}},{"jsonKey":"protocol","sort":3},{"disable":true,"jsonKey":"name","sort":4},{"jsonKey":"expose","sort":5}],"validate":{"defaultValue":[{"expose":true,"port":80,"protocol":"TCP"}],"required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add + By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret + Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret + Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"description":"Set + the path and type that the service needs to persist.","jsonKey":"volumeMounts","label":"Persistent + Storage","sort":12,"subParameters":[{"disable":true,"jsonKey":"configMap"},{"disable":true,"jsonKey":"secret"},{"jsonKey":"pvc","label":"Storage + By PVC","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"claimName","sort":3},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"hostPath","label":"Storage + By HostPath","sort":3,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"path","label":"Host + Path","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"emptyDir","label":"Temporary + Storage","sort":5,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"medium","sort":3,"validate":{"options":[{"label":"Memory","value":"memory"},{"label":"Dir","value":""}],"required":false}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]}],"uiType":"Group"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify + image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image + Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"addRevisionLabel"},{"disable":true,"jsonKey":"port"},{"disable":true,"jsonKey":"volumes"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-uischema-webservice + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"parallel","sort":5,"validate":{"defaultValue":false}},{"jsonKey":"policy","sort":1},{"jsonKey":"env","sort":3}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-deploy2env + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"image","label":"Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"jsonKey":"restart","sort":3,"uiType":"Select","validate":{"defaultValue":"Never","options":[{"label":"Never","value":"Never"},{"label":"OnFailure","value":"OnFailure"}],"required":true}},{"jsonKey":"count","sort":4,"uiType":"Number","validate":{"defaultValue":1,"max":128,"min":0,"required":true}},{"description":"Specifies + the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":5,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies + the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":7,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add + By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret + Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret + Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify + image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image + Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"volumes"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-uischema-task + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"description":"Support push messages to Dingding Group.","jsonKey":"dingding","sort":1,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"description":"Specify + the message that you want to sent","jsonKey":"message","sort":3,"subParameters":[{"disable":true,"jsonKey":"msgtype"},{"disable":true,"jsonKey":"link"},{"disable":true,"jsonKey":"markdown"},{"disable":true,"jsonKey":"at"},{"disable":true,"jsonKey":"actionCard"},{"disable":true,"jsonKey":"feedCard"},{"jsonKey":"text","subParameters":[{"description":"Specify + the message that you want to sent","jsonKey":"content","label":"Message"}],"uiType":"Ignore"}],"uiType":"Ignore"}]},{"description":"Support + push email message.","jsonKey":"email","sort":3,"subParameters":[{"jsonKey":"from","sort":1,"subParameters":[{"jsonKey":"host","sort":1},{"jsonKey":"port","sort":3},{"jsonKey":"address","sort":5},{"jsonKey":"password","sort":7,"subParameters":[{"jsonKey":"value","label":"Password","uiType":"Password","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"alias","sort":9}]},{"jsonKey":"to","sort":3},{"jsonKey":"content","sort":5,"subParameters":[{"jsonKey":"subject","sort":1},{"jsonKey":"body","sort":3}]}]},{"description":"Support + push messages to slack channel.","jsonKey":"slack","sort":5,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"message","subParameters":[{"disable":true,"jsonKey":"blocks"},{"disable":true,"jsonKey":"attachments"},{"disable":true,"jsonKey":"thread_ts"},{"disable":true,"jsonKey":"mrkdwn"},{"description":"Specify + the message that you want to sent","jsonKey":"text","label":"Message"}],"uiType":"Ignore"}]}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-notification + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"dbType","label":"DBType","sort":1,"validate":{"defaultValue":"kubeapi","options":[{"label":"MongoDB","value":"mongodb"},{"label":"KubeAPI","value":"kubeapi"}],"required":true}},{"conditions":[{"jsonKey":"dbType","op":"==","value":"mongodb"}],"jsonKey":"dbURL","label":"DatabaseURL","sort":3,"validate":{"required":true}},{"jsonKey":"database","sort":7,"validate":{"defaultValue":"kubevela","required":true}},{"disable":true,"jsonKey":"serviceAccountName"},{"jsonKey":"serviceType","sort":8},{"jsonKey":"domain","sort":9},{"jsonKey":"gatewayDriver","sort":10},{"jsonKey":"repo","sort":11},{"jsonKey":"imagePullSecrets","sort":13}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: addon-uischema-velaux + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"policies","label":"Policies","sort":10,"uiType":"PolicySelect","validate":{"required":true}},{"jsonKey":"parallelism","sort":20,"style":{"colSpan":12}},{"jsonKey":"auto","sort":30,"style":{"colSpan":12}}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-deploy + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"objects","uiType":"K8sObjectsCode"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-uischema-k8s-objects + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"selector","sort":100,"uiType":"ComponentSelect"},{"jsonKey":"components","sort":101,"uiType":"ComponentPatches"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: policy-uischema-override + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresources: ql.#ListResourcesInApp + & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: parameter.appNs\n\t\tfilter: + {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: parameter.cluster\n\t\t\t}\n\t\t\tif + parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: parameter.clusterNs\n\t\t\t}\n\t\t\tapiVersion: + \"v1\"\n\t\t\tkind: \"Service\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: + {\n\tif resources.err == _|_ {\n\t\tservices: [ for i, resource in resources.list + {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: + resources.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: service-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace?: + string\n\tcluster?: string\n\tkind: string\n\tapiVersion: string\n}\nresponse: + ql.#Read & {\n\tvalue: {\n\t\tapiVersion: parameter.apiVersion\n\t\tkind: parameter.kind\n\t\tmetadata: + {\n\t\t\tname: parameter.name\n\t\t\tif parameter.namespace != _|_ {\n\t\t\t\tnamespace: + parameter.namespace\n\t\t\t}\n\t\t}\n\t}\n\tif parameter.cluster != _|_ {\n\t\tcluster: + parameter.cluster\n\t}\n}\n\nif response.err == _|_ {\n\tstatus: {\n\t\tresource: + response.value\n\t}\n}\nif response.err != _|_ {\n\tstatus: {\n\t\terror: response.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: application-resource-detail-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: + ql.#CollectPods & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: + parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: + parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: + parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: + [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: + {\n\t\tpodList: [ for pod in result.list if pod.object != _|_ {\n\t\t\tcluster: + \ pod.cluster\n\t\t\tworkload: pod.workload\n\t\t\tcomponent: pod.component\n\t\t\tmetadata: + {\n\t\t\t\tname: pod.object.metadata.name\n\t\t\t\tnamespace: pod.object.metadata.namespace\n\t\t\t\tcreationTime: + pod.object.metadata.creationTimestamp\n\t\t\t\tlabels: pod.object.metadata.labels\n\t\t\t\tversion: + {\n\t\t\t\t\tif pod.publishVersion != _|_ {\n\t\t\t\t\t\tpublishVersion: pod.publishVersion\n\t\t\t\t\t}\n\t\t\t\t\tif + pod.deployVersion != _|_ {\n\t\t\t\t\t\tdeployVersion: pod.deployVersion\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatus: + {\n\t\t\t\tphase: pod.object.status.phase\n\t\t\t\t// refer to https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase\n\t\t\t\tif + phase != \"Pending\" && phase != \"Unknown\" {\n\t\t\t\t\tpodIP: pod.object.status.podIP\n\t\t\t\t\thostIP: + \ pod.object.status.hostIP\n\t\t\t\t\tnodeName: pod.object.spec.nodeName\n\t\t\t\t}\n\t\t\t}\n\t\t}]\n\t}\n}\n\nif + result.err != _|_ {\n\tstatus: {\n\t\terror: result.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-pod-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\ttype: string\n\tnamespace: + *\"\" | string\n\tcluster: *\"\" | string\n}\n\nschema: {\n\t\"secret\": {\n\t\tapiVersion: + \"v1\"\n\t\tkind: \"Secret\"\n\t}\n\t\"configMap\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: + \ \"ConfigMap\"\n\t}\n\t\"pvc\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"PersistentVolumeClaim\"\n\t}\n\t\"storageClass\": + {\n\t\tapiVersion: \"storage.k8s.io/v1\"\n\t\tkind: \"StorageClass\"\n\t}\n\t\"ns\": + {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Namespace\"\n\t}\n\t\"provider\": + {\n\t\tapiVersion: \"terraform.core.oam.dev/v1beta1\"\n\t\tkind: \"Provider\"\n\t}\n}\n\nList: + ql.#List & {\n\tresource: schema[parameter.type]\n\tfilter: {\n\t\tnamespace: + parameter.namespace\n\t}\n\tcluster: parameter.cluster\n}\n\nstatus: {\n\tif List.err + == _|_ {\n\t\tif len(List.list.items) == 0 {\n\t\t\terror: \"failed to list \\(parameter.type) + in namespace \\(parameter.namespace)\"\n\t\t}\n\t\tif len(List.list.items) != + 0 {\n\t\t\tlist: List.list.items\n\t\t}\n\t}\n\n\tif List.err != _|_ {\n\t\terror: + List.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: resource-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\ncollectLogs: ql.#CollectLogsInPod & {\n\tcluster: + \ parameter.cluster\n\tnamespace: parameter.namespace\n\tpod: parameter.pod\n\toptions: + {\n\t\tcontainer: parameter.container\n\t\tprevious?: parameter.previous\n\t\tsinceSeconds?: + parameter.sinceSeconds\n\t\tsinceTime?: parameter.sinceTime\n\t\ttimestamps?: + \ parameter.timestamps\n\t\ttailLines?: parameter.tailLines\n\t\tlimitBytes?: + \ parameter.limitBytes\n\t}\n}\nstatus: collectLogs.outputs\n\nparameter: {\n\t// + +usage=Specify the cluster of the pod\n\tcluster: string\n\t// +usage=Specify + the namespace of the pod\n\tnamespace: string\n\t// +usage=Specify the name of + the pod\n\tpod: string\n\n\t// +usage=Specify the name of the container\n\tcontainer: + string\n\t// +usage=If true, return previous terminated container logs\n\tprevious: + *false | bool\n\t// +usage=If set, show logs in relative times\n\tsinceSeconds: + *null | int\n\t// +usage=RFC3339 timestamp, if set, show logs since this time\n\tsinceTime: + *null | string\n\t// +usage=If true, add timestamp at the beginning of every line\n\ttimestamps: + *false | bool\n\t// +usage=If set, return the number of lines from the end of + logs\n\ttailLines: *null | int\n\t// +usage=If set, limit the size of returned + bytes\n\tlimitBytes: *null | int\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: collect-logs + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n}\n\nresources: ql.#ListResourcesInApp & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: + parameter.appNs\n\t\tfilter: {\n\t\t\t\"apiVersion\": \"terraform.core.oam.dev/v1beta2\"\n\t\t\t\"kind\": + \ \"Configuration\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: {\n\tif + resources.err == _|_ {\n\t\t\"cloud-resources\": [ for i, resource in resources.list + {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: + resources.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: cloud-resource-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName?: string\n\tappNs?: + \ string\n}\n\nsecretList: ql.#List & {\n\tresource: {\n\t\tapiVersion: \"v1\"\n\t\tkind: + \ \"Secret\"\n\t}\n\tfilter: {\n\t\tmatchingLabels: {\n\t\t\t\"created-by\": + \"terraform-controller\"\n\t\t\tif parameter.appName != _|_ && parameter.appNs + != _|_ {\n\t\t\t\t\"app.oam.dev/name\": parameter.appName\n\t\t\t\t\"app.oam.dev/namespace\": + parameter.appNs\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatus: {\n\tif secretList.err == _|_ + {\n\t\tsecrets: secretList.list.items\n\t}\n\tif secretList.err != _|_ {\n\t\terror: + secretList.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: cloud-resource-secret-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace: + string\n\tcluster: *\"\" | string\n}\n\npod: ql.#Read & {\n\tvalue: {\n\t\tapiVersion: + \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: + parameter.namespace\n\t\t}\n\t}\n\tcluster: parameter.cluster\n}\n\neventList: + ql.#SearchEvents & {\n\tvalue: {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: + \ pod.value.metadata\n\t}\n\tcluster: parameter.cluster\n}\n\npodMetrics: ql.#Read + & {\n\tcluster: parameter.cluster\n\tvalue: {\n\t\tapiVersion: \"metrics.k8s.io/v1beta1\"\n\t\tkind: + \ \"PodMetrics\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: + parameter.namespace\n\t\t}\n\t}\n}\n\nstatus: {\n\tif pod.err == _|_ {\n\t\tcontainers: + [ for container in pod.value.spec.containers {\n\t\t\tname: container.name\n\t\t\timage: + container.image\n\t\t\tresources: {\n\t\t\t\tif container.resources.limits != + _|_ {\n\t\t\t\t\tlimits: container.resources.limits\n\t\t\t\t}\n\t\t\t\tif container.resources.requests + != _|_ {\n\t\t\t\t\trequests: container.resources.requests\n\t\t\t\t}\n\t\t\t\tif + podMetrics.err == _|_ {\n\t\t\t\t\tusage: {for containerUsage in podMetrics.value.containers + {\n\t\t\t\t\t\tif containerUsage.name == container.name {\n\t\t\t\t\t\t\tcpu: + \ containerUsage.usage.cpu\n\t\t\t\t\t\t\tmemory: containerUsage.usage.memory\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif + pod.value.status.containerStatuses != _|_ {\n\t\t\t\tstatus: {for containerStatus + in pod.value.status.containerStatuses if containerStatus.name == container.name + {\n\t\t\t\t\tstate: containerStatus.state\n\t\t\t\t\trestartCount: containerStatus.restartCount\n\t\t\t\t}}\n\t\t\t}\n\t\t}]\n\t\tif + eventList.err == _|_ {\n\t\t\tevents: eventList.list\n\t\t}\n\t}\n\tif pod.err + != _|_ {\n\t\terror: pod.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: pod-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: + ql.#CollectServices & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: + parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: + parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: + parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: + [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: + {\n\t\tservices: result.list\n\t}\n}\n\nif result.err != _|_ {\n\tstatus: {\n\t\terror: + result.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-service-view + namespace: vela-system +``` +
+ +You can install the addon by one command like: + +``` +vela addon enable velaux --dry-run | kubectl apply -f - +``` + +:::caution +Use dry-run can render YAML results and you will also lose the validation such as vela-core version check, dependency, etc. Make sure the version you used can match to your Kubernetes clusters. +::: + ### Get addon info If you want to check the detail status of an addon, or get more available parameters and other useful info of an addon, you can use command `addon status`. For example: @@ -96,7 +557,6 @@ If you want to check the detail status of an addon, or get more available parame vela addon enable velaux --verbose ``` -
expected output @@ -215,60 +675,6 @@ Successfully delete an addon registry experimental You can use ChartMuseum to build your custom addon registry. We have a ChartMuseum addon available. Please refer to [*Build your Own Registry*](../../platform-engineers/addon/addon-registry) for details. -### Air-Gapped Installation for Addon - -If your cluster network cannot connect to the community addon registry you can: -- build your custom addon registry. Please refer to [*Build your Own Registry*](../../platform-engineers/addon/addon-registry) for details. -- enable an addon from a local directory. Example: - -```shell -$ tree velaux -L 1 -velaux -├── metadata.yaml -├── readme_cn.md -├── readme.md -├── resources -├── schemas -└── template.yaml - -2 directories, 4 files -``` - -* Enable the addon from local directory. - -``` -vela addon enable ./velaux -``` - -
-expected output - -``` -Addon: velaux enabled successfully -``` -
- -:::caution -Please notice that, while an addon is being installed in a cluster, it maybe still need pull some images or Helm Charts. If your cluster cannot reach these resources please refer [docs](../../platform-engineers/system-operation/enable-addon-offline) to complete installation without Internet access. -::: - -### Manage the addon with UI Console - -If you have installed [VelaUX](../../reference/addons/velaux) which is also one of the addon, you can manage it directly on the UI console with admin privileges. - -![addon list](https://static.kubevela.net/images/1.3/addon-list.jpg) - -In the addon list, you can get the status of the addon and other info. Click the addon name could open the addon detail page, you can get the version list, definitions provided by the addon, and the readme message. - -![addon detail](https://static.kubevela.net/images/1.3/addon-detail.jpg) - -Select a version and deployed clusters, you can click the enable button to install this addon. You can check detail information in this section include: - -- Definitions: The extension capabilities provided by the addon may include component, trait, etc. -- README: Addon description, explain the capabilities and related information. - -For enabled addons, if no applications to use definitions, you can click the disable button to uninstall it. - ### Make your own addon If you're a system infra or operator, you can refer to extension documents to learn how to [make your own addon and registry](../../platform-engineers/addon/intro), including [extend cloud resources by addon](../../platform-engineers/addon/terraform). diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md b/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md index 8412d20bec6..a44cfecc51d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md @@ -26,7 +26,7 @@ vela addon list ```
-期望输出 +该命令会输出所有插件版本以及你安装的版本 ``` NAME REGISTRY DESCRIPTION AVAILABLE-VERSIONS STATUS @@ -51,6 +51,10 @@ terraform-alibaba KubeVela Kubernetes Terraform Controller ### 安装插件 +#### 命令行安装 + +最简单的安装命令如下: + ``` vela addon enable fluxcd ``` @@ -92,6 +96,436 @@ vela addon enable --clusters={cluster1,cluster2} vela addon enable velaux repo= ``` +#### 离线安装插件 + +如果因为某些原因,你的环境无法通过访问插件包仓库,你可以通过指定本地的插件包目录来进行离线安装。如下所示: + +``` +$ ls +README.md fluxcd ocm-cluster-manager terraform terraform-alibaba terraform-aws terraform-azure velaux + +$ vela addon enable velaux/ +Addon: velaux enabled Successfully +``` + +需要注意的是,在安装插件过程当中,仍可能需要从网络中拉取镜像或者 helm chart,如果你的网络环境同样无法访问这些地址,请参考[文档](../../platform-engineers/system-operation/enable-addon-offline)进行完整的离线安装。 + +#### 通过 UI 安装插件 + +具有插件管理权限的用户可以进入插件管理页面,进行插件启用/停用等操作。 + +![addon list](https://static.kubevela.net/images/1.3/addon-list.jpg) + +如上图所示,在插件列表中,你可以查看到插件启用状态和其他基础信息。点击插件名称可以进入到插件详情页面,你可以查询到插件的版本列表,提供的扩展类型和介绍信息。 + +![addon detail](https://static.kubevela.net/images/1.3/addon-detail.jpg) + +选择一个部署版本(默认为最新),设置需要部署的集群后,你可以点击 启用 按钮安装该插件。对于已启用的插件,如果没有应用使用该插件提供的扩展,你可以点击禁用按钮来卸载它。 + +#### 通过 YAML 或 kubectl 命令行安装插件 + +如果你想通过 Kubernetes YAML 的方式安装插件或者使用 kubectl 命令行安装插件,你可以通过如下命令将 addon 变成 YAML 渲染出来。 + +```shell +vela addon enable velaux --dry-run +``` + +
+期望输出 + +``` +apiVersion: core.oam.dev/v1beta1 +kind: Application +metadata: + creationTimestamp: null + labels: + addons.oam.dev/name: velaux + addons.oam.dev/registry: KubeVela + addons.oam.dev/version: v1.5.8 + name: addon-velaux + namespace: vela-system +spec: + components: + - name: apiserver + properties: + cmd: + - apiserver + - --datastore-type=kubeapi + image: oamdev/vela-apiserver:v1.5.8 + ports: + - expose: true + port: 8000 + protocol: TCP + traits: + - properties: + name: kubevela-vela-core + type: service-account + - properties: + replicas: 1 + type: scaler + type: webservice + - dependsOn: + - apiserver + name: velaux + properties: + env: + - name: KUBEVELA_API_URL + value: apiserver.vela-system:8000 + exposeType: ClusterIP + image: oamdev/velaux:v1.5.8 + ports: + - expose: true + port: 80 + protocol: TCP + traits: + - properties: + replicas: 1 + type: scaler + type: webservice +status: {} + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"pvc","label":"PersistentVolumeClaim","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"maxLength":32,"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"mountPath","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"resources","sort":7,"subParameters":[{"jsonKey":"requests","sort":1,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Request + Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"},{"jsonKey":"limits","sort":3,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Limit + Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"}],"validate":{"defaultValue":{"limits":{"storage":"8Gi"},"requests":{"storage":"8Gi"}},"required":true}},{"description":"If + not specified, the cluster default StorageClass is used.","jsonKey":"storageClassName","sort":9},{"jsonKey":"accessModes","sort":11,"validate":{"defaultValue":["ReadWriteOnce"],"required":false}},{"description":"You + can set the value of volumeMode to Block to use a volume as a raw block device.","jsonKey":"volumeMode","sort":12,"uiType":"Select","validate":{"defaultValue":"Filesystem","options":[{"label":"Filesystem","value":"Filesystem"},{"label":"Block","value":"Block"}]}},{"description":"The + VolumeName is the binding reference to the PersistentVolume backing this claim.","jsonKey":"volumeName","sort":14},{"jsonKey":"selector","sort":17},{"description":"It + will create a new volume based on the contents of the specified data source.","jsonKey":"dataSource","sort":19},{"disable":true,"jsonKey":"dataSourceRef","sort":20},{"disable":true,"jsonKey":"mountOnly"}]},{"disable":true,"jsonKey":"secret","sort":3},{"disable":true,"jsonKey":"configMap","sort":5},{"disable":true,"jsonKey":"emptyDir"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: trait-uischema-storage + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"url","label":"URL","sort":1,"subParameters":[{"jsonKey":"value","label":"URL","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"data","sort":3}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-webhook + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"replicas","validate":{"min":0,"required":true}}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: trait-uischema-scaler + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"image","label":"Container Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"description":"Specifies + the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":4,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies + the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":5,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"exposeType","sort":6,"validate":null},{"jsonKey":"ports","label":"Service + Ports","sort":7,"subParameters":[{"jsonKey":"port","sort":1,"validate":{"min":1,"required":true}},{"jsonKey":"protocol","sort":3},{"disable":true,"jsonKey":"name","sort":4},{"jsonKey":"expose","sort":5}],"validate":{"defaultValue":[{"expose":true,"port":80,"protocol":"TCP"}],"required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add + By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret + Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret + Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"description":"Set + the path and type that the service needs to persist.","jsonKey":"volumeMounts","label":"Persistent + Storage","sort":12,"subParameters":[{"disable":true,"jsonKey":"configMap"},{"disable":true,"jsonKey":"secret"},{"jsonKey":"pvc","label":"Storage + By PVC","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"claimName","sort":3},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"hostPath","label":"Storage + By HostPath","sort":3,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"path","label":"Host + Path","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"emptyDir","label":"Temporary + Storage","sort":5,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"medium","sort":3,"validate":{"options":[{"label":"Memory","value":"memory"},{"label":"Dir","value":""}],"required":false}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]}],"uiType":"Group"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify + image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image + Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"addRevisionLabel"},{"disable":true,"jsonKey":"port"},{"disable":true,"jsonKey":"volumes"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-uischema-webservice + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"parallel","sort":5,"validate":{"defaultValue":false}},{"jsonKey":"policy","sort":1},{"jsonKey":"env","sort":3}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-deploy2env + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"image","label":"Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"jsonKey":"restart","sort":3,"uiType":"Select","validate":{"defaultValue":"Never","options":[{"label":"Never","value":"Never"},{"label":"OnFailure","value":"OnFailure"}],"required":true}},{"jsonKey":"count","sort":4,"uiType":"Number","validate":{"defaultValue":1,"max":128,"min":0,"required":true}},{"description":"Specifies + the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":5,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies + the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":7,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add + By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret + Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret + Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify + image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image + Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"volumes"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-uischema-task + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"description":"Support push messages to Dingding Group.","jsonKey":"dingding","sort":1,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"description":"Specify + the message that you want to sent","jsonKey":"message","sort":3,"subParameters":[{"disable":true,"jsonKey":"msgtype"},{"disable":true,"jsonKey":"link"},{"disable":true,"jsonKey":"markdown"},{"disable":true,"jsonKey":"at"},{"disable":true,"jsonKey":"actionCard"},{"disable":true,"jsonKey":"feedCard"},{"jsonKey":"text","subParameters":[{"description":"Specify + the message that you want to sent","jsonKey":"content","label":"Message"}],"uiType":"Ignore"}],"uiType":"Ignore"}]},{"description":"Support + push email message.","jsonKey":"email","sort":3,"subParameters":[{"jsonKey":"from","sort":1,"subParameters":[{"jsonKey":"host","sort":1},{"jsonKey":"port","sort":3},{"jsonKey":"address","sort":5},{"jsonKey":"password","sort":7,"subParameters":[{"jsonKey":"value","label":"Password","uiType":"Password","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"alias","sort":9}]},{"jsonKey":"to","sort":3},{"jsonKey":"content","sort":5,"subParameters":[{"jsonKey":"subject","sort":1},{"jsonKey":"body","sort":3}]}]},{"description":"Support + push messages to slack channel.","jsonKey":"slack","sort":5,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"message","subParameters":[{"disable":true,"jsonKey":"blocks"},{"disable":true,"jsonKey":"attachments"},{"disable":true,"jsonKey":"thread_ts"},{"disable":true,"jsonKey":"mrkdwn"},{"description":"Specify + the message that you want to sent","jsonKey":"text","label":"Message"}],"uiType":"Ignore"}]}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-notification + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"dbType","label":"DBType","sort":1,"validate":{"defaultValue":"kubeapi","options":[{"label":"MongoDB","value":"mongodb"},{"label":"KubeAPI","value":"kubeapi"}],"required":true}},{"conditions":[{"jsonKey":"dbType","op":"==","value":"mongodb"}],"jsonKey":"dbURL","label":"DatabaseURL","sort":3,"validate":{"required":true}},{"jsonKey":"database","sort":7,"validate":{"defaultValue":"kubevela","required":true}},{"disable":true,"jsonKey":"serviceAccountName"},{"jsonKey":"serviceType","sort":8},{"jsonKey":"domain","sort":9},{"jsonKey":"gatewayDriver","sort":10},{"jsonKey":"repo","sort":11},{"jsonKey":"imagePullSecrets","sort":13}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: addon-uischema-velaux + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"policies","label":"Policies","sort":10,"uiType":"PolicySelect","validate":{"required":true}},{"jsonKey":"parallelism","sort":20,"style":{"colSpan":12}},{"jsonKey":"auto","sort":30,"style":{"colSpan":12}}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: workflowstep-uischema-deploy + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"objects","uiType":"K8sObjectsCode"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-uischema-k8s-objects + namespace: vela-system + +--- +apiVersion: v1 +data: + ui-schema: '[{"jsonKey":"selector","sort":100,"uiType":"ComponentSelect"},{"jsonKey":"components","sort":101,"uiType":"ComponentPatches"}]' +kind: ConfigMap +metadata: + creationTimestamp: null + name: policy-uischema-override + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresources: ql.#ListResourcesInApp + & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: parameter.appNs\n\t\tfilter: + {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: parameter.cluster\n\t\t\t}\n\t\t\tif + parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: parameter.clusterNs\n\t\t\t}\n\t\t\tapiVersion: + \"v1\"\n\t\t\tkind: \"Service\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: + {\n\tif resources.err == _|_ {\n\t\tservices: [ for i, resource in resources.list + {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: + resources.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: service-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace?: + string\n\tcluster?: string\n\tkind: string\n\tapiVersion: string\n}\nresponse: + ql.#Read & {\n\tvalue: {\n\t\tapiVersion: parameter.apiVersion\n\t\tkind: parameter.kind\n\t\tmetadata: + {\n\t\t\tname: parameter.name\n\t\t\tif parameter.namespace != _|_ {\n\t\t\t\tnamespace: + parameter.namespace\n\t\t\t}\n\t\t}\n\t}\n\tif parameter.cluster != _|_ {\n\t\tcluster: + parameter.cluster\n\t}\n}\n\nif response.err == _|_ {\n\tstatus: {\n\t\tresource: + response.value\n\t}\n}\nif response.err != _|_ {\n\tstatus: {\n\t\terror: response.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: application-resource-detail-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: + ql.#CollectPods & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: + parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: + parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: + parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: + [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: + {\n\t\tpodList: [ for pod in result.list if pod.object != _|_ {\n\t\t\tcluster: + \ pod.cluster\n\t\t\tworkload: pod.workload\n\t\t\tcomponent: pod.component\n\t\t\tmetadata: + {\n\t\t\t\tname: pod.object.metadata.name\n\t\t\t\tnamespace: pod.object.metadata.namespace\n\t\t\t\tcreationTime: + pod.object.metadata.creationTimestamp\n\t\t\t\tlabels: pod.object.metadata.labels\n\t\t\t\tversion: + {\n\t\t\t\t\tif pod.publishVersion != _|_ {\n\t\t\t\t\t\tpublishVersion: pod.publishVersion\n\t\t\t\t\t}\n\t\t\t\t\tif + pod.deployVersion != _|_ {\n\t\t\t\t\t\tdeployVersion: pod.deployVersion\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatus: + {\n\t\t\t\tphase: pod.object.status.phase\n\t\t\t\t// refer to https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase\n\t\t\t\tif + phase != \"Pending\" && phase != \"Unknown\" {\n\t\t\t\t\tpodIP: pod.object.status.podIP\n\t\t\t\t\thostIP: + \ pod.object.status.hostIP\n\t\t\t\t\tnodeName: pod.object.spec.nodeName\n\t\t\t\t}\n\t\t\t}\n\t\t}]\n\t}\n}\n\nif + result.err != _|_ {\n\tstatus: {\n\t\terror: result.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-pod-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\ttype: string\n\tnamespace: + *\"\" | string\n\tcluster: *\"\" | string\n}\n\nschema: {\n\t\"secret\": {\n\t\tapiVersion: + \"v1\"\n\t\tkind: \"Secret\"\n\t}\n\t\"configMap\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: + \ \"ConfigMap\"\n\t}\n\t\"pvc\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"PersistentVolumeClaim\"\n\t}\n\t\"storageClass\": + {\n\t\tapiVersion: \"storage.k8s.io/v1\"\n\t\tkind: \"StorageClass\"\n\t}\n\t\"ns\": + {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Namespace\"\n\t}\n\t\"provider\": + {\n\t\tapiVersion: \"terraform.core.oam.dev/v1beta1\"\n\t\tkind: \"Provider\"\n\t}\n}\n\nList: + ql.#List & {\n\tresource: schema[parameter.type]\n\tfilter: {\n\t\tnamespace: + parameter.namespace\n\t}\n\tcluster: parameter.cluster\n}\n\nstatus: {\n\tif List.err + == _|_ {\n\t\tif len(List.list.items) == 0 {\n\t\t\terror: \"failed to list \\(parameter.type) + in namespace \\(parameter.namespace)\"\n\t\t}\n\t\tif len(List.list.items) != + 0 {\n\t\t\tlist: List.list.items\n\t\t}\n\t}\n\n\tif List.err != _|_ {\n\t\terror: + List.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: resource-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\ncollectLogs: ql.#CollectLogsInPod & {\n\tcluster: + \ parameter.cluster\n\tnamespace: parameter.namespace\n\tpod: parameter.pod\n\toptions: + {\n\t\tcontainer: parameter.container\n\t\tprevious?: parameter.previous\n\t\tsinceSeconds?: + parameter.sinceSeconds\n\t\tsinceTime?: parameter.sinceTime\n\t\ttimestamps?: + \ parameter.timestamps\n\t\ttailLines?: parameter.tailLines\n\t\tlimitBytes?: + \ parameter.limitBytes\n\t}\n}\nstatus: collectLogs.outputs\n\nparameter: {\n\t// + +usage=Specify the cluster of the pod\n\tcluster: string\n\t// +usage=Specify + the namespace of the pod\n\tnamespace: string\n\t// +usage=Specify the name of + the pod\n\tpod: string\n\n\t// +usage=Specify the name of the container\n\tcontainer: + string\n\t// +usage=If true, return previous terminated container logs\n\tprevious: + *false | bool\n\t// +usage=If set, show logs in relative times\n\tsinceSeconds: + *null | int\n\t// +usage=RFC3339 timestamp, if set, show logs since this time\n\tsinceTime: + *null | string\n\t// +usage=If true, add timestamp at the beginning of every line\n\ttimestamps: + *false | bool\n\t// +usage=If set, return the number of lines from the end of + logs\n\ttailLines: *null | int\n\t// +usage=If set, limit the size of returned + bytes\n\tlimitBytes: *null | int\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: collect-logs + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n}\n\nresources: ql.#ListResourcesInApp & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: + parameter.appNs\n\t\tfilter: {\n\t\t\t\"apiVersion\": \"terraform.core.oam.dev/v1beta2\"\n\t\t\t\"kind\": + \ \"Configuration\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: {\n\tif + resources.err == _|_ {\n\t\t\"cloud-resources\": [ for i, resource in resources.list + {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: + resources.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: cloud-resource-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName?: string\n\tappNs?: + \ string\n}\n\nsecretList: ql.#List & {\n\tresource: {\n\t\tapiVersion: \"v1\"\n\t\tkind: + \ \"Secret\"\n\t}\n\tfilter: {\n\t\tmatchingLabels: {\n\t\t\t\"created-by\": + \"terraform-controller\"\n\t\t\tif parameter.appName != _|_ && parameter.appNs + != _|_ {\n\t\t\t\t\"app.oam.dev/name\": parameter.appName\n\t\t\t\t\"app.oam.dev/namespace\": + parameter.appNs\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatus: {\n\tif secretList.err == _|_ + {\n\t\tsecrets: secretList.list.items\n\t}\n\tif secretList.err != _|_ {\n\t\terror: + secretList.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: cloud-resource-secret-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace: + string\n\tcluster: *\"\" | string\n}\n\npod: ql.#Read & {\n\tvalue: {\n\t\tapiVersion: + \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: + parameter.namespace\n\t\t}\n\t}\n\tcluster: parameter.cluster\n}\n\neventList: + ql.#SearchEvents & {\n\tvalue: {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: + \ pod.value.metadata\n\t}\n\tcluster: parameter.cluster\n}\n\npodMetrics: ql.#Read + & {\n\tcluster: parameter.cluster\n\tvalue: {\n\t\tapiVersion: \"metrics.k8s.io/v1beta1\"\n\t\tkind: + \ \"PodMetrics\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: + parameter.namespace\n\t\t}\n\t}\n}\n\nstatus: {\n\tif pod.err == _|_ {\n\t\tcontainers: + [ for container in pod.value.spec.containers {\n\t\t\tname: container.name\n\t\t\timage: + container.image\n\t\t\tresources: {\n\t\t\t\tif container.resources.limits != + _|_ {\n\t\t\t\t\tlimits: container.resources.limits\n\t\t\t\t}\n\t\t\t\tif container.resources.requests + != _|_ {\n\t\t\t\t\trequests: container.resources.requests\n\t\t\t\t}\n\t\t\t\tif + podMetrics.err == _|_ {\n\t\t\t\t\tusage: {for containerUsage in podMetrics.value.containers + {\n\t\t\t\t\t\tif containerUsage.name == container.name {\n\t\t\t\t\t\t\tcpu: + \ containerUsage.usage.cpu\n\t\t\t\t\t\t\tmemory: containerUsage.usage.memory\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif + pod.value.status.containerStatuses != _|_ {\n\t\t\t\tstatus: {for containerStatus + in pod.value.status.containerStatuses if containerStatus.name == container.name + {\n\t\t\t\t\tstate: containerStatus.state\n\t\t\t\t\trestartCount: containerStatus.restartCount\n\t\t\t\t}}\n\t\t\t}\n\t\t}]\n\t\tif + eventList.err == _|_ {\n\t\t\tevents: eventList.list\n\t\t}\n\t}\n\tif pod.err + != _|_ {\n\t\terror: pod.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: pod-view + namespace: vela-system + +--- +apiVersion: v1 +data: + template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: + \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: + ql.#CollectServices & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: + parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: + parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: + parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: + [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: + {\n\t\tservices: result.list\n\t}\n}\n\nif result.err != _|_ {\n\tstatus: {\n\t\terror: + result.err\n\t}\n}\n" +kind: ConfigMap +metadata: + creationTimestamp: null + name: component-service-view + namespace: vela-system +``` +
+ +可以直接通过下面一行命令直接部署验证: + +``` +vela addon enable velaux --dry-run | kubectl apply -f - +``` + +:::caution +使用 dry-run 生成的 YAML 虽然可以直接部署,但是会损失 addon 命令行中对版本的检验和依赖检查等保护,请确保你使用的是合适的插件版本。 +::: + ### 获取插件详情 如果你想获取插件的详细信息,或者查看插件支持哪些启用参数等其他信息,你就可以用 `addon status` 的命令。 例如: @@ -217,31 +651,7 @@ Addon: ```
-### 离线安装插件包 - -如果因为某些原因,你的环境无法通过访问插件包仓库,你可以通过指定本地的插件包目录来进行离线安装。如下所示: - -``` -$ ls -README.md fluxcd ocm-cluster-manager terraform terraform-alibaba terraform-aws terraform-azure velaux -$ vela addon enable velaux/ -Addon: velaux enabled Successfully -``` - -需要注意的是,在安装插件过程当中,仍可能需要从网络中拉取镜像或者 helm chart,如果你的网络环境同样无法访问这些地址,请参考[文档](../../platform-engineers/system-operation/enable-addon-offline)进行完整的离线安装。 - -### 通过 UI 管理插件 - -具有插件管理权限的用户可以进入插件管理页面,进行插件启用/停用等操作。 - -![addon list](https://static.kubevela.net/images/1.3/addon-list.jpg) - -如上图所示,在插件列表中,你可以查看到插件启用状态和其他基础信息。点击插件名称可以进入到插件详情页面,你可以查询到插件的版本列表,提供的扩展类型和介绍信息。 - -![addon detail](https://static.kubevela.net/images/1.3/addon-detail.jpg) - -选择一个部署版本(默认为最新),设置需要部署的集群后,你可以点击 启用 按钮安装该插件。对于已启用的插件,如果没有应用使用该插件提供的扩展,你可以点击禁用按钮来卸载它。 ### 编写自己的插件包 From ee8e7bf2a73c37995aa5ef3aee9e450c66d68705 Mon Sep 17 00:00:00 2001 From: Jianbo Sun Date: Tue, 25 Oct 2022 18:19:15 +0800 Subject: [PATCH 2/2] update more docs for 1.6 Signed-off-by: Jianbo Sun --- docs/end-user/components/more.md | 319 +----------------- .../components/custom-component.md | 61 +++- .../traits/customize-trait.md | 61 +++- docs/platform-engineers/workflow/workflow.md | 28 +- .../current/end-user/components/more.md | 308 +---------------- .../components/custom-component.md | 73 +++- .../traits/customize-trait.md | 61 +++- 7 files changed, 252 insertions(+), 659 deletions(-) diff --git a/docs/end-user/components/more.md b/docs/end-user/components/more.md index 67d50fe273a..2be4c2e5230 100644 --- a/docs/end-user/components/more.md +++ b/docs/end-user/components/more.md @@ -207,138 +207,6 @@ spec: type: webservice status: {} ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"pvc","label":"PersistentVolumeClaim","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"maxLength":32,"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"mountPath","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"resources","sort":7,"subParameters":[{"jsonKey":"requests","sort":1,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Request - Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"},{"jsonKey":"limits","sort":3,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Limit - Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"}],"validate":{"defaultValue":{"limits":{"storage":"8Gi"},"requests":{"storage":"8Gi"}},"required":true}},{"description":"If - not specified, the cluster default StorageClass is used.","jsonKey":"storageClassName","sort":9},{"jsonKey":"accessModes","sort":11,"validate":{"defaultValue":["ReadWriteOnce"],"required":false}},{"description":"You - can set the value of volumeMode to Block to use a volume as a raw block device.","jsonKey":"volumeMode","sort":12,"uiType":"Select","validate":{"defaultValue":"Filesystem","options":[{"label":"Filesystem","value":"Filesystem"},{"label":"Block","value":"Block"}]}},{"description":"The - VolumeName is the binding reference to the PersistentVolume backing this claim.","jsonKey":"volumeName","sort":14},{"jsonKey":"selector","sort":17},{"description":"It - will create a new volume based on the contents of the specified data source.","jsonKey":"dataSource","sort":19},{"disable":true,"jsonKey":"dataSourceRef","sort":20},{"disable":true,"jsonKey":"mountOnly"}]},{"disable":true,"jsonKey":"secret","sort":3},{"disable":true,"jsonKey":"configMap","sort":5},{"disable":true,"jsonKey":"emptyDir"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: trait-uischema-storage - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"url","label":"URL","sort":1,"subParameters":[{"jsonKey":"value","label":"URL","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"data","sort":3}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-webhook - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"replicas","validate":{"min":0,"required":true}}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: trait-uischema-scaler - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"image","label":"Container Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"description":"Specifies - the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":4,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies - the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":5,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"exposeType","sort":6,"validate":null},{"jsonKey":"ports","label":"Service - Ports","sort":7,"subParameters":[{"jsonKey":"port","sort":1,"validate":{"min":1,"required":true}},{"jsonKey":"protocol","sort":3},{"disable":true,"jsonKey":"name","sort":4},{"jsonKey":"expose","sort":5}],"validate":{"defaultValue":[{"expose":true,"port":80,"protocol":"TCP"}],"required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add - By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret - Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret - Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"description":"Set - the path and type that the service needs to persist.","jsonKey":"volumeMounts","label":"Persistent - Storage","sort":12,"subParameters":[{"disable":true,"jsonKey":"configMap"},{"disable":true,"jsonKey":"secret"},{"jsonKey":"pvc","label":"Storage - By PVC","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"claimName","sort":3},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"hostPath","label":"Storage - By HostPath","sort":3,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"path","label":"Host - Path","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"emptyDir","label":"Temporary - Storage","sort":5,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"medium","sort":3,"validate":{"options":[{"label":"Memory","value":"memory"},{"label":"Dir","value":""}],"required":false}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]}],"uiType":"Group"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify - image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image - Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"addRevisionLabel"},{"disable":true,"jsonKey":"port"},{"disable":true,"jsonKey":"volumes"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-uischema-webservice - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"parallel","sort":5,"validate":{"defaultValue":false}},{"jsonKey":"policy","sort":1},{"jsonKey":"env","sort":3}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-deploy2env - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"image","label":"Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"jsonKey":"restart","sort":3,"uiType":"Select","validate":{"defaultValue":"Never","options":[{"label":"Never","value":"Never"},{"label":"OnFailure","value":"OnFailure"}],"required":true}},{"jsonKey":"count","sort":4,"uiType":"Number","validate":{"defaultValue":1,"max":128,"min":0,"required":true}},{"description":"Specifies - the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":5,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies - the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":7,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add - By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret - Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret - Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify - image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image - Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"volumes"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-uischema-task - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"description":"Support push messages to Dingding Group.","jsonKey":"dingding","sort":1,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"description":"Specify - the message that you want to sent","jsonKey":"message","sort":3,"subParameters":[{"disable":true,"jsonKey":"msgtype"},{"disable":true,"jsonKey":"link"},{"disable":true,"jsonKey":"markdown"},{"disable":true,"jsonKey":"at"},{"disable":true,"jsonKey":"actionCard"},{"disable":true,"jsonKey":"feedCard"},{"jsonKey":"text","subParameters":[{"description":"Specify - the message that you want to sent","jsonKey":"content","label":"Message"}],"uiType":"Ignore"}],"uiType":"Ignore"}]},{"description":"Support - push email message.","jsonKey":"email","sort":3,"subParameters":[{"jsonKey":"from","sort":1,"subParameters":[{"jsonKey":"host","sort":1},{"jsonKey":"port","sort":3},{"jsonKey":"address","sort":5},{"jsonKey":"password","sort":7,"subParameters":[{"jsonKey":"value","label":"Password","uiType":"Password","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"alias","sort":9}]},{"jsonKey":"to","sort":3},{"jsonKey":"content","sort":5,"subParameters":[{"jsonKey":"subject","sort":1},{"jsonKey":"body","sort":3}]}]},{"description":"Support - push messages to slack channel.","jsonKey":"slack","sort":5,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"message","subParameters":[{"disable":true,"jsonKey":"blocks"},{"disable":true,"jsonKey":"attachments"},{"disable":true,"jsonKey":"thread_ts"},{"disable":true,"jsonKey":"mrkdwn"},{"description":"Specify - the message that you want to sent","jsonKey":"text","label":"Message"}],"uiType":"Ignore"}]}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-notification - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"dbType","label":"DBType","sort":1,"validate":{"defaultValue":"kubeapi","options":[{"label":"MongoDB","value":"mongodb"},{"label":"KubeAPI","value":"kubeapi"}],"required":true}},{"conditions":[{"jsonKey":"dbType","op":"==","value":"mongodb"}],"jsonKey":"dbURL","label":"DatabaseURL","sort":3,"validate":{"required":true}},{"jsonKey":"database","sort":7,"validate":{"defaultValue":"kubevela","required":true}},{"disable":true,"jsonKey":"serviceAccountName"},{"jsonKey":"serviceType","sort":8},{"jsonKey":"domain","sort":9},{"jsonKey":"gatewayDriver","sort":10},{"jsonKey":"repo","sort":11},{"jsonKey":"imagePullSecrets","sort":13}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: addon-uischema-velaux - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"policies","label":"Policies","sort":10,"uiType":"PolicySelect","validate":{"required":true}},{"jsonKey":"parallelism","sort":20,"style":{"colSpan":12}},{"jsonKey":"auto","sort":30,"style":{"colSpan":12}}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-deploy - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"objects","uiType":"K8sObjectsCode"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-uischema-k8s-objects - namespace: vela-system - --- apiVersion: v1 data: @@ -349,193 +217,8 @@ metadata: name: policy-uischema-override namespace: vela-system ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresources: ql.#ListResourcesInApp - & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: parameter.appNs\n\t\tfilter: - {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: parameter.cluster\n\t\t\t}\n\t\t\tif - parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: parameter.clusterNs\n\t\t\t}\n\t\t\tapiVersion: - \"v1\"\n\t\t\tkind: \"Service\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: - {\n\tif resources.err == _|_ {\n\t\tservices: [ for i, resource in resources.list - {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: - resources.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: service-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace?: - string\n\tcluster?: string\n\tkind: string\n\tapiVersion: string\n}\nresponse: - ql.#Read & {\n\tvalue: {\n\t\tapiVersion: parameter.apiVersion\n\t\tkind: parameter.kind\n\t\tmetadata: - {\n\t\t\tname: parameter.name\n\t\t\tif parameter.namespace != _|_ {\n\t\t\t\tnamespace: - parameter.namespace\n\t\t\t}\n\t\t}\n\t}\n\tif parameter.cluster != _|_ {\n\t\tcluster: - parameter.cluster\n\t}\n}\n\nif response.err == _|_ {\n\tstatus: {\n\t\tresource: - response.value\n\t}\n}\nif response.err != _|_ {\n\tstatus: {\n\t\terror: response.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: application-resource-detail-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: - ql.#CollectPods & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: - parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: - parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: - parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: - [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: - {\n\t\tpodList: [ for pod in result.list if pod.object != _|_ {\n\t\t\tcluster: - \ pod.cluster\n\t\t\tworkload: pod.workload\n\t\t\tcomponent: pod.component\n\t\t\tmetadata: - {\n\t\t\t\tname: pod.object.metadata.name\n\t\t\t\tnamespace: pod.object.metadata.namespace\n\t\t\t\tcreationTime: - pod.object.metadata.creationTimestamp\n\t\t\t\tlabels: pod.object.metadata.labels\n\t\t\t\tversion: - {\n\t\t\t\t\tif pod.publishVersion != _|_ {\n\t\t\t\t\t\tpublishVersion: pod.publishVersion\n\t\t\t\t\t}\n\t\t\t\t\tif - pod.deployVersion != _|_ {\n\t\t\t\t\t\tdeployVersion: pod.deployVersion\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatus: - {\n\t\t\t\tphase: pod.object.status.phase\n\t\t\t\t// refer to https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase\n\t\t\t\tif - phase != \"Pending\" && phase != \"Unknown\" {\n\t\t\t\t\tpodIP: pod.object.status.podIP\n\t\t\t\t\thostIP: - \ pod.object.status.hostIP\n\t\t\t\t\tnodeName: pod.object.spec.nodeName\n\t\t\t\t}\n\t\t\t}\n\t\t}]\n\t}\n}\n\nif - result.err != _|_ {\n\tstatus: {\n\t\terror: result.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-pod-view - namespace: vela-system +... snip ... ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\ttype: string\n\tnamespace: - *\"\" | string\n\tcluster: *\"\" | string\n}\n\nschema: {\n\t\"secret\": {\n\t\tapiVersion: - \"v1\"\n\t\tkind: \"Secret\"\n\t}\n\t\"configMap\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: - \ \"ConfigMap\"\n\t}\n\t\"pvc\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"PersistentVolumeClaim\"\n\t}\n\t\"storageClass\": - {\n\t\tapiVersion: \"storage.k8s.io/v1\"\n\t\tkind: \"StorageClass\"\n\t}\n\t\"ns\": - {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Namespace\"\n\t}\n\t\"provider\": - {\n\t\tapiVersion: \"terraform.core.oam.dev/v1beta1\"\n\t\tkind: \"Provider\"\n\t}\n}\n\nList: - ql.#List & {\n\tresource: schema[parameter.type]\n\tfilter: {\n\t\tnamespace: - parameter.namespace\n\t}\n\tcluster: parameter.cluster\n}\n\nstatus: {\n\tif List.err - == _|_ {\n\t\tif len(List.list.items) == 0 {\n\t\t\terror: \"failed to list \\(parameter.type) - in namespace \\(parameter.namespace)\"\n\t\t}\n\t\tif len(List.list.items) != - 0 {\n\t\t\tlist: List.list.items\n\t\t}\n\t}\n\n\tif List.err != _|_ {\n\t\terror: - List.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: resource-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\ncollectLogs: ql.#CollectLogsInPod & {\n\tcluster: - \ parameter.cluster\n\tnamespace: parameter.namespace\n\tpod: parameter.pod\n\toptions: - {\n\t\tcontainer: parameter.container\n\t\tprevious?: parameter.previous\n\t\tsinceSeconds?: - parameter.sinceSeconds\n\t\tsinceTime?: parameter.sinceTime\n\t\ttimestamps?: - \ parameter.timestamps\n\t\ttailLines?: parameter.tailLines\n\t\tlimitBytes?: - \ parameter.limitBytes\n\t}\n}\nstatus: collectLogs.outputs\n\nparameter: {\n\t// - +usage=Specify the cluster of the pod\n\tcluster: string\n\t// +usage=Specify - the namespace of the pod\n\tnamespace: string\n\t// +usage=Specify the name of - the pod\n\tpod: string\n\n\t// +usage=Specify the name of the container\n\tcontainer: - string\n\t// +usage=If true, return previous terminated container logs\n\tprevious: - *false | bool\n\t// +usage=If set, show logs in relative times\n\tsinceSeconds: - *null | int\n\t// +usage=RFC3339 timestamp, if set, show logs since this time\n\tsinceTime: - *null | string\n\t// +usage=If true, add timestamp at the beginning of every line\n\ttimestamps: - *false | bool\n\t// +usage=If set, return the number of lines from the end of - logs\n\ttailLines: *null | int\n\t// +usage=If set, limit the size of returned - bytes\n\tlimitBytes: *null | int\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: collect-logs - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n}\n\nresources: ql.#ListResourcesInApp & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: - parameter.appNs\n\t\tfilter: {\n\t\t\t\"apiVersion\": \"terraform.core.oam.dev/v1beta2\"\n\t\t\t\"kind\": - \ \"Configuration\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: {\n\tif - resources.err == _|_ {\n\t\t\"cloud-resources\": [ for i, resource in resources.list - {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: - resources.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: cloud-resource-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName?: string\n\tappNs?: - \ string\n}\n\nsecretList: ql.#List & {\n\tresource: {\n\t\tapiVersion: \"v1\"\n\t\tkind: - \ \"Secret\"\n\t}\n\tfilter: {\n\t\tmatchingLabels: {\n\t\t\t\"created-by\": - \"terraform-controller\"\n\t\t\tif parameter.appName != _|_ && parameter.appNs - != _|_ {\n\t\t\t\t\"app.oam.dev/name\": parameter.appName\n\t\t\t\t\"app.oam.dev/namespace\": - parameter.appNs\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatus: {\n\tif secretList.err == _|_ - {\n\t\tsecrets: secretList.list.items\n\t}\n\tif secretList.err != _|_ {\n\t\terror: - secretList.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: cloud-resource-secret-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace: - string\n\tcluster: *\"\" | string\n}\n\npod: ql.#Read & {\n\tvalue: {\n\t\tapiVersion: - \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: - parameter.namespace\n\t\t}\n\t}\n\tcluster: parameter.cluster\n}\n\neventList: - ql.#SearchEvents & {\n\tvalue: {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: - \ pod.value.metadata\n\t}\n\tcluster: parameter.cluster\n}\n\npodMetrics: ql.#Read - & {\n\tcluster: parameter.cluster\n\tvalue: {\n\t\tapiVersion: \"metrics.k8s.io/v1beta1\"\n\t\tkind: - \ \"PodMetrics\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: - parameter.namespace\n\t\t}\n\t}\n}\n\nstatus: {\n\tif pod.err == _|_ {\n\t\tcontainers: - [ for container in pod.value.spec.containers {\n\t\t\tname: container.name\n\t\t\timage: - container.image\n\t\t\tresources: {\n\t\t\t\tif container.resources.limits != - _|_ {\n\t\t\t\t\tlimits: container.resources.limits\n\t\t\t\t}\n\t\t\t\tif container.resources.requests - != _|_ {\n\t\t\t\t\trequests: container.resources.requests\n\t\t\t\t}\n\t\t\t\tif - podMetrics.err == _|_ {\n\t\t\t\t\tusage: {for containerUsage in podMetrics.value.containers - {\n\t\t\t\t\t\tif containerUsage.name == container.name {\n\t\t\t\t\t\t\tcpu: - \ containerUsage.usage.cpu\n\t\t\t\t\t\t\tmemory: containerUsage.usage.memory\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif - pod.value.status.containerStatuses != _|_ {\n\t\t\t\tstatus: {for containerStatus - in pod.value.status.containerStatuses if containerStatus.name == container.name - {\n\t\t\t\t\tstate: containerStatus.state\n\t\t\t\t\trestartCount: containerStatus.restartCount\n\t\t\t\t}}\n\t\t\t}\n\t\t}]\n\t\tif - eventList.err == _|_ {\n\t\t\tevents: eventList.list\n\t\t}\n\t}\n\tif pod.err - != _|_ {\n\t\terror: pod.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: pod-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: - ql.#CollectServices & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: - parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: - parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: - parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: - [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: - {\n\t\tservices: result.list\n\t}\n}\n\nif result.err != _|_ {\n\tstatus: {\n\t\terror: - result.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-service-view - namespace: vela-system ```
diff --git a/docs/platform-engineers/components/custom-component.md b/docs/platform-engineers/components/custom-component.md index c93d01954f4..af070cc34b3 100644 --- a/docs/platform-engineers/components/custom-component.md +++ b/docs/platform-engineers/components/custom-component.md @@ -541,10 +541,6 @@ local ─── default ─┬─ Service/hello-webserver-auxiliaryworkloa You can also define health check policy and status message when a component deployed and tell the real status to end users. -:::caution -Reference `parameter` defined in `template` is not supported now in health check and custom status, they work in different stage with the resource template. While we're going to support this feature in https://github.com/kubevela/kubevela/issues/4863 . -::: - ### Health check The spec of health check is `.attributes.status.healthPolicy`. @@ -585,6 +581,27 @@ webserver: { } ``` +You can also use the `parameter` defined in the template like: + +``` +webserver: { + type: "component" + ... + attributes: { + status: { + healthPolicy: #""" + isHealth: (context.output.status.readyReplicas > 0) && (context.output.status.readyReplicas == parameter.replicas) + """# + } + } +template: { + parameter: { + replicas: int + } + ... +} +``` + The health check result will be recorded into the corresponding component in `.status.services` of `Application` resource. ```yaml @@ -669,6 +686,42 @@ status: | `context.replicaKey` | The key of replication in context. Replication is an internal policy, it will replicate resources with different keys specified. (This feature will be introduced in v1.6+.) | string | +### Cluster Version + +| Context Variable | Description | Type | +| :---------------------------------: | :---------------------------------------------------------: | :----: | +| `context.clusterVersion.major` | The major version of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.gitVersion` | The gitVersion of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.platform` | The platform information of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.minor` | The minor version of the runtime Kubernetes cluster. | int | + +The cluster version context info can be used for graceful upgrade of definition. For example, you can define different API according to the cluster version. + +``` + outputs: ingress: { + if context.clusterVersion.minor < 19 { + apiVersion: "networking.k8s.io/v1beta1" + } + if context.clusterVersion.minor >= 19 { + apiVersion: "networking.k8s.io/v1" + } + kind: "Ingress" +} +``` + +Or use string contain pattern for this usage: + +``` +import "strings" + +if strings.Contains(context.clusterVersion.gitVersion, "k3s") { + provider: "k3s" +} +if strings.Contains(context.clusterVersion.gitVersion, "aliyun") { + provider: "aliyun" +} +``` + ## Component definition in Kubernetes KubeVela is fully programmable via CUE, while it leverage Kubernetes as control plane and align with the API in yaml. diff --git a/docs/platform-engineers/traits/customize-trait.md b/docs/platform-engineers/traits/customize-trait.md index 773ae8ddf6b..6f6d52ce5d2 100644 --- a/docs/platform-engineers/traits/customize-trait.md +++ b/docs/platform-engineers/traits/customize-trait.md @@ -424,10 +424,6 @@ So KubeVela allow patch or override in this case, please refer to [patch trait]( You can also define health check policy and status message when a trait deployed and tell the real status to end users. -:::caution -Reference `parameter` defined in `template` is not supported now in health check and custom status, they work in different stage with the resource template. While we're going to support this feature in https://github.com/kubevela/kubevela/issues/4863 . -::: - ### Health Check The spec of health check is `.attributes.status.healthPolicy`, it's similar to component definition. @@ -467,6 +463,27 @@ my-ingress: { } ``` +You can also use the `parameter` defined in the template like: + +```cue +mytrait: { + type: "trait" + ... + attributes: { + status: { + healthPolicy: #""" + isHealth: context.outputs."mytrait-\(parameter.name)".status.state == "Available" + """# + } + } +template: { + parameter: { + name: string + } + ... +} +``` + The health check result will be recorded into the corresponding trait in `.status.services` of `Application` resource. ```yaml @@ -562,6 +579,42 @@ status: | `context.appLabels` | The labels of the current application instance. | Object Map | | `context.appAnnotations` | The annotations of the current application instance. | Object Map | +### Cluster Version + +| Context Variable | Description | Type | +| :---------------------------------: | :---------------------------------------------------------: | :----: | +| `context.clusterVersion.major` | The major version of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.gitVersion` | The gitVersion of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.platform` | The platform information of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.minor` | The minor version of the runtime Kubernetes cluster. | int | + +The cluster version context info can be used for graceful upgrade of definition. For example, you can define different API according to the cluster version. + +``` + outputs: ingress: { + if context.clusterVersion.minor < 19 { + apiVersion: "networking.k8s.io/v1beta1" + } + if context.clusterVersion.minor >= 19 { + apiVersion: "networking.k8s.io/v1" + } + kind: "Ingress" +} +``` + +Or use string contain pattern for this usage: + +``` +import "strings" + +if strings.Contains(context.clusterVersion.gitVersion, "k3s") { + provider: "k3s" +} +if strings.Contains(context.clusterVersion.gitVersion, "aliyun") { + provider: "aliyun" +} +``` + ## Trait definition in Kubernetes diff --git a/docs/platform-engineers/workflow/workflow.md b/docs/platform-engineers/workflow/workflow.md index 1f3b4640a3f..24b89c0d0f2 100644 --- a/docs/platform-engineers/workflow/workflow.md +++ b/docs/platform-engineers/workflow/workflow.md @@ -237,20 +237,20 @@ KubeVela allows you to reference some runtime data via the `context` keyword. In a workflow step definition, you can use the following context data: -| Context Variable | Description | Type | -| :------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------: | -| `context.name` | The name of the Application. | string | -| `context.appName` | The name of the Application. | string | -| `context.namespace` | The namespace of the Application. | string | -| `context.appRevision` | The revision of the Application. | string | -| `context.stepName` | The name of current step. | string | -| `context.stepSessionID` | The ID of current step. | string | -| `context.spanID` | The trace ID of current step in this reconcile. ID | string | -| `context.workflowName` | The workflow name specified in annotation. | string | -| `context.publishVersion` | The version of application instance specified in annotation. | string | - - -## Kubernetes 中的 WorkflowStepDefinition +| Context Variable | Description | Type | +| :----------------------: | :----------------------------------------------------------: | :----: | +| `context.name` | The name of the Application. | string | +| `context.appName` | The name of the Application. | string | +| `context.namespace` | The namespace of the Application. | string | +| `context.appRevision` | The revision of the Application. | string | +| `context.stepName` | The name of current step. | string | +| `context.stepSessionID` | The ID of current step. | string | +| `context.spanID` | The trace ID of current step in this reconcile. ID | string | +| `context.workflowName` | The workflow name specified in annotation. | string | +| `context.publishVersion` | The version of application instance specified in annotation. | string | + + +## Kubernetes API for WorkflowStepDefinition KubeVela is fully programmable through CUE, while it leverages Kubernetes as a control plane and is consistent with the API in YAML. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md b/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md index a44cfecc51d..3e24bc7e580 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/end-user/components/more.md @@ -184,31 +184,6 @@ spec: type: webservice status: {} ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"pvc","label":"PersistentVolumeClaim","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"maxLength":32,"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"mountPath","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"resources","sort":7,"subParameters":[{"jsonKey":"requests","sort":1,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Request - Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"},{"jsonKey":"limits","sort":3,"style":{"colSpan":12},"subParameters":[{"jsonKey":"storage","label":"Limit - Storage","uiType":"DiskNumber","validate":{"immutable":true,"required":true}}],"uiType":"Ignore"}],"validate":{"defaultValue":{"limits":{"storage":"8Gi"},"requests":{"storage":"8Gi"}},"required":true}},{"description":"If - not specified, the cluster default StorageClass is used.","jsonKey":"storageClassName","sort":9},{"jsonKey":"accessModes","sort":11,"validate":{"defaultValue":["ReadWriteOnce"],"required":false}},{"description":"You - can set the value of volumeMode to Block to use a volume as a raw block device.","jsonKey":"volumeMode","sort":12,"uiType":"Select","validate":{"defaultValue":"Filesystem","options":[{"label":"Filesystem","value":"Filesystem"},{"label":"Block","value":"Block"}]}},{"description":"The - VolumeName is the binding reference to the PersistentVolume backing this claim.","jsonKey":"volumeName","sort":14},{"jsonKey":"selector","sort":17},{"description":"It - will create a new volume based on the contents of the specified data source.","jsonKey":"dataSource","sort":19},{"disable":true,"jsonKey":"dataSourceRef","sort":20},{"disable":true,"jsonKey":"mountOnly"}]},{"disable":true,"jsonKey":"secret","sort":3},{"disable":true,"jsonKey":"configMap","sort":5},{"disable":true,"jsonKey":"emptyDir"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: trait-uischema-storage - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"url","label":"URL","sort":1,"subParameters":[{"jsonKey":"value","label":"URL","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"data","sort":3}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-webhook - namespace: vela-system --- apiVersion: v1 @@ -220,101 +195,6 @@ metadata: name: trait-uischema-scaler namespace: vela-system ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"image","label":"Container Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"description":"Specifies - the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":4,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies - the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":5,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"exposeType","sort":6,"validate":null},{"jsonKey":"ports","label":"Service - Ports","sort":7,"subParameters":[{"jsonKey":"port","sort":1,"validate":{"min":1,"required":true}},{"jsonKey":"protocol","sort":3},{"disable":true,"jsonKey":"name","sort":4},{"jsonKey":"expose","sort":5}],"validate":{"defaultValue":[{"expose":true,"port":80,"protocol":"TCP"}],"required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add - By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret - Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret - Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"description":"Set - the path and type that the service needs to persist.","jsonKey":"volumeMounts","label":"Persistent - Storage","sort":12,"subParameters":[{"disable":true,"jsonKey":"configMap"},{"disable":true,"jsonKey":"secret"},{"jsonKey":"pvc","label":"Storage - By PVC","sort":1,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"claimName","sort":3},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"hostPath","label":"Storage - By HostPath","sort":3,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"path","label":"Host - Path","sort":3,"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]},{"jsonKey":"emptyDir","label":"Temporary - Storage","sort":5,"subParameters":[{"jsonKey":"name","sort":1,"validate":{"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])$","required":true}},{"jsonKey":"medium","sort":3,"validate":{"options":[{"label":"Memory","value":"memory"},{"label":"Dir","value":""}],"required":false}},{"jsonKey":"mountPath","sort":5,"validate":{"pattern":"^/(.*)$","required":true}}]}],"uiType":"Group"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify - image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image - Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"addRevisionLabel"},{"disable":true,"jsonKey":"port"},{"disable":true,"jsonKey":"volumes"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-uischema-webservice - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"parallel","sort":5,"validate":{"defaultValue":false}},{"jsonKey":"policy","sort":1},{"jsonKey":"env","sort":3}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-deploy2env - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"image","label":"Image","sort":1,"uiType":"ImageInput"},{"disable":true,"jsonKey":"imagePullSecret","sort":2},{"jsonKey":"restart","sort":3,"uiType":"Select","validate":{"defaultValue":"Never","options":[{"label":"Never","value":"Never"},{"label":"OnFailure","value":"OnFailure"}],"required":true}},{"jsonKey":"count","sort":4,"uiType":"Number","validate":{"defaultValue":1,"max":128,"min":0,"required":true}},{"description":"Specifies - the memory resource required for the container, If set to 0, there is no limit.","jsonKey":"memory","label":"Memory","sort":5,"style":{"colSpan":12},"uiType":"MemoryNumber","validate":{"defaultValue":"1024Mi","required":true}},{"description":"Specifies - the cpu resource required for the container, If set to 0, there is no limit.","jsonKey":"cpu","label":"CPU","sort":7,"style":{"colSpan":12},"uiType":"CPUNumber","validate":{"defaultValue":"0.5","required":true}},{"jsonKey":"cmd","label":"CMD","sort":9},{"jsonKey":"env","label":"ENV","sort":10,"subParameterGroupOption":[{"keys":["name","value"],"label":"Add - By Value"},{"keys":["name","valueFrom"],"label":"Add By Secret"}],"subParameters":[{"jsonKey":"valueFrom","label":"Secret - Selector","subParameters":[{"disable":true,"jsonKey":"configMapKeyRef"},{"jsonKey":"secretKeyRef","subParameters":[{"jsonKey":"name","label":"Secret - Name","sort":1,"uiType":"SecretSelect"},{"jsonKey":"key","label":"Secret Key","sort":3,"uiType":"SecretKeySelect"}],"uiType":"Ignore"}],"uiType":"Ignore"}],"uiType":"Structs"},{"jsonKey":"readinessProbe","label":"ReadinessProbe","sort":13,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"livenessProbe","label":"LivenessProbe","sort":15,"subParameters":[{"disable":true,"jsonKey":"hostAliases"},{"jsonKey":"timeoutSeconds","sort":1,"style":{"colSpan":12}},{"jsonKey":"failureThreshold","sort":4,"style":{"colSpan":12}},{"jsonKey":"initialDelaySeconds","sort":7,"style":{"colSpan":12},"validate":{"defaultValue":5,"required":true}},{"jsonKey":"periodSeconds","sort":9,"style":{"colSpan":12}},{"jsonKey":"successThreshold","sort":11,"style":{"colSpan":12}},{"jsonKey":"exec","sort":14},{"jsonKey":"httpGet","sort":19,"subParameters":[{"jsonKey":"port","sort":1,"style":{"colSpan":12},"validate":{"min":1,"required":true}},{"jsonKey":"path","sort":3,"style":{"colSpan":12},"validate":{"pattern":"^/(.*)$","required":true}},{"jsonKey":"httpHeaders","sort":5}]},{"jsonKey":"tcpSocket","sort":19,"subParameters":[{"jsonKey":"port","validate":{"min":1,"required":true}}]}],"uiType":"Group"},{"jsonKey":"annotations","sort":19},{"jsonKey":"labels","sort":21},{"description":"Specify - image pull policy for your service","jsonKey":"imagePullPolicy","label":"Image - Pull Policy","sort":24,"uiType":"Select","validate":{"defaultValue":"IfNotPresent","options":[{"label":"IfNotPresent","value":"IfNotPresent"},{"label":"Always","value":"Always"},{"label":"Never","value":"Never"}]}},{"disable":true,"jsonKey":"volumes"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-uischema-task - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"description":"Support push messages to Dingding Group.","jsonKey":"dingding","sort":1,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"description":"Specify - the message that you want to sent","jsonKey":"message","sort":3,"subParameters":[{"disable":true,"jsonKey":"msgtype"},{"disable":true,"jsonKey":"link"},{"disable":true,"jsonKey":"markdown"},{"disable":true,"jsonKey":"at"},{"disable":true,"jsonKey":"actionCard"},{"disable":true,"jsonKey":"feedCard"},{"jsonKey":"text","subParameters":[{"description":"Specify - the message that you want to sent","jsonKey":"content","label":"Message"}],"uiType":"Ignore"}],"uiType":"Ignore"}]},{"description":"Support - push email message.","jsonKey":"email","sort":3,"subParameters":[{"jsonKey":"from","sort":1,"subParameters":[{"jsonKey":"host","sort":1},{"jsonKey":"port","sort":3},{"jsonKey":"address","sort":5},{"jsonKey":"password","sort":7,"subParameters":[{"jsonKey":"value","label":"Password","uiType":"Password","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"alias","sort":9}]},{"jsonKey":"to","sort":3},{"jsonKey":"content","sort":5,"subParameters":[{"jsonKey":"subject","sort":1},{"jsonKey":"body","sort":3}]}]},{"description":"Support - push messages to slack channel.","jsonKey":"slack","sort":5,"subParameters":[{"jsonKey":"url","sort":1,"subParameters":[{"jsonKey":"value","label":"Webhook","uiType":"Input","validate":{"required":true}}],"uiType":"Ignore"},{"jsonKey":"message","subParameters":[{"disable":true,"jsonKey":"blocks"},{"disable":true,"jsonKey":"attachments"},{"disable":true,"jsonKey":"thread_ts"},{"disable":true,"jsonKey":"mrkdwn"},{"description":"Specify - the message that you want to sent","jsonKey":"text","label":"Message"}],"uiType":"Ignore"}]}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-notification - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"dbType","label":"DBType","sort":1,"validate":{"defaultValue":"kubeapi","options":[{"label":"MongoDB","value":"mongodb"},{"label":"KubeAPI","value":"kubeapi"}],"required":true}},{"conditions":[{"jsonKey":"dbType","op":"==","value":"mongodb"}],"jsonKey":"dbURL","label":"DatabaseURL","sort":3,"validate":{"required":true}},{"jsonKey":"database","sort":7,"validate":{"defaultValue":"kubevela","required":true}},{"disable":true,"jsonKey":"serviceAccountName"},{"jsonKey":"serviceType","sort":8},{"jsonKey":"domain","sort":9},{"jsonKey":"gatewayDriver","sort":10},{"jsonKey":"repo","sort":11},{"jsonKey":"imagePullSecrets","sort":13}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: addon-uischema-velaux - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"policies","label":"Policies","sort":10,"uiType":"PolicySelect","validate":{"required":true}},{"jsonKey":"parallelism","sort":20,"style":{"colSpan":12}},{"jsonKey":"auto","sort":30,"style":{"colSpan":12}}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: workflowstep-uischema-deploy - namespace: vela-system - ---- -apiVersion: v1 -data: - ui-schema: '[{"jsonKey":"objects","uiType":"K8sObjectsCode"}]' -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-uischema-k8s-objects - namespace: vela-system --- apiVersion: v1 @@ -326,193 +206,7 @@ metadata: name: policy-uischema-override namespace: vela-system ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresources: ql.#ListResourcesInApp - & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: parameter.appNs\n\t\tfilter: - {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: parameter.cluster\n\t\t\t}\n\t\t\tif - parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: parameter.clusterNs\n\t\t\t}\n\t\t\tapiVersion: - \"v1\"\n\t\t\tkind: \"Service\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: - {\n\tif resources.err == _|_ {\n\t\tservices: [ for i, resource in resources.list - {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: - resources.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: service-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace?: - string\n\tcluster?: string\n\tkind: string\n\tapiVersion: string\n}\nresponse: - ql.#Read & {\n\tvalue: {\n\t\tapiVersion: parameter.apiVersion\n\t\tkind: parameter.kind\n\t\tmetadata: - {\n\t\t\tname: parameter.name\n\t\t\tif parameter.namespace != _|_ {\n\t\t\t\tnamespace: - parameter.namespace\n\t\t\t}\n\t\t}\n\t}\n\tif parameter.cluster != _|_ {\n\t\tcluster: - parameter.cluster\n\t}\n}\n\nif response.err == _|_ {\n\tstatus: {\n\t\tresource: - response.value\n\t}\n}\nif response.err != _|_ {\n\tstatus: {\n\t\terror: response.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: application-resource-detail-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: - ql.#CollectPods & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: - parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: - parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: - parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: - [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: - {\n\t\tpodList: [ for pod in result.list if pod.object != _|_ {\n\t\t\tcluster: - \ pod.cluster\n\t\t\tworkload: pod.workload\n\t\t\tcomponent: pod.component\n\t\t\tmetadata: - {\n\t\t\t\tname: pod.object.metadata.name\n\t\t\t\tnamespace: pod.object.metadata.namespace\n\t\t\t\tcreationTime: - pod.object.metadata.creationTimestamp\n\t\t\t\tlabels: pod.object.metadata.labels\n\t\t\t\tversion: - {\n\t\t\t\t\tif pod.publishVersion != _|_ {\n\t\t\t\t\t\tpublishVersion: pod.publishVersion\n\t\t\t\t\t}\n\t\t\t\t\tif - pod.deployVersion != _|_ {\n\t\t\t\t\t\tdeployVersion: pod.deployVersion\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatus: - {\n\t\t\t\tphase: pod.object.status.phase\n\t\t\t\t// refer to https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase\n\t\t\t\tif - phase != \"Pending\" && phase != \"Unknown\" {\n\t\t\t\t\tpodIP: pod.object.status.podIP\n\t\t\t\t\thostIP: - \ pod.object.status.hostIP\n\t\t\t\t\tnodeName: pod.object.spec.nodeName\n\t\t\t\t}\n\t\t\t}\n\t\t}]\n\t}\n}\n\nif - result.err != _|_ {\n\tstatus: {\n\t\terror: result.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-pod-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\ttype: string\n\tnamespace: - *\"\" | string\n\tcluster: *\"\" | string\n}\n\nschema: {\n\t\"secret\": {\n\t\tapiVersion: - \"v1\"\n\t\tkind: \"Secret\"\n\t}\n\t\"configMap\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: - \ \"ConfigMap\"\n\t}\n\t\"pvc\": {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"PersistentVolumeClaim\"\n\t}\n\t\"storageClass\": - {\n\t\tapiVersion: \"storage.k8s.io/v1\"\n\t\tkind: \"StorageClass\"\n\t}\n\t\"ns\": - {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Namespace\"\n\t}\n\t\"provider\": - {\n\t\tapiVersion: \"terraform.core.oam.dev/v1beta1\"\n\t\tkind: \"Provider\"\n\t}\n}\n\nList: - ql.#List & {\n\tresource: schema[parameter.type]\n\tfilter: {\n\t\tnamespace: - parameter.namespace\n\t}\n\tcluster: parameter.cluster\n}\n\nstatus: {\n\tif List.err - == _|_ {\n\t\tif len(List.list.items) == 0 {\n\t\t\terror: \"failed to list \\(parameter.type) - in namespace \\(parameter.namespace)\"\n\t\t}\n\t\tif len(List.list.items) != - 0 {\n\t\t\tlist: List.list.items\n\t\t}\n\t}\n\n\tif List.err != _|_ {\n\t\terror: - List.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: resource-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\ncollectLogs: ql.#CollectLogsInPod & {\n\tcluster: - \ parameter.cluster\n\tnamespace: parameter.namespace\n\tpod: parameter.pod\n\toptions: - {\n\t\tcontainer: parameter.container\n\t\tprevious?: parameter.previous\n\t\tsinceSeconds?: - parameter.sinceSeconds\n\t\tsinceTime?: parameter.sinceTime\n\t\ttimestamps?: - \ parameter.timestamps\n\t\ttailLines?: parameter.tailLines\n\t\tlimitBytes?: - \ parameter.limitBytes\n\t}\n}\nstatus: collectLogs.outputs\n\nparameter: {\n\t// - +usage=Specify the cluster of the pod\n\tcluster: string\n\t// +usage=Specify - the namespace of the pod\n\tnamespace: string\n\t// +usage=Specify the name of - the pod\n\tpod: string\n\n\t// +usage=Specify the name of the container\n\tcontainer: - string\n\t// +usage=If true, return previous terminated container logs\n\tprevious: - *false | bool\n\t// +usage=If set, show logs in relative times\n\tsinceSeconds: - *null | int\n\t// +usage=RFC3339 timestamp, if set, show logs since this time\n\tsinceTime: - *null | string\n\t// +usage=If true, add timestamp at the beginning of every line\n\ttimestamps: - *false | bool\n\t// +usage=If set, return the number of lines from the end of - logs\n\ttailLines: *null | int\n\t// +usage=If set, limit the size of returned - bytes\n\tlimitBytes: *null | int\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: collect-logs - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n}\n\nresources: ql.#ListResourcesInApp & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: - parameter.appNs\n\t\tfilter: {\n\t\t\t\"apiVersion\": \"terraform.core.oam.dev/v1beta2\"\n\t\t\t\"kind\": - \ \"Configuration\"\n\t\t}\n\t\twithStatus: true\n\t}\n}\nstatus: {\n\tif - resources.err == _|_ {\n\t\t\"cloud-resources\": [ for i, resource in resources.list - {\n\t\t\tresource.object\n\t\t}]\n\t}\n\tif resources.err != _|_ {\n\t\terror: - resources.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: cloud-resource-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName?: string\n\tappNs?: - \ string\n}\n\nsecretList: ql.#List & {\n\tresource: {\n\t\tapiVersion: \"v1\"\n\t\tkind: - \ \"Secret\"\n\t}\n\tfilter: {\n\t\tmatchingLabels: {\n\t\t\t\"created-by\": - \"terraform-controller\"\n\t\t\tif parameter.appName != _|_ && parameter.appNs - != _|_ {\n\t\t\t\t\"app.oam.dev/name\": parameter.appName\n\t\t\t\t\"app.oam.dev/namespace\": - parameter.appNs\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatus: {\n\tif secretList.err == _|_ - {\n\t\tsecrets: secretList.list.items\n\t}\n\tif secretList.err != _|_ {\n\t\terror: - secretList.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: cloud-resource-secret-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tname: string\n\tnamespace: - string\n\tcluster: *\"\" | string\n}\n\npod: ql.#Read & {\n\tvalue: {\n\t\tapiVersion: - \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: - parameter.namespace\n\t\t}\n\t}\n\tcluster: parameter.cluster\n}\n\neventList: - ql.#SearchEvents & {\n\tvalue: {\n\t\tapiVersion: \"v1\"\n\t\tkind: \"Pod\"\n\t\tmetadata: - \ pod.value.metadata\n\t}\n\tcluster: parameter.cluster\n}\n\npodMetrics: ql.#Read - & {\n\tcluster: parameter.cluster\n\tvalue: {\n\t\tapiVersion: \"metrics.k8s.io/v1beta1\"\n\t\tkind: - \ \"PodMetrics\"\n\t\tmetadata: {\n\t\t\tname: parameter.name\n\t\t\tnamespace: - parameter.namespace\n\t\t}\n\t}\n}\n\nstatus: {\n\tif pod.err == _|_ {\n\t\tcontainers: - [ for container in pod.value.spec.containers {\n\t\t\tname: container.name\n\t\t\timage: - container.image\n\t\t\tresources: {\n\t\t\t\tif container.resources.limits != - _|_ {\n\t\t\t\t\tlimits: container.resources.limits\n\t\t\t\t}\n\t\t\t\tif container.resources.requests - != _|_ {\n\t\t\t\t\trequests: container.resources.requests\n\t\t\t\t}\n\t\t\t\tif - podMetrics.err == _|_ {\n\t\t\t\t\tusage: {for containerUsage in podMetrics.value.containers - {\n\t\t\t\t\t\tif containerUsage.name == container.name {\n\t\t\t\t\t\t\tcpu: - \ containerUsage.usage.cpu\n\t\t\t\t\t\t\tmemory: containerUsage.usage.memory\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif - pod.value.status.containerStatuses != _|_ {\n\t\t\t\tstatus: {for containerStatus - in pod.value.status.containerStatuses if containerStatus.name == container.name - {\n\t\t\t\t\tstate: containerStatus.state\n\t\t\t\t\trestartCount: containerStatus.restartCount\n\t\t\t\t}}\n\t\t\t}\n\t\t}]\n\t\tif - eventList.err == _|_ {\n\t\t\tevents: eventList.list\n\t\t}\n\t}\n\tif pod.err - != _|_ {\n\t\terror: pod.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: pod-view - namespace: vela-system - ---- -apiVersion: v1 -data: - template: "import (\n\t\"vela/ql\"\n)\n\nparameter: {\n\tappName: string\n\tappNs: - \ string\n\tname?: string\n\tcluster?: string\n\tclusterNs?: string\n}\n\nresult: - ql.#CollectServices & {\n\tapp: {\n\t\tname: parameter.appName\n\t\tnamespace: - parameter.appNs\n\t\tfilter: {\n\t\t\tif parameter.cluster != _|_ {\n\t\t\t\tcluster: - parameter.cluster\n\t\t\t}\n\t\t\tif parameter.clusterNs != _|_ {\n\t\t\t\tclusterNamespace: - parameter.clusterNs\n\t\t\t}\n\t\t\tif parameter.name != _|_ {\n\t\t\t\tcomponents: - [parameter.name]\n\t\t\t}\n\t\t}\n\t}\n}\n\nif result.err == _|_ {\n\tstatus: - {\n\t\tservices: result.list\n\t}\n}\n\nif result.err != _|_ {\n\tstatus: {\n\t\terror: - result.err\n\t}\n}\n" -kind: ConfigMap -metadata: - creationTimestamp: null - name: component-service-view - namespace: vela-system +... snip ... ```
diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/components/custom-component.md b/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/components/custom-component.md index 044ea0ec697..fbc75337ed3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/components/custom-component.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/components/custom-component.md @@ -564,15 +564,12 @@ local ─── default ─┬─ Service/hello-webserver-auxiliaryworkloa ## 自定义健康检查和状态 -You can also define health check policy and status message when a component deployed and tell the real status to end users. +你可以通过自定义健康检查和状态信息,将自定义组件的真实状态反馈给最终用户。 -:::caution -Reference `parameter` defined in `template` is not supported now in health check and custom status, they work in different stage with the resource template. While we're going to support this feature in https://github.com/kubevela/kubevela/issues/4863 . -::: ### 健康检查 -The spec of health check is `.attributes.status.healthPolicy`. +定义健康检查的字段为 `.attributes.status.healthPolicy`. 如果没有定义,它的值默认是 `true`,意味着在部署完对象后就将对象的状态设置为健康。为了让组件的状态及时、准确,通常你需要为组件定义监控状态,这个过程可以通过一个 CUE 表达式完成。 @@ -609,7 +606,28 @@ webserver: { } ``` -The health check result will be recorded into the corresponding component in `.status.services` of `Application` resource. +你也可以在健康检查中使用 `parameter` 中定义的参数,类似如下: + +``` +webserver: { + type: "component" + ... + attributes: { + status: { + healthPolicy: #""" + isHealth: (context.output.status.readyReplicas > 0) && (context.output.status.readyReplicas == parameter.replicas) + """# + } + } +template: { + parameter: { + replicas: int + } + ... +} +``` + +健康检查的结果会输出到 `Application` 对象的 `.status.services` 字段中。 ```yaml apiVersion: core.oam.dev/v1beta1 @@ -623,11 +641,11 @@ status: status: running ``` -> Please refer to [this doc](https://github.com/kubevela/kubevela/blob/master/vela-templates/definitions/internal/component/webservice.cue#L29-L50) for more examples. +> 请参考[文档](https://github.com/kubevela/kubevela/blob/master/vela-templates/definitions/internal/component/webservice.cue#L29-L50) 查阅更多示例。 ### 自定义状态 -The spec of custom status is `.attributes.status.customStatus`, 自定义状态和健康检查的原理一致。 +自定义状态的字段未 `.attributes.status.customStatus`, 自定义状态和健康检查的原理一致。 在 CUE 中的关键词是 `message`。同时,CUE 表达式的结果必须是 `string` 类型。 @@ -669,7 +687,7 @@ status: name: express-server ``` -> Please refer to [this doc](https://github.com/kubevela/kubevela/blob/master/vela-templates/definitions/internal/component/webservice.cue#L29-L50) for more examples. +> 请参考[文档](https://github.com/kubevela/kubevela/blob/master/vela-templates/definitions/internal/component/webservice.cue#L29-L50) 查阅更多示例。 ## Full available `context` in Component @@ -693,6 +711,43 @@ status: | `context.replicaKey` | The key of replication in context. Replication is an internal policy, it will replicate resources with different keys specified. (This feature will be introduced in v1.6+.) | string | + +### Cluster Version + +| Context Variable | Description | Type | +| :---------------------------------: | :---------------------------------------------------------: | :----: | +| `context.clusterVersion.major` | The major version of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.gitVersion` | The gitVersion of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.platform` | The platform information of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.minor` | The minor version of the runtime Kubernetes cluster. | int | + +The cluster version context info can be used for graceful upgrade of definition. For example, you can define different API according to the cluster version. + +``` + outputs: ingress: { + if context.clusterVersion.minor < 19 { + apiVersion: "networking.k8s.io/v1beta1" + } + if context.clusterVersion.minor >= 19 { + apiVersion: "networking.k8s.io/v1" + } + kind: "Ingress" +} +``` + +Or use string contain pattern for this usage: + +``` +import "strings" + +if strings.Contains(context.clusterVersion.gitVersion, "k3s") { + provider: "k3s" +} +if strings.Contains(context.clusterVersion.gitVersion, "aliyun") { + provider: "aliyun" +} +``` + ## Component definition in Kubernetes KubeVela is fully programmable via CUE, while it leverage Kubernetes as control plane and align with the API in yaml. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/traits/customize-trait.md b/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/traits/customize-trait.md index ea8907153da..f9955ff3d15 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/traits/customize-trait.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/platform-engineers/traits/customize-trait.md @@ -421,9 +421,6 @@ template: { You can also define health check policy and status message when a trait deployed and tell the real status to end users. -:::caution -Reference `parameter` defined in `template` is not supported now in health check and custom status, they work in different stage with the resource template. While we're going to support this feature in https://github.com/kubevela/kubevela/issues/4863 . -::: ### Health Check @@ -464,6 +461,27 @@ my-ingress: { } ``` +You can also use the `parameter` defined in the template like: + +```cue +mytrait: { + type: "trait" + ... + attributes: { + status: { + healthPolicy: #""" + isHealth: context.outputs."mytrait-\(parameter.name)".status.state == "Available" + """# + } + } +template: { + parameter: { + name: string + } + ... +} +``` + The health check result will be recorded into the corresponding trait in `.status.services` of `Application` resource. ```yaml @@ -560,6 +578,43 @@ status: | `context.appAnnotations` | The annotations of the current application instance. | Object Map | + +### Cluster Version + +| Context Variable | Description | Type | +| :---------------------------------: | :---------------------------------------------------------: | :----: | +| `context.clusterVersion.major` | The major version of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.gitVersion` | The gitVersion of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.platform` | The platform information of the runtime Kubernetes cluster. | string | +| `context.clusterVersion.minor` | The minor version of the runtime Kubernetes cluster. | int | + +The cluster version context info can be used for graceful upgrade of definition. For example, you can define different API according to the cluster version. + +``` + outputs: ingress: { + if context.clusterVersion.minor < 19 { + apiVersion: "networking.k8s.io/v1beta1" + } + if context.clusterVersion.minor >= 19 { + apiVersion: "networking.k8s.io/v1" + } + kind: "Ingress" +} +``` + +Or use string contain pattern for this usage: + +``` +import "strings" + +if strings.Contains(context.clusterVersion.gitVersion, "k3s") { + provider: "k3s" +} +if strings.Contains(context.clusterVersion.gitVersion, "aliyun") { + provider: "aliyun" +} +``` + ## Trait definition in Kubernetes KubeVela is fully programmable via CUE, while it leverage Kubernetes as control plane and align with the API in yaml.