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不修改也不会有问题的。

这里我们用Tomcatapp来测试,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!

Openstack Murano(kilo)二次开发之添加Volume的更多相关文章

  1. TFS二次开发系列:四、TFS二次开发WorkItem添加和修改、保存

    WorkItemStore:表示跟踪与运行 Team Foundation Server的服务器的工作项客户端连接. A.添加工作项 1.首先获得某服务器的WorkItemStore. WorkIte ...

  2. phpcms v9 二次开发 - 自己添加源文件

    一.在根目录添加入口文件, 我现在要在根目录添加一个文件名为test.php 这样一个文件,为了调用系统的公用类和函数,必须加入一下包含文件 test.php代码如下 <?phpdefine(' ...

  3. 基于ZFAKA二次开发,添加PayJS支付渠道

    项目地址:https://github.com/hiyouli/payjs-for-zfaka 关于ZFAKA,请移步:ZFAKA 免费.安全.稳定.高效的发卡系统,值得拥有! 演示地址:http:/ ...

  4. Revit二次开发之添加选项卡和按钮

      我们日常在revit开发中经常会用到按钮,可以通过revitAPI提供的接口创建按钮,今天我简单介绍一下两种按钮,一种是单命令按钮,另一种是含下拉菜单的按钮,包括创建他们的方法. 实现方法 1.实 ...

  5. Ubuntu环境下Nutch1.2 二次开发(添加中文分词)

    前提nutch1.2已部署到eclipse中 详见:http://www.cnblogs.com/cy163/archive/2013/02/19/2916419.html 1 部署IKAnalyze ...

  6. NX二次开发-自定义添加右键菜单RegisterConfigureContextMenuCallback

    首先声明这个知识我以前不知道,是夏天的时候看到别人在唐工的QQ群里问的,唐工说西门子官方有这个例子.那个时候我因为在忙其他事情,也就没去研究那个右键菜单到底是怎么做的.关于自定义添加右键菜单Regis ...

  7. NX二次开发-UFUN添加工程图投影视图UF_DRAW_add_orthographic_view

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_obj.h> #include <u ...

  8. ecshop二次开发 购物车添加备注信息

  9. TFS二次开发、C#知识点、SQL知识总结目录

    TFS二次开发系列 TFS二次开发系列:一.TFS体系结构和概念 TFS二次开发系列:二.TFS的安装 TFS二次开发系列:三.TFS二次开发的第一个实例 TFS二次开发系列:四.TFS二次开发Wor ...

随机推荐

  1. shell-自动更改LINUX服务器IP

    #!/bin/bash echo  echo   ==  fi i= newgateway= newhostname= cat >>$ipfile<<EOF IPADDR=&q ...

  2. Spark-1.0.1 的make-distribution.sh编译、SBT编译、Maven编译 三种编译方法

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3775343.html 本文编译方法所支持的hadoop环境是Hadoop-2.2.0, ...

  3. nginx 设置反响代理实现nginx集群

    ginx.conf: worker_processes  1; events { worker_connections  1024; } http { include       mime.types ...

  4. poj 2446 Chessboard (二分匹配)

    Chessboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12800   Accepted: 4000 Descr ...

  5. display 显示隐藏 ESAYuI

    $("#rejectCauseDisplay").css('display',"block");     $("#rejectCauseDisplay ...

  6. [刘阳Java]_Java技术有哪些学习重点_第1讲

    纵观网上有很多非常好的对Java技术的总结,这里我个人谈谈对Java技术学习有哪些重点内容[浮浅之见] Java环境搭建 Java基础语法 Java面向对象编程 Java异常 Java IO流 Jav ...

  7. python学习之——爬取网页信息

    爬取网页信息 说明:正则表达式有待学习,之后完善此功能 #encoding=utf-8 import urllib import re import os #获取网络数据到指定文件 def getHt ...

  8. 利用fiddler模拟发送json数据的post请求

    fiddler是调试利器,有许多好用的功能,这里简单的介绍一下利用fiddler模拟发送post请求的例子 先简单介绍一下失败的例子,最后给出正确的方法

  9. hp小机定位网卡位置

    rad已经被olrad取代 HPUX下定位网卡位置                                                   一台HP小型机,可能配了多块网卡,在系统中以la ...

  10. 20145225《Java程序设计》 第9周学习总结

    20145225<Java程序设计> 第9周学习总结 教材学习内容总结 第十六章 整合数据库 16.1JDBC JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂 ...