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
Ejemplo n.º 2
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 = []
        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
Ejemplo n.º 4
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
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 8
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 = []
        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
Ejemplo n.º 9
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
Ejemplo n.º 10
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