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:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user