1#!/usr/local/bin/python3.8 2from __future__ import (absolute_import, division, print_function) 3# Copyright 2019-2020 Fortinet, Inc. 4# 5# This program is free software: you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation, either version 3 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program. If not, see <https://www.gnu.org/licenses/>. 17 18__metaclass__ = type 19 20ANSIBLE_METADATA = {'status': ['preview'], 21 'supported_by': 'community', 22 'metadata_version': '1.1'} 23 24DOCUMENTATION = ''' 25--- 26module: fortios_switch_controller_qos_dot1p_map 27short_description: Configure FortiSwitch QoS 802.1p in Fortinet's FortiOS and FortiGate. 28description: 29 - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the 30 user to set and modify switch_controller_qos feature and dot1p_map category. 31 Examples include all parameters and values need to be adjusted to datasources before usage. 32 Tested with FOS v6.0.0 33version_added: "2.10" 34author: 35 - Link Zheng (@chillancezen) 36 - Jie Xue (@JieX19) 37 - Hongbin Lu (@fgtdev-hblu) 38 - Frank Shen (@frankshen01) 39 - Miguel Angel Munoz (@mamunozgonzalez) 40 - Nicolas Thomas (@thomnico) 41notes: 42 - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks 43 44requirements: 45 - ansible>=2.9.0 46options: 47 access_token: 48 description: 49 - Token-based authentication. 50 Generated from GUI of Fortigate. 51 type: str 52 required: false 53 enable_log: 54 description: 55 - Enable/Disable logging for task. 56 type: bool 57 required: false 58 default: false 59 vdom: 60 description: 61 - Virtual domain, among those defined previously. A vdom is a 62 virtual instance of the FortiGate that can be configured and 63 used as a different unit. 64 type: str 65 default: root 66 67 state: 68 description: 69 - Indicates whether to create or remove the object. 70 type: str 71 required: true 72 choices: 73 - present 74 - absent 75 switch_controller_qos_dot1p_map: 76 description: 77 - Configure FortiSwitch QoS 802.1p. 78 default: null 79 type: dict 80 suboptions: 81 description: 82 description: 83 - Description of the 802.1p name. 84 type: str 85 egress_pri_tagging: 86 description: 87 - Enable/disable egress priority-tag frame. 88 type: str 89 choices: 90 - disable 91 - enable 92 name: 93 description: 94 - Dot1p map name. 95 required: true 96 type: str 97 priority_0: 98 description: 99 - COS queue mapped to dot1p priority number. 100 type: str 101 choices: 102 - queue-0 103 - queue-1 104 - queue-2 105 - queue-3 106 - queue-4 107 - queue-5 108 - queue-6 109 - queue-7 110 priority_1: 111 description: 112 - COS queue mapped to dot1p priority number. 113 type: str 114 choices: 115 - queue-0 116 - queue-1 117 - queue-2 118 - queue-3 119 - queue-4 120 - queue-5 121 - queue-6 122 - queue-7 123 priority_2: 124 description: 125 - COS queue mapped to dot1p priority number. 126 type: str 127 choices: 128 - queue-0 129 - queue-1 130 - queue-2 131 - queue-3 132 - queue-4 133 - queue-5 134 - queue-6 135 - queue-7 136 priority_3: 137 description: 138 - COS queue mapped to dot1p priority number. 139 type: str 140 choices: 141 - queue-0 142 - queue-1 143 - queue-2 144 - queue-3 145 - queue-4 146 - queue-5 147 - queue-6 148 - queue-7 149 priority_4: 150 description: 151 - COS queue mapped to dot1p priority number. 152 type: str 153 choices: 154 - queue-0 155 - queue-1 156 - queue-2 157 - queue-3 158 - queue-4 159 - queue-5 160 - queue-6 161 - queue-7 162 priority_5: 163 description: 164 - COS queue mapped to dot1p priority number. 165 type: str 166 choices: 167 - queue-0 168 - queue-1 169 - queue-2 170 - queue-3 171 - queue-4 172 - queue-5 173 - queue-6 174 - queue-7 175 priority_6: 176 description: 177 - COS queue mapped to dot1p priority number. 178 type: str 179 choices: 180 - queue-0 181 - queue-1 182 - queue-2 183 - queue-3 184 - queue-4 185 - queue-5 186 - queue-6 187 - queue-7 188 priority_7: 189 description: 190 - COS queue mapped to dot1p priority number. 191 type: str 192 choices: 193 - queue-0 194 - queue-1 195 - queue-2 196 - queue-3 197 - queue-4 198 - queue-5 199 - queue-6 200 - queue-7 201''' 202 203EXAMPLES = ''' 204- hosts: fortigates 205 collections: 206 - fortinet.fortios 207 connection: httpapi 208 vars: 209 vdom: "root" 210 ansible_httpapi_use_ssl: yes 211 ansible_httpapi_validate_certs: no 212 ansible_httpapi_port: 443 213 tasks: 214 - name: Configure FortiSwitch QoS 802.1p. 215 fortios_switch_controller_qos_dot1p_map: 216 vdom: "{{ vdom }}" 217 state: "present" 218 access_token: "<your_own_value>" 219 switch_controller_qos_dot1p_map: 220 description: "<your_own_value>" 221 egress_pri_tagging: "disable" 222 name: "default_name_5" 223 priority_0: "queue-0" 224 priority_1: "queue-0" 225 priority_2: "queue-0" 226 priority_3: "queue-0" 227 priority_4: "queue-0" 228 priority_5: "queue-0" 229 priority_6: "queue-0" 230 priority_7: "queue-0" 231 232''' 233 234RETURN = ''' 235build: 236 description: Build number of the fortigate image 237 returned: always 238 type: str 239 sample: '1547' 240http_method: 241 description: Last method used to provision the content into FortiGate 242 returned: always 243 type: str 244 sample: 'PUT' 245http_status: 246 description: Last result given by FortiGate on last operation applied 247 returned: always 248 type: str 249 sample: "200" 250mkey: 251 description: Master key (id) used in the last call to FortiGate 252 returned: success 253 type: str 254 sample: "id" 255name: 256 description: Name of the table used to fulfill the request 257 returned: always 258 type: str 259 sample: "urlfilter" 260path: 261 description: Path of the table used to fulfill the request 262 returned: always 263 type: str 264 sample: "webfilter" 265revision: 266 description: Internal revision number 267 returned: always 268 type: str 269 sample: "17.0.2.10658" 270serial: 271 description: Serial number of the unit 272 returned: always 273 type: str 274 sample: "FGVMEVYYQT3AB5352" 275status: 276 description: Indication of the operation's result 277 returned: always 278 type: str 279 sample: "success" 280vdom: 281 description: Virtual domain used 282 returned: always 283 type: str 284 sample: "root" 285version: 286 description: Version of the FortiGate 287 returned: always 288 type: str 289 sample: "v5.6.3" 290 291''' 292from ansible.module_utils.basic import AnsibleModule 293from ansible.module_utils.connection import Connection 294from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import FortiOSHandler 295from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_legacy_fortiosapi 296from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import schema_to_module_spec 297from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_schema_versioning 298from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import FAIL_SOCKET_MSG 299from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import is_same_comparison 300from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import serialize 301 302 303def filter_switch_controller_qos_dot1p_map_data(json): 304 option_list = ['description', 'egress_pri_tagging', 'name', 305 'priority_0', 'priority_1', 'priority_2', 306 'priority_3', 'priority_4', 'priority_5', 307 'priority_6', 'priority_7'] 308 dictionary = {} 309 310 for attribute in option_list: 311 if attribute in json and json[attribute] is not None: 312 dictionary[attribute] = json[attribute] 313 314 return dictionary 315 316 317def underscore_to_hyphen(data): 318 if isinstance(data, list): 319 for i, elem in enumerate(data): 320 data[i] = underscore_to_hyphen(elem) 321 elif isinstance(data, dict): 322 new_data = {} 323 for k, v in data.items(): 324 new_data[k.replace('_', '-')] = underscore_to_hyphen(v) 325 data = new_data 326 327 return data 328 329 330def switch_controller_qos_dot1p_map(data, fos, check_mode=False): 331 332 vdom = data['vdom'] 333 334 state = data['state'] 335 336 switch_controller_qos_dot1p_map_data = data['switch_controller_qos_dot1p_map'] 337 filtered_data = underscore_to_hyphen(filter_switch_controller_qos_dot1p_map_data(switch_controller_qos_dot1p_map_data)) 338 339 # check_mode starts from here 340 if check_mode: 341 mkey = fos.get_mkey('system', 'interface', filtered_data, vdom=vdom) 342 current_data = fos.get('system', 'interface', vdom=vdom, mkey=mkey) 343 is_existed = current_data and current_data.get('http_status') == 200 \ 344 and isinstance(current_data.get('results'), list) \ 345 and len(current_data['results']) > 0 346 347 # 2. if it exists and the state is 'present' then compare current settings with desired 348 if state == 'present' or state is True: 349 if mkey is None: 350 return False, True, filtered_data 351 352 # if mkey exists then compare each other 353 # record exits and they're matched or not 354 if is_existed: 355 is_same = is_same_comparison( 356 serialize(current_data['results'][0]), serialize(filtered_data)) 357 return False, not is_same, filtered_data 358 359 # record does not exist 360 return False, True, filtered_data 361 362 if state == 'absent': 363 if mkey is None: 364 return False, False, filtered_data 365 366 if is_existed: 367 return False, True, filtered_data 368 return False, False, filtered_data 369 370 return True, False, {'reason: ': 'Must provide state parameter'} 371 372 if state == "present" or state is True: 373 return fos.set('switch-controller.qos', 374 'dot1p-map', 375 data=filtered_data, 376 vdom=vdom) 377 378 elif state == "absent": 379 return fos.delete('switch-controller.qos', 380 'dot1p-map', 381 mkey=filtered_data['name'], 382 vdom=vdom) 383 else: 384 fos._module.fail_json(msg='state must be present or absent!') 385 386 387def is_successful_status(status): 388 return status['status'] == "success" or \ 389 status['http_method'] == "DELETE" and status['http_status'] == 404 390 391 392def fortios_switch_controller_qos(data, fos, check_mode): 393 394 if data['switch_controller_qos_dot1p_map']: 395 resp = switch_controller_qos_dot1p_map(data, fos, check_mode) 396 else: 397 fos._module.fail_json(msg='missing task body: %s' % ('switch_controller_qos_dot1p_map')) 398 if check_mode: 399 return resp 400 return not is_successful_status(resp), \ 401 resp['status'] == "success" and \ 402 (resp['revision_changed'] if 'revision_changed' in resp else True), \ 403 resp 404 405 406versioned_schema = { 407 "type": "list", 408 "children": { 409 "name": { 410 "type": "string", 411 "revisions": { 412 "v6.0.0": True, 413 "v7.0.0": True, 414 "v6.0.5": True, 415 "v6.4.4": True, 416 "v6.4.0": True, 417 "v6.4.1": True, 418 "v6.2.0": True, 419 "v6.2.3": True, 420 "v6.2.5": True, 421 "v6.2.7": True, 422 "v6.0.11": True 423 } 424 }, 425 "description": { 426 "type": "string", 427 "revisions": { 428 "v6.0.0": True, 429 "v7.0.0": True, 430 "v6.0.5": True, 431 "v6.4.4": True, 432 "v6.4.0": True, 433 "v6.4.1": True, 434 "v6.2.0": True, 435 "v6.2.3": True, 436 "v6.2.5": True, 437 "v6.2.7": True, 438 "v6.0.11": True 439 } 440 }, 441 "egress_pri_tagging": { 442 "type": "string", 443 "options": [ 444 { 445 "value": "disable", 446 "revisions": { 447 "v7.0.0": True, 448 "v6.4.4": True, 449 "v6.4.0": True, 450 "v6.4.1": True, 451 "v6.2.0": True, 452 "v6.2.3": True, 453 "v6.2.5": True, 454 "v6.2.7": True 455 } 456 }, 457 { 458 "value": "enable", 459 "revisions": { 460 "v7.0.0": True, 461 "v6.4.4": True, 462 "v6.4.0": True, 463 "v6.4.1": True, 464 "v6.2.0": True, 465 "v6.2.3": True, 466 "v6.2.5": True, 467 "v6.2.7": True 468 } 469 } 470 ], 471 "revisions": { 472 "v7.0.0": True, 473 "v6.4.4": True, 474 "v6.4.0": True, 475 "v6.4.1": True, 476 "v6.2.0": True, 477 "v6.2.3": True, 478 "v6.2.5": True, 479 "v6.2.7": True 480 } 481 }, 482 "priority_7": { 483 "type": "string", 484 "options": [ 485 { 486 "value": "queue-0", 487 "revisions": { 488 "v6.0.0": True, 489 "v7.0.0": True, 490 "v6.0.5": True, 491 "v6.4.4": True, 492 "v6.4.0": True, 493 "v6.4.1": True, 494 "v6.2.0": True, 495 "v6.2.3": True, 496 "v6.2.5": True, 497 "v6.2.7": True, 498 "v6.0.11": True 499 } 500 }, 501 { 502 "value": "queue-1", 503 "revisions": { 504 "v6.0.0": True, 505 "v7.0.0": True, 506 "v6.0.5": True, 507 "v6.4.4": True, 508 "v6.4.0": True, 509 "v6.4.1": True, 510 "v6.2.0": True, 511 "v6.2.3": True, 512 "v6.2.5": True, 513 "v6.2.7": True, 514 "v6.0.11": True 515 } 516 }, 517 { 518 "value": "queue-2", 519 "revisions": { 520 "v6.0.0": True, 521 "v7.0.0": True, 522 "v6.0.5": True, 523 "v6.4.4": True, 524 "v6.4.0": True, 525 "v6.4.1": True, 526 "v6.2.0": True, 527 "v6.2.3": True, 528 "v6.2.5": True, 529 "v6.2.7": True, 530 "v6.0.11": True 531 } 532 }, 533 { 534 "value": "queue-3", 535 "revisions": { 536 "v6.0.0": True, 537 "v7.0.0": True, 538 "v6.0.5": True, 539 "v6.4.4": True, 540 "v6.4.0": True, 541 "v6.4.1": True, 542 "v6.2.0": True, 543 "v6.2.3": True, 544 "v6.2.5": True, 545 "v6.2.7": True, 546 "v6.0.11": True 547 } 548 }, 549 { 550 "value": "queue-4", 551 "revisions": { 552 "v6.0.0": True, 553 "v7.0.0": True, 554 "v6.0.5": True, 555 "v6.4.4": True, 556 "v6.4.0": True, 557 "v6.4.1": True, 558 "v6.2.0": True, 559 "v6.2.3": True, 560 "v6.2.5": True, 561 "v6.2.7": True, 562 "v6.0.11": True 563 } 564 }, 565 { 566 "value": "queue-5", 567 "revisions": { 568 "v6.0.0": True, 569 "v7.0.0": True, 570 "v6.0.5": True, 571 "v6.4.4": True, 572 "v6.4.0": True, 573 "v6.4.1": True, 574 "v6.2.0": True, 575 "v6.2.3": True, 576 "v6.2.5": True, 577 "v6.2.7": True, 578 "v6.0.11": True 579 } 580 }, 581 { 582 "value": "queue-6", 583 "revisions": { 584 "v6.0.0": True, 585 "v7.0.0": True, 586 "v6.0.5": True, 587 "v6.4.4": True, 588 "v6.4.0": True, 589 "v6.4.1": True, 590 "v6.2.0": True, 591 "v6.2.3": True, 592 "v6.2.5": True, 593 "v6.2.7": True, 594 "v6.0.11": True 595 } 596 }, 597 { 598 "value": "queue-7", 599 "revisions": { 600 "v6.0.0": True, 601 "v7.0.0": True, 602 "v6.0.5": True, 603 "v6.4.4": True, 604 "v6.4.0": True, 605 "v6.4.1": True, 606 "v6.2.0": True, 607 "v6.2.3": True, 608 "v6.2.5": True, 609 "v6.2.7": True, 610 "v6.0.11": True 611 } 612 } 613 ], 614 "revisions": { 615 "v6.0.0": True, 616 "v7.0.0": True, 617 "v6.0.5": True, 618 "v6.4.4": True, 619 "v6.4.0": True, 620 "v6.4.1": True, 621 "v6.2.0": True, 622 "v6.2.3": True, 623 "v6.2.5": True, 624 "v6.2.7": True, 625 "v6.0.11": True 626 } 627 }, 628 "priority_6": { 629 "type": "string", 630 "options": [ 631 { 632 "value": "queue-0", 633 "revisions": { 634 "v6.0.0": True, 635 "v7.0.0": True, 636 "v6.0.5": True, 637 "v6.4.4": True, 638 "v6.4.0": True, 639 "v6.4.1": True, 640 "v6.2.0": True, 641 "v6.2.3": True, 642 "v6.2.5": True, 643 "v6.2.7": True, 644 "v6.0.11": True 645 } 646 }, 647 { 648 "value": "queue-1", 649 "revisions": { 650 "v6.0.0": True, 651 "v7.0.0": True, 652 "v6.0.5": True, 653 "v6.4.4": True, 654 "v6.4.0": True, 655 "v6.4.1": True, 656 "v6.2.0": True, 657 "v6.2.3": True, 658 "v6.2.5": True, 659 "v6.2.7": True, 660 "v6.0.11": True 661 } 662 }, 663 { 664 "value": "queue-2", 665 "revisions": { 666 "v6.0.0": True, 667 "v7.0.0": True, 668 "v6.0.5": True, 669 "v6.4.4": True, 670 "v6.4.0": True, 671 "v6.4.1": True, 672 "v6.2.0": True, 673 "v6.2.3": True, 674 "v6.2.5": True, 675 "v6.2.7": True, 676 "v6.0.11": True 677 } 678 }, 679 { 680 "value": "queue-3", 681 "revisions": { 682 "v6.0.0": True, 683 "v7.0.0": True, 684 "v6.0.5": True, 685 "v6.4.4": True, 686 "v6.4.0": True, 687 "v6.4.1": True, 688 "v6.2.0": True, 689 "v6.2.3": True, 690 "v6.2.5": True, 691 "v6.2.7": True, 692 "v6.0.11": True 693 } 694 }, 695 { 696 "value": "queue-4", 697 "revisions": { 698 "v6.0.0": True, 699 "v7.0.0": True, 700 "v6.0.5": True, 701 "v6.4.4": True, 702 "v6.4.0": True, 703 "v6.4.1": True, 704 "v6.2.0": True, 705 "v6.2.3": True, 706 "v6.2.5": True, 707 "v6.2.7": True, 708 "v6.0.11": True 709 } 710 }, 711 { 712 "value": "queue-5", 713 "revisions": { 714 "v6.0.0": True, 715 "v7.0.0": True, 716 "v6.0.5": True, 717 "v6.4.4": True, 718 "v6.4.0": True, 719 "v6.4.1": True, 720 "v6.2.0": True, 721 "v6.2.3": True, 722 "v6.2.5": True, 723 "v6.2.7": True, 724 "v6.0.11": True 725 } 726 }, 727 { 728 "value": "queue-6", 729 "revisions": { 730 "v6.0.0": True, 731 "v7.0.0": True, 732 "v6.0.5": True, 733 "v6.4.4": True, 734 "v6.4.0": True, 735 "v6.4.1": True, 736 "v6.2.0": True, 737 "v6.2.3": True, 738 "v6.2.5": True, 739 "v6.2.7": True, 740 "v6.0.11": True 741 } 742 }, 743 { 744 "value": "queue-7", 745 "revisions": { 746 "v6.0.0": True, 747 "v7.0.0": True, 748 "v6.0.5": True, 749 "v6.4.4": True, 750 "v6.4.0": True, 751 "v6.4.1": True, 752 "v6.2.0": True, 753 "v6.2.3": True, 754 "v6.2.5": True, 755 "v6.2.7": True, 756 "v6.0.11": True 757 } 758 } 759 ], 760 "revisions": { 761 "v6.0.0": True, 762 "v7.0.0": True, 763 "v6.0.5": True, 764 "v6.4.4": True, 765 "v6.4.0": True, 766 "v6.4.1": True, 767 "v6.2.0": True, 768 "v6.2.3": True, 769 "v6.2.5": True, 770 "v6.2.7": True, 771 "v6.0.11": True 772 } 773 }, 774 "priority_5": { 775 "type": "string", 776 "options": [ 777 { 778 "value": "queue-0", 779 "revisions": { 780 "v6.0.0": True, 781 "v7.0.0": True, 782 "v6.0.5": True, 783 "v6.4.4": True, 784 "v6.4.0": True, 785 "v6.4.1": True, 786 "v6.2.0": True, 787 "v6.2.3": True, 788 "v6.2.5": True, 789 "v6.2.7": True, 790 "v6.0.11": True 791 } 792 }, 793 { 794 "value": "queue-1", 795 "revisions": { 796 "v6.0.0": True, 797 "v7.0.0": True, 798 "v6.0.5": True, 799 "v6.4.4": True, 800 "v6.4.0": True, 801 "v6.4.1": True, 802 "v6.2.0": True, 803 "v6.2.3": True, 804 "v6.2.5": True, 805 "v6.2.7": True, 806 "v6.0.11": True 807 } 808 }, 809 { 810 "value": "queue-2", 811 "revisions": { 812 "v6.0.0": True, 813 "v7.0.0": True, 814 "v6.0.5": True, 815 "v6.4.4": True, 816 "v6.4.0": True, 817 "v6.4.1": True, 818 "v6.2.0": True, 819 "v6.2.3": True, 820 "v6.2.5": True, 821 "v6.2.7": True, 822 "v6.0.11": True 823 } 824 }, 825 { 826 "value": "queue-3", 827 "revisions": { 828 "v6.0.0": True, 829 "v7.0.0": True, 830 "v6.0.5": True, 831 "v6.4.4": True, 832 "v6.4.0": True, 833 "v6.4.1": True, 834 "v6.2.0": True, 835 "v6.2.3": True, 836 "v6.2.5": True, 837 "v6.2.7": True, 838 "v6.0.11": True 839 } 840 }, 841 { 842 "value": "queue-4", 843 "revisions": { 844 "v6.0.0": True, 845 "v7.0.0": True, 846 "v6.0.5": True, 847 "v6.4.4": True, 848 "v6.4.0": True, 849 "v6.4.1": True, 850 "v6.2.0": True, 851 "v6.2.3": True, 852 "v6.2.5": True, 853 "v6.2.7": True, 854 "v6.0.11": True 855 } 856 }, 857 { 858 "value": "queue-5", 859 "revisions": { 860 "v6.0.0": True, 861 "v7.0.0": True, 862 "v6.0.5": True, 863 "v6.4.4": True, 864 "v6.4.0": True, 865 "v6.4.1": True, 866 "v6.2.0": True, 867 "v6.2.3": True, 868 "v6.2.5": True, 869 "v6.2.7": True, 870 "v6.0.11": True 871 } 872 }, 873 { 874 "value": "queue-6", 875 "revisions": { 876 "v6.0.0": True, 877 "v7.0.0": True, 878 "v6.0.5": True, 879 "v6.4.4": True, 880 "v6.4.0": True, 881 "v6.4.1": True, 882 "v6.2.0": True, 883 "v6.2.3": True, 884 "v6.2.5": True, 885 "v6.2.7": True, 886 "v6.0.11": True 887 } 888 }, 889 { 890 "value": "queue-7", 891 "revisions": { 892 "v6.0.0": True, 893 "v7.0.0": True, 894 "v6.0.5": True, 895 "v6.4.4": True, 896 "v6.4.0": True, 897 "v6.4.1": True, 898 "v6.2.0": True, 899 "v6.2.3": True, 900 "v6.2.5": True, 901 "v6.2.7": True, 902 "v6.0.11": True 903 } 904 } 905 ], 906 "revisions": { 907 "v6.0.0": True, 908 "v7.0.0": True, 909 "v6.0.5": True, 910 "v6.4.4": True, 911 "v6.4.0": True, 912 "v6.4.1": True, 913 "v6.2.0": True, 914 "v6.2.3": True, 915 "v6.2.5": True, 916 "v6.2.7": True, 917 "v6.0.11": True 918 } 919 }, 920 "priority_4": { 921 "type": "string", 922 "options": [ 923 { 924 "value": "queue-0", 925 "revisions": { 926 "v6.0.0": True, 927 "v7.0.0": True, 928 "v6.0.5": True, 929 "v6.4.4": True, 930 "v6.4.0": True, 931 "v6.4.1": True, 932 "v6.2.0": True, 933 "v6.2.3": True, 934 "v6.2.5": True, 935 "v6.2.7": True, 936 "v6.0.11": True 937 } 938 }, 939 { 940 "value": "queue-1", 941 "revisions": { 942 "v6.0.0": True, 943 "v7.0.0": True, 944 "v6.0.5": True, 945 "v6.4.4": True, 946 "v6.4.0": True, 947 "v6.4.1": True, 948 "v6.2.0": True, 949 "v6.2.3": True, 950 "v6.2.5": True, 951 "v6.2.7": True, 952 "v6.0.11": True 953 } 954 }, 955 { 956 "value": "queue-2", 957 "revisions": { 958 "v6.0.0": True, 959 "v7.0.0": True, 960 "v6.0.5": True, 961 "v6.4.4": True, 962 "v6.4.0": True, 963 "v6.4.1": True, 964 "v6.2.0": True, 965 "v6.2.3": True, 966 "v6.2.5": True, 967 "v6.2.7": True, 968 "v6.0.11": True 969 } 970 }, 971 { 972 "value": "queue-3", 973 "revisions": { 974 "v6.0.0": True, 975 "v7.0.0": True, 976 "v6.0.5": True, 977 "v6.4.4": True, 978 "v6.4.0": True, 979 "v6.4.1": True, 980 "v6.2.0": True, 981 "v6.2.3": True, 982 "v6.2.5": True, 983 "v6.2.7": True, 984 "v6.0.11": True 985 } 986 }, 987 { 988 "value": "queue-4", 989 "revisions": { 990 "v6.0.0": True, 991 "v7.0.0": True, 992 "v6.0.5": True, 993 "v6.4.4": True, 994 "v6.4.0": True, 995 "v6.4.1": True, 996 "v6.2.0": True, 997 "v6.2.3": True, 998 "v6.2.5": True, 999 "v6.2.7": True, 1000 "v6.0.11": True 1001 } 1002 }, 1003 { 1004 "value": "queue-5", 1005 "revisions": { 1006 "v6.0.0": True, 1007 "v7.0.0": True, 1008 "v6.0.5": True, 1009 "v6.4.4": True, 1010 "v6.4.0": True, 1011 "v6.4.1": True, 1012 "v6.2.0": True, 1013 "v6.2.3": True, 1014 "v6.2.5": True, 1015 "v6.2.7": True, 1016 "v6.0.11": True 1017 } 1018 }, 1019 { 1020 "value": "queue-6", 1021 "revisions": { 1022 "v6.0.0": True, 1023 "v7.0.0": True, 1024 "v6.0.5": True, 1025 "v6.4.4": True, 1026 "v6.4.0": True, 1027 "v6.4.1": True, 1028 "v6.2.0": True, 1029 "v6.2.3": True, 1030 "v6.2.5": True, 1031 "v6.2.7": True, 1032 "v6.0.11": True 1033 } 1034 }, 1035 { 1036 "value": "queue-7", 1037 "revisions": { 1038 "v6.0.0": True, 1039 "v7.0.0": True, 1040 "v6.0.5": True, 1041 "v6.4.4": True, 1042 "v6.4.0": True, 1043 "v6.4.1": True, 1044 "v6.2.0": True, 1045 "v6.2.3": True, 1046 "v6.2.5": True, 1047 "v6.2.7": True, 1048 "v6.0.11": True 1049 } 1050 } 1051 ], 1052 "revisions": { 1053 "v6.0.0": True, 1054 "v7.0.0": True, 1055 "v6.0.5": True, 1056 "v6.4.4": True, 1057 "v6.4.0": True, 1058 "v6.4.1": True, 1059 "v6.2.0": True, 1060 "v6.2.3": True, 1061 "v6.2.5": True, 1062 "v6.2.7": True, 1063 "v6.0.11": True 1064 } 1065 }, 1066 "priority_3": { 1067 "type": "string", 1068 "options": [ 1069 { 1070 "value": "queue-0", 1071 "revisions": { 1072 "v6.0.0": True, 1073 "v7.0.0": True, 1074 "v6.0.5": True, 1075 "v6.4.4": True, 1076 "v6.4.0": True, 1077 "v6.4.1": True, 1078 "v6.2.0": True, 1079 "v6.2.3": True, 1080 "v6.2.5": True, 1081 "v6.2.7": True, 1082 "v6.0.11": True 1083 } 1084 }, 1085 { 1086 "value": "queue-1", 1087 "revisions": { 1088 "v6.0.0": True, 1089 "v7.0.0": True, 1090 "v6.0.5": True, 1091 "v6.4.4": True, 1092 "v6.4.0": True, 1093 "v6.4.1": True, 1094 "v6.2.0": True, 1095 "v6.2.3": True, 1096 "v6.2.5": True, 1097 "v6.2.7": True, 1098 "v6.0.11": True 1099 } 1100 }, 1101 { 1102 "value": "queue-2", 1103 "revisions": { 1104 "v6.0.0": True, 1105 "v7.0.0": True, 1106 "v6.0.5": True, 1107 "v6.4.4": True, 1108 "v6.4.0": True, 1109 "v6.4.1": True, 1110 "v6.2.0": True, 1111 "v6.2.3": True, 1112 "v6.2.5": True, 1113 "v6.2.7": True, 1114 "v6.0.11": True 1115 } 1116 }, 1117 { 1118 "value": "queue-3", 1119 "revisions": { 1120 "v6.0.0": True, 1121 "v7.0.0": True, 1122 "v6.0.5": True, 1123 "v6.4.4": True, 1124 "v6.4.0": True, 1125 "v6.4.1": True, 1126 "v6.2.0": True, 1127 "v6.2.3": True, 1128 "v6.2.5": True, 1129 "v6.2.7": True, 1130 "v6.0.11": True 1131 } 1132 }, 1133 { 1134 "value": "queue-4", 1135 "revisions": { 1136 "v6.0.0": True, 1137 "v7.0.0": True, 1138 "v6.0.5": True, 1139 "v6.4.4": True, 1140 "v6.4.0": True, 1141 "v6.4.1": True, 1142 "v6.2.0": True, 1143 "v6.2.3": True, 1144 "v6.2.5": True, 1145 "v6.2.7": True, 1146 "v6.0.11": True 1147 } 1148 }, 1149 { 1150 "value": "queue-5", 1151 "revisions": { 1152 "v6.0.0": True, 1153 "v7.0.0": True, 1154 "v6.0.5": True, 1155 "v6.4.4": True, 1156 "v6.4.0": True, 1157 "v6.4.1": True, 1158 "v6.2.0": True, 1159 "v6.2.3": True, 1160 "v6.2.5": True, 1161 "v6.2.7": True, 1162 "v6.0.11": True 1163 } 1164 }, 1165 { 1166 "value": "queue-6", 1167 "revisions": { 1168 "v6.0.0": True, 1169 "v7.0.0": True, 1170 "v6.0.5": True, 1171 "v6.4.4": True, 1172 "v6.4.0": True, 1173 "v6.4.1": True, 1174 "v6.2.0": True, 1175 "v6.2.3": True, 1176 "v6.2.5": True, 1177 "v6.2.7": True, 1178 "v6.0.11": True 1179 } 1180 }, 1181 { 1182 "value": "queue-7", 1183 "revisions": { 1184 "v6.0.0": True, 1185 "v7.0.0": True, 1186 "v6.0.5": True, 1187 "v6.4.4": True, 1188 "v6.4.0": True, 1189 "v6.4.1": True, 1190 "v6.2.0": True, 1191 "v6.2.3": True, 1192 "v6.2.5": True, 1193 "v6.2.7": True, 1194 "v6.0.11": True 1195 } 1196 } 1197 ], 1198 "revisions": { 1199 "v6.0.0": True, 1200 "v7.0.0": True, 1201 "v6.0.5": True, 1202 "v6.4.4": True, 1203 "v6.4.0": True, 1204 "v6.4.1": True, 1205 "v6.2.0": True, 1206 "v6.2.3": True, 1207 "v6.2.5": True, 1208 "v6.2.7": True, 1209 "v6.0.11": True 1210 } 1211 }, 1212 "priority_2": { 1213 "type": "string", 1214 "options": [ 1215 { 1216 "value": "queue-0", 1217 "revisions": { 1218 "v6.0.0": True, 1219 "v7.0.0": True, 1220 "v6.0.5": True, 1221 "v6.4.4": True, 1222 "v6.4.0": True, 1223 "v6.4.1": True, 1224 "v6.2.0": True, 1225 "v6.2.3": True, 1226 "v6.2.5": True, 1227 "v6.2.7": True, 1228 "v6.0.11": True 1229 } 1230 }, 1231 { 1232 "value": "queue-1", 1233 "revisions": { 1234 "v6.0.0": True, 1235 "v7.0.0": True, 1236 "v6.0.5": True, 1237 "v6.4.4": True, 1238 "v6.4.0": True, 1239 "v6.4.1": True, 1240 "v6.2.0": True, 1241 "v6.2.3": True, 1242 "v6.2.5": True, 1243 "v6.2.7": True, 1244 "v6.0.11": True 1245 } 1246 }, 1247 { 1248 "value": "queue-2", 1249 "revisions": { 1250 "v6.0.0": True, 1251 "v7.0.0": True, 1252 "v6.0.5": True, 1253 "v6.4.4": True, 1254 "v6.4.0": True, 1255 "v6.4.1": True, 1256 "v6.2.0": True, 1257 "v6.2.3": True, 1258 "v6.2.5": True, 1259 "v6.2.7": True, 1260 "v6.0.11": True 1261 } 1262 }, 1263 { 1264 "value": "queue-3", 1265 "revisions": { 1266 "v6.0.0": True, 1267 "v7.0.0": True, 1268 "v6.0.5": True, 1269 "v6.4.4": True, 1270 "v6.4.0": True, 1271 "v6.4.1": True, 1272 "v6.2.0": True, 1273 "v6.2.3": True, 1274 "v6.2.5": True, 1275 "v6.2.7": True, 1276 "v6.0.11": True 1277 } 1278 }, 1279 { 1280 "value": "queue-4", 1281 "revisions": { 1282 "v6.0.0": True, 1283 "v7.0.0": True, 1284 "v6.0.5": True, 1285 "v6.4.4": True, 1286 "v6.4.0": True, 1287 "v6.4.1": True, 1288 "v6.2.0": True, 1289 "v6.2.3": True, 1290 "v6.2.5": True, 1291 "v6.2.7": True, 1292 "v6.0.11": True 1293 } 1294 }, 1295 { 1296 "value": "queue-5", 1297 "revisions": { 1298 "v6.0.0": True, 1299 "v7.0.0": True, 1300 "v6.0.5": True, 1301 "v6.4.4": True, 1302 "v6.4.0": True, 1303 "v6.4.1": True, 1304 "v6.2.0": True, 1305 "v6.2.3": True, 1306 "v6.2.5": True, 1307 "v6.2.7": True, 1308 "v6.0.11": True 1309 } 1310 }, 1311 { 1312 "value": "queue-6", 1313 "revisions": { 1314 "v6.0.0": True, 1315 "v7.0.0": True, 1316 "v6.0.5": True, 1317 "v6.4.4": True, 1318 "v6.4.0": True, 1319 "v6.4.1": True, 1320 "v6.2.0": True, 1321 "v6.2.3": True, 1322 "v6.2.5": True, 1323 "v6.2.7": True, 1324 "v6.0.11": True 1325 } 1326 }, 1327 { 1328 "value": "queue-7", 1329 "revisions": { 1330 "v6.0.0": True, 1331 "v7.0.0": True, 1332 "v6.0.5": True, 1333 "v6.4.4": True, 1334 "v6.4.0": True, 1335 "v6.4.1": True, 1336 "v6.2.0": True, 1337 "v6.2.3": True, 1338 "v6.2.5": True, 1339 "v6.2.7": True, 1340 "v6.0.11": True 1341 } 1342 } 1343 ], 1344 "revisions": { 1345 "v6.0.0": True, 1346 "v7.0.0": True, 1347 "v6.0.5": True, 1348 "v6.4.4": True, 1349 "v6.4.0": True, 1350 "v6.4.1": True, 1351 "v6.2.0": True, 1352 "v6.2.3": True, 1353 "v6.2.5": True, 1354 "v6.2.7": True, 1355 "v6.0.11": True 1356 } 1357 }, 1358 "priority_1": { 1359 "type": "string", 1360 "options": [ 1361 { 1362 "value": "queue-0", 1363 "revisions": { 1364 "v6.0.0": True, 1365 "v7.0.0": True, 1366 "v6.0.5": True, 1367 "v6.4.4": True, 1368 "v6.4.0": True, 1369 "v6.4.1": True, 1370 "v6.2.0": True, 1371 "v6.2.3": True, 1372 "v6.2.5": True, 1373 "v6.2.7": True, 1374 "v6.0.11": True 1375 } 1376 }, 1377 { 1378 "value": "queue-1", 1379 "revisions": { 1380 "v6.0.0": True, 1381 "v7.0.0": True, 1382 "v6.0.5": True, 1383 "v6.4.4": True, 1384 "v6.4.0": True, 1385 "v6.4.1": True, 1386 "v6.2.0": True, 1387 "v6.2.3": True, 1388 "v6.2.5": True, 1389 "v6.2.7": True, 1390 "v6.0.11": True 1391 } 1392 }, 1393 { 1394 "value": "queue-2", 1395 "revisions": { 1396 "v6.0.0": True, 1397 "v7.0.0": True, 1398 "v6.0.5": True, 1399 "v6.4.4": True, 1400 "v6.4.0": True, 1401 "v6.4.1": True, 1402 "v6.2.0": True, 1403 "v6.2.3": True, 1404 "v6.2.5": True, 1405 "v6.2.7": True, 1406 "v6.0.11": True 1407 } 1408 }, 1409 { 1410 "value": "queue-3", 1411 "revisions": { 1412 "v6.0.0": True, 1413 "v7.0.0": True, 1414 "v6.0.5": True, 1415 "v6.4.4": True, 1416 "v6.4.0": True, 1417 "v6.4.1": True, 1418 "v6.2.0": True, 1419 "v6.2.3": True, 1420 "v6.2.5": True, 1421 "v6.2.7": True, 1422 "v6.0.11": True 1423 } 1424 }, 1425 { 1426 "value": "queue-4", 1427 "revisions": { 1428 "v6.0.0": True, 1429 "v7.0.0": True, 1430 "v6.0.5": True, 1431 "v6.4.4": True, 1432 "v6.4.0": True, 1433 "v6.4.1": True, 1434 "v6.2.0": True, 1435 "v6.2.3": True, 1436 "v6.2.5": True, 1437 "v6.2.7": True, 1438 "v6.0.11": True 1439 } 1440 }, 1441 { 1442 "value": "queue-5", 1443 "revisions": { 1444 "v6.0.0": True, 1445 "v7.0.0": True, 1446 "v6.0.5": True, 1447 "v6.4.4": True, 1448 "v6.4.0": True, 1449 "v6.4.1": True, 1450 "v6.2.0": True, 1451 "v6.2.3": True, 1452 "v6.2.5": True, 1453 "v6.2.7": True, 1454 "v6.0.11": True 1455 } 1456 }, 1457 { 1458 "value": "queue-6", 1459 "revisions": { 1460 "v6.0.0": True, 1461 "v7.0.0": True, 1462 "v6.0.5": True, 1463 "v6.4.4": True, 1464 "v6.4.0": True, 1465 "v6.4.1": True, 1466 "v6.2.0": True, 1467 "v6.2.3": True, 1468 "v6.2.5": True, 1469 "v6.2.7": True, 1470 "v6.0.11": True 1471 } 1472 }, 1473 { 1474 "value": "queue-7", 1475 "revisions": { 1476 "v6.0.0": True, 1477 "v7.0.0": True, 1478 "v6.0.5": True, 1479 "v6.4.4": True, 1480 "v6.4.0": True, 1481 "v6.4.1": True, 1482 "v6.2.0": True, 1483 "v6.2.3": True, 1484 "v6.2.5": True, 1485 "v6.2.7": True, 1486 "v6.0.11": True 1487 } 1488 } 1489 ], 1490 "revisions": { 1491 "v6.0.0": True, 1492 "v7.0.0": True, 1493 "v6.0.5": True, 1494 "v6.4.4": True, 1495 "v6.4.0": True, 1496 "v6.4.1": True, 1497 "v6.2.0": True, 1498 "v6.2.3": True, 1499 "v6.2.5": True, 1500 "v6.2.7": True, 1501 "v6.0.11": True 1502 } 1503 }, 1504 "priority_0": { 1505 "type": "string", 1506 "options": [ 1507 { 1508 "value": "queue-0", 1509 "revisions": { 1510 "v6.0.0": True, 1511 "v7.0.0": True, 1512 "v6.0.5": True, 1513 "v6.4.4": True, 1514 "v6.4.0": True, 1515 "v6.4.1": True, 1516 "v6.2.0": True, 1517 "v6.2.3": True, 1518 "v6.2.5": True, 1519 "v6.2.7": True, 1520 "v6.0.11": True 1521 } 1522 }, 1523 { 1524 "value": "queue-1", 1525 "revisions": { 1526 "v6.0.0": True, 1527 "v7.0.0": True, 1528 "v6.0.5": True, 1529 "v6.4.4": True, 1530 "v6.4.0": True, 1531 "v6.4.1": True, 1532 "v6.2.0": True, 1533 "v6.2.3": True, 1534 "v6.2.5": True, 1535 "v6.2.7": True, 1536 "v6.0.11": True 1537 } 1538 }, 1539 { 1540 "value": "queue-2", 1541 "revisions": { 1542 "v6.0.0": True, 1543 "v7.0.0": True, 1544 "v6.0.5": True, 1545 "v6.4.4": True, 1546 "v6.4.0": True, 1547 "v6.4.1": True, 1548 "v6.2.0": True, 1549 "v6.2.3": True, 1550 "v6.2.5": True, 1551 "v6.2.7": True, 1552 "v6.0.11": True 1553 } 1554 }, 1555 { 1556 "value": "queue-3", 1557 "revisions": { 1558 "v6.0.0": True, 1559 "v7.0.0": True, 1560 "v6.0.5": True, 1561 "v6.4.4": True, 1562 "v6.4.0": True, 1563 "v6.4.1": True, 1564 "v6.2.0": True, 1565 "v6.2.3": True, 1566 "v6.2.5": True, 1567 "v6.2.7": True, 1568 "v6.0.11": True 1569 } 1570 }, 1571 { 1572 "value": "queue-4", 1573 "revisions": { 1574 "v6.0.0": True, 1575 "v7.0.0": True, 1576 "v6.0.5": True, 1577 "v6.4.4": True, 1578 "v6.4.0": True, 1579 "v6.4.1": True, 1580 "v6.2.0": True, 1581 "v6.2.3": True, 1582 "v6.2.5": True, 1583 "v6.2.7": True, 1584 "v6.0.11": True 1585 } 1586 }, 1587 { 1588 "value": "queue-5", 1589 "revisions": { 1590 "v6.0.0": True, 1591 "v7.0.0": True, 1592 "v6.0.5": True, 1593 "v6.4.4": True, 1594 "v6.4.0": True, 1595 "v6.4.1": True, 1596 "v6.2.0": True, 1597 "v6.2.3": True, 1598 "v6.2.5": True, 1599 "v6.2.7": True, 1600 "v6.0.11": True 1601 } 1602 }, 1603 { 1604 "value": "queue-6", 1605 "revisions": { 1606 "v6.0.0": True, 1607 "v7.0.0": True, 1608 "v6.0.5": True, 1609 "v6.4.4": True, 1610 "v6.4.0": True, 1611 "v6.4.1": True, 1612 "v6.2.0": True, 1613 "v6.2.3": True, 1614 "v6.2.5": True, 1615 "v6.2.7": True, 1616 "v6.0.11": True 1617 } 1618 }, 1619 { 1620 "value": "queue-7", 1621 "revisions": { 1622 "v6.0.0": True, 1623 "v7.0.0": True, 1624 "v6.0.5": True, 1625 "v6.4.4": True, 1626 "v6.4.0": True, 1627 "v6.4.1": True, 1628 "v6.2.0": True, 1629 "v6.2.3": True, 1630 "v6.2.5": True, 1631 "v6.2.7": True, 1632 "v6.0.11": True 1633 } 1634 } 1635 ], 1636 "revisions": { 1637 "v6.0.0": True, 1638 "v7.0.0": True, 1639 "v6.0.5": True, 1640 "v6.4.4": True, 1641 "v6.4.0": True, 1642 "v6.4.1": True, 1643 "v6.2.0": True, 1644 "v6.2.3": True, 1645 "v6.2.5": True, 1646 "v6.2.7": True, 1647 "v6.0.11": True 1648 } 1649 } 1650 }, 1651 "revisions": { 1652 "v6.0.0": True, 1653 "v7.0.0": True, 1654 "v6.0.5": True, 1655 "v6.4.4": True, 1656 "v6.4.0": True, 1657 "v6.4.1": True, 1658 "v6.2.0": True, 1659 "v6.2.3": True, 1660 "v6.2.5": True, 1661 "v6.2.7": True, 1662 "v6.0.11": True 1663 } 1664} 1665 1666 1667def main(): 1668 module_spec = schema_to_module_spec(versioned_schema) 1669 mkeyname = 'name' 1670 fields = { 1671 "access_token": {"required": False, "type": "str", "no_log": True}, 1672 "enable_log": {"required": False, "type": bool}, 1673 "vdom": {"required": False, "type": "str", "default": "root"}, 1674 "state": {"required": True, "type": "str", 1675 "choices": ["present", "absent"]}, 1676 "switch_controller_qos_dot1p_map": { 1677 "required": False, "type": "dict", "default": None, 1678 "options": { 1679 } 1680 } 1681 } 1682 for attribute_name in module_spec['options']: 1683 fields["switch_controller_qos_dot1p_map"]['options'][attribute_name] = module_spec['options'][attribute_name] 1684 if mkeyname and mkeyname == attribute_name: 1685 fields["switch_controller_qos_dot1p_map"]['options'][attribute_name]['required'] = True 1686 1687 check_legacy_fortiosapi() 1688 module = AnsibleModule(argument_spec=fields, 1689 supports_check_mode=True) 1690 1691 versions_check_result = None 1692 if module._socket_path: 1693 connection = Connection(module._socket_path) 1694 if 'access_token' in module.params: 1695 connection.set_option('access_token', module.params['access_token']) 1696 1697 if 'enable_log' in module.params: 1698 connection.set_option('enable_log', module.params['enable_log']) 1699 else: 1700 connection.set_option('enable_log', False) 1701 fos = FortiOSHandler(connection, module, mkeyname) 1702 versions_check_result = check_schema_versioning(fos, versioned_schema, "switch_controller_qos_dot1p_map") 1703 1704 is_error, has_changed, result = fortios_switch_controller_qos(module.params, fos, module.check_mode) 1705 1706 else: 1707 module.fail_json(**FAIL_SOCKET_MSG) 1708 1709 if versions_check_result and versions_check_result['matched'] is False: 1710 module.warn("Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv") 1711 1712 if not is_error: 1713 if versions_check_result and versions_check_result['matched'] is False: 1714 module.exit_json(changed=has_changed, version_check_warning=versions_check_result, meta=result) 1715 else: 1716 module.exit_json(changed=has_changed, meta=result) 1717 else: 1718 if versions_check_result and versions_check_result['matched'] is False: 1719 module.fail_json(msg="Error in repo", version_check_warning=versions_check_result, meta=result) 1720 else: 1721 module.fail_json(msg="Error in repo", meta=result) 1722 1723 1724if __name__ == '__main__': 1725 main() 1726