infrahub-server 1.2.0b1__py3-none-any.whl → 1.2.1__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 (297) hide show
  1. infrahub/api/dependencies.py +6 -6
  2. infrahub/api/diff/validation_models.py +7 -7
  3. infrahub/api/schema.py +1 -1
  4. infrahub/artifacts/models.py +1 -3
  5. infrahub/artifacts/tasks.py +1 -3
  6. infrahub/cli/__init__.py +13 -9
  7. infrahub/cli/constants.py +3 -0
  8. infrahub/cli/db.py +165 -183
  9. infrahub/cli/upgrade.py +146 -0
  10. infrahub/computed_attribute/gather.py +185 -0
  11. infrahub/computed_attribute/models.py +239 -11
  12. infrahub/computed_attribute/tasks.py +77 -442
  13. infrahub/computed_attribute/triggers.py +11 -45
  14. infrahub/config.py +43 -32
  15. infrahub/context.py +14 -0
  16. infrahub/core/account.py +4 -4
  17. infrahub/core/attribute.py +57 -57
  18. infrahub/core/branch/tasks.py +12 -9
  19. infrahub/core/changelog/diff.py +16 -8
  20. infrahub/core/changelog/models.py +189 -26
  21. infrahub/core/constants/__init__.py +5 -1
  22. infrahub/core/constants/infrahubkind.py +2 -0
  23. infrahub/core/constraint/node/runner.py +9 -8
  24. infrahub/core/diff/branch_differ.py +10 -10
  25. infrahub/core/diff/ipam_diff_parser.py +4 -5
  26. infrahub/core/diff/model/diff.py +27 -27
  27. infrahub/core/diff/model/path.py +3 -3
  28. infrahub/core/diff/query/merge.py +20 -17
  29. infrahub/core/diff/query_parser.py +4 -4
  30. infrahub/core/graph/__init__.py +1 -1
  31. infrahub/core/initialization.py +1 -10
  32. infrahub/core/ipam/constants.py +3 -4
  33. infrahub/core/ipam/reconciler.py +12 -12
  34. infrahub/core/ipam/utilization.py +10 -13
  35. infrahub/core/manager.py +34 -34
  36. infrahub/core/merge.py +7 -7
  37. infrahub/core/migrations/__init__.py +2 -3
  38. infrahub/core/migrations/graph/__init__.py +9 -4
  39. infrahub/core/migrations/graph/m017_add_core_profile.py +1 -5
  40. infrahub/core/migrations/graph/m018_uniqueness_nulls.py +4 -4
  41. infrahub/core/migrations/graph/m020_duplicate_edges.py +160 -0
  42. infrahub/core/migrations/graph/m021_missing_hierarchy_merge.py +51 -0
  43. infrahub/core/migrations/graph/{m020_add_generate_template_attr.py → m022_add_generate_template_attr.py} +3 -3
  44. infrahub/core/migrations/graph/m023_deduplicate_cardinality_one_relationships.py +96 -0
  45. infrahub/core/migrations/query/attribute_add.py +2 -2
  46. infrahub/core/migrations/query/node_duplicate.py +18 -21
  47. infrahub/core/migrations/query/schema_attribute_update.py +2 -2
  48. infrahub/core/migrations/schema/models.py +19 -4
  49. infrahub/core/migrations/schema/tasks.py +2 -2
  50. infrahub/core/migrations/shared.py +16 -16
  51. infrahub/core/models.py +15 -6
  52. infrahub/core/node/__init__.py +29 -28
  53. infrahub/core/node/base.py +2 -4
  54. infrahub/core/node/constraints/attribute_uniqueness.py +2 -2
  55. infrahub/core/node/constraints/grouped_uniqueness.py +99 -47
  56. infrahub/core/node/constraints/interface.py +1 -2
  57. infrahub/core/node/delete_validator.py +3 -5
  58. infrahub/core/node/ipam.py +4 -4
  59. infrahub/core/node/permissions.py +7 -7
  60. infrahub/core/node/resource_manager/ip_address_pool.py +6 -6
  61. infrahub/core/node/resource_manager/ip_prefix_pool.py +6 -6
  62. infrahub/core/node/resource_manager/number_pool.py +3 -3
  63. infrahub/core/path.py +12 -12
  64. infrahub/core/property.py +11 -11
  65. infrahub/core/protocols.py +5 -0
  66. infrahub/core/protocols_base.py +21 -21
  67. infrahub/core/query/__init__.py +33 -33
  68. infrahub/core/query/attribute.py +6 -4
  69. infrahub/core/query/diff.py +3 -3
  70. infrahub/core/query/node.py +82 -32
  71. infrahub/core/query/relationship.py +24 -24
  72. infrahub/core/query/resource_manager.py +2 -0
  73. infrahub/core/query/standard_node.py +3 -3
  74. infrahub/core/query/subquery.py +9 -9
  75. infrahub/core/registry.py +13 -15
  76. infrahub/core/relationship/constraints/count.py +3 -4
  77. infrahub/core/relationship/constraints/peer_kind.py +3 -4
  78. infrahub/core/relationship/constraints/profiles_kind.py +2 -2
  79. infrahub/core/relationship/model.py +40 -46
  80. infrahub/core/schema/attribute_schema.py +9 -9
  81. infrahub/core/schema/basenode_schema.py +93 -44
  82. infrahub/core/schema/computed_attribute.py +3 -3
  83. infrahub/core/schema/definitions/core/__init__.py +13 -19
  84. infrahub/core/schema/definitions/core/account.py +151 -148
  85. infrahub/core/schema/definitions/core/artifact.py +122 -113
  86. infrahub/core/schema/definitions/core/builtin.py +19 -16
  87. infrahub/core/schema/definitions/core/check.py +61 -53
  88. infrahub/core/schema/definitions/core/core.py +17 -0
  89. infrahub/core/schema/definitions/core/generator.py +89 -85
  90. infrahub/core/schema/definitions/core/graphql_query.py +72 -70
  91. infrahub/core/schema/definitions/core/group.py +96 -93
  92. infrahub/core/schema/definitions/core/ipam.py +176 -235
  93. infrahub/core/schema/definitions/core/lineage.py +18 -16
  94. infrahub/core/schema/definitions/core/menu.py +42 -40
  95. infrahub/core/schema/definitions/core/permission.py +144 -142
  96. infrahub/core/schema/definitions/core/profile.py +16 -27
  97. infrahub/core/schema/definitions/core/propose_change.py +88 -79
  98. infrahub/core/schema/definitions/core/propose_change_comment.py +170 -165
  99. infrahub/core/schema/definitions/core/propose_change_validator.py +290 -288
  100. infrahub/core/schema/definitions/core/repository.py +231 -225
  101. infrahub/core/schema/definitions/core/resource_pool.py +156 -166
  102. infrahub/core/schema/definitions/core/template.py +27 -12
  103. infrahub/core/schema/definitions/core/transform.py +85 -76
  104. infrahub/core/schema/definitions/core/webhook.py +127 -101
  105. infrahub/core/schema/definitions/internal.py +16 -16
  106. infrahub/core/schema/dropdown.py +3 -4
  107. infrahub/core/schema/generated/attribute_schema.py +15 -18
  108. infrahub/core/schema/generated/base_node_schema.py +12 -14
  109. infrahub/core/schema/generated/node_schema.py +3 -5
  110. infrahub/core/schema/generated/relationship_schema.py +9 -11
  111. infrahub/core/schema/generic_schema.py +2 -2
  112. infrahub/core/schema/manager.py +20 -9
  113. infrahub/core/schema/node_schema.py +4 -2
  114. infrahub/core/schema/relationship_schema.py +7 -7
  115. infrahub/core/schema/schema_branch.py +276 -138
  116. infrahub/core/schema/schema_branch_computed.py +41 -4
  117. infrahub/core/task/task.py +3 -3
  118. infrahub/core/task/user_task.py +15 -15
  119. infrahub/core/utils.py +20 -18
  120. infrahub/core/validators/__init__.py +1 -3
  121. infrahub/core/validators/aggregated_checker.py +2 -2
  122. infrahub/core/validators/attribute/choices.py +2 -2
  123. infrahub/core/validators/attribute/enum.py +2 -2
  124. infrahub/core/validators/attribute/kind.py +2 -2
  125. infrahub/core/validators/attribute/length.py +2 -2
  126. infrahub/core/validators/attribute/optional.py +2 -2
  127. infrahub/core/validators/attribute/regex.py +2 -2
  128. infrahub/core/validators/attribute/unique.py +2 -2
  129. infrahub/core/validators/checks_runner.py +25 -2
  130. infrahub/core/validators/determiner.py +1 -3
  131. infrahub/core/validators/interface.py +6 -2
  132. infrahub/core/validators/model.py +22 -3
  133. infrahub/core/validators/models/validate_migration.py +17 -4
  134. infrahub/core/validators/node/attribute.py +2 -2
  135. infrahub/core/validators/node/generate_profile.py +2 -2
  136. infrahub/core/validators/node/hierarchy.py +3 -5
  137. infrahub/core/validators/node/inherit_from.py +27 -5
  138. infrahub/core/validators/node/relationship.py +2 -2
  139. infrahub/core/validators/relationship/count.py +4 -4
  140. infrahub/core/validators/relationship/optional.py +2 -2
  141. infrahub/core/validators/relationship/peer.py +2 -2
  142. infrahub/core/validators/shared.py +2 -2
  143. infrahub/core/validators/tasks.py +8 -0
  144. infrahub/core/validators/uniqueness/checker.py +22 -21
  145. infrahub/core/validators/uniqueness/index.py +2 -2
  146. infrahub/core/validators/uniqueness/model.py +11 -11
  147. infrahub/database/__init__.py +26 -22
  148. infrahub/database/metrics.py +7 -1
  149. infrahub/dependencies/builder/constraint/grouped/node_runner.py +1 -3
  150. infrahub/dependencies/component/registry.py +2 -2
  151. infrahub/events/__init__.py +25 -2
  152. infrahub/events/artifact_action.py +13 -25
  153. infrahub/events/branch_action.py +26 -18
  154. infrahub/events/generator.py +71 -0
  155. infrahub/events/group_action.py +10 -24
  156. infrahub/events/models.py +10 -16
  157. infrahub/events/node_action.py +87 -32
  158. infrahub/events/repository_action.py +5 -18
  159. infrahub/events/schema_action.py +4 -9
  160. infrahub/events/utils.py +16 -0
  161. infrahub/events/validator_action.py +55 -0
  162. infrahub/exceptions.py +23 -24
  163. infrahub/generators/models.py +1 -3
  164. infrahub/git/base.py +7 -7
  165. infrahub/git/integrator.py +26 -25
  166. infrahub/git/models.py +22 -9
  167. infrahub/git/repository.py +3 -3
  168. infrahub/git/tasks.py +67 -49
  169. infrahub/git/utils.py +48 -0
  170. infrahub/git/worktree.py +1 -2
  171. infrahub/git_credential/askpass.py +1 -2
  172. infrahub/graphql/analyzer.py +12 -0
  173. infrahub/graphql/app.py +13 -15
  174. infrahub/graphql/context.py +6 -0
  175. infrahub/graphql/initialization.py +3 -0
  176. infrahub/graphql/loaders/node.py +2 -12
  177. infrahub/graphql/loaders/peers.py +77 -0
  178. infrahub/graphql/loaders/shared.py +13 -0
  179. infrahub/graphql/manager.py +13 -10
  180. infrahub/graphql/mutations/artifact_definition.py +5 -5
  181. infrahub/graphql/mutations/computed_attribute.py +4 -5
  182. infrahub/graphql/mutations/graphql_query.py +5 -5
  183. infrahub/graphql/mutations/ipam.py +50 -70
  184. infrahub/graphql/mutations/main.py +164 -141
  185. infrahub/graphql/mutations/menu.py +5 -5
  186. infrahub/graphql/mutations/models.py +2 -4
  187. infrahub/graphql/mutations/node_getter/by_default_filter.py +10 -10
  188. infrahub/graphql/mutations/node_getter/by_hfid.py +1 -3
  189. infrahub/graphql/mutations/node_getter/by_id.py +1 -3
  190. infrahub/graphql/mutations/node_getter/interface.py +1 -2
  191. infrahub/graphql/mutations/proposed_change.py +7 -7
  192. infrahub/graphql/mutations/relationship.py +67 -35
  193. infrahub/graphql/mutations/repository.py +8 -8
  194. infrahub/graphql/mutations/resource_manager.py +3 -3
  195. infrahub/graphql/mutations/schema.py +4 -4
  196. infrahub/graphql/mutations/webhook.py +137 -0
  197. infrahub/graphql/parser.py +4 -4
  198. infrahub/graphql/queries/diff/tree.py +4 -4
  199. infrahub/graphql/queries/ipam.py +2 -2
  200. infrahub/graphql/queries/relationship.py +2 -2
  201. infrahub/graphql/queries/search.py +2 -2
  202. infrahub/graphql/resolvers/many_relationship.py +264 -0
  203. infrahub/graphql/resolvers/resolver.py +13 -110
  204. infrahub/graphql/subscription/graphql_query.py +2 -0
  205. infrahub/graphql/types/event.py +20 -11
  206. infrahub/graphql/types/node.py +2 -2
  207. infrahub/graphql/utils.py +2 -2
  208. infrahub/groups/ancestors.py +29 -0
  209. infrahub/groups/parsers.py +107 -0
  210. infrahub/menu/generator.py +7 -7
  211. infrahub/menu/menu.py +0 -10
  212. infrahub/menu/models.py +117 -16
  213. infrahub/menu/repository.py +111 -0
  214. infrahub/menu/utils.py +5 -8
  215. infrahub/message_bus/messages/__init__.py +1 -11
  216. infrahub/message_bus/messages/check_generator_run.py +2 -0
  217. infrahub/message_bus/messages/finalize_validator_execution.py +3 -0
  218. infrahub/message_bus/messages/request_generatordefinition_check.py +2 -0
  219. infrahub/message_bus/operations/__init__.py +0 -2
  220. infrahub/message_bus/operations/check/generator.py +1 -0
  221. infrahub/message_bus/operations/event/__init__.py +2 -2
  222. infrahub/message_bus/operations/finalize/validator.py +51 -1
  223. infrahub/message_bus/operations/requests/generator_definition.py +19 -19
  224. infrahub/message_bus/operations/requests/proposed_change.py +3 -1
  225. infrahub/pools/number.py +2 -4
  226. infrahub/proposed_change/tasks.py +37 -28
  227. infrahub/pytest_plugin.py +13 -10
  228. infrahub/server.py +1 -2
  229. infrahub/services/adapters/event/__init__.py +1 -1
  230. infrahub/task_manager/event.py +23 -9
  231. infrahub/tasks/artifact.py +2 -4
  232. infrahub/telemetry/__init__.py +0 -0
  233. infrahub/telemetry/constants.py +9 -0
  234. infrahub/telemetry/database.py +86 -0
  235. infrahub/telemetry/models.py +65 -0
  236. infrahub/telemetry/task_manager.py +77 -0
  237. infrahub/{tasks/telemetry.py → telemetry/tasks.py} +49 -56
  238. infrahub/telemetry/utils.py +11 -0
  239. infrahub/trace.py +4 -4
  240. infrahub/transformations/tasks.py +2 -2
  241. infrahub/trigger/catalogue.py +2 -5
  242. infrahub/trigger/constants.py +0 -8
  243. infrahub/trigger/models.py +14 -1
  244. infrahub/trigger/setup.py +90 -0
  245. infrahub/trigger/tasks.py +35 -90
  246. infrahub/utils.py +11 -1
  247. infrahub/validators/__init__.py +0 -0
  248. infrahub/validators/events.py +42 -0
  249. infrahub/validators/tasks.py +41 -0
  250. infrahub/webhook/gather.py +17 -0
  251. infrahub/webhook/models.py +22 -5
  252. infrahub/webhook/tasks.py +44 -19
  253. infrahub/webhook/triggers.py +22 -5
  254. infrahub/workers/infrahub_async.py +2 -2
  255. infrahub/workers/utils.py +2 -2
  256. infrahub/workflows/catalogue.py +28 -20
  257. infrahub/workflows/initialization.py +1 -3
  258. infrahub/workflows/models.py +1 -1
  259. infrahub/workflows/utils.py +10 -1
  260. infrahub_sdk/client.py +27 -8
  261. infrahub_sdk/config.py +3 -0
  262. infrahub_sdk/context.py +13 -0
  263. infrahub_sdk/exceptions.py +6 -0
  264. infrahub_sdk/generator.py +4 -1
  265. infrahub_sdk/graphql.py +45 -13
  266. infrahub_sdk/node.py +69 -20
  267. infrahub_sdk/protocols_base.py +32 -11
  268. infrahub_sdk/query_groups.py +6 -35
  269. infrahub_sdk/schema/__init__.py +55 -26
  270. infrahub_sdk/schema/main.py +8 -0
  271. infrahub_sdk/task/__init__.py +10 -0
  272. infrahub_sdk/task/manager.py +12 -6
  273. infrahub_sdk/testing/schemas/animal.py +9 -0
  274. infrahub_sdk/timestamp.py +12 -4
  275. {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/METADATA +3 -2
  276. {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/RECORD +289 -260
  277. {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/entry_points.txt +1 -0
  278. infrahub_testcontainers/constants.py +2 -0
  279. infrahub_testcontainers/container.py +157 -12
  280. infrahub_testcontainers/docker-compose.test.yml +31 -6
  281. infrahub_testcontainers/helpers.py +18 -73
  282. infrahub_testcontainers/host.py +41 -0
  283. infrahub_testcontainers/measurements.py +93 -0
  284. infrahub_testcontainers/models.py +38 -0
  285. infrahub_testcontainers/performance_test.py +166 -0
  286. infrahub_testcontainers/plugin.py +136 -0
  287. infrahub_testcontainers/prometheus.yml +30 -0
  288. infrahub/message_bus/messages/event_branch_create.py +0 -11
  289. infrahub/message_bus/messages/event_branch_delete.py +0 -11
  290. infrahub/message_bus/messages/event_branch_rebased.py +0 -9
  291. infrahub/message_bus/messages/event_node_mutated.py +0 -15
  292. infrahub/message_bus/messages/event_schema_update.py +0 -9
  293. infrahub/message_bus/operations/event/node.py +0 -20
  294. infrahub/message_bus/operations/event/schema.py +0 -17
  295. infrahub/webhook/constants.py +0 -1
  296. {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/LICENSE.txt +0 -0
  297. {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/WHEEL +0 -0
@@ -2,104 +2,107 @@ from infrahub.core.constants import (
2
2
  BranchSupportType,
3
3
  InfrahubKind,
4
4
  )
5
+ from infrahub.core.constants import RelationshipCardinality as Cardinality
6
+ from infrahub.core.constants import RelationshipKind as RelKind
5
7
 
6
- core_group = {
7
- "name": "Group",
8
- "namespace": "Core",
9
- "description": "Generic Group Object.",
10
- "label": "Group",
11
- "default_filter": "name__value",
12
- "order_by": ["name__value"],
13
- "display_labels": ["label__value"],
14
- "include_in_menu": False,
15
- "icon": "mdi:group",
16
- "hierarchical": True,
17
- "branch": BranchSupportType.AWARE.value,
18
- "uniqueness_constraints": [["name__value"]],
19
- "attributes": [
20
- {"name": "name", "kind": "Text", "unique": True},
21
- {"name": "label", "kind": "Text", "optional": True},
22
- {"name": "description", "kind": "Text", "optional": True},
23
- {
24
- "name": "group_type",
25
- "kind": "Text",
26
- "enum": ["default", "internal"],
27
- "default_value": "default",
28
- "optional": False,
29
- },
8
+ from ...attribute_schema import AttributeSchema as Attr
9
+ from ...generic_schema import GenericSchema
10
+ from ...node_schema import NodeSchema
11
+ from ...relationship_schema import (
12
+ RelationshipSchema as Rel,
13
+ )
14
+
15
+ core_group = GenericSchema(
16
+ name="Group",
17
+ namespace="Core",
18
+ description="Generic Group Object.",
19
+ label="Group",
20
+ default_filter="name__value",
21
+ order_by=["name__value"],
22
+ display_labels=["label__value"],
23
+ include_in_menu=False,
24
+ icon="mdi:group",
25
+ hierarchical=True,
26
+ branch=BranchSupportType.AWARE,
27
+ uniqueness_constraints=[["name__value"]],
28
+ attributes=[
29
+ Attr(name="name", kind="Text", unique=True),
30
+ Attr(name="label", kind="Text", optional=True),
31
+ Attr(name="description", kind="Text", optional=True),
32
+ Attr(name="group_type", kind="Text", enum=["default", "internal"], default_value="default", optional=False),
30
33
  ],
31
- "relationships": [
32
- {
33
- "name": "members",
34
- "peer": InfrahubKind.NODE,
35
- "optional": True,
36
- "identifier": "group_member",
37
- "cardinality": "many",
38
- "branch": BranchSupportType.AWARE,
39
- },
40
- {
41
- "name": "subscribers",
42
- "peer": InfrahubKind.NODE,
43
- "optional": True,
44
- "identifier": "group_subscriber",
45
- "cardinality": "many",
46
- },
34
+ relationships=[
35
+ Rel(
36
+ name="members",
37
+ peer=InfrahubKind.NODE,
38
+ optional=True,
39
+ identifier="group_member",
40
+ cardinality=Cardinality.MANY,
41
+ branch=BranchSupportType.AWARE,
42
+ ),
43
+ Rel(
44
+ name="subscribers",
45
+ peer=InfrahubKind.NODE,
46
+ optional=True,
47
+ identifier="group_subscriber",
48
+ cardinality=Cardinality.MANY,
49
+ ),
47
50
  ],
48
- }
51
+ )
49
52
 
50
- core_standard_group = {
51
- "name": "StandardGroup",
52
- "namespace": "Core",
53
- "description": "Group of nodes of any kind.",
54
- "include_in_menu": False,
55
- "icon": "mdi:account-group",
56
- "label": "Standard Group",
57
- "default_filter": "name__value",
58
- "order_by": ["name__value"],
59
- "display_labels": ["name__value"],
60
- "branch": BranchSupportType.AWARE.value,
61
- "inherit_from": [InfrahubKind.GENERICGROUP],
62
- "generate_profile": False,
63
- }
53
+ core_standard_group = NodeSchema(
54
+ name="StandardGroup",
55
+ namespace="Core",
56
+ description="Group of nodes of any kind.",
57
+ include_in_menu=False,
58
+ icon="mdi:account-group",
59
+ label="Standard Group",
60
+ default_filter="name__value",
61
+ order_by=["name__value"],
62
+ display_labels=["name__value"],
63
+ branch=BranchSupportType.AWARE,
64
+ inherit_from=[InfrahubKind.GENERICGROUP],
65
+ generate_profile=False,
66
+ )
64
67
 
65
- core_generator_group = {
66
- "name": "GeneratorGroup",
67
- "namespace": "Core",
68
- "description": "Group of nodes that are created by a generator.",
69
- "include_in_menu": False,
70
- "icon": "mdi:state-machine",
71
- "label": "Generator Group",
72
- "default_filter": "name__value",
73
- "order_by": ["name__value"],
74
- "display_labels": ["name__value"],
75
- "branch": BranchSupportType.LOCAL.value,
76
- "inherit_from": [InfrahubKind.GENERICGROUP],
77
- "generate_profile": False,
78
- }
68
+ core_generator_group = NodeSchema(
69
+ name="GeneratorGroup",
70
+ namespace="Core",
71
+ description="Group of nodes that are created by a generator.",
72
+ include_in_menu=False,
73
+ icon="mdi:state-machine",
74
+ label="Generator Group",
75
+ default_filter="name__value",
76
+ order_by=["name__value"],
77
+ display_labels=["name__value"],
78
+ branch=BranchSupportType.LOCAL,
79
+ inherit_from=[InfrahubKind.GENERICGROUP],
80
+ generate_profile=False,
81
+ )
79
82
 
80
- core_graphql_query_group = {
81
- "name": "GraphQLQueryGroup",
82
- "namespace": "Core",
83
- "description": "Group of nodes associated with a given GraphQLQuery.",
84
- "include_in_menu": False,
85
- "icon": "mdi:account-group",
86
- "label": "GraphQL Query Group",
87
- "default_filter": "name__value",
88
- "order_by": ["name__value"],
89
- "display_labels": ["name__value"],
90
- "branch": BranchSupportType.LOCAL.value,
91
- "inherit_from": [InfrahubKind.GENERICGROUP],
92
- "generate_profile": False,
93
- "attributes": [
94
- {"name": "parameters", "kind": "JSON", "optional": True},
83
+ core_graphql_query_group = NodeSchema(
84
+ name="GraphQLQueryGroup",
85
+ namespace="Core",
86
+ description="Group of nodes associated with a given GraphQLQuery.",
87
+ include_in_menu=False,
88
+ icon="mdi:account-group",
89
+ label="GraphQL Query Group",
90
+ default_filter="name__value",
91
+ order_by=["name__value"],
92
+ display_labels=["name__value"],
93
+ branch=BranchSupportType.LOCAL,
94
+ inherit_from=[InfrahubKind.GENERICGROUP],
95
+ generate_profile=False,
96
+ attributes=[
97
+ Attr(name="parameters", kind="JSON", optional=True),
95
98
  ],
96
- "relationships": [
97
- {
98
- "name": "query",
99
- "peer": InfrahubKind.GRAPHQLQUERY,
100
- "optional": False,
101
- "cardinality": "one",
102
- "kind": "Attribute",
103
- },
99
+ relationships=[
100
+ Rel(
101
+ name="query",
102
+ peer=InfrahubKind.GRAPHQLQUERY,
103
+ optional=False,
104
+ cardinality=Cardinality.ONE,
105
+ kind=RelKind.ATTRIBUTE,
106
+ ),
104
107
  ],
105
- }
108
+ )
@@ -4,249 +4,190 @@ from infrahub.core.constants import (
4
4
  InfrahubKind,
5
5
  RelationshipDeleteBehavior,
6
6
  )
7
+ from infrahub.core.constants import RelationshipCardinality as Cardinality
7
8
 
8
- builtin_ipam = {
9
- "name": "IPNamespace",
10
- "namespace": "Builtin",
11
- "label": "IP Namespace",
12
- "description": "A generic container for IP prefixes and IP addresses",
13
- "include_in_menu": False,
14
- "default_filter": "name__value",
15
- "order_by": ["name__value"],
16
- "display_labels": ["name__value"],
17
- "icon": "mdi:format-list-group",
18
- "branch": BranchSupportType.AWARE.value,
19
- "uniqueness_constraints": [["name__value"]],
20
- "generate_profile": False,
21
- "attributes": [
22
- {
23
- "name": "name",
24
- "kind": "Text",
25
- "unique": True,
26
- "branch": BranchSupportType.AWARE.value,
27
- "order_weight": 1000,
28
- },
29
- {
30
- "name": "description",
31
- "kind": "Text",
32
- "optional": True,
33
- "branch": BranchSupportType.AWARE.value,
34
- "order_weight": 2000,
35
- },
9
+ from ...attribute_schema import AttributeSchema as Attr
10
+ from ...dropdown import DropdownChoice
11
+ from ...generic_schema import GenericSchema
12
+ from ...node_schema import NodeSchema
13
+ from ...relationship_schema import (
14
+ RelationshipSchema as Rel,
15
+ )
16
+
17
+ builtin_ipam = GenericSchema(
18
+ name="IPNamespace",
19
+ namespace="Builtin",
20
+ label="IP Namespace",
21
+ description="A generic container for IP prefixes and IP addresses",
22
+ include_in_menu=False,
23
+ default_filter="name__value",
24
+ order_by=["name__value"],
25
+ display_labels=["name__value"],
26
+ icon="mdi:format-list-group",
27
+ branch=BranchSupportType.AWARE,
28
+ uniqueness_constraints=[["name__value"]],
29
+ generate_profile=False,
30
+ attributes=[
31
+ Attr(name="name", kind="Text", unique=True, branch=BranchSupportType.AWARE, order_weight=1000),
32
+ Attr(name="description", kind="Text", optional=True, branch=BranchSupportType.AWARE, order_weight=2000),
36
33
  ],
37
- "relationships": [
38
- {
39
- "name": "ip_prefixes",
40
- "label": "IP Prefixes",
41
- "peer": InfrahubKind.IPPREFIX,
42
- "identifier": "ip_namespace__ip_prefix",
43
- "optional": True,
44
- "cardinality": "many",
45
- "on_delete": RelationshipDeleteBehavior.CASCADE,
46
- "allow_override": AllowOverrideType.NONE,
47
- },
48
- {
49
- "name": "ip_addresses",
50
- "label": "IP Addresses",
51
- "peer": InfrahubKind.IPADDRESS,
52
- "identifier": "ip_namespace__ip_address",
53
- "optional": True,
54
- "cardinality": "many",
55
- "on_delete": RelationshipDeleteBehavior.CASCADE,
56
- "allow_override": AllowOverrideType.NONE,
57
- },
34
+ relationships=[
35
+ Rel(
36
+ name="ip_prefixes",
37
+ label="IP Prefixes",
38
+ peer=InfrahubKind.IPPREFIX,
39
+ identifier="ip_namespace__ip_prefix",
40
+ optional=True,
41
+ cardinality=Cardinality.MANY,
42
+ on_delete=RelationshipDeleteBehavior.CASCADE,
43
+ allow_override=AllowOverrideType.NONE,
44
+ ),
45
+ Rel(
46
+ name="ip_addresses",
47
+ label="IP Addresses",
48
+ peer=InfrahubKind.IPADDRESS,
49
+ identifier="ip_namespace__ip_address",
50
+ optional=True,
51
+ cardinality=Cardinality.MANY,
52
+ on_delete=RelationshipDeleteBehavior.CASCADE,
53
+ allow_override=AllowOverrideType.NONE,
54
+ ),
58
55
  ],
59
- }
56
+ )
60
57
 
61
- builtin_ip_prefix = {
62
- "name": "IPPrefix",
63
- "label": "IP Prefix",
64
- "namespace": "Builtin",
65
- "description": "IPv6 or IPv4 prefix also referred as network",
66
- "include_in_menu": False,
67
- "default_filter": "prefix__value",
68
- "order_by": ["prefix__version", "prefix__binary_address", "prefix__prefixlen"],
69
- "display_labels": ["prefix__value"],
70
- "icon": "mdi:ip-network",
71
- "branch": BranchSupportType.AWARE.value,
72
- "hierarchical": True,
73
- "attributes": [
74
- {
75
- "name": "prefix",
76
- "kind": "IPNetwork",
77
- "branch": BranchSupportType.AWARE.value,
78
- "order_weight": 1000,
79
- },
80
- {
81
- "name": "description",
82
- "kind": "Text",
83
- "optional": True,
84
- "branch": BranchSupportType.AWARE.value,
85
- "order_weight": 2000,
86
- },
87
- {
88
- "name": "member_type",
89
- "kind": "Dropdown",
90
- "choices": [
91
- {
92
- "name": "prefix",
93
- "label": "Prefix",
94
- "description": "Prefix serves as container for other prefixes",
95
- },
96
- {
97
- "name": "address",
98
- "label": "Address",
99
- "description": "Prefix serves as subnet for IP addresses",
100
- },
58
+ builtin_ip_prefix = GenericSchema(
59
+ name="IPPrefix",
60
+ label="IP Prefix",
61
+ namespace="Builtin",
62
+ description="IPv6 or IPv4 prefix also referred as network",
63
+ include_in_menu=False,
64
+ default_filter="prefix__value",
65
+ order_by=["prefix__version", "prefix__binary_address", "prefix__prefixlen"],
66
+ display_labels=["prefix__value"],
67
+ icon="mdi:ip-network",
68
+ branch=BranchSupportType.AWARE,
69
+ hierarchical=True,
70
+ attributes=[
71
+ Attr(name="prefix", kind="IPNetwork", branch=BranchSupportType.AWARE, order_weight=1000),
72
+ Attr(name="description", kind="Text", optional=True, branch=BranchSupportType.AWARE, order_weight=2000),
73
+ Attr(
74
+ name="member_type",
75
+ kind="Dropdown",
76
+ choices=[
77
+ DropdownChoice(
78
+ name="prefix",
79
+ label="Prefix",
80
+ description="Prefix serves as container for other prefixes",
81
+ ),
82
+ DropdownChoice(
83
+ name="address",
84
+ label="Address",
85
+ description="Prefix serves as subnet for IP addresses",
86
+ ),
101
87
  ],
102
- "branch": BranchSupportType.AWARE.value,
103
- "default_value": "address",
104
- "order_weight": 3000,
105
- },
106
- {
107
- "name": "is_pool",
108
- "kind": "Boolean",
109
- "branch": BranchSupportType.AWARE.value,
110
- "default_value": False,
111
- "order_weight": 4000,
112
- "description": "All IP addresses within this prefix are considered usable",
113
- },
114
- {
115
- "name": "is_top_level",
116
- "kind": "Boolean",
117
- "read_only": True,
118
- "optional": True,
119
- "allow_override": AllowOverrideType.NONE,
120
- },
121
- {
122
- "name": "utilization",
123
- "kind": "Number",
124
- "read_only": True,
125
- "optional": True,
126
- "allow_override": AllowOverrideType.NONE,
127
- },
128
- {
129
- "name": "netmask",
130
- "kind": "Text",
131
- "read_only": True,
132
- "optional": True,
133
- "allow_override": AllowOverrideType.NONE,
134
- },
135
- {
136
- "name": "hostmask",
137
- "kind": "Text",
138
- "read_only": True,
139
- "optional": True,
140
- "allow_override": AllowOverrideType.NONE,
141
- },
142
- {
143
- "name": "network_address",
144
- "kind": "Text",
145
- "read_only": True,
146
- "optional": True,
147
- "allow_override": AllowOverrideType.NONE,
148
- },
149
- {
150
- "name": "broadcast_address",
151
- "kind": "Text",
152
- "read_only": True,
153
- "optional": True,
154
- "allow_override": AllowOverrideType.NONE,
155
- },
88
+ branch=BranchSupportType.AWARE,
89
+ default_value="address",
90
+ order_weight=3000,
91
+ ),
92
+ Attr(
93
+ name="is_pool",
94
+ kind="Boolean",
95
+ branch=BranchSupportType.AWARE,
96
+ default_value=False,
97
+ order_weight=4000,
98
+ description="All IP addresses within this prefix are considered usable",
99
+ ),
100
+ Attr(name="is_top_level", kind="Boolean", read_only=True, optional=True, allow_override=AllowOverrideType.NONE),
101
+ Attr(name="utilization", kind="Number", read_only=True, optional=True, allow_override=AllowOverrideType.NONE),
102
+ Attr(name="netmask", kind="Text", read_only=True, optional=True, allow_override=AllowOverrideType.NONE),
103
+ Attr(name="hostmask", kind="Text", read_only=True, optional=True, allow_override=AllowOverrideType.NONE),
104
+ Attr(name="network_address", kind="Text", read_only=True, optional=True, allow_override=AllowOverrideType.NONE),
105
+ Attr(
106
+ name="broadcast_address", kind="Text", read_only=True, optional=True, allow_override=AllowOverrideType.NONE
107
+ ),
156
108
  ],
157
- "relationships": [
158
- {
159
- "name": "ip_namespace",
160
- "label": "IP Namespace",
161
- "peer": InfrahubKind.IPNAMESPACE,
162
- "identifier": "ip_namespace__ip_prefix",
163
- "optional": True,
164
- "cardinality": "one",
165
- "allow_override": AllowOverrideType.NONE,
166
- },
167
- {
168
- "name": "ip_addresses",
169
- "label": "IP Addresses",
170
- "peer": InfrahubKind.IPADDRESS,
171
- "identifier": "ip_prefix__ip_address",
172
- "optional": True,
173
- "cardinality": "many",
174
- "allow_override": AllowOverrideType.NONE,
175
- "read_only": True,
176
- },
177
- {
178
- "name": "resource_pool",
179
- "peer": "CoreIPAddressPool",
180
- "identifier": "ipaddresspool__resource",
181
- "cardinality": "many",
182
- "branch": BranchSupportType.AGNOSTIC.value,
183
- "optional": True,
184
- "read_only": True,
185
- },
109
+ relationships=[
110
+ Rel(
111
+ name="ip_namespace",
112
+ label="IP Namespace",
113
+ peer=InfrahubKind.IPNAMESPACE,
114
+ identifier="ip_namespace__ip_prefix",
115
+ optional=True,
116
+ cardinality=Cardinality.ONE,
117
+ allow_override=AllowOverrideType.NONE,
118
+ ),
119
+ Rel(
120
+ name="ip_addresses",
121
+ label="IP Addresses",
122
+ peer=InfrahubKind.IPADDRESS,
123
+ identifier="ip_prefix__ip_address",
124
+ optional=True,
125
+ cardinality=Cardinality.MANY,
126
+ allow_override=AllowOverrideType.NONE,
127
+ read_only=True,
128
+ ),
129
+ Rel(
130
+ name="resource_pool",
131
+ peer="CoreIPAddressPool",
132
+ identifier="ipaddresspool__resource",
133
+ cardinality=Cardinality.MANY,
134
+ branch=BranchSupportType.AGNOSTIC,
135
+ optional=True,
136
+ read_only=True,
137
+ ),
186
138
  ],
187
- }
139
+ )
188
140
 
189
- builtin_ip_address = {
190
- "name": "IPAddress",
191
- "label": "IP Address",
192
- "namespace": "Builtin",
193
- "description": "IPv6 or IPv4 address",
194
- "include_in_menu": False,
195
- "default_filter": "address__value",
196
- "order_by": ["address__version", "address__binary_address"],
197
- "display_labels": ["address__value"],
198
- "icon": "mdi:ip-outline",
199
- "branch": BranchSupportType.AWARE.value,
200
- "attributes": [
201
- {
202
- "name": "address",
203
- "kind": "IPHost",
204
- "branch": BranchSupportType.AWARE.value,
205
- "order_weight": 1000,
206
- },
207
- {
208
- "name": "description",
209
- "kind": "Text",
210
- "optional": True,
211
- "branch": BranchSupportType.AWARE.value,
212
- "order_weight": 2000,
213
- },
141
+ builtin_ip_address = GenericSchema(
142
+ name="IPAddress",
143
+ label="IP Address",
144
+ namespace="Builtin",
145
+ description="IPv6 or IPv4 address",
146
+ include_in_menu=False,
147
+ default_filter="address__value",
148
+ order_by=["address__version", "address__binary_address"],
149
+ display_labels=["address__value"],
150
+ icon="mdi:ip-outline",
151
+ branch=BranchSupportType.AWARE,
152
+ attributes=[
153
+ Attr(name="address", kind="IPHost", branch=BranchSupportType.AWARE, order_weight=1000),
154
+ Attr(name="description", kind="Text", optional=True, branch=BranchSupportType.AWARE, order_weight=2000),
214
155
  ],
215
- "relationships": [
216
- {
217
- "name": "ip_namespace",
218
- "label": "IP Namespace",
219
- "peer": InfrahubKind.IPNAMESPACE,
220
- "identifier": "ip_namespace__ip_address",
221
- "optional": True,
222
- "cardinality": "one",
223
- "allow_override": AllowOverrideType.NONE,
224
- },
225
- {
226
- "name": "ip_prefix",
227
- "label": "IP Prefix",
228
- "peer": InfrahubKind.IPPREFIX,
229
- "identifier": "ip_prefix__ip_address",
230
- "optional": True,
231
- "cardinality": "one",
232
- "allow_override": AllowOverrideType.NONE,
233
- "read_only": True,
234
- },
156
+ relationships=[
157
+ Rel(
158
+ name="ip_namespace",
159
+ label="IP Namespace",
160
+ peer=InfrahubKind.IPNAMESPACE,
161
+ identifier="ip_namespace__ip_address",
162
+ optional=True,
163
+ cardinality=Cardinality.ONE,
164
+ allow_override=AllowOverrideType.NONE,
165
+ ),
166
+ Rel(
167
+ name="ip_prefix",
168
+ label="IP Prefix",
169
+ peer=InfrahubKind.IPPREFIX,
170
+ identifier="ip_prefix__ip_address",
171
+ optional=True,
172
+ cardinality=Cardinality.ONE,
173
+ allow_override=AllowOverrideType.NONE,
174
+ read_only=True,
175
+ ),
235
176
  ],
236
- }
177
+ )
237
178
 
238
- core_ipam_namespace = {
239
- "name": "Namespace",
240
- "namespace": "Ipam",
241
- "description": "A namespace that segments IPAM",
242
- "label": "IPAM Namespace",
243
- "default_filter": "name__value",
244
- "human_friendly_id": ["name__value"],
245
- "order_by": ["name__value"],
246
- "display_labels": ["name__value"],
247
- "include_in_menu": False,
248
- "icon": "mdi:format-list-group",
249
- "branch": BranchSupportType.AWARE.value,
250
- "inherit_from": [InfrahubKind.IPNAMESPACE],
251
- "attributes": [{"name": "default", "kind": "Boolean", "optional": True, "read_only": True, "order_weight": 9000}],
252
- }
179
+ core_ipam_namespace = NodeSchema(
180
+ name="Namespace",
181
+ namespace="Ipam",
182
+ description="A namespace that segments IPAM",
183
+ label="IPAM Namespace",
184
+ default_filter="name__value",
185
+ human_friendly_id=["name__value"],
186
+ order_by=["name__value"],
187
+ display_labels=["name__value"],
188
+ include_in_menu=False,
189
+ icon="mdi:format-list-group",
190
+ branch=BranchSupportType.AWARE,
191
+ inherit_from=[InfrahubKind.IPNAMESPACE],
192
+ attributes=[Attr(name="default", kind="Boolean", optional=True, read_only=True, order_weight=9000)],
193
+ )