def setup_template_task(template_id, name, user, ssh_key, cores, memory): with app.app_context(): job = get_current_job() proxmox = connect_proxmox() starrs = connect_starrs() db = connect_db() print("[{}] Retrieving template info for template {}.".format( name, template_id)) template = get_template(db, template_id) print("[{}] Cloning template {}.".format(name, template_id)) job.meta['status'] = 'cloning template' job.save_meta() vmid, mac = clone_vm(proxmox, template_id, name, user) print("[{}] Waiting until Proxmox is done provisioning.".format(name)) job.meta['status'] = 'waiting for Proxmox' job.save_meta() timeout = 20 retry = 0 while retry < timeout: if not VM(vmid).is_provisioned(): retry += 1 time.sleep(3) continue break if retry == timeout: print("[{}] Failed to provision, deleting.".format(name)) job.meta['status'] = 'failed to provision' job.save_meta() delete_vm_task(vmid) return print("[{}] Registering in STARRS.".format(name)) job.meta['status'] = 'registering in STARRS' job.save_meta() ip = get_next_ip(starrs, app.config['STARRS_IP_RANGE']) register_starrs(starrs, name, app.config['STARRS_USER'], mac, ip) get_vm_expire(db, vmid, app.config['VM_EXPIRE_MONTHS']) print("[{}] Setting CPU and memory.".format(name)) job.meta['status'] = 'setting CPU and memory' job.save_meta() vm = VM(vmid) vm.set_cpu(cores) vm.set_mem(memory) print("[{}] Applying cloud-init config.".format(name)) job.meta['status'] = 'applying cloud-init' job.save_meta() vm.set_ci_user(user) vm.set_ci_ssh_key(ssh_key) vm.set_ci_network() print("[{}] Waiting for STARRS to propogate before starting VM.". format(name)) job.meta['status'] = 'waiting for STARRS' job.save_meta() time.sleep(90) print("[{}] Starting VM.".format(name)) job.meta['status'] = 'starting VM' job.save_meta() vm.start() print("[{}] Template successfully provisioned.".format(name)) job.meta['status'] = 'completed' job.save_meta()
def vm_cpu(vmid, cores): user = User(session['userinfo']['preferred_username']) connect_proxmox() if user.rtp or int(vmid) in user.allowed_vms: vm = VM(vmid) cur_cores = vm.cpu if cores >= cur_cores: if vm.qmpstatus == 'running' or vm.qmpstatus == 'paused': usage_check = user.check_usage(cores - cur_cores, 0, 0) else: usage_check = user.check_usage(cores, 0, 0) if usage_check: return usage_check vm.set_cpu(cores) return '', 200 else: return '', 403
def setup_template_task(template_id, name, user, ssh_key, cores, memory): with app.app_context(): job = get_current_job() proxmox = connect_proxmox() if app.config['USE_STARRS']: starrs = connect_starrs() db = connect_db() logging.info('[{}] Retrieving template info for template {}.'.format( name, template_id)) get_template(db, template_id) logging.info('[{}] Cloning template {}.'.format(name, template_id)) set_job_status(job, 'cloning template') vmid = clone_vm(proxmox, template_id, name, user) logging.info( '[{}] Waiting until Proxmox is done provisioning.'.format(name)) set_job_status(job, 'waiting for Proxmox') timeout = 25 retry = 0 while retry < timeout: if not VM(vmid).is_provisioned(): retry += 1 time.sleep(12) continue break if retry == timeout: logging.info('[{}] Failed to provision, deleting.'.format(name)) set_job_status(job, 'failed to provision') delete_vm_task(vmid) return vm = VM(vmid) if app.config['USE_STARRS']: logging.info('[{}] Registering in STARRS.'.format(name)) set_job_status(job, 'registering in STARRS') ip = get_next_ip(starrs, app.config['STARRS_IP_RANGE']) register_starrs(starrs, name, app.config['STARRS_USER'], vm.get_mac(), ip) get_vm_expire(db, vmid, app.config['VM_EXPIRE_MONTHS']) logging.info('[{}] Setting CPU and memory.'.format(name)) set_job_status(job, 'setting CPU and memory') vm.set_cpu(cores) vm.set_mem(memory) logging.info('[{}] Applying cloud-init config.'.format(name)) set_job_status(job, 'applying cloud-init') vm.set_ci_user(user) vm.set_ci_ssh_key(ssh_key) vm.set_ci_network() if app.config['USE_STARRS']: logging.info( '[{}] Waiting for STARRS to propogate before starting VM.'. format(name)) set_job_status(job, 'waiting for STARRS') job.save_meta() time.sleep(90) logging.info('[{}] Starting VM.'.format(name)) set_job_status(job, 'starting VM') job.save_meta() vm.start() logging.info('[{}] Template successfully provisioned.'.format(name)) set_job_status(job, 'completed') job.save_meta()
def setup_template_task(template_id, name, user, password, cores, memory): with app.app_context(): job = get_current_job() proxmox = connect_proxmox() starrs = connect_starrs() db = connect_db() print("[{}] Retrieving template info for template {}.".format( name, template_id)) template = get_template(db, template_id) print("[{}] Cloning template {}.".format(name, template_id)) job.meta['status'] = 'cloning template' job.save_meta() vmid, mac = clone_vm(proxmox, template_id, name, user) print("[{}] Registering in STARRS.".format(name)) job.meta['status'] = 'registering in STARRS' job.save_meta() ip = get_next_ip(starrs, app.config['STARRS_IP_RANGE']) register_starrs(starrs, name, app.config['STARRS_USER'], mac, ip) get_vm_expire(db, vmid, app.config['VM_EXPIRE_MONTHS']) print("[{}] Setting CPU and memory.".format(name)) job.meta['status'] = 'setting CPU and memory' job.save_meta() vm = VM(vmid) vm.set_cpu(cores) vm.set_mem(memory) print( "[{}] Waiting for STARRS to propogate before starting VM.".format( name)) job.meta['status'] = 'waiting for STARRS' job.save_meta() time.sleep(90) print("[{}] Starting VM.".format(name)) job.meta['status'] = 'starting VM' job.save_meta() vm.start() print("[{}] Waiting for VM to start before SSHing.".format(name)) job.meta['status'] = 'waiting for VM to start' job.save_meta() time.sleep(20) print("[{}] Creating SSH session.".format(name)) job.meta['status'] = 'creating SSH session' job.save_meta() client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) retry = 0 while retry < 30: try: client.connect(ip, username=template['username'], password=template['password']) break except: retry += 1 time.sleep(3) print("[{}] Running user creation commands.".format(name)) job.meta['status'] = 'running user creation commands' job.save_meta() stdin, stdout, stderr = client.exec_command("useradd {}".format(user)) exit_status = stdout.channel.recv_exit_status() root_password = gen_password(32) stdin, stdout, stderr = client.exec_command( "echo '{}' | passwd root --stdin".format(root_password)) exit_status = stdout.channel.recv_exit_status() stdin, stdout, stderr = client.exec_command( "echo '{}' | passwd '{}' --stdin".format(password, user)) exit_status = stdout.channel.recv_exit_status() stdin, stdout, stderr = client.exec_command( "passwd -e '{}'".format(user)) exit_status = stdout.channel.recv_exit_status() stdin, stdout, stderr = client.exec_command( "echo '{} ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo".format( user)) exit_status = stdout.channel.recv_exit_status() client.close() print("[{}] Template successfully provisioned.".format(name)) job.meta['status'] = 'completed' job.save_meta()