精品国产一级在线观看,国产成人综合久久精品亚洲,免费一级欧美大片在线观看

當(dāng)前位置:數(shù)據(jù)網(wǎng)絡(luò)企業(yè)動(dòng)態(tài) → 正文

OpenDaylight Neutron北向接口項(xiàng)目深探

責(zé)任編輯:editor005 |來(lái)源:企業(yè)網(wǎng)D1Net  2016-01-11 14:51:14 本文摘自:九州云

在云時(shí)代,對(duì)于學(xué)習(xí)SDN的程序員來(lái)說(shuō),OpenStack Neutron和OpenDaylight毫無(wú)疑問(wèn)是兩大技術(shù)金礦。但是對(duì)于程序員來(lái)說(shuō),要跨這兩個(gè)社區(qū)意味著Python,JAVA兩大技術(shù)群。所以借句套話來(lái)說(shuō)就是“既是機(jī)遇,也是挑戰(zhàn)”。OpenStack社區(qū)已經(jīng)存在5年多了,OpenDaylight才不到三年的時(shí)間。相比OpenStack來(lái)說(shuō),OpenDaylight在管理上顯得不是很清晰,文檔的更新和即時(shí)性也比較差。借助于本人在Java領(lǐng)域的經(jīng)驗(yàn),在研究了各種相關(guān)技術(shù)和代碼后,總結(jié)了一下OpenDaylight北向接口的技術(shù)內(nèi)密。

Neutron北向接口概述
當(dāng)然要了解這個(gè)項(xiàng)目,項(xiàng)目的wiki站點(diǎn)https://wiki.opendaylight.org/view/NeutronNorthbound:Main 無(wú)疑是最好的地方。項(xiàng)目的freenode IRC頻道是#opendaylight-neutron,雖然wiki主站點(diǎn)標(biāo)的是#opendaylight。從這個(gè)頻道的參與人數(shù)來(lái)看(如下圖),這個(gè)項(xiàng)目的參與度不是很高。而且?guī)讉€(gè)核心經(jīng)常不在線,但有可能是我們時(shí)區(qū)的原因。

好了,我們接著聊聊這個(gè)項(xiàng)目的主要目的:

1. 讓ODL和Openstack Neutron對(duì)接2. 隔離Neutron和Opendaylight各自的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)3. 給Opendaylight各個(gè)網(wǎng)絡(luò)項(xiàng)目提供neutron的虛擬網(wǎng)絡(luò)接口4. 吸引更多的開(kāi)發(fā)者進(jìn)入社區(qū)

前兩個(gè)目的顯而易見(jiàn),我們說(shuō)說(shuō)第三和第四條。

如上圖,現(xiàn)在Opendaylight和openstack neutron的集成有多個(gè)項(xiàng)目,比如VTN,DOVE和OVSDB。它們都通過(guò)neutron北向接口和OpenStack neutron通信。

對(duì)于吸引更多的開(kāi)發(fā)者,那就是說(shuō),投身于社區(qū)的開(kāi)發(fā)人員在理論上來(lái)說(shuō)是固定的,如果能把OpenStack的開(kāi)發(fā)人員吸引部分到Opendaylight里來(lái),這對(duì)于社區(qū)的發(fā)展肯定是件好事。下面是兩個(gè)社區(qū)頻道參與人員的數(shù)量:

不難發(fā)現(xiàn),兩個(gè)社區(qū)的人員參與度不在一個(gè)量級(jí)。這也許是opendaylight涉及的領(lǐng)域比較專(zhuān)的原因,而且做java的開(kāi)發(fā)者大都在做企業(yè)應(yīng)用,對(duì)于用java做網(wǎng)絡(luò),大家還是有點(diǎn)不習(xí)慣。

Neutron北向接口項(xiàng)目的結(jié)構(gòu)
我們安裝了opendaylight后,進(jìn)入karaf控制臺(tái),執(zhí)行bundle:list | grep neutron可以看到這個(gè)項(xiàng)目的bundle,如下:

各個(gè)模塊實(shí)現(xiàn)了各自的功能,它們之間的依賴(lài)關(guān)系大概如下:

1. northbound-api主要是提供restful接口,把從openstack 過(guò)來(lái)的調(diào)用轉(zhuǎn)向transcriber項(xiàng)目中的服務(wù)。

