nautobot 2.4.5__py3-none-any.whl → 2.4.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. nautobot/core/api/mixins.py +10 -0
  2. nautobot/core/celery/encoders.py +2 -2
  3. nautobot/core/forms/fields.py +21 -5
  4. nautobot/core/forms/utils.py +1 -0
  5. nautobot/core/jobs/bulk_actions.py +1 -1
  6. nautobot/core/management/commands/generate_test_data.py +1 -1
  7. nautobot/core/models/name_color_content_types.py +9 -0
  8. nautobot/core/models/validators.py +7 -0
  9. nautobot/core/settings.py +0 -14
  10. nautobot/core/settings.yaml +0 -28
  11. nautobot/core/tables.py +6 -1
  12. nautobot/core/templates/generic/object_retrieve.html +1 -1
  13. nautobot/core/testing/api.py +18 -0
  14. nautobot/core/tests/nautobot_config.py +0 -2
  15. nautobot/core/tests/runner.py +17 -140
  16. nautobot/core/tests/test_api.py +4 -4
  17. nautobot/core/tests/test_authentication.py +83 -4
  18. nautobot/core/tests/test_forms.py +11 -8
  19. nautobot/core/tests/test_graphql.py +9 -0
  20. nautobot/core/tests/test_jobs.py +7 -0
  21. nautobot/core/ui/object_detail.py +31 -0
  22. nautobot/dcim/factory.py +2 -0
  23. nautobot/dcim/filters/__init__.py +5 -0
  24. nautobot/dcim/forms.py +17 -1
  25. nautobot/dcim/migrations/0068_alter_softwareimagefile_download_url.py +19 -0
  26. nautobot/dcim/migrations/0069_softwareimagefile_external_integration.py +25 -0
  27. nautobot/dcim/models/devices.py +9 -2
  28. nautobot/dcim/tables/devices.py +1 -0
  29. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +4 -0
  30. nautobot/dcim/tests/test_api.py +74 -31
  31. nautobot/dcim/tests/test_filters.py +2 -0
  32. nautobot/dcim/tests/test_models.py +65 -0
  33. nautobot/dcim/tests/test_views.py +3 -0
  34. nautobot/extras/forms/forms.py +7 -3
  35. nautobot/extras/plugins/marketplace_manifest.yml +18 -0
  36. nautobot/extras/tables.py +4 -5
  37. nautobot/extras/templates/extras/inc/panel_changelog.html +1 -1
  38. nautobot/extras/templates/extras/inc/panel_jobhistory.html +1 -1
  39. nautobot/extras/templates/extras/status.html +1 -37
  40. nautobot/extras/tests/integration/test_notes.py +1 -1
  41. nautobot/extras/tests/test_api.py +22 -7
  42. nautobot/extras/tests/test_changelog.py +4 -4
  43. nautobot/extras/tests/test_customfields.py +3 -0
  44. nautobot/extras/tests/test_plugins.py +19 -13
  45. nautobot/extras/tests/test_relationships.py +9 -0
  46. nautobot/extras/tests/test_tags.py +2 -2
  47. nautobot/extras/tests/test_views.py +15 -6
  48. nautobot/extras/urls.py +1 -30
  49. nautobot/extras/views.py +10 -54
  50. nautobot/ipam/tables.py +6 -2
  51. nautobot/ipam/templates/ipam/namespace_retrieve.html +0 -41
  52. nautobot/ipam/templates/ipam/service.html +2 -46
  53. nautobot/ipam/templates/ipam/service_edit.html +1 -17
  54. nautobot/ipam/templates/ipam/service_retrieve.html +7 -0
  55. nautobot/ipam/tests/migration/__init__.py +0 -0
  56. nautobot/ipam/tests/migration/test_migrations.py +510 -0
  57. nautobot/ipam/tests/test_api.py +66 -36
  58. nautobot/ipam/tests/test_filters.py +0 -10
  59. nautobot/ipam/tests/test_views.py +44 -2
  60. nautobot/ipam/urls.py +2 -47
  61. nautobot/ipam/utils/migrations.py +185 -152
  62. nautobot/ipam/utils/testing.py +177 -0
  63. nautobot/ipam/views.py +95 -157
  64. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +47 -0
  65. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +18 -0
  66. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +63 -0
  67. nautobot/project-static/docs/development/apps/api/testing.html +0 -87
  68. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -1
  69. nautobot/project-static/docs/development/core/best-practices.html +3 -3
  70. nautobot/project-static/docs/development/core/getting-started.html +78 -107
  71. nautobot/project-static/docs/development/core/release-checklist.html +1 -1
  72. nautobot/project-static/docs/development/core/style-guide.html +1 -1
  73. nautobot/project-static/docs/development/core/testing.html +24 -198
  74. nautobot/project-static/docs/media/user-guide/administration/getting-started/nautobot-cloud.png +0 -0
  75. nautobot/project-static/docs/objects.inv +0 -0
  76. nautobot/project-static/docs/overview/application_stack.html +1 -1
  77. nautobot/project-static/docs/release-notes/version-2.4.html +226 -1
  78. nautobot/project-static/docs/search/search_index.json +1 -1
  79. nautobot/project-static/docs/sitemap.xml +290 -290
  80. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  81. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +2 -48
  82. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +71 -0
  83. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +3 -1
  84. nautobot/project-static/docs/user-guide/administration/installation/index.html +257 -16
  85. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +1 -1
  86. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +2 -2
  87. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -0
  88. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +11 -11
  89. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +8 -8
  90. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -0
  91. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +40 -25
  92. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -4
  93. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -1
  94. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +77 -5
  95. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -1
  96. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +0 -1
  97. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -1
  98. nautobot/project-static/docs/user-guide/index.html +89 -2
  99. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +207 -122
  100. nautobot/virtualization/forms.py +20 -0
  101. nautobot/virtualization/templates/virtualization/clustergroup.html +1 -39
  102. nautobot/virtualization/templates/virtualization/clustertype.html +1 -0
  103. nautobot/virtualization/tests/test_api.py +14 -3
  104. nautobot/virtualization/tests/test_views.py +10 -2
  105. nautobot/virtualization/urls.py +10 -93
  106. nautobot/virtualization/views.py +33 -72
  107. {nautobot-2.4.5.dist-info → nautobot-2.4.6.dist-info}/METADATA +6 -5
  108. {nautobot-2.4.5.dist-info → nautobot-2.4.6.dist-info}/RECORD +113 -108
  109. {nautobot-2.4.5.dist-info → nautobot-2.4.6.dist-info}/WHEEL +1 -1
  110. nautobot/core/tests/performance_baselines.yml +0 -8900
  111. nautobot/ipam/tests/test_migrations.py +0 -462
  112. /nautobot/ipam/templates/ipam/{namespace_ipaddresses.html → namespace_ip_addresses.html} +0 -0
  113. {nautobot-2.4.5.dist-info → nautobot-2.4.6.dist-info}/LICENSE.txt +0 -0
  114. {nautobot-2.4.5.dist-info → nautobot-2.4.6.dist-info}/NOTICE +0 -0
  115. {nautobot-2.4.5.dist-info → nautobot-2.4.6.dist-info}/entry_points.txt +0 -0
