def scale_cluster(cluster, node_group_names_map, plugin): # Now let's work with real node_groups, not names: node_groups_map = {} for ng in cluster.node_groups: if ng.name in node_group_names_map: node_groups_map.update({ng: node_group_names_map[ng.name]}) instances_list = [] try: instances_list = _scale_cluster_instances( cluster, node_groups_map, plugin) _clean_cluster_from_empty_ng(cluster) _await_instances(cluster) volumes.attach_to_instances(instances_list) except Exception as ex: LOG.warn("Can't scale cluster '%s' (reason: %s)", cluster.name, ex) with excutils.save_and_reraise_exception(): _rollback_cluster_scaling(cluster, instances_list, ex) instances_list = [] _clean_cluster_from_empty_ng(cluster) if cluster.status == 'Decommissioning': context.model_update(cluster, status='Error') else: context.model_update(cluster, status='Active') # we should be here with valid cluster: if instances creation # was not successful all extra-instances will be removed above if instances_list: _configure_instances(cluster) return instances_list
def test_attach(self, p_dev_path, p_create_attach_vol, p_await, p_mount): p_dev_path.return_value = '123' p_create_attach_vol.return_value = None p_await.return_value = None p_mount.return_value = None ng = m.NodeGroup(None, None, None, None, volumes_per_node=2, volumes_size=2) instance1 = m.Instance(None, None, '123') instance2 = m.Instance(None, None, '456') instance1.node_group_id = ng.id instance2.node_group_id = ng.id ng.instances.append(instance1) ng.instances.append(instance2) cluster = m.Cluster(None, None, None, None) cluster.node_groups.append(ng) volumes.attach(cluster) self.assertEqual(p_create_attach_vol.call_count, 4) self.assertEqual(p_await.call_count, 4) self.assertEqual(p_mount.call_count, 4) self.assertEqual(p_dev_path.call_count, 4) p_create_attach_vol.reset_mock() p_await.reset_mock() p_mount.reset_mock() p_dev_path.reset_mock() instances = [instance1, instance2] volumes.attach_to_instances(instances) self.assertEqual(p_create_attach_vol.call_count, 4) self.assertEqual(p_await.call_count, 4) self.assertEqual(p_mount.call_count, 4) self.assertEqual(p_dev_path.call_count, 4)
def scale_cluster(self, cluster, node_group_id_map): ctx = context.ctx() instance_ids = [] try: instance_ids = self._scale_cluster_instances(cluster, node_group_id_map) cluster = conductor.cluster_get(ctx, cluster) g.clean_cluster_from_empty_ng(cluster) cluster = conductor.cluster_get(ctx, cluster) instances = g.get_instances(cluster, instance_ids) self._await_active(cluster, instances) self._assign_floating_ips(instances) self._await_networks(cluster, instances) cluster = conductor.cluster_get(ctx, cluster) volumes.attach_to_instances( g.get_instances(cluster, instance_ids)) except Exception as ex: with excutils.save_and_reraise_exception(): self._log_operation_exception( "Can't scale cluster '%s' (reason: %s)", cluster, ex) cluster = conductor.cluster_get(ctx, cluster) self._rollback_cluster_scaling( cluster, g.get_instances(cluster, instance_ids), ex) instance_ids = [] cluster = conductor.cluster_get(ctx, cluster) g.clean_cluster_from_empty_ng(cluster) if cluster.status == 'Decommissioning': cluster = conductor.cluster_update(ctx, cluster, {"status": "Error"}) else: cluster = conductor.cluster_update(ctx, cluster, {"status": "Active"}) LOG.info(g.format_cluster_status(cluster)) # we should be here with valid cluster: if instances creation # was not successful all extra-instances will be removed above if instance_ids: self._configure_instances(cluster) return instance_ids
def scale_cluster(self, cluster, node_group_id_map): ctx = context.ctx() instance_ids = [] try: instance_ids = self._scale_cluster_instances( cluster, node_group_id_map) cluster = conductor.cluster_get(ctx, cluster) g.clean_cluster_from_empty_ng(cluster) cluster = conductor.cluster_get(ctx, cluster) instances = g.get_instances(cluster, instance_ids) self._await_active(cluster, instances) self._assign_floating_ips(instances) self._await_networks(cluster, instances) cluster = conductor.cluster_get(ctx, cluster) volumes.attach_to_instances(g.get_instances(cluster, instance_ids)) except Exception as ex: with excutils.save_and_reraise_exception(): self._log_operation_exception( "Can't scale cluster '%s' (reason: %s)", cluster, ex) cluster = conductor.cluster_get(ctx, cluster) self._rollback_cluster_scaling( cluster, g.get_instances(cluster, instance_ids), ex) instance_ids = [] cluster = conductor.cluster_get(ctx, cluster) g.clean_cluster_from_empty_ng(cluster) if cluster.status == 'Decommissioning': cluster = conductor.cluster_update(ctx, cluster, {"status": "Error"}) else: cluster = conductor.cluster_update(ctx, cluster, {"status": "Active"}) LOG.info(g.format_cluster_status(cluster)) # we should be here with valid cluster: if instances creation # was not successful all extra-instances will be removed above if instance_ids: self._configure_instances(cluster) return instance_ids
def scale_cluster(cluster, node_group_id_map, plugin): ctx = context.ctx() instances_list = [] try: instances_list = _scale_cluster_instances(cluster, node_group_id_map, plugin) cluster = conductor.cluster_get(ctx, cluster) cluster = clean_cluster_from_empty_ng(cluster) cluster = _await_instances(cluster) volumes.attach_to_instances(get_instances(cluster, instances_list)) except Exception as ex: LOG.warn("Can't scale cluster '%s' (reason: %s)", cluster.name, ex) with excutils.save_and_reraise_exception(): cluster = conductor.cluster_get(ctx, cluster) _rollback_cluster_scaling(cluster, get_instances(cluster, instances_list), ex) instances_list = [] cluster = conductor.cluster_get(ctx, cluster) clean_cluster_from_empty_ng(cluster) if cluster.status == 'Decommissioning': cluster = conductor.cluster_update(ctx, cluster, {"status": "Error"}) else: cluster = conductor.cluster_update(ctx, cluster, {"status": "Active"}) LOG.info(g.format_cluster_status(cluster)) # we should be here with valid cluster: if instances creation # was not successful all extra-instances will be removed above if instances_list: _configure_instances(cluster) return instances_list
def scale_cluster(cluster, node_group_id_map, plugin): ctx = context.ctx() instances_list = [] try: instances_list = _scale_cluster_instances( cluster, node_group_id_map, plugin) cluster = conductor.cluster_get(ctx, cluster) cluster = clean_cluster_from_empty_ng(cluster) cluster = _await_instances(cluster) volumes.attach_to_instances(get_instances(cluster, instances_list)) except Exception as ex: LOG.warn("Can't scale cluster '%s' (reason: %s)", cluster.name, ex) with excutils.save_and_reraise_exception(): cluster = conductor.cluster_get(ctx, cluster) _rollback_cluster_scaling(cluster, get_instances(cluster, instances_list), ex) instances_list = [] cluster = conductor.cluster_get(ctx, cluster) clean_cluster_from_empty_ng(cluster) if cluster.status == 'Decommissioning': cluster = conductor.cluster_update(ctx, cluster, {"status": "Error"}) else: cluster = conductor.cluster_update(ctx, cluster, {"status": "Active"}) LOG.info(g.format_cluster_status(cluster)) # we should be here with valid cluster: if instances creation # was not successful all extra-instances will be removed above if instances_list: _configure_instances(cluster) return instances_list
def test_attach(self, p_dev_path, p_create_attach_vol, p_await, p_mount): p_dev_path.return_value = '123' p_create_attach_vol.return_value = None p_await.return_value = None p_mount.return_value = None instance1 = {'instance_id': '123', 'instance_name': 'inst_1'} instance2 = {'instance_id': '456', 'instance_name': 'inst_2'} ng = {'volumes_per_node': 2, 'volumes_size': 2, 'volume_mount_prefix': '/mnt/vols', 'instances': [instance1, instance2]} cluster = r.ClusterResource({'node_groups': [ng]}) volumes.attach(cluster) self.assertEqual(p_create_attach_vol.call_count, 4) self.assertEqual(p_await.call_count, 4) self.assertEqual(p_mount.call_count, 4) self.assertEqual(p_dev_path.call_count, 4) p_create_attach_vol.reset_mock() p_await.reset_mock() p_mount.reset_mock() p_dev_path.reset_mock() instances = cluster.node_groups[0].instances volumes.attach_to_instances(instances) self.assertEqual(p_create_attach_vol.call_count, 4) self.assertEqual(p_await.call_count, 4) self.assertEqual(p_mount.call_count, 4) self.assertEqual(p_dev_path.call_count, 4)