Skip to content

Commit

Permalink
Kube: web (#200)
Browse files Browse the repository at this point in the history
* kube support in web

* list kube

* web: list kube

* web: create kube

* web: clean menus

* web: cleaner handling of actions
  • Loading branch information
karmab committed May 11, 2020
1 parent 26e3641 commit 899f27c
Show file tree
Hide file tree
Showing 22 changed files with 566 additions and 310 deletions.
15 changes: 14 additions & 1 deletion kvirt/aws/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ def create(self, name, virttype=None, profile='', flavor=None, plan='kvirt', cpu
cmds=[], ips=None, netmasks=None, gateway=None, nested=True, dns=None, domain=None, tunnel=False,
files=[], enableroot=True, alias=[], overrides={}, tags=[], dnsclient=None, storemetadata=False,
sharedfolders=[], kernel=None, initrd=None, cmdline=None, placement=[], autostart=False,
cpuhotplug=False, memoryhotplug=False, numamode=None, numa=[], pcidevices=[], tpm=False, rng=False):
cpuhotplug=False, memoryhotplug=False, numamode=None, numa=[], pcidevices=[], tpm=False, rng=False,
kube=None, kubetype=None):
conn = self.conn
if self.exists(name):
return {'result': 'failure', 'reason': "VM %s already exists" % name}
Expand All @@ -97,6 +98,9 @@ def create(self, name, virttype=None, profile='', flavor=None, plan='kvirt', cpu
vmtags = [{'ResourceType': 'instance',
'Tags': [{'Key': 'Name', 'Value': name}, {'Key': 'plan', 'Value': plan},
{'Key': 'hostname', 'Value': name}, {'Key': 'profile', 'Value': profile}]}]
if kube is not None and kubetype is not None:
vmtags[0]['Tags'].append({'Key': 'kube', 'Value': kube})
vmtags[0]['Tags'].append({'Key': 'kubetype', 'Value': kubetype})
if keypair is None:
keypair = 'kvirt_%s' % self.access_key_id
keypairs = [k for k in conn.describe_key_pairs()['KeyPairs'] if k['KeyName'] == keypair]
Expand Down Expand Up @@ -360,12 +364,18 @@ def info(self, name, vm=None, debug=False):
image = resource.Image(amid)
source = os.path.basename(image.image_location)
plan = ''
kube = None
kubetype = None
profile = ''
loadbalancer = None
if 'Tags' in vm:
for tag in vm['Tags']:
if tag['Key'] == 'plan':
plan = tag['Value']
if tag['Key'] == 'kube':
kube = tag['Value']
if tag['Key'] == 'kubetype':
kubetype = tag['Value']
if tag['Key'] == 'profile':
profile = tag['Value']
if tag['Key'] == 'Name':
Expand All @@ -374,6 +384,9 @@ def info(self, name, vm=None, debug=False):
loadbalancer = tag['Value']
if loadbalancer is not None:
yamlinfo['loadbalancer'] = loadbalancer
if kube is not None and kubetype is not None:
yamlinfo['kube'] = kube
yamlinfo['kubetype'] = kubetype
yamlinfo['name'] = name
yamlinfo['status'] = state
yamlinfo['az'] = az
Expand Down
21 changes: 6 additions & 15 deletions kvirt/baseconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@
from kvirt.defaults import (NETS, POOL, CPUMODEL, NUMCPUS, MEMORY, DISKS,
DISKSIZE, DISKINTERFACE, DISKTHIN, GUESTID,
VNC, CLOUDINIT, RESERVEIP, RESERVEDNS, RESERVEHOST,
START, AUTOSTART, NESTED, TUNNEL, TUNNELHOST, TUNNELPORT, TUNNELUSER, REPORTURL, REPORTDIR,
REPORT, REPORTALL, INSECURE, KEYS, CMDS, DNS,
DOMAIN, SCRIPTS, FILES, ISO,
START, AUTOSTART, NESTED, TUNNEL, TUNNELHOST, TUNNELPORT, TUNNELUSER,
INSECURE, KEYS, CMDS, DNS, DOMAIN, SCRIPTS, FILES, ISO,
NETMASKS, GATEWAY, SHAREDKEY, IMAGE, ENABLEROOT,
PLANVIEW, PRIVATEKEY, TAGS, RHNREGISTER, RHNUSER, RHNPASSWORD, RHNAK, RHNORG, RHNPOOL,
RHNWAIT, FLAVOR, KEEP_NETWORKS, DNSCLIENT, STORE_METADATA, NOTIFY, PUSHBULLETTOKEN,
Expand Down Expand Up @@ -119,10 +118,6 @@ def __init__(self, client=None, containerclient=None, debug=False, quiet=False):
defaults['tunnelport'] = default.get('tunnelport', TUNNELPORT)
defaults['tunneluser'] = default.get('tunneluser', TUNNELUSER)
defaults['insecure'] = bool(default.get('insecure', INSECURE))
defaults['reporturl'] = default.get('reporturl', REPORTURL)
defaults['reportdir'] = default.get('reportdir', REPORTDIR)
defaults['report'] = bool(default.get('report', REPORT))
defaults['reportall'] = bool(default.get('reportall', REPORTALL))
defaults['keys'] = default.get('keys', KEYS)
defaults['cmds'] = default.get('cmds', CMDS)
defaults['dns'] = default.get('dns', DNS)
Expand Down Expand Up @@ -238,10 +233,6 @@ def __init__(self, client=None, containerclient=None, debug=False, quiet=False):
self.tunnelport = options.get('tunnelport', self.default['tunnelport'])
self.tunneluser = options.get('tunneluser', self.default['tunneluser'])
self.insecure = bool(options.get('insecure', self.default['insecure']))
self.report = options.get('report', self.default['report'])
self.reporturl = options.get('reporturl', self.default['reportdir'])
self.reportdir = options.get('reportdir', self.default['reportdir'])
self.reportall = options.get('reportall', self.default['reportall'])
self.nets = options.get('nets', self.default['nets'])
self.cpumodel = options.get('cpumodel', self.default['cpumodel'])
self.cpuflags = options.get('cpuflags', CPUFLAGS)
Expand Down Expand Up @@ -956,12 +947,12 @@ def create_pipeline(self, inputfile, overrides={}, kube=False):
_type=_type)
return jenkinsfile

def info_kube_generic(self, quiet):
def info_kube_generic(self, quiet, web=False):
plandir = os.path.dirname(kubeadm.create.__code__.co_filename)
inputfile = '%s/masters.yml' % plandir
self.info_plan(inputfile, quiet=quiet)
return self.info_plan(inputfile, quiet=quiet, web=web)

def info_kube_openshift(self, quiet):
def info_kube_openshift(self, quiet, web=False):
plandir = os.path.dirname(openshift.create.__code__.co_filename)
inputfile = '%s/masters.yml' % plandir
self.info_plan(inputfile, quiet=quiet)
return self.info_plan(inputfile, quiet=quiet, web=web)
50 changes: 38 additions & 12 deletions kvirt/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,12 +399,10 @@ def list_vm(args):
config = Kconfig(client=args.client, debug=args.debug, region=args.region, zone=args.zone, namespace=args.namespace)
if config.client != 'all':
k = config.k
customcolumns = {'kubevirt': 'Namespace', 'aws': 'InstanceId', 'openstack': 'Project'}
customcolumn = customcolumns[config.type] if config.type in customcolumns else 'Report'
if config.extraclients:
allclients = config.extraclients.copy()
allclients.update({config.client: config.k})
vms = PrettyTable(["Name", "Host", "Status", "Ips", "Source", "Plan", "Profile", customcolumn])
vms = PrettyTable(["Name", "Host", "Status", "Ips", "Source", "Plan", "Profile"])
for cli in sorted(allclients):
for vm in allclients[cli].list():
name = vm.get('name')
Expand All @@ -413,25 +411,23 @@ def list_vm(args):
source = vm.get('image', '')
plan = vm.get('plan', '')
profile = vm.get('profile', '')
report = vm.get('report', '')
vminfo = [name, cli, status, ip, source, plan, profile, report]
vminfo = [name, cli, status, ip, source, plan, profile]
if filters:
if status == filters:
vms.add_row(vminfo)
else:
vms.add_row(vminfo)
print(vms)
else:
vms = PrettyTable(["Name", "Status", "Ips", "Source", "Plan", "Profile", customcolumn])
vms = PrettyTable(["Name", "Status", "Ips", "Source", "Plan", "Profile"])
for vm in k.list():
name = vm.get('name')
status = vm.get('status')
ip = vm.get('ip', '')
source = vm.get('image', '')
plan = vm.get('plan', '')
profile = vm.get('profile', '')
report = vm.get('report', '')
vminfo = [name, status, ip, source, plan, profile, report]
vminfo = [name, status, ip, source, plan, profile]
if config.planview and vm[4] != config.currentplan:
continue
if filters:
Expand Down Expand Up @@ -673,7 +669,7 @@ def list_plan(args):
"""List plans"""
config = Kconfig(client=args.client, debug=args.debug, region=args.region, zone=args.zone, namespace=args.namespace)
if config.extraclients:
plans = PrettyTable(["Name", "Host", "Vms"])
plans = PrettyTable(["Plan", "Host", "Vms"])
allclients = config.extraclients.copy()
allclients.update({config.client: config.k})
for cli in sorted(allclients):
Expand All @@ -684,7 +680,7 @@ def list_plan(args):
planvms = plan[1]
plans.add_row([planname, cli, planvms])
else:
plans = PrettyTable(["Name", "Vms"])
plans = PrettyTable(["Plan", "Vms"])
for plan in config.list_plans():
planname = plan[0]
planvms = plan[1]
Expand All @@ -693,6 +689,34 @@ def list_plan(args):
return


def list_kube(args):
"""List kube"""
config = Kconfig(client=args.client, debug=args.debug, region=args.region, zone=args.zone, namespace=args.namespace)
if config.extraclients:
kubestable = PrettyTable(["Cluster", "Type", "Host", "Vms"])
allclients = config.extraclients.copy()
allclients.update({config.client: config.k})
for cli in sorted(allclients):
currentconfig = Kconfig(client=cli, debug=args.debug, region=args.region, zone=args.zone,
namespace=args.namespace)
kubes = currentconfig.list_kubes()
for kubename in kubes:
kube = kubes[kubename]
kubetype = kube['type']
kubevms = kube['vms']
kubestable.add_row([kubename, kubetype, cli, kubevms])
else:
kubestable = PrettyTable(["Cluster", "Type", "Vms"])
kubes = config.list_kubes()
for kubename in kubes:
kube = kubes[kubename]
kubetype = kube['type']
kubevms = kube['vms']
kubestable.add_row([kubename, kubetype, kubevms])
print(kubestable)
return


def list_pool(args):
"""List pools"""
short = args.short
Expand Down Expand Up @@ -1327,14 +1351,12 @@ def info_generic_kube(args):
"""Info Generic kube"""
baseconfig = Kbaseconfig(client=args.client, debug=args.debug)
baseconfig.info_kube_generic(quiet=True)
return 0


def info_openshift_kube(args):
"""Info Openshift kube"""
baseconfig = Kbaseconfig(client=args.client, debug=args.debug)
baseconfig.info_kube_openshift(quiet=True)
return 0


def download_plan(args):
Expand Down Expand Up @@ -2316,6 +2338,10 @@ def cli():
help=kubeopenshiftinfo_desc)
kubeopenshiftinfo_parser.set_defaults(func=info_openshift_kube)

