'Return a Node object from the JSON-response dictionary.
:param    node: The dictionary describing the node.
:type     node: ``dict``
:keyword  use_disk_cache: If true, ex_get_volume call will use cache.
:type     use_disk_cache: ``bool``
:return:  Node object
:rtype:   :class:`Node`'

def _to_node(self, node, use_disk_cache=False):

    public_ips = []
    private_ips = []
    extra = {}
    extra['status'] = node.get('status', 'UNKNOWN')
    extra['statusMessage'] = node.get('statusMessage')
    extra['description'] = node.get('description')
    extra['zone'] = self.ex_get_zone(node['zone'])
    extra['image'] = node.get('image')
    extra['machineType'] = node.get('machineType')
    extra['disks'] = node.get('disks', [])
    extra['networkInterfaces'] = node.get('networkInterfaces')
    extra['id'] = node['id']
    extra['selfLink'] = node.get('selfLink')
    extra['kind'] = node.get('kind')
    extra['creationTimestamp'] = node.get('creationTimestamp')
    extra['name'] = node['name']
    extra['metadata'] = node.get('metadata', {})
    extra['tags_fingerprint'] = node['tags']['fingerprint']
    extra['scheduling'] = node.get('scheduling', {})
    extra['deprecated'] = (True if node.get('deprecated', None) else False)
    extra['canIpForward'] = node.get('canIpForward')
    extra['serviceAccounts'] = node.get('serviceAccounts', [])
    extra['scheduling'] = node.get('scheduling', {})
    extra['boot_disk'] = None
    for disk in extra['disks']:
        if (disk.get('boot') and (disk.get('type') == 'PERSISTENT')):
            bd = self._get_components_from_path(disk['source'])
            extra['boot_disk'] = self.ex_get_volume(bd['name'], bd['zone'], use_cache=use_disk_cache)
    if ('items' in node['tags']):
        tags = node['tags']['items']
    else:
        tags = []
    extra['tags'] = tags
    for network_interface in node.get('networkInterfaces', []):
        private_ips.append(network_interface.get('networkIP'))
        for access_config in network_interface.get('accessConfigs', []):
            public_ips.append(access_config.get('natIP'))
    image = None
    if extra['image']:
        image = self._get_components_from_path(extra['image'])['name']
    else:
        if (extra['boot_disk'] and hasattr(extra['boot_disk'], 'extra') and ('sourceImage' in extra['boot_disk'].extra) and (extra['boot_disk'].extra['sourceImage'] is not None)):
            src_image = extra['boot_disk'].extra['sourceImage']
            image = self._get_components_from_path(src_image)['name']
        extra['image'] = image
    size = self._get_components_from_path(node['machineType'])['name']
    return Node(id=node['id'], name=node['name'], state=self.NODE_STATE_MAP[node['status']], public_ips=public_ips, private_ips=private_ips, driver=self, size=size, image=image, extra=extra)
