def create_host(): """为了文件, 只好不用json了""" addr = request.form.get('addr', default='') pod_name = request.form.get('pod_name', default='') if not (addr and pod_name): abort(400, 'Need addr and pod_name') pod = Pod.get_by_name(pod_name) if not pod: abort(400, 'No pod found') # 存证书, 没有就算了 if all(k in request.files for k in ['ca', 'cert', 'key']): try: ca, cert, key = request.files['ca'], request.files['cert'], request.files['key'] save_docker_certs(addr.split(':', 1)[0], ca.read(), cert.read(), key.read()) finally: ca.close() cert.close() key.close() try: client = get_docker_client(addr, force_flush=True) info = client.info() except Exception as e: abort(400, 'Docker daemon error on host %s, error: %s' % (addr, e.message)) if not Host.create(pod, addr, info['Name'], info['ID'], info['NCPU'], info['MemTotal']): abort(400, 'Host create error.') return 201, {'r':0, 'msg': consts.OK}
def create_host(): """为了文件, 只好不用json了""" addr = request.form.get('addr', default='') ip = addr.split(':', 1)[0] podname = request.form.get('podname', default='') is_public = request.form.get('is_public', default=False, type=bool) if not (addr and podname): abort(400, 'Bad addr or podname: addr="{}", podname="{}"'.format(addr, podname)) pod = Pod.get_by_name(podname) if not pod: abort(400, 'Pod {} not found'.format(podname)) # 存证书, 没有就算了 certs = ['ca', 'cert', 'key'] if all(k in request.files for k in certs): certs_contents = tuple(request.files[f].read() for f in certs) save_docker_certs(ip, *certs_contents) try: client = get_docker_client(addr, force_flush=True) info = client.info() except Exception as e: abort(400, 'Docker daemon error on host %s, error: %s' % (addr, e.message)) if not Host.create(pod, addr, info['Name'], info['ID'], info['NCPU'], info['MemTotal'], is_public=is_public): abort(400, 'Error while creating host') return 201, DEFAULT_RETURN_VALUE
def create_host(): """为了文件, 只好不用json了""" addr = request.form.get('addr', type=str, default='') pod_name = request.form.get('pod_name', type=str, default='') if not (addr and pod_name): raise EruAbortException(consts.HTTP_BAD_REQUEST, 'need addr and pod_name') pod = Pod.get_by_name(pod_name) if not pod: raise EruAbortException(consts.HTTP_BAD_REQUEST, 'No pod found') # 存证书, 没有就算了 try: ca, cert, key = request.files['ca'], request.files['cert'], request.files['key'] save_docker_certs(addr.split(':', 1)[0], ca.read(), cert.read(), key.read()) finally: ca.close() cert.close() key.close() try: client = get_docker_client(addr, force_flush=True) info = client.info() except Exception: raise EruAbortException(consts.HTTP_BAD_REQUEST, 'Docker daemon error on host %s' % addr) if not Host.create(pod, addr, info['Name'], info['ID'], info['NCPU'], info['MemTotal']): raise EruAbortException(consts.HTTP_BAD_REQUEST) return consts.HTTP_CREATED, {'r':0, 'msg': consts.OK}
def _get_pod(id_or_name): if id_or_name.isdigit(): pod = Pod.get(int(id_or_name)) else: pod = Pod.get_by_name(id_or_name) if not pod: abort(404, 'Pod %s not found' % id_or_name) return pod
def get_pod(id_or_name): if id_or_name.isdigit(): pod = Pod.get(int(id_or_name)) else: pod = Pod.get_by_name(id_or_name) if not pod: raise EruAbortException(consts.HTTP_NOT_FOUND, 'Pod %s not found' % id_or_name) return pod
def list_pod_hosts(id_or_name): if id_or_name.isdigit(): pod = Pod.get(int(id_or_name)) else: pod = Pod.get_by_name(id_or_name) if not pod: raise EruAbortException(consts.HTTP_NOT_FOUND, 'Pod %s not found' % id_or_name) show_all = request.args.get('all', type=bool, default=False) return pod.list_hosts(g.start, g.limit, show_all=show_all)
def assign_pod_to_group(pod_name): data = request.get_json() group = Group.get_by_name(data['group_name']) pod = Pod.get_by_name(pod_name) if not group or not pod: raise EruAbortException(code.HTTP_BAD_REQUEST) if not pod.assigned_to_group(group): raise EruAbortException(code.HTTP_BAD_REQUEST) return {'r':0, 'msg': code.OK}
def group_max_containers(group_name): pod_name = request.args.get('pod_name', type=str, default='') cores_per_container = request.args.get('ncore', type=int, default=1) group = Group.get_by_name(group_name) if not group: raise EruAbortException(code.HTTP_BAD_REQUEST) pod = Pod.get_by_name(pod_name) if not pod: raise EruAbortException(code.HTTP_BAD_REQUEST) return {'r':0, 'msg': code.OK, 'data': group.get_max_containers(pod, cores_per_container)}
def assign_pod_to_group(pod_name): data = request.get_json() group = Group.get_by_name(data['group_name']) pod = Pod.get_by_name(pod_name) if not group or not pod: raise EruAbortException(consts.HTTP_BAD_REQUEST, 'No group/pod found') if not pod.assigned_to_group(group): raise EruAbortException(consts.HTTP_BAD_REQUEST, 'Assign failed') current_app.logger.info('Pod (name=%s) assigned to group (name=%s)', pod_name, data['group_name']) return {'r':0, 'msg': consts.OK}
def test_group_pod(test_db): p1 = Pod.create('pod1', 'pod1') p2 = Pod.create('pod1', 'pod1') assert p1 is not None assert p1.name == 'pod1' assert p2 is None p3 = Pod.get_by_name('pod1') assert p3.id == p1.id assert p3.get_free_public_hosts(10) == [] assert get_max_container_count(p3, 1, 2) == 0 assert centralized_schedule(p3, 1, 1, 2) == {}
def assign_pod_to_group(pod_name): data = request.get_json() group = Group.get_by_name(data['group_name']) pod = Pod.get_by_name(pod_name) if not group or not pod: abort(404, 'No group/pod found') if not pod.assigned_to_group(group): abort(400, 'Assign failed') current_app.logger.info('Pod (name=%s) assigned to group (name=%s)', pod_name, data['group_name']) return {'r':0, 'msg': consts.OK}
def group_max_containers(group_name): pod_name = request.args.get('pod_name', default='') core_require = request.args.get('ncore', type=float, default=1) group = Group.get_by_name(group_name) if not group: abort(400, 'No group found') pod = Pod.get_by_name(pod_name) if not pod: abort(400, 'No pod found') ncore, nshare = pod.get_core_allocation(core_require) return {'r':0, 'msg': consts.OK, 'data': get_max_container_count(group, pod, ncore, nshare)}
def create_host(): data = request.get_json() addr = data['addr'] pod = Pod.get_by_name(data['pod_name']) if not pod: raise EruAbortException(code.HTTP_BAD_REQUEST) client = get_docker_client(addr) info = client.info() if not Host.create(pod, addr, info['Name'], info['ID'], info['NCPU'], info['MemTotal']): raise EruAbortException(code.HTTP_BAD_REQUEST) return {'r':0, 'msg': code.OK}
def group_max_containers(group_name): pod_name = request.args.get('pod_name', type=str, default='') core_require = request.args.get('ncore', type=float, default=1) group = Group.get_by_name(group_name) if not group: raise EruAbortException(consts.HTTP_BAD_REQUEST, 'No group found') pod = Pod.get_by_name(pod_name) if not pod: raise EruAbortException(consts.HTTP_BAD_REQUEST, 'No pod found') core_require = int(core_require * pod.core_share) # 是说一个容器要几个核... ncore = core_require / pod.core_share nshare = core_require % pod.core_share return {'r':0, 'msg': consts.OK, 'data': group.get_max_containers(pod, ncore, nshare)}
def create_host(): data = request.get_json() addr = data['addr'] pod = Pod.get_by_name(data['pod_name']) if not pod: raise EruAbortException(consts.HTTP_BAD_REQUEST, 'No pod found') try: client = get_docker_client(addr) info = client.info() except Exception: raise EruAbortException(consts.HTTP_BAD_REQUEST, 'Docker daemon error on host %s' % addr) if not Host.create(pod, addr, info['Name'], info['ID'], info['NCPU'], info['MemTotal']): raise EruAbortException(consts.HTTP_BAD_REQUEST) return consts.HTTP_CREATED, {'r':0, 'msg': consts.OK}
def validate_instance(group_name, pod_name, appname, version): group = Group.get_by_name(group_name) if not group: abort(400, 'Group `%s` not found' % group_name) pod = Pod.get_by_name(pod_name) if not pod: abort(400, 'Pod `%s` not found' % pod_name) app = App.get_by_name(appname) if not app: abort(400, 'App `%s` not found' % appname) version = app.get_version(version) if not version: abort(400, 'Version `%s` not found' % version) return group, pod, app, version
def validate_instance(group_name, pod_name, appname, version): group = Group.get_by_name(group_name) if not group: raise EruAbortException(code.HTTP_BAD_REQUEST, 'Group `%s` not found' % group_name) pod = Pod.get_by_name(pod_name) if not pod: raise EruAbortException(code.HTTP_BAD_REQUEST, 'Pod `%s` not found' % pod_name) application = App.get_by_name(appname) if not application: raise EruAbortException(code.HTTP_BAD_REQUEST, 'App `%s` not found' % appname) version = application.get_version(version) if not version: raise EruAbortException(code.HTTP_BAD_REQUEST, 'Version `%s` not found' % version) return group, pod, application, version
def test_group_pod(test_db): g1 = Group.create('group1', 'group1') g2 = Group.create('group1', 'group1') assert g1 is not None assert g1.name == 'group1' assert g2 is None p1 = Pod.create('pod1', 'pod1') p2 = Pod.create('pod1', 'pod1') assert p1 is not None assert p1.name == 'pod1' assert p2 is None g3 = Group.get_by_name('group1') assert g3.id == g1.id p3 = Pod.get_by_name('pod1') assert p3.id == p1.id assert p3.assigned_to_group(g3) assert p3.get_free_public_hosts(10) == [] assert g3.get_max_containers(p3, 1, 2) == 0 assert g3.get_free_cores(p3, 1, 1, 2) == {}
def _get_instances(podname, appname, version, **kwargs): pod = Pod.get_by_name(podname) if not pod: abort(400, 'Pod `%s` not found' % podname) app, version = _get_app_and_version(appname, version) return pod, app, version
def _get_pod(id_or_name): pod = Pod.get(id_or_name) or Pod.get_by_name(id_or_name) if not pod: abort(404, 'Pod %s not found' % id_or_name) return pod