Use dictionary get() to prevent crashes

Use the get() function throughout to prevent crashes in various
scenarios if the profile data isn't present or consistent.
This commit is contained in:
Joshua Boniface 2020-01-13 09:21:23 -05:00
parent 4ad29f669d
commit 4c1b78d7a4
1 changed files with 17 additions and 14 deletions

View File

@ -59,31 +59,34 @@ class MetadataAPIInstance(object):
def api_metadata_instanceid(version): def api_metadata_instanceid(version):
source_address = flask.request.__dict__['environ']['REMOTE_ADDR'] source_address = flask.request.__dict__['environ']['REMOTE_ADDR']
vm_details = self.get_vm_details(source_address) vm_details = self.get_vm_details(source_address)
instance_id = vm_details['uuid'] instance_id = vm_details.get('uuid', None)
return instance_id, 200 return instance_id, 200
@self.mdapi.route('/<version>/meta-data/name', methods=['GET']) @self.mdapi.route('/<version>/meta-data/name', methods=['GET'])
def api_metadata_hostname(version): def api_metadata_hostname(version):
source_address = flask.request.__dict__['environ']['REMOTE_ADDR'] source_address = flask.request.__dict__['environ']['REMOTE_ADDR']
vm_details = self.get_vm_details(source_address) vm_details = self.get_vm_details(source_address)
vm_name = vm_details['name'] vm_name = vm_details.get('name', None)
return vm_name, 200 return vm_name, 200
@self.mdapi.route('/<version>/meta-data/profile', methods=['GET']) @self.mdapi.route('/<version>/meta-data/profile', methods=['GET'])
def api_metadata_profile(version): def api_metadata_profile(version):
source_address = flask.request.__dict__['environ']['REMOTE_ADDR'] source_address = flask.request.__dict__['environ']['REMOTE_ADDR']
vm_details = self.get_vm_details(source_address) vm_details = self.get_vm_details(source_address)
vm_profile = vm_details['profile'] vm_profile = vm_details.get('profile', None)
return vm_profile, 200 return vm_profile, 200
@self.mdapi.route('/<version>/user-data', methods=['GET']) @self.mdapi.route('/<version>/user-data', methods=['GET'])
def api_userdata(version): def api_userdata(version):
source_address = flask.request.__dict__['environ']['REMOTE_ADDR'] source_address = flask.request.__dict__['environ']['REMOTE_ADDR']
vm_details = self.get_vm_details(source_address) vm_details = self.get_vm_details(source_address)
vm_profile = vm_details['profile'] vm_profile = vm_details.get('profile', None)
# Get the userdata # Get the userdata
if vm_profile:
userdata = self.get_profile_userdata(vm_profile) userdata = self.get_profile_userdata(vm_profile)
self.logger.out("Returning userdata for profile {}".format(vm_profile), state='i', prefix='Metadata API') self.logger.out("Returning userdata for profile {}".format(vm_profile), state='i', prefix='Metadata API')
else:
userdata = None
return flask.Response(userdata) return flask.Response(userdata)
def launch_wsgi(self): def launch_wsgi(self):
@ -149,7 +152,7 @@ class MetadataAPIInstance(object):
cur.execute(query, args) cur.execute(query, args)
data_raw = cur.fetchone() data_raw = cur.fetchone()
self.close_database(conn, cur) self.close_database(conn, cur)
data = data_raw['userdata'] data = data_raw.get('userdata', None)
return data return data
# VM details function # VM details function
@ -159,13 +162,13 @@ class MetadataAPIInstance(object):
# Figure out which server this is via the DHCP address # Figure out which server this is via the DHCP address
host_information = dict() host_information = dict()
networks_managed = (x for x in networks if x['type'] == 'managed') networks_managed = (x for x in networks if x.get('type') == 'managed')
for network in networks_managed: for network in networks_managed:
network_leases = pvc_network.getNetworkDHCPLeases(self.zk_conn, network['vni']) network_leases = pvc_network.getNetworkDHCPLeases(self.zk_conn, network.get('vni'))
for network_lease in network_leases: for network_lease in network_leases:
information = pvc_network.getDHCPLeaseInformation(self.zk_conn, network['vni'], network_lease) information = pvc_network.getDHCPLeaseInformation(self.zk_conn, network.get('vni'), network_lease)
try: try:
if information['ip4_address'] == source_address: if information.get('ip4_address', None) == source_address:
host_information = information host_information = information
except: except:
pass pass
@ -181,9 +184,9 @@ class MetadataAPIInstance(object):
vm_details = dict() vm_details = dict()
for vm in vm_list: for vm in vm_list:
try: try:
for network in vm['networks']: for network in vm.get('networks'):
if network['mac'] == client_macaddr: if network.get('mac', None) == client_macaddr:
vm_name = vm['name'] vm_name = vm.get('name')
vm_details = vm vm_details = vm
except: except:
pass pass