123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233 |
- from flask import jsonify, request
- import json
- import requests
- import os
- import time
- from lxconsole import db
- from lxconsole.models import Server
- from datetime import datetime
- from flask_login import login_required
- from lxconsole.api.access_controls import privilege_check
- def get_client_crt():
- return 'certs/client.crt'
- def get_client_key():
- return 'certs/client.key'
- @login_required
- def api_instance_endpoint(endpoint):
- if not privilege_check(endpoint, request.args.get('id')):
- return jsonify({'data': [], 'metadata':[], 'error': 'not authorized', 'error_code': 403})
- if endpoint == 'add_instance_disk_device':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- # Before applying PATCH, check to make sure device does not already exists so that we do not overwrite an existing device
- if request.form.get('name') in instance['metadata']['devices'].keys():
- return jsonify({"type": "error","error": "Unable to add new device. Device name already exists","error_code": 409,"metadata": {"error": "Unable to add new device. Device name already exists"}})
- description = instance['metadata']['description']
- data = {}
- device = {}
- device.update({'type': 'disk'})
- device.update({'pool': request.form.get('pool')}) if request.form.get('pool') else False
- device.update({'source': request.form.get('source')}) if request.form.get('source') else False
- device.update({'path': request.form.get('path')}) if request.form.get('path') else False
- device.update({'limits_read': request.form.get('limits_read')}) if request.form.get('limits_read') else False
- device.update({'limits_write': request.form.get('limits_write')}) if request.form.get('limits_write') else False
- device.update({'limits_max': request.form.get('limits_max')}) if request.form.get('limits_max') else False
- device.update({'required': request.form.get('required')}) if request.form.get('required') else False
- device.update({'read_only': request.form.get('read_only')}) if request.form.get('read_only') else False
- device.update({'size': request.form.get('size')}) if request.form.get('size') else False
- device.update({'size_state': request.form.get('size_state')}) if request.form.get('size_state') else False
- device.update({'recursive': request.form.get('recursive')}) if request.form.get('recursive') else False
- device.update({'propagation': request.form.get('propagation')}) if request.form.get('propagation') else False
- device.update({'shift': request.form.get('shift')}) if request.form.get('shift') else False
- device.update({'raw_mount_options': request.form.get('raw_mount_options')}) if request.form.get('raw_mount_options') else False
- device.update({'ceph_user_name': request.form.get('ceph_user_name')}) if request.form.get('ceph_user_name') else False
- device.update({'ceph_cluster_name': request.form.get('ceph_cluster_name')}) if request.form.get('ceph_cluster_name') else False
- device.update({'boot_priority': request.form.get('boot_priority')}) if request.form.get('boot_priority') else False
- devices = {}
- devices.update({request.form.get('name'): device})
- data.update({'description': description})
- data.update({'devices': devices})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'add_instance_gpu_device':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- # Before applying PATCH, check to make sure device does not already exists so that we do not overwrite an existing device
- if request.form.get('name') in instance['metadata']['devices'].keys():
- return jsonify({"type": "error","error": "Unable to add new device. Device name already exists","error_code": 409,"metadata": {"error": "Unable to add new device. Device name already exists"}})
- description = instance['metadata']['description']
- data = {}
- device = {}
- device.update({'type': 'gpu'})
- device.update({'gputype': request.form.get('gputype')}) if request.form.get('gputype') else False
- device.update({'vendorid': request.form.get('vendorid')}) if request.form.get('vendorid') else False
- device.update({'productid': request.form.get('productid')}) if request.form.get('productid') else False
- device.update({'id': request.form.get('id')}) if request.form.get('id') else False
- device.update({'pci': request.form.get('pci')}) if request.form.get('pci') else False
- device.update({'uid': request.form.get('uid')}) if request.form.get('uid') else False
- device.update({'gid': request.form.get('gid')}) if request.form.get('gid') else False
- device.update({'mode': request.form.get('mode')}) if request.form.get('mode') else False
- device.update({'mig.ci': request.form.get('mig.ci')}) if request.form.get('mig.ci') else False
- device.update({'mig.gi': request.form.get('mig.gi')}) if request.form.get('mig.gi') else False
- devices = {}
- devices.update({request.form.get('name'): device})
- data.update({'description': description})
- data.update({'devices': devices})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'add_instance_network_device':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- # Before applying PATCH, check to make sure device does not already exists so that we do not overwrite an existing device
- if request.form.get('name') in instance['metadata']['devices'].keys():
- return jsonify({"type": "error","error": "Unable to add new device. Device name already exists","error_code": 409,"metadata": {"error": "Unable to add new device. Device name already exists"}})
- description = instance['metadata']['description']
- data = {}
- device = {}
- device.update({'type': 'nic'})
- device.update({'nictype': request.form.get('nictype')}) if request.form.get('nictype') else False
- device.update({'parent': request.form.get('parent')}) if request.form.get('parent') else False
- device.update({'network': request.form.get('network')}) if request.form.get('network') else False
- device.update({'interface_name': request.form.get('interface_name')}) if request.form.get('interface_name') else False
- device.update({'mtu': request.form.get('mtu')}) if request.form.get('mtu') else False
- device.update({'mode': request.form.get('mode')}) if request.form.get('mode') else False
- device.update({'hwaddr': request.form.get('hwaddr')}) if request.form.get('hwaddr') else False
- device.update({'host_name': request.form.get('host_name')}) if request.form.get('host_name') else False
- device.update({'limits_ingress': request.form.get('limits_ingress')}) if request.form.get('limits_ingress') else False
- device.update({'limits_egress': request.form.get('limits_egress')}) if request.form.get('limits_egress') else False
- device.update({'limits_max': request.form.get('limits_max')}) if request.form.get('limits_max') else False
- device.update({'ipv4_address': request.form.get('ipv4_address')}) if request.form.get('ipv4_address') else False
- device.update({'ipv4_gateway': request.form.get('ipv4_gateway')}) if request.form.get('ipv4_gateway') else False
- device.update({'ipv4_host_table': request.form.get('ipv4_host_table')}) if request.form.get('ipv4_host_table') else False
- device.update({'ipv4_host_address': request.form.get('ipv4_host_address')}) if request.form.get('ipv4_host_address') else False
- device.update({'ipv4_routes': request.form.get('ipv4_routes')}) if request.form.get('ipv4_routes') else False
- device.update({'ipv4_routes_external': request.form.get('ipv4_routes_external')}) if request.form.get('ipv4_routes_external') else False
- device.update({'ipv6_address': request.form.get('ipv6_address')}) if request.form.get('ipv6_address') else False
- device.update({'ipv6_gateway': request.form.get('ipv6_gateway')}) if request.form.get('ipv6_gateway') else False
- device.update({'ipv6_host_table': request.form.get('ipv6_host_table')}) if request.form.get('ipv6_host_table') else False
- device.update({'ipv6_host_address': request.form.get('ipv6_host_address')}) if request.form.get('ipv6_host_address') else False
- device.update({'ipv6_routes': request.form.get('ipv6_routes')}) if request.form.get('ipv6_routes') else False
- device.update({'ipv6_routes_external': request.form.get('ipv6_routes_external')}) if request.form.get('ipv6_routes_external') else False
- device.update({'security_mac_filtering': request.form.get('security_mac_filtering')}) if request.form.get('security_mac_filtering') else False
- device.update({'security_ipv4_filtering': request.form.get('security_ipv4_filtering')}) if request.form.get('security_ipv4_filtering') else False
- device.update({'security_ipv6_filtering': request.form.get('security_ipv6_filtering')}) if request.form.get('security_ipv6_filtering') else False
- device.update({'maas_subnet_ipv4': request.form.get('maas_subnet_ipv4')}) if request.form.get('maas_subnet_ipv4') else False
- device.update({'maas_subnet_ipv6': request.form.get('maas_subnet_ipv6')}) if request.form.get('maas_subnet_ipv6') else False
- device.update({'boot_priority': request.form.get('boot_priority')}) if request.form.get('boot_priority') else False
- device.update({'vlan': request.form.get('vlan')}) if request.form.get('vlan') else False
- device.update({'vlan_tagged': request.form.get('vlan_tagged')}) if request.form.get('vlan_tagged') else False
- device.update({'security_port_isolation': request.form.get('security_port_isolation')}) if request.form.get('security_port_isolation') else False
- device.update({'gvrp': request.form.get('gvrp')}) if request.form.get('gvrp') else False
- device.update({'security_acls': request.form.get('security_acls')}) if request.form.get('security_acls') else False
- device.update({'security_acls_default_ingress_action': request.form.get('security_acls_default_ingress_action')}) if request.form.get('security_acls_default_ingress_action') else False
- device.update({'security_acls_default_egress_action': request.form.get('security_acls_default_egress_action')}) if request.form.get('security_acls_default_egress_action') else False
- device.update({'security_acls_default_ingress_logged': request.form.get('security_acls_default_ingress_logged')}) if request.form.get('security_acls_default_ingress_logged') else False
- device.update({'security_acls_default_egress_logged': request.form.get('security_acls_default_egress_logged')}) if request.form.get('security_acls_default_egress_logged') else False
- devices = {}
- devices.update({request.form.get('name'): device})
- data.update({'description': description})
- data.update({'devices': devices})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'add_instance_proxy_device':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- # Before applying PATCH, check to make sure device does not already exists so that we do not overwrite an existing device
- if request.form.get('name') in instance['metadata']['devices'].keys():
- return jsonify({"type": "error","error": "Unable to add new device. Device name already exists","error_code": 409,"metadata": {"error": "Unable to add new device. Device name already exists"}})
- description = instance['metadata']['description']
- data = {}
- device = {}
- device.update({'type': 'proxy'})
- device.update({'listen': request.form.get('listen')}) if request.form.get('listen') else False
- device.update({'connect': request.form.get('connect')}) if request.form.get('connect') else False
- device.update({'bind': request.form.get('bind')}) if request.form.get('bind') else False
- device.update({'uid': request.form.get('uid')}) if request.form.get('uid') else False
- device.update({'gid': request.form.get('gid')}) if request.form.get('gid') else False
- device.update({'mode': request.form.get('mode')}) if request.form.get('mode') else False
- device.update({'nat': request.form.get('nat')}) if request.form.get('nat') else False
- device.update({'proxy_protocol': request.form.get('proxy_protocol')}) if request.form.get('proxy_protocol') else False
- device.update({'security_uid': request.form.get('security_uid')}) if request.form.get('security_uid') else False
- device.update({'security_gid': request.form.get('security_gid')}) if request.form.get('security_gid') else False
- devices = {}
- devices.update({request.form.get('name'): device})
- data.update({'description': description})
- data.update({'devices': devices})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'add_instance_unix_device':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- # Before applying PATCH, check to make sure device does not already exists so that we do not overwrite an existing device
- if request.form.get('name') in instance['metadata']['devices'].keys():
- return jsonify({"type": "error","error": "Unable to add new device. Device name already exists","error_code": 409,"metadata": {"error": "Unable to add new device. Device name already exists"}})
- description = instance['metadata']['description']
- data = {}
- device = {}
- device.update({'type': request.form.get('type')}) if request.form.get('type') else False
- device.update({'source': request.form.get('source')}) if request.form.get('source') else False
- device.update({'path': request.form.get('path')}) if request.form.get('path') else False
- device.update({'major': request.form.get('major')}) if request.form.get('major') else False
- device.update({'minor': request.form.get('minor')}) if request.form.get('minor') else False
- device.update({'uid': request.form.get('uid')}) if request.form.get('uid') else False
- device.update({'gid': request.form.get('gid')}) if request.form.get('gid') else False
- device.update({'mode': request.form.get('mode')}) if request.form.get('mode') else False
- device.update({'required': request.form.get('required')}) if request.form.get('required') else False
- devices = {}
- devices.update({request.form.get('name'): device})
- data.update({'description': description})
- data.update({'devices': devices})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
-
- if endpoint == 'add_instance_usb_device':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- # Before applying PATCH, check to make sure device does not already exists so that we do not overwrite an existing device
- if request.form.get('name') in instance['metadata']['devices'].keys():
- return jsonify({"type": "error","error": "Unable to add new device. Device name already exists","error_code": 409,"metadata": {"error": "Unable to add new device. Device name already exists"}})
- description = instance['metadata']['description']
- data = {}
- device = {}
- device.update({'type': 'usb'})
- device.update({'vendorid': request.form.get('vendorid')}) if request.form.get('vendorid') else False
- device.update({'productid': request.form.get('productid')}) if request.form.get('productid') else False
- device.update({'uid': request.form.get('uid')}) if request.form.get('uid') else False
- device.update({'gid': request.form.get('gid')}) if request.form.get('gid') else False
- device.update({'mode': request.form.get('mode')}) if request.form.get('mode') else False
- devices = {}
- devices.update({request.form.get('name'): device})
- data.update({'description': description})
- data.update({'devices': devices})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'attach_instance_profile':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- description = instance['metadata']['description']
- data = {}
- profiles = instance['metadata']['profiles']
- if request.form.get('name') not in profiles:
- profiles.append(request.form.get('name'))
- data.update({'description': description})
- data.update({'profiles': profiles})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'change_instance_state':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.form.get('instance')
- action = request.form.get('action')
- force = request.form.get('force')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/state?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- if force == 'true':
- data = { 'action': action, 'force': True }
- else:
- data = { 'action': action, 'force': False }
- results = requests.put(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'copy_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- location = request.args.get('location')
- #Target location is needed for clustered servers and not allowed on non-clustered servers
- if location == 'none':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances?project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances?target='+location+'&project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- data.update({'name': request.form.get('name')})
- source = {}
- source.update({'type': 'copy'})
- source.update({'source': instance })
- source.update({'project': project})
- data.update({'source': source})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'create_instance_backup':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/backups?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
-
- # Determine file name
- name = request.form.get('name')
- if not name:
- now = datetime.now()
- dt_string = now.strftime("%Y%m%d%H%M%S")
- name = instance + '-' + dt_string
- # Determine file extenstion
- compression_algorithm = request.form.get('compression_algorithm')
- if compression_algorithm == 'bzip2':
- extenstion = '.tar.bz2'
- elif compression_algorithm == 'gzip':
- extenstion = '.tar.gz'
- elif compression_algorithm == 'lzma':
- extenstion = '.tar.lzma'
- elif compression_algorithm == 'xz':
- extenstion = '.tar.xz'
- elif compression_algorithm == 'zstd':
- extenstion = '.tar.zst'
- else:
- extenstion = '.tar'
- # Append file extension to name
- name = name + extenstion
- data = {}
- data.update({'name': name})
- data.update({'instance_only': True }) if request.form.get('instance_only') == 'true' else data.update({'instance_only': False })
- data.update({'optimized_storage': True }) if request.form.get('optimized_storage') == 'true' else data.update({'optimized_storage': False })
- data.update({'compression_algorithm': request.form.get('compression_algorithm')}) if request.form.get('compression_algorithm') else False
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
-
- if endpoint == 'create_instance_snapshot':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/snapshots?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- data.update({'name': request.form.get('name')})
- if request.form.get('stateful') == 'true':
- data.update({'stateful': True})
- else:
- data.update({'stateful': False})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'create_instance_snapshot_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- location = request.args.get('location')
- #Target location is needed for clustered servers and not allowed on non-clustered servers
- if location == 'none':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances?project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances?target='+location+'&project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- data.update({'name': request.form.get('name')})
- source = {}
- source.update({'type': 'copy'})
- source.update({'instance_only': True})
- source.update({'source': instance + '/' + request.form.get('snapshot')})
- source.update({'project': project})
- data.update({'source': source})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'delete_instance_backup':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- backup = request.args.get('backup')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/backups/' + backup + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- if os.path.isfile('backups/' + str(server.id) + '/' + project + '/' + instance + '/' + backup):
- os.unlink('backups/' + str(server.id) + '/' + project + '/' + instance + '/' + backup)
- results = requests.delete(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return jsonify(results.json())
- if endpoint == 'delete_instance_device':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- device = request.args.get('device')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- data = instance['metadata']
- data['devices'].pop(device)
- results = requests.put(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'delete_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.form.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.delete(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return jsonify(results.json())
- if endpoint == 'delete_instance_log':
- id = request.args.get('id')
- project = request.args.get('project')
- log = request.args.get('log')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + log + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.delete(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return jsonify(results.json())
- if endpoint == 'delete_instance_snapshot':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- snapshot = request.args.get('snapshot')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/snapshots/' + snapshot + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.delete(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return jsonify(results.json())
- if endpoint == 'detach_instance_profile':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- profile = request.args.get('profile')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- instance = instance['metadata']
- description = instance['description']
- instance_profiles = instance['profiles']
- instance_profiles.remove(profile)
- data = {}
- data.update({ 'description': description })
- data.update({ 'profiles': instance_profiles})
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'display_instance_log':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- log = request.args.get('log')
- url = 'https://' + server.addr + ':' + str(server.port) + log + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return results.text
-
- if endpoint == 'establish_instance_console_websocket':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/console?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- data.update({'type': 'console'})
- data.update({'width': int(request.form.get('width'))})
- data.update({'height': int(request.form.get('height'))})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- results = json.dumps(results.json())
- results = json.loads(results)
- operation = results['operation'] if results['operation'] else ''
- secret = str(results['metadata']['metadata']['fds']['0']) if str(results['metadata']['metadata']['fds']['0']) else ''
- control = str(results['metadata']['metadata']['fds']['control']) if str(results['metadata']['metadata']['fds']['control']) else ''
- return jsonify({'operation': operation, 'secret': secret, 'control': control})
-
- if endpoint == 'establish_instance_exec_websocket':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/exec?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- if request.form.get('shell') == "sh":
- data.update({'command': ["/bin/sh"]})
- else:
- data.update({'command': ["/bin/bash"]})
- data.update({'wait-for-websocket':True})
- data.update({'interactive': True})
- data.update({'width': int(request.form.get('width'))})
- data.update({'height': int(request.form.get('height'))})
- environment = {}
- environment.update({'HOME': '/root'})
- environment.update({'TERM': 'xterm'})
- environment.update({'USER': 'root'})
- data.update({'environment': environment})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- results = json.dumps(results.json())
- results = json.loads(results)
- operation = results['operation'] if results['operation'] else ''
- secret = str(results['metadata']['metadata']['fds']['0']) if str(results['metadata']['metadata']['fds']['0']) else ''
- control = str(results['metadata']['metadata']['fds']['control']) if str(results['metadata']['metadata']['fds']['control']) else ''
- return jsonify({'operation': operation, 'secret': secret, 'control': control})
-
- if endpoint == 'export_instance_backup':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- instance = request.args.get('instance')
- backup = request.args.get('backup')
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '/backups/' + backup + '/export?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- os.system('mkdir -p backups/' + str(server.id) + '/' + project + '/' + instance)
- filename = 'backups/' + str(server.id) + '/' + project + '/' + instance + '/' + backup
- with requests.get(url, stream=True, verify=server.ssl_verify, cert=(client_cert, client_key)) as r:
- r.raise_for_status()
- with open(filename, 'wb') as f:
- for chunk in r.iter_content(chunk_size=8192):
- f.write(chunk)
- return jsonify({"status": "Ok", "status_code": 200, "metadata": "{}"})
- if endpoint == 'get_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return jsonify(results.json())
-
- # Virtual Machine only
- if endpoint == 'copy_instance_proc_stat':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- client_cert = get_client_crt()
- client_key = get_client_key()
- # Unable to read /proc/stat directly on virtual machines use lxd files api...getting an EOF error
- # So we will copy /proc/stat to /tmp/stat and then read that file as a work around
- data = {}
- data.update({'command': ['/bin/sh', '-c', 'cat /proc/stat \u003e /tmp/stat' ]})
- #data.update({'command': ['cat', '/proc/stat']})
- #data.update({'command': ['cp', '/proc/stat', '/tmp/stat']})
- data.update({'wait-for-websocket': False})
- data.update({'interactive': False})
- data.update({'width': 80 })
- data.update({'height': 24 })
- data.update({'user': 0 })
- data.update({'group': 0 })
- data.update({'cwd': "/" })
- data.update({'record-output': False })
- data.update({'environment': {} })
-
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/exec?project=' + project
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- #Using record-output no longer appears to work, but it looks like lxd has code to use a new method of recording logs with exec-output as an option in the near future
- #Set record-output: true in command
- #exec_rtn = json.dumps(results.json())
- #exec_rtn = json.loads(exec_rtn)
- #Use operation to check for return value and get log output information
- #operation = exec_rtn['operation']
- #Check the logs/exec-ouput with get request to see if log exists /1.0/instances/{name}/logs/exec-output
- #url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/logs/exec-output?project=' + project
- #results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- #results return a list of urls of exec-output files. Should be able to match operation to a file in the list
- #example url: url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/test/logs/exec-output/exec_fea46679-fdaa-48f4-9079-502a090c4fb5.stdout'
- #results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- #The returned value should be text: return results.text
- #Check stdout log with get request "/1.0/instances/foo/logs/exec-output/exec_d0a89537-0617-4ed6-a79b-c2e88a970965.stdout",
- #return results.text
- #Check stderr log with get request "/1.0/instances/foo/logs/exec-output/exec_d0a89537-0617-4ed6-a79b-c2e88a970965.stderr",
- #Else delete to delete log at /1.0/instances/{name}/logs/exec-output/{filename}
- return jsonify(results.json())
- # Virtual Machine only
- if endpoint == 'get_instance_proc_stat':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- client_cert = get_client_crt()
- client_key = get_client_key()
- #Get /proc/stat information but from /tmp/stat
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/files?project=' + project + '&path=/tmp/stat'
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- if 'cpu' in results.text:
- results = results.text.split('\n')
- for result in results:
- stats = result.split()
- if 'cpu' in stats:
- user_time = int(stats[1])
- system_time= int(stats[3])
- idle_time = int(stats[4])
- return jsonify({'user_time':user_time, 'system_time':system_time, 'idle_time':idle_time})
- return jsonify({'user_time':0, 'system_time':0, 'idle_time':0})
- if endpoint == 'get_instance_cpu_usage':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- client_cert = get_client_crt()
- client_key = get_client_key()
- #Get instance state to retrieve instance cpu usage
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/state?project=' + project
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- results = json.dumps(results.json())
- results = json.loads(results)
- #Get cpu usage
- if 'cpu' in results['metadata']:
- if 'usage' in results['metadata']['cpu']:
- #Usage is reported in nanoseconds
- instance_cpu_time = int(results['metadata']['cpu']['usage'])
- else:
- instance_cpu_time = 0
- else:
- instance_cpu_time = 0
- #Get /proc/stat information
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/files?project=' + project + '&path=/proc/stat'
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- if 'cpu' in results.text:
- results = results.text.split('\n')
- for result in results:
- stats = result.split()
- if stats[0] == 'cpu':
- #0 = 'cpu'
- #1 = <user time>
- #2 = <nice time>
- #3 = <system time>
- #4 = <idle time>
- user_time = int(stats[1])
- system_time= int(stats[3])
- idle_time = int(stats[4])
- host_cpu_time = user_time + system_time + idle_time
- return jsonify({'instance_cpu_time':instance_cpu_time,'host_cpu_time': host_cpu_time})
-
- return jsonify({'instance_cpu_time':0,'host_cpu_time': 0})
-
- if endpoint == 'get_instance_disk_devices':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- expanded_devices = instance['metadata']['expanded_devices']
- devices = []
- instance_state_url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/state?project=' + project
- instance_state = requests.get(instance_state_url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance_state = json.dumps(instance_state.json())
- instance_state = json.loads(instance_state)
- if expanded_devices:
- for expanded_device in expanded_devices:
- if expanded_devices[expanded_device]['type'] == 'disk':
- device = {}
- device.update({ 'device': expanded_device })
- device.update({ 'type': expanded_devices[expanded_device]['type'] })
- if 'path' in expanded_devices[expanded_device]:
- device.update({ 'path': expanded_devices[expanded_device]['path'] })
- if 'pool' in expanded_devices[expanded_device]:
- device.update({ 'pool': expanded_devices[expanded_device]['pool'] })
- if expanded_device in instance_state['metadata']['disk']:
- if 'usage' in instance_state['metadata']['disk'][expanded_device]:
- device.update({ 'usage': instance_state['metadata']['disk'][expanded_device]['usage'] })
- devices.append(device)
- return jsonify({ 'data': devices })
- if endpoint == 'get_instance_gpu_devices':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- expanded_devices = instance['metadata']['expanded_devices']
- devices = []
- if expanded_devices:
- for expanded_device in expanded_devices:
- if expanded_devices[expanded_device]['type'] == 'gpu':
- device = {}
- device.update({ 'device': expanded_device })
- device.update({ 'type': expanded_devices[expanded_device]['type'] })
- if 'gputype' in expanded_devices[expanded_device]:
- device.update({ 'gputype': expanded_devices[expanded_device]['gputype'] })
- if 'vendorid' in expanded_devices[expanded_device]:
- device.update({ 'vendorid': expanded_devices[expanded_device]['vendorid'] })
- if 'productid' in expanded_devices[expanded_device]:
- device.update({ 'productid': expanded_devices[expanded_device]['productid'] })
- if 'id' in expanded_devices[expanded_device]:
- device.update({ 'id': expanded_devices[expanded_device]['id'] })
- if 'pci' in expanded_devices[expanded_device]:
- device.update({ 'pci': expanded_devices[expanded_device]['pci'] })
- if 'uid' in expanded_devices[expanded_device]:
- device.update({ 'uid': expanded_devices[expanded_device]['uid'] })
- if 'gid' in expanded_devices[expanded_device]:
- device.update({ 'gid': expanded_devices[expanded_device]['gid'] })
- if 'mode' in expanded_devices[expanded_device]:
- device.update({ 'mode': expanded_devices[expanded_device]['mode'] })
- if 'mig.ci' in expanded_devices[expanded_device]:
- device.update({ 'mig.ci': expanded_devices[expanded_device]['mig.ci'] })
- if 'mig.gi' in expanded_devices[expanded_device]:
- device.update({ 'mig.gi': expanded_devices[expanded_device]['mig.gi'] })
- devices.append(device)
- return jsonify({ 'data': devices })
- if endpoint == 'get_instance_interfaces':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/state?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/state?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- networks = instance['metadata']['network']
- interfaces = []
- if networks:
- for network in networks:
- if network:
- interface = {}
- interface.update({ 'name': network })
- interface.update({ 'hwaddr': networks[network]['hwaddr'] })
- interface.update({ 'state': networks[network]['state'] })
- addresses = networks[network]['addresses']
- interface.update({ 'ipv4_addresses': [] })
- interface.update({ 'ipv6_addresses': [] })
- for address in addresses:
- #if address['family'] == 'inet' and address['scope'] == 'global':
- if address['family'] == 'inet':
- interface['ipv4_addresses'] += [ address['address'] ]
- if address['family'] == 'inet6':
- interface['ipv6_addresses'] += [ address['address'] ]
- interfaces.append(interface)
- return jsonify({ 'data': interfaces })
- if endpoint == 'get_instance_network_devices':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- expanded_devices = instance['metadata']['expanded_devices']
- devices = []
- if expanded_devices:
- for expanded_device in expanded_devices:
- if expanded_devices[expanded_device]['type'] == 'nic':
- device = {}
- device.update({ 'device': expanded_device })
- device.update({ 'type': expanded_devices[expanded_device]['type'] })
- if 'name' in expanded_devices[expanded_device]:
- device.update({ 'name': expanded_devices[expanded_device]['name'] })
- if 'network' in expanded_devices[expanded_device]:
- device.update({ 'network': expanded_devices[expanded_device]['network'] })
- if 'nictype' in expanded_devices[expanded_device]:
- device.update({ 'nictype': expanded_devices[expanded_device]['nictype'] })
- if 'parent' in expanded_devices[expanded_device]:
- device.update({ 'parent': expanded_devices[expanded_device]['parent'] })
- devices.append(device)
- return jsonify({ 'data': devices })
- if endpoint == 'get_instance_proxy_devices':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- expanded_devices = instance['metadata']['expanded_devices']
- devices = []
- if expanded_devices:
- for expanded_device in expanded_devices:
- if expanded_devices[expanded_device]['type'] == 'proxy':
- device = {}
- device.update({ 'device': expanded_device })
- device.update({ 'type': expanded_devices[expanded_device]['type'] })
- if 'connect' in expanded_devices[expanded_device]:
- device.update({ 'connect': expanded_devices[expanded_device]['connect'] })
- if 'listen' in expanded_devices[expanded_device]:
- device.update({ 'listen': expanded_devices[expanded_device]['listen'] })
- devices.append(device)
- return jsonify({ 'data': devices })
- if endpoint == 'get_instance_state':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/state?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/state?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return jsonify(results.json())
- # Container only
- if endpoint == 'get_instance_unix_devices':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- expanded_devices = instance['metadata']['expanded_devices']
- devices = []
- if expanded_devices:
- for expanded_device in expanded_devices:
- if expanded_devices[expanded_device]['type'] == 'unix-block' or expanded_devices[expanded_device]['type'] == 'unix-char':
- device = {}
- device.update({ 'device': expanded_device })
- device.update({ 'type': expanded_devices[expanded_device]['type'] })
- if 'source' in expanded_devices[expanded_device]:
- device.update({ 'source': expanded_devices[expanded_device]['source'] })
- if 'path' in expanded_devices[expanded_device]:
- device.update({ 'path': expanded_devices[expanded_device]['path'] })
- if 'major' in expanded_devices[expanded_device]:
- device.update({ 'major': expanded_devices[expanded_device]['major'] })
- if 'minor' in expanded_devices[expanded_device]:
- device.update({ 'minor': expanded_devices[expanded_device]['minor'] })
- if 'uid' in expanded_devices[expanded_device]:
- device.update({ 'uid': expanded_devices[expanded_device]['uid'] })
- if 'gid' in expanded_devices[expanded_device]:
- device.update({ 'gid': expanded_devices[expanded_device]['gid'] })
- if 'mode' in expanded_devices[expanded_device]:
- device.update({ 'mode': expanded_devices[expanded_device]['mode'] })
- if 'required' in expanded_devices[expanded_device]:
- device.update({ 'required': expanded_devices[expanded_device]['required'] })
- devices.append(device)
- return jsonify({ 'data': devices })
- if endpoint == 'get_instance_usb_devices':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- expanded_devices = instance['metadata']['expanded_devices']
- devices = []
- if expanded_devices:
- for expanded_device in expanded_devices:
- if expanded_devices[expanded_device]['type'] == 'usb':
- device = {}
- device.update({ 'device': expanded_device })
- device.update({ 'type': expanded_devices[expanded_device]['type'] })
- if 'vendorid' in expanded_devices[expanded_device]:
- device.update({ 'vendorid': expanded_devices[expanded_device]['vendorid'] })
- if 'productid' in expanded_devices[expanded_device]:
- device.update({ 'productid': expanded_devices[expanded_device]['productid'] })
- if 'uid' in expanded_devices[expanded_device]:
- device.update({ 'uid': expanded_devices[expanded_device]['uid'] })
- if 'gid' in expanded_devices[expanded_device]:
- device.update({ 'gid': expanded_devices[expanded_device]['gid'] })
- if 'mode' in expanded_devices[expanded_device]:
- device.update({ 'mode': expanded_devices[expanded_device]['mode'] })
- if 'required' in expanded_devices[expanded_device]:
- device.update({ 'required': expanded_devices[expanded_device]['required'] })
- devices.append(device)
- return jsonify({ 'data': devices })
- if endpoint == 'get_instance_websocket_host':
- id = request.args.get('id')
- server = Server.query.filter_by(id=id).first()
- return jsonify({ 'addr': server.addr, 'port': server.port, 'proxy': server.proxy })
-
- if endpoint == 'list_instance_backups':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/backups?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/backups?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- backups = json.dumps(results.json())
- backups = json.loads(backups)
- devices = []
- if backups:
- for backup in backups['metadata']:
- # Check if backup file exists
- if os.path.isfile('backups/' + str(server.id) + '/' + project + '/' + name + '/' + backup['name']):
- backup.update({'backup_file_exists': True})
- backup.update({'backup_file_size': os.path.getsize('backups/' + str(server.id) + '/' + project + '/' + name + '/' + backup['name'])})
- else:
- backup.update({'backup_file_exists': False})
- return jsonify(backups)
- if endpoint == 'list_instance_logs':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/logs?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/logs?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
-
- # Newly created VMs will not have logs until it starts, causing a 404 error
- results = json.dumps(results.json())
- results = json.loads(results)
- if results['metadata'] is None:
- return jsonify({"metadata":[]})
- return jsonify(results)
- if endpoint == 'list_instance_snapshots':
- id = request.args.get('id')
- project = request.args.get('project')
- server = Server.query.filter_by(id=id).first()
- name = request.args.get('name')
- recursion = request.args.get('recursion')
- if recursion == '1':
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/snapshots?recursion=1&project=' + project
- else:
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + name + '/snapshots?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- return jsonify(results.json())
- if endpoint == 'migrate_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- location = request.args.get('location')
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?target='+location+'&project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- data.update({'name': instance })
- data.update({'migration': True})
- data.update({'live': False})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'publish_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/images?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- properties = {}
- properties.update({ 'description':request.form.get('description') })
- properties.update({ 'os': request.form.get('os') })
- properties.update({ 'release': request.form.get('release') })
- data.update({ 'properties': properties })
- source = {}
- source.update({ 'type': 'instance' })
- source.update({ 'name': instance })
- data.update({ 'source': source })
- if request.form.get('public') == 'true':
- data.update({'public': True})
- else:
- data.update({'public': False})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'publish_instance_snapshot':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- snapshot = request.args.get('snapshot')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/images?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- properties = {}
- properties.update({ 'description':request.form.get('description') })
- properties.update({ 'os': request.form.get('os') })
- properties.update({ 'release': request.form.get('release') })
- data.update({ 'properties': properties })
- source = {}
- source.update({ 'type': 'snapshot' })
- source.update({ 'name': instance + '/' + snapshot })
- data.update({ 'source': source })
- if request.form.get('public') == 'true':
- data.update({'public': True})
- else:
- data.update({'public': False})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'rename_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- data.update({'name': request.form.get('name')})
- results = requests.post(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
- if endpoint == 'restore_instance_snapshot':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- data = {}
- data.update({'restore': request.form.get('name')})
- results = requests.put(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
-
- return jsonify(results.json())
- if endpoint == 'update_instance':
- id = request.args.get('id')
- project = request.args.get('project')
- instance = request.args.get('instance')
- server = Server.query.filter_by(id=id).first()
- url = 'https://' + server.addr + ':' + str(server.port) + '/1.0/instances/' + instance + '?project=' + project
- client_cert = get_client_crt()
- client_key = get_client_key()
- # If the update was from JSON tab, update it with a PUT request
- if request.form.get('json'):
- data = request.form.get('json')
- results = requests.put(url, verify=server.ssl_verify, cert=(client_cert, client_key), data=data)
- return jsonify(results.json())
- # Get the current config
- results = requests.get(url, verify=server.ssl_verify, cert=(client_cert, client_key))
- instance = json.dumps(results.json())
- instance = json.loads(instance)
- existing_config = instance['metadata']['config']
-
- # Create a new dict to hold the differences between existing config and form config
- updated_config = {}
- # Loop through and compare differences between existing config and form config
- for key, val in request.form.items():
- # If key is description, continue as it is not part of config
- if key == 'description':
- continue
- # If the key does not exist in existing config, create and set it to empty string so we can compare it to form config
- if not key in existing_config:
- existing_config.update( { key: '' } )
- # If the post key is different than existing key capture this difference in new dict
- if request.form.get(key) != existing_config[key]:
- updated_config.update({key: request.form.get(key)})
- # Send a PATCH request to update only the differences in config
- data = {}
- data.update({'description': request.form.get('description')})
- data.update({'config' : updated_config })
- results = requests.patch(url, verify=server.ssl_verify, cert=(client_cert, client_key), json=data)
- return jsonify(results.json())
|