'Create a node
:param name: Name for the new node
:type name: ``str``
:param size: Size of the new node
:type size: :class:`NodeSize`
:param image: Image for the new node
:type image: :class:`NodeImage`
:param location: Location of the new node
:type location: :class:`NodeLocation`
:param ex_ssh_key_ids: IDs of the SSH keys to initialize
:type ex_sshkeyid: ``list`` of ``str``
:param ex_create_attr: Extra attributes for node creation
:type ex_create_attr: ``dict``
The `ex_create_attr` parameter can include the following dictionary
key and value pairs:
* `ipxe_chain_url`: ``str`` for specifying URL to boot via IPXE
* `iso_id`: ``str`` the ID of a specific ISO to mount,
only meaningful with the `Custom` `NodeImage`
* `script_id`: ``int`` ID of a startup script to execute on boot,
only meaningful when the `NodeImage` is not `Custom`
* \'snapshot_id`: ``str`` Snapshot ID to restore for the initial
installation, only meaningful with the `Snapshot` `NodeImage`
* `enable_ipv6`: ``bool`` Whether an IPv6 subnet should be assigned
* `enable_private_network`: ``bool`` Whether private networking
support should be added
* `label`: ``str`` Text label to be shown in the control panel
* `auto_backups`: ``bool`` Whether automatic backups should be enabled
* `app_id`: ``int`` App ID to launch if launching an application,
only meaningful when the `NodeImage` is `Application`
* `userdata`: ``str`` Base64 encoded cloud-init user-data
* `notify_activate`: ``bool`` Whether an activation email should be
sent when the server is ready
* `ddos_protection`: ``bool`` Whether DDOS protection should be enabled
* `reserved_ip_v4`: ``str`` IP address of the floating IP to use as
the main IP of this server
* `hostname`: ``str`` The hostname to assign to this server
* `tag`: ``str`` The tag to assign to this server
:return: The newly created node.
:rtype: :class:`Node`'

def create_node(self, name, size, image, location, ex_ssh_key_ids=None, ex_create_attr=None):

    params = {'DCID': location.id, 'VPSPLANID': size.id, 'OSID': image.id, 'label': name}
    if (ex_ssh_key_ids is not None):
        params['SSHKEYID'] = ','.join(ex_ssh_key_ids)
    ex_create_attr = (ex_create_attr or {})
    for (key, value) in ex_create_attr.items():
        if (key in self.EX_CREATE_ATTRIBUTES):
            if (key in self.EX_CREATE_YES_NO_ATTRIBUTES):
                params[key] = ('yes' if value else 'no')
            else:
                if (key in self.EX_CREATE_ID_ATTRIBUTES):
                    key = self.EX_CREATE_ID_ATTRIBUTES[key]
                params[key] = value
    result = self.connection.post('/v1/server/create', params)
    if (result.status != httplib.OK):
        return False
    subid = result.object['SUBID']
    retry_count = 3
    created_node = None
    for i in range(retry_count):
        try:
            nodes = self.list_nodes()
            created_node = [n for n in nodes if (n.id == subid)][0]
        except IndexError:
            time.sleep(1)
        else:
            break
    return created_node
