def a4c_scale(ctx, node_id, delta, scale_compute, **kwargs): scaled_node = ctx.get_node(node_id) if not scaled_node: raise ValueError("Node {0} doesn't exist".format(node_id)) if not is_host_node(scaled_node): raise ValueError("Node {0} is not a host. This workflow can only scale hosts".format(node_id)) if delta == 0: ctx.logger.info('delta parameter is 0, so no scaling will take place.') return curr_num_instances = scaled_node.number_of_instances planned_num_instances = curr_num_instances + delta if planned_num_instances < 1: raise ValueError('Provided delta: {0} is illegal. current number of' 'instances of node {1} is {2}' .format(delta, node_id, curr_num_instances)) modification = ctx.deployment.start_modification({ scaled_node.id: { 'instances': planned_num_instances } }) ctx.logger.info( 'Deployment modification started. [modification_id={0} : {1}]'.format(modification.id, dir(modification))) try: if delta > 0: ctx.logger.info('Scaling host {0} adding {1} instances'.format(node_id, delta)) added_and_related = _get_all_nodes(modification.added) added = _get_all_modified_node_instances(added_and_related, 'added') graph = ctx.graph_mode() ctx.internal.send_workflow_event(event_type='a4c_workflow_started', message=build_pre_event(WfStartEvent('scale', 'install'))) custom_context = CustomContext(ctx, added, added_and_related) install_host(ctx, graph, custom_context, node_id) try: graph.execute() except: ctx.logger.error('Scale failed. Uninstalling node {0}'.format(node_id)) graph = ctx.internal.task_graph for task in graph.tasks_iter(): graph.remove_task(task) try: custom_context = CustomContext(ctx, added, added_and_related) uninstall_host(ctx, graph, custom_context, node_id) graph.execute() except: ctx.logger.error('Node {0} uninstallation following scale failure has failed'.format(node_id)) raise else: ctx.logger.info('Unscaling host {0} removing {1} instances'.format(node_id, delta)) removed_and_related = _get_all_nodes(modification.removed) removed = _get_all_modified_node_instances(removed_and_related, 'removed') graph = ctx.graph_mode() ctx.internal.send_workflow_event(event_type='a4c_workflow_started', message=build_pre_event(WfStartEvent('scale', 'uninstall'))) custom_context = CustomContext(ctx, removed, removed_and_related) uninstall_host(ctx, graph, custom_context, node_id) try: graph.execute() except: ctx.logger.error('Unscale failed.') raise except: ctx.logger.warn('Rolling back deployment modification. [modification_id={0}]'.format(modification.id)) try: modification.rollback() except: ctx.logger.warn('Deployment modification rollback failed. The ' 'deployment model is most likely in some corrupted' ' state.' '[modification_id={0}]'.format(modification.id)) raise raise else: try: modification.finish() except: ctx.logger.warn('Deployment modification finish failed. The ' 'deployment model is most likely in some corrupted' ' state.' '[modification_id={0}]'.format(modification.id)) raise
def a4c_scale(ctx, node_id, delta, scale_compute, **kwargs): scaled_node = ctx.get_node(node_id) if not scaled_node: raise ValueError("Node {0} doesn't exist".format(node_id)) if not is_host_node(scaled_node): raise ValueError( "Node {0} is not a host. This workflow can only scale hosts". format(node_id)) if delta == 0: ctx.logger.info('delta parameter is 0, so no scaling will take place.') return curr_num_instances = scaled_node.number_of_instances planned_num_instances = curr_num_instances + delta if planned_num_instances < 1: raise ValueError('Provided delta: {0} is illegal. current number of' 'instances of node {1} is {2}'.format( delta, node_id, curr_num_instances)) modification = ctx.deployment.start_modification( {scaled_node.id: { 'instances': planned_num_instances }}) ctx.logger.info( 'Deployment modification started. [modification_id={0} : {1}]'.format( modification.id, dir(modification))) try: if delta > 0: ctx.logger.info('Scaling host {0} adding {1} instances'.format( node_id, delta)) added_and_related = _get_all_nodes(modification.added) added = _get_all_modified_node_instances(added_and_related, 'added') graph = ctx.graph_mode() ctx.internal.send_workflow_event( event_type='a4c_workflow_started', message=build_pre_event(WfStartEvent('scale', 'install'))) custom_context = CustomContext(ctx, added, added_and_related) install_host(ctx, graph, custom_context, node_id) try: graph.execute() except: ctx.logger.error( 'Scale failed. Uninstalling node {0}'.format(node_id)) graph = ctx.internal.task_graph for task in graph.tasks_iter(): graph.remove_task(task) try: custom_context = CustomContext(ctx, added, added_and_related) uninstall_host(ctx, graph, custom_context, node_id) graph.execute() except: ctx.logger.error( 'Node {0} uninstallation following scale failure has failed' .format(node_id)) raise else: ctx.logger.info('Unscaling host {0} removing {1} instances'.format( node_id, delta)) removed_and_related = _get_all_nodes(modification.removed) removed = _get_all_modified_node_instances(removed_and_related, 'removed') graph = ctx.graph_mode() ctx.internal.send_workflow_event( event_type='a4c_workflow_started', message=build_pre_event(WfStartEvent('scale', 'uninstall'))) custom_context = CustomContext(ctx, removed, removed_and_related) uninstall_host(ctx, graph, custom_context, node_id) try: graph.execute() except: ctx.logger.error('Unscale failed.') raise except: ctx.logger.warn( 'Rolling back deployment modification. [modification_id={0}]'. format(modification.id)) try: modification.rollback() except: ctx.logger.warn('Deployment modification rollback failed. The ' 'deployment model is most likely in some corrupted' ' state.' '[modification_id={0}]'.format(modification.id)) raise raise else: try: modification.finish() except: ctx.logger.warn('Deployment modification finish failed. The ' 'deployment model is most likely in some corrupted' ' state.' '[modification_id={0}]'.format(modification.id)) raise