RESTCONF - OOP megközelítés

Az eddig bemutatott kódrészletek elég hosszadalmasak, és nem túl szépen újrahasznosíthatóak. Erre akár az OOP is segítséget jelenthet, az alábbi példában az eszközöket és a kéréseket modellezzük, ezekben a lehető legtöbb információt elmentünk, hogy csak egyszer kelljen azokat megadni - például eszközönként a hitelesítő adatok.

from enum import Enum
import requests
import json

requests.packages.urllib3.disable_warnings()

class RequestType(Enum):
    GET = 1
    POST = 2
    PUT = 3

class Config:
    def __init__(self, type: RequestType, url, auth: tuple[str, str], body = None):
        self.type = type
        self.url = url
        self.auth = auth
        self.body = body
        self.headers = {
            "Accept": "application/yang-data+json",
            "Content-Type": "application/yang-data+json"
        }
    def send(self):
        match self.type:
            case RequestType.GET:
                return requests.get(
                    url=self.url,
                    headers=self.headers,
                    auth=self.auth,
                    verify=False
                )
            case RequestType.POST:
                return requests.post(
                    url=self.url,
                    headers=self.headers,
                    data=json.dumps(self.body),
                    auth=self.auth,
                    verify=False
                )
            case RequestType.PUT:
                return requests.put(
                    url=self.url,
                    headers=self.headers,
                    data=json.dumps(self.body),
                    auth=self.auth,
                    verify=False
                )

class Device:
    def __init__(self, baseurl: str, auth: tuple[str, str]):
        self.baseurl = baseurl
        self.auth = auth
    def configure(self, type: RequestType, url, body = None):
        request = Config(type, self.baseurl + url, self.auth, body)
        return request.send()

Nézzük meg, hogyan tudjuk ezt használni:

# Eszköz példányosítása az alap URL-el és a hitelesítő adatokkal
csr1000v = Device("https://192.168.60.130:443/restconf/data", ("test", "test"))

# Hosztnév lekérdezése
hostname = csr1000v.configure(RequestType.GET, "/Cisco-IOS-XE-native:native/hostname")
print(json.dumps(hostname.json(), indent=2))

# IP cím lekérése
ip_address_g2 = csr1000v.configure(RequestType.GET, "/Cisco-IOS-XE-native:native/interface/GigabitEthernet=2/ip/address/primary")
print(json.dumps(ip_address_g2.json(), indent=2))

# Új IP cím módosítása
new_address_body = {
    "primary": {
        "address": "8.8.8.8",
        "mask": "255.255.255.0"
    }
}
new_address_url = "/Cisco-IOS-XE-native:native/interface/GigabitEthernet=2/ip/address/primary"
new_address_g2 = csr1000v.configure(RequestType.PUT, new_address_url, new_address_body)
print(new_address_g2)