Binary file
@@ -2295,15 +2295,6 @@
2295
2295
  </span>
2296
2296
  </a>
2297
2297
 
2298
- </li>
2299
-
2300
- <li class="md-nav__item">
2301
- <a href="#test_performance_baseline_file" class="md-nav__link">
2302
- <span class="md-ellipsis">
2303
- TEST_PERFORMANCE_BASELINE_FILE
2304
- </span>
2305
- </a>
2306
-
2307
2298
  </li>
2308
2299
 
2309
2300
  <li class="md-nav__item">
@@ -11315,15 +11306,6 @@
11315
11306
  </span>
11316
11307
  </a>
11317
11308
 
11318
- </li>
11319
-
11320
- <li class="md-nav__item">
11321
- <a href="#test_performance_baseline_file" class="md-nav__link">
11322
- <span class="md-ellipsis">
11323
- TEST_PERFORMANCE_BASELINE_FILE
11324
- </span>
11325
- </a>
11326
-
11327
11309
  </li>
11328
11310
 
11329
11311
  <li class="md-nav__item">
@@ -13361,34 +13343,6 @@ provide support for Nautobot. Markdown formatting is supported within this messa
13361
13343
  <li><a href="#test_use_factories"> <code>TEST_USE_FACTORIES</code> </a></li>
13362
13344
  </ul>
13363
13345
  <hr />
13364
- <h3 id="test_performance_baseline_file"><code>TEST_PERFORMANCE_BASELINE_FILE</code><a class="headerlink" href="#test_performance_baseline_file" title="Permanent link">&para;</a></h3>
13365
- <details class="version-added">
13366
- <summary>Added in version 1.5.0</summary>
13367
- </details>
13368
- <p><strong>Default:</strong>
13369
- <code>"nautobot/core/tests/performance_baselines.yml"</code></p>
13370
- <p><strong>Environment Variable:</strong> <code>NAUTOBOT_TEST_PERFORMANCE_BASELINE_FILE</code></p>
13371
- <p>File path of a YAML file providing baseline times for all performance-related tests.</p>
13372
- <p>The YAML file should conform to the following format:</p>
13373
- <div class="highlight"><pre><span></span><code><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="nt">tests</span><span class="p">:</span>
13374
- <a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">&gt;-</span>
13375
- <a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a><span class="w"> </span><span class="no">test_run_job_with_sensitive_variables_and_requires_approval</span>
13376
- <a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></a><span class="w"> </span><span class="no">(nautobot.extras.tests.test_views.JobTestCase)</span>
13377
- <a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4.799533</span>
13378
- <a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-6"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_run_missing_schedule (nautobot.extras.tests.test_views.JobTestCase)</span>
13379
- <a id="__codelineno-28-7" name="__codelineno-28-7" href="#__codelineno-28-7"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4.367563</span>
13380
- <a id="__codelineno-28-8" name="__codelineno-28-8" href="#__codelineno-28-8"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_run_now_missing_args (nautobot.extras.tests.test_views.JobTestCase)</span>
13381
- <a id="__codelineno-28-9" name="__codelineno-28-9" href="#__codelineno-28-9"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4.363194</span>
13382
- <a id="__codelineno-28-10" name="__codelineno-28-10" href="#__codelineno-28-10"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">&gt;-</span>
13383
- <a id="__codelineno-28-11" name="__codelineno-28-11" href="#__codelineno-28-11"></a><span class="w"> </span><span class="no">test_create_object_with_constrained_permission</span>
13384
- <a id="__codelineno-28-12" name="__codelineno-28-12" href="#__codelineno-28-12"></a><span class="w"> </span><span class="no">(nautobot.extras.tests.test_views.GraphQLQueriesTestCase)</span>
13385
- <a id="__codelineno-28-13" name="__codelineno-28-13" href="#__codelineno-28-13"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3.474244</span>
13386
- <a id="__codelineno-28-14" name="__codelineno-28-14" href="#__codelineno-28-14"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">&gt;-</span>
13387
- <a id="__codelineno-28-15" name="__codelineno-28-15" href="#__codelineno-28-15"></a><span class="w"> </span><span class="no">test_run_now_constrained_permissions</span>
13388
- <a id="__codelineno-28-16" name="__codelineno-28-16" href="#__codelineno-28-16"></a><span class="w"> </span><span class="no">(nautobot.extras.tests.test_views.JobTestCase)</span>
13389
- <a id="__codelineno-28-17" name="__codelineno-28-17" href="#__codelineno-28-17"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2.727531</span>
13390
- </code></pre></div>
13391
- <hr />
13392
13346
  <h3 id="test_use_factories"><code>TEST_USE_FACTORIES</code><a class="headerlink" href="#test_use_factories" title="Permanent link">&para;</a></h3>
