def planaction(): """ start/stop/delete plan """ config = Kconfig() if 'name' in request.form: plan = request.form['name'] action = request.form['action'] if action == 'start': result = config.plan(plan, start=True) elif action == 'stop': result = config.plan(plan, stop=True) elif action == 'delete': result = config.plan(plan, delete=True) elif action == 'create': print(request.form) url = request.form['url'] if plan == '': plan = nameutils.get_random_name() result = config.plan(plan, url=url) else: result = "Nothing to do" print(result) response = jsonify(result) print(response) response.status_code = 200 return response else: failure = {'result': 'failure', 'reason': "Invalid Data"} response = jsonify(failure) response.status_code = 400
def planaction(): """ start/stop/delete plan """ config = Kconfig() if 'name' in request.form: plan = request.form['name'] action = request.form['action'] if action not in ['start', 'stop', 'delete', 'create']: result = {'result': 'failure', 'reason': "Invalid Action"} response = jsonify(result) response.status_code = 400 else: if action == 'start': result = config.start_plan(plan) elif action == 'stop': result = config.stop_plan(plan) elif action == 'delete': result = config.delete_plan(plan) elif action == 'create': print(request.form) url = request.form['url'] if plan == '': plan = nameutils.get_random_name() result = config.plan(plan, url=url) response = jsonify(result) response.status_code = 200 else: result = {'result': 'failure', 'reason': "Invalid Data"} response = jsonify(result) response.status_code = 400 return response
def list(self): """ :return: """ vms = [] number = random.randint(1, 10) for i in range(number): name = get_random_name() vms.append(self.info(name)) return sorted(vms, key=lambda x: x['name'])
def container(args): """Create container""" name = args.name profile = args.profile global config k = config.k if name is None: name = nameutils.get_random_name() if profile is None: common.pprint("Missing profile", color='red') os._exit(1) containerprofiles = { k: v for k, v in config.profiles.iteritems() if 'type' in v and v['type'] == 'container' } if profile not in containerprofiles: common.pprint( "profile %s not found. Trying to use the profile as image and default values..." % profile, color='blue') dockerutils.create_container(k, name, profile) else: common.pprint("Deploying vm %s from profile %s..." % (name, profile), color='green') profile = containerprofiles[profile] image = next( (e for e in [profile.get('image'), profile.get('template')] if e is not None), None) if image is None: common.pprint("Missing image in profile %s. Leaving..." % profile, color='red') os._exit(1) cmd = profile.get('cmd', None) ports = profile.get('ports', None) environment = profile.get('environment', None) volumes = next( (e for e in [profile.get('volumes'), profile.get('disks')] if e is not None), None) dockerutils.create_container(k, name, image, nets=None, cmd=cmd, ports=ports, volumes=volumes, environment=environment) common.pprint("container %s created" % (name), color='green') return
def plan(args): """Create/Delete/Stop/Start vms from plan file""" plan = args.plan ansible = args.ansible get = args.get path = args.path autostart = args.autostart noautostart = args.noautostart container = args.container inputfile = args.inputfile topologyfile = args.topologyfile start = args.start stop = args.stop delete = args.delete delay = args.delay use = args.use yes = args.yes scale = args.scale global config if use is not None: rootdir = os.path.expanduser('~/.kcli') if not os.path.exists(rootdir): os.makedirs(rootdir) with open('%s/plan' % rootdir, 'w') as p: p.write('%s\n' % use) return if plan is None: if config.planview: plan = config.currentplan else: plan = nameutils.get_random_name() common.pprint("Using %s as name of the vm" % plan, color='green') if delete and not yes: common.confirm("Are you sure?") config.plan(plan, ansible=ansible, get=get, path=path, autostart=autostart, container=container, noautostart=noautostart, inputfile=inputfile, start=start, stop=stop, delete=delete, delay=delay, topologyfile=topologyfile, scale=scale) return 0
def list(self): vms = [] number = random.randint(1, 10) for i in range(number): name = random.choice(right) state = self.status(name) if state == 'up': ip = random_ip() else: ip = '' source = random.choice(self.templates + ['']) plan = get_random_name() profile = 'kvirt' report = '' vms.append([name, state, ip, source, plan, profile, report]) return sorted(vms)
def info(self, name, vm=None): """ :param name: :param vm: :return: """ cpus = random.choice([1, 2, 4, 8]) memory = random.choice([512, 1024, 2048, 4096, 8192]) state = self.status(name) if state == 'up': ip = random_ip() else: ip = None template = random.choice(self.templates + ['']) plan = get_random_name() profile = 'kvirt' yamlinfo = {'name': name, 'template': template, 'plan': plan, 'profile': profile, 'status': state, 'cpus': cpus, 'memory': memory} if ip is not None: yamlinfo['ip'] = ip disks, nets = [], [] numnets = random.randint(1, 2) numdisks = random.randint(1, 3) for net in range(numnets): device = "eth%s" % net network = random.choice(right) network_type = 'routed' macs = [] for i in range(6): element = random.choice('0123456789abcdef') + random.choice('0123456789abcdef') macs.append(element) mac = ':'.join(macs) nets.append({'device': device, 'mac': mac, 'net': network, 'type': network_type}) for disk in range(numdisks): letter = chr(disk + ord('a')) device = 'vd%s' % letter disksize = random.choice([10, 20, 30, 40, 50]) diskformat = 'file' drivertype = 'qcow2' path = '/var/lib/libvirt/images/%s_%s.img' % (name, disk) disks.append({'device': device, 'size': disksize, 'format': diskformat, 'type': drivertype, 'path': path}) yamlinfo['nets'] = nets yamlinfo['disks'] = disks return yamlinfo
def containeraction(): """ start/stop/delete container """ config = Kconfig() cont = Kcontainerconfig(config).cont k = config.k if 'name' in request.form: name = request.form['name'] action = request.form['action'] if action not in ['start', 'stop', 'delete', 'create']: result = {'result': 'failure', 'reason': "Invalid Action"} response = jsonify(result) response.status_code = 400 else: if action == 'start': result = cont.start_container(name) elif action == 'stop': result = cont.stop_container(name) elif action == 'delete': result = cont.delete_container(name) elif action == 'create' and 'profile' in request.form: profile = [ prof for prof in config.list_containerprofiles() if prof[0] == request.form['profile'] ][0] if name is None: name = nameutils.get_random_name() image, nets, ports, volumes, cmd = profile[1:] result = cont.create_container(k, name=name, image=image, nets=nets, cmds=[cmd], ports=ports, volumes=volumes) result = cont.create_container(name, profile) response = jsonify(result) response.status_code = 200 else: result = {'result': 'failure', 'reason': "Invalid Data"} response = jsonify(result) response.status_code = 400 return response
def planaction(): """ start/stop/delete plan """ config = Kconfig() if 'name' in request.form: plan = request.form['name'] action = request.form['action'] if action == 'start': result = config.plan(plan, start=True) elif action == 'stop': result = config.plan(plan, stop=True) elif action == 'delete': result = config.plan(plan, delete=True) elif action == 'create': url = request.form['url'] planfile = request.form['planfile'] if url.endswith('.yml'): planfile = os.path.basename(url) url = os.path.dirname(url) deploy = request.form['deploy'] if deploy == 'on': deploy = True else: deploy = False if plan == '': plan = nameutils.get_random_name() # path = request.form['path'] result = config.plan(plan, get=url, path=plan, inputfile=planfile) if deploy: result = config.plan(plan, inputfile="%s/%s" % (plan, planfile)) else: result = "Nothing to do" print(result) response = jsonify(result) print(response) response.status_code = 200 return response else: failure = {'result': 'failure', 'reason': "Invalid Data"} response = jsonify(failure) response.status_code = 400
def containeraction(): """ start/stop/delete container """ from kvirt import dockerutils config = Kconfig() k = config.k if 'name' in request.form: name = request.form['name'] action = request.form['action'] if action == 'start': result = dockerutils.start_container(k, name) elif action == 'stop': result = dockerutils.stop_container(k, name) elif action == 'delete': result = dockerutils.delete_container(k, name) elif action == 'create' and 'profile' in request.form: profile = [ prof for prof in config.list_containerprofiles() if prof[0] == request.form['profile'] ][0] if name is None: name = nameutils.get_random_name() image, nets, ports, volumes, cmd = profile[1:] result = dockerutils.create_container(k, name=name, image=image, nets=nets, cmd=cmd, ports=ports, volumes=volumes) result = dockerutils.create_container(k, name, profile) else: result = "Nothing to do" print(result) response = jsonify(result) response.status_code = 200 return response else: failure = {'result': 'failure', 'reason': "Invalid Data"} response.status_code = 400 return jsonify(failure)
def vmaction(): """ start/stop/delete/create vm """ config = Kconfig() k = config.k if 'name' in request.form: name = request.form['name'] action = request.form['action'] if action not in ['start', 'stop', 'delete', 'create']: result = {'result': 'failure', 'reason': "Invalid Action"} response = jsonify(result) response.status_code = 400 else: if action == 'start': result = k.start(name) elif action == 'stop': result = k.stop(name) elif action == 'delete': result = k.delete(name) elif action == 'create' and 'profile' in request.form: profile = request.form['profile'] parameters = {} for p in request.form: if p.startswith('parameters'): value = request.form[p] key = p.replace('parameters[', '').replace(']', '') parameters[key] = value parameters['nets'] = parameters['nets'].split(',') parameters['disks'] = [ int(disk) for disk in parameters['disks'].split(',') ] if name == '': name = nameutils.get_random_name() result = config.create_vm(name, profile, overrides=parameters) response = jsonify(result) response.status_code = 200 else: result = {'result': 'failure', 'reason': "Invalid Data"} response = jsonify(result) response.status_code = 400 return jsonify(result)
def vm(args): """Create vms""" name = args.name profile = args.profile ip1 = args.ip1 ip2 = args.ip2 ip3 = args.ip3 ip4 = args.ip4 global config if name is None: name = nameutils.get_random_name() common.pprint("Using %s as name of the vm" % name, color='green') if profile is None: common.pprint("Missing profile", color='red') os._exit(1) result = config.create_vm(name, profile, ip1=ip1, ip2=ip2, ip3=ip3, ip4=ip4) code = common.handle_response(result, name, element='', action='created') return code
def create_vm(self, request, context): print("Handling create_vm call for:\n%s" % request) config = Kconfig() overrides = ast.literal_eval( request.overrides) if request.overrides != '' else {} profile = request.profile customprofile = ast.literal_eval( request.customprofile) if request.customprofile != '' else {} name = request.name if name == '': name = nameutils.get_random_name() if config.type in ['gcp', 'kubevirt']: name = name.replace('_', '-') if config.type != 'aws': common.pprint("Using %s as name of the vm" % name) if request.image != '': if request.image in config.profiles: common.pprint("Using %s as profile" % request.image) profile = request.image elif profile is not None: if profile.endswith('.yml'): profilefile = profile profile = None if not os.path.exists(profilefile): common.pprint("Missing profile file %s" % profilefile, color='red') result = { 'result': 'failure', 'reason': "Missing profile file %s" % profilefile } response = kcli_pb2.result(**result) return response else: with open(profilefile, 'r') as entries: entries = yaml.safe_load(entries) entrieskeys = list(entries.keys()) if len(entrieskeys) == 1: profile = entrieskeys[0] customprofile = entries[profile] common.pprint("Using data from %s as profile" % profilefile, color='blue') else: common.pprint("Cant' parse %s as profile file" % profilefile, color='red') result = { 'result': 'failure', 'reason': "Missing profile file %s" % profilefile } response = kcli_pb2.result(**result) return response elif overrides: profile = 'kvirt' config.profiles[profile] = {} else: common.pprint( "You need to either provide a profile, an image or some parameters", color='red') result = { 'result': 'failure', 'reason': "You need to either provide a profile, an image or some parameters" } response = kcli_pb2.result(**result) response = kcli_pb2.result(**result) return response if request.vmfiles: for _fil in request.vmfiles: origin = _fil.origin content = _fil.content with open(origin, 'w') as f: f.write(content) if request.ignitionfile != '': with open("%s.ign" % name, 'w') as f: f.write(request.ignitionfile) result = config.create_vm(name, profile, overrides=overrides, customprofile=customprofile) result['vm'] = name response = kcli_pb2.result(**result) return response