Example #1
0
    def test_limits_for_cluster(self, p1, p2, p3):
        ng = [FakeNodeGroup(1, False, 0, 0, None, 'id1', [1, 2, 3])]
        quotas.check_cluster(FakeCluster(ng))

        with testtools.ExpectedException(exc.QuotaException):
            quotas.check_cluster(FakeCluster([FakeNodeGroup(
                1, False, 3, 3, None, 'id1', [1, 2, 3])]))

        ng = [FakeNodeGroup(1, False, 0, 0, None, 'id1', [1, 2, 3]),
              FakeNodeGroup(0, False, 0, 0, None, 'id1', [1, 2, 3])]
        quotas.check_scaling(FakeCluster(ng), {}, {ng[1].id: 1})

        with testtools.ExpectedException(exc.QuotaException):
            quotas.check_scaling(FakeCluster(ng), {}, {ng[1].id: 3})
Example #2
0
def scale_cluster(id, data):
    context.set_current_cluster_id(id)
    ctx = context.ctx()

    cluster = conductor.cluster_get(ctx, id)
    plugin = plugin_base.PLUGINS.get_plugin(cluster.plugin_name)
    existing_node_groups = data.get('resize_node_groups', [])
    additional_node_groups = data.get('add_node_groups', [])

    # the next map is the main object we will work with
    # to_be_enlarged : {node_group_id: desired_amount_of_instances}
    to_be_enlarged = {}
    node_group_instance_map = {}
    for ng in existing_node_groups:
        ng_id = g.find(cluster.node_groups, name=ng['name'])['id']
        to_be_enlarged.update({ng_id: ng['count']})
        if 'instances' in ng:
            node_group_instance_map.update({ng_id: ng['instances']})

    additional = construct_ngs_for_scaling(cluster, additional_node_groups)
    cluster = conductor.cluster_get(ctx, cluster)
    _add_ports_for_auto_sg(ctx, cluster, plugin)

    try:
        cluster = c_u.change_cluster_status(
            cluster, c_u.CLUSTER_STATUS_VALIDATING)
        quotas.check_scaling(cluster, to_be_enlarged, additional)
        plugin.recommend_configs(cluster, scaling=True)
        plugin.validate_scaling(cluster, to_be_enlarged, additional)
    except Exception as e:
        with excutils.save_and_reraise_exception():
            c_u.clean_cluster_from_empty_ng(cluster)
            c_u.change_cluster_status(
                cluster, c_u.CLUSTER_STATUS_ACTIVE, six.text_type(e))

    # If we are here validation is successful.
    # So let's update to_be_enlarged map:
    to_be_enlarged.update(additional)

    for node_group in cluster.node_groups:
        if node_group.id not in to_be_enlarged:
            to_be_enlarged[node_group.id] = node_group.count

    api.OPS.provision_scaled_cluster(id, to_be_enlarged,
                                     node_group_instance_map)
    return cluster