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 = [] if (self.state in ("merged", "replaced", "overridden", "rendered") and not want): self._module.fail_json( msg="value of config parameter must not be empty for state {0}" .format(self.state)) if self.state == "overridden": commands.extend(self._state_overridden(want=want, have=have)) elif self.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 self.state in ("merged", "rendered"): commands.extend( self._state_merged(want=want_item, have=have_item)) if self.state == "replaced": 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
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(remove_empties(have)) want_vifs = want_copy.pop('vifs', []) have_vifs = have_copy.pop('vifs', []) for update in self._get_updates(want_copy, have_copy): for key, value in iteritems(update): 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 = {} for update in self._get_updates(want_vif, have_vif): for key, value in iteritems(update): 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 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