zoukankan      html  css  js  c++  java
  • 虚拟机创建流程中neutron代码分析(二)

    前言:

    当nova服务发送了创建port的restful调用信息之后,在neutron服务中有相应的处理函数来处理调用。根据restful的工作原理,是按照

    paste.ini文件中配置好的流程去处理该条调用。本节从neutron代码中的create_port()函数开始说起。

    简要流程:

    下面是调用的流程图。

     详细代码:

    以上是简要流程图,下面是具体的代码分析。

     create_port()

    功能:

    1. 调用create_port_db()函数产生port数据。
    2. 更新安全组
    3. 绑定port

     

    _create_port_db()

    功能:

    1. 获取dhcp配置
    2. 调用create_port_db()函数
    3. 转化port_db为字典数据形式

    create_port_db()

    功能:

    1. nova传入的port信息
    2. 生成port的uuid
    3. 获取租户并判断是否合法
    4. 构造port数据字典
    5. 判断是否制定mac地址,指定了mac则用该mac创建port,没有则先生成再创建port
    6. 创建port数据结构
    7. create_db_port_obj函数中生成mac地址
    8.  allocate_ips_for_port_and_store函数中生成ip地址填充port

    ----------------------------------------------------------------------mac地址创建分析开始---------------------------------------------------------------

    create_db_port_obj()

    功能:

    1. 判断mac地址是否为空
    2. mac地址不为空,判断mac地址是否在使用当中
    3. mac地址为空则调用generate_mac()函数生成mac

    generate_mac()

    功能:

    1. 返回get_random_mac()函数
    2. get_random_mac()函数生成mac地址。

    mac地址生成分析:

    首先读取配置文件中的mac地址,前六位都是固定的。然后生成后六位,使用python的random函数生成随机数。最后将数据组装起来。

    形成一个完成mac地址。

     ----------------------------------------------------------------------mac地址创建分析结束---------------------------------------------------------------

     ----------------------------------------------------------------------ip地址创建分析开始------------------------------------------------------------------

    allocate_ips_for_port()

    功能:

    1. 调用函数allocate_ips_for_port函数分配ip
    2. 将所有分配的ip地址写入到neutron数据ipallocations表中。

    allocate_ips_for_port()

    功能:

    1. 判断用户是否指定了ip地址
    2. 如果指定ip地址,调用-test_fixed_ips_for_port()函数验证其合法性
    3. 如果没有指定,则调用ip地址管理驱动ipam_allocate_ips()函数分配ip地址

    关于ipam地址管理,里面有一些有意思的知识,看以查看这篇博文。

    http://blog.csdn.net/u013553406/article/details/51700198

     ipam_allocate_ips()

    功能:

    1. 加载ipam框架,工厂方法等。
    2. 调用ipam_driver的allocate()函数产生ip地址

     allocate()

    功能:

    调用generate_ip()函数生成ip地址。

     

     

    generate_ip()

    功能:

    该函数是真正生成ip地址的函数。原理是从neutron数据库中的ip可用表中选择出多个ip地址,将ip地址添加到变量ip_allocations中,

    然后经过一些列的数据转化,从所有候选的ip地址中选择第一个ip地址做为最总生成的ip。,然后将ip地址返回。

     

      ----------------------------------------------------------------------ip地址创建分析结束------------------------------------------------------------------

    如下图是neutron数据库中有关ip地址的数据表,其中分为neutron-server管理的ipallocaion*和ipam插件管理的ipamallocation*。

     每创建一个网络,都会在neutron-server中生成一条相关ip数据表。如下的子网在数据库中分别记录。VM虚机是选择了哪一个子网,在生成ip时就从该子网的数据库中分配ip地址。

    总结:

    以上是分析了在neutron-server中创建port里生成mac和ip地址的过程,简单总结

    • mac地址是根据配置文件和随机数函数生成
    • ip地址是根据数据库中的地址池分配
  • 相关阅读:
    Maven关于web.xml中Servlet和Servlet映射的问题
    intellij idea的Maven项目运行报程序包找不到的错误
    修改Maven项目默认JDK版本
    刷题15. 3Sum
    刷题11. Container With Most Water
    刷题10. Regular Expression Matching
    刷题5. Longest Palindromic Substring
    刷题4. Median of Two Sorted Arrays
    刷题3. Longest Substring Without Repeating Characters
    刷题2. Add Two Numbers
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/7966427.html
Copyright © 2011-2022 走看看