Merge branch 'equinix-update' of https://github.com/dimgal1/libcloud into dimgal1-equinix-update
diff --git a/libcloud/compute/drivers/equinixmetal.py b/libcloud/compute/drivers/equinixmetal.py
index 2dc93fa..b14e54a 100644
--- a/libcloud/compute/drivers/equinixmetal.py
+++ b/libcloud/compute/drivers/equinixmetal.py
@@ -208,7 +208,12 @@
         result = yield from future
         retval.extend(result)
     return retval""" % resource_type, glob, loc)
-        loop = asyncio.get_event_loop()
+        try:
+            loop = asyncio.get_event_loop()
+        except RuntimeError:
+            asyncio.set_event_loop(asyncio.new_event_loop())
+            loop = asyncio.get_event_loop()
+
         return loop.run_until_complete(loc['_list_async'](loc['self']))
 
     def ex_list_nodes_for_project(self, ex_project_id, include='plan', page=1,
@@ -246,7 +251,7 @@
 
     def create_node(self, name, size, image, location,
                     ex_project_id=None, ip_addresses=[], cloud_init=None,
-                    **kwargs):
+                    disk=None, disk_size=0, **kwargs):
         """
         Create a node.
 
@@ -281,10 +286,10 @@
             error_message = data.object.get('error_message', message)
             raise ValueError('Failed to create node: %s' % (error_message))
         node = self._to_node(data=data.object)
-        if kwargs.get('disk'):
-            self.attach_volume(node, kwargs.get('disk'))
-        if kwargs.get('disk_size'):
-            volume = self.create_volume(size=kwargs.get('disk_size'),
+        if disk:
+            self.attach_volume(node, disk)
+        if disk_size:
+            volume = self.create_volume(size=disk_size,
                                         location=location)
             self.attach_volume(node, volume)
         return node
@@ -433,7 +438,11 @@
         return node
 
     def _to_image(self, data):
-        extra = {'distro': data['distro'], 'version': data['version']}
+        extra = {
+            'distro': data['distro'],
+            'version': data['version'],
+            'supported_sizes': data.get('provisionable_on', [])
+        }
         return NodeImage(id=data['slug'], name=data['name'], extra=extra,
                          driver=self)
 
@@ -443,22 +452,31 @@
                             driver=self, extra=extra)
 
     def _to_size(self, data):
-        cpus = data['specs']['cpus'][0].get('count')
+        try:
+            cpus = data['specs']['cpus'][0].get('count')
+        except KeyError:
+            cpus = None
+        regions = [region.get('href').replace('/metal/v1/facilities/', '')
+                   for region in data.get('available_in', [])]
         extra = {'description': data['description'], 'line': data['line'],
-                 'cpus': cpus}
-
-        ram = data['specs']['memory']['total']
-        disk = 0
-        for disks in data['specs']['drives']:
-            disk_size = disks['size'].replace('GB', '')
-            if 'TB' in disk_size:
-                disk_size = float(disks['size'].replace('TB', '')) * 1000
-            disk += disks['count'] * int(disk_size)
+                 'cpus': cpus, 'regions': regions}
+        try:
+            ram = int(data['specs']['memory']['total'].replace('GB', '')) * 1024  # noqa
+        except KeyError:
+            ram = None
+        disk = None
+        if data['specs'].get('drives', ''):
+            disk = 0
+            for disks in data['specs']['drives']:
+                disk_size = disks['size'].replace('GB', '')
+                if 'TB' in disk_size:
+                    disk_size = float(disks['size'].replace('TB', '')) * 1000
+                disk += disks['count'] * int(disk_size)
         name = "%s - %s RAM" % (data.get('name'), ram)
         price = data['pricing'].get('hour')
         return NodeSize(id=data['slug'], name=name,
-                        ram=int(ram.replace('GB', '')) * 1024, disk=disk,
-                        bandwidth=0, price=price, extra=extra, driver=self)
+                        ram=ram, disk=disk, bandwidth=0,
+                        price=price, extra=extra, driver=self)
 
     def _to_key_pairs(self, data):
         extra = {'label': data['label'],
diff --git a/libcloud/test/compute/test_equinixmetal.py b/libcloud/test/compute/test_equinixmetal.py
index 42d87b7..98979a7 100644
--- a/libcloud/test/compute/test_equinixmetal.py
+++ b/libcloud/test/compute/test_equinixmetal.py
@@ -61,7 +61,7 @@
         self.assertEqual(node.extra['billing_cycle'], 'hourly')
         self.assertEqual(node.extra['locked'], False)
         self.assertEqual(node.size.id, 'baremetal_1')
-        self.assertEqual(node.size.name, 'Type 1 - 16GB RAM')
+        self.assertEqual(node.size.name, 'Type 1 - 16384 RAM')
         self.assertEqual(node.size.ram, 16384)
         self.assertEqual(node.size.disk, 240)
         self.assertEqual(node.size.price, 0.4)