Openstack_通用模块_Oslo_vmware 创建 vSS PortGroup

目录

vSS & vSSPG

vSS(Standard vSwitch 标准交换机) 为在同一 ESXi/ESX 或不同 ESXi/ESX 上 VirtualMachine 之间的连接, 也可以让 VirtualMachine 连接到外部网络.

vSSPG(Standard vSwitch PortGroup 标准交换机端口组) 是 vSphere 的基本网络对象模型, VirtualMachine 会通过一个 PortGroup 来访问网络.

这里写图片描述

使用 oslo.vmware 模块结合 vSphere API 来创建 vSSPG 是一个相对综合的调用过程, 在实现的过程中能让我们理解 vSphere SDK 定义的相关概念模型, 以及熟悉 VMware vSphere API Reference Docs.

vSphere SDK 中相关的网络对象

vSphere Web Services SDK 包括下列对象和方法来管理网络配置:

  • HostNetworkSystem(Managed Object): 代表了主机的网路配置, 拥有检索和改变网络配置的方法. 所以我们能够使用 HostNetworkSystem MO 对象来访问和控制 ESX/ESXi 的网络概念模型.
    这里写图片描述

  • HostNetworkConfig(Data Object): 用于规划 ESXi Host 详细的网络配置.

创建 vSS PortGroup

首先我们已经知道创建标准交换机端口组需要使用 HostNetowrkSystem MO 的 AddPortGroup 方法, 所以调用该方法的前提就是能够获取到HostNetowrkSystem MO. 但遗憾的是我们无法通过 oslo.vmware 模块提供的 get_objects invoke_api 来直接获取, 这就需要我们费些心思去找到其上级且可使用 get_objects invoke_api 来获取的 MO.

NOTE: 下述多数截图出自于 VMware vSphere API Reference Docs.

从下图可知 HostNetworkSystem MO 的上级 Property 是 HostConfigManager, 那么我们首先进入到 HostConfigManager 的 Docs.

这里写图片描述

然后从下图可知 HostConfigManager 是一个 Data object, 我们仍无法通过 get_object invoke_api 的方式来获取这个对象, 所以继续进入 HostConfigManager 对象的上级 Property.

这里写图片描述

直到现在我们看到了非常熟悉的 HostSystem MO, 这是一个非常常用的 MO, 并且支持 get_object invoke_api 的获取方式, 所以从 HostSystem 开始, 我们就能够其属性, 直到得到 HostNetowrkSystem MO 为止.

  • Step 1: 连接到 vCenter 或 ESXi/ESX
from oslo_vmware import api
from oslo_vmware import vim_util

# Create the vmware session
session = api.VMwareAPISession(
    '200.21.102.7',
    'root',
    'vmware',
    1,  
    0.1)
  • Step 2: 获取 HostSystem MO
hosts = session.invoke_api(
    vim_util,        
    'get_objects',              
    session.vim,                 
    'HostSystem',                
    100)

# 我们随意选取一个 ESXi Host, 并且打印其 Object
host_obj = hosts.objects[0].obj

In [17]: hosts.objects[0].obj
Out[17]:
(obj){
   value = "host-10"
   _type = "HostSystem"
 }
  • Step 3: 从下图可以看出 HostSystem 的 Properties configManager 就是 HostConfigManager 对象, HostConfigManager 的 Properties networkSystem 就是 HostNetworkSystem 对象.

(HostSystem ==> HostConfigManager)
这里写图片描述

(HostConfigManager ==> HostNetworkSystem)
这里写图片描述

# 获取 HostNetworkSystem MO, 并打印其 Value
host_network_system_val = session.invoke_api(
    vim_util,        
    'get_object_properties_dict',              
    session.vim,                 
    host_obj,                
    'configManager.networkSystem')

In [24]: host_network_system_val
Out[24]:
{configManager.networkSystem: (val){
   value = "networkSystem-10"
   _type = "HostNetworkSystem"
 }}
  • Step 4: 在得到了 host_network_system_val 对象之后, 我们就能够通过 session.invoke_api 来调用该对象的 AddPortGroup 方法了. 但仍有一个前提, 就是我们需要为 AddPortGroup 准备好需要传入的实参 portgrp(HostPortGroupSpec).
    这里写图片描述

