转载

Openstack Murano(kilo)二次开发之添加Volume

Openstack Murano(kilo)二次开发之添加Volume

欢迎转载,转载请注明出处:http://www.cnblogs.com/fmnisme/p/openstack_murano_add_volume.html

简介

murano是OpenStack的Application Catalog服务,推崇AaaS(Anything-as-a-Service)的概念,通过统一的框架和API实现应用程序快速部署和应用程序生命周期管理的功能,降低应用程序对底层平台(OpenStack层和虚拟化层)的依赖。

可以阅读这边博客了解下murano: Murano环境搭建、使用介绍和思考 ,具体安装过程则参考 官方文档 .

需求

现在murano还不支持在实例中添加volume,不过murano是通过heat创建资源的,而heat是可以创建并附加volume的,heat可以做到的事,murano就可以做到(当然还可以做的更多),下面我们就来一步一步的实现这个功能。

修改io.murano

创建Cinder.yaml

  1. murano的核心库放在 murano/meta/io.murano 中,首先在 murano/meta/io.murano/manifest.yaml 中注册Cinder类,将下面的内容复制到manifest.yaml中并保存:

    io.murano.resources.Cinder: resources/Cinder.yaml
  2. 创建 murano/meta/io.murano/Class/resources/Cinder.yaml 文件:

    Namespaces:   =: io.murano.resources  # 当前命名空间   std: io.murano   Name: Cinder   Properties:   # 要创建的Volume大小,单位GB   size:     Contract: $.int().notNull()  Methods:   initialize:     Body:       - $._environment: $.find(std:Environment).require()    genTemplate:     Arguments:       # volume要附加到的实例       - instance:           Contract: $.class(Instance).notNull()     Body:       # $volumeName表示将要创建的volume名字,$instance.name是实例的名字,同时也是heat模板中instance的名字。       - $volumeName: format('volume-{0}-{1}', $.id(), $instance.name)       - $volumeAttachment: format('volumeAttachment-{0}-{1}', $.id(), $instance.name)       # $template里保存的是标准的heta模板       # 模板首先创建了一个Volume,然后用VolumeAttachment附加到指定的实例上       - $template:           resources:             $volumeName:               type: OS::Cinder::Volume               properties:                 size: $.size             $volumeAttachment:               type: OS::Cinder::VolumeAttachment               properties:                 volume_id: { get_resource: $volumeName }                 instance_uuid: { get_resource: $instance.name }       # 返回创建的模板,改模版会在后面的步骤中合并到一个完整的heat模板中去。       - Return: $template

修改Instance.yaml

  1. 修改 murano/meta/io.murano/Class/resources/Instance.yaml

    (1) 在 Properties: 块里追加下面的内容:

     volumeSize:   Contract: $.int()   Default: null

    这个是给app传参数进来用的。

    (2) 在第99行(也就是 - $.networks.customNetworks.select($this.joinNet($, $securityGroupName)) )后面添加如下内容:

    - If: $.volumeSize != null   Then:     - $cinder: new(Cinder, size => $.volumeSize)     - $volumeTemplate: $cinder.genTemplate($this)     - $.instanceTemplate: $.instanceTemplate.mergeWith($volumeTemplate)

    这几行代码很好理解:如果 $.volumeSize 不为空,则实例化一个Cinder对象,然后将生成的volume模板合并的到 $.instanceTemplate 模板中去。

更新io.murano

``` murano-manage  --config-file  ./etc/murano/murano.conf  import-package  meta/io.murano/ --update ```

修改murano-app

murano现在可以添加volume了,现在还要修改一个app来让它使用该功能,需要注意的是,Instance.yaml中的 volumeSize 参数是可选参数,所以现有的app不修改也不会有问题的。

这里我们用 Tomcat app来测试, Tomcat 可以在 https://github.com/openstack/murano-apps.git 下载,下载完后记得 git checkout -t origin/stable/kilo 切换到的正确的分支。

编辑 murano-apps/Tomcat/package/UI/ui.yaml :

Version: 2  Application:   ?:     type: io.murano.apps.apache.Tomcat   name: $.appConfiguration.name   instance:     ?:       type: io.murano.resources.LinuxMuranoInstance     name: generateHostname($.instanceConfiguration.unitNamingPattern, 1)     flavor: $.instanceConfiguration.flavor     image: $.instanceConfiguration.osImage     keyname: $.instanceConfiguration.keyPair     availabilityZone: $.instanceConfiguration.availabilityZone     assignFloatingIp: $.appConfiguration.assignFloatingIP     volumeSize: $.instanceConfiguration.volumeSize  #添加这一行  [...]         - name: unitNamingPattern           type: string           label: Instance Naming Pattern           required: false           maxLength: 64           regexpValidator: '^[a-zA-z][-_/w]*$'           errorMessages:             invalid: Just letters, numbers, underscores and hyphens are allowed.           helpText: Just letters, numbers, underscores and hyphens are allowed.           description: >-             Specify a string, that will be used in instance hostname.             Just A-Z, a-z, 0-9, dash and underline are allowed.         # 添加下面几行         - name: volumeSize           type: integer           label: Volume Size(GB)           required: false           description: Instance Volume Size. 

上文中的 [...] 表示省略掉的内容,需要修改的地方有注释。修改完后,创建Tomcat时会多一个可选的参数 VolumeSize ,如果该参数不为空就会创建volume了。

更新Tomcat代码:

murano-manage  --config-file  ./etc/murano/murano.conf  import-package  ../murano-apps/Tomcat/package --update

修改到这里就结束了,enjoy it!

正文到此结束
Loading...