k8s之cue模板

cuelang随笔:

1、通过context.CompileString把string转换为cue.value,或通过context.encode把go类型转换为cue.value,或通过context.BuildInstance把instance转换为cue.value。之后通过value.Syntax把cue.value转换为抽象语法树ast,通过format.Node格式化打印AST。

2、CUE 将 类型(types) 和 数据(values) 合并为一个概念:格,且CUE非常重视约束,用 约束条件(constraint)来管理值的规则或限制,像其他所有的实体一样,它存在于结构和具体数值中间。

k8s之cue模板_第1张图片

3、cue的值不能被改变,在 CUE 中没有重载或重写的概念,只能由大范围到小范围,且lists must have the same elements and cannot change length。

[...sting]    string的数组,close,赋值之后则长度不可变;
[string,...]  容量是1的数组,open,长度可变;

4、Top 和 Bottom 是 CUE 的特殊类型,他们是  的两端。

“_” 用来表示 top,可以匹配所有值,即 “any”;

“_|_” 用来表示 bottom,代表错误

5、Definition 主要用于定义结构,也就是变量,默认情况下是封闭(Close)的,而且 CUE 导出时不会被输出。默认情况下,struct 是开放的,而 definition 是封闭的。

6、隐式字段和值通过在前面增加下划线定义,只可以在当前 package 进行引用

k8s之cue模板_第2张图片

基础知识:

CUE能够安全地更改可修改配置中成千上万个对象的值。

1、数据类型:int、float、bool、string、array、struct、null

2、运算符#定义变量: #abc: string

3、运算符...定义开放的结构体和数组: close的数组对象 [...string] ,open的数组对象[string,...],说明该对象可以容纳多个字符串元素结构体对象;

{

  abc: string   

  ...

}

说明结构体可以包含未知字段;

4、运算符 | 表示两种类型的值。a: string | int 说明变量 a 表示类型可以是字符串或者整数类型。

5、运算符 * 定义变量的默认值。通常与符号 | 配合使用,代表某种类型的默认值。a: *1 | int说明变量 a 类型为 int,默认值为 1。

6、运算符 ?: 定义可选变量,某些情况下一些变量不一定被使用,这些变量就是选填。a ?: int说明a是可选填的变量。并且,选填变量通常和条件判断逻辑一起使用。  _ | _ 可选变量是否被填充。

7、运算符 if...else

price: number

feel: *"good" | string

if price > 100 {

    feel: "bad"

}

price: 200

8、运算符for循环

        8.1、切片遍历

package cue

parameter: {
    name:  string
    image: string
    env: [...{name:string,value:string}]
}
output: {
     spec: {
        containers: [{
            name:  parameter.name
            image: parameter.image
            env: [
                for _, v in parameter.env {
                    name:  v.name
                    value: v.value
                },
            ]
        }]
    }
}

parameter:{
   name: "mytest"
   image: "nginx:v1"
   env: [
   	{name:"a",value:"b"},
   	{name:"c",value:"d"},
   ]
}

        8.2、类型遍历

package cue

#a: {
    "hello": "Barcelona"
    "nihao": "Shanghai"
}

for k, v in #a {
    "\(k)": {
        nameLen: len(v)
        value:   v
    }
}

        8.3、映射遍历

package cue

parameter: {
    name:  string
    image: string
    env: [string]: string
}
output: {
    spec: {
        containers: [{
            name:  parameter.name
            image: parameter.image
            env: [
                for k, v in parameter.env {
                    name:  k
                    value: v
                },
            ]
        }]
    }
}
parameter:{
   name: "mytest"
   image: "nginx:v1"
   env: "a": "b"
}

9、运算符\() 进行字符串内部计算,"\(k)"说明取k变量的实际值。

10、cue命令

// 计算、渲染结果
cue eval first.cue

// 计算、渲染结果,指定只计算某个值
cue eval first.cue -e out

// 导出最终渲染结果
cue export first.cue --out yaml > first.yaml

11、

Unify 就是 CUE 中的 & 操作符,对字段、规则、数据进行合并,并返回聚合后的结果;
Fill在指定的路径上更新或创建;

你可能感兴趣的:(K8S,CUE,k8s)