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()
该文章的评论已关闭