2. neutron-spi項(xiàng)目提供restful接口的數(shù)據(jù)模型,也就是restful接口的http數(shù)據(jù)會(huì)直接轉(zhuǎn)換成這里對(duì)應(yīng)的數(shù)據(jù)對(duì)象。當(dāng)然這個(gè)SPI還定義了一些服務(wù)接口,來(lái)和northbound-api對(duì)接。

3. transcriber項(xiàng)目實(shí)現(xiàn)了neutron-spi中定義的服務(wù)接口,它把restful接口傳遞進(jìn)來(lái)的數(shù)據(jù)轉(zhuǎn)換成ODL的MD數(shù)據(jù)庫(kù)中的model。

4. model定義了這個(gè)項(xiàng)目在ODL中的neutron表述。Restful接口傳進(jìn)來(lái)的數(shù)據(jù)通過(guò)transcriber的處理,從Neutron-spi中的模型轉(zhuǎn)換成MD中model定義的模型。當(dāng)然對(duì)于Restful中需要訪問(wèn)數(shù)據(jù)的接口,transcriber把ODL中的model定義的數(shù)據(jù)轉(zhuǎn)成neutron-spi定義的數(shù)據(jù)模型,再通過(guò)restful接口暴露給Openstack的模塊。

northbound-api的restful接口
northbound-api是個(gè)WAR模塊,也就是說(shuō)它是一個(gè)web應(yīng)用。它的web 根目錄定義在maven 構(gòu)建插件生成的MANIFEST.MF文件中:

也就是如上圖所示的“/controller/nb/v2/neutron”。當(dāng)然作為一個(gè)J2EE web應(yīng)用模塊,web.xml文件是必不可少的:

而且還可以看出我們的API是一個(gè)jersey容器下跑的一個(gè)應(yīng)用。Karaf的配置目錄下,我們可以看到j(luò)ersey容器的配置文件:

從上圖可知jersey的監(jiān)聽(tīng)地址是8181和8080。這也是我們?yōu)槭裁磿?huì)有http://localhost:8181/index.html看到DLUX界面的原因。

RESTFUL 接口調(diào)用示例
RESTFUL接口針對(duì)neutron的網(wǎng)絡(luò)模型對(duì)各個(gè)對(duì)象都有增刪改查的URL。這里我們針對(duì)網(wǎng)絡(luò)這個(gè)資源對(duì)象來(lái)演示這個(gè)API的使用。

下面我們先創(chuàng)建一個(gè)虛擬網(wǎng)絡(luò):

然后再獲取所有虛擬網(wǎng)絡(luò):

當(dāng)然,我們也可以單獨(dú)顯示某個(gè)虛擬網(wǎng)絡(luò):

和刪除網(wǎng)絡(luò):

northbound-spi 定義API接口后面的數(shù)據(jù)模型和操作接口

如上圖所示,NeutronNorthboundRSApplication是web應(yīng)用入口,其定義了系統(tǒng)所有的URL映射類(lèi),比如為網(wǎng)絡(luò)對(duì)象的NeutronNetworksNorthbound,為子網(wǎng)對(duì)象定義的NeutronSubnetsNorthbound。這些northbound類(lèi)定義了各個(gè)對(duì)象的增刪改查URL映射。

下面我們只描述為網(wǎng)絡(luò)對(duì)象定義URL接口的NeutronNetworksNorthbound類(lèi)。它的定義如下:

可以看到它的映射前綴是:“/networks”,首先看看Network List操作的映射:

我們看看這個(gè)方法的各種annotation。首先是@Get,這表明是個(gè)HTTP Get方法。接著是狀態(tài)碼的定義,然后是方法內(nèi)部對(duì)于各個(gè)URL查詢(xún)參數(shù)的映射。然后調(diào)用SPI模塊中的接口INetworkNetworkCRUD來(lái)獲得系統(tǒng)中的網(wǎng)絡(luò)對(duì)象NeutronNetwork,接著循環(huán)處理這些網(wǎng)絡(luò)對(duì)象。

下面是這個(gè)方法的后半部分:

分兩種情況,第一種是分頁(yè),第二種不分頁(yè)。但是最后還是創(chuàng)建一個(gè)NeutronNetworkRequest對(duì)象對(duì)NeutronNetwork進(jìn)行了封裝:

