'Add new nodes to this cluster
aliases - list of aliases to assign to new nodes (len must equal
num_nodes)'

def add_nodes(self, num_nodes, aliases=None, image_id=None, instance_type=None, zone=None, placement_group=None, spot_bid=None, no_create=False):

    running_pending = self._nodes_in_states(['pending', 'running'])
    aliases = (aliases or [])
    if (not aliases):
        next_node_id = self._get_next_node_num()
        for i in range(next_node_id, (next_node_id + num_nodes)):
            alias = self._make_alias(i)
            aliases.append(alias)
    assert (len(aliases) == num_nodes)
    if (self._make_alias(master=True) in aliases):
        raise exception.ClusterValidationError('worker    nodes    cannot    have    master    as    an    alias')
    if (not no_create):
        if self.subnet:
            ip_count = self.subnet.available_ip_address_count
            if (ip_count < len(aliases)):
                raise exception.ClusterValidationError(('Not    enough    IP    addresses    available    in    %s    (%d)' % (self.subnet.id, ip_count)))
        for node in running_pending:
            if (node.alias in aliases):
                raise exception.ClusterValidationError(('node    with    alias    %s    already    exists' % node.alias))
        log.info(('Launching    node(s):    %s' % ',    '.join(aliases)))
        resp = self.create_nodes(aliases, image_id=image_id, instance_type=instance_type, zone=zone, placement_group=placement_group, spot_bid=spot_bid)
        if (spot_bid or self.spot_bid):
            self.ec2.wait_for_propagation(spot_requests=resp)
        else:
            self.ec2.wait_for_propagation(instances=resp[0].instances)
    self.wait_for_cluster(msg='Waiting    for    node(s)    to    come    up...')
    log.debug(('Adding    node(s):    %s' % aliases))
    for alias in aliases:
        node = self.get_node(alias)
        self.run_plugins(method_name='on_add_node', node=node)
