def set_state(self, want, have): """ Select the appropriate function based on the state provided :param want: the desired configuration as a dictionary :param have: the current configuration as a dictionary :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] state = self._module.params['state'] if state == 'overridden': commands.extend(self._state_overridden(want, have)) elif state == 'deleted': if want: for want_item in want: name = want_item['name'] obj_in_have = search_obj_in_list(name, have) commands.extend(self._state_deleted(obj_in_have)) else: for have_item in have: commands.extend(self._state_deleted(have_item)) else: for want_item in want: name = want_item['name'] obj_in_have = search_obj_in_list(name, have) if state == 'merged': commands.extend(self._state_merged(want_item, obj_in_have)) elif state == 'replaced': commands.extend( self._state_replaced(want_item, obj_in_have)) return commands
def set_state(self, want, have): """ Select the appropriate function based on the state provided :param want: the desired configuration as a dictionary :param have: the current configuration as a dictionary :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] state = self._module.params['state'] if state in ('merged', 'replaced', 'overridden') and not want: self._module.fail_json( msg='value of config parameter must not be empty for state {0}' .format(state)) if state == 'overridden': commands.extend(self._state_overridden(want=want, have=have)) elif state == 'deleted': if not want: for intf in have: commands.extend( self._state_deleted({'name': intf['name']}, intf)) else: for item in want: obj_in_have = search_obj_in_list(item['name'], have) commands.extend(self._state_deleted(item, obj_in_have)) else: for item in want: name = item['name'] obj_in_have = search_obj_in_list(name, have) if not obj_in_have: obj_in_have = {'name': item['name']} elif state == 'merged': commands.extend(self._state_merged(item, obj_in_have)) elif state == 'replaced': commands.extend(self._state_replaced(item, obj_in_have)) return commands
def _state_overridden(self, want, have): """ The command generator when state is overridden :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] for have_item in have: lag_name = have_item['name'] obj_in_want = search_obj_in_list(lag_name, want) if not obj_in_want: commands.extend(self._purge_attribs(have_item)) for want_item in want: name = want_item['name'] obj_in_have = search_obj_in_list(name, have) commands.extend(self._state_replaced(want_item, obj_in_have)) return commands
def _state_deleted(self, want, have): """ The command generator when state is deleted :rtype: A list :returns: the commands necessary to remove the current configuration of the provided objects """ commands = [] want_copy = deepcopy(remove_empties(want)) have_copy = deepcopy(have) want_vifs = want_copy.pop('vifs', []) have_vifs = have_copy.pop('vifs', []) for key in dict_delete(have_copy, want_copy).keys(): if key == 'enabled': continue commands.append( self._compute_commands(key=key, interface=want_copy['name'], remove=True)) if have_copy['enabled'] is False: commands.append( self._compute_commands(key='enabled', value=True, interface=want_copy['name'])) if have_vifs: for have_vif in have_vifs: want_vif = search_obj_in_list(have_vif['vlan_id'], want_vifs, key='vlan_id') if not want_vif: want_vif = { 'vlan_id': have_vif['vlan_id'], 'enabled': True } for key in dict_delete(have_vif, want_vif).keys(): if key == 'enabled': continue commands.append( self._compute_commands(key=key, interface=want_copy['name'], vif=want_vif['vlan_id'], remove=True)) if have_vif['enabled'] is False: commands.append( self._compute_commands(key='enabled', value=True, interface=want_copy['name'], vif=want_vif['vlan_id'])) return commands
def _state_overridden(self, want, have): """ The command generator when state is overridden :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] for have_item in have: lldp_name = have_item["name"] lldp_in_want = search_obj_in_list(lldp_name, want) if not lldp_in_want: commands.append( self._compute_command(have_item["name"], remove=True)) for want_item in want: name = want_item["name"] lldp_in_have = search_obj_in_list(name, have) commands.extend(self._state_replaced(want_item, lldp_in_have)) return commands
def _state_overridden(self, want, have): """ The command generator when state is overridden :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] for intf in have: intf_in_want = search_obj_in_list(intf['name'], want) if not intf_in_want: commands.extend( self._state_deleted({'name': intf['name']}, intf)) for intf in want: intf_in_have = search_obj_in_list(intf['name'], have) commands.extend(self._state_replaced(intf, intf_in_have)) return commands
def set_state(self, want, have): """ Select the appropriate function based on the state provided :param want: the desired configuration as a dictionary :param have: the current configuration as a dictionary :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] state = self._module.params["state"] if state in ("merged", "replaced", "overridden") and not want: self._module.fail_json( msg="value of config parameter must not be empty for state {0}" .format(state)) if state == "overridden": commands.extend(self._state_overridden(want=want, have=have)) elif state == "deleted": if want: for item in want: name = item["name"] have_item = search_obj_in_list(name, have) commands.extend( self._state_deleted(want=None, have=have_item)) else: for have_item in have: commands.extend( self._state_deleted(want=None, have=have_item)) else: for want_item in want: name = want_item["name"] have_item = search_obj_in_list(name, have) if state == "merged": commands.extend( self._state_merged(want=want_item, have=have_item)) else: commands.extend( self._state_replaced(want=want_item, have=have_item)) return commands
def set_state(self, want, have): """ Select the appropriate function based on the state provided :param want: the desired configuration as a dictionary :param have: the current configuration as a dictionary :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] state = self._module.params['state'] if state in ('merged', 'replaced', 'overridden') and not want: self._module.fail_json( msg='config is required for state {0}'.format(state)) if state == 'overridden': commands.extend(self._state_overridden(want=want, have=have)) elif state == 'deleted': if want: for item in want: name = item['name'] have_item = search_obj_in_list(name, have) commands.extend( self._state_deleted(want=None, have=have_item)) else: for have_item in have: commands.extend( self._state_deleted(want=None, have=have_item)) else: for want_item in want: name = want_item['name'] have_item = search_obj_in_list(name, have) if state == 'merged': commands.extend( self._state_merged(want=want_item, have=have_item)) else: commands.extend( self._state_replaced(want=want_item, have=have_item)) return commands
def _state_merged(self, want, have): """ The command generator when state is merged :rtype: A list :returns: the commands necessary to merge the provided into the current configuration """ commands = [] want_copy = deepcopy(remove_empties(want)) have_copy = deepcopy(have) want_vifs = want_copy.pop('vifs', []) have_vifs = have_copy.pop('vifs', []) updates = dict_diff(have_copy, want_copy) if updates: for key, value in iteritems(updates): commands.append( self._compute_commands(key=key, value=value, interface=want_copy['name'])) if want_vifs: for want_vif in want_vifs: have_vif = search_obj_in_list(want_vif['vlan_id'], have_vifs, key='vlan_id') if not have_vif: have_vif = { 'vlan_id': want_vif['vlan_id'], 'enabled': True } vif_updates = dict_diff(have_vif, want_vif) if vif_updates: for key, value in iteritems(vif_updates): commands.append( self._compute_commands(key=key, value=value, interface=want_copy['name'], vif=want_vif['vlan_id'])) return commands
def _state_deleted(self, want, have): """ The command generator when state is deleted :rtype: A list :returns: the commands necessary to remove the current configuration of the provided objects """ commands = [] want_copy = deepcopy(remove_empties(want)) have_copy = deepcopy(have) want_vifs = want_copy.pop('vifs', []) have_vifs = have_copy.pop('vifs', []) for update in self._get_updates(have_copy, want_copy): for key, value in iteritems(update): commands.append( self._compute_commands(key=key, value=value, interface=want_copy['name'], remove=True)) if have_vifs: for have_vif in have_vifs: want_vif = search_obj_in_list(have_vif['vlan_id'], want_vifs, key='vlan_id') if not want_vif: want_vif = {'vlan_id': have_vif['vlan_id']} for update in self._get_updates(have_vif, want_vif): for key, value in iteritems(update): commands.append( self._compute_commands(key=key, interface=want_copy['name'], value=value, vif=want_vif['vlan_id'], remove=True)) return commands