def recreate_cont(parameters): try: cont_id = parameters['cont_id'] logger.debug("In recreate_container() function...") cont_details = current.db.container_data[cont_id] container = Container(cont_details.UUID,setProp=False) container.remove() # mount_hostvolumes = '/root/user/'+ cont_details.owner_id.username +'/'+cont_details.name memory = str(cont_details.RAM)+'M' ret = install_container( cont_details.name, cont_details.image_id, cont_details.env_vars, cont_details.vCPU, memory, True) logger.debug(ret) message = ("Container %s re-created successfully." % cont_details.name) cont_details.update_record(UUID=ret['Id'], status=current.VM_STATUS_RUNNING) return (current.TASK_QUEUE_STATUS_SUCCESS, message) except: logger.debug("Task Status: FAILED Error: %s " % log_exception()) return (current.TASK_QUEUE_STATUS_FAILED, log_exception())
def get_container_archive_wd(cont_id): cont_info = db.container_data[cont_id] if not cont_info : return None container = Container(cont_info.UUID); return container.get_archive(container.properties['WorkingDir'])
def get_container_archive(cont_id,file_path): cont_info = db.container_data[cont_id] if not cont_info : return None container = Container(cont_info.UUID,setProp=False); return container.get_archive(file_path)
def get_container_logs(cont_id): cont_info = db.container_data[cont_id] if not cont_info : return container = Container(cont_info.UUID,setProp=False); return container.logs()
def get_container_logs(cont_id): cont_info = db.container_data[cont_id] if not cont_info: return container = Container(cont_info.UUID) return container.logs()
def install_container(name, templateid, env, cpushare, memory, portmap=False, setnginx=True): imageprofile = getImageProfile(templateid) nodes = get_node_to_deploy() nodeindex = get_node_pack(nodes, memory, 1) port = imageprofile['port'] if (port): portmap = True if (not env): env = { 'constraint:node=': nodes[nodeindex]['Name'] } else: env['constraint:node='] = nodes[nodeindex]['Name'] env['TERM'] = 'xterm' if (imageprofile['updatemysql']): extrahosts = {'mysql': config.get("DOCKER_CONF", "mysql_machine")} else: extrahosts = None hostconfig = client.create_host_config( publish_all_ports=portmap, mem_limit=memory, cap_drop=imageprofile['permissiondrop'], cap_add=imageprofile['permissionadd'], links=imageprofile['links'], extra_hosts=extrahosts) try: containerid = client.create_container(name=name, image=imageprofile['Id'], command=imageprofile['cmd'], environment=env, detach=True, cpu_shares=cpushare, host_config=hostconfig) except docker.errors as e: print(e) return # Update the db -- container in created state..... try: response = client.start(container=containerid['Id']) # @UnusedVariable # Update the db -- container in running state except docker.errors as e: print(e) if (port and setnginx): container = Container(containerid) container.addipbyconf() return containerid
def backup_cont(parameters): try: cont_id = parameters['cont_id'] logger.debug("In backup_container() function...") cont_details = current.db.container_data[cont_id] container = Container(cont_details.UUID) container.backup(cont_details.owner_id.username) message = "Container commited successfully." return (current.TASK_QUEUE_STATUS_SUCCESS, message) except: logger.debug("Task Status: FAILED Error: %s " % log_exception()) return (current.TASK_QUEUE_STATUS_FAILED, log_exception())
def get_cont_config(cont_id): """ Fetches VM information for the given ID. Creates a map of parameters and corresponding display strings @param vm_id: VM ID @type vm_id: C{int} @return: Map of vm parameters an its display values. @rtype: C{map} """ cont_info = db.container_data[cont_id] if not cont_info : return container = Container(cont_info.UUID); container.updatedetails() logger.debug("IN get_cont_config") if container: cont_details = container.properties logger.debug(cont_details) cont_created = cont_details['Created'] #(datetime.datetime.fromtimestamp(cont_details1['Created'])).strftime('%A %d, %b %Y %H:%M') cont_command = cont_details['Cmd'] cont_ports = cont_details['Ports'] if cont_details['Ports'] else {} cont_status = cont_details['State'] cont_env = cont_details['Environment'] exec_ids = cont_details['ExecIDs'] else: cont_created = "-" cont_command = "-" cont_ports = [{u'IP': u'0.0.0.0', u'Type': u'', u'PublicPort': 0, u'PrivatePort': 0}] cont_status = "Invalid" cont_env = cont_info.env_vars cont_info_map = {'id' : cont_info.id, 'name' : cont_info.name, 'RAM' : str(round((cont_info.RAM/1024.0),2)) + ' GB', 'vcpus' : str(cont_info.vCPU) + ' CPU', 'env_vars' : cont_env , 'template' : str(cont_info.image_profile) , 'restart_policy' : str(cont_info.restart_policy) , 'owner' : cont_info.owner_id.first_name + ' ' + cont_info.owner_id.last_name if cont_info.owner_id > 0 else 'System User', 'purpose' : '-' if cont_info.purpose == '' else cont_info.purpose, 'uuid' : cont_info.UUID, 'created' : cont_created, 'command' : cont_command, 'ports' : cont_ports, 'status' : cont_status, 'ExecIds' : exec_ids} return cont_info_map
def resume_cont(parameters): try: cont_id = parameters['cont_id'] logger.debug("In resume_container() function...") cont_details = current.db.container_data[cont_id] container = Container(cont_details.UUID,setProp=False) container.resume() cont_details.update_record(status=current.VM_STATUS_RUNNING) message = "Container resumed successfully." return (current.TASK_QUEUE_STATUS_SUCCESS, message) except: logger.debug("Task Status: FAILED Error: %s " % log_exception()) return (current.TASK_QUEUE_STATUS_FAILED, log_exception())
def delete_cont(parameters): try: cont_id = parameters['cont_id'] logger.debug("In delete_container() function...") cont_details = current.db.container_data[cont_id] container = Container(cont_details.UUID) container.remove() del current.db.container_data[cont_id] message = "Container deleted successfully." return (current.TASK_QUEUE_STATUS_SUCCESS, message) except: logger.debug("Task Status: FAILED Error: %s " % log_exception()) return (current.TASK_QUEUE_STATUS_FAILED, log_exception())
def suspend_cont(parameters): try: cont_id = parameters['cont_id'] logger.debug("In suspend_container() function...") cont_details = current.db.container_data[cont_id] container = Container(cont_details.UUID) container.pause() cont_details.update_record(status=current.VM_STATUS_SUSPENDED) message = "Container suspended successfully." return (current.TASK_QUEUE_STATUS_SUCCESS, message) except: logger.debug("Task Status: FAILED Error: %s " % log_exception()) return (current.TASK_QUEUE_STATUS_FAILED, log_exception())
def install_container(name,templateid,env,cpushare,memory,portmap=False,setnginx=True,restart_policy='no'): imageprofile = getImageProfile(templateid) nodes = get_node_to_deploy() nodeindex = get_node_pack(nodes,memory,1) port = imageprofile['port'] if (port): portmap = True if(not env): env = {'constraint:node=':nodes[nodeindex]['Name']} else: env['constraint:node='] =nodes[nodeindex]['Name'] env['TERM'] = 'xterm' if(imageprofile['updatemysql'] ): extrahosts = {'mysql':config.get("DOCKER_CONF","mysql_machine_ip")} else : extrahosts = None ulimits=[] import docker.utils ulimits.append(docker.utils.Ulimit(Name='NPROC',Soft=500,Hard=1000)) ulimits.append(docker.utils.Ulimit(Name='NOFILE',Soft=4000,Hard=8000)) hostconfig = client.create_host_config(publish_all_ports = portmap,mem_limit = memory,cap_drop=imageprofile['permissiondrop'],cap_add=imageprofile['permissionadd'],links = imageprofile['links'],extra_hosts=extrahosts,restart_policy={'Name':restart_policy,'MaximumRetryCount':5},ulimits=ulimits) try: containerid = client.create_container(name=name,image = imageprofile['Id'] , command = imageprofile['cmd'], environment = env , detach = True ,cpu_shares=cpushare, host_config = hostconfig ) except docker.errors as e: print (e) return # Update the db -- container in created state..... try: response = client.start(container = containerid['Id']) # @UnusedVariable # Update the db -- container in running state except Exception as e: logger.debug(e) if( port and setnginx) : container = Container(containerid) container.addipbyconf() return containerid
def add_orphan_cont(cont_uuid): container = Container(cont_uuid) print("In add_orphan_cont") if container: container.updatedetails() cont_details = container.properties logger.debug(cont_details) image_details = getImage(cont_details['ImageName']) db.container_data.insert( name=cont_details['Name'][1:], RAM=int(int(cont_details['Memory']) / 1024 / 1024), vCPU=1, UUID=cont_uuid, image_id=image_details['templateid'], image_profile=image_details['type'], restart_policy=None, requester_id=SYSTEM_USER, owner_id=SYSTEM_USER, purpose='Added by System', status=cont_state_to_status(cont_details['State'])) return
def get_container_upload_data(cont_uuid,file_path,file_data): container = Container(cont_uuid,setProp=False); return container.upload(file_path,file_data);
def get_container_stats(cont_uuid): container = Container(cont_uuid,setProp=False); return container.stats()
def delete_orphan_cont(cont_uuid): container = Container(cont_uuid) container.remove() return
def garbage_collector(): #Delete volumes no longer necessary nginx_server = get_nginx_server_address() vollist = client.volumes(filters={'dangling': True}) volarray = vollist.get('Volumes') print(vollist['Volumes']) if volarray: for volume in vollist['Volumes']: try: client.remove_volume(name=volume['Name']) except Exception as e: print(e) #Delete remaining nginx conf conlist = client.containers(all=True) namelist = ['default'] for container in conlist: namelist.append(container['Names'][0].split("/")[2]) #~ namelist.append(container['Names'][0].split("/")[1]); print(namelist) cmd = "ls /etc/nginx/conf.d/" output = remote_machine.execute_remote_cmd(nginx_server[0], nginx_server[1], cmd, nginx_server[2]) strlist = output.split("\n") print(strlist) todellist = [] for i in range(0, len(strlist) - 1): name = strlist[i].split(".")[0] if not name in namelist: todellist.append(name) print(todellist) for name in todellist: cmd = "rm -f /etc/nginx/conf.d/" + name + ".conf" output = remote_machine.execute_remote_cmd(nginx_server[0], nginx_server[1], cmd, nginx_server[2]) #Delete any mysql database whose app is missing datalist = ['information_schema', 'sys', 'mysql', 'performance_schema'] datalist.append(namelist) cmd = """bash -c "mypassword='******' /var/lib/mysql/mysql.sh -l" """ container = Container('f966820cf4a0') output = container.execcmd(cmd) strlist = output.split("\n") print(strlist) for i in range(3, len(strlist) - 1): name = strlist[i].split(".")[0] if not name in datalist: todellist.append(name) print(todellist) for name in todellist: cmd = """bash -c "mypassword='******' /var/lib/mysql/mysql.sh -r """ + name + ' " ' print(cmd) container.execcmd(cmd) container = 'None' #Delete any containers not in database print('not implemented')
def get_container_execsession(cont_uuid): container = Container(cont_uuid,setProp=False); return container.execidgenerator()
def get_container_execresize(cont_uuid,cont_session,height,width): container = Container(cont_uuid,setProp=False); container.execresize(cont_session,height,width);
def get_container_top(cont_id,pid_args='aux'): cont_info = db.container_data[cont_id] if not cont_info : return container = Container(cont_info.UUID,setProp=False); return container.top(pid_args)
def get_container_stats(cont_uuid): container = Container(cont_uuid) return container.stats()