class KubernetesApi(object): def __init__(self,filename): self.config = KubeConfig(filename) self.http_client = HTTPClient(self.config) def get_pods(self): """Returns a list of the pod names""" return self._get_components('pods') def get_replication_controllers(self): """Returns a list of the rc names""" return self._get_components('replicationcontrollers') def get_services(self): """Returns a list of the service names""" return self._get_components('services') def start_pod(self, *args, **kwargs): filename = '{}/templates/pod.json'.format(os.path.dirname(__file__)) with open(filename) as f: t = jinja2.Template(f.read()) json_str = t.render( podname=kwargs.get('podname'), containername=kwargs.get('containername'), containerimage=kwargs.get('containerimage'), imagepullpolicy=kwargs.get('imagepullpolicy'), restartpolicy=kwargs.get('restartpolicy'), command=kwargs.get('command') ) json_obj = json.loads(json_str) rsp = self.http_client.post(url='/pods', json=json_obj) if rsp.status_code != 201: raise KubernetesError def start_replicationcontroller(self, *args, **kwargs): filename = '{}/templates/rc.json'.format(os.path.dirname(__file__)) with open(filename) as f: t = jinja2.Template(f.read()) json_str = t.render( rcname=kwargs.get('rcname'), containername=kwargs.get('containername'), containerimage=kwargs.get('containerimage'), label=kwargs.get('label'), replicas=kwargs.get('replicas') ) json_obj = json.loads(json_str) rsp = self.http_client.post(url='/replicationcontrollers', json=json_obj) if rsp.status_code != 201: raise KubernetesError def _get_components(self, component_type): rsp = self.http_client.get(url='/{}'.format(component_type)) if rsp.status_code != 200: raise KubernetesError json_rsp = json.loads(rsp.text) if 'items' in json_rsp: items = [x['metadata']['name'] for x in json_rsp['items']] return items raise KubernetesError
class Service(object): def __init__(self): self.client = HTTPClient(kubeconfig) def create_service(self, name): ports = list() port_22 = {"name": "ssh", "port": 22} port_80 = {"name": "http", "port": 80} port_443 = {"name": "https", "port": 443} ports.append(port_22) ports.append(port_80) ports.append(port_443) #for portNum in range(7000,7010): # port_custom = {"name": portNum, "port": portNum} # ports.append(port_custom) body = dict() body["kind"] = "Service" body["apiVersion"] = "v1" body["metadata"] = {"name": name} body["spec"] = {"selector": {"run": name}, "type": "NodePort"} body["spec"]["ports"] = ports data = json.dumps(body) service = json.loads( self.client.post(url="namespaces/default/services", data=data).content) return service def view_service(self, name): url = "namespaces/{}/services/{}".format("default", name) service = json.loads(self.client.get(url=url).content) return service def delete_service(self, name): service_path = "namespaces/{}/services/{}".format("default", name) body = {"gracePeriodSeconds": 0} data = json.dumps(body) delete_result = json.loads( self.client.delete(url=service_path, data=data).content) return delete_result
class ReplicationController(object): def __init__(self): self.client = HTTPClient(kubeconfig) def create_replication_controller(self, name, replicas): volume_gfs_name = "vol-{}".format(name) host_path_mount = "/mnt/{}".format(name) volumemount = {'name': volume_gfs_name, 'mountPath': '/apps'} volumemounts = [volumemount] container_atom = { 'name': name, 'image': "registry.baijiahulian.com/atom", 'ports': [{ 'containerPort': 22 }], 'imagePullPolicy': 'Always', 'volumeMounts': volumemounts, 'dnsPolicy': 'Default', 'resources': { 'limits': { 'cpu': '500m', 'memory': '2000Mi' }, 'requests': { 'cpu': '10m', 'memory': '512Mi' } } } containers = list() containers.append(container_atom) volume_gfs = { 'name': volume_gfs_name, 'hostPath': { 'path': host_path_mount } } volumes = list() volumes.append(volume_gfs) podtemplatespec = dict() podtemplatespec['metadata'] = {} podtemplatespec['metadata']['name'] = name podtemplatespec['metadata']['labels'] = {"run": name} podtemplatespec['spec'] = {} podtemplatespec['spec']['containers'] = containers podtemplatespec['spec']['volumes'] = volumes body = dict() body["kind"] = "ReplicationController" body["apiVersion"] = "v1" body["metadata"] = {"name": name} body["spec"] = {"replicas": replicas, "template": podtemplatespec} data = json.dumps(body) replicationcontroller = json.loads( self.client.post(url="namespaces/default/replicationcontrollers", data=data).content) return replicationcontroller def delete_replication_controller(self, name): rc_path = "namespaces/{}/replicationcontrollers/{}".format( "default", name) body = {"gracePeriodSeconds": 0} data = json.dumps(body) delete_result = json.loads( self.client.delete(url=rc_path, data=data).content) return delete_result