這個(gè)類(lèi)定義了它的JAXB映射,這樣容器就能把模型數(shù)據(jù)進(jìn)行序列化和反序列化。
Transcriber 在SPI模型和MD模型之間轉(zhuǎn)換

Transcriber模塊定義了一系列實(shí)現(xiàn)類(lèi)來(lái)實(shí)現(xiàn)SPI模塊中定義的各種CRUD接口。這些實(shí)現(xiàn)類(lèi)主要工作就是在SPI模型和model模塊中定義的yang模型之間進(jìn)行映射。同時(shí)通過(guò) ODL的MD服務(wù)對(duì)yang模型進(jìn)行存儲(chǔ)訪問(wèn)。

Transcriber模塊是一個(gè)典型意義上的OSGI bundle,它定義了自己的activator,這個(gè)activator啟動(dòng)的時(shí)候,注冊(cè)了實(shí)現(xiàn)SPI CRUD接口的所有服務(wù)類(lèi)。如下圖所示:

這樣,在API中調(diào)用SPI的接口時(shí),其實(shí)調(diào)用的是transcriber中實(shí)現(xiàn)的類(lèi)。

前面談到了transcriber的啟動(dòng),其裝配了SPI實(shí)現(xiàn)的接口,下面的圖形便展示了其映射網(wǎng)絡(luò)模型的fromMd和toMd方法:

yang模塊定義了neutron網(wǎng)絡(luò)的MD SAL模型
Opendaylight中大量運(yùn)用了yang技術(shù),它很好地配合了網(wǎng)絡(luò)設(shè)備廠商的NETCONF技術(shù)。Yang模型既能定義數(shù)據(jù),也能定義RPC方法和通知。要學(xué)好Opendaylight,了解Yang是個(gè)必備的前提。當(dāng)然其它的技術(shù)還有JAVA,MAVEN,OSGI,J2EE等。

如上圖,這個(gè)模塊基本上就neutron網(wǎng)絡(luò)模型中的每個(gè)對(duì)象都有相應(yīng)的定義。

ODL給yang模型提供了restconf接口,只要項(xiàng)目定義好yang模型,被裝載進(jìn)ODL后,系統(tǒng)就可以為這些模型提供restconf接口。用戶(hù)可以直接調(diào)用這些接口用以操縱模型數(shù)據(jù)。下面我們演示一下這個(gè)操作過(guò)程。

首先我們得確保系統(tǒng)安裝了odl-restconf feature:

然后可以使用下面的cURL命令訪問(wèn)我們的虛擬網(wǎng)絡(luò)模型。比如顯示所有網(wǎng)絡(luò):

創(chuàng)建網(wǎng)絡(luò):

后 記
Neutron北向接口項(xiàng)目本身在不斷地發(fā)展,它的架構(gòu)和代碼會(huì)繼續(xù)演進(jìn),本文的深度探索只是針對(duì)目前版本的技術(shù)分析。

當(dāng)然,希望大家積極參與社區(qū)貢獻(xiàn),為項(xiàng)目的成熟貢獻(xiàn)自己的力量。就像前面所說(shuō),在Opendaylight中做開(kāi)發(fā)是個(gè)很有挑戰(zhàn)性的工作,要求的知識(shí)面和技術(shù)實(shí)力都比較高,能在這里遨游本身就是對(duì)自己的肯定。

對(duì)于neutronnorthbound項(xiàng)目,既能ODL提供了restconf接口,我認(rèn)為有這么一天,自己定義的restful接口將會(huì)消失,轉(zhuǎn)而直接使用MD yang模型的restconf接口。

關(guān)鍵字:OpenDaylightgrep

本文摘自:九州云

x OpenDaylight Neutron北向接口項(xiàng)目深探 掃一掃
分享本文到朋友圈
當(dāng)前位置:數(shù)據(jù)網(wǎng)絡(luò)企業(yè)動(dòng)態(tài) → 正文

OpenDaylight Neutron北向接口項(xiàng)目深探

責(zé)任編輯:editor005 |來(lái)源:企業(yè)網(wǎng)D1Net  2016-01-11 14:51:14 本文摘自:九州云

