
在先前的几个小结中,一共了解了:
一共实现了:
在本文中,我们将进一步的介绍ONOS作为控制平面的工作原理:
让我们打开docker -compose.yml可以看见ONOS的应用程序有哪些
- ONOS_APPS=gui2,drivers.bmv2,lldpprovider,hostprovider
首先make restart,当我们打开的时候,启动了ONOS控制平面,控制平面集成了几个重要功能:
gui2: ONOS的用户界面drivers.bmv2: 基于 P4Runtime, gNMI, and gNOI的BMv2/Stratum驱动,stratum中最下层就是bmv2,然后第二层就是它提供的P4RT,gNMI,gNOI,因此在ONOS中需要在协议上一一对应他们的驱动实现,双方以gRPC交流(gNMI/gNOI作为交换机的配置/操作接口)lldpprovider: 基于LLDP的链路发现运用hostprovider: 主机发现运用这是Stratum与ONOS在网络的云原生的一些运用,来源云原生视角下的开放网络 | SDNLAB | 专注网络创新技术
这是对ONOS的一些基本介绍:来源:SDN系统方法 | 3. 基本架构 - 掘金 (juejin.cn)
Stratum在交换机与外部世界的所有交互中起到中介作用,包括加载P4编译器生成的目标文件,该文件定义了数据平面和控制平面之间的契约。契约有效的用自动生成的规范替换了OpenFlow的流规则抽象。其他Stratum管理API定义如下:
- P4Runtime: 控制转发行为的运行时接口,是填充转发表和操作转发表状态的关键。P4Runtime独立于任何特定P4程序,并且与底层硬件无关。这与OpenFlow形成了鲜明对比,OpenFlow对转发模型以及如何与控制平面交互有着相当明确的规定。(为了完整起见,图15还列出了OpenFlow作为另一个控制接口。)
- gNMI(gRPC Network Management Interface): 用于设置和检索配置状态。gNMI通常与OpenConfig YANG模型配对,后者定义配置和状态树的结构。
- gNOI(gRPC Network OperationsInterfaces): 用于设置和检索运行状态,如证书管理、设备测试、软件升级、组网故障处理等。
我们基于ONOS(开放网络操作系统, Open Network Operating System) 这一特定网络操作系统作为范例来完整描述这一概念,ONOS在性能、可伸缩性和可用性方面是最好的。简单来说,ONOS负责三件事情:
- 管理拓扑(Managing Topology): 跟踪网络基础设施及其互联设备,为平台和其他应用程序提供网络环境的共享视图。
- 管理配置(Managing Configuration): 帮助在多个网络设备上执行、跟踪、回滚和验证原子配置操作。这可以有效反映每个交换机的配置和操作接口(也使用gNMI和gNOI),但是在网络级别而不是设备级别上实现的。
- 控制交换(Controlling Switches): 控制网络交换机的数据平面数据包处理流水线,并对流水线内的流规则、组、监控等构建块进行后续控制。
使用make onos-cli进入ONOS建立ONOS的连接,并进入命令行:
先看看我们有多少应用程序,有这么多,但是我们总共才4个,其他应用程序时一些驱动应用(org.onosproject.drivers ),以及流水线基础(pipelines.basic )等等

在app文件夹下,有如下几个应用
我们用make app-build app reload分别build应用程序以及把应用程序装载到ONOS上面,应用程序激活后,您应该会在ONOS日志(make-ons log)中看到以下消息,表明pipeconf已经注册,并且不同的应用程序组件已经启动
在onos指令行键入pipeconfs可以查看流水线的信息:

现在ONOS和Mininet正在运行,是时候让ONOS知道如何到达四个p4交换机并控制它们了,我们通过使用位于mininet/netcfg.json的配置文件来实现这一点,该文件包含以下信息:
与每个Stratum设备相关联的gRPC地址和端口;
用于每个设备的ONOS驱动程序,在这种情况下均为stratum-bmv2;
特定于我们的自定义应用程序的配置(fabricDeviceConfig)
我们来看看这个json文件的格式,是这样的,后续再解释应用程序的具体实现:

我们使用make netcfg来将网络配置信息装载到ONOS上,这样就使他发现了交换机了

devices -s就可以发现有这么多的设备

portstats device:spine1 查看设备上的端口信息

flows -s any device:leaf1 查看设备上的流表信息

很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