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
|
@@ -28,8 +28,6 @@ if TYPE_CHECKING:
|
|
|
28
28
|
from ..initialization import GraphqlContext
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
# pylint: disable=unused-argument
|
|
32
|
-
|
|
33
31
|
log = get_logger()
|
|
34
32
|
|
|
35
33
|
|
|
@@ -57,28 +55,30 @@ class BranchCreate(Mutation):
|
|
|
57
55
|
@trace.get_tracer(__name__).start_as_current_span("branch_create")
|
|
58
56
|
async def mutate(
|
|
59
57
|
cls,
|
|
60
|
-
root: dict,
|
|
58
|
+
root: dict, # noqa: ARG003
|
|
61
59
|
info: GraphQLResolveInfo,
|
|
62
60
|
data: BranchCreateInput,
|
|
63
61
|
background_execution: bool = False,
|
|
64
62
|
wait_until_completion: bool = True,
|
|
65
63
|
) -> Self:
|
|
66
|
-
|
|
64
|
+
graphql_context: GraphqlContext = info.context
|
|
67
65
|
task: dict | None = None
|
|
68
66
|
|
|
69
67
|
model = BranchCreateModel(**data)
|
|
70
68
|
|
|
71
69
|
if background_execution or not wait_until_completion:
|
|
72
|
-
workflow = await
|
|
73
|
-
workflow=BRANCH_CREATE, parameters={"model": model}
|
|
70
|
+
workflow = await graphql_context.active_service.workflow.submit_workflow(
|
|
71
|
+
workflow=BRANCH_CREATE, context=graphql_context.get_context(), parameters={"model": model}
|
|
74
72
|
)
|
|
75
73
|
task = {"id": workflow.id}
|
|
76
74
|
return cls(ok=True, task=task)
|
|
77
75
|
|
|
78
|
-
await
|
|
76
|
+
await graphql_context.active_service.workflow.execute_workflow(
|
|
77
|
+
workflow=BRANCH_CREATE, context=graphql_context.get_context(), parameters={"model": model}
|
|
78
|
+
)
|
|
79
79
|
|
|
80
80
|
# Retrieve created branch
|
|
81
|
-
obj = await Branch.get_by_name(db=
|
|
81
|
+
obj = await Branch.get_by_name(db=graphql_context.db, name=model.name)
|
|
82
82
|
fields = await extract_fields(info.field_nodes[0].selection_set)
|
|
83
83
|
return cls(object=await obj.to_graphql(fields=fields.get("object", {})), ok=True, task=task)
|
|
84
84
|
|
|
@@ -103,19 +103,23 @@ class BranchDelete(Mutation):
|
|
|
103
103
|
|
|
104
104
|
@classmethod
|
|
105
105
|
async def mutate(
|
|
106
|
-
cls,
|
|
106
|
+
cls,
|
|
107
|
+
root: dict, # noqa: ARG003
|
|
108
|
+
info: GraphQLResolveInfo,
|
|
109
|
+
data: BranchNameInput,
|
|
110
|
+
wait_until_completion: bool = True,
|
|
107
111
|
) -> Self:
|
|
108
|
-
|
|
109
|
-
obj = await Branch.get_by_name(db=
|
|
112
|
+
graphql_context: GraphqlContext = info.context
|
|
113
|
+
obj = await Branch.get_by_name(db=graphql_context.db, name=str(data.name))
|
|
110
114
|
|
|
111
115
|
if wait_until_completion:
|
|
112
|
-
await
|
|
113
|
-
workflow=BRANCH_DELETE, parameters={"branch": obj.name}
|
|
116
|
+
await graphql_context.active_service.workflow.execute_workflow(
|
|
117
|
+
workflow=BRANCH_DELETE, context=graphql_context.get_context(), parameters={"branch": obj.name}
|
|
114
118
|
)
|
|
115
119
|
return cls(ok=True)
|
|
116
120
|
|
|
117
|
-
workflow = await
|
|
118
|
-
workflow=BRANCH_DELETE, parameters={"branch": obj.name}
|
|
121
|
+
workflow = await graphql_context.active_service.workflow.submit_workflow(
|
|
122
|
+
workflow=BRANCH_DELETE, context=graphql_context.get_context(), parameters={"branch": obj.name}
|
|
119
123
|
)
|
|
120
124
|
return cls(ok=True, task={"id": str(workflow.id)})
|
|
121
125
|
|
|
@@ -128,17 +132,17 @@ class BranchUpdate(Mutation):
|
|
|
128
132
|
|
|
129
133
|
@classmethod
|
|
130
134
|
@retry_db_transaction(name="branch_update")
|
|
131
|
-
async def mutate(cls, root: dict, info: GraphQLResolveInfo, data: BranchNameInput) -> Self:
|
|
132
|
-
|
|
135
|
+
async def mutate(cls, root: dict, info: GraphQLResolveInfo, data: BranchNameInput) -> Self: # noqa: ARG003
|
|
136
|
+
graphql_context: GraphqlContext = info.context
|
|
133
137
|
|
|
134
|
-
obj = await Branch.get_by_name(db=
|
|
138
|
+
obj = await Branch.get_by_name(db=graphql_context.db, name=data["name"])
|
|
135
139
|
|
|
136
140
|
to_extract = ["description"]
|
|
137
141
|
for field_name in to_extract:
|
|
138
142
|
if field_name in data and data.get(field_name) is not None:
|
|
139
143
|
setattr(obj, field_name, data[field_name])
|
|
140
144
|
|
|
141
|
-
async with
|
|
145
|
+
async with graphql_context.db.start_transaction() as db:
|
|
142
146
|
await obj.save(db=db)
|
|
143
147
|
|
|
144
148
|
return cls(ok=True)
|
|
@@ -155,23 +159,27 @@ class BranchRebase(Mutation):
|
|
|
155
159
|
|
|
156
160
|
@classmethod
|
|
157
161
|
async def mutate(
|
|
158
|
-
cls,
|
|
162
|
+
cls,
|
|
163
|
+
root: dict, # noqa: ARG003
|
|
164
|
+
info: GraphQLResolveInfo,
|
|
165
|
+
data: BranchNameInput,
|
|
166
|
+
wait_until_completion: bool = True,
|
|
159
167
|
) -> Self:
|
|
160
|
-
|
|
168
|
+
graphql_context: GraphqlContext = info.context
|
|
161
169
|
|
|
162
|
-
obj = await Branch.get_by_name(db=
|
|
170
|
+
obj = await Branch.get_by_name(db=graphql_context.db, name=str(data.name))
|
|
163
171
|
task: dict | None = None
|
|
164
172
|
|
|
165
173
|
if wait_until_completion:
|
|
166
|
-
await
|
|
167
|
-
workflow=BRANCH_REBASE, parameters={"branch": obj.name}
|
|
174
|
+
await graphql_context.active_service.workflow.execute_workflow(
|
|
175
|
+
workflow=BRANCH_REBASE, context=graphql_context.get_context(), parameters={"branch": obj.name}
|
|
168
176
|
)
|
|
169
177
|
|
|
170
178
|
# Pull the latest information about the branch from the database directly
|
|
171
|
-
obj = await Branch.get_by_name(db=
|
|
179
|
+
obj = await Branch.get_by_name(db=graphql_context.db, name=str(data.name))
|
|
172
180
|
else:
|
|
173
|
-
workflow = await
|
|
174
|
-
workflow=BRANCH_REBASE, parameters={"branch": obj.name}
|
|
181
|
+
workflow = await graphql_context.active_service.workflow.submit_workflow(
|
|
182
|
+
workflow=BRANCH_REBASE, context=graphql_context.get_context(), parameters={"branch": obj.name}
|
|
175
183
|
)
|
|
176
184
|
task = {"id": workflow.id}
|
|
177
185
|
|
|
@@ -193,21 +201,25 @@ class BranchValidate(Mutation):
|
|
|
193
201
|
@classmethod
|
|
194
202
|
@retry_db_transaction(name="branch_validate")
|
|
195
203
|
async def mutate(
|
|
196
|
-
cls,
|
|
204
|
+
cls,
|
|
205
|
+
root: dict, # noqa: ARG003
|
|
206
|
+
info: GraphQLResolveInfo,
|
|
207
|
+
data: BranchNameInput,
|
|
208
|
+
wait_until_completion: bool = True,
|
|
197
209
|
) -> Self:
|
|
198
|
-
|
|
210
|
+
graphql_context: GraphqlContext = info.context
|
|
199
211
|
|
|
200
|
-
obj = await Branch.get_by_name(db=
|
|
212
|
+
obj = await Branch.get_by_name(db=graphql_context.db, name=str(data.name))
|
|
201
213
|
task: dict | None = None
|
|
202
214
|
ok = True
|
|
203
215
|
|
|
204
216
|
if wait_until_completion:
|
|
205
|
-
await
|
|
206
|
-
workflow=BRANCH_VALIDATE, parameters={"branch": obj.name}
|
|
217
|
+
await graphql_context.active_service.workflow.execute_workflow(
|
|
218
|
+
workflow=BRANCH_VALIDATE, context=graphql_context.get_context(), parameters={"branch": obj.name}
|
|
207
219
|
)
|
|
208
220
|
else:
|
|
209
|
-
workflow = await
|
|
210
|
-
workflow=BRANCH_VALIDATE, parameters={"branch": obj.name}
|
|
221
|
+
workflow = await graphql_context.active_service.workflow.submit_workflow(
|
|
222
|
+
workflow=BRANCH_VALIDATE, context=graphql_context.get_context(), parameters={"branch": obj.name}
|
|
211
223
|
)
|
|
212
224
|
task = {"id": workflow.id}
|
|
213
225
|
|
|
@@ -227,23 +239,32 @@ class BranchMerge(Mutation):
|
|
|
227
239
|
|
|
228
240
|
@classmethod
|
|
229
241
|
async def mutate(
|
|
230
|
-
cls,
|
|
242
|
+
cls,
|
|
243
|
+
root: dict, # noqa: ARG003
|
|
244
|
+
info: GraphQLResolveInfo,
|
|
245
|
+
data: BranchNameInput,
|
|
246
|
+
wait_until_completion: bool = True,
|
|
231
247
|
) -> Self:
|
|
232
248
|
branch_name = data["name"]
|
|
233
249
|
task: dict | None = None
|
|
250
|
+
graphql_context: GraphqlContext = info.context
|
|
234
251
|
|
|
235
252
|
if wait_until_completion:
|
|
236
|
-
await
|
|
237
|
-
workflow=BRANCH_MERGE_MUTATION,
|
|
253
|
+
await graphql_context.active_service.workflow.execute_workflow(
|
|
254
|
+
workflow=BRANCH_MERGE_MUTATION,
|
|
255
|
+
context=graphql_context.get_context(),
|
|
256
|
+
parameters={"branch": branch_name},
|
|
238
257
|
)
|
|
239
258
|
else:
|
|
240
|
-
workflow = await
|
|
241
|
-
workflow=BRANCH_MERGE_MUTATION,
|
|
259
|
+
workflow = await graphql_context.active_service.workflow.submit_workflow(
|
|
260
|
+
workflow=BRANCH_MERGE_MUTATION,
|
|
261
|
+
context=graphql_context.get_context(),
|
|
262
|
+
parameters={"branch": branch_name},
|
|
242
263
|
)
|
|
243
264
|
task = {"id": workflow.id}
|
|
244
265
|
|
|
245
266
|
# Pull the latest information about the branch from the database directly
|
|
246
|
-
obj = await Branch.get_by_name(db=
|
|
267
|
+
obj = await Branch.get_by_name(db=graphql_context.db, name=branch_name)
|
|
247
268
|
|
|
248
269
|
fields = await extract_fields(info.field_nodes[0].selection_set)
|
|
249
270
|
ok = True
|
|
@@ -9,7 +9,8 @@ from infrahub.core.constants import ComputedAttributeKind, MutationAction, Permi
|
|
|
9
9
|
from infrahub.core.manager import NodeManager
|
|
10
10
|
from infrahub.core.registry import registry
|
|
11
11
|
from infrahub.database import retry_db_transaction
|
|
12
|
-
from infrahub.events import EventMeta
|
|
12
|
+
from infrahub.events import EventMeta
|
|
13
|
+
from infrahub.events.node_action import NodeMutatedEvent
|
|
13
14
|
from infrahub.exceptions import NodeNotFoundError, ValidationError
|
|
14
15
|
from infrahub.log import get_log_data
|
|
15
16
|
from infrahub.worker import WORKER_IDENTITY
|
|
@@ -41,8 +42,10 @@ class UpdateComputedAttribute(Mutation):
|
|
|
41
42
|
info: GraphQLResolveInfo,
|
|
42
43
|
data: InfrahubComputedAttributeUpdateInput,
|
|
43
44
|
) -> UpdateComputedAttribute:
|
|
44
|
-
|
|
45
|
-
node_schema = registry.schema.get_node_schema(
|
|
45
|
+
graphql_context: GraphqlContext = info.context
|
|
46
|
+
node_schema = registry.schema.get_node_schema(
|
|
47
|
+
name=str(data.kind), branch=graphql_context.branch.name, duplicate=False
|
|
48
|
+
)
|
|
46
49
|
target_attribute = node_schema.get_attribute(name=str(data.attribute))
|
|
47
50
|
if (
|
|
48
51
|
not target_attribute.computed_attribute
|
|
@@ -50,20 +53,20 @@ class UpdateComputedAttribute(Mutation):
|
|
|
50
53
|
):
|
|
51
54
|
raise ValidationError(input_value=f"{node_schema.kind}.{target_attribute.name} is not a computed attribute")
|
|
52
55
|
|
|
53
|
-
|
|
56
|
+
graphql_context.active_permissions.raise_for_permission(
|
|
54
57
|
permission=ObjectPermission(
|
|
55
58
|
namespace=node_schema.namespace,
|
|
56
59
|
name=node_schema.name,
|
|
57
60
|
action=PermissionAction.UPDATE.value,
|
|
58
61
|
decision=PermissionDecision.ALLOW_DEFAULT.value
|
|
59
|
-
if
|
|
62
|
+
if graphql_context.branch.name == registry.default_branch
|
|
60
63
|
else PermissionDecision.ALLOW_OTHER.value,
|
|
61
64
|
)
|
|
62
65
|
)
|
|
63
66
|
|
|
64
67
|
if not (
|
|
65
68
|
target_node := await NodeManager.get_one(
|
|
66
|
-
db=
|
|
69
|
+
db=graphql_context.db, kind=node_schema.kind, id=str(data.id), branch=graphql_context.branch
|
|
67
70
|
)
|
|
68
71
|
):
|
|
69
72
|
raise NodeNotFoundError(
|
|
@@ -81,24 +84,27 @@ class UpdateComputedAttribute(Mutation):
|
|
|
81
84
|
)
|
|
82
85
|
if attribute_field.value != str(data.value):
|
|
83
86
|
attribute_field.value = str(data.value)
|
|
84
|
-
async with
|
|
87
|
+
async with graphql_context.db.start_transaction() as dbt:
|
|
85
88
|
await target_node.save(db=dbt, fields=[str(data.attribute)])
|
|
86
89
|
|
|
87
90
|
log_data = get_log_data()
|
|
88
91
|
request_id = log_data.get("request_id", "")
|
|
89
92
|
|
|
90
|
-
graphql_payload = await target_node.to_graphql(db=context.db, filter_sensitive=True)
|
|
91
|
-
|
|
92
93
|
event = NodeMutatedEvent(
|
|
93
|
-
branch=context.branch.name,
|
|
94
94
|
kind=node_schema.kind,
|
|
95
95
|
node_id=target_node.get_id(),
|
|
96
|
-
data=
|
|
96
|
+
data=target_node.node_changelog.model_dump(),
|
|
97
97
|
fields=[str(data.attribute)],
|
|
98
98
|
action=MutationAction.UPDATED,
|
|
99
|
-
meta=EventMeta(
|
|
99
|
+
meta=EventMeta(
|
|
100
|
+
context=graphql_context.get_context(),
|
|
101
|
+
initiator_id=WORKER_IDENTITY,
|
|
102
|
+
request_id=request_id,
|
|
103
|
+
account_id=graphql_context.active_account_session.account_id,
|
|
104
|
+
branch=graphql_context.branch,
|
|
105
|
+
),
|
|
100
106
|
)
|
|
101
|
-
await
|
|
107
|
+
await graphql_context.active_service.event.send(event=event)
|
|
102
108
|
|
|
103
109
|
result: dict[str, Any] = {"ok": True}
|
|
104
110
|
|
|
@@ -5,9 +5,13 @@ from graphql import GraphQLResolveInfo
|
|
|
5
5
|
|
|
6
6
|
from infrahub.core import registry
|
|
7
7
|
from infrahub.core.diff.coordinator import DiffCoordinator
|
|
8
|
+
from infrahub.core.diff.model.path import NameTrackingId
|
|
8
9
|
from infrahub.core.diff.models import RequestDiffUpdate
|
|
10
|
+
from infrahub.core.diff.repository.repository import DiffRepository
|
|
11
|
+
from infrahub.core.timestamp import Timestamp
|
|
9
12
|
from infrahub.database import retry_db_transaction
|
|
10
13
|
from infrahub.dependencies.registry import get_component_registry
|
|
14
|
+
from infrahub.exceptions import ValidationError
|
|
11
15
|
from infrahub.workflows.catalogue import DIFF_UPDATE
|
|
12
16
|
|
|
13
17
|
if TYPE_CHECKING:
|
|
@@ -32,21 +36,43 @@ class DiffUpdateMutation(Mutation):
|
|
|
32
36
|
@retry_db_transaction(name="diff_update")
|
|
33
37
|
async def mutate(
|
|
34
38
|
cls,
|
|
35
|
-
root: dict, #
|
|
39
|
+
root: dict, # noqa: ARG003
|
|
36
40
|
info: GraphQLResolveInfo,
|
|
37
41
|
data: DiffUpdateInput,
|
|
38
42
|
) -> dict[str, bool]:
|
|
39
|
-
|
|
43
|
+
graphql_context: GraphqlContext = info.context
|
|
40
44
|
|
|
41
45
|
from_timestamp_str = DateTime.serialize(data.from_time) if data.from_time else None
|
|
42
46
|
to_timestamp_str = DateTime.serialize(data.to_time) if data.to_time else None
|
|
43
|
-
if data.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
if (data.from_time or data.to_time) and not data.name:
|
|
48
|
+
raise ValidationError("diff with specified time range requires a name")
|
|
49
|
+
|
|
50
|
+
component_registry = get_component_registry()
|
|
51
|
+
base_branch = await registry.get_branch(db=graphql_context.db, branch=registry.default_branch)
|
|
52
|
+
diff_branch = await registry.get_branch(db=graphql_context.db, branch=data.branch)
|
|
53
|
+
diff_repository = await component_registry.get_component(
|
|
54
|
+
DiffRepository, db=graphql_context.db, branch=diff_branch
|
|
55
|
+
)
|
|
47
56
|
|
|
57
|
+
tracking_id = NameTrackingId(name=data.name)
|
|
58
|
+
existing_diffs_metatdatas = await diff_repository.get_roots_metadata(
|
|
59
|
+
diff_branch_names=[diff_branch.name], base_branch_names=[base_branch.name], tracking_id=tracking_id
|
|
60
|
+
)
|
|
61
|
+
if existing_diffs_metatdatas:
|
|
62
|
+
metadata = existing_diffs_metatdatas[0]
|
|
63
|
+
from_time = Timestamp(from_timestamp_str) if from_timestamp_str else None
|
|
64
|
+
to_time = Timestamp(to_timestamp_str) if to_timestamp_str else None
|
|
65
|
+
branched_from_timestamp = Timestamp(diff_branch.get_branched_from())
|
|
66
|
+
if from_time and from_time > metadata.from_time:
|
|
67
|
+
raise ValidationError(f"from_time must be null or less than or equal to {metadata.from_time}")
|
|
68
|
+
if from_time and from_time < branched_from_timestamp:
|
|
69
|
+
raise ValidationError(f"from_time must be null or greater than or equal to {branched_from_timestamp}")
|
|
70
|
+
if to_time and to_time < metadata.to_time:
|
|
71
|
+
raise ValidationError(f"to_time must be null or greater than or equal to {metadata.to_time}")
|
|
72
|
+
|
|
73
|
+
if data.wait_for_completion is True:
|
|
48
74
|
diff_coordinator = await component_registry.get_component(
|
|
49
|
-
DiffCoordinator, db=
|
|
75
|
+
DiffCoordinator, db=graphql_context.db, branch=diff_branch
|
|
50
76
|
)
|
|
51
77
|
await diff_coordinator.run_update(
|
|
52
78
|
base_branch=base_branch,
|
|
@@ -64,7 +90,9 @@ class DiffUpdateMutation(Mutation):
|
|
|
64
90
|
from_time=from_timestamp_str,
|
|
65
91
|
to_time=to_timestamp_str,
|
|
66
92
|
)
|
|
67
|
-
if
|
|
68
|
-
await
|
|
93
|
+
if graphql_context.service:
|
|
94
|
+
await graphql_context.service.workflow.submit_workflow(
|
|
95
|
+
workflow=DIFF_UPDATE, context=graphql_context.get_context(), parameters={"model": model}
|
|
96
|
+
)
|
|
69
97
|
|
|
70
98
|
return {"ok": True}
|
|
@@ -19,9 +19,6 @@ if TYPE_CHECKING:
|
|
|
19
19
|
from ..initialization import GraphqlContext
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
# pylint: disable=unused-argument
|
|
23
|
-
|
|
24
|
-
|
|
25
22
|
class ResolveDiffConflictInput(InputObjectType):
|
|
26
23
|
conflict_id = InputField(String(required=True), description="ID of the diff conflict to resolve")
|
|
27
24
|
selected_branch = InputField(
|
|
@@ -39,14 +36,16 @@ class ResolveDiffConflict(Mutation):
|
|
|
39
36
|
@retry_db_transaction(name="resolve_diff_conflict")
|
|
40
37
|
async def mutate(
|
|
41
38
|
cls,
|
|
42
|
-
root: dict,
|
|
39
|
+
root: dict, # noqa: ARG003
|
|
43
40
|
info: GraphQLResolveInfo,
|
|
44
41
|
data: ResolveDiffConflictInput,
|
|
45
42
|
) -> ResolveDiffConflict:
|
|
46
|
-
|
|
43
|
+
graphql_context: GraphqlContext = info.context
|
|
47
44
|
|
|
48
45
|
component_registry = get_component_registry()
|
|
49
|
-
diff_repo = await component_registry.get_component(
|
|
46
|
+
diff_repo = await component_registry.get_component(
|
|
47
|
+
DiffRepository, db=graphql_context.db, branch=graphql_context.branch
|
|
48
|
+
)
|
|
50
49
|
|
|
51
50
|
selection = ConflictSelection(data.selected_branch.value) if data.selected_branch else None
|
|
52
51
|
conflict = await diff_repo.get_conflict_by_id(conflict_id=data.conflict_id)
|
|
@@ -55,7 +54,9 @@ class ResolveDiffConflict(Mutation):
|
|
|
55
54
|
await diff_repo.update_conflict_by_id(conflict_id=data.conflict_id, selection=selection)
|
|
56
55
|
|
|
57
56
|
core_data_checks = await NodeManager.query(
|
|
58
|
-
db=
|
|
57
|
+
db=graphql_context.db,
|
|
58
|
+
schema=InfrahubKind.DATACHECK,
|
|
59
|
+
filters={"enriched_conflict_id__value": data.conflict_id},
|
|
59
60
|
)
|
|
60
61
|
if not core_data_checks:
|
|
61
62
|
return cls(ok=True)
|
|
@@ -67,5 +68,5 @@ class ResolveDiffConflict(Mutation):
|
|
|
67
68
|
keep_branch = None
|
|
68
69
|
for cdc in core_data_checks:
|
|
69
70
|
cdc.keep_branch.value = keep_branch
|
|
70
|
-
await cdc.save(db=
|
|
71
|
+
await cdc.save(db=graphql_context.db)
|
|
71
72
|
return cls(ok=True)
|
|
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
|
|
|
19
19
|
|
|
20
20
|
class InfrahubGraphQLQueryMutation(InfrahubMutationMixin, Mutation):
|
|
21
21
|
@classmethod
|
|
22
|
-
def __init_subclass_with_meta__(
|
|
22
|
+
def __init_subclass_with_meta__(
|
|
23
23
|
cls, schema: NodeSchema, _meta: Optional[Any] = None, **options: dict[str, Any]
|
|
24
24
|
) -> None:
|
|
25
25
|
# Make sure schema is a valid NodeSchema Node Class
|
|
@@ -34,20 +34,24 @@ class InfrahubGraphQLQueryMutation(InfrahubMutationMixin, Mutation):
|
|
|
34
34
|
|
|
35
35
|
@classmethod
|
|
36
36
|
async def extract_query_info(
|
|
37
|
-
cls, info: GraphQLResolveInfo, data: InputObjectType, branch: Branch
|
|
37
|
+
cls, info: GraphQLResolveInfo, data: InputObjectType, branch: Branch, db: InfrahubDatabase
|
|
38
38
|
) -> dict[str, Any]:
|
|
39
39
|
query_value = data.get("query", {}).get("value", None)
|
|
40
40
|
if query_value is None:
|
|
41
41
|
return {}
|
|
42
42
|
|
|
43
43
|
query_info = {}
|
|
44
|
-
|
|
44
|
+
schema_branch = db.schema.get_schema_branch(name=branch.name)
|
|
45
|
+
|
|
46
|
+
analyzer = InfrahubGraphQLQueryAnalyzer(
|
|
47
|
+
query=query_value, schema=info.schema, branch=branch, schema_branch=schema_branch
|
|
48
|
+
)
|
|
45
49
|
|
|
46
50
|
valid, errors = analyzer.is_valid
|
|
47
51
|
if not valid:
|
|
48
52
|
raise ValueError(f"Query is not valid, {str(errors)}")
|
|
49
53
|
|
|
50
|
-
query_info["models"] = {"value":
|
|
54
|
+
query_info["models"] = {"value": analyzer.query_report.impacted_models}
|
|
51
55
|
query_info["depth"] = {"value": await analyzer.calculate_depth()}
|
|
52
56
|
query_info["height"] = {"value": await analyzer.calculate_height()}
|
|
53
57
|
query_info["operations"] = {
|
|
@@ -63,11 +67,13 @@ class InfrahubGraphQLQueryMutation(InfrahubMutationMixin, Mutation):
|
|
|
63
67
|
info: GraphQLResolveInfo,
|
|
64
68
|
data: InputObjectType,
|
|
65
69
|
branch: Branch,
|
|
66
|
-
database: Optional[InfrahubDatabase] = None,
|
|
70
|
+
database: Optional[InfrahubDatabase] = None, # noqa: ARG003
|
|
67
71
|
) -> tuple[Node, Self]:
|
|
68
|
-
|
|
72
|
+
graphql_context: GraphqlContext = info.context
|
|
69
73
|
|
|
70
|
-
data.update(
|
|
74
|
+
data.update(
|
|
75
|
+
await cls.extract_query_info(info=info, data=data, branch=graphql_context.branch, db=graphql_context.db)
|
|
76
|
+
)
|
|
71
77
|
|
|
72
78
|
obj, result = await super().mutate_create(info=info, data=data, branch=branch)
|
|
73
79
|
|
|
@@ -79,12 +85,14 @@ class InfrahubGraphQLQueryMutation(InfrahubMutationMixin, Mutation):
|
|
|
79
85
|
info: GraphQLResolveInfo,
|
|
80
86
|
data: InputObjectType,
|
|
81
87
|
branch: Branch,
|
|
82
|
-
database: Optional[InfrahubDatabase] = None,
|
|
83
|
-
node: Optional[Node] = None,
|
|
88
|
+
database: Optional[InfrahubDatabase] = None, # noqa: ARG003
|
|
89
|
+
node: Optional[Node] = None, # noqa: ARG003
|
|
84
90
|
) -> tuple[Node, Self]:
|
|
85
|
-
|
|
91
|
+
graphql_context: GraphqlContext = info.context
|
|
86
92
|
|
|
87
|
-
data.update(
|
|
93
|
+
data.update(
|
|
94
|
+
await cls.extract_query_info(info=info, data=data, branch=graphql_context.branch, db=graphql_context.db)
|
|
95
|
+
)
|
|
88
96
|
|
|
89
97
|
obj, result = await super().mutate_update(info=info, data=data, branch=branch)
|
|
90
98
|
|
|
@@ -53,7 +53,7 @@ async def validate_namespace(
|
|
|
53
53
|
|
|
54
54
|
class InfrahubIPNamespaceMutation(InfrahubMutationMixin, Mutation):
|
|
55
55
|
@classmethod
|
|
56
|
-
def __init_subclass_with_meta__(
|
|
56
|
+
def __init_subclass_with_meta__(
|
|
57
57
|
cls,
|
|
58
58
|
schema: NodeSchema,
|
|
59
59
|
_meta: Optional[Any] = None,
|
|
@@ -84,7 +84,7 @@ class InfrahubIPNamespaceMutation(InfrahubMutationMixin, Mutation):
|
|
|
84
84
|
|
|
85
85
|
class InfrahubIPAddressMutation(InfrahubMutationMixin, Mutation):
|
|
86
86
|
@classmethod
|
|
87
|
-
def __init_subclass_with_meta__(
|
|
87
|
+
def __init_subclass_with_meta__(
|
|
88
88
|
cls,
|
|
89
89
|
schema: NodeSchema,
|
|
90
90
|
_meta: Optional[Any] = None,
|
|
@@ -132,8 +132,8 @@ class InfrahubIPAddressMutation(InfrahubMutationMixin, Mutation):
|
|
|
132
132
|
branch: Branch,
|
|
133
133
|
database: Optional[InfrahubDatabase] = None,
|
|
134
134
|
) -> tuple[Node, Self]:
|
|
135
|
-
|
|
136
|
-
db = database or
|
|
135
|
+
graphql_context: GraphqlContext = info.context
|
|
136
|
+
db = database or graphql_context.db
|
|
137
137
|
ip_address = ipaddress.ip_interface(data["address"]["value"])
|
|
138
138
|
namespace_id = await validate_namespace(db=db, branch=branch, data=data)
|
|
139
139
|
|
|
@@ -179,8 +179,8 @@ class InfrahubIPAddressMutation(InfrahubMutationMixin, Mutation):
|
|
|
179
179
|
database: Optional[InfrahubDatabase] = None,
|
|
180
180
|
node: Optional[Node] = None,
|
|
181
181
|
) -> tuple[Node, Self]:
|
|
182
|
-
|
|
183
|
-
db = database or
|
|
182
|
+
graphql_context: GraphqlContext = info.context
|
|
183
|
+
db = database or graphql_context.db
|
|
184
184
|
|
|
185
185
|
address = node or await NodeManager.get_one_by_id_or_default_filter(
|
|
186
186
|
db=db,
|
|
@@ -219,8 +219,8 @@ class InfrahubIPAddressMutation(InfrahubMutationMixin, Mutation):
|
|
|
219
219
|
node_getters: list[MutationNodeGetterInterface],
|
|
220
220
|
database: Optional[InfrahubDatabase] = None,
|
|
221
221
|
) -> tuple[Node, Self, bool]:
|
|
222
|
-
|
|
223
|
-
db = database or
|
|
222
|
+
graphql_context: GraphqlContext = info.context
|
|
223
|
+
db = database or graphql_context.db
|
|
224
224
|
|
|
225
225
|
await validate_namespace(db=db, branch=branch, data=data)
|
|
226
226
|
prefix, result, created = await super().mutate_upsert(
|
|
@@ -241,7 +241,7 @@ class InfrahubIPAddressMutation(InfrahubMutationMixin, Mutation):
|
|
|
241
241
|
|
|
242
242
|
class InfrahubIPPrefixMutation(InfrahubMutationMixin, Mutation):
|
|
243
243
|
@classmethod
|
|
244
|
-
def __init_subclass_with_meta__(
|
|
244
|
+
def __init_subclass_with_meta__(
|
|
245
245
|
cls,
|
|
246
246
|
schema: NodeSchema,
|
|
247
247
|
_meta: Optional[Any] = None,
|
|
@@ -286,8 +286,8 @@ class InfrahubIPPrefixMutation(InfrahubMutationMixin, Mutation):
|
|
|
286
286
|
branch: Branch,
|
|
287
287
|
database: Optional[InfrahubDatabase] = None,
|
|
288
288
|
) -> tuple[Node, Self]:
|
|
289
|
-
|
|
290
|
-
db = database or
|
|
289
|
+
graphql_context: GraphqlContext = info.context
|
|
290
|
+
db = database or graphql_context.db
|
|
291
291
|
namespace_id = await validate_namespace(db=db, branch=branch, data=data)
|
|
292
292
|
|
|
293
293
|
async with db.start_transaction() as dbt:
|
|
@@ -330,8 +330,8 @@ class InfrahubIPPrefixMutation(InfrahubMutationMixin, Mutation):
|
|
|
330
330
|
database: Optional[InfrahubDatabase] = None,
|
|
331
331
|
node: Optional[Node] = None,
|
|
332
332
|
) -> tuple[Node, Self]:
|
|
333
|
-
|
|
334
|
-
db = database or
|
|
333
|
+
graphql_context: GraphqlContext = info.context
|
|
334
|
+
db = database or graphql_context.db
|
|
335
335
|
|
|
336
336
|
prefix = node or await NodeManager.get_one_by_id_or_default_filter(
|
|
337
337
|
db=db,
|
|
@@ -369,8 +369,8 @@ class InfrahubIPPrefixMutation(InfrahubMutationMixin, Mutation):
|
|
|
369
369
|
node_getters: list[MutationNodeGetterInterface],
|
|
370
370
|
database: Optional[InfrahubDatabase] = None,
|
|
371
371
|
):
|
|
372
|
-
|
|
373
|
-
db = database or
|
|
372
|
+
graphql_context: GraphqlContext = info.context
|
|
373
|
+
db = database or graphql_context.db
|
|
374
374
|
|
|
375
375
|
await validate_namespace(db=db, branch=branch, data=data)
|
|
376
376
|
prefix, result, created = await super().mutate_upsert(
|
|
@@ -403,17 +403,19 @@ class InfrahubIPPrefixMutation(InfrahubMutationMixin, Mutation):
|
|
|
403
403
|
data: InputObjectType,
|
|
404
404
|
branch: Branch,
|
|
405
405
|
) -> tuple[Node, Self]:
|
|
406
|
-
|
|
407
|
-
db =
|
|
406
|
+
graphql_context: GraphqlContext = info.context
|
|
407
|
+
db = graphql_context.db
|
|
408
408
|
|
|
409
|
-
prefix = await NodeManager.get_one(
|
|
409
|
+
prefix = await NodeManager.get_one(
|
|
410
|
+
data.get("id"), graphql_context.db, branch=branch, prefetch_relationships=True
|
|
411
|
+
)
|
|
410
412
|
if not prefix:
|
|
411
413
|
raise NodeNotFoundError(branch, cls._meta.schema.kind, data.get("id"))
|
|
412
414
|
|
|
413
415
|
namespace_rels = await prefix.ip_namespace.get_relationships(db=db)
|
|
414
416
|
namespace_id = namespace_rels[0].peer_id
|
|
415
417
|
try:
|
|
416
|
-
async with
|
|
418
|
+
async with graphql_context.db.start_transaction() as dbt:
|
|
417
419
|
if lock_name := cls._get_lock_name(namespace_id, branch):
|
|
418
420
|
async with InfrahubMultiLock(lock_registry=lock.registry, locks=[lock_name]):
|
|
419
421
|
reconciled_prefix = await cls._reconcile_prefix(
|