def get_update_pool_flow(self): """Create a flow to update a pool :returns: The flow for updating a pool """ update_pool_flow = linear_flow.Flow(constants.UPDATE_POOL_FLOW) update_pool_flow.add( lifecycle_tasks.PoolToErrorOnRevertTask(requires=[ constants.POOL, constants.LISTENERS, constants.LOADBALANCER ])) update_pool_flow.add( database_tasks.MarkPoolPendingUpdateInDB(requires=constants.POOL)) update_pool_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.POOL}, requires=[constants.UPDATE_DICT])) update_pool_flow.add( amphora_driver_tasks.ListenersUpdate( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_pool_flow.add( database_tasks.UpdatePoolInDB( requires=[constants.POOL, constants.UPDATE_DICT])) update_pool_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) update_pool_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) return update_pool_flow
def get_update_l7policy_flow(self): """Create a flow to update an L7 policy :returns: The flow for updating an L7 policy """ update_l7policy_flow = linear_flow.Flow(constants.UPDATE_L7POLICY_FLOW) update_l7policy_flow.add(lifecycle_tasks.L7PolicyToErrorOnRevertTask( requires=[constants.L7POLICY, constants.LISTENERS, constants.LOADBALANCER])) update_l7policy_flow.add(database_tasks.MarkL7PolicyPendingUpdateInDB( requires=constants.L7POLICY)) update_l7policy_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.L7POLICY}, requires=[constants.UPDATE_DICT])) update_l7policy_flow.add(amphora_driver_tasks.ListenersUpdate( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_l7policy_flow.add(database_tasks.UpdateL7PolicyInDB( requires=[constants.L7POLICY, constants.UPDATE_DICT])) update_l7policy_flow.add(database_tasks.MarkL7PolicyActiveInDB( requires=constants.L7POLICY)) update_l7policy_flow.add(database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) return update_l7policy_flow
def get_update_load_balancer_flow(self): """Creates a flow to update a load balancer. :returns: The flow for update a load balancer """ update_LB_flow = linear_flow.Flow(constants.UPDATE_LOADBALANCER_FLOW) update_LB_flow.add( lifecycle_tasks.LoadBalancerToErrorOnRevertTask( requires=constants.LOADBALANCER)) update_LB_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.LOADBALANCER}, requires=[constants.UPDATE_DICT])) update_LB_flow.add( network_tasks.ApplyQos(requires=(constants.LOADBALANCER, constants.UPDATE_DICT))) update_LB_flow.add( amphora_driver_tasks.ListenersUpdate( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_LB_flow.add( database_tasks.UpdateLoadbalancerInDB( requires=[constants.LOADBALANCER, constants.UPDATE_DICT])) update_LB_flow.add( database_tasks.MarkLBActiveInDB(requires=constants.LOADBALANCER)) return update_LB_flow
def test_update_listener(self): update_attr = model_tasks.UpdateAttributes() update_attr.execute(self.listener_mock, {'name': 'TEST2'}) assert self.listener_mock.name == 'TEST2'
def get_update_health_monitor_flow(self): """Create a flow to update a health monitor :returns: The flow for updating a health monitor """ update_hm_flow = linear_flow.Flow(constants.UPDATE_HEALTH_MONITOR_FLOW) update_hm_flow.add( lifecycle_tasks.HealthMonitorToErrorOnRevertTask(requires=[ constants.HEALTH_MON, constants.LISTENERS, constants.LOADBALANCER ])) update_hm_flow.add( database_tasks.MarkHealthMonitorPendingUpdateInDB( requires=constants.HEALTH_MON)) update_hm_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.HEALTH_MON}, requires=[constants.UPDATE_DICT])) update_hm_flow.add( amphora_driver_tasks.ListenersUpdate( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_hm_flow.add( database_tasks.UpdateHealthMonInDB( requires=[constants.HEALTH_MON, constants.UPDATE_DICT])) update_hm_flow.add( database_tasks.MarkHealthMonitorActiveInDB( requires=constants.HEALTH_MON)) update_hm_flow.add( database_tasks.MarkPoolActiveInDB(requires=constants.POOL)) update_hm_flow.add( database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) return update_hm_flow
def test_update_vip_during_update_loadbalancer(self, mock_vip): vip_object = o_data_models.Vip() lb_object = o_data_models.LoadBalancer(vip=vip_object) update_attr = model_tasks.UpdateAttributes() update_attr.execute(lb_object, { 'vip': { 'fool1': 'bar1' }, 'description': 'bar2' }) mock_vip.assert_called_once_with({'fool1': 'bar1'})
def get_update_l7rule_flow(self): """Create a flow to update an L7 rule :returns: The flow for updating an L7 rule """ update_l7rule_flow = linear_flow.Flow(constants.UPDATE_L7RULE_FLOW) update_l7rule_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.L7RULE}, requires=[constants.UPDATE_DICT])) update_l7rule_flow.add(amphora_driver_tasks.ListenersUpdate( requires=[constants.LOADBALANCER, constants.LISTENERS])) update_l7rule_flow.add(database_tasks.UpdateL7RuleInDB( requires=[constants.L7RULE, constants.UPDATE_DICT])) update_l7rule_flow.add(database_tasks.MarkLBAndListenersActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENERS])) return update_l7rule_flow
def get_update_listener_flow(self): """Create a flow to update a listener :returns: The flow for updating a listener """ update_listener_flow = linear_flow.Flow(constants.UPDATE_LISTENER_FLOW) update_listener_flow.add( model_tasks.UpdateAttributes( rebind={constants.OBJECT: constants.LISTENER}, requires=[constants.UPDATE_DICT])) update_listener_flow.add( amphora_driver_tasks.ListenerUpdate( requires=[constants.LISTENER, constants.VIP])) update_listener_flow.add( database_tasks.UpdateListenerInDB( requires=[constants.LISTENER, constants.UPDATE_DICT])) update_listener_flow.add( database_tasks.MarkLBAndListenerActiveInDB( requires=[constants.LOADBALANCER, constants.LISTENER])) return update_listener_flow
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
def test_update_listener(self): update_attr = model_tasks.UpdateAttributes() update_attr.execute(self.listener_mock, {'name': 'TEST2'}) self.listener_mock.update.assert_called_once_with({'name': 'TEST2'})
def test_update_listener(self): update_attr = model_tasks.UpdateAttributes() update_attr.execute(self.listener_mock, {'name': 'TEST2'}) self.assertEqual('TEST2', getattr(self.listener_mock, 'name'))