在云時(shí)代,對(duì)于學(xué)習(xí)SDN的程序員來(lái)說(shuō),OpenStack Neutron和OpenDaylight毫無(wú)疑問(wèn)是兩大技術(shù)金礦。但是對(duì)于程序員來(lái)說(shuō),要跨這兩個(gè)社區(qū)意味著Python,JAVA兩大技術(shù)群。所以借句套話來(lái)說(shuō)就是“既是機(jī)遇,也是挑戰(zhàn)”。OpenStack社區(qū)已經(jīng)存在5年多了,OpenDaylight才不到三年的時(shí)間。相比OpenStack來(lái)說(shuō),OpenDaylight在管理上顯得不是很清晰,文檔的更新和即時(shí)性也比較差。借助于本人在Java領(lǐng)域的經(jīng)驗(yàn),在研究了各種相關(guān)技術(shù)和代碼后,總結(jié)了一下OpenDaylight北向接口的技術(shù)內(nèi)密。

Neutron北向接口概述
當(dāng)然要了解這個(gè)項(xiàng)目,項(xiàng)目的wiki站點(diǎn)https://wiki.opendaylight.org/view/NeutronNorthbound:Main 無(wú)疑是最好的地方。項(xiàng)目的freenode IRC頻道是#opendaylight-neutron,雖然wiki主站點(diǎn)標(biāo)的是#opendaylight。從這個(gè)頻道的參與人數(shù)來(lái)看(如下圖),這個(gè)項(xiàng)目的參與度不是很高。而且?guī)讉€(gè)核心經(jīng)常不在線,但有可能是我們時(shí)區(qū)的原因。

好了,我們接著聊聊這個(gè)項(xiàng)目的主要目的:

1. 讓ODL和Openstack Neutron對(duì)接2. 隔離Neutron和Opendaylight各自的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)3. 給Opendaylight各個(gè)網(wǎng)絡(luò)項(xiàng)目提供neutron的虛擬網(wǎng)絡(luò)接口4. 吸引更多的開(kāi)發(fā)者進(jìn)入社區(qū)

前兩個(gè)目的顯而易見(jiàn),我們說(shuō)說(shuō)第三和第四條。

如上圖,現(xiàn)在Opendaylight和openstack neutron的集成有多個(gè)項(xiàng)目,比如VTN,DOVE和OVSDB。它們都通過(guò)neutron北向接口和OpenStack neutron通信。

對(duì)于吸引更多的開(kāi)發(fā)者,那就是說(shuō),投身于社區(qū)的開(kāi)發(fā)人員在理論上來(lái)說(shuō)是固定的,如果能把OpenStack的開(kāi)發(fā)人員吸引部分到Opendaylight里來(lái),這對(duì)于社區(qū)的發(fā)展肯定是件好事。下面是兩個(gè)社區(qū)頻道參與人員的數(shù)量:

不難發(fā)現(xiàn),兩個(gè)社區(qū)的人員參與度不在一個(gè)量級(jí)。這也許是opendaylight涉及的領(lǐng)域比較專(zhuān)的原因,而且做java的開(kāi)發(fā)者大都在做企業(yè)應(yīng)用,對(duì)于用java做網(wǎng)絡(luò),大家還是有點(diǎn)不習(xí)慣。

Neutron北向接口項(xiàng)目的結(jié)構(gòu)
我們安裝了opendaylight后,進(jìn)入karaf控制臺(tái),執(zhí)行bundle:list | grep neutron可以看到這個(gè)項(xiàng)目的bundle,如下:

各個(gè)模塊實(shí)現(xiàn)了各自的功能,它們之間的依賴(lài)關(guān)系大概如下:

1. northbound-api主要是提供restful接口,把從openstack 過(guò)來(lái)的調(diào)用轉(zhuǎn)向transcriber項(xiàng)目中的服務(wù)。

2. neutron-spi項(xiàng)目提供restful接口的數(shù)據(jù)模型,也就是restful接口的http數(shù)據(jù)會(huì)直接轉(zhuǎn)換成這里對(duì)應(yīng)的數(shù)據(jù)對(duì)象。當(dāng)然這個(gè)SPI還定義了一些服務(wù)接口,來(lái)和northbound-api對(duì)接。

3. transcriber項(xiàng)目實(shí)現(xiàn)了neutron-spi中定義的服務(wù)接口,它把restful接口傳遞進(jìn)來(lái)的數(shù)據(jù)轉(zhuǎn)換成ODL的MD數(shù)據(jù)庫(kù)中的model。

