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)