更新时间:2024-04-17 GMT+08:00

条件函数

条件函数通常用于定义元素是否需要部署,包括cond_eq、cond_not、cond_and、cond_or和cond_if。除了cond_if函数外,其他条件函数只允许在conditions段内定义使用。cond_if函数除了在conditions段内定义使用外,还可以在node_templates段和outputs段内定义使用。

例如,通过vm_deploy属性控制vm是否部署:

tosca_definitions_version: huaweicloud_tosca_version_1_0
conditions:
  condition_vm_deploy:    #inputs参数满足匹配时,条件才能满足
    cond_eq:
      - get_input: vm_deploy
      - true
inputs:
  image:
    description: 云服务器使用的镜像ID
    type: HuaweiCloud.ECS.Image.Id
  instance:
    default: 1
    description: 创建云服务器数量
  subnet:
    description: 云服务器子网ID
  vm_deploy:    #输入参数,控制vm对象是否部署。
    default: true
    type: boolean
  vpc:
    description: 云服务器VPC的ID
node_templates:
  vm:
    condition: condition_vm_deploy      #条件满足时,vm对象才会部署
    type: HuaweiCloud.ECS.CloudServer
    properties:
      availabilityZone: cn-south-1a
      imageId:
        get_input: image
      flavor: s3.small.1
      instances:
        get_input: instance
      name: my-ecs
      nics:
        - subnetId:
            get_input: subnet
      rootVolume:
        size: 40
        volumeType: SATA
      vpcId:
        get_input: vpc
  myecs:
    type: HuaweiCloud.ECS.CloudServer
    properties:
      name: my-ecs
      instances:
        get_input: instance
      imageId:
        get_input: image
      flavor: s3.small.1
      vpcId:
        get_input: vpc
      availabilityZone: cn-south-1a
      nics:
        - subnetId:
            get_input: subnet
      rootVolume:
        volumeType: SSD
        size: 40

cond_eq

判断相等条件是否满足,一般用于判断输入参数与预期是否一致。

表1 cond_eq

语法

参数说明

返回值

cond_eq: [cond1, cond2]

  • cond1:条件1,可以为数字、字符串、布尔值或来自get_input变量。
  • cond2:条件2,可以为数字、字符串、布尔值或来自get_input变量。

cond1与cond2一致时,返回true;否则返回false。

通过cond_eq判断输入参数是否为期望值示例如下:

inputs:
  a:
    type: string
    default: 10
conditions:
  matchA:
    cond_eq: [{get_input: a}, 10]

cond_not

对计算结果求反,一般用于嵌套其他条件函数。

表2 cond_not

语法

参数说明

返回值

cond_not: cond

  • cond:条件表达式,可以为布尔值、来自get_input的布尔变量或嵌套的cond_eq、cond_not等条件函数。

条件表达式计算结果为true时,返回false;结果为false时,返回true。

通过cond_not判断输入参数是否为期望值示例如下:

inputs:
  a:
    type: boolean
    default: true
conditions:
  matchA:
    cond_not: {get_input: a}    

cond_and

判断连续多个条件是否都满足,一般用于多重判断条件下,至少要有2个条件,最多支持10个条件。

表3 cond_and

语法

参数说明

返回值

cond_and: [cond1, cond2...condn]

  • cond1:条件1,可以为布尔值、来自get_input的布尔变量或嵌套的cond_eq、cond_not等条件函数。
  • cond2:条件2,可以为布尔值、来自get_input的布尔变量或嵌套的cond_eq、cond_not等条件函数。
  • condn:条件n(3≤n≤10),可选,根据实际需求定义,参数类型同cond1、cond2。

当所有参数条件都满足时,返回为true;否则返回false。

通过cond_and判断组合条件是否满足示例如下:

inputs:
  a:
    type: integer
    default: 10
  b:
    type: string
    default: debug
conditions:
  matchAnd:
    cond_and: [{cond_eq: [{get_input: a}, 10]}, {cond_eq: [{get_input: b}, debug]}]  #条件1满足,条件2满足,matchAnd的条件才满足

cond_or

判断多个条件中任一条件满足即可。一般用于多重判断条件下,至少要有2个条件,最多支持10个条件。

表4 cond_or

语法

参数说明

返回值

cond_or: [cond1, cond2...condn]

  • cond1:条件1,可以为布尔值、来自get_input的布尔变量或嵌套的cond_eq、cond_not等条件函数。
  • cond2:条件2,可以为布尔值、来自get_input的布尔变量或嵌套的cond_eq、cond_not等条件函数。
  • condn:条件n(3≤n≤10),可选,根据实际需求定义,参数类型同cond1、cond2。

任一条件满足时,即返回为true;所有条件都不满足时,返回false。

通过cond_or判断组合条件是否满足示例如下:

inputs:
  a:
    type: integer
    default: 10
  b:
    type: string
    default: debug
conditions:
  matchOr:
    cond_or: [{cond_eq: [{get_input: a}, 8]}, {cond_eq: [{get_input: b}, debug]}]  #条件1不满足,条件2满足,matchOr的条件即可满足

cond_if

If条件是一个三元表达式,主要用于对属性进行赋值,一般用于node_templates的属性结构中。

表5 cond_if

语法

参数说明

返回值

cond_if: [condition, value_true, value_false]

  • condition:条件名称,需要定义在conditions段中。
  • value_true:条件满足时的赋值。
  • value_false:条件不满足时的赋值。

条件满足时,返回value_true;条件不满足时,返回value_false。

通过cond_if定义属性值示例如下:

inputs:
  a:
    type: integer
    default: 10
  b:
    type: string
    default: debug
conditions:
  matchOr:
    cond_or: [{cond_eq: [{get_input: a}, 8]}, {cond_eq: [{get_input: b}, debug]}]  #条件1不满足,条件2满足,matchOr的条件即可满足
node_templates:
  vm:
    type: HuaweiCloud.ECS.CloudServer
    properties:
      vpcId: vpc-id-123
      name: myvm
      nics:
        - subnetId: subnet-id-123
      imageId: {cond_if: [matchOr, image-debug, image-product]}   #通过cond_if定义,如果满足debug模式使用调试镜像,不满足使用产品镜像
      instances: 1
      availabilityZone: az-1
      rootVolume:
        volumeType: SATA
        size: 40
      flavor: flavor-1