diff --git a/docs/end-user/components/more.md b/docs/end-user/components/more.md index 67d50fe2..2be4c2e5 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 +... snip ... ---- -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 ``` diff --git a/docs/platform-engineers/components/custom-component.md b/docs/platform-engineers/components/custom-component.md index c93d0195..af070cc3 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 773ae8dd..6f6d52ce 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 1f3b4640..24b89c0d 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 | +| 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 +## 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 a44cfecc..3e24bc7e 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 044ea0ec..fbc75337 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 ea890715..f9955ff3 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.