使用開源 Python API 封裝器與你的集群對話
結(jié)合開放的 API 和 Python 編程語言的力量。
圍繞 API 創(chuàng)建封裝器的開源項(xiàng)目正變得越來越流行。這些項(xiàng)目使開發(fā)人員更容易與 API 交互并在他們的應(yīng)用中使用它們。openshift-python-wrapper
項(xiàng)目是 openshift-restclient-python 的封裝器。最初是一個(gè)幫助我們的團(tuán)隊(duì)使用 OpenShift API 的內(nèi)部包,后來變成了一個(gè)開源項(xiàng)目(Apache 許可證 2.0)。
本文討論了什么是 API 封裝器,為什么它很有用,以及封裝器的一些例子。
為什么要使用 API 封裝器?
API 封裝器是位于應(yīng)用和 API 之間的一層代碼。它通過將一些涉及發(fā)出請求和解析響應(yīng)的復(fù)雜性抽象出來,以簡化 API 訪問過程。封裝器還可以提供 API 本身提供的功能之外的附加功能,例如緩存或錯(cuò)誤處理。
使用 API 封裝器使代碼更加模塊化并且更易于維護(hù)。無需為每個(gè) API 編寫自定義代碼,你可以使用封裝器來提供與 API 交互的一致接口。它可以節(jié)省時(shí)間,避免代碼重復(fù),并減少出錯(cuò)的機(jī)會(huì)。
使用 API 封裝器的另一個(gè)好處是它可以保護(hù)你的代碼免受 API 變化的影響。如果 API 更改了它的接口,你可以更新封裝器代碼而無需修改你的應(yīng)用程序代碼。隨著時(shí)間的推移,這可以減少維護(hù)應(yīng)用程序所需的工作。
安裝
該應(yīng)用位于 PyPi 上,因此使用 pip 命令 安裝 openshift-python-wrapper
:
$ python3 -m pip install openshift-python-wrapper
Python 封裝器
OpenShift REST API 提供對 OpenShift 平臺的許多功能的編程訪問。封裝器提供了一個(gè)簡單直觀的界面,用于使用 openshift-restclient-python
庫與 API 進(jìn)行交互。它標(biāo)準(zhǔn)化了如何使用集群資源,并提供了統(tǒng)一的資源 CRUD(創(chuàng)建、讀取、更新和刪除)流程。它還提供額外的功能,例如需要由用戶實(shí)現(xiàn)的特定于資源的功能。隨著時(shí)間的推移,封裝器使代碼更易于閱讀和維護(hù)。
簡化用法的一個(gè)示例是與容器交互。在容器內(nèi)運(yùn)行命令需要使用 Kubernetes 流、處理錯(cuò)誤等。封裝器處理這一切并提供 簡單直觀的功能。
>>> from ocp_resources.pod import Pod
>>> from ocp_utilities.infra import get_client
>>> client = get_client()
ocp_utilities.infra INFO Trying to get
client via new_client_from_config
>>> pod = Pod(client=client, name="nginx-deployment-7fb96c846b-b48mv", namespace="default")
>>> pod.execute("ls")
ocp_resources Pod INFO Execute ls on
nginx-deployment-7fb96c846b-b48mv (ip-10-0-155-108.ec2.internal)
'bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsrv\nsys\ntmp\nusr\nvar\n'
開發(fā)人員或測試人員可以使用這個(gè)封裝器,我們的團(tuán)隊(duì)在編寫代碼的同時(shí)牢記測試。使用 Python 的上下文管理器可以提供開箱即用的資源創(chuàng)建和刪除,并且可以使用繼承來擴(kuò)展特定場景的功能。Pytest fixtures 可以使用代碼進(jìn)行設(shè)置和拆卸,不留任何遺留物。甚至可以保存資源用于調(diào)試??梢暂p松收集資源清單和日志。
這是上下文管理器的示例:
@pytest.fixture(scope="module")
def namespace():
admin_client = get_client()
with Namespace(client=admin_client, name="test-ns",) as ns:
ns.wait_for_status(status=Namespace.Status.ACTIVE, timeout=240)
yield ns
def test_ns(namespace):
print(namespace.name)
生成器遍歷資源,如下所示:
>>> from ocp_resources.node import Node
>>> from ocp_utilities.infra import get_client
>>> admin_client = get_client()
# This returns a generator
>>> for node in Node.get(dyn_client=admin_client):
print(node.name)
ip-10-0-128-213.ec2.internal
開源社區(qū)的開源代碼
套用一句流行的說法,“如果你熱愛你的代碼,就應(yīng)該讓它自由?!?nbsp;openshift-python-wrapper
項(xiàng)目最初是作為 OpenShift 虛擬化 的實(shí)用模塊。隨著越來越多的項(xiàng)目從代碼中受益,我們決定將這些程序提取到一個(gè)單獨(dú)的倉庫中并將其開源。套用另一句俗語,“如果代碼不回到你這里,那就意味著它從未屬于你。” 一旦這種情況發(fā)生,它就真正成為了開源。