4. model定義了這個(gè)項(xiàng)目在ODL中的neutron表述。Restful接口傳進(jìn)來(lái)的數(shù)據(jù)通過(guò)transcriber的處理,從Neutron-spi中的模型轉(zhuǎn)換成MD中model定義的模型。當(dāng)然對(duì)于Restful中需要訪問(wèn)數(shù)據(jù)的接口,transcriber把ODL中的model定義的數(shù)據(jù)轉(zhuǎn)成neutron-spi定義的數(shù)據(jù)模型,再通過(guò)restful接口暴露給Openstack的模塊。

northbound-api的restful接口
northbound-api是個(gè)WAR模塊,也就是說(shuō)它是一個(gè)web應(yīng)用。它的web 根目錄定義在maven 構(gòu)建插件生成的MANIFEST.MF文件中:

也就是如上圖所示的“/controller/nb/v2/neutron”。當(dāng)然作為一個(gè)J2EE web應(yīng)用模塊,web.xml文件是必不可少的:

而且還可以看出我們的API是一個(gè)jersey容器下跑的一個(gè)應(yīng)用。Karaf的配置目錄下,我們可以看到j(luò)ersey容器的配置文件:

從上圖可知jersey的監(jiān)聽(tīng)地址是8181和8080。這也是我們?yōu)槭裁磿?huì)有http://localhost:8181/index.html看到DLUX界面的原因。

RESTFUL 接口調(diào)用示例
RESTFUL接口針對(duì)neutron的網(wǎng)絡(luò)模型對(duì)各個(gè)對(duì)象都有增刪改查的URL。這里我們針對(duì)網(wǎng)絡(luò)這個(gè)資源對(duì)象來(lái)演示這個(gè)API的使用。

下面我們先創(chuàng)建一個(gè)虛擬網(wǎng)絡(luò):

然后再獲取所有虛擬網(wǎng)絡(luò):

當(dāng)然,我們也可以單獨(dú)顯示某個(gè)虛擬網(wǎng)絡(luò):

和刪除網(wǎng)絡(luò):

northbound-spi 定義API接口后面的數(shù)據(jù)模型和操作接口

如上圖所示,NeutronNorthboundRSApplication是web應(yīng)用入口,其定義了系統(tǒng)所有的URL映射類(lèi),比如為網(wǎng)絡(luò)對(duì)象的NeutronNetworksNorthbound,為子網(wǎng)對(duì)象定義的NeutronSubnetsNorthbound。這些northbound類(lèi)定義了各個(gè)對(duì)象的增刪改查URL映射。

下面我們只描述為網(wǎng)絡(luò)對(duì)象定義URL接口的NeutronNetworksNorthbound類(lèi)。它的定義如下:

可以看到它的映射前綴是:“/networks”,首先看看Network List操作的映射:

我們看看這個(gè)方法的各種annotation。首先是@Get,這表明是個(gè)HTTP Get方法。接著是狀態(tài)碼的定義,然后是方法內(nèi)部對(duì)于各個(gè)URL查詢(xún)參數(shù)的映射。然后調(diào)用SPI模塊中的接口INetworkNetworkCRUD來(lái)獲得系統(tǒng)中的網(wǎng)絡(luò)對(duì)象NeutronNetwork,接著循環(huán)處理這些網(wǎng)絡(luò)對(duì)象。

下面是這個(gè)方法的后半部分:

分兩種情況,第一種是分頁(yè),第二種不分頁(yè)。但是最后還是創(chuàng)建一個(gè)NeutronNetworkRequest對(duì)象對(duì)NeutronNetwork進(jìn)行了封裝:

這個(gè)類(lèi)定義了它的JAXB映射,這樣容器就能把模型數(shù)據(jù)進(jìn)行序列化和反序列化。
Transcriber 在SPI模型和MD模型之間轉(zhuǎn)換

Transcriber模塊定義了一系列實(shí)現(xiàn)類(lèi)來(lái)實(shí)現(xiàn)SPI模塊中定義的各種CRUD接口。這些實(shí)現(xiàn)類(lèi)主要工作就是在SPI模型和model模塊中定義的yang模型之間進(jìn)行映射。同時(shí)通過(guò) ODL的MD服務(wù)對(duì)yang模型進(jìn)行存儲(chǔ)訪問(wèn)。

