声明:
本博客欢迎转载,但请保留原作者信息!
作者:柯晓东
团队:华为杭州OpenStack团队
最近在用Murano来部署应用,关于Murano包及PL语言的使用,这里总结一下,便于后来者。
先说Murano包,典型的Murano包如下图所示。含有UI的称为Application,它能继承library,但是不能被其他Application继承了。library不含UI,一般是平台提供,里面含有丰富的公共方法和属性。
UI目录 下放能自动生成表单的yaml文件。Murano之所以好用,是因为含有用文本描述的UI,以此可以在新接入一个组件时UI的活由新组件提供,非常适合平台和服务解耦。Murano通过yaml描述的UI也不是什么都能体现。指定某个输入框一定要输入字符串或一定要有值,这它是能做到的。但是下面这种场景它做不到:某radio button的值,为A时,几个输入框必须输入;为B时,同样的几个输入框可以不输入。
UI支持数字、字符串、布尔型,是否必选等基本类型,还支持通过glance、neutron选择镜像、虚拟网络,但是不支持选择物理主机。它支持的类型如下:
类型 | 说明 |
---|---|
string | Django 字符串类型 |
boolean | Django 布尔类型 |
text | Django 文本类型 |
integer | Django 数字类型 |
password | 秘密类型 |
clusterip | 集群IP |
floatingip | 外网Ip |
domain | 域名 |
table | 表格 |
flavor | 规格 |
keypair | 密钥对 |
image | 镜像 |
azone | availability zoom |
imageType | 仅为镜像提供的属性 |
Resource目录 下放的是各式各样的脚本,这部分基本都和服务的实现有关。例如运行态的动态配置脚本,数据转换脚本等。
Classes目录 下放的是核心的yaml描述的部署文件。这些yaml就是用murano PL语言描述的类。这是这次介绍的核心部分。
Murano PL的类分为这么几部分:
1. 类名声明
2. 继承声明
3. 属性声明
4. 方法实现
前两部分和其他语言一样,就略过了。
在属性声明的地方,主要涉及给变量起了名字后,要写什么类型,作用范围。如下图是典型的属性声明的代码段:
这里的Contract表示类型声明,下表是所有可用的类型:
类型 | 说明 |
---|---|
$.int() | 整形 |
$.string() | 字符串 |
$.string().notNull() | 非空字符串 |
$.bool() | 布尔类型(true/false) 0会被转为false,其他转为true |
$.class(ns:ClassName) | 类 |
$.class(ns:ClassName).notNull() | 非空类 |
$.class(ns:Name).check($.p = 12) | 类,并且含有名为p的属性,且值为12 |
$.template(ns:ClassName) | 模板声明,一般用于脚本调用使用 |
[$.int()] | 数组 |
[$.int().notNull()] | 数组 |
[$.string()] | 数组 |
[$.int().check($ > 0)] | 正数的数组 |
[$.int(), 2] | 数组长度至少为2 |
[$.int(), 2, 5] | 数组长度至少为2,至多为5 |
{ A: $.int(), B: [$.string()] } | 字典,key是int,value是字符串 |
Usage是用来声明作用域,可填的值如下:
属性类型 | 说明 |
---|---|
In | 输入参数,该参数只能通过UI设置,不能在MuranoPL代码里面修改。这是类属性的默认类型。 |
Out | 输出参数,该参数只能在MuranoPL代码里面修改,不能通过UI设置。 |
InOut |