kubelist_desc = 'List Kube'
kubelist_parser = list_subparsers.add_parser('kube', description=kubelist_desc, help=kubelist_desc)
kubelist_parser.set_defaults(func=list_kube)

kubescale_desc = 'Scale Kube'
kubescale_parser = scale_subparsers.add_parser('kube', description=kubescale_desc, help=kubescale_desc)
kubescale_subparsers = kubescale_parser.add_subparsers(metavar='', dest='subcommand_scale_kube')
Expand Down
49 changes: 23 additions & 26 deletions kvirt/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@ def create_vm(self, name, profile, overrides={}, customprofile={}, k=None,
common.pprint("Incorrect parameter %s. Hyphens are not allowed" % wrong_override, color='red')
os._exit(1)
overrides['name'] = name
kube = overrides.get('kube')
kubetype = overrides.get('kubetype')
k = self.k if k is None else k
tunnel = self.tunnel
if profile is None:
Expand Down Expand Up @@ -283,8 +285,6 @@ def create_vm(self, name, profile, overrides={}, customprofile={}, k=None,
default_reserveip = father.get('reserveip', self.reserveip)
default_start = father.get('start', self.start)
default_autostart = father.get('autostart', self.autostart)
default_report = father.get('report', self.report)
default_reportall = father.get('reportall', self.reportall)
default_keys = father.get('keys', self.keys)
default_netmasks = father.get('netmasks', self.netmasks)
default_gateway = father.get('gateway', self.gateway)
Expand Down Expand Up @@ -359,8 +359,6 @@ def create_vm(self, name, profile, overrides={}, customprofile={}, k=None,
default_reserveip = self.reserveip
default_start = self.start
default_autostart = self.autostart
default_report = self.report
default_reportall = self.reportall
default_keys = self.keys
default_netmasks = self.netmasks
default_gateway = self.gateway
Expand Down Expand Up @@ -435,8 +433,6 @@ def create_vm(self, name, profile, overrides={}, customprofile={}, k=None,
nested = profile.get('nested', default_nested)
start = profile.get('start', default_start)
autostart = profile.get('autostart', default_autostart)
report = profile.get('report', default_report)
reportall = profile.get('reportall', default_reportall)
keys = profile.get('keys', default_keys)
cmds = common.remove_duplicates(default_cmds + profile.get('cmds', []))
netmasks = profile.get('netmasks', default_netmasks)
Expand Down Expand Up @@ -578,25 +574,6 @@ def create_vm(self, name, profile, overrides={}, customprofile={}, k=None,
else:
rhncommands = []
cmds = rhncommands + cmds + scriptcmds
if reportall:
reportcmd = 'curl -s -X POST -d "name=%s&status=Running&report=`cat /var/log/cloud-init.log`" %s/report '
'>/dev/null' % (name, self.reporturl)
finishcmd = 'curl -s -X POST -d "name=%s&status=OK&report=`cat /var/log/cloud-init.log`" %s/report '
'>/dev/null' % (name, self.reporturl)
if not cmds:
cmds = [finishcmd]
else:
results = []
for cmd in cmds[:-1]:
results.append(cmd)
results.append(reportcmd)
results.append(cmds[-1])
results.append(finishcmd)
cmds = results
elif report:
reportcmd = ['curl -s -X POST -d "name=%s&status=OK&report=`cat /var/log/cloud-init.log`" %s/report '
'/dev/null' % (name, self.reporturl)]
cmds = cmds + reportcmd
if notify:
if notifycmd is None and notifyscript is None:
if 'cos' in image:
Expand Down Expand Up @@ -734,7 +711,7 @@ def create_vm(self, name, profile, overrides={}, customprofile={}, k=None,
overrides=overrides, tags=tags, dnsclient=dnsclient, storemetadata=storemetadata,
sharedfolders=sharedfolders, kernel=kernel, initrd=initrd, cmdline=cmdline,
placement=placement, autostart=autostart, cpuhotplug=cpuhotplug, memoryhotplug=memoryhotplug,
pcidevices=pcidevices, tpm=tpm, rng=rng)
pcidevices=pcidevices, tpm=tpm, rng=rng, kube=kube, kubetype=kubetype)
if result['result'] != 'success':
return result
if dnsclient is not None and domain is not None:
Expand Down Expand Up @@ -800,6 +777,26 @@ def list_plans(self):
results.append([plan, ','.join(plans[plan])])
return results

def list_kubes(self):
"""
:return:
"""
k = self.k
kubes = {}
for vm in k.list():
if 'kube' in vm and 'kubetype' in vm:
vmname = vm['name']
kube = vm['kube']
kubetype = vm['kubetype']
if kube not in kubes:
kubes[kube] = {'type': kubetype, 'vms': [vmname]}
else:
kubes[kube]['vms'].append(vmname)
for kube in kubes:
kubes[kube]['vms'] = ','.join(kubes[kube]['vms'])
return kubes

def create_product(self, name, repo=None, group=None, plan=None, latest=False, overrides={}):
"""Create product"""
if repo is not None and group is not None:
Expand Down
4 changes: 0 additions & 4 deletions kvirt/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@

IMAGESCOMMANDS = {'debian8': 'echo datasource_list: [NoCloud, ConfigDrive, Openstack, Ec2] > /etc/cloud/cloud.cfg.d/'
'90_dpkg.cfg'}
REPORT = False
REPORTALL = False
REPORTURL = "http://127.0.0.1:9000"
REPORTDIR = "/tmp/static/reports"
INSECURE = True
KEYS = []
CMDS = []
Expand Down
13 changes: 11 additions & 2 deletions kvirt/gcp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ def create(self, name, virttype=None, profile='', flavor=None, plan='kvirt', cpu
cmds=[], ips=None, netmasks=None, gateway=None, nested=True, dns=None, domain=None, tunnel=False,
files=[], enableroot=True, alias=[], overrides={}, tags=[], dnsclient=None, storemetadata=False,
sharedfolders=[], kernel=None, initrd=None, cmdline=None, placement=[], autostart=False,
cpuhotplug=False, memoryhotplug=False, numamode=None, numa=[], pcidevices=[], tpm=False, rng=False):
cpuhotplug=False, memoryhotplug=False, numamode=None, numa=[], pcidevices=[], tpm=False, rng=False,
kube=None, kubetype=None):
conn = self.conn
project = self.project
zone = self.zone
Expand Down Expand Up @@ -293,7 +294,11 @@ def create(self, name, virttype=None, profile='', flavor=None, plan='kvirt', cpu
if reservedns:
newval = {'key': 'domain', 'value': domain}
body['metadata']['items'].append(newval)
# body['hostname'] = "%s.%s" % (name, domain)
if kube is not None and kubetype is not None:
newval = {'key': 'kube', 'value': kube}
body['metadata']['items'].append(newval)
newval = {'key': 'kubetype', 'value': kubetype}
body['metadata']['items'].append(newval)
if image is not None and common.needs_ignition(image):
version = common.ignition_version(image)
userdata = common.ignition(name=name, keys=keys, cmds=cmds, nets=nets, gateway=gateway, dns=dns,
Expand Down Expand Up @@ -520,6 +525,10 @@ def info(self, name, vm=None, debug=False):
yamlinfo['profile'] = data['value']
if data['key'] == 'loadbalancer':
yamlinfo['loadbalancer'] = data['value']
if data['key'] == 'kube':
yamlinfo['kube'] = data['value']
if data['key'] == 'kubetype':
yamlinfo['kubetype'] = data['value']
if 'tags' in vm and 'items' in vm['tags']:
yamlinfo['tags'] = ','.join(vm['tags']['items'])
return yamlinfo
Expand Down
2 changes: 1 addition & 1 deletion kvirt/kubeadm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def scale(config, plandir, cluster, overrides):


def create(config, plandir, cluster, overrides):
data = {'cluster': cluster}
data = {'cluster': cluster, 'kubetype': 'generic', 'kube': cluster}
data.update(overrides)
masters = data.get('masters', 1)
if masters == 0:
Expand Down

0 comments on commit 899f27c

Please sign in to comment.