2023-05-04 09:33:42 +00:00
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_virtual_machine_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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines?project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines?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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines?project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines?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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + name + ' ?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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 ( ) )
if endpoint == ' get_instance_cpu_percentage ' :
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 ( )
first_cpu_time = 0
first_idle_time = 0
second_cpu_time = 0
second_idle_time = 0
# 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 ' : [ ' 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/virtual-machines/ ' + name + ' /exec?project= ' + project
results = requests . post ( url , verify = server . ssl_verify , cert = ( client_cert , client_key ) , json = data )
2023-10-07 23:30:17 +00:00
# Sleep to allow time for copy to complete
time . sleep ( .5 )
2023-05-04 09:33:42 +00:00
#Get first /proc/stat information but from /tmp/stat
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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 ] )
first_cpu_time = user_time + system_time + idle_time
first_idle_time = idle_time
2023-10-07 23:30:17 +00:00
# Sleep a second between reads
time . sleep ( 1 )
2023-05-04 09:33:42 +00:00
# Copy /proc/stat to /tmp/stat and then read that file as a work around
data = { }
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/virtual-machines/ ' + name + ' /exec?project= ' + project
results = requests . post ( url , verify = server . ssl_verify , cert = ( client_cert , client_key ) , json = data )
2023-10-07 23:30:17 +00:00
# Sleep to allow time for copy to complete
time . sleep ( .5 )
2023-05-04 09:33:42 +00:00
#Get second /proc/stat information
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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 ] )
second_cpu_time = user_time + system_time + idle_time
second_idle_time = idle_time
#Get CPU percentage
idle_time = second_idle_time - first_idle_time
total_time = second_cpu_time - first_cpu_time
if total_time == 0 :
return jsonify ( { ' percentage ' : 0 , ' cpu1 ' : first_cpu_time , ' cpu2 ' : second_cpu_time , ' idle1 ' : first_idle_time , ' idle2 ' : second_idle_time } )
percentage = 100 * ( 1 - idle_time / total_time )
return jsonify ( { ' percentage ' : percentage , ' cpu1 ' : first_cpu_time , ' cpu2 ' : second_cpu_time , ' idle1 ' : first_idle_time , ' idle2 ' : second_idle_time } )
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/virtual-machines/ ' + name + ' ?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + name + ' ?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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/virtual-machines/ ' + name + ' /state?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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_memory_percentage ' :
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 ( )
percentage = 0
mem_total = 0
mem_available = 0
# Unable to read /proc/meminfo directly on virtual machines use lxd files api...getting an EOF error
# So we will copy /proc/meminfo to /tmp/meminfo and then read that file as a work around
data = { }
data . update ( { ' command ' : [ ' cp ' , ' /proc/meminfo ' , ' /tmp/meminfo ' ] } )
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/virtual-machines/ ' + name + ' /exec?project= ' + project
results = requests . post ( url , verify = server . ssl_verify , cert = ( client_cert , client_key ) , json = data )
# Sleep a second to give time to copy file
time . sleep ( 1 )
#Get /proc/meminfo information but from /tmp/meminfo
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + name + ' /files?project= ' + project + ' &path=/tmp/meminfo '
results = requests . get ( url , verify = server . ssl_verify , cert = ( client_cert , client_key ) )
if ' MemTotal ' in results . text :
results = results . text . split ( ' \n ' )
mem_total = results [ 0 ] . split ( )
mem_available = results [ 2 ] . split ( )
percentage = 100 * ( 1 - ( int ( mem_available [ 1 ] ) / int ( mem_total [ 1 ] ) ) )
return jsonify ( { ' percentage ' : percentage , ' mem_total ' : mem_total , ' mem_available ' : mem_available } )
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/virtual-machines/ ' + name + ' ?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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/virtual-machines/ ' + name + ' ?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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/virtual-machines/ ' + name + ' /state?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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 ( ) )
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/virtual-machines/ ' + name + ' ?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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/virtual-machines/ ' + name + ' /backups?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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/virtual-machines/ ' + name + ' /logs?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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 ) )
return jsonify ( results . json ( ) )
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/virtual-machines/ ' + name + ' /snapshots?recursion=1&project= ' + project
else :
url = ' https:// ' + server . addr + ' : ' + str ( server . port ) + ' /1.0/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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/virtual-machines/ ' + 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 ( ) )