def home(self): listx = lxc.listx() # return all containers sorted by status # memory usage is excluded in this as it slows down the homepage # quite a bit, they are retrieved later using AJAX. all_containers = [] for status in ('RUNNING', 'FROZEN', 'STOPPED'): all_containers.append({ 'status': status.lower(), 'containers': [{ 'name': container, 'memory_usage': 0, # I prefer to cache this one day 'settings': get_container_settings(container), 'bucket': get_bucket_token(container) } for container in listx[status]] }) return { 'all_containers': all_containers, 'dist': check_ubuntu(), 'host': socket.gethostname(), 'templates': get_templates_list(), 'storage_repos': self.settings['storage_repos'], 'auth': self.settings['auth.backend'] }
def refresh_memory(self): name = self.request.matchdict['name'] if name == 'containers': containers_running = lxc.running() containers = [] for container in containers_running: container = container.replace(' (auto)', '') containers.append({ 'name': container, 'memory_usage': memory_usage(container), 'settings': get_container_settings(container) }) return containers elif name == 'host': return host_memory_usage() return {'memory_usage': memory_usage(name)}
def edit_container(self): """ edit containers page and actions if form post request """ container = self.request.matchdict['container'] cfg = get_container_settings(container) form = EditContainerForm(self.request.POST, container=container, **strip_empty_fields(cfg)) if self.request.method == 'POST': if form.validate(): # when memory sliders are at maximum, unset them if form.memlimit.data == TOTAL_HOST_MEMORY: form.memlimit.data = '' if form.swlimit.data == TOTAL_HOST_MEMORY * 2: form.swlimit.data = '' for field_name, field in form._fields.items(): # nothing changed, one is None, the other an empty string # this happens with IntegerField + Optional() validator if field.data is None and cfg[field_name] == '': continue # a field has changed, something needs to be saved if field.data != cfg[field_name]: if field_name == 'bucket': machine = Machine.objects.get(name=container) if machine: # update bucket token machine.bucket_token = field.data machine.save() else: # create new record in machine table Machine.objects.create(name=container, bucket_token=field.data) self.session.flash('Bucket config for {} saved'.format(container), queue='success') else: # convert to lxc config values if field_name == 'flags': value = 'up' if field.data else 'down' elif field_name == 'start_auto': value = '1' if form.start_auto.data else '0' else: value = field.data push_config_value(CGROUP_EXT[field_name][0], value, container=container) self.session.flash(CGROUP_EXT[field_name][1], queue='success') # re-read container configuration now to be coherent cfg = get_container_settings(container) form = EditContainerForm(container=container, **strip_empty_fields(cfg)) info = lxc.info(container) return { 'form': form, 'container': container, 'infos': { 'status': info['state'], 'pid': info['pid'], 'memory_usage': memory_usage(container) }, 'settings': cfg, 'host_memory': TOTAL_HOST_MEMORY, 'storage_repos': self.settings['storage_repos'] }