def get_update_member_flow(self): """Create a flow to update a member :returns: The flow for updating a member """ update_member_flow = linear_flow.Flow(constants.UPDATE_MEMBER_FLOW) update_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) update_member_flow.add( database_tasks.MarkMemberPendingUpdateInDB( requires=constants.MEMBER)) update_member_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.MEMBER}, requires=[constants.UPDATE_DICT])) update_member_flow.add( amphora_driver_tasks.ListenersUpdate( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_member_flow.add( database_tasks.UpdateMemberInDB( requires=[constants.MEMBER, constants.UPDATE_DICT])) update_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) update_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) update_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) return update_member_flow
def get_update_member_flow(self): """Flow to update a member :returns: The flow for updating a member """ update_member_flow = linear_flow.Flow(constants.UPDATE_MEMBER_FLOW) update_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) update_member_flow.add( database_tasks.MarkMemberPendingUpdateInDB( requires=constants.MEMBER)) update_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) update_member_flow.add( server_tasks.MemberUpdate(requires=(constants.MEMBER, a10constants.VTHUNDER))) update_member_flow.add( database_tasks.UpdateMemberInDB( requires=[constants.MEMBER, constants.UPDATE_DICT])) update_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) update_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) update_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_member_flow.add( vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER)) return update_member_flow
def get_rack_vthunder_update_member_flow(self): """Flow to update a member in Thunder devices :returns: The flow for updating a member """ update_member_flow = linear_flow.Flow(constants.UPDATE_MEMBER_FLOW) update_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) update_member_flow.add( database_tasks.MarkMemberPendingUpdateInDB( requires=constants.MEMBER)) update_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) update_member_flow.add( vthunder_tasks.SetupDeviceNetworkMap( requires=a10constants.VTHUNDER, provides=a10constants.VTHUNDER)) # Handle VRID settings update_member_flow.add(self.handle_vrid_for_member_subflow()) update_member_flow.add( a10_database_tasks.GetFlavorData( rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER}, provides=constants.FLAVOR)) update_member_flow.add( server_tasks.MemberUpdate(requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL, constants.FLAVOR))) update_member_flow.add( database_tasks.UpdateMemberInDB( requires=[constants.MEMBER, constants.UPDATE_DICT])) if CONF.a10_global.network_type == 'vlan': update_member_flow.add( vthunder_tasks.TagInterfaceForMember( requires=[constants.MEMBER, a10constants.VTHUNDER])) update_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) update_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) update_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_member_flow.add( vthunder_tasks.WriteMemory(requires=a10constants.VTHUNDER)) update_member_flow.add( a10_database_tasks.SetThunderUpdatedAt( requires=a10constants.VTHUNDER)) return update_member_flow
def get_update_member_flow(self): """Create a flow to update a member :returns: The flow for updating a member """ update_member_flow = linear_flow.Flow(constants.UPDATE_MEMBER_FLOW) update_member_flow.add( lifecycle_tasks.MemberToErrorOnRevertTask(requires=[ constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL ])) update_member_flow.add( database_tasks.MarkMemberPendingUpdateInDB( requires=constants.MEMBER)) update_member_flow.add( a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) # Handle VRID settings update_member_flow.add( a10_database_tasks.GetVRIDForProjectMember( requires=constants.MEMBER, provides=a10constants.VRID)) update_member_flow.add( a10_network_tasks.HandleVRIDFloatingIP(requires=[ constants.MEMBER, a10constants.VTHUNDER, a10constants.VRID ], provides=a10constants.PORT)) update_member_flow.add( a10_database_tasks.UpdateVRIDForProjectMember(requires=[ constants.MEMBER, a10constants.VRID, a10constants.PORT ])) update_member_flow.add( server_tasks.MemberUpdate(requires=(constants.MEMBER, a10constants.VTHUNDER))) update_member_flow.add( database_tasks.UpdateMemberInDB( requires=[constants.MEMBER, constants.UPDATE_DICT])) update_member_flow.add( database_tasks.MarkMemberActiveInDB(requires=constants.MEMBER)) update_member_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) update_member_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) return update_member_flow
def get_update_member_flow(self, topology): """Flow to update a member :returns: The flow for updating a member """ update_member_flow = linear_flow.Flow(constants.UPDATE_MEMBER_FLOW) update_member_flow.add(lifecycle_tasks.MemberToErrorOnRevertTask( requires=[constants.MEMBER, constants.LISTENERS, constants.LOADBALANCER, constants.POOL])) update_member_flow.add(vthunder_tasks.VthunderInstanceBusy( requires=a10constants.COMPUTE_BUSY)) update_member_flow.add(database_tasks.MarkMemberPendingUpdateInDB( requires=constants.MEMBER)) update_member_flow.add(a10_database_tasks.GetVThunderByLoadBalancer( requires=constants.LOADBALANCER, provides=a10constants.VTHUNDER)) if topology == constants.TOPOLOGY_ACTIVE_STANDBY: update_member_flow.add(vthunder_tasks.GetMasterVThunder( name=a10constants.GET_MASTER_VTHUNDER, requires=a10constants.VTHUNDER, provides=a10constants.VTHUNDER)) update_member_flow.add(self.handle_vrid_for_member_subflow()) update_member_flow.add(a10_database_tasks.GetFlavorData( rebind={a10constants.LB_RESOURCE: constants.LOADBALANCER}, provides=constants.FLAVOR)) update_member_flow.add(server_tasks.MemberUpdate( requires=(constants.MEMBER, a10constants.VTHUNDER, constants.POOL, constants.FLAVOR))) update_member_flow.add(database_tasks.UpdateMemberInDB( requires=[constants.MEMBER, constants.UPDATE_DICT])) update_member_flow.add(database_tasks.MarkMemberActiveInDB( requires=constants.MEMBER)) update_member_flow.add(database_tasks.MarkPoolActiveInDB( requires=constants.POOL)) update_member_flow.add(database_tasks. MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_member_flow.add(vthunder_tasks.WriteMemory( requires=a10constants.VTHUNDER)) update_member_flow.add(a10_database_tasks.SetThunderUpdatedAt( requires=a10constants.VTHUNDER)) return update_member_flow
def get_update_member_flow(self): """Create a flow to update a member :returns: The flow for updating a member """ update_member_flow = linear_flow.Flow(constants.UPDATE_MEMBER_FLOW) update_member_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.MEMBER}, requires=[constants.UPDATE_DICT])) update_member_flow.add( amphora_driver_tasks.ListenerUpdate( requires=[constants.LISTENER, constants.VIP])) update_member_flow.add( database_tasks.UpdateMemberInDB( requires=[constants.MEMBER, constants.UPDATE_DICT])) update_member_flow.add( database_tasks.MarkLBAndListenerActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENER])) return update_member_flow
def test_update_member_in_db( self, mock_member_repo_update, mock_generate_uuid, mock_LOG, mock_get_session, mock_loadbalancer_repo_update, mock_listener_repo_update, mock_amphora_repo_update, mock_amphora_repo_delete): update_member = database_tasks.UpdateMemberInDB() update_member.execute(self.member_mock, { 'weight': 1, 'ip_address': '10.1.0.0' }) repo.MemberRepository.update.assert_called_once_with( 'TEST', MEMBER_ID, weight=1, ip_address='10.1.0.0') # Test the revert mock_member_repo_update.reset_mock() update_member.revert(self.member_mock) # TODO(johnsom) fix this to set the upper ojects to ERROR repo.MemberRepository.update.assert_called_once_with('TEST', MEMBER_ID, enabled=0)
def get_batch_update_members_flow(self, old_members, new_members, updated_members): """Create a flow to batch update members :returns: The flow for batch updating members """ batch_update_members_flow = linear_flow.Flow( constants.BATCH_UPDATE_MEMBERS_FLOW) unordered_members_flow = unordered_flow.Flow( constants.UNORDERED_MEMBER_UPDATES_FLOW) unordered_members_active_flow = unordered_flow.Flow( constants.UNORDERED_MEMBER_ACTIVE_FLOW) # Delete old members unordered_members_flow.add( lifecycle_tasks.MembersToErrorOnRevertTask( inject={constants.MEMBERS: old_members}, name='{flow}-deleted'.format( flow=constants.MEMBER_TO_ERROR_ON_REVERT_FLOW))) for m in old_members: unordered_members_flow.add( model_tasks.DeleteModelObject( inject={constants.OBJECT: m}, name='{flow}-{id}'.format( id=m.id, flow=constants.DELETE_MODEL_OBJECT_FLOW))) unordered_members_flow.add( database_tasks.DeleteMemberInDB( inject={constants.MEMBER: m}, name='{flow}-{id}'.format( id=m.id, flow=constants.DELETE_MEMBER_INDB))) unordered_members_flow.add( database_tasks.DecrementMemberQuota( inject={constants.MEMBER: m}, name='{flow}-{id}'.format( id=m.id, flow=constants.DECREMENT_MEMBER_QUOTA_FLOW))) # Create new members unordered_members_flow.add( lifecycle_tasks.MembersToErrorOnRevertTask( inject={constants.MEMBERS: new_members}, name='{flow}-created'.format( flow=constants.MEMBER_TO_ERROR_ON_REVERT_FLOW))) for m in new_members: unordered_members_active_flow.add( database_tasks.MarkMemberActiveInDB( inject={constants.MEMBER: m}, name='{flow}-{id}'.format( id=m.id, flow=constants.MARK_MEMBER_ACTIVE_INDB))) # Update existing members unordered_members_flow.add( lifecycle_tasks.MembersToErrorOnRevertTask( # updated_members is a list of (obj, dict), only pass `obj` inject={constants.MEMBERS: [m[0] for m in updated_members]}, name='{flow}-updated'.format( flow=constants.MEMBER_TO_ERROR_ON_REVERT_FLOW))) for m, um in updated_members: um.pop('id', None) unordered_members_flow.add( model_tasks.UpdateAttributes( inject={ constants.OBJECT: m, constants.UPDATE_DICT: um }, name='{flow}-{id}'.format( id=m.id, flow=constants.UPDATE_ATTRIBUTES_FLOW))) unordered_members_flow.add( database_tasks.UpdateMemberInDB( inject={ constants.MEMBER: m, constants.UPDATE_DICT: um }, name='{flow}-{id}'.format( id=m.id, flow=constants.UPDATE_MEMBER_INDB))) unordered_members_active_flow.add( database_tasks.MarkMemberActiveInDB( inject={constants.MEMBER: m}, name='{flow}-{id}'.format( id=m.id, flow=constants.MARK_MEMBER_ACTIVE_INDB))) batch_update_members_flow.add(unordered_members_flow) # Done, do real updates batch_update_members_flow.add( network_tasks.CalculateDelta(requires=constants.LOADBALANCER, provides=constants.DELTAS)) batch_update_members_flow.add( network_tasks.HandleNetworkDeltas(requires=constants.DELTAS, provides=constants.ADDED_PORTS)) batch_update_members_flow.add( amphora_driver_tasks.AmphoraePostNetworkPlug( requires=(constants.LOADBALANCER, constants.ADDED_PORTS))) # Update the Listener (this makes the changes active on the Amp) batch_update_members_flow.add( amphora_driver_tasks.ListenersUpdate( requires=(constants.LOADBALANCER, constants.LISTENERS))) # Mark all the members ACTIVE here, then pool then LB/Listeners batch_update_members_flow.add(unordered_members_active_flow) batch_update_members_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) batch_update_members_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=(constants.LOADBALANCER, constants.LISTENERS))) return batch_update_members_flow