def check_declarative_intent_params(self):
        failed_conditions = []

        self._data_rate_meta.update([
            ('interfaces', {
                'xpath': 'infra-statistics/interfaces',
                'tag': True
            }),
            ('interface', {
                'xpath': 'infra-statistics/interfaces/interface',
                'tag': True
            }),
            ('a:name', {
                'xpath': 'infra-statistics/interfaces/interface/interface-name'
            }),
            ('cache', {
                'xpath': 'infra-statistics/interfaces/interface/cache',
                'tag': True
            }),
            ('data-rate', {
                'xpath':
                'infra-statistics/interfaces/interface/cache/data-rate',
                'tag': True
            }),
            ('input-data-rate', {
                'xpath':
                'infra-statistics/interfaces/interface/cache/data-rate/input-data-rate',
                'tag': True
            }),
            ('output-data-rate', {
                'xpath':
                'infra-statistics/interfaces/interface/cache/data-rate/output-data-rate',
                'tag': True
            }),
        ])

        self._line_state_meta.update([
            ('data-nodes', {
                'xpath': 'interface-properties/data-nodes',
                'tag': True
            }),
            ('data-node', {
                'xpath': 'interface-properties/data-nodes/data-node',
                'tag': True
            }),
            ('system-view', {
                'xpath':
                'interface-properties/data-nodes/data-node/system-view',
                'tag': True
            }),
            ('interfaces', {
                'xpath':
                'interface-properties/data-nodes/data-node/system-view/interfaces',
                'tag': True
            }),
            ('interface', {
                'xpath':
                'interface-properties/data-nodes/data-node/system-view/interfaces/interface',
                'tag': True
            }),
            ('a:name', {
                'xpath':
                'interface-properties/data-nodes/data-node/system-view/interfaces/interface/interface-name'
            }),
            ('line-state', {
                'xpath':
                'interface-properties/data-nodes/data-node/system-view/interfaces/interface/line-state',
                'tag': True
            }),
        ])

        _rate_filter = build_xml('infra-statistics',
                                 xmap=self._data_rate_meta,
                                 params=self._want,
                                 opcode="filter")
        out = get_oper(self._module, filter=_rate_filter)
        data_rate_list = etree_findall(out, 'interface')
        data_rate_map = dict()
        for item in data_rate_list:
            data_rate_map.update(
                {etree_find(item, 'interface-name').text: dict()})
            data_rate_map[etree_find(item, 'interface-name').text].update({
                'input-data-rate':
                etree_find(item, 'input-data-rate').text,
                'output-data-rate':
                etree_find(item, 'output-data-rate').text
            })

        _line_state_filter = build_xml('interface-properties',
                                       xmap=self._line_state_meta,
                                       params=self._want,
                                       opcode="filter")
        out = get_oper(self._module, filter=_line_state_filter)
        line_state_list = etree_findall(out, 'interface')
        line_state_map = dict()
        for item in line_state_list:
            line_state_map.update({
                etree_find(item, 'interface-name').text:
                etree_find(item, 'line-state').text
            })

        for want_item in self._want:
            want_state = want_item.get('state')
            want_tx_rate = want_item.get('tx_rate')
            want_rx_rate = want_item.get('rx_rate')
            if want_state not in (
                    'up', 'down') and not want_tx_rate and not want_rx_rate:
                continue

            if self._result['changed']:
                sleep(want_item['delay'])

            if want_state in ('up', 'down'):
                if want_state not in line_state_map[want_item['name']]:
                    failed_conditions.append('state ' +
                                             'eq({!s})'.format(want_state))

            if want_tx_rate:
                if want_tx_rate != data_rate_map[
                        want_item['name']]['output-data-rate']:
                    failed_conditions.append('tx_rate ' + want_tx_rate)

            if want_rx_rate:
                if want_rx_rate != data_rate_map[
                        want_item['name']]['input-data-rate']:
                    failed_conditions.append('rx_rate ' + want_rx_rate)

        if failed_conditions:
            msg = 'One or more conditional statements have not been satisfied'
            self._module.fail_json(msg=msg,
                                   failed_conditions=failed_conditions)
