Exemplo n.º 1
0
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
Exemplo n.º 2
0
Arquivo: main.py Projeto: yuvalk/kcli
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
Exemplo n.º 3
0
    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'])
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
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)
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
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)
Exemplo n.º 12
0
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
Exemplo n.º 13
0
 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