infrahub-server 1.1.6__py3-none-any.whl → 1.2.0rc0__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.
- infrahub/api/artifact.py +16 -4
- infrahub/api/dependencies.py +8 -0
- infrahub/api/oauth2.py +0 -1
- infrahub/api/oidc.py +0 -1
- infrahub/api/query.py +18 -7
- infrahub/api/schema.py +32 -6
- infrahub/api/transformation.py +12 -5
- infrahub/{message_bus/messages/check_artifact_create.py → artifacts/models.py} +2 -4
- infrahub/{message_bus/operations/check/artifact.py → artifacts/tasks.py} +26 -25
- infrahub/cli/__init__.py +0 -2
- infrahub/cli/db.py +6 -7
- infrahub/cli/events.py +8 -3
- infrahub/cli/git_agent.py +9 -7
- infrahub/cli/tasks.py +4 -6
- infrahub/computed_attribute/tasks.py +63 -17
- infrahub/computed_attribute/triggers.py +90 -0
- infrahub/config.py +1 -1
- infrahub/context.py +39 -0
- infrahub/core/account.py +5 -8
- infrahub/core/attribute.py +53 -21
- infrahub/core/branch/models.py +4 -4
- infrahub/core/branch/tasks.py +89 -130
- infrahub/core/changelog/__init__.py +0 -0
- infrahub/core/changelog/diff.py +232 -0
- infrahub/core/changelog/models.py +488 -0
- infrahub/core/constants/__init__.py +19 -2
- infrahub/core/constants/infrahubkind.py +1 -0
- infrahub/core/diff/combiner.py +12 -8
- infrahub/core/diff/coordinator.py +49 -70
- infrahub/core/diff/data_check_synchronizer.py +86 -7
- infrahub/core/diff/enricher/aggregated.py +3 -3
- infrahub/core/diff/enricher/cardinality_one.py +2 -7
- infrahub/core/diff/enricher/hierarchy.py +5 -3
- infrahub/core/diff/enricher/labels.py +14 -4
- infrahub/core/diff/enricher/path_identifier.py +3 -9
- infrahub/core/diff/enricher/summary_counts.py +3 -1
- infrahub/core/diff/merger/merger.py +8 -4
- infrahub/core/diff/model/path.py +47 -29
- infrahub/core/diff/query/all_conflicts.py +6 -3
- infrahub/core/diff/query/artifact.py +1 -1
- infrahub/core/diff/query/delete_query.py +1 -1
- infrahub/core/diff/query/diff_get.py +3 -2
- infrahub/core/diff/query/diff_summary.py +1 -1
- infrahub/core/diff/query/field_specifiers.py +3 -1
- infrahub/core/diff/query/field_summary.py +3 -2
- infrahub/core/diff/query/filters.py +12 -1
- infrahub/core/diff/query/get_conflict_query.py +1 -1
- infrahub/core/diff/query/has_conflicts_query.py +6 -3
- infrahub/core/diff/query/merge.py +3 -3
- infrahub/core/diff/query/{drop_tracking_id.py → merge_tracking_id.py} +4 -4
- infrahub/core/diff/query/roots_metadata.py +9 -2
- infrahub/core/diff/query/save.py +151 -66
- infrahub/core/diff/query/summary_counts_enricher.py +220 -0
- infrahub/core/diff/query/time_range_query.py +3 -2
- infrahub/core/diff/query/update_conflict_query.py +1 -1
- infrahub/core/diff/query_parser.py +49 -24
- infrahub/core/diff/repository/deserializer.py +24 -25
- infrahub/core/diff/repository/repository.py +76 -20
- infrahub/core/diff/tasks.py +9 -8
- infrahub/core/enums.py +1 -1
- infrahub/core/integrity/object_conflict/conflict_recorder.py +1 -1
- infrahub/core/ipam/reconciler.py +1 -1
- infrahub/core/ipam/tasks.py +2 -3
- infrahub/core/manager.py +18 -13
- infrahub/core/merge.py +5 -2
- infrahub/core/migrations/graph/m001_add_version_to_graph.py +1 -1
- infrahub/core/migrations/graph/m002_attribute_is_default.py +2 -2
- infrahub/core/migrations/graph/m003_relationship_parent_optional.py +2 -2
- infrahub/core/migrations/graph/m004_add_attr_documentation.py +1 -1
- infrahub/core/migrations/graph/m005_add_rel_read_only.py +1 -1
- infrahub/core/migrations/graph/m006_add_rel_on_delete.py +1 -1
- infrahub/core/migrations/graph/m007_add_rel_allow_override.py +1 -1
- infrahub/core/migrations/graph/m008_add_human_friendly_id.py +1 -1
- infrahub/core/migrations/graph/m009_add_generate_profile_attr.py +1 -1
- infrahub/core/migrations/graph/m010_add_generate_profile_attr_generic.py +1 -1
- infrahub/core/migrations/graph/m011_remove_profile_relationship_schema.py +2 -2
- infrahub/core/migrations/graph/m012_convert_account_generic.py +12 -23
- infrahub/core/migrations/graph/m013_convert_git_password_credential.py +7 -11
- infrahub/core/migrations/graph/m014_remove_index_attr_value.py +2 -2
- infrahub/core/migrations/graph/m015_diff_format_update.py +1 -1
- infrahub/core/migrations/graph/m016_diff_delete_bug_fix.py +1 -1
- infrahub/core/migrations/graph/m017_add_core_profile.py +1 -1
- infrahub/core/migrations/graph/m018_uniqueness_nulls.py +2 -2
- infrahub/core/migrations/query/attribute_add.py +1 -1
- infrahub/core/migrations/query/attribute_rename.py +1 -1
- infrahub/core/migrations/query/delete_element_in_schema.py +1 -1
- infrahub/core/migrations/query/node_duplicate.py +1 -1
- infrahub/core/migrations/query/relationship_duplicate.py +1 -1
- infrahub/core/migrations/query/schema_attribute_update.py +1 -1
- infrahub/core/migrations/schema/node_attribute_remove.py +1 -1
- infrahub/core/migrations/schema/node_remove.py +1 -1
- infrahub/core/migrations/schema/tasks.py +5 -5
- infrahub/core/migrations/shared.py +4 -4
- infrahub/core/models.py +7 -8
- infrahub/core/node/__init__.py +161 -40
- infrahub/core/node/base.py +1 -1
- infrahub/core/node/constraints/grouped_uniqueness.py +9 -2
- infrahub/core/node/delete_validator.py +4 -4
- infrahub/core/node/ipam.py +13 -8
- infrahub/core/node/permissions.py +4 -0
- infrahub/core/node/resource_manager/ip_prefix_pool.py +8 -5
- infrahub/core/node/standard.py +3 -5
- infrahub/core/property.py +1 -1
- infrahub/core/protocols.py +4 -0
- infrahub/core/protocols_base.py +4 -2
- infrahub/core/query/__init__.py +2 -5
- infrahub/core/query/attribute.py +9 -9
- infrahub/core/query/branch.py +5 -5
- infrahub/core/query/delete.py +1 -1
- infrahub/core/query/diff.py +45 -7
- infrahub/core/query/ipam.py +4 -4
- infrahub/core/query/node.py +19 -14
- infrahub/core/query/relationship.py +10 -11
- infrahub/core/query/resource_manager.py +13 -11
- infrahub/core/query/standard_node.py +6 -6
- infrahub/core/query/task.py +3 -3
- infrahub/core/query/task_log.py +1 -1
- infrahub/core/query/utils.py +5 -5
- infrahub/core/registry.py +0 -2
- infrahub/core/relationship/constraints/count.py +1 -1
- infrahub/core/relationship/constraints/peer_kind.py +1 -1
- infrahub/core/relationship/model.py +66 -26
- infrahub/core/schema/__init__.py +6 -4
- infrahub/core/schema/basenode_schema.py +1 -3
- infrahub/core/schema/definitions/core.py +14 -2
- infrahub/core/schema/definitions/internal.py +16 -0
- infrahub/core/schema/generated/genericnode_schema.py +5 -0
- infrahub/core/schema/generated/node_schema.py +5 -0
- infrahub/core/schema/generic_schema.py +5 -1
- infrahub/core/schema/manager.py +45 -42
- infrahub/core/schema/node_schema.py +4 -0
- infrahub/core/schema/profile_schema.py +4 -0
- infrahub/core/schema/relationship_schema.py +2 -2
- infrahub/core/schema/schema_branch.py +248 -14
- infrahub/core/schema/template_schema.py +36 -0
- infrahub/core/task/user_task.py +7 -5
- infrahub/core/timestamp.py +1 -1
- infrahub/core/utils.py +3 -2
- infrahub/core/validators/attribute/choices.py +1 -1
- infrahub/core/validators/attribute/enum.py +1 -1
- infrahub/core/validators/attribute/kind.py +1 -1
- infrahub/core/validators/attribute/length.py +1 -1
- infrahub/core/validators/attribute/optional.py +1 -1
- infrahub/core/validators/attribute/regex.py +1 -1
- infrahub/core/validators/attribute/unique.py +1 -1
- infrahub/core/validators/checks_runner.py +37 -0
- infrahub/core/validators/node/generate_profile.py +1 -1
- infrahub/core/validators/node/hierarchy.py +1 -1
- infrahub/core/validators/query.py +1 -1
- infrahub/core/validators/relationship/count.py +1 -1
- infrahub/core/validators/relationship/optional.py +1 -1
- infrahub/core/validators/relationship/peer.py +1 -1
- infrahub/core/validators/tasks.py +8 -6
- infrahub/core/validators/uniqueness/query.py +20 -17
- infrahub/database/__init__.py +15 -2
- infrahub/database/memgraph.py +1 -1
- infrahub/dependencies/builder/constraint/grouped/node_runner.py +0 -2
- infrahub/dependencies/builder/diff/combiner.py +1 -1
- infrahub/dependencies/builder/diff/conflicts_enricher.py +1 -1
- infrahub/dependencies/builder/diff/coordinator.py +0 -2
- infrahub/dependencies/builder/diff/deserializer.py +1 -1
- infrahub/dependencies/builder/diff/enricher/summary_counts.py +1 -1
- infrahub/events/branch_action.py +47 -21
- infrahub/events/group_action.py +73 -0
- infrahub/events/models.py +159 -51
- infrahub/events/node_action.py +74 -8
- infrahub/events/repository_action.py +8 -8
- infrahub/events/schema_action.py +21 -8
- infrahub/generators/tasks.py +12 -13
- infrahub/git/base.py +3 -5
- infrahub/git/constants.py +0 -1
- infrahub/git/integrator.py +36 -35
- infrahub/git/repository.py +7 -8
- infrahub/git/tasks.py +43 -107
- infrahub/git_credential/helper.py +2 -3
- infrahub/graphql/analyzer.py +572 -11
- infrahub/graphql/app.py +34 -26
- infrahub/graphql/auth/query_permission_checker/anonymous_checker.py +5 -5
- infrahub/graphql/auth/query_permission_checker/default_branch_checker.py +4 -4
- infrahub/graphql/auth/query_permission_checker/merge_operation_checker.py +4 -4
- infrahub/graphql/auth/query_permission_checker/object_permission_checker.py +28 -35
- infrahub/graphql/auth/query_permission_checker/super_admin_checker.py +5 -5
- infrahub/graphql/enums.py +1 -1
- infrahub/graphql/initialization.py +5 -1
- infrahub/graphql/loaders/node.py +2 -2
- infrahub/graphql/manager.py +59 -54
- infrahub/graphql/mutations/account.py +20 -13
- infrahub/graphql/mutations/artifact_definition.py +16 -12
- infrahub/graphql/mutations/branch.py +61 -40
- infrahub/graphql/mutations/computed_attribute.py +19 -13
- infrahub/graphql/mutations/diff.py +37 -9
- infrahub/graphql/mutations/diff_conflict.py +9 -8
- infrahub/graphql/mutations/graphql_query.py +19 -11
- infrahub/graphql/mutations/ipam.py +21 -19
- infrahub/graphql/mutations/main.py +197 -44
- infrahub/graphql/mutations/menu.py +8 -8
- infrahub/graphql/mutations/proposed_change.py +36 -28
- infrahub/graphql/mutations/relationship.py +302 -105
- infrahub/graphql/mutations/repository.py +41 -35
- infrahub/graphql/mutations/resource_manager.py +26 -26
- infrahub/graphql/mutations/schema.py +51 -33
- infrahub/graphql/mutations/tasks.py +16 -10
- infrahub/graphql/parser.py +1 -1
- infrahub/graphql/permissions.py +6 -4
- infrahub/graphql/queries/account.py +22 -18
- infrahub/graphql/queries/branch.py +6 -4
- infrahub/graphql/queries/diff/tree.py +48 -42
- infrahub/graphql/queries/event.py +112 -0
- infrahub/graphql/queries/internal.py +3 -3
- infrahub/graphql/queries/ipam.py +23 -18
- infrahub/graphql/queries/relationship.py +11 -10
- infrahub/graphql/queries/resource_manager.py +43 -27
- infrahub/graphql/queries/search.py +9 -8
- infrahub/graphql/queries/status.py +12 -9
- infrahub/graphql/queries/task.py +11 -9
- infrahub/graphql/resolvers/resolver.py +69 -43
- infrahub/graphql/resolvers/single_relationship.py +16 -10
- infrahub/graphql/schema.py +2 -0
- infrahub/graphql/subscription/__init__.py +1 -1
- infrahub/graphql/subscription/events.py +1 -1
- infrahub/graphql/subscription/graphql_query.py +8 -8
- infrahub/graphql/types/branch.py +2 -2
- infrahub/graphql/types/common.py +6 -1
- infrahub/graphql/types/enums.py +2 -0
- infrahub/graphql/types/event.py +100 -0
- infrahub/graphql/types/interface.py +2 -2
- infrahub/graphql/types/node.py +3 -3
- infrahub/graphql/types/permission.py +2 -2
- infrahub/graphql/types/relationship.py +3 -3
- infrahub/graphql/types/standard_node.py +9 -11
- infrahub/graphql/utils.py +28 -182
- infrahub/groups/tasks.py +2 -3
- infrahub/lock.py +1 -1
- infrahub/menu/constants.py +1 -0
- infrahub/menu/generator.py +14 -3
- infrahub/menu/menu.py +116 -127
- infrahub/menu/models.py +4 -4
- infrahub/message_bus/messages/__init__.py +0 -4
- infrahub/message_bus/messages/event_branch_merge.py +3 -0
- infrahub/message_bus/messages/request_proposedchange_pipeline.py +2 -0
- infrahub/message_bus/operations/__init__.py +3 -5
- infrahub/message_bus/operations/check/__init__.py +2 -2
- infrahub/message_bus/operations/check/generator.py +1 -3
- infrahub/message_bus/operations/check/repository.py +1 -1
- infrahub/message_bus/operations/event/branch.py +7 -3
- infrahub/message_bus/operations/event/schema.py +1 -1
- infrahub/message_bus/operations/finalize/validator.py +1 -1
- infrahub/message_bus/operations/git/file.py +2 -2
- infrahub/message_bus/operations/git/repository.py +1 -1
- infrahub/message_bus/operations/requests/__init__.py +0 -2
- infrahub/message_bus/operations/requests/generator_definition.py +1 -1
- infrahub/message_bus/operations/requests/proposed_change.py +26 -11
- infrahub/message_bus/operations/requests/repository.py +2 -2
- infrahub/message_bus/operations/send/echo.py +1 -1
- infrahub/message_bus/types.py +1 -1
- infrahub/permissions/__init__.py +2 -1
- infrahub/permissions/types.py +26 -0
- infrahub/pools/prefix.py +29 -165
- infrahub/prefect_server/__init__.py +0 -0
- infrahub/prefect_server/app.py +18 -0
- infrahub/prefect_server/database.py +20 -0
- infrahub/prefect_server/events.py +28 -0
- infrahub/prefect_server/models.py +46 -0
- infrahub/proposed_change/models.py +15 -1
- infrahub/proposed_change/tasks.py +173 -35
- infrahub/pytest_plugin.py +4 -4
- infrahub/server.py +12 -11
- infrahub/services/__init__.py +147 -62
- infrahub/services/adapters/cache/__init__.py +7 -5
- infrahub/services/adapters/cache/nats.py +40 -22
- infrahub/services/adapters/cache/redis.py +0 -4
- infrahub/services/adapters/event/__init__.py +10 -18
- infrahub/services/adapters/http/__init__.py +0 -5
- infrahub/services/adapters/http/httpx.py +22 -15
- infrahub/services/adapters/message_bus/__init__.py +23 -6
- infrahub/services/adapters/message_bus/local.py +8 -6
- infrahub/services/adapters/message_bus/nats.py +12 -6
- infrahub/services/adapters/message_bus/rabbitmq.py +22 -9
- infrahub/services/adapters/workflow/__init__.py +11 -8
- infrahub/services/adapters/workflow/local.py +28 -7
- infrahub/services/adapters/workflow/worker.py +23 -7
- infrahub/services/component.py +38 -35
- infrahub/services/scheduler.py +32 -29
- infrahub/storage.py +2 -4
- infrahub/task_manager/constants.py +1 -1
- infrahub/task_manager/event.py +182 -0
- infrahub/task_manager/models.py +125 -1
- infrahub/task_manager/task.py +1 -1
- infrahub/tasks/artifact.py +14 -16
- infrahub/tasks/registry.py +1 -1
- infrahub/tasks/telemetry.py +13 -14
- infrahub/transformations/tasks.py +3 -5
- infrahub/trigger/__init__.py +0 -0
- infrahub/trigger/catalogue.py +15 -0
- infrahub/trigger/constants.py +9 -0
- infrahub/trigger/models.py +69 -0
- infrahub/trigger/tasks.py +85 -0
- infrahub/types.py +1 -1
- infrahub/utils.py +1 -1
- infrahub/webhook/constants.py +0 -2
- infrahub/webhook/models.py +8 -2
- infrahub/webhook/tasks.py +20 -73
- infrahub/webhook/triggers.py +20 -0
- infrahub/workers/infrahub_async.py +36 -25
- infrahub/workers/utils.py +63 -0
- infrahub/workflows/catalogue.py +13 -37
- infrahub/workflows/initialization.py +6 -8
- infrahub/workflows/models.py +3 -5
- infrahub/workflows/utils.py +1 -1
- infrahub_sdk/ctl/check.py +3 -3
- infrahub_sdk/ctl/cli_commands.py +11 -10
- infrahub_sdk/ctl/exceptions.py +0 -6
- infrahub_sdk/ctl/exporter.py +1 -1
- infrahub_sdk/ctl/generator.py +5 -5
- infrahub_sdk/ctl/importer.py +3 -2
- infrahub_sdk/ctl/menu.py +1 -1
- infrahub_sdk/ctl/object.py +1 -1
- infrahub_sdk/ctl/repository.py +23 -15
- infrahub_sdk/ctl/schema.py +2 -2
- infrahub_sdk/ctl/utils.py +4 -3
- infrahub_sdk/ctl/validate.py +2 -1
- infrahub_sdk/exceptions.py +6 -0
- infrahub_sdk/generator.py +3 -0
- infrahub_sdk/node.py +2 -2
- infrahub_sdk/schema/__init__.py +14 -2
- infrahub_sdk/schema/main.py +7 -0
- infrahub_sdk/utils.py +11 -1
- infrahub_sdk/yaml.py +2 -3
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/METADATA +46 -12
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/RECORD +338 -321
- infrahub_testcontainers/container.py +14 -6
- infrahub_testcontainers/docker-compose.test.yml +24 -5
- infrahub_testcontainers/haproxy.cfg +43 -0
- infrahub_testcontainers/helpers.py +85 -1
- infrahub/core/branch/constants.py +0 -2
- infrahub/graphql/query.py +0 -52
- infrahub/message_bus/messages/request_artifactdefinition_check.py +0 -17
- infrahub/message_bus/operations/requests/artifact_definition.py +0 -148
- infrahub/schema/constants.py +0 -1
- infrahub/schema/tasks.py +0 -76
- infrahub/services/adapters/database/__init__.py +0 -9
- infrahub_sdk/ctl/_file.py +0 -13
- /infrahub/{schema → artifacts}/__init__.py +0 -0
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/LICENSE.txt +0 -0
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/WHEEL +0 -0
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/entry_points.txt +0 -0
infrahub/core/node/ipam.py
CHANGED
|
@@ -19,10 +19,15 @@ class BuiltinIPPrefix(Node):
|
|
|
19
19
|
fields: Optional[dict] = None,
|
|
20
20
|
related_node_ids: Optional[set] = None,
|
|
21
21
|
filter_sensitive: bool = False,
|
|
22
|
-
permissions: Optional[dict] = None,
|
|
22
|
+
permissions: Optional[dict] = None, # noqa: ARG002
|
|
23
|
+
include_properties: bool = True,
|
|
23
24
|
) -> dict:
|
|
24
25
|
response = await super().to_graphql(
|
|
25
|
-
db,
|
|
26
|
+
db,
|
|
27
|
+
fields=fields,
|
|
28
|
+
related_node_ids=related_node_ids,
|
|
29
|
+
filter_sensitive=filter_sensitive,
|
|
30
|
+
include_properties=include_properties,
|
|
26
31
|
)
|
|
27
32
|
|
|
28
33
|
if fields:
|
|
@@ -35,8 +40,8 @@ class BuiltinIPPrefix(Node):
|
|
|
35
40
|
retrieved = await NodeManager.get_one(
|
|
36
41
|
db=db, branch=self._branch, id=self.id, fields={"member_type": None, "prefix": None}
|
|
37
42
|
)
|
|
38
|
-
self.member_type = retrieved.member_type # type: ignore[union-attr]
|
|
39
|
-
self.prefix = retrieved.prefix # type: ignore[union-attr]
|
|
43
|
+
self.member_type = retrieved.member_type # type: ignore[union-attr]
|
|
44
|
+
self.prefix = retrieved.prefix # type: ignore[union-attr]
|
|
40
45
|
utilization_getter = PrefixUtilizationGetter(db=db, ip_prefixes=[self])
|
|
41
46
|
utilization = await utilization_getter.get_use_percentage(
|
|
42
47
|
ip_prefixes=[self], branch_names=[self._branch.name]
|
|
@@ -46,12 +51,12 @@ class BuiltinIPPrefix(Node):
|
|
|
46
51
|
return response
|
|
47
52
|
|
|
48
53
|
async def get_resource_weight(self, db: InfrahubDatabase) -> int:
|
|
49
|
-
member_type = self.member_type.value # type: ignore[has-type]
|
|
50
|
-
prefixlen = self.prefix.prefixlen # type: ignore[has-type]
|
|
54
|
+
member_type = self.member_type.value # type: ignore[has-type]
|
|
55
|
+
prefixlen = self.prefix.prefixlen # type: ignore[has-type]
|
|
51
56
|
if member_type is None or prefixlen is None:
|
|
52
57
|
retrieved = await NodeManager.get_one(
|
|
53
58
|
db=db, branch=self._branch, id=self.id, fields={"member_type": None, "prefix": None}
|
|
54
59
|
)
|
|
55
|
-
self.member_type = retrieved.member_type # type: ignore[union-attr]
|
|
56
|
-
self.prefix = retrieved.prefix # type: ignore[union-attr]
|
|
60
|
+
self.member_type = retrieved.member_type # type: ignore[union-attr]
|
|
61
|
+
self.prefix = retrieved.prefix # type: ignore[union-attr]
|
|
57
62
|
return get_prefix_space(self)
|
|
@@ -18,6 +18,7 @@ class CoreGlobalPermission(Node):
|
|
|
18
18
|
related_node_ids: Optional[set] = None,
|
|
19
19
|
filter_sensitive: bool = False,
|
|
20
20
|
permissions: Optional[dict] = None,
|
|
21
|
+
include_properties: bool = True,
|
|
21
22
|
) -> dict:
|
|
22
23
|
response = await super().to_graphql(
|
|
23
24
|
db,
|
|
@@ -25,6 +26,7 @@ class CoreGlobalPermission(Node):
|
|
|
25
26
|
related_node_ids=related_node_ids,
|
|
26
27
|
filter_sensitive=filter_sensitive,
|
|
27
28
|
permissions=permissions,
|
|
29
|
+
include_properties=include_properties,
|
|
28
30
|
)
|
|
29
31
|
|
|
30
32
|
if fields:
|
|
@@ -43,6 +45,7 @@ class CoreObjectPermission(Node):
|
|
|
43
45
|
related_node_ids: Optional[set] = None,
|
|
44
46
|
filter_sensitive: bool = False,
|
|
45
47
|
permissions: Optional[dict] = None,
|
|
48
|
+
include_properties: bool = True,
|
|
46
49
|
) -> dict:
|
|
47
50
|
response = await super().to_graphql(
|
|
48
51
|
db,
|
|
@@ -50,6 +53,7 @@ class CoreObjectPermission(Node):
|
|
|
50
53
|
related_node_ids=related_node_ids,
|
|
51
54
|
filter_sensitive=filter_sensitive,
|
|
52
55
|
permissions=permissions,
|
|
56
|
+
include_properties=include_properties,
|
|
53
57
|
)
|
|
54
58
|
|
|
55
59
|
if fields:
|
|
@@ -3,6 +3,8 @@ from __future__ import annotations
|
|
|
3
3
|
import ipaddress
|
|
4
4
|
from typing import TYPE_CHECKING, Any, Optional
|
|
5
5
|
|
|
6
|
+
from netaddr import IPSet
|
|
7
|
+
|
|
6
8
|
from infrahub.core import registry
|
|
7
9
|
from infrahub.core.ipam.reconciler import IpamReconciler
|
|
8
10
|
from infrahub.core.query.ipam import get_subnets
|
|
@@ -11,7 +13,7 @@ from infrahub.core.query.resource_manager import (
|
|
|
11
13
|
PrefixPoolSetReserved,
|
|
12
14
|
)
|
|
13
15
|
from infrahub.exceptions import ValidationError
|
|
14
|
-
from infrahub.pools.prefix import
|
|
16
|
+
from infrahub.pools.prefix import get_next_available_prefix
|
|
15
17
|
|
|
16
18
|
from .. import Node
|
|
17
19
|
|
|
@@ -99,14 +101,15 @@ class CoreIPPrefixPool(Node):
|
|
|
99
101
|
branch_agnostic=True,
|
|
100
102
|
)
|
|
101
103
|
|
|
102
|
-
pool =
|
|
104
|
+
pool = IPSet([resource.prefix.value])
|
|
103
105
|
for subnet in subnets:
|
|
104
|
-
pool.
|
|
106
|
+
pool.remove(addr=str(subnet.prefix))
|
|
105
107
|
|
|
106
108
|
try:
|
|
107
|
-
|
|
109
|
+
prefix_ver = ipaddress.ip_network(resource.prefix.value).version
|
|
110
|
+
next_available = get_next_available_prefix(pool=pool, prefix_length=prefixlen, prefix_ver=prefix_ver)
|
|
108
111
|
return next_available
|
|
109
|
-
except
|
|
112
|
+
except ValueError:
|
|
110
113
|
continue
|
|
111
114
|
|
|
112
115
|
raise IndexError("No more resources available")
|
infrahub/core/node/standard.py
CHANGED
|
@@ -19,8 +19,6 @@ from infrahub.core.query.standard_node import (
|
|
|
19
19
|
)
|
|
20
20
|
from infrahub.exceptions import Error, InitializationError
|
|
21
21
|
|
|
22
|
-
# pylint: disable=redefined-builtin
|
|
23
|
-
|
|
24
22
|
if TYPE_CHECKING:
|
|
25
23
|
from neo4j.graph import Node as Neo4jNode
|
|
26
24
|
from pydantic.fields import FieldInfo
|
|
@@ -173,9 +171,9 @@ class StandardNode(BaseModel):
|
|
|
173
171
|
|
|
174
172
|
if value == NULL_VALUE:
|
|
175
173
|
attrs[key] = None
|
|
176
|
-
elif issubclass(field_type,
|
|
174
|
+
elif issubclass(field_type, int | float | bool | str | UUID):
|
|
177
175
|
attrs[key] = value
|
|
178
|
-
elif isinstance(value,
|
|
176
|
+
elif isinstance(value, str | bytes):
|
|
179
177
|
attrs[key] = ujson.loads(value)
|
|
180
178
|
|
|
181
179
|
return cls(**attrs)
|
|
@@ -203,7 +201,7 @@ class StandardNode(BaseModel):
|
|
|
203
201
|
data[attr_name] = ujson.dumps(clean_value)
|
|
204
202
|
else:
|
|
205
203
|
data[attr_name] = attr_value.model_dump_json()
|
|
206
|
-
elif issubclass(field_type,
|
|
204
|
+
elif issubclass(field_type, int | float | bool | str | UUID):
|
|
207
205
|
data[attr_name] = attr_value
|
|
208
206
|
else:
|
|
209
207
|
data[attr_name] = ujson.dumps(attr_value)
|
infrahub/core/property.py
CHANGED
|
@@ -123,7 +123,7 @@ class NodePropertyMixin:
|
|
|
123
123
|
If the value is a Node, we save the node and we extract the ID
|
|
124
124
|
if the value is None, we just initialize the 2 variables."""
|
|
125
125
|
|
|
126
|
-
if isinstance(value,
|
|
126
|
+
if isinstance(value, str | UUID):
|
|
127
127
|
setattr(self, f"{name}_id", value)
|
|
128
128
|
setattr(self, f"_{name}", None)
|
|
129
129
|
elif isinstance(value, dict) and "id" in value:
|
infrahub/core/protocols.py
CHANGED
infrahub/core/protocols_base.py
CHANGED
|
@@ -9,8 +9,6 @@ if TYPE_CHECKING:
|
|
|
9
9
|
|
|
10
10
|
from infrahub.core.schema.schema_branch import SchemaBranch
|
|
11
11
|
|
|
12
|
-
# pylint: disable=redefined-builtin
|
|
13
|
-
|
|
14
12
|
|
|
15
13
|
@runtime_checkable
|
|
16
14
|
class Timestamp(Protocol): ...
|
|
@@ -24,6 +22,10 @@ class NodeSchema(Protocol): ...
|
|
|
24
22
|
class ProfileSchema(Protocol): ...
|
|
25
23
|
|
|
26
24
|
|
|
25
|
+
@runtime_checkable
|
|
26
|
+
class TemplateSchema(Protocol): ...
|
|
27
|
+
|
|
28
|
+
|
|
27
29
|
@runtime_checkable
|
|
28
30
|
class Branch(Protocol): ...
|
|
29
31
|
|
infrahub/core/query/__init__.py
CHANGED
|
@@ -479,7 +479,7 @@ class Query(ABC):
|
|
|
479
479
|
"""Search for all the variables in a Query string and replace each variable with its value."""
|
|
480
480
|
|
|
481
481
|
def prep_value(v: Any) -> str:
|
|
482
|
-
if isinstance(v,
|
|
482
|
+
if isinstance(v, int | list):
|
|
483
483
|
return str(v)
|
|
484
484
|
return f'"{v}"'
|
|
485
485
|
|
|
@@ -517,7 +517,7 @@ class Query(ABC):
|
|
|
517
517
|
params = []
|
|
518
518
|
|
|
519
519
|
for key, value in self.params.items():
|
|
520
|
-
if isinstance(value,
|
|
520
|
+
if isinstance(value, int | list):
|
|
521
521
|
params.append(f"{key}: {str(value)}")
|
|
522
522
|
else:
|
|
523
523
|
params.append(f'{key}: "{value}"')
|
|
@@ -670,8 +670,6 @@ class Query(ABC):
|
|
|
670
670
|
return len([result for result in self.results if not result.has_deleted_rels])
|
|
671
671
|
|
|
672
672
|
def print_table(self) -> None:
|
|
673
|
-
# pylint: disable=import-outside-toplevel
|
|
674
|
-
|
|
675
673
|
from rich.console import Console
|
|
676
674
|
from rich.table import Table
|
|
677
675
|
|
|
@@ -689,7 +687,6 @@ class Query(ABC):
|
|
|
689
687
|
console.print(table)
|
|
690
688
|
|
|
691
689
|
def print(self, include_var: bool = False) -> None:
|
|
692
|
-
# pylint: disable=import-outside-toplevel
|
|
693
690
|
from rich import print as rprint
|
|
694
691
|
|
|
695
692
|
print("-------------------------------------------------------")
|
infrahub/core/query/attribute.py
CHANGED
|
@@ -44,7 +44,7 @@ class AttributeUpdateValueQuery(AttributeQuery):
|
|
|
44
44
|
|
|
45
45
|
raise_error_if_empty: bool = True
|
|
46
46
|
|
|
47
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None:
|
|
47
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
|
|
48
48
|
at = self.at or self.attr.at
|
|
49
49
|
|
|
50
50
|
self.params["attr_uuid"] = self.attr.id
|
|
@@ -93,7 +93,7 @@ class AttributeUpdateFlagQuery(AttributeQuery):
|
|
|
93
93
|
|
|
94
94
|
super().__init__(**kwargs)
|
|
95
95
|
|
|
96
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None:
|
|
96
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
|
|
97
97
|
at = self.at or self.attr.at
|
|
98
98
|
|
|
99
99
|
self.params["attr_uuid"] = self.attr.id
|
|
@@ -130,7 +130,7 @@ class AttributeUpdateNodePropertyQuery(AttributeQuery):
|
|
|
130
130
|
|
|
131
131
|
super().__init__(**kwargs)
|
|
132
132
|
|
|
133
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None:
|
|
133
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
|
|
134
134
|
at = self.at or self.attr.at
|
|
135
135
|
|
|
136
136
|
self.params["attr_uuid"] = self.attr.id
|
|
@@ -159,7 +159,7 @@ class AttributeGetQuery(AttributeQuery):
|
|
|
159
159
|
name = "attribute_get"
|
|
160
160
|
type: QueryType = QueryType.READ
|
|
161
161
|
|
|
162
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
162
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
163
163
|
self.params["attr_uuid"] = self.attr.id
|
|
164
164
|
self.params["node_uuid"] = self.attr.node.id
|
|
165
165
|
|
|
@@ -183,15 +183,15 @@ class AttributeGetQuery(AttributeQuery):
|
|
|
183
183
|
self.return_labels = ["a", "ap", "r2"]
|
|
184
184
|
|
|
185
185
|
|
|
186
|
-
async def default_attribute_query_filter(
|
|
186
|
+
async def default_attribute_query_filter(
|
|
187
187
|
name: str,
|
|
188
188
|
filter_name: str,
|
|
189
|
-
branch: Branch | None = None,
|
|
189
|
+
branch: Branch | None = None, # noqa: ARG001
|
|
190
190
|
filter_value: str | int | bool | list | None = None,
|
|
191
191
|
attribute_kind: str | None = None,
|
|
192
192
|
include_match: bool = True,
|
|
193
193
|
param_prefix: str | None = None,
|
|
194
|
-
db: InfrahubDatabase | None = None,
|
|
194
|
+
db: InfrahubDatabase | None = None, # noqa: ARG001
|
|
195
195
|
partial_match: bool = False,
|
|
196
196
|
support_profiles: bool = False,
|
|
197
197
|
) -> tuple[list[QueryElement], dict[str, Any], list[str]]:
|
|
@@ -201,10 +201,10 @@ async def default_attribute_query_filter( # pylint: disable=unused-argument,too
|
|
|
201
201
|
query_params: dict[str, Any] = {}
|
|
202
202
|
query_where: list[str] = []
|
|
203
203
|
|
|
204
|
-
if filter_value and not isinstance(filter_value,
|
|
204
|
+
if filter_value and not isinstance(filter_value, str | bool | int | list):
|
|
205
205
|
raise TypeError(f"filter {filter_name}: {filter_value} ({type(filter_value)}) is not supported.")
|
|
206
206
|
|
|
207
|
-
if isinstance(filter_value, list) and not all(isinstance(value,
|
|
207
|
+
if isinstance(filter_value, list) and not all(isinstance(value, str | bool | int) for value in filter_value):
|
|
208
208
|
raise TypeError(f"filter {filter_name}: {filter_value} (list) contains unsupported item")
|
|
209
209
|
|
|
210
210
|
param_prefix = param_prefix or f"attr_{name}"
|
infrahub/core/query/branch.py
CHANGED
|
@@ -20,7 +20,7 @@ class AddNodeToBranch(Query):
|
|
|
20
20
|
self.node_id = node_id
|
|
21
21
|
super().__init__(**kwargs)
|
|
22
22
|
|
|
23
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
23
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
24
24
|
query = """
|
|
25
25
|
MATCH (root:Root)
|
|
26
26
|
MATCH (d) WHERE %(id_func)s(d) = $node_id
|
|
@@ -50,7 +50,7 @@ class DeleteBranchRelationshipsQuery(Query):
|
|
|
50
50
|
self.branch_name = branch_name
|
|
51
51
|
super().__init__(**kwargs)
|
|
52
52
|
|
|
53
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
53
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
54
54
|
if config.SETTINGS.database.db_type == config.DatabaseType.MEMGRAPH:
|
|
55
55
|
query = """
|
|
56
56
|
MATCH p = (s)-[r]-(d)
|
|
@@ -78,7 +78,7 @@ class GetAllBranchInternalRelationshipQuery(Query):
|
|
|
78
78
|
type: QueryType = QueryType.READ
|
|
79
79
|
insert_return: bool = False
|
|
80
80
|
|
|
81
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
81
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
82
82
|
query = """
|
|
83
83
|
MATCH p = ()-[r]-()
|
|
84
84
|
WHERE r.branch = $branch_name
|
|
@@ -98,7 +98,7 @@ class RebaseBranchUpdateRelationshipQuery(Query):
|
|
|
98
98
|
self.ids = ids
|
|
99
99
|
super().__init__(**kwargs)
|
|
100
100
|
|
|
101
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
101
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
102
102
|
query = """
|
|
103
103
|
MATCH ()-[r]->()
|
|
104
104
|
WHERE %(id_func)s(r) IN $ids
|
|
@@ -125,7 +125,7 @@ class RebaseBranchDeleteRelationshipQuery(Query):
|
|
|
125
125
|
self.ids = ids
|
|
126
126
|
super().__init__(**kwargs)
|
|
127
127
|
|
|
128
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
128
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
129
129
|
if config.SETTINGS.database.db_type == config.DatabaseType.MEMGRAPH:
|
|
130
130
|
query = """
|
|
131
131
|
MATCH p = (s)-[r]-(d)
|
infrahub/core/query/delete.py
CHANGED
|
@@ -15,7 +15,7 @@ class DeleteAfterTimeQuery(Query):
|
|
|
15
15
|
self.timestamp = timestamp
|
|
16
16
|
super().__init__(**kwargs)
|
|
17
17
|
|
|
18
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
18
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
19
19
|
self.params = {"timestamp": self.timestamp.to_string()}
|
|
20
20
|
query_1 = """
|
|
21
21
|
// ---------------------
|
infrahub/core/query/diff.py
CHANGED
|
@@ -63,7 +63,7 @@ class DiffCountChanges(Query):
|
|
|
63
63
|
self.diff_to = diff_to
|
|
64
64
|
super().__init__(**kwargs)
|
|
65
65
|
|
|
66
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
66
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
67
67
|
self.params = {
|
|
68
68
|
"from_time": self.diff_from.to_string(),
|
|
69
69
|
"to_time": self.diff_to.to_string(),
|
|
@@ -137,6 +137,14 @@ CALL {
|
|
|
137
137
|
r in relationships(latest_base_path)
|
|
138
138
|
WHERE r.from < $branch_from_time
|
|
139
139
|
)
|
|
140
|
+
// ------------------------
|
|
141
|
+
// special handling for nodes that had their kind updated,
|
|
142
|
+
// the migration leaves two nodes with the same UUID linked to the same Relationship
|
|
143
|
+
// ------------------------
|
|
144
|
+
AND (
|
|
145
|
+
n.uuid IS NULL OR base_prop.uuid IS NULL OR n.uuid <> base_prop.uuid
|
|
146
|
+
OR type(base_r_node) <> "IS_RELATED" OR type(base_r_prop) <> "IS_RELATED"
|
|
147
|
+
)
|
|
140
148
|
WITH latest_base_path, base_r_root, base_r_node, base_r_prop
|
|
141
149
|
ORDER BY base_r_prop.from DESC, base_r_node.from DESC, base_r_root.from DESC
|
|
142
150
|
LIMIT 1
|
|
@@ -146,7 +154,7 @@ CALL {
|
|
|
146
154
|
relationship_peer_side_query = """
|
|
147
155
|
WITH diff_path, latest_base_path, has_more_data
|
|
148
156
|
UNWIND [diff_path, latest_base_path] AS penultimate_path
|
|
149
|
-
WITH penultimate_path, has_more_data
|
|
157
|
+
WITH DISTINCT penultimate_path, has_more_data
|
|
150
158
|
CALL {
|
|
151
159
|
WITH penultimate_path
|
|
152
160
|
WITH penultimate_path, nodes(penultimate_path) AS d_nodes, relationships(penultimate_path) AS d_rels
|
|
@@ -175,8 +183,13 @@ CALL {
|
|
|
175
183
|
OR peer_r_node.to IS NULL
|
|
176
184
|
OR peer_r_node.to >= r_peer.from
|
|
177
185
|
)
|
|
186
|
+
// ------------------------
|
|
187
|
+
// special handling for nodes that had their kind updated,
|
|
188
|
+
// the migration leaves two nodes with the same UUID linked to the same Relationship
|
|
189
|
+
// ------------------------
|
|
190
|
+
AND (n.uuid IS NULL OR peer.uuid IS NULL OR n.uuid <> peer.uuid)
|
|
178
191
|
WITH peer_path, r_peer, r_prop
|
|
179
|
-
ORDER BY r_peer.branch = r_prop.branch DESC, r_peer.from DESC
|
|
192
|
+
ORDER BY r_peer.branch = r_prop.branch DESC, r_peer.status = r_prop.status DESC, r_peer.from DESC, r_peer.status ASC
|
|
180
193
|
LIMIT 1
|
|
181
194
|
RETURN peer_path
|
|
182
195
|
}
|
|
@@ -213,7 +226,7 @@ WITH reduce(
|
|
|
213
226
|
class DiffNodePathsQuery(DiffCalculationQuery):
|
|
214
227
|
name = "diff_node_paths"
|
|
215
228
|
|
|
216
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
229
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
217
230
|
params_dict = self.get_params()
|
|
218
231
|
self.params.update(params_dict)
|
|
219
232
|
self.params.update(
|
|
@@ -309,6 +322,14 @@ CALL {
|
|
|
309
322
|
AND [%(id_func)s(p), type(r_node)] <> [%(id_func)s(prop), type(r_prop)]
|
|
310
323
|
AND top_diff_rel.status = r_node.status
|
|
311
324
|
AND top_diff_rel.status = r_prop.status
|
|
325
|
+
// ------------------------
|
|
326
|
+
// special handling for nodes that had their kind updated,
|
|
327
|
+
// the migration leaves two nodes with the same UUID linked to the same Relationship
|
|
328
|
+
// ------------------------
|
|
329
|
+
AND (
|
|
330
|
+
p.uuid IS NULL OR prop.uuid IS NULL OR p.uuid <> prop.uuid
|
|
331
|
+
OR type(r_node) <> "IS_RELATED" OR type(r_prop) <> "IS_RELATED"
|
|
332
|
+
)
|
|
312
333
|
WITH path, p, node, prop, r_prop, r_node, type(r_node) AS rel_type, row_from_time
|
|
313
334
|
// -------------------------------------
|
|
314
335
|
// Exclude attributes/relationships added then removed on branch within timeframe
|
|
@@ -344,7 +365,7 @@ CALL {
|
|
|
344
365
|
class DiffFieldPathsQuery(DiffCalculationQuery):
|
|
345
366
|
name = "diff_field_paths"
|
|
346
367
|
|
|
347
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
368
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
348
369
|
params_dict = self.get_params()
|
|
349
370
|
self.params.update(params_dict)
|
|
350
371
|
|
|
@@ -483,17 +504,26 @@ CALL {
|
|
|
483
504
|
AND [%(id_func)s(p), type(mid_diff_rel)] <> [%(id_func)s(prop), type(r_prop)]
|
|
484
505
|
// exclude paths where an active edge is below a deleted edge
|
|
485
506
|
AND (mid_diff_rel.status = "active" OR r_prop.status = "deleted")
|
|
507
|
+
// ------------------------
|
|
508
|
+
// special handling for nodes that had their kind updated,
|
|
509
|
+
// the migration leaves two nodes with the same UUID linked to the same Relationship
|
|
510
|
+
// ------------------------
|
|
511
|
+
AND (
|
|
512
|
+
p.uuid IS NULL OR prop.uuid IS NULL OR p.uuid <> prop.uuid
|
|
513
|
+
OR type(mid_diff_rel) <> "IS_RELATED" OR type(r_prop) <> "IS_RELATED"
|
|
514
|
+
)
|
|
486
515
|
WITH path, prop, r_prop, mid_r_root
|
|
487
516
|
ORDER BY
|
|
488
517
|
type(r_prop),
|
|
489
518
|
mid_r_root.branch = mid_diff_rel.branch DESC,
|
|
519
|
+
(mid_diff_rel.status = r_prop.status AND mid_diff_rel.branch = r_prop.branch) DESC,
|
|
490
520
|
r_prop.from DESC,
|
|
491
521
|
mid_r_root.from DESC
|
|
492
522
|
WITH prop, type(r_prop) AS type_r_prop, head(collect(path)) AS latest_prop_path
|
|
493
523
|
RETURN latest_prop_path
|
|
494
524
|
}
|
|
495
525
|
// -------------------------------------
|
|
496
|
-
// Exclude properties within the timeframe
|
|
526
|
+
// Exclude properties added and deleted within the timeframe
|
|
497
527
|
// -------------------------------------
|
|
498
528
|
WITH q, nodes(latest_prop_path)[3] AS prop, type(relationships(latest_prop_path)[2]) AS rel_type, latest_prop_path, has_more_data, row_from_time
|
|
499
529
|
CALL {
|
|
@@ -518,7 +548,7 @@ WHERE intra_branch_update = FALSE
|
|
|
518
548
|
class DiffPropertyPathsQuery(DiffCalculationQuery):
|
|
519
549
|
name = "diff_property_paths"
|
|
520
550
|
|
|
521
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
551
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
522
552
|
params_dict = self.get_params()
|
|
523
553
|
self.params.update(params_dict)
|
|
524
554
|
|
|
@@ -594,6 +624,14 @@ AND (
|
|
|
594
624
|
)
|
|
595
625
|
)
|
|
596
626
|
)
|
|
627
|
+
// ------------------------
|
|
628
|
+
// special handling for nodes that had their kind updated,
|
|
629
|
+
// the migration leaves two nodes with the same UUID linked to the same Relationship
|
|
630
|
+
// ------------------------
|
|
631
|
+
AND (
|
|
632
|
+
n.uuid IS NULL OR q.uuid IS NULL OR n.uuid <> q.uuid
|
|
633
|
+
OR type(r_node) <> "IS_RELATED" OR type(diff_rel) <> "IS_RELATED"
|
|
634
|
+
)
|
|
597
635
|
AND ALL(
|
|
598
636
|
r_pair IN [[r_root, r_node], [r_node, diff_rel]]
|
|
599
637
|
// filter out paths where a base branch edge follows a branch edge
|
infrahub/core/query/ipam.py
CHANGED
|
@@ -62,7 +62,7 @@ class IPPrefixSubnetFetch(Query):
|
|
|
62
62
|
|
|
63
63
|
super().__init__(**kwargs)
|
|
64
64
|
|
|
65
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
65
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
66
66
|
self.params["ns_id"] = self.namespace_id
|
|
67
67
|
|
|
68
68
|
prefix_bin = convert_ip_to_binary_str(self.obj)[: self.obj.prefixlen]
|
|
@@ -153,7 +153,7 @@ class IPPrefixIPAddressFetch(Query):
|
|
|
153
153
|
|
|
154
154
|
super().__init__(**kwargs)
|
|
155
155
|
|
|
156
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
156
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
157
157
|
self.params["ns_id"] = self.namespace_id
|
|
158
158
|
|
|
159
159
|
prefix_bin = convert_ip_to_binary_str(self.obj)[: self.obj.prefixlen]
|
|
@@ -261,7 +261,7 @@ class IPPrefixUtilization(Query):
|
|
|
261
261
|
|
|
262
262
|
super().__init__(**kwargs)
|
|
263
263
|
|
|
264
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
264
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
265
265
|
self.params["ids"] = [p.get_id() for p in self.ip_prefixes]
|
|
266
266
|
self.params["time_at"] = self.at.to_string()
|
|
267
267
|
|
|
@@ -336,7 +336,7 @@ class IPPrefixReconcileQuery(Query):
|
|
|
336
336
|
self.namespace_id = _get_namespace_id(namespace)
|
|
337
337
|
super().__init__(**kwargs)
|
|
338
338
|
|
|
339
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
339
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
340
340
|
branch_filter, branch_params = self.branch.get_query_filter_path(at=self.at.to_string())
|
|
341
341
|
self.params.update(branch_params)
|
|
342
342
|
self.params["namespace_kind"] = InfrahubKind.IPNAMESPACE
|
infrahub/core/query/node.py
CHANGED
|
@@ -31,14 +31,13 @@ if TYPE_CHECKING:
|
|
|
31
31
|
from infrahub.core.schema import GenericSchema, NodeSchema
|
|
32
32
|
from infrahub.core.schema.profile_schema import ProfileSchema
|
|
33
33
|
from infrahub.core.schema.relationship_schema import RelationshipSchema
|
|
34
|
+
from infrahub.core.schema.template_schema import TemplateSchema
|
|
34
35
|
from infrahub.database import InfrahubDatabase
|
|
35
36
|
|
|
36
|
-
# pylint: disable=consider-using-f-string,redefined-builtin,too-many-lines
|
|
37
|
-
|
|
38
37
|
|
|
39
38
|
@dataclass
|
|
40
39
|
class NodeToProcess:
|
|
41
|
-
schema: Optional[Union[NodeSchema, ProfileSchema]]
|
|
40
|
+
schema: Optional[Union[NodeSchema, ProfileSchema, TemplateSchema]]
|
|
42
41
|
|
|
43
42
|
node_id: str
|
|
44
43
|
node_uuid: str
|
|
@@ -127,7 +126,7 @@ class NodeCreateAllQuery(NodeQuery):
|
|
|
127
126
|
|
|
128
127
|
raise_error_if_empty: bool = True
|
|
129
128
|
|
|
130
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
129
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
131
130
|
at = self.at or self.node._at
|
|
132
131
|
self.params["uuid"] = self.node.id
|
|
133
132
|
self.params["branch"] = self.branch.name
|
|
@@ -360,7 +359,7 @@ class NodeDeleteQuery(NodeQuery):
|
|
|
360
359
|
|
|
361
360
|
raise_error_if_empty: bool = True
|
|
362
361
|
|
|
363
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
362
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
364
363
|
self.params["uuid"] = self.node_id
|
|
365
364
|
self.params["branch"] = self.branch.name
|
|
366
365
|
self.params["branch_level"] = self.branch.hierarchy_level
|
|
@@ -390,7 +389,7 @@ class NodeCheckIDQuery(Query):
|
|
|
390
389
|
self.node_id = node_id
|
|
391
390
|
super().__init__(**kwargs)
|
|
392
391
|
|
|
393
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
392
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
394
393
|
self.params["uuid"] = self.node_id
|
|
395
394
|
|
|
396
395
|
query = """
|
|
@@ -430,7 +429,7 @@ class NodeListGetAttributeQuery(Query):
|
|
|
430
429
|
|
|
431
430
|
super().__init__(order_by=["n.uuid", "a.name"], **kwargs)
|
|
432
431
|
|
|
433
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
432
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
434
433
|
self.params["ids"] = self.ids
|
|
435
434
|
|
|
436
435
|
branch_filter, branch_params = self.branch.get_query_filter_path(
|
|
@@ -479,11 +478,17 @@ class NodeListGetAttributeQuery(Query):
|
|
|
479
478
|
self.return_labels = ["n", "a", "av", "r1", "r2"]
|
|
480
479
|
|
|
481
480
|
# Add Is_Protected and Is_visible
|
|
481
|
+
rel_isv_branch_filter, _ = self.branch.get_query_filter_path(
|
|
482
|
+
at=self.at, branch_agnostic=self.branch_agnostic, variable_name="rel_isv"
|
|
483
|
+
)
|
|
484
|
+
rel_isp_branch_filter, _ = self.branch.get_query_filter_path(
|
|
485
|
+
at=self.at, branch_agnostic=self.branch_agnostic, variable_name="rel_isp"
|
|
486
|
+
)
|
|
482
487
|
query = """
|
|
483
488
|
MATCH (a)-[rel_isv:IS_VISIBLE]-(isv:Boolean)
|
|
484
489
|
MATCH (a)-[rel_isp:IS_PROTECTED]-(isp:Boolean)
|
|
485
|
-
WHERE
|
|
486
|
-
""" % {"
|
|
490
|
+
WHERE (%(rel_isv_branch_filter)s) AND (%(rel_isp_branch_filter)s)
|
|
491
|
+
""" % {"rel_isv_branch_filter": rel_isv_branch_filter, "rel_isp_branch_filter": rel_isp_branch_filter}
|
|
487
492
|
self.add_to_query(query)
|
|
488
493
|
|
|
489
494
|
self.return_labels.extend(["isv", "isp", "rel_isv", "rel_isp"])
|
|
@@ -601,7 +606,7 @@ class NodeListGetRelationshipsQuery(Query):
|
|
|
601
606
|
self.relationship_identifiers = relationship_identifiers
|
|
602
607
|
super().__init__(**kwargs)
|
|
603
608
|
|
|
604
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
|
|
609
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
|
|
605
610
|
self.params["ids"] = self.ids
|
|
606
611
|
self.params["relationship_identifiers"] = self.relationship_identifiers
|
|
607
612
|
|
|
@@ -657,7 +662,7 @@ class NodeGetKindQuery(Query):
|
|
|
657
662
|
self.ids = ids
|
|
658
663
|
super().__init__(**kwargs)
|
|
659
664
|
|
|
660
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
665
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
661
666
|
query = """
|
|
662
667
|
MATCH p = (root:Root)<-[r_root:IS_PART_OF]-(n:Node)
|
|
663
668
|
WHERE n.uuid IN $ids
|
|
@@ -683,7 +688,7 @@ class NodeListGetInfoQuery(Query):
|
|
|
683
688
|
self.ids = ids
|
|
684
689
|
super().__init__(**kwargs)
|
|
685
690
|
|
|
686
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
691
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
687
692
|
branch_filter, branch_params = self.branch.get_query_filter_path(
|
|
688
693
|
at=self.at, branch_agnostic=self.branch_agnostic
|
|
689
694
|
)
|
|
@@ -873,7 +878,7 @@ class NodeGetListQuery(Query):
|
|
|
873
878
|
def _get_tracked_variables(self) -> list[str]:
|
|
874
879
|
return self._variables_to_track
|
|
875
880
|
|
|
876
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
|
|
881
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
877
882
|
self.order_by = []
|
|
878
883
|
|
|
879
884
|
self.return_labels = ["n.uuid", "rb.branch", f"{db.get_id_function_name()}(rb) as rb_id"]
|
|
@@ -1272,7 +1277,7 @@ class NodeGetHierarchyQuery(Query):
|
|
|
1272
1277
|
|
|
1273
1278
|
super().__init__(**kwargs)
|
|
1274
1279
|
|
|
1275
|
-
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: #
|
|
1280
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
|
|
1276
1281
|
hierarchy_schema = self.node_schema.get_hierarchy_schema(db=db, branch=self.branch)
|
|
1277
1282
|
branch_filter, branch_params = self.branch.get_query_filter_path(at=self.at.to_string())
|
|
1278
1283
|
self.params.update(branch_params)
|