首页 文章 精选 留言 我的

精选列表

搜索[通用教育],共10000篇文章
优秀的个人博客,低调大师

Openstack_通用模块_Oslo_vmware 创建 vSS PortGroup

目录 目录 vSS vSSPG vSphere SDK 中相关的网络对象 创建 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: 验证结果

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

C++ FFLIB之ffcount:通用数据分析系统

摘要: 数据分析已经变得不可或缺,几乎每个公司都依赖数据分析进行决策。在我从事的网游领域,数据分析是策划新功能、优化游戏体验最重要的手段之一。网游领域的数据分析有如下特点(开发角度): 数据量大;网游用户量大,用户行为多,存储数据量较大。 实时性要求高;比如新上的游戏功能,玩家体验和反馈希望尽快的被分析出来。 需求变化快。网游的需求变化日新月异,故要求数据分析系统能够快速的响应需求变化。 常见的数据分析系统 数据分析系统应该分为数据存储和数据分析,常见的数据分析架构有: 直接在逻辑服务中定制数据分析;这种情况往往使用mysql或这mongodb作为数据存储,优点是定制化的数据存储更加节省空间,缺点是mysql和mongodb的数据存储服务器往往成本更高,并且若增加新需求,定制化需要的开发量极大,并且维护老的数据分析代码往往十分困难,因为是高度定制化的,往往会绑定在特殊的应用背景下。 使用scribe做数据存储,使用hadoop分析数据。Facabook scribe server 可以利用hadoop分布式文件系统来存储大数据,电子商务或者sns网站往往使用这种可扩展的成熟的方案,缺点是部署和维护成本较高,中小型团队要建立hadoop集群无论从人力还是物力都相对困难。 确定需求: 数据存储尽量简单和低成本,由于日志数据的读取效率要求并不高,所以使用普通机器一般磁盘存储即可,而不需要另外使用mysql及其他nosql等。 数据分析尽量简单易开发,目前来讲,sql查询是最方便最基础的方式,所以数据应该是sql结构化的。 hadoop的部署对于中小团队仍然是望而生畏的,故要求数据分析系统部署要简单,配置容易。 ffcount 的架构 内部工作机制 时序图说明内部工作机制: 示例C++客户端代码: #include "count/ffcount.h" #include "rpc/broker_application.h" #include "base/daemon_tool.h" #include "base/arg_helper.h" using namespace ff; #include <stdio.h> #define NUM 0 int main(int argc, char* argv[]) { arg_helper_t arg_helper(argc, argv); if (false == arg_helper.is_enable_option("-l")) { printf("usage: app -l tcp://127.0.0.1:10241\n"); return 1; } assert(0 == singleton_t<msg_bus_t>::instance().open(arg_helper.get_option_value("-l")) && "can't connnect to broker"); assert(singleton_t<msg_bus_t>::instance().get_service_group("event_log_service") && "event_log_service group not exist"); assert(singleton_t<msg_bus_t>::instance().get_service_group("event_log_service")->get_service(0) && "event_log_service 0 not exist"); event_log_t el("test"/*dbname*/,"dumy"/*tablename*/, "A,B,C"/*fields name*/);el.def(100, "p\"T'p", 5.4); singleton_t<msg_bus_t>::instance().get_service_group("event_log_service")->get_service(0)->async_call(el); for (int i = 0; i < NUM; ++i) { char buff[64]; snprintf(buff, sizeof(buff), "dumy_%d", i%8); event_log_t el(buff, "A,B,C");el.def(100, "pp", 5.4); singleton_t<msg_bus_t>::instance().get_service_group("event_log_service")->get_service(0)->async_call(el); } event_queryt_t::in_t in_msg; in_msg.db_name = "test"; in_msg.sql = "select * from dumy"; struct lambda_t { static void callback(event_queryt_t::out_t& msg_) { printf("=====>>>>> callback dump data [%s]<<<<<<=======\n", msg_.err_msg.c_str()); ffdb_t::dump(msg_.ret_data, msg_.col_names); event_log_t el("test", "dumy", "A,B,C");el.def(100, "p\"T'p", 5.4); singleton_t<msg_bus_t>::instance().get_service_group("event_log_service")->get_service(0)->async_call(el); for (int i = 0; i < NUM; ++i) { char buff[64]; snprintf(buff, sizeof(buff), "dumy_%d", i%8); event_log_t el(buff, "A,B,C");el.def(100, "pp", 5.4); singleton_t<msg_bus_t>::instance().get_service_group("event_log_service")->get_service(0)->async_call(el); } sleep(1); event_queryt_t::in_t in_msg; //in_msg.str_time = "2013/2";//! 查询1月的数据 in_msg.db_name = "test"; in_msg.sql = "select * from dumy order by logtime desc limit 5"; singleton_t<msg_bus_t>::instance().get_service_group("event_log_service")->get_service(0)->async_call(in_msg, &lambda_t::callback); } }; singleton_t<msg_bus_t>::instance().get_service_group("event_log_service")->get_service(0)->async_call(in_msg, &lambda_t::callback); signal_helper_t::wait(); singleton_t<msg_bus_t>::instance().close(); return 0; } 示例php客户端 <?php function ffcount_query($host, $port, $str_time, $db_name, $sql) { //以下为引用的内容: // 1. 初始化 $ch = curl_init(); // 2. 设置选项,包括URL $url = "http://".$host.":".$port."/".$str_time."/".$db_name."/".rawurlencode($sql); //echo $url."\n"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. 执行并获取HTML文档内容 $output = curl_exec($ch); // 4. 释放curl句柄 curl_close($ch); if ($output === FALSE) { //echo "cURL Error: " . curl_error($ch); $ret = array("err_msg" =>"http request failed by curl", "col_names"=>array(), "ret_data"=>array()); } else { $ret = json_decode($output); if (!$ret) { $ret = array("err_msg" =>$output, "col_names"=>array(), "ret_data"=>array()); } } return $ret; } $host = "127.0.0.1"; $port = 8080; $str_time = "2013/2"; $db_name = "test"; $sql = "select * from dumy"; $ret = ffcount_query($host, $port, $str_time, $db_name, $sql); print_r($ret); ?> 示例C++ server启动: ./app_count -l tcp://127.0.0.1:10241 -http tcp://127.0.0.1:8080 总结: ffcount 根本上提供的是数据日志存储 ffcount 使用sql来组织日志文件,从而拥有了sql数据分析能力 ffcount 数据文件按照每月归档 ffcount 自动创建表和字段,默认创建autoid和logtime两字段,前者为自增主键,后者为timestamp类型,默认为当前时间 ffcount 支持http查询,数据存储接口已经有C++ 类库接口 build server: git clone https://github.com/fanchy/fflib cd fflib/example/book/count && make && ./app_count -l tcp://127.0.0.1:10241 -http tcp://127.0.0.1:8080 build client: cd fflib/example/book/count_client && make && ./app_client -l tcp://127.0.0.1:10241 php client: cd fflib/example/book/count_client/php && php test.php

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

马云纽约演讲全文:再不改革教育,年轻人都要失业

作者:造就 来源:造就(ID:xingshu100) 编者按:2017年9月20日,阿里巴巴集团董事局主席马云在彭博世界经济论坛上发表演讲。以下为演讲全文。 马云: 克林顿总统先生、迈克尔、各位阁下、朋友们,早上好。 先前他们联系我说,纽约有一场论坛,让我们分享对未来的想法和思考。我感到非常兴奋和荣幸。 我不是政治家,也不是科学家。我是个商人。作为一名企业家,我非常高兴地在此分享我们从生活中学到了什么,我们应该以怎样的态度面对未来。 作为一名企业家,我们非常清楚地知道,如果我们失去领导力,失去想象力,我们的公司将没有前途。在我的公司还非常小的时候,我们每天都寻找机会壮大自己。现在,我的公司变得很大,我每天都担心有什么其他的风险,有什么其他的事情将阻碍我们前进,变成公司的毒瘤。 我们在摸清这些问题时,必须思考一件事:该如何把这些问题转化成机遇?在这

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册