Transcriber模塊是一個(gè)典型意義上的OSGI bundle,它定義了自己的activator,這個(gè)activator啟動(dòng)的時(shí)候,注冊(cè)了實(shí)現(xiàn)SPI CRUD接口的所有服務(wù)類(lèi)。如下圖所示:

這樣,在API中調(diào)用SPI的接口時(shí),其實(shí)調(diào)用的是transcriber中實(shí)現(xiàn)的類(lèi)。

前面談到了transcriber的啟動(dòng),其裝配了SPI實(shí)現(xiàn)的接口,下面的圖形便展示了其映射網(wǎng)絡(luò)模型的fromMd和toMd方法:

yang模塊定義了neutron網(wǎng)絡(luò)的MD SAL模型
Opendaylight中大量運(yùn)用了yang技術(shù),它很好地配合了網(wǎng)絡(luò)設(shè)備廠商的NETCONF技術(shù)。Yang模型既能定義數(shù)據(jù),也能定義RPC方法和通知。要學(xué)好Opendaylight,了解Yang是個(gè)必備的前提。當(dāng)然其它的技術(shù)還有JAVA,MAVEN,OSGI,J2EE等。

如上圖,這個(gè)模塊基本上就neutron網(wǎng)絡(luò)模型中的每個(gè)對(duì)象都有相應(yīng)的定義。

ODL給yang模型提供了restconf接口,只要項(xiàng)目定義好yang模型,被裝載進(jìn)ODL后,系統(tǒng)就可以為這些模型提供restconf接口。用戶(hù)可以直接調(diào)用這些接口用以操縱模型數(shù)據(jù)。下面我們演示一下這個(gè)操作過(guò)程。

首先我們得確保系統(tǒng)安裝了odl-restconf feature:

然后可以使用下面的cURL命令訪問(wèn)我們的虛擬網(wǎng)絡(luò)模型。比如顯示所有網(wǎng)絡(luò):

創(chuàng)建網(wǎng)絡(luò):

后 記
Neutron北向接口項(xiàng)目本身在不斷地發(fā)展,它的架構(gòu)和代碼會(huì)繼續(xù)演進(jìn),本文的深度探索只是針對(duì)目前版本的技術(shù)分析。

當(dāng)然,希望大家積極參與社區(qū)貢獻(xiàn),為項(xiàng)目的成熟貢獻(xiàn)自己的力量。就像前面所說(shuō),在Opendaylight中做開(kāi)發(fā)是個(gè)很有挑戰(zhàn)性的工作,要求的知識(shí)面和技術(shù)實(shí)力都比較高,能在這里遨游本身就是對(duì)自己的肯定。

對(duì)于neutronnorthbound項(xiàng)目,既能ODL提供了restconf接口,我認(rèn)為有這么一天,自己定義的restful接口將會(huì)消失,轉(zhuǎn)而直接使用MD yang模型的restconf接口。

關(guān)鍵字:OpenDaylightgrep

本文摘自:九州云

電子周刊
回到頂部

關(guān)于我們聯(lián)系我們版權(quán)聲明隱私條款廣告服務(wù)友情鏈接投稿中心招賢納士

企業(yè)網(wǎng)版權(quán)所有 ©2010-2024 京ICP備09108050號(hào)-6 京公網(wǎng)安備 11010502049343號(hào)

^
  • <menuitem id="jw4sk"></menuitem>

    1. <form id="jw4sk"><tbody id="jw4sk"><dfn id="jw4sk"></dfn></tbody></form>
      主站蜘蛛池模板: 雷州市| 楚雄市| 汽车| 宁波市| 龙胜| 集安市| 镇安县| 涪陵区| 三门峡市| 阜宁县| 保山市| 穆棱市| 三台县| 左云县| 金溪县| 昆明市| 区。| 汪清县| 潮安县| 施甸县| 临潭县| 银川市| 静乐县| 福州市| 正阳县| 即墨市| 怀宁县| 绥滨县| 曲周县| 托克逊县| 运城市| 舟曲县| 湘阴县| 滦南县| 常德市| 筠连县| 从江县| 黄大仙区| 额尔古纳市| 新邵县| 枣阳市|