netbox-config-diff 2.2.0__tar.gz → 2.3.0__tar.gz

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 (100) hide show
  1. {netbox-config-diff-2.2.0/netbox_config_diff.egg-info → netbox-config-diff-2.3.0}/PKG-INFO +2 -2
  2. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/README.md +1 -1
  3. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/__init__.py +1 -1
  4. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/configurator/base.py +1 -1
  5. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/configurator/platforms.py +70 -3
  6. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0/netbox_config_diff.egg-info}/PKG-INFO +2 -2
  7. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/tests/test_compliance_utils.py +1 -1
  8. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/LICENSE +0 -0
  9. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/MANIFEST.in +0 -0
  10. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/development/configuration.py +0 -0
  11. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/compliance-diff.png +0 -0
  12. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/compliance-error.png +0 -0
  13. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/compliance-list.png +0 -0
  14. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/compliance-missing-extra.png +0 -0
  15. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/compliance-ok.png +0 -0
  16. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/config-temp-substitute.png +0 -0
  17. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-approve-button.png +0 -0
  18. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-approved.png +0 -0
  19. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-collecting-diff-button.png +0 -0
  20. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-completed.png +0 -0
  21. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-created.png +0 -0
  22. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-diffs-tab.png +0 -0
  23. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-job-log.png +0 -0
  24. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-schedule-button.png +0 -0
  25. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-scheduled.png +0 -0
  26. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-unapprove-button.png +0 -0
  27. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/cr-unschedule-button.png +0 -0
  28. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/navbar.png +0 -0
  29. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/platformsetting.png +0 -0
  30. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/render-temp-substitute.png +0 -0
  31. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/script-list.png +0 -0
  32. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/script.png +0 -0
  33. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/docs/media/screenshots/substitute.png +0 -0
  34. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/api/__init__.py +0 -0
  35. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/api/serializers.py +0 -0
  36. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/api/urls.py +0 -0
  37. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/api/views.py +0 -0
  38. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/choices.py +0 -0
  39. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/compliance/__init__.py +0 -0
  40. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/compliance/base.py +0 -0
  41. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/compliance/secrets.py +0 -0
  42. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/compliance/utils.py +1 -1
  43. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/configurator/__init__.py +0 -0
  44. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/configurator/exceptions.py +0 -0
  45. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/configurator/factory.py +0 -0
  46. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/configurator/utils.py +0 -0
  47. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/constants.py +0 -0
  48. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/filtersets.py +0 -0
  49. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/forms.py +0 -0
  50. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/graphql.py +0 -0
  51. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/jobs.py +0 -0
  52. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0001_initial.py +0 -0
  53. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0002_add_script.py +0 -0
  54. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0003_configcompliance_actual_config_and_more.py +0 -0
  55. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0004_update_script.py +0 -0
  56. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0005_configcompliance_extra_missing.py +0 -0
  57. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0006_substitute.py +0 -0
  58. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0007_configurationrequest.py +0 -0
  59. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/0008_alter_configcompliance_device.py +0 -0
  60. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/migrations/__init__.py +0 -0
  61. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/models/__init__.py +0 -0
  62. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/models/base.py +0 -0
  63. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/models/data_models.py +0 -0
  64. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/models/models.py +0 -0
  65. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/navigation.py +0 -0
  66. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/scripts/config_diff.py +0 -0
  67. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/search.py +0 -0
  68. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/static/netbox_config_diff/diff2html-ui.min.js +0 -0
  69. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/static/netbox_config_diff/diff2html.dark.min.css +0 -0
  70. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/static/netbox_config_diff/diff2html.min.css +0 -0
  71. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/tables.py +0 -0
  72. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/configcompliance/config.html +0 -0
  73. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/configcompliance/data.html +0 -0
  74. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/configcompliance/missing_extra.html +0 -0
  75. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/configcompliance.html +0 -0
  76. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/configurationrequest/base.html +0 -0
  77. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/configurationrequest/diffs.html +0 -0
  78. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/configurationrequest.html +0 -0
  79. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/inc/diff.html +0 -0
  80. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/inc/job_log.html +0 -0
  81. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/platformsetting.html +0 -0
  82. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/templates/netbox_config_diff/substitute.html +0 -0
  83. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/urls.py +0 -0
  84. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/views/__init__.py +0 -0
  85. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/views/base.py +0 -0
  86. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/views/compliance.py +0 -0
  87. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff/views/configuration.py +0 -0
  88. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff.egg-info/SOURCES.txt +0 -0
  89. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff.egg-info/dependency_links.txt +0 -0
  90. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff.egg-info/requires.txt +0 -0
  91. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/netbox_config_diff.egg-info/top_level.txt +0 -0
  92. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/pyproject.toml +0 -0
  93. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/requirements/base.txt +0 -0
  94. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/requirements/dev.txt +0 -0
  95. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/requirements/test.txt +0 -0
  96. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/setup.cfg +0 -0
  97. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/tests/conftest.py +0 -0
  98. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/tests/factories.py +0 -0
  99. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/tests/test_compliance.py +0 -0
  100. {netbox-config-diff-2.2.0 → netbox-config-diff-2.3.0}/tests/test_urls.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: netbox-config-diff
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Push rendered device configurations from NetBox to devices and apply them.
5
5
  Author: Artem Kotik