示例#2
0
    def check_declarative_intent_params(self):
        failed_conditions = []

        self._data_rate_meta.update([
            ('interfaces', {'xpath': 'infra-statistics/interfaces', 'tag': True}),
            ('interface', {'xpath': 'infra-statistics/interfaces/interface', 'tag': True}),
            ('a:name', {'xpath': 'infra-statistics/interfaces/interface/interface-name'}),
            ('cache', {'xpath': 'infra-statistics/interfaces/interface/cache', 'tag': True}),
            ('data-rate', {'xpath': 'infra-statistics/interfaces/interface/cache/data-rate', 'tag': True}),
            ('input-data-rate', {'xpath': 'infra-statistics/interfaces/interface/cache/data-rate/input-data-rate', 'tag': True}),
            ('output-data-rate', {'xpath': 'infra-statistics/interfaces/interface/cache/data-rate/output-data-rate', 'tag': True}),
        ])

        self._line_state_meta.update([
            ('data-nodes', {'xpath': 'interface-properties/data-nodes', 'tag': True}),
            ('data-node', {'xpath': 'interface-properties/data-nodes/data-node', 'tag': True}),
            ('system-view', {'xpath': 'interface-properties/data-nodes/data-node/system-view', 'tag': True}),
            ('interfaces', {'xpath': 'interface-properties/data-nodes/data-node/system-view/interfaces', 'tag': True}),
            ('interface', {'xpath': 'interface-properties/data-nodes/data-node/system-view/interfaces/interface', 'tag': True}),
            ('a:name', {'xpath': 'interface-properties/data-nodes/data-node/system-view/interfaces/interface/interface-name'}),
            ('line-state', {'xpath': 'interface-properties/data-nodes/data-node/system-view/interfaces/interface/line-state', 'tag': True}),
        ])

        _rate_filter = build_xml('infra-statistics', xmap=self._data_rate_meta, params=self._want, opcode="filter")
        out = get_oper(self._module, filter=_rate_filter)
        data_rate_list = etree_findall(out, 'interface')
        data_rate_map = dict()
        for item in data_rate_list:
            data_rate_map.update({etree_find(item, 'interface-name').text: dict()})
            data_rate_map[etree_find(item, 'interface-name').text].update({'input-data-rate': etree_find(item, 'input-data-rate').text,
                                                                           'output-data-rate': etree_find(item, 'output-data-rate').text})

        _line_state_filter = build_xml('interface-properties', xmap=self._line_state_meta, params=self._want, opcode="filter")
        out = get_oper(self._module, filter=_line_state_filter)
        line_state_list = etree_findall(out, 'interface')
        line_state_map = dict()
        for item in line_state_list:
            line_state_map.update({etree_find(item, 'interface-name').text: etree_find(item, 'line-state').text})

        for want_item in self._want:
            want_state = want_item.get('state')
            want_tx_rate = want_item.get('tx_rate')
            want_rx_rate = want_item.get('rx_rate')
            if want_state not in ('up', 'down') and not want_tx_rate and not want_rx_rate:
                continue

            if self._result['changed']:
                sleep(want_item['delay'])

            if want_state in ('up', 'down'):
                if want_state not in line_state_map[want_item['name']]:
                    failed_conditions.append('state ' + 'eq({!s})'.format(want_state))

            if want_tx_rate:
                if want_tx_rate != data_rate_map[want_item['name']]['output-data-rate']:
                    failed_conditions.append('tx_rate ' + want_tx_rate)

            if want_rx_rate:
                if want_rx_rate != data_rate_map[want_item['name']]['input-data-rate']:
                    failed_conditions.append('rx_rate ' + want_rx_rate)

        if failed_conditions:
            msg = 'One or more conditional statements have not been satisfied'
            self._module.fail_json(msg=msg, failed_conditions=failed_conditions)