NETCONF/YANG を使って、Ciscoルータのコンフィグ（BGP）を設定する(IOS-XE)

#何がやりたい？
NETCONF/YANGを使ってBGPの設定を追加したい。

##確認したいポイント
下記の設定内容が、どのようにpayload部分のYANGモデルに該当しているのかを確認してください。

```text:config
CSR1kv_R1#show running-config | section router bgp
router bgp 65000
 bgp router-id 1.1.1.1
 bgp log-neighbor-changes
 neighbor pg_ibgp peer-group
 neighbor pg_ibgp remote-as 65000
 neighbor pg_ibgp update-source Loopback0
 neighbor pg_ibgp next-hop-self
 neighbor 2.2.2.2 peer-group pg_ibgp
CSR1kv_R1#
```

##スクリプト本体

```python:edit_config_bgp.py
#!/usr/bin/env python

from ncclient import manager
from xml.dom import minidom
import lxml.etree as ET
import xmltodict
import json

payload = """
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
    <router>
      <bgp xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-bgp">
        <id>65000</id>
        <bgp>
          <router-id>1.1.1.1</router-id>
          <log-neighbor-changes/>
        </bgp>
        <neighbor>
          <id>pg_ibgp</id>
          <peer-group/>
          <remote-as>65000</remote-as>
          <next-hop-self/>
          <update-source>
            <Loopback>0</Loopback>
          </update-source>
        </neighbor>
        <neighbor>
          <id>2.2.2.2</id>
          <peer-group>
            <peer-group-name>pg_ibgp</peer-group-name>
          </peer-group>
        </neighbor>
      </bgp>
    </router>
  </native>
</config>
"""

# connect to netconf agent
m = manager.connect(host='172.16.62.152', port=830, username='cisco', password='cisco', hostkey_verify=False, device_params={'name': 'iosxe'})

#response = m.get_config(source='running', filter=payload)
print '###########################################################################'
print '### XML'
print '###########################################################################'
response = m.edit_config(target='running', config=payload).xml
print response

print '###########################################################################'
print '### XML Formatstring'
print '###########################################################################'
data = ET.fromstring(response)
print(ET.tostring(data, pretty_print=True))

print '###########################################################################'
print '### Convert to Dictionary'
print '###########################################################################'
data_dict = xmltodict.parse(response)
print(data_dict)

print '###########################################################################'
print '### Convert to JSON'
print '###########################################################################'
data_jason = json.dumps(data_dict, indent=4)
print(data_jason)

```


##スクリプトを実行した結果

```xml:XML
###########################################################################
### XML
###########################################################################
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:4140da79-2114-4462-8a35-05bb1a716822" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"><ok/></rpc-reply>
```

```xml:XML(Formatstring)
###########################################################################
### XML Formatstring
###########################################################################
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:4140da79-2114-4462-8a35-05bb1a716822">
  <ok/>
</rpc-reply>
```

```python:Dictionary
###########################################################################
### Convert to Dictionary
###########################################################################
OrderedDict([(u'rpc-reply', OrderedDict([(u'@xmlns', u'urn:ietf:params:xml:ns:netconf:base:1.0'), (u'@message-id', u'urn:uuid:4140da79-2114-4462-8a35-05bb1a716822'), (u'@xmlns:nc', u'urn:ietf:params:xml:ns:netconf:base:1.0'), (u'ok', None)]))])
```

```json:JSON
###########################################################################
### Convert to JSON
###########################################################################
{
    "rpc-reply": {
        "@xmlns": "urn:ietf:params:xml:ns:netconf:base:1.0", 
        "@message-id": "urn:uuid:4140da79-2114-4462-8a35-05bb1a716822", 
        "@xmlns:nc": "urn:ietf:params:xml:ns:netconf:base:1.0", 
        "ok": null
    }
}
```