Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
    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