6
6
  Author-email: miaow2@yandex.ru
@@ -275,7 +275,7 @@ This is possible thanks to the scrapli_cfg. Read [Scrapli](https://github.com/sc
275
275
 
276
276
  | NetBox Version | Plugin Version |
277
277
  |----------------|----------------|
278
- | 3.5, 3.6 | =>0.1.0 |
278
+ | 3.5, 3.6, 3.7 | =>0.1.0 |
279
279
 
280
280
  <!--install-start-->
281
281
  ## Installing
@@ -44,7 +44,7 @@ This is possible thanks to the scrapli_cfg. Read [Scrapli](https://github.com/sc
44
44
 
45
45
  | NetBox Version | Plugin Version |
46
46
  |----------------|----------------|
47
- | 3.5, 3.6 | =>0.1.0 |
47
+ | 3.5, 3.6, 3.7 | =>0.1.0 |
48
48
 
49
49
  <!--install-start-->
50
50
  ## Installing
@@ -2,7 +2,7 @@ from extras.plugins import PluginConfig
2
2
 
3
3
  __author__ = "Artem Kotik"
4
4
  __email__ = "miaow2@yandex.ru"
5
- __version__ = "2.2.0"
5
+ __version__ = "2.3.0"
6
6
 
7
7
 
8
8
  class ConfigDiffConfig(PluginConfig):
@@ -126,7 +126,7 @@ class Configurator(SecretsMixin):
126
126
  )
127
127
  device.rendered_config = rendered_config
128
128
  else:
129
- actual_config = await conn.get_config()
129
+ actual_config = await conn.get_config(config_template=device.rendered_config)
130
130
  device.actual_config = conn.clean_config(actual_config.result)
131
131
 
132
132
  device.diff = get_unified_diff(device.rendered_config, device.actual_config, device.name)
@@ -1,5 +1,5 @@
1
1
  import re
2
- from typing import Pattern
2
+ from typing import Any, Pattern
3
3
 
4
4
  from scrapli_cfg.exceptions import TemplateError
5
5
  from scrapli_cfg.platform.core.arista_eos import AsyncScrapliCfgEOS
@@ -94,13 +94,17 @@ class CustomScrapliCfg:
94
94
  """
95
95
  self.logger.info("fetching configuration and replacing with provided substitutes")
96
96
 
97
- source_config = await self.get_config(source=source)
97
+ source_config = await self.get_config(config_template=config_template, source=source)
98
98
  return source_config, self._render_substituted_config(
99
99
  config_template=config_template,
100
100
  substitutes=substitutes,
101
101
  source_config=source_config.result,
102
102
  )
103
103
 
104
+ async def get_config(self, **kwargs) -> ScrapliCfgResponse:
105
+ kwargs.pop("config_template", None)
106
+ return await super().get_config(**kwargs)
107
+
104
108
 
105
109
  class CustomAsyncScrapliCfgEOS(CustomScrapliCfg, AsyncScrapliCfgEOS):
106
110
  pass
@@ -119,4 +123,67 @@ class CustomAsyncScrapliCfgNXOS(CustomScrapliCfg, AsyncScrapliCfgNXOS):
119
123
 
120
124
 
121
125
  class CustomAsyncScrapliCfgJunos(CustomScrapliCfg, AsyncScrapliCfgJunos):
122
- pass
126
+ is_set_config = False
127
+
128
+ async def get_config(self, config_template: str, source: str = "running") -> ScrapliCfgResponse:
129
+ response = self._pre_get_config(source=source)
130
+
131
+ command = "show configuration"
132
+ if re.findall(r"^set\s+", config_template, flags=re.I | re.M):
133
+ self.is_set_config = True
134
+ command += " | display set"
135
+
136
+ if self._in_configuration_session is True:
137
+ config_result = await self.conn.send_config(config=f"run {command}")
138
+ else:
139
+ config_result = await self.conn.send_command(command=command)
140
+
141
+ return self._post_get_config(
142
+ response=response,
143
+ source=source,
144
+ scrapli_responses=[config_result],
145
+ result=config_result.result,
146
+ )
147
+
148
+ async def load_config(self, config: str, replace: bool = False, **kwargs: Any) -> ScrapliCfgResponse:
149
+ """
150
+ Load configuration to a device
151
+
152
+ Supported kwargs:
153
+ set: bool indicating config is a "set" style config (ignored if replace is True)
154
+
155
+ Args:
156
+ config: string of the configuration to load
157
+ replace: replace the configuration or not, if false configuration will be loaded as a
158
+ merge operation
159
+ kwargs: additional kwargs that the implementing classes may need for their platform,
160
+ see above for junos supported kwargs
161
+
162
+ Returns:
163
+ ScrapliCfgResponse: response object
164
+
165
+ Raises:
166
+ N/A
167
+
168
+ """
169
+ response = self._pre_load_config(config=config)
170
+
171
+ config = self._prepare_load_config(config=config, replace=replace)
172
+
173
+ config_result = await self.conn.send_config(config=config, privilege_level="root_shell")
174
+
175
+ if self.is_set_config is True:
176
+ load_config = f"load set {self.filesystem}{self.candidate_config_filename}"
177
+ else:
178
+ if self._replace is True:
179
+ load_config = f"load override {self.filesystem}{self.candidate_config_filename}"
180
+ else:
181
+ load_config = f"load merge {self.filesystem}{self.candidate_config_filename}"
182
+
183
+ load_result = await self.conn.send_config(config=load_config)
184
+ self._in_configuration_session = True
185
+
186
+ return self._post_load_config(
187
+ response=response,
188
+ scrapli_responses=[config_result, load_result],
189
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: netbox-config-diff
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Push rendered device configurations from NetBox to devices and apply them.
5
5
  Author: Artem Kotik
6
6
  Author-email: miaow2@yandex.ru
@@ -275,7 +275,7 @@ This is possible thanks to the scrapli_cfg. Read [Scrapli](https://github.com/sc
275
275
 
276
276
  | NetBox Version | Plugin Version |
277
277
  |----------------|----------------|
278
- | 3.5, 3.6 | =>0.1.0 |
278
+ | 3.5, 3.6, 3.7 | =>0.1.0 |
279
279
 
280
280
  <!--install-start-->
281
281
  ## Installing
@@ -56,4 +56,4 @@ def test_exclude_lines(regex: str, expected: str) -> None:
56
56
  ids=["diff", "no diff"],
57
57
  )
58
58
  def test_get_unified_diff(render: str, actual: str, expected: str) -> None:
59
- assert get_unified_diff(render, actual, "test-1") == expected
59
+ assert get_unified_diff(actual, render, "test-1") == expected
@@ -30,8 +30,8 @@ class CustomChoiceVar(ScriptVariable):
30
30
 
31
31
  def get_unified_diff(rendered_config: str, actual_config: str, device: str) -> str:
32
32
  diff = unified_diff(
33
- rendered_config.strip().splitlines(),
34
33
  actual_config.splitlines(),
34
+ rendered_config.strip().splitlines(),
35
35
  fromfiledate=device,
36
36
  tofiledate=device,
37
37
  lineterm="",