|
2454 | 2454 | " }, \n",
|
2455 | 2455 | " \"enabled\": True, \n",
|
2456 | 2456 | " \"ifindex\": 531, \n",
|
2457 |
| - " \"last-change\": 254456, \n", |
| 2457 | + " \"last-change\": 255203, \n", |
2458 | 2458 | " \"mtu\": 1518, \n",
|
2459 | 2459 | " \"oper-status\": \"DOWN\"\n",
|
2460 | 2460 | " }, \n",
|
|
2518 | 2518 | " \"in-discards\": 0, \n",
|
2519 | 2519 | " \"in-errors\": 0, \n",
|
2520 | 2520 | " \"in-multicast-pkts\": 0, \n",
|
2521 |
| - " \"in-unicast-pkts\": 15740, \n", |
| 2521 | + " \"in-unicast-pkts\": 16877, \n", |
2522 | 2522 | " \"out-broadcast-pkts\": 0, \n",
|
2523 | 2523 | " \"out-errors\": 0, \n",
|
2524 | 2524 | " \"out-multicast-pkts\": 0, \n",
|
2525 |
| - " \"out-unicast-pkts\": 14704\n", |
| 2525 | + " \"out-unicast-pkts\": 15742\n", |
2526 | 2526 | " }, \n",
|
2527 | 2527 | " \"description\": \"management interface\", \n",
|
2528 | 2528 | " \"enabled\": True, \n",
|
2529 | 2529 | " \"ifindex\": 507, \n",
|
2530 |
| - " \"last-change\": 257720, \n", |
| 2530 | + " \"last-change\": 258467, \n", |
2531 | 2531 | " \"mtu\": 1400, \n",
|
2532 | 2532 | " \"oper-status\": \"UP\"\n",
|
2533 | 2533 | " }, \n",
|
|
2562 | 2562 | " \"description\": \"ge-0/0/1\", \n",
|
2563 | 2563 | " \"enabled\": False, \n",
|
2564 | 2564 | " \"ifindex\": 508, \n",
|
2565 |
| - " \"last-change\": 254454, \n", |
| 2565 | + " \"last-change\": 255201, \n", |
2566 | 2566 | " \"mtu\": 1514, \n",
|
2567 | 2567 | " \"oper-status\": \"DOWN\"\n",
|
2568 | 2568 | " }\n",
|
|
2584 | 2584 | " }, \n",
|
2585 | 2585 | " \"enabled\": True, \n",
|
2586 | 2586 | " \"ifindex\": 509, \n",
|
2587 |
| - " \"last-change\": 257720, \n", |
| 2587 | + " \"last-change\": 258467, \n", |
2588 | 2588 | " \"mtu\": 1514, \n",
|
2589 | 2589 | " \"oper-status\": \"UP\"\n",
|
2590 | 2590 | " }\n",
|
|
2718 | 2718 | " \"admin-status\": \"UP\", \n",
|
2719 | 2719 | " \"enabled\": True, \n",
|
2720 | 2720 | " \"ifindex\": 518, \n",
|
2721 |
| - " \"last-change\": 257721, \n", |
| 2721 | + " \"last-change\": 258468, \n", |
2722 | 2722 | " \"mtu\": 1504, \n",
|
2723 | 2723 | " \"oper-status\": \"UP\"\n",
|
2724 | 2724 | " }\n",
|
|
2821 | 2821 | " }, \n",
|
2822 | 2822 | " \"enabled\": True, \n",
|
2823 | 2823 | " \"ifindex\": 515, \n",
|
2824 |
| - " \"last-change\": 257721, \n", |
| 2824 | + " \"last-change\": 258468, \n", |
2825 | 2825 | " \"mtu\": 9192, \n",
|
2826 | 2826 | " \"oper-status\": \"UP\"\n",
|
2827 | 2827 | " }, \n",
|
|
2881 | 2881 | " }, \n",
|
2882 | 2882 | " \"enabled\": True, \n",
|
2883 | 2883 | " \"ifindex\": 506, \n",
|
2884 |
| - " \"last-change\": 257729, \n", |
| 2884 | + " \"last-change\": 258476, \n", |
2885 | 2885 | " \"mtu\": 1518, \n",
|
2886 | 2886 | " \"oper-status\": \"DOWN\", \n",
|
2887 | 2887 | " \"type\": \"l2vlan\"\n",
|
|
2990 | 2990 | "source": [
|
2991 | 2991 | "Diff'ing models with state is also supported."
|
2992 | 2992 | ]
|
| 2993 | + }, |
| 2994 | + { |
| 2995 | + "cell_type": "markdown", |
| 2996 | + "metadata": { |
| 2997 | + "deletable": true, |
| 2998 | + "editable": true |
| 2999 | + }, |
| 3000 | + "source": [ |
| 3001 | + "# Compliance Report\n", |
| 3002 | + "\n", |
| 3003 | + "This feature also works with YANG models. Let's assume we want to verify we have set the MTU of all of our interfaces to 9000." |
| 3004 | + ] |
| 3005 | + }, |
| 3006 | + { |
| 3007 | + "cell_type": "code", |
| 3008 | + "execution_count": 28, |
| 3009 | + "metadata": { |
| 3010 | + "collapsed": false, |
| 3011 | + "deletable": true, |
| 3012 | + "editable": true |
| 3013 | + }, |
| 3014 | + "outputs": [], |
| 3015 | + "source": [ |
| 3016 | + "data = {\n", |
| 3017 | + " \"interfaces\": {\n", |
| 3018 | + " \"interface\":{\n", |
| 3019 | + " \"Et1\": {\n", |
| 3020 | + " \"config\": {\n", |
| 3021 | + " \"mtu\": 9000\n", |
| 3022 | + " },\n", |
| 3023 | + " },\n", |
| 3024 | + " \"Et2\": {\n", |
| 3025 | + " \"config\": {\n", |
| 3026 | + " \"mtu\": 1500\n", |
| 3027 | + " }\n", |
| 3028 | + " }\n", |
| 3029 | + " }\n", |
| 3030 | + " }\n", |
| 3031 | + "}\n", |
| 3032 | + "# We load a dict for convenience, any source will do\n", |
| 3033 | + "config = napalm_yang.base.Root()\n", |
| 3034 | + "config.add_model(napalm_yang.models.openconfig_interfaces())\n", |
| 3035 | + "config.load_dict(data)" |
| 3036 | + ] |
| 3037 | + }, |
| 3038 | + { |
| 3039 | + "cell_type": "markdown", |
| 3040 | + "metadata": { |
| 3041 | + "collapsed": true, |
| 3042 | + "deletable": true, |
| 3043 | + "editable": true, |
| 3044 | + "slideshow": { |
| 3045 | + "slide_type": "-" |
| 3046 | + } |
| 3047 | + }, |
| 3048 | + "source": [ |
| 3049 | + "Now we can load the validation file. Here is the content for reference:\n", |
| 3050 | + "\n", |
| 3051 | + "```\n", |
| 3052 | + "---\n", |
| 3053 | + "- to_dict:\n", |
| 3054 | + " _kwargs:\n", |
| 3055 | + " filter: true\n", |
| 3056 | + " interfaces:\n", |
| 3057 | + " interface:\n", |
| 3058 | + " Et1:\n", |
| 3059 | + " config:\n", |
| 3060 | + " mtu: 9000\n", |
| 3061 | + " Et2:\n", |
| 3062 | + " config:\n", |
| 3063 | + " mtu: 9000\n", |
| 3064 | + " _mode: strict\n", |
| 3065 | + "```\n", |
| 3066 | + "\n", |
| 3067 | + "Note that there is a major difference between using the `compliance_report` method on getters and on `YANG` objects. With the former you have to specify how to get the data, with the later you have to get the data yourself by any means and then specify you want to convert the data into a `dict` with the `to_dict` method." |
| 3068 | + ] |
| 3069 | + }, |
| 3070 | + { |
| 3071 | + "cell_type": "code", |
| 3072 | + "execution_count": 29, |
| 3073 | + "metadata": { |
| 3074 | + "collapsed": false |
| 3075 | + }, |
| 3076 | + "outputs": [ |
| 3077 | + { |
| 3078 | + "name": "stdout", |
| 3079 | + "output_type": "stream", |
| 3080 | + "text": [ |
| 3081 | + "{\n", |
| 3082 | + " \"complies\": false, \n", |
| 3083 | + " \"skipped\": [], \n", |
| 3084 | + " \"to_dict\": {\n", |
| 3085 | + " \"complies\": false, \n", |
| 3086 | + " \"extra\": [], \n", |
| 3087 | + " \"missing\": [], \n", |
| 3088 | + " \"present\": {\n", |
| 3089 | + " \"interfaces\": {\n", |
| 3090 | + " \"complies\": false, \n", |
| 3091 | + " \"diff\": {\n", |
| 3092 | + " \"complies\": false, \n", |
| 3093 | + " \"extra\": [], \n", |
| 3094 | + " \"missing\": [], \n", |
| 3095 | + " \"present\": {\n", |
| 3096 | + " \"interface\": {\n", |
| 3097 | + " \"complies\": false, \n", |
| 3098 | + " \"diff\": {\n", |
| 3099 | + " \"complies\": false, \n", |
| 3100 | + " \"extra\": [], \n", |
| 3101 | + " \"missing\": [], \n", |
| 3102 | + " \"present\": {\n", |
| 3103 | + " \"Et1\": {\n", |
| 3104 | + " \"complies\": true, \n", |
| 3105 | + " \"nested\": true\n", |
| 3106 | + " }, \n", |
| 3107 | + " \"Et2\": {\n", |
| 3108 | + " \"complies\": false, \n", |
| 3109 | + " \"diff\": {\n", |
| 3110 | + " \"complies\": false, \n", |
| 3111 | + " \"extra\": [], \n", |
| 3112 | + " \"missing\": [], \n", |
| 3113 | + " \"present\": {\n", |
| 3114 | + " \"config\": {\n", |
| 3115 | + " \"complies\": false, \n", |
| 3116 | + " \"diff\": {\n", |
| 3117 | + " \"complies\": false, \n", |
| 3118 | + " \"extra\": [], \n", |
| 3119 | + " \"missing\": [], \n", |
| 3120 | + " \"present\": {\n", |
| 3121 | + " \"mtu\": {\n", |
| 3122 | + " \"actual_value\": 1500, \n", |
| 3123 | + " \"complies\": false, \n", |
| 3124 | + " \"nested\": false\n", |
| 3125 | + " }\n", |
| 3126 | + " }\n", |
| 3127 | + " }, \n", |
| 3128 | + " \"nested\": true\n", |
| 3129 | + " }\n", |
| 3130 | + " }\n", |
| 3131 | + " }, \n", |
| 3132 | + " \"nested\": true\n", |
| 3133 | + " }\n", |
| 3134 | + " }\n", |
| 3135 | + " }, \n", |
| 3136 | + " \"nested\": true\n", |
| 3137 | + " }\n", |
| 3138 | + " }\n", |
| 3139 | + " }, \n", |
| 3140 | + " \"nested\": true\n", |
| 3141 | + " }\n", |
| 3142 | + " }\n", |
| 3143 | + " }\n", |
| 3144 | + "}\n" |
| 3145 | + ] |
| 3146 | + } |
| 3147 | + ], |
| 3148 | + "source": [ |
| 3149 | + "report = config.compliance_report(\"validate.yaml\")\n", |
| 3150 | + "pretty_print(report)" |
| 3151 | + ] |
| 3152 | + }, |
| 3153 | + { |
| 3154 | + "cell_type": "markdown", |
| 3155 | + "metadata": {}, |
| 3156 | + "source": [ |
| 3157 | + "We can see it's complaining that the value of `Et2`'s MTU is 1500. Let's fix it and try again:" |
| 3158 | + ] |
| 3159 | + }, |
| 3160 | + { |
| 3161 | + "cell_type": "code", |
| 3162 | + "execution_count": 30, |
| 3163 | + "metadata": { |
| 3164 | + "collapsed": false |
| 3165 | + }, |
| 3166 | + "outputs": [ |
| 3167 | + { |
| 3168 | + "name": "stdout", |
| 3169 | + "output_type": "stream", |
| 3170 | + "text": [ |
| 3171 | + "{\n", |
| 3172 | + " \"complies\": true, \n", |
| 3173 | + " \"skipped\": [], \n", |
| 3174 | + " \"to_dict\": {\n", |
| 3175 | + " \"complies\": true, \n", |
| 3176 | + " \"extra\": [], \n", |
| 3177 | + " \"missing\": [], \n", |
| 3178 | + " \"present\": {\n", |
| 3179 | + " \"interfaces\": {\n", |
| 3180 | + " \"complies\": true, \n", |
| 3181 | + " \"nested\": true\n", |
| 3182 | + " }\n", |
| 3183 | + " }\n", |
| 3184 | + " }\n", |
| 3185 | + "}\n" |
| 3186 | + ] |
| 3187 | + } |
| 3188 | + ], |
| 3189 | + "source": [ |
| 3190 | + "config.interfaces.interface[\"Et2\"].config.mtu = 9000\n", |
| 3191 | + "report = config.compliance_report(\"validate.yaml\")\n", |
| 3192 | + "pretty_print(report)" |
| 3193 | + ] |
| 3194 | + }, |
| 3195 | + { |
| 3196 | + "cell_type": "markdown", |
| 3197 | + "metadata": {}, |
| 3198 | + "source": [ |
| 3199 | + "Now we can see in the first `complies` element of the report that we are complying. This works for state as the rest of the features too." |
| 3200 | + ] |
2993 | 3201 | }
|
2994 | 3202 | ],
|
2995 | 3203 | "metadata": {
|
|
0 commit comments