再如下图, 我们得知 HostPortGroupSpec 是一个 Data Object, 所以我们能够通过 session.vim.client.factory.create 方法来获取该对象的数据结构.
这里写图片描述

# 获取 HostPortGroupSpec 对象的数据结构, 并打印
client_factory = session.vim.client.factory
vswitch_port_group_spec = client_factory.create('ns0:HostPortGroupSpec')


In [26]: vswitch_port_group_spec
Out[26]:
(HostPortGroupSpec){
   dynamicType = None
   dynamicProperty[] = <empty>
   name = None
   vlanId = None
   vswitchName = None
   policy =
      (HostNetworkPolicy){
         dynamicType = None
         dynamicProperty[] = <empty>
         security =
            (HostNetworkSecurityPolicy){
               dynamicType = None
               dynamicProperty[] = <empty>
               allowPromiscuous = None
               macChanges = None
               forgedTransmits = None
            }
         nicTeaming =
            (HostNicTeamingPolicy){
               dynamicType = None
               dynamicProperty[] = <empty>
               policy = None
               reversePolicy = None
               notifySwitches = None
               rollingOrder = None
               failureCriteria =
                  (HostNicFailureCriteria){
                     dynamicType = None
                     dynamicProperty[] = <empty>
                     checkSpeed = None
                     speed = None
                     checkDuplex = None
                     fullDuplex = None
                     checkErrorPercent = None
                     percentage = None
                     checkBeacon = None
                  }
               nicOrder =
                  (HostNicOrderPolicy){
                     dynamicType = None
                     dynamicProperty[] = <empty>
                     activeNic[] = <empty>
                     standbyNic[] = <empty>
                  }
            }
         offloadPolicy =
            (HostNetOffloadCapabilities){
               dynamicType = None
               dynamicProperty[] = <empty>
               csumOffload = None
               tcpSegmentation = None
               zeroCopyXmit = None
            }
         shapingPolicy =
            (HostNetworkTrafficShapingPolicy){
               dynamicType = None
               dynamicProperty[] = <empty>
               enabled = None
               averageBandwidth = None
               peakBandwidth = None
               burstSize = None
            }
      }
 }
  • Step 5: 通过设置 HostPortGroupSpec 的项目值来达到设置 PortGroup 属性的目的

一般我们需要关注的项目值在 Docs 中都有明确的指示:
这里写图片描述

# 其中 policy 项的值有必须是一个 HostNetworkPolicy Data Object
# 所以我们需要使用与获取 HostPortGroupSpec 相同的方式来获取 HostNetworkPolicy 对象的数据结构.
policy = client_factory.create('ns0:HostNetworkPolicy')
nicteaming = client_factory.create('ns0:HostNicTeamingPolicy')
nicteaming.notifySwitches = True
policy.nicTeaming = nicteaming

port_group_name = 'fanguiju-test'
vswitch_name = 'vSwitch0'
vlan_id = '0'

vswitch_port_group_spec.policy = policy
vswitch_port_group_spec.name = port_group_name
vswitch_port_group_spec.vswitchName = vswitch_name
vswitch_port_group_spec.vlanId = int(vlan_id)

直到现在, 我们终于准备好了 AddPortGroup 方法的实参, 接下来就能够调用这个方法实现标准交换机端口组的创建.

  • Step 6: 调用 AddPortGroup 方法
session.invoke_api(session.vim, 
                   'AddPortGroup',
                   host_network_system_val['configManager.networkSystem'], 
                   portgrp=vswitch_port_group_spec)

#  session.invoke_api() 的使用方法:
#      - 第二个参数是我们要调用的目标方法: AddPortGroup
#      - 第三个参数是我们要调用的目标方法 AddPortGroup 的属主 MO: HostNetowrkSystem
#      - 第四个~第 n 个参数是传递给目标方法 AddPortGroup 的实参
  • Step 7: 验证结果

这里写图片描述

优秀的个人博客,低调大师

微信关注我们

转载内容版权归作者及来源网站所有!本站原创内容转载请注明来源!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。