Python运维开发:Service资源Restful APIs HTTP服务封装
Python运维开发:Service资源Restful APIs HTTP服务封装[4分]
编写Python程序实现Service资源管理程序,将Service资源管理的封装成Web服务。
在/root目录下创建service_server.py程序,实现Service的增删查改等Web访问操作。http.server的host为localhost,端口8888;程序内部实现Kubernetes认证。
提示说明:Python标准库http.server模块,提供了HTTP Server请求封装。
需要实现的Restful API接口如下:
GET /services/{name},查询指定名称{name}的Service;Response的Body以json格式输出。
POST /services/{yamlfilename} 创建yaml文件名称为{yamlfilename}的Service;Response的Body以json格式,(手工将文件服务器主目录所有*.yaml文件下载到root目录下)。
DELETE /services/{name};删除指定名称的Service;Response的Body以json格式。
编码完成后,自己手动执行提供Web HTTP服务的service_server.py程序,提交答案进行检测。
import yaml
from kubernetes import client, config
from http.server import HTTPServer, BaseHTTPRequestHandler
import kubernetes.client.exceptions
# bearer
config.load_kube_config(config_file='kube_config')
conn_core = client.CoreV1Api()
class webclass(BaseHTTPRequestHandler):
def __set_headers(self, content_type):
self.send_response(200)
self.send_header("Content-Type", content_type)
self.end_headers()
def do_GET(self):
self.__set_headers("application/json")
name = self.path[10:]
print(name, self.path)
try:
res = conn_core.read_namespaced_service(name, 'default')
except kubernetes.client.exceptions.ApiException as e:
self.wfile.write(str(e.body).encode(encoding="utf_8"))
else:
self.wfile.write(str(res).encode(encoding="utf_8"))
def do_POST(self):
self.__set_headers("application/json")
name = self.path[10:]
print(name, self.path)
with open(name, encoding='utf-8') as f:
dep = yaml.safe_load(f.read())
service_name = dep['metadata']['name']
try:
conn_core.delete_namespaced_service(service_name, 'default')
except:
pass
res = conn_core.create_namespaced_service('default', dep)
self.wfile.write(str(res).encode(encoding="utf_8"))
def do_DELETE(self):
name = self.path[10:]
self.__set_headers("application/json")
try:
res = conn_core.delete_namespaced_service(name, 'default')
except kubernetes.client.exceptions.ApiException as e:
self.wfile.write(str(e.body).encode(encoding="utf_8"))
else:
self.wfile.write(str(res).encode(encoding="utf_8"))
if __name__ == '__main__':
address = ("0.0.0.0", 8888)
httpd = HTTPServer(address, webclass)
httpd.serve_forever()