13393
13347
  <details class="version-added">
13394
13348
  <summary>Added in version 1.5.0</summary>
@@ -13456,8 +13410,8 @@ and all Nautobot web servers, or else your scheduled jobs may run in the wrong t
13456
13410
  <summary>Added in version 1.4.0</summary>
13457
13411
  </details>
13458
13412
  <p><strong>Default:</strong></p>
13459
- <div class="highlight"><pre><span></span><code><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a><span class="k">def</span> <span class="nf">UI_RACK_VIEW_TRUNCATE_FUNCTION</span><span class="p">(</span><span class="n">device_display_name</span><span class="p">):</span>
13460
- <a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">device_display_name</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
13413
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="k">def</span> <span class="nf">UI_RACK_VIEW_TRUNCATE_FUNCTION</span><span class="p">(</span><span class="n">device_display_name</span><span class="p">):</span>
13414
+ <a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">device_display_name</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
13461
13415
  </code></pre></div>
13462
13416
  <p>This setting function is used to perform the rack elevation truncation feature.</p>
13463
13417
  <p>This provides a way to tailor the truncation behavior to best suit the needs of the installation.
@@ -1724,6 +1724,30 @@
1724
1724
  </ul>
1725
1725
  </nav>
1726
1726
 
1727
+ </li>
1728
+
1729
+ <li class="md-nav__item">
1730
+ <a href="#recipes" class="md-nav__link">
1731
+ <span class="md-ellipsis">
1732
+ Recipes
1733
+ </span>
1734
+ </a>
1735
+
1736
+ <nav class="md-nav" aria-label="Recipes">
1737
+ <ul class="md-nav__list">
1738
+
1739
+ <li class="md-nav__item">
1740
+ <a href="#export-job" class="md-nav__link">
1741
+ <span class="md-ellipsis">
1742
+ Export Job
1743
+ </span>
1744
+ </a>
1745
+
1746
+ </li>
1747
+
1748
+ </ul>
1749
+ </nav>
1750
+
1727
1751
  </li>
1728
1752
 
1729
1753
  </ul>
@@ -9343,6 +9367,30 @@
9343
9367
  </ul>
9344
9368
  </nav>
9345
9369
 
9370
+ </li>
9371
+
9372
+ <li class="md-nav__item">
9373
+ <a href="#recipes" class="md-nav__link">
9374
+ <span class="md-ellipsis">
9375
+ Recipes
9376
+ </span>
9377
+ </a>
9378
+
9379
+ <nav class="md-nav" aria-label="Recipes">
9380
+ <ul class="md-nav__list">
9381
+
9382
+ <li class="md-nav__item">
9383
+ <a href="#export-job" class="md-nav__link">
9384
+ <span class="md-ellipsis">
9385
+ Export Job
9386
+ </span>
9387
+ </a>
9388
+
9389
+ </li>
9390
+
9391
+ </ul>
9392
+ </nav>
9393
+
9346
9394
  </li>
9347
9395
 
9348
9396
  </ul>
@@ -9536,6 +9584,29 @@
9536
9584
  <p class="admonition-title">Info</p>
9537
9585
  <p>Group permission relationships can be managed in the Admin UI by modifying the group (superusers only) or the permission.</p>
9538
9586
  </div>
