openstack manila 创建share的业务逻辑

create share
manila-api
1.获取请求的上下文---context
2.验证请求体是否符合标准                  不合法抛出异常
3.从请求体中取出要创建的share。
4.提取share的name替换成display_name
5.提取share的description信息,替换diplay_description
6.提取share的size和share_proto(协议)
7.提取share的所在az和metadata
8.提取share的snapsot_id    **               用于检测该share是否来自快照。
若有snapshot信息则获取该snapshot的信息。如果所创建的share来自于snapshot则,该share的share_network_id要么和snapshot的原版shareshare_network_id相等,要么为空。
如果为空着径snapshot的原版share的share_network_id赋值给新share,否则抛出异常。
9.提取share所使用的share_network_id。
10.若该share有share_network_id,则获取该share_network实体。** 异常检测,获取失败抛出异常
11.检测使用的网络是否关联到指定的router。**
    1.通过子网id获取所使用的子网
    2.检测子网中是否有geteway_id属性,没有则抛出异常。即使用的子网必须要有网关。
    3.获取选定网络中的所有关联到router上的端口(ports)。
    4.检测所使用的子网的网关ip是否管理到router。ip相等 and 所在同一个子网。否则抛出异常。
12.获取share所使用的volume的type。
13.如果share中有指定所使用的volume的类型,则获取该类型的标识,通过name或者uuid。异常检测,失败抛异常。
14.开始进一步创建。
manila.share.API.create()
1.对操作做策略检查。 ** 根据服务的policy文件,判断在此上下文环境下,对该目标的操作是否有效。
2.检测metadata对象,metadata中的key长度不能大于255字符,value的值长度小于1024字符.
3.如果该share是基于snapshot创建的,则该snapshot的status必须为available。否则抛出异常。
4.检测share的sizesize为整型且大于0,否则抛异常。
5.如果基于snapshot且指定了类型,则指定的share的类型和snapshot的类型必须一致。
6.检测指定的协议是否合法,即:nfs、cifs、glusterfs中的一种。
7.从资源中预留将要创建的share大小的资源。** 如果超出限额则抛出异常。
8.构建options,包含要创建share信息,用于创建share数据库条目。share status 状态进入creating
9.创建share数据库条目,并提交资源预留值。异常捕获,如果有异常则回滚该数据库操作。
10.如果share是基于snapshot创建的,则该share也会落在snapshot所在的host上,不经过scheduler,直接在确定的
host上创建share。否则经scheduler选择合适的host,执行task。
这里假设share是基于新的volume来创建的。这里需要使用消息机制来远程调用(manila.scheduler.rpcapi.SchedulerAPI.create_share()),scheduler来选择 合适的host继续share的创建。
manila.scheduler.manager.SchedulerManager.create_share()
1.使用指定的scheduler驱动来选择过滤用来创建share的host。
scheduler_driver = manila.scheduler.filter_scheduler.FilterScheduler.scheduler_create_share() **
1.选择合适的host。**  没有选择合适的host,或者中间报出异常,则置该share状态为error
    1.为context打上admin标签,使其可以调用一些admin操作。
    2.将share_properties转换成resource_properties。
    3.检查相关的配置文件是否发生更新,如果发生变动则重新加载。
    4.添加可重复调到的配置项。
    5.添加过滤的配置项。
    6.获取运行有manila服务的所有可用的hosts。
    7.对获得的hosts,使用指定的过滤器对其进行过滤,如az、存储等项进行过滤。
    9.通过指定的标准,对通过过滤的hosts,计算其权重,并对其排序。
    10.返回权重最大的host。
2.获得将用来创建share的host,更新share在数据库中的条目。
3.将选择的host,添加到filter_properties中,用于如果创建失败,在retry时,作为淘汰该host的条件。
4.从filter_properties中去除打上admin标签的context,继续share创建。
通过消息机制远程调用,share dirver继续share创建工作。
manila.share.manager.ShareManager.create_share(...)
1.把context打上admin标签。
2.通过share_id获得要创建的share的详细信息。
3.获取share使用的网络。
4.判断是否提供share_netwok且其使用的driver能够操作share server。否则抛出异常。
5.如果share是基于snapshot创建的,则获取该snapshot,和该snapshot的share server id。否则抛出异常。。否则抛出异常。
开始share创建task。
6.如果是基于snapshot创建share则获取snapshot所使用的share server,并更新该share的数据库条目。如果不是,但是提供了share_network
则为该share创建新的share server。如果都没有则置share_server为None。 **
7.如果基于snapshot创建share,则调用从snapshot来创建share,否则直接创建share。 **
8.更新share在数据库中的条目。
9.如果一切成功则置share的status为available,否则置为error

你可能感兴趣的:(openstack,Manila)