9587
+ <h2 id="recipes">Recipes<a class="headerlink" href="#recipes" title="Permanent link">&para;</a></h2>
9588
+ <p>Below are examples of common permissions that a Nautobot admin may want to grant.</p>
9589
+ <h3 id="export-job">Export Job<a class="headerlink" href="#export-job" title="Permanent link">&para;</a></h3>
9590
+ <p>As of Nautobot 2.1, the Export action has been converted into a Job and requires
9591
+ permissions with constraints. (<a href="https://github.com/nautobot/nautobot/issues/4745">#4745</a>)</p>
9592
+ <p>Create a Permission to allow users to start an Export job:</p>
9593
+ <ul>
9594
+ <li>Permission Name: <code>Start Export job</code></li>
9595
+ <li>Action: <code>run</code></li>
9596
+ <li>Users/Groups: Any user or restrict as needed</li>
9597
+ <li>Constraints: <code>[{"module_name": "nautobot.core.jobs", "job_class_name": "ExportObjectList"}]</code></li>
9598
+ </ul>
9599
+ <p>Create a Permission to allow users to view the results of Export jobs they ran:</p>
9600
+ <ul>
9601
+ <li>Permission Name: <code>View Export results</code></li>
9602
+ <li>Action: <code>View</code></li>
9603
+ <li>Users/Groups: Any user or restrict as needed</li>
9604
+ <li>Constraints: <code>[{"user": "$user", "task_name": "nautobot.core.jobs.ExportObjectList"}]</code></li>
9605
+ </ul>
9606
+ <div class="admonition info">
9607
+ <p class="admonition-title">Info</p>
9608
+ <p>Export jobs run with the permissions of the user that start the job.</p>
9609
+ </div>
9539
9610
 
9540
9611
 
9541
9612
 
@@ -9684,8 +9684,10 @@ be installed on your Nautobot server in a secure location that is readable only
9684
9684
  <p>If you are unable to connect to the HTTP server, check that:</p>
9685
9685
  <ul>
9686
9686
  <li>NGINX is running and configured to listen on the correct port.</li>
9687
- <li>Access is not being blocked by a firewall somewhere along the path. (Try connecting locally from the server itself.)</li>
9687
+ <li>Confirm that a firewall isn't obstructing access to NGINX. Connect from the server itself as a first check. If blocked, consider verifying firewall settings (e.g., <code>sudo ufw status</code> or <code>sudo firewall-cmd --list-all</code>).</li>
9688
+ <li>Additionally, if SELinux is enabled, ensure that it's not restricting NGINX’s operations. You might need to adjust SELinux policies or set the right context for NGINX files and processes.</li>
9688
9689
  </ul>
9690
+ <p>This addition brings attention to SELinux, which is especially pertinent in environments like CentOS or RHEL, where SELinux is often enabled by default and could be a non-obvious blocker to NGINX operations.</p>
9689
9691
  <h3 id="static-media-failure">Static Media Failure<a class="headerlink" href="#static-media-failure" title="Permanent link">&para;</a></h3>
9690
9692
  <p>If you get a <em>Static Media Failure; The following static media file failed to load: css/base.css</em>, verify that the permissions on the <code>$NAUTOBOT_ROOT</code> directory are correctly set and that the <code>nginx</code> account is a member of the <code>nautobot</code> group, as described above.</p>
9691
9693
  <h3 id="502-bad-gateway">502 Bad Gateway<a class="headerlink" href="#502-bad-gateway" title="Permanent link">&para;</a></h3>
@@ -665,6 +665,93 @@
665
665
  </label>
666
666
  <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
667
667
 
668
+ <li class="md-nav__item">
669
+ <a href="#deployment-options" class="md-nav__link">
670
+ <span class="md-ellipsis">
671
+ Deployment Options
672
+ </span>
673
+ </a>
674
+
675
+ <nav class="md-nav" aria-label="Deployment Options">
676
+ <ul class="md-nav__list">
677
+
678
+ <li class="md-nav__item">
679
+ <a href="#bare-metal-virtual-machine-pros" class="md-nav__link">
680
+ <span class="md-ellipsis">
681
+ Bare metal / Virtual Machine Pros
682
+ </span>
683
+ </a>
684
+
685
+ </li>
686
+
687
+ <li class="md-nav__item">
688
+ <a href="#bare-metal-virtual-machine-cons" class="md-nav__link">
689
+ <span class="md-ellipsis">
690
+ Bare metal / Virtual Machine Cons
691
+ </span>
692
+ </a>
693
+
694
+ </li>
695
+
696
+ <li class="md-nav__item">
697
+ <a href="#docker-compose-pros" class="md-nav__link">
698
+ <span class="md-ellipsis">
699
+ Docker Compose Pros
700
+ </span>
701
+ </a>
702
+
703
+ </li>
704
+
705
+ <li class="md-nav__item">
706
+ <a href="#docker-compose-cons" class="md-nav__link">
707
+ <span class="md-ellipsis">
708
+ Docker Compose Cons
709
+ </span>
710
+ </a>
711
+
712
+ </li>
713
+
714
+ <li class="md-nav__item">
715
+ <a href="#helm-charts-pros" class="md-nav__link">
716
+ <span class="md-ellipsis">
717
+ Helm Charts Pros
718
+ </span>
719
+ </a>
720
+
721
+ </li>
722
+
723
+ <li class="md-nav__item">
724
+ <a href="#helm-charts-cons" class="md-nav__link">
725
+ <span class="md-ellipsis">
726
+ Helm Charts Cons
727
+ </span>
728
+ </a>
729
+
730
+ </li>
731
+
732
+ <li class="md-nav__item">
733
+ <a href="#nautobot-cloud-pros" class="md-nav__link">
734
+ <span class="md-ellipsis">
735
+ Nautobot Cloud Pros
736
+ </span>
737
+ </a>
738
+
739
+ </li>
740
+
741
+ <li class="md-nav__item">
742
+ <a href="#nautobot-cloud-cons" class="md-nav__link">
743
+ <span class="md-ellipsis">
744
+ Nautobot Cloud Cons
745
+ </span>
746
+ </a>
747
+
748
+ </li>
749
+
750
+ </ul>
751
+ </nav>
752
+
753
+ </li>
754
+
668
755
  <li class="md-nav__item">
669
756
  <a href="#about-dependencies" class="md-nav__link">
670
757
  <span class="md-ellipsis">
@@ -9216,6 +9303,93 @@
9216
9303
  </label>
9217
9304
  <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
9218
9305
 
9306
+ <li class="md-nav__item">
9307
+ <a href="#deployment-options" class="md-nav__link">
9308
+ <span class="md-ellipsis">
9309
+ Deployment Options
9310
+ </span>
9311
+ </a>
9312
+
9313
+ <nav class="md-nav" aria-label="Deployment Options">
9314
+ <ul class="md-nav__list">
9315
+
9316
+ <li class="md-nav__item">
9317
+ <a href="#bare-metal-virtual-machine-pros" class="md-nav__link">
9318
+ <span class="md-ellipsis">
9319
+ Bare metal / Virtual Machine Pros
9320
+ </span>
9321
+ </a>
9322
+
9323
+ </li>
9324
+
9325
+ <li class="md-nav__item">
9326
+ <a href="#bare-metal-virtual-machine-cons" class="md-nav__link">
9327
+ <span class="md-ellipsis">
9328
+ Bare metal / Virtual Machine Cons
9329
+ </span>
9330
+ </a>
9331
+
9332
+ </li>
9333
+
9334
+ <li class="md-nav__item">
9335
+ <a href="#docker-compose-pros" class="md-nav__link">
9336
+ <span class="md-ellipsis">
9337
+ Docker Compose Pros
9338
+ </span>
9339
+ </a>
9340
+
9341
+ </li>
9342
+
9343
+ <li class="md-nav__item">
9344
+ <a href="#docker-compose-cons" class="md-nav__link">
9345
+ <span class="md-ellipsis">
9346
+ Docker Compose Cons
9347
+ </span>
9348
+ </a>
9349
+
9350
+ </li>
9351
+
9352
+ <li class="md-nav__item">
9353
+ <a href="#helm-charts-pros" class="md-nav__link">
9354
+ <span class="md-ellipsis">
9355
+ Helm Charts Pros
9356
+ </span>
9357
+ </a>
9358
+
9359
+ </li>
9360
+
9361
+ <li class="md-nav__item">
9362
+ <a href="#helm-charts-cons" class="md-nav__link">
9363
+ <span class="md-ellipsis">
9364
+ Helm Charts Cons
9365
+ </span>
9366
+ </a>
9367
+
9368
+ </li>
9369
+
9370
+ <li class="md-nav__item">
9371
+ <a href="#nautobot-cloud-pros" class="md-nav__link">
9372
+ <span class="md-ellipsis">
9373
+ Nautobot Cloud Pros
9374
+ </span>
9375
+ </a>
9376
+
9377
+ </li>
9378
+
9379
+ <li class="md-nav__item">
9380
+ <a href="#nautobot-cloud-cons" class="md-nav__link">
9381
+ <span class="md-ellipsis">
9382
+ Nautobot Cloud Cons
9383
+ </span>
9384
+ </a>
9385
+
9386
+ </li>
9387
+
9388
+ </ul>
9389
+ </nav>
9390
+
9391
+ </li>
9392
+
9219
9393
  <li class="md-nav__item">
9220
9394
  <a href="#about-dependencies" class="md-nav__link">
9221
9395
  <span class="md-ellipsis">
@@ -9310,26 +9484,93 @@
9310
9484
 
9311
9485
 
9312
9486
  <h1 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">&para;</a></h1>
9313
- <p>Nautobot can be deployed via Docker (Compose or Kubernetes) or directly onto a supported Linux system:</p>
9487
+ <p>Whether you are getting started for the first time, looking to build a local lab or ready to build a production environment, there are a variety of options to find the right fit for your needs with using Nautobot.</p>
9488
+ <div class="admonition tip">
9489
+ <p class="admonition-title">Checking out Nautobot for the first time? Not ready to install anything yet?</p>
9490
+ <p>You can explore the <a href="https://networktocode.com/nautobot/sandbox-environments/">Nautobot Always-On Sandbox Environments</a>. There is sample data already prepopulated, no installation required, and several Nautobot Apps are pre-installed, with sample data.</p>
9491
+ </div>
9492
+ <h2 id="deployment-options">Deployment Options<a class="headerlink" href="#deployment-options" title="Permanent link">&para;</a></h2>
9493
+ <div class="tabbed-set tabbed-alternate" data-tabs="1:4"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Bare metal / Virtual Machine</label><label for="__tabbed_1_2">Docker Compose</label><label for="__tabbed_1_3">Kubernetes Helm Charts</label><label for="__tabbed_1_4">Nautobot Cloud</label></div>
9494
+ <div class="tabbed-content">
9495
+ <div class="tabbed-block">
9496
+ <p>You can <a href="install_system.html">install Nautobot</a> onto a <a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux">RHEL (Red Hat Enterprise Linux)</a> or <a href="https://ubuntu.com/">Ubuntu</a> virtual machine. </p>
9497
+ <p>Nautobot was designed to be a cross-platform application that can run on nearly any system that is able to run the required dependencies. <em>Only the operating system platforms listed below are officially supported at this time</em>.</p>
9498
+ <ul>
9499
+ <li>Red Hat flavors of Linux including Fedora 8.2+ and Red Hat Enterprise Linux (RHEL) 8.2+ are supported.</li>
9500
+ <li>Debian/Ubuntu flavors of Linux including Ubuntu 20.04+ and Debian 11+ are supported.</li>
9501
+ </ul>
9502
+ <p>Nautobot <em>should</em> work on any POSIX-compliant system including practically any flavor of Linux, BSD, or even macOS, but those are not <em>officially</em> supported at this time.</p>
9503
+ <h3 id="bare-metal-virtual-machine-pros">Bare metal / Virtual Machine Pros<a class="headerlink" href="#bare-metal-virtual-machine-pros" title="Permanent link">&para;</a></h3>
9314
9504
  <ul>
9315
- <li><a href="../guides/docker.html">Nautobot Docker images</a> are available via <a href="https://hub.docker.com/r/networktocode/nautobot">Docker Hub</a> &amp; <a href="https://github.com/nautobot/nautobot/pkgs/container/nautobot">GitHub Container Registry</a> for use within a containerized environment<ul>
9316
- <li>Install Nautobot via <a href="https://github.com/nautobot/nautobot-docker-compose">Docker Compose</a></li>
9317
- <li><a href="https://docs.nautobot.com/projects/helm-charts/en/stable/">Install Nautobot via Helm Charts</a> for Kubernetes</li>
9505
+ <li>Familiar deployment option for many administrators</li>
9506
+ <li>Performance is generally higher without the overhead of virtualization</li>
9507
+ <li>Full control over hardware and software allows for greater customization and security practices</li>
9318
9508
  </ul>
9319
- </li>
9320
- <li><a href="install_system.html">Install Nautobot</a> onto a <a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux">RHEL (Red Hat Enterprise Linux)</a> or <a href="https://ubuntu.com/">Ubuntu</a> virtual machine.</li>
9509
+ <h3 id="bare-metal-virtual-machine-cons">Bare metal / Virtual Machine Cons<a class="headerlink" href="#bare-metal-virtual-machine-cons" title="Permanent link">&para;</a></h3>
9510
+ <ul>
9511
+ <li>Maintenance and high availability is more difficult than Docker or Cloud options</li>
9512
+ <li>Preparing server for production grade security and scaling requires additional effort </li>
9321
9513
  </ul>
9514
+ </div>
9515
+ <div class="tabbed-block">
9516
+ <p>Nautobot can be deployed via Docker using <a href="../guides/docker.html">Nautobot Docker images</a> that are available either from:</p>
9517
+ <ul>
9518
+ <li><a href="https://hub.docker.com/r/networktocode/nautobot">Docker Hub</a></li>
9519
+ <li><a href="https://github.com/nautobot/nautobot/pkgs/container/nautobot">GitHub Container Registry</a> </li>
9520
+ </ul>
9521
+ <p>For local testing and lab work you can use the Nautobot <a href="https://github.com/nautobot/nautobot-docker-compose">Docker Compose</a> project which leverages the container images above. </p>
9322
9522
  <p>For more information about the Docker tags, Docker configurations, or using container images for your own development environment, see <a href="../guides/docker.html">Nautobot in Docker</a>.</p>
9323
- <details class="info">
9324
- <summary>Supported Platforms</summary>
9325
- <p>Nautobot was designed to be a cross-platform application that can run on nearly any system that is able to run the required dependencies. <em>Only the operating system platforms listed below are officially supported at this time</em>.</p>
9523
+ <h3 id="docker-compose-pros">Docker Compose Pros<a class="headerlink" href="#docker-compose-pros" title="Permanent link">&para;</a></h3>
9326
9524
  <ul>
9327
- <li>Red Hat flavors of Linux including CentOS 8.2+ and Red Hat Enterprise Linux (RHEL) 8.2+ are supported.</li>
9328
- <li>Debian/Ubuntu flavors of Linux including Ubuntu 20.04+ and Debian 11+ are supported.</li>
9525
+ <li>Quick and simple setup for single-node lab environments and testing</li>
9526
+ <li>Lightweight alternative for those who don't need full Kubernetes orchestration</li>
9329
9527
  </ul>
9330
- <p>Nautobot <em>should</em> work on any POSIX-compliant system including practically any flavor of Linux, BSD, or even macOS, but those are not <em>officially</em> supported at this time.</p>
9331
- </details>
9332
- <p>To begin installing Nautobot, click the link to your preferred deployment approach from the list above.</p>
9528
+ <h3 id="docker-compose-cons">Docker Compose Cons<a class="headerlink" href="#docker-compose-cons" title="Permanent link">&para;</a></h3>
9529
+ <ul>
9530
+ <li>Docker compose on its own is missing advanced features like automated rollbacks, self-healing applications, and load balancing </li>
9531
+ <li>Limited scaling if on single host </li>
9532
+ </ul>
9533
+ </div>
9534
+ <div class="tabbed-block">
9535
+ <p>You can <a href="https://docs.nautobot.com/projects/helm-charts/en/stable/">install Nautobot via Helm Charts</a> for Kubernetes documentation. </p>
9536
+ <p>If you are looking for an example of what that process looks like in a development environment using <code>minikube</code>, you can check out the three part blog series covering deploying Nautobot to Kubernetes:</p>
9537
+ <ul>
9538
+ <li><a href="https://networktocode.com/blog/deploying-nautobot-to-kubernetes-01/">Part 1</a></li>
9539
+ <li><a href="https://networktocode.com/blog/deploying-nautobot-to-kubernetes-02/">Part 2</a></li>
9540
+ <li><a href="https://networktocode.com/blog/deploying-nautobot-to-kubernetes-03/">Part 3</a></li>
9541
+ </ul>
9542
+ <h3 id="helm-charts-pros">Helm Charts Pros<a class="headerlink" href="#helm-charts-pros" title="Permanent link">&para;</a></h3>
9543
+ <ul>
9544
+ <li>Helm charts serves as a package manager for Kubernetes, streamlining the deployment of complex applications within Kubernetes clusters</li>
9545
+ <li>Using Kubernetes features, you can manage large-scale deployments efficiently and ensure high-availability for production grade systems</li>
9546
+ </ul>
9547
+ <h3 id="helm-charts-cons">Helm Charts Cons<a class="headerlink" href="#helm-charts-cons" title="Permanent link">&para;</a></h3>
9548
+ <ul>
9549
+ <li>Requires knowledge of Kubernetes and has a steeper learning curve for setting up</li>
9550
+ <li>Kubernetes clusters can use a lot of resources and monitoring effort</li>
9551
+ </ul>
9552
+ </div>
9553
+ <div class="tabbed-block">
9554
+ <p><a href="https://networktocode.com/nautobot/nautobot-cloud/">Nautobot Cloud</a> is a commercial Software as a Service (SaaS) offering from Network to Code. It is the <em><strong>easy</strong></em> button for Nautobot. It offers self-service and turnkey deployment for Nautobot removing the need for infrastructure setup and maintenance including one-click upgrades, clones, backups and restores, and a marketplace to streamline Nautobot App installations.</p>
9555
+ <p><!-- pyml disable-num-lines 5 no-inline-html -->
9556
+ <div class="grid cards example-images" markdown>
9557
+ <a class="glightbox" href="../../../media/user-guide/administration/getting-started/nautobot-cloud.png" data-type="image" data-width="auto" data-height="auto" data-desc-position="bottom"><img alt="Nautobot Cloud Example" class="on-glb" src="../../../media/user-guide/administration/getting-started/nautobot-cloud.png" /></a>
9558
+ </div></p>
9559
+ <h3 id="nautobot-cloud-pros">Nautobot Cloud Pros<a class="headerlink" href="#nautobot-cloud-pros" title="Permanent link">&para;</a></h3>
9560
+ <ul>
9561
+ <li>One-click Nautobot deployments <strong>and</strong> upgrades</li>
9562
+ <li>Enterprise grade dashboards to see trends of Nautobot data across all Nautobot instances</li>
9563
+ <li>Click to install apps from Nautobot Cloud Marketplace</li>
9564
+ <li>Cloud-based database snapshots</li>
9565
+ <li>One-click deployments of Ansible AWX too</li>
9566
+ </ul>
9567
+ <h3 id="nautobot-cloud-cons">Nautobot Cloud Cons<a class="headerlink" href="#nautobot-cloud-cons" title="Permanent link">&para;</a></h3>
9568
+ <ul>
9569
+ <li>You’ll have to find something else to do with all that freed-up time now that you’re not maintaining on-prem applications and infrastructure.</li>
9570
+ </ul>
9571
+ </div>
9572
+ </div>
9573
+ </div>
9333
9574
  <h2 id="about-dependencies">About Dependencies<a class="headerlink" href="#about-dependencies" title="Permanent link">&para;</a></h2>
9334
9575
  <p>This section describes the system dependencies required for Nautobot. They can be all installed on a single system, or distributed across your environment. That will be up to you. Our install instructions assume a single system install, and that is good for most use cases. More advanced configurations are also possible, but are not covered here.</p>
9335
9576
  <h3 id="mandatory-dependencies">Mandatory dependencies<a class="headerlink" href="#mandatory-dependencies" title="Permanent link">&para;</a></h3>
@@ -9346,7 +9587,7 @@
9346
9587
  <tr>
9347
9588
  <td>Python</td>
9348
9589
  <td>Application</td>
9349
- <td>3.9</td>
9590
+ <td>3.9.2</td>
9350
9591
  </tr>
9351
9592
  <tr>
9352
9593
  <td>PostgreSQL</td>
@@ -9391,7 +9632,7 @@
9391
9632
  <p class="admonition-title">Only one database</p>
9392
9633
  <p>Either PostgreSQL or MySQL must be selected, but not both.</p>
9393
9634
  </div>
9394
- <div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">MySQL</label><label for="__tabbed_1_2">PostgreSQL</label></div>
9635
+ <div class="tabbed-set tabbed-alternate" data-tabs="2:2"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">MySQL</label><label for="__tabbed_2_2">PostgreSQL</label></div>
9395
9636
  <div class="tabbed-content">
9396
9637
  <div class="tabbed-block">
9397
9638
  <p><a href="https://mysql.com">MySQL</a> is an open-source relational database management system that’s relatively easy to set up and manage, fast, reliable, and well-understood.</p>
@@ -10344,7 +10344,7 @@ Hide HTTP request headers.</p>
10344
10344
  <p>Example output:</p>
10345
10345
  <div class="highlight"><pre><span></span><code><a id="__codelineno-53-1" name="__codelineno-53-1" href="#__codelineno-53-1"></a>Listening on port http://localhost:9000. Stop with CONTROL-C.
10346
10346
  </code></pre></div>
10347
- <p>Please see the guide on <a href="../../platform-functionality/webhook.html#troubleshooting">Troubleshooting Webhooks</a> for more information.</p>
10347
+ <p>Please see the guide on <a href="../../platform-functionality/webhook.html#troubleshooting-webhooks">Troubleshooting Webhooks</a> for more information.</p>
10348
10348
 
10349
10349
 
10350
10350
 
@@ -9455,7 +9455,7 @@ release notes under the release in which the change went into effect.</p>
9455
9455
  </code></pre></div>
9456
9456
  <p>Please see the <a href="https://dev.mysql.com/blog-archive/mysql-8-0-collations-migrating-from-older-collations/">official MySQL documentation on migrating collation encoding settings</a> for more information on troubleshooting any issues you may encounter.</p>
9457
9457
  <h2 id="update-prerequisites-to-required-versions">Update Prerequisites to Required Versions<a class="headerlink" href="#update-prerequisites-to-required-versions" title="Permanent link">&para;</a></h2>
9458
- <p>Nautobot v2.4.0 and later requires the following:</p>
9458
+ <p>Nautobot v2.4.6 and later requires the following:</p>
9459
9459
  <table>
9460
9460
  <thead>
9461
9461
  <tr>
@@ -9466,7 +9466,7 @@ release notes under the release in which the change went into effect.</p>
9466
9466
  <tbody>
9467
9467
  <tr>
9468
9468
  <td>Python</td>
9469
- <td>3.9</td>
9469
+ <td>3.9.2</td>
9470
9470
  </tr>
9471
9471
  <tr>
9472
9472
  <td>PostgreSQL</td>
@@ -9128,6 +9128,10 @@
9128
9128
  </details>
9129
9129
  <p>A software image file represents a single file, typically the installation image, used to run or install a device or virtual machine's operating system. Device and virtual machines can optionally assign a software image file for tracking the current image in use. Device types and inventory items can be assigned to multiple software images to track which images are compatible with which device types or inventory items. Software image files are related to <a href="softwareversion.html">software versions</a> which are used to track attributes that may apply to multiple software image files, such as the end of support date or security vulnerabilities that affect that version.</p>
9130
9130
  <p>A software image file must include a file name and a related <a href="softwareversion.html">software version</a>. It can optionally include attributes to verify the file's integrity: a file checksum and hashing algorithm as well as the file's size. Another optional field is a URL to download the image.</p>
9131
+ <details class="version-added">
9132
+ <summary>Added in version 2.4.6</summary>
9133
+ </details>
9134
+ <p>A software image file can optionally include an <a href="../../platform-functionality/externalintegration.html">external integration</a> field to enrich the file retrieval representation, typically by providing the URL, HTTP headers and credentials required to retrieve the source file.</p>
9131
9135
 
9132
9136
 
9133
9137
 
@@ -9225,18 +9225,18 @@
9225
9225
 
9226
9226
  <h1 id="contacts-and-teams">Contacts and Teams<a class="headerlink" href="#contacts-and-teams" title="Permanent link">&para;</a></h1>
9227
9227
  <h2 id="how-to-assign-contacts-and-teams-to-nautobot-objects">How to Assign Contacts and Teams to Nautobot Objects<a class="headerlink" href="#how-to-assign-contacts-and-teams-to-nautobot-objects" title="Permanent link">&para;</a></h2>
9228
- <p>In order to assign contacts/teams to a particular object, we first need to define <code>Status</code> and <code>Role</code> objects for contenttype <code>extras:contactassociation</code>. Once that is done, we can navigate to the detail view of the object. We will use a circuit in this example.</p>
9228
+ <p>In order to assign contacts/teams to a particular object, we first need to define <code>Status</code> and <code>Role</code> objects for the content type <code>extras:contactassociation</code>. Once that is done, we can navigate to the detail view of the object. We will use a circuit in this example.</p>
9229
9229
  <p><img alt="Circuit" src="images/contact-and-team/circuit.png" /></p>
9230
- <p>At the top right corner, you should see a group of buttons and one of them should say <strong>Add Contact</strong>.</p>
9231
- <p><img alt="Circuit Add Contact Button" src="images/contact-and-team/circuit_button.png" /></p>
9232
- <p>Click on the <strong>Add Contact</strong> button and it will redirect you to a page with forms on three separate tabs.</p>
9233
- <p><img alt="Contact Form" src="images/contact-and-team/contact_forms.png" /></p>
9230
+ <p>At the top right corner, you should see a group of buttons and one of them should say <strong>Add Contact</strong>.
9231
+ <img alt="Circuit Add Contact Button" src="images/contact-and-team/circuit_button.png" />
9232
+ Click on the <strong>Add Contact</strong> button and it will redirect you to a page with forms on three separate tabs.
9233
+ <img alt="Contact Form" src="images/contact-and-team/contact_forms.png" /></p>
9234
9234
  <ol>
9235
9235
  <li>The first tab contains a form that allows the user to create a <strong>new</strong> contact and associate it with the object.</li>
9236
9236
  <li>The second tab contains a form that allows the user to create a <strong>new</strong> team and associate it with the object.</li>
9237
- <li>The third tab contains a form that allows the user to select an <strong>existing</strong> contact or team and associate it with the object.</li>
9237
+ <li>The third tab contains a form that allows the user to select an <strong>existing</strong> contact or team and associate it with the object.
9238
+ <img alt="Contact Form Tabs" src="images/contact-and-team/contact_form_tabs.png" /></li>
9238
9239
  </ol>
9239
- <p><img alt="Contact Form Tabs" src="images/contact-and-team/contact_form_tabs.png" /></p>
9240
9240
  <h3 id="assign-a-new-contactteam">Assign a New Contact/Team<a class="headerlink" href="#assign-a-new-contactteam" title="Permanent link">&para;</a></h3>
9241
9241
  <p>Which form to use depends on the use case but in this example, we will use the first form which creates a <strong>new</strong> contact instance and associates it with the object.</p>
9242
9242
  <ol>
@@ -9246,9 +9246,9 @@
9246
9246
  <img alt="Contact Association Info" src="images/contact-and-team/new_contact_association_info.png" /></li>
9247
9247
  <li>Click <strong>Create</strong> at the bottom of the page.</li>
9248
9248
  <li>It will redirect us to the detail view of the circuit.</li>
9249
- <li>We can click on the <strong>Contacts</strong> tab that displays a table of contacts and teams that are associated with this circuit. Our New Contact should be in the table.</li>
9249
+ <li>We can click on the <strong>Contacts</strong> tab that displays a table of contacts and teams that are associated with this circuit. Our New Contact should be in the table.
9250
+ <img alt="Table with New Contact" src="images/contact-and-team/new_contact_table.png" /></li>
9250
9251
  </ol>
9251
- <p><img alt="Table with New Contact" src="images/contact-and-team/new_contact_table.png" /></p>
9252
9252
  <h3 id="assign-an-existing-contactteam">Assign an Existing Contact/Team<a class="headerlink" href="#assign-an-existing-contactteam" title="Permanent link">&para;</a></h3>
9253
9253
  <p>In this example, we will use the third form which links an existing contact to the object.</p>
9254
9254
  <ol>
@@ -9261,9 +9261,9 @@
9261
9261
  <li>Select the desired role and status and click <strong>Create</strong>.
9262
9262
  <img alt="Existing Contact Association" src="images/contact-and-team/existing_contact_association.png" /></li>
9263
9263
  <li>The page should redirect us to the detail view of the circuit.</li>
9264
- <li>We can click on the <strong>Contacts</strong> tab that displays a table of contacts and teams that are associated with this circuit. Both our Existing Contact and New Contact should in the table.</li>
9264
+ <li>We can click on the <strong>Contacts</strong> tab that displays a table of contacts and teams that are associated with this circuit. Both our Existing Contact and New Contact should in the table.
9265
+ <img alt="Table with New Contact and Existing Contact" src="images/contact-and-team/existing_contact_table.png" /></li>
9265
9266
  </ol>
9266
- <p><img alt="Table with New Contact and Existing Contact" src="images/contact-and-team/existing_contact_table.png" /></p>
9267
9267
 
9268
9268
 
9269
9269