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
|
@@ -61,11 +61,11 @@ class IPPrefixPoolGetResource(Mutation):
|
|
|
61
61
|
@classmethod
|
|
62
62
|
async def mutate(
|
|
63
63
|
cls,
|
|
64
|
-
root: dict, #
|
|
64
|
+
root: dict, # noqa: ARG003
|
|
65
65
|
info: GraphQLResolveInfo,
|
|
66
66
|
data: InputObjectType,
|
|
67
67
|
) -> Self:
|
|
68
|
-
|
|
68
|
+
graphql_context: GraphqlContext = info.context
|
|
69
69
|
|
|
70
70
|
member_type = data.get("member_type", None)
|
|
71
71
|
allowed_member_types = [t.value for t in PrefixMemberType]
|
|
@@ -73,15 +73,15 @@ class IPPrefixPoolGetResource(Mutation):
|
|
|
73
73
|
raise QueryValidationError(f"Invalid member_type value, allowed values are {allowed_member_types}")
|
|
74
74
|
|
|
75
75
|
obj: CoreIPPrefixPool = await registry.manager.find_object( # type: ignore[assignment]
|
|
76
|
-
db=
|
|
76
|
+
db=graphql_context.db,
|
|
77
77
|
kind=InfrahubKind.IPPREFIXPOOL,
|
|
78
78
|
id=data.get("id"),
|
|
79
79
|
hfid=data.get("hfid"),
|
|
80
|
-
branch=
|
|
80
|
+
branch=graphql_context.branch,
|
|
81
81
|
)
|
|
82
82
|
resource = await obj.get_resource(
|
|
83
|
-
db=
|
|
84
|
-
branch=
|
|
83
|
+
db=graphql_context.db,
|
|
84
|
+
branch=graphql_context.branch,
|
|
85
85
|
identifier=data.get("identifier", None),
|
|
86
86
|
prefixlen=data.get("prefix_length", None),
|
|
87
87
|
member_type=member_type,
|
|
@@ -95,8 +95,8 @@ class IPPrefixPoolGetResource(Mutation):
|
|
|
95
95
|
"id": resource.id,
|
|
96
96
|
"kind": resource.get_kind(),
|
|
97
97
|
"identifier": data.get("identifier", None),
|
|
98
|
-
"display_label": await resource.render_display_label(db=
|
|
99
|
-
"branch":
|
|
98
|
+
"display_label": await resource.render_display_label(db=graphql_context.db),
|
|
99
|
+
"branch": graphql_context.branch.name,
|
|
100
100
|
},
|
|
101
101
|
}
|
|
102
102
|
|
|
@@ -113,26 +113,26 @@ class IPAddressPoolGetResource(Mutation):
|
|
|
113
113
|
@classmethod
|
|
114
114
|
async def mutate(
|
|
115
115
|
cls,
|
|
116
|
-
root: dict, #
|
|
116
|
+
root: dict, # noqa: ARG003
|
|
117
117
|
info: GraphQLResolveInfo,
|
|
118
118
|
data: dict[str, Any],
|
|
119
119
|
) -> Self:
|
|
120
|
-
|
|
120
|
+
graphql_context: GraphqlContext = info.context
|
|
121
121
|
|
|
122
122
|
obj: CoreIPAddressPool = await registry.manager.find_object(
|
|
123
|
-
db=
|
|
123
|
+
db=graphql_context.db,
|
|
124
124
|
kind=InfrahubKind.IPADDRESSPOOL,
|
|
125
125
|
id=data.get("id"),
|
|
126
126
|
hfid=data.get("hfid"),
|
|
127
|
-
branch=
|
|
127
|
+
branch=graphql_context.branch,
|
|
128
128
|
)
|
|
129
129
|
resource = await obj.get_resource(
|
|
130
|
-
db=
|
|
131
|
-
branch=
|
|
132
|
-
identifier=data.get("identifier"
|
|
133
|
-
prefixlen=data.get("prefix_length"
|
|
134
|
-
address_type=data.get("address_type"
|
|
135
|
-
data=data.get("data"
|
|
130
|
+
db=graphql_context.db,
|
|
131
|
+
branch=graphql_context.branch,
|
|
132
|
+
identifier=data.get("identifier"),
|
|
133
|
+
prefixlen=data.get("prefix_length"),
|
|
134
|
+
address_type=data.get("address_type"),
|
|
135
|
+
data=data.get("data"),
|
|
136
136
|
)
|
|
137
137
|
|
|
138
138
|
result = {
|
|
@@ -140,9 +140,9 @@ class IPAddressPoolGetResource(Mutation):
|
|
|
140
140
|
"node": {
|
|
141
141
|
"id": resource.id,
|
|
142
142
|
"kind": resource.get_kind(),
|
|
143
|
-
"identifier": data.get("identifier"
|
|
144
|
-
"display_label": await resource.render_display_label(db=
|
|
145
|
-
"branch":
|
|
143
|
+
"identifier": data.get("identifier"),
|
|
144
|
+
"display_label": await resource.render_display_label(db=graphql_context.db),
|
|
145
|
+
"branch": graphql_context.branch.name,
|
|
146
146
|
},
|
|
147
147
|
}
|
|
148
148
|
|
|
@@ -151,7 +151,7 @@ class IPAddressPoolGetResource(Mutation):
|
|
|
151
151
|
|
|
152
152
|
class InfrahubNumberPoolMutation(InfrahubMutationMixin, Mutation):
|
|
153
153
|
@classmethod
|
|
154
|
-
def __init_subclass_with_meta__(
|
|
154
|
+
def __init_subclass_with_meta__(
|
|
155
155
|
cls,
|
|
156
156
|
schema: NodeSchema | None = None,
|
|
157
157
|
_meta: InfrahubMutationOptions | None = None,
|
|
@@ -174,7 +174,7 @@ class InfrahubNumberPoolMutation(InfrahubMutationMixin, Mutation):
|
|
|
174
174
|
info: GraphQLResolveInfo,
|
|
175
175
|
data: InputObjectType,
|
|
176
176
|
branch: Branch,
|
|
177
|
-
database: InfrahubDatabase | None = None,
|
|
177
|
+
database: InfrahubDatabase | None = None, # noqa: ARG003
|
|
178
178
|
) -> Any:
|
|
179
179
|
try:
|
|
180
180
|
pool_node = registry.get_node_schema(name=data["node"].value)
|
|
@@ -204,16 +204,16 @@ class InfrahubNumberPoolMutation(InfrahubMutationMixin, Mutation):
|
|
|
204
204
|
info: GraphQLResolveInfo,
|
|
205
205
|
data: InputObjectType,
|
|
206
206
|
branch: Branch,
|
|
207
|
-
database: InfrahubDatabase | None = None,
|
|
207
|
+
database: InfrahubDatabase | None = None, # noqa: ARG003
|
|
208
208
|
node: Node | None = None,
|
|
209
209
|
) -> tuple[Node, Self]:
|
|
210
210
|
if (data.get("node") and data.get("node").value) or (
|
|
211
211
|
data.get("node_attribute") and data.get("node_attribute").value
|
|
212
212
|
):
|
|
213
213
|
raise ValidationError(input_value="The fields 'node' or 'node_attribute' can't be changed.")
|
|
214
|
-
|
|
214
|
+
graphql_context: GraphqlContext = info.context
|
|
215
215
|
|
|
216
|
-
async with
|
|
216
|
+
async with graphql_context.db.start_transaction() as dbt:
|
|
217
217
|
number_pool, result = await super().mutate_update(
|
|
218
218
|
info=info, data=data, branch=branch, database=dbt, node=node
|
|
219
219
|
)
|
|
@@ -21,6 +21,7 @@ from ..types import DropdownFields
|
|
|
21
21
|
if TYPE_CHECKING:
|
|
22
22
|
from graphql import GraphQLResolveInfo
|
|
23
23
|
|
|
24
|
+
from infrahub.context import InfrahubContext
|
|
24
25
|
from infrahub.core.branch import Branch
|
|
25
26
|
from infrahub.services import InfrahubServices
|
|
26
27
|
|
|
@@ -58,13 +59,13 @@ class SchemaDropdownAdd(Mutation):
|
|
|
58
59
|
@retry_db_transaction(name="schema_dropdown_add")
|
|
59
60
|
async def mutate(
|
|
60
61
|
cls,
|
|
61
|
-
root: dict, #
|
|
62
|
+
root: dict, # noqa: ARG003
|
|
62
63
|
info: GraphQLResolveInfo,
|
|
63
64
|
data: SchemaDropdownAddInput,
|
|
64
65
|
) -> Self:
|
|
65
|
-
|
|
66
|
+
graphql_context: GraphqlContext = info.context
|
|
66
67
|
|
|
67
|
-
kind =
|
|
68
|
+
kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
|
|
68
69
|
attribute = str(data.attribute)
|
|
69
70
|
validate_kind_dropdown(kind=kind, attribute=attribute)
|
|
70
71
|
dropdown = str(data.dropdown)
|
|
@@ -80,13 +81,14 @@ class SchemaDropdownAdd(Mutation):
|
|
|
80
81
|
|
|
81
82
|
await update_registry(
|
|
82
83
|
kind=kind,
|
|
83
|
-
branch=
|
|
84
|
-
db=
|
|
85
|
-
account_id=
|
|
86
|
-
service=
|
|
84
|
+
branch=graphql_context.branch,
|
|
85
|
+
db=graphql_context.db,
|
|
86
|
+
account_id=graphql_context.active_account_session.account_id,
|
|
87
|
+
service=graphql_context.active_service,
|
|
88
|
+
context=graphql_context.get_context(),
|
|
87
89
|
)
|
|
88
90
|
|
|
89
|
-
kind =
|
|
91
|
+
kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
|
|
90
92
|
attrib = kind.get_attribute(attribute)
|
|
91
93
|
dropdown_entry = {}
|
|
92
94
|
success = False
|
|
@@ -114,19 +116,22 @@ class SchemaDropdownRemove(Mutation):
|
|
|
114
116
|
@retry_db_transaction(name="schema_dropdown_remove")
|
|
115
117
|
async def mutate(
|
|
116
118
|
cls,
|
|
117
|
-
root: dict, #
|
|
119
|
+
root: dict, # noqa: ARG003
|
|
118
120
|
info: GraphQLResolveInfo,
|
|
119
121
|
data: SchemaDropdownRemoveInput,
|
|
120
122
|
) -> dict[str, bool]:
|
|
121
|
-
|
|
123
|
+
graphql_context: GraphqlContext = info.context
|
|
122
124
|
|
|
123
|
-
kind =
|
|
125
|
+
kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
|
|
124
126
|
|
|
125
127
|
attribute = str(data.attribute)
|
|
126
128
|
validate_kind_dropdown(kind=kind, attribute=attribute)
|
|
127
129
|
dropdown = str(data.dropdown)
|
|
128
130
|
nodes_with_dropdown = await NodeManager.query(
|
|
129
|
-
db=
|
|
131
|
+
db=graphql_context.db,
|
|
132
|
+
schema=kind.kind,
|
|
133
|
+
filters={f"{attribute}__value": dropdown},
|
|
134
|
+
branch=graphql_context.branch,
|
|
130
135
|
)
|
|
131
136
|
if nodes_with_dropdown:
|
|
132
137
|
raise ValidationError(f"There are still {kind.kind} objects using this dropdown")
|
|
@@ -143,10 +148,11 @@ class SchemaDropdownRemove(Mutation):
|
|
|
143
148
|
|
|
144
149
|
await update_registry(
|
|
145
150
|
kind=kind,
|
|
146
|
-
branch=
|
|
147
|
-
db=
|
|
148
|
-
account_id=
|
|
149
|
-
service=
|
|
151
|
+
branch=graphql_context.branch,
|
|
152
|
+
db=graphql_context.db,
|
|
153
|
+
account_id=graphql_context.active_account_session.account_id,
|
|
154
|
+
service=graphql_context.active_service,
|
|
155
|
+
context=graphql_context.get_context(),
|
|
150
156
|
)
|
|
151
157
|
|
|
152
158
|
return {"ok": True}
|
|
@@ -162,13 +168,13 @@ class SchemaEnumAdd(Mutation):
|
|
|
162
168
|
@retry_db_transaction(name="schema_dropdown_add")
|
|
163
169
|
async def mutate(
|
|
164
170
|
cls,
|
|
165
|
-
root: dict, #
|
|
171
|
+
root: dict, # noqa: ARG003
|
|
166
172
|
info: GraphQLResolveInfo,
|
|
167
173
|
data: SchemaEnumInput,
|
|
168
174
|
) -> dict[str, bool]:
|
|
169
|
-
|
|
175
|
+
graphql_context: GraphqlContext = info.context
|
|
170
176
|
|
|
171
|
-
kind =
|
|
177
|
+
kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
|
|
172
178
|
|
|
173
179
|
attribute = str(data.attribute)
|
|
174
180
|
enum = str(data.enum)
|
|
@@ -184,10 +190,11 @@ class SchemaEnumAdd(Mutation):
|
|
|
184
190
|
|
|
185
191
|
await update_registry(
|
|
186
192
|
kind=kind,
|
|
187
|
-
branch=
|
|
188
|
-
db=
|
|
189
|
-
account_id=
|
|
190
|
-
service=
|
|
193
|
+
branch=graphql_context.branch,
|
|
194
|
+
db=graphql_context.db,
|
|
195
|
+
account_id=graphql_context.active_account_session.account_id,
|
|
196
|
+
service=graphql_context.active_service,
|
|
197
|
+
context=graphql_context.get_context(),
|
|
191
198
|
)
|
|
192
199
|
|
|
193
200
|
return {"ok": True}
|
|
@@ -203,19 +210,22 @@ class SchemaEnumRemove(Mutation):
|
|
|
203
210
|
@retry_db_transaction(name="schema_enum_remove")
|
|
204
211
|
async def mutate(
|
|
205
212
|
cls,
|
|
206
|
-
root: dict, #
|
|
213
|
+
root: dict, # noqa: ARG003
|
|
207
214
|
info: GraphQLResolveInfo,
|
|
208
215
|
data: SchemaEnumInput,
|
|
209
216
|
) -> dict[str, bool]:
|
|
210
|
-
|
|
217
|
+
graphql_context: GraphqlContext = info.context
|
|
211
218
|
|
|
212
|
-
kind =
|
|
219
|
+
kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
|
|
213
220
|
|
|
214
221
|
attribute = str(data.attribute)
|
|
215
222
|
enum = str(data.enum)
|
|
216
223
|
validate_kind_enum(kind=kind, attribute=attribute)
|
|
217
224
|
nodes_with_enum = await NodeManager.query(
|
|
218
|
-
db=
|
|
225
|
+
db=graphql_context.db,
|
|
226
|
+
schema=kind.kind,
|
|
227
|
+
filters={f"{attribute}__value": enum},
|
|
228
|
+
branch=graphql_context.branch,
|
|
219
229
|
)
|
|
220
230
|
if nodes_with_enum:
|
|
221
231
|
raise ValidationError(f"There are still {kind.kind} objects using this enum")
|
|
@@ -232,10 +242,11 @@ class SchemaEnumRemove(Mutation):
|
|
|
232
242
|
|
|
233
243
|
await update_registry(
|
|
234
244
|
kind=kind,
|
|
235
|
-
branch=
|
|
236
|
-
db=
|
|
237
|
-
account_id=
|
|
238
|
-
service=
|
|
245
|
+
branch=graphql_context.branch,
|
|
246
|
+
db=graphql_context.db,
|
|
247
|
+
account_id=graphql_context.active_account_session.account_id,
|
|
248
|
+
service=graphql_context.active_service,
|
|
249
|
+
context=graphql_context.get_context(),
|
|
239
250
|
)
|
|
240
251
|
|
|
241
252
|
return {"ok": True}
|
|
@@ -268,7 +279,12 @@ def validate_kind(kind: Union[GenericSchema, NodeSchema], attribute: str) -> Non
|
|
|
268
279
|
|
|
269
280
|
|
|
270
281
|
async def update_registry(
|
|
271
|
-
kind: NodeSchema,
|
|
282
|
+
kind: NodeSchema,
|
|
283
|
+
db: InfrahubDatabase,
|
|
284
|
+
branch: Branch,
|
|
285
|
+
account_id: str,
|
|
286
|
+
service: InfrahubServices,
|
|
287
|
+
context: InfrahubContext,
|
|
272
288
|
) -> None:
|
|
273
289
|
async with lock.registry.global_schema_lock():
|
|
274
290
|
branch_schema = registry.schema.get_schema_branch(name=branch.name)
|
|
@@ -296,12 +312,14 @@ async def update_registry(
|
|
|
296
312
|
log_data = get_log_data()
|
|
297
313
|
request_id = log_data.get("request_id", "")
|
|
298
314
|
event = SchemaUpdatedEvent(
|
|
299
|
-
|
|
315
|
+
branch_name=branch.name,
|
|
300
316
|
schema_hash=branch.active_schema_hash.main,
|
|
301
317
|
meta=EventMeta(
|
|
302
318
|
initiator_id=WORKER_IDENTITY,
|
|
303
319
|
request_id=request_id,
|
|
304
320
|
account_id=account_id,
|
|
321
|
+
branch=branch,
|
|
322
|
+
context=context,
|
|
305
323
|
),
|
|
306
324
|
)
|
|
307
325
|
await service.event.send(event=event)
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from prefect import flow
|
|
4
4
|
|
|
5
|
+
from infrahub.context import InfrahubContext # noqa: TC001 needed for prefect flow
|
|
5
6
|
from infrahub.core import registry
|
|
6
7
|
from infrahub.core.branch import Branch
|
|
7
8
|
from infrahub.core.diff.coordinator import DiffCoordinator
|
|
@@ -13,15 +14,14 @@ from infrahub.core.validators.models.validate_migration import SchemaValidateMig
|
|
|
13
14
|
from infrahub.core.validators.tasks import schema_validate_migrations
|
|
14
15
|
from infrahub.dependencies.registry import get_component_registry
|
|
15
16
|
from infrahub.exceptions import ValidationError
|
|
16
|
-
from infrahub.services import
|
|
17
|
+
from infrahub.services import InfrahubServices # noqa: TC001 needed for prefect flow
|
|
17
18
|
from infrahub.workflows.catalogue import BRANCH_MERGE
|
|
18
|
-
from infrahub.workflows.utils import
|
|
19
|
+
from infrahub.workflows.utils import add_tags
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
@flow(name="merge-branch-mutation", flow_run_name="Merge branch graphQL mutation")
|
|
22
|
-
async def merge_branch_mutation(branch: str) -> None:
|
|
23
|
-
|
|
24
|
-
await add_branch_tag(branch_name=branch)
|
|
23
|
+
async def merge_branch_mutation(branch: str, context: InfrahubContext, service: InfrahubServices) -> None:
|
|
24
|
+
await add_tags(branches=[branch])
|
|
25
25
|
|
|
26
26
|
async with service.database.start_session() as db:
|
|
27
27
|
obj = await Branch.get_by_name(db=db, name=branch)
|
|
@@ -31,14 +31,17 @@ async def merge_branch_mutation(branch: str) -> None:
|
|
|
31
31
|
diff_coordinator = await component_registry.get_component(DiffCoordinator, db=db, branch=obj)
|
|
32
32
|
diff_repository = await component_registry.get_component(DiffRepository, db=db, branch=obj)
|
|
33
33
|
diff_merger = await component_registry.get_component(DiffMerger, db=db, branch=obj)
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
enriched_diff_metadata = await diff_coordinator.update_branch_diff(base_branch=base_branch, diff_branch=obj)
|
|
35
|
+
async for _ in diff_repository.get_all_conflicts_for_diff(
|
|
36
|
+
diff_branch_name=enriched_diff_metadata.diff_branch_name, diff_id=enriched_diff_metadata.uuid
|
|
37
|
+
):
|
|
38
|
+
# if there are any conflicts, raise the error
|
|
36
39
|
raise ValidationError(
|
|
37
40
|
f"Branch {obj.name} contains conflicts with the default branch."
|
|
38
41
|
" Please create a Proposed Change to resolve the conflicts or manually update them before merging."
|
|
39
42
|
)
|
|
40
43
|
node_diff_field_summaries = await diff_repository.get_node_field_summaries(
|
|
41
|
-
diff_branch_name=
|
|
44
|
+
diff_branch_name=enriched_diff_metadata.diff_branch_name, diff_id=enriched_diff_metadata.uuid
|
|
42
45
|
)
|
|
43
46
|
|
|
44
47
|
merger = BranchMerger(
|
|
@@ -57,10 +60,13 @@ async def merge_branch_mutation(branch: str) -> None:
|
|
|
57
60
|
|
|
58
61
|
if constraints:
|
|
59
62
|
responses = await schema_validate_migrations(
|
|
60
|
-
message=SchemaValidateMigrationData(
|
|
63
|
+
message=SchemaValidateMigrationData(
|
|
64
|
+
branch=obj, schema_branch=candidate_schema, constraints=constraints
|
|
65
|
+
),
|
|
66
|
+
service=service,
|
|
61
67
|
)
|
|
62
68
|
error_messages = [violation.message for response in responses for violation in response.violations]
|
|
63
69
|
if error_messages:
|
|
64
70
|
raise ValidationError(",\n".join(error_messages))
|
|
65
71
|
|
|
66
|
-
await service.workflow.execute_workflow(workflow=BRANCH_MERGE, parameters={"branch": obj.name})
|
|
72
|
+
await service.workflow.execute_workflow(workflow=BRANCH_MERGE, context=context, parameters={"branch": obj.name})
|
infrahub/graphql/parser.py
CHANGED
|
@@ -162,7 +162,7 @@ class GraphQLExtractor:
|
|
|
162
162
|
FieldNode(
|
|
163
163
|
kind="field",
|
|
164
164
|
name=NameNode(kind="name", value=sub_node.key),
|
|
165
|
-
selection_set=SelectionSetNode(selections=
|
|
165
|
+
selection_set=SelectionSetNode(selections=(sub_node.node,)),
|
|
166
166
|
)
|
|
167
167
|
)
|
|
168
168
|
selection_set.selections = tuple(selections)
|
infrahub/graphql/permissions.py
CHANGED
|
@@ -11,23 +11,25 @@ if TYPE_CHECKING:
|
|
|
11
11
|
from infrahub.graphql.initialization import GraphqlContext
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
async def get_permissions(schema: MainSchemaTypes,
|
|
14
|
+
async def get_permissions(schema: MainSchemaTypes, graphql_context: GraphqlContext) -> dict[str, Any]:
|
|
15
15
|
schema_objects = [schema]
|
|
16
16
|
if isinstance(schema, GenericSchema):
|
|
17
17
|
for node_name in schema.used_by:
|
|
18
18
|
schema_object: MainSchemaTypes
|
|
19
19
|
try:
|
|
20
|
-
schema_object = registry.schema.get_node_schema(
|
|
20
|
+
schema_object = registry.schema.get_node_schema(
|
|
21
|
+
name=node_name, branch=graphql_context.branch, duplicate=False
|
|
22
|
+
)
|
|
21
23
|
except ValueError:
|
|
22
24
|
schema_object = registry.schema.get_profile_schema(
|
|
23
|
-
name=node_name, branch=
|
|
25
|
+
name=node_name, branch=graphql_context.branch, duplicate=False
|
|
24
26
|
)
|
|
25
27
|
schema_objects.append(schema_object)
|
|
26
28
|
|
|
27
29
|
response: dict[str, Any] = {"count": len(schema_objects), "edges": []}
|
|
28
30
|
|
|
29
31
|
nodes = await report_schema_permissions(
|
|
30
|
-
branch=
|
|
32
|
+
branch=graphql_context.branch, permission_manager=graphql_context.active_permissions, schemas=schema_objects
|
|
31
33
|
)
|
|
32
34
|
response["edges"] = [{"node": node} for node in nodes]
|
|
33
35
|
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import TYPE_CHECKING, Any
|
|
4
4
|
|
|
5
|
-
from graphene import Field, Int, List, ObjectType, String
|
|
5
|
+
from graphene import Field, Int, List, NonNull, ObjectType, String
|
|
6
6
|
from infrahub_sdk.utils import extract_fields_first_node
|
|
7
7
|
|
|
8
8
|
from infrahub.core.manager import NodeManager
|
|
@@ -27,32 +27,32 @@ class AccountTokenEdge(ObjectType):
|
|
|
27
27
|
|
|
28
28
|
class AccountTokenEdges(ObjectType):
|
|
29
29
|
count = Field(Int, required=True)
|
|
30
|
-
edges = Field(List(of_type=AccountTokenEdge, required=True), required=True)
|
|
30
|
+
edges = Field(List(of_type=NonNull(AccountTokenEdge), required=True), required=True)
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
async def resolve_account_tokens(
|
|
34
|
-
root: dict, #
|
|
34
|
+
root: dict, # noqa: ARG001
|
|
35
35
|
info: GraphQLResolveInfo,
|
|
36
36
|
limit: int = 10,
|
|
37
37
|
offset: int = 0,
|
|
38
38
|
) -> dict:
|
|
39
|
-
|
|
39
|
+
graphql_context: GraphqlContext = info.context
|
|
40
40
|
|
|
41
|
-
if not
|
|
41
|
+
if not graphql_context.account_session:
|
|
42
42
|
raise ValueError("An account_session is mandatory to execute this query")
|
|
43
43
|
|
|
44
|
-
if not
|
|
44
|
+
if not graphql_context.account_session.authenticated_by_jwt:
|
|
45
45
|
raise PermissionDeniedError("This operation requires authentication with a JWT token")
|
|
46
46
|
|
|
47
47
|
fields = await extract_fields_first_node(info)
|
|
48
48
|
|
|
49
|
-
filters = {"account__ids": [
|
|
49
|
+
filters = {"account__ids": [graphql_context.account_session.account_id]}
|
|
50
50
|
response: dict[str, Any] = {}
|
|
51
51
|
if "count" in fields:
|
|
52
|
-
response["count"] = await NodeManager.count(db=
|
|
52
|
+
response["count"] = await NodeManager.count(db=graphql_context.db, schema=InternalAccountToken, filters=filters)
|
|
53
53
|
if "edges" in fields:
|
|
54
54
|
objs = await NodeManager.query(
|
|
55
|
-
db=
|
|
55
|
+
db=graphql_context.db, schema=InternalAccountToken, filters=filters, limit=limit, offset=offset
|
|
56
56
|
)
|
|
57
57
|
response["edges"] = [
|
|
58
58
|
{"node": {"id": obj.id, "name": obj.name.value, "expiration": obj.expiration.value}} for obj in objs
|
|
@@ -62,7 +62,11 @@ async def resolve_account_tokens(
|
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
AccountToken = Field(
|
|
65
|
-
AccountTokenEdges,
|
|
65
|
+
AccountTokenEdges,
|
|
66
|
+
limit=Int(required=False),
|
|
67
|
+
offset=Int(required=False),
|
|
68
|
+
resolver=resolve_account_tokens,
|
|
69
|
+
required=True,
|
|
66
70
|
)
|
|
67
71
|
|
|
68
72
|
|
|
@@ -95,12 +99,12 @@ class AccountObjectPermissionEdge(ObjectType):
|
|
|
95
99
|
|
|
96
100
|
class AccountGlobalPermissionEdges(ObjectType):
|
|
97
101
|
count = Field(Int, required=True)
|
|
98
|
-
edges = Field(List(of_type=AccountGlobalPermissionEdge, required=True), required=True)
|
|
102
|
+
edges = Field(List(of_type=NonNull(AccountGlobalPermissionEdge), required=True), required=True)
|
|
99
103
|
|
|
100
104
|
|
|
101
105
|
class AccountObjectPermissionEdges(ObjectType):
|
|
102
106
|
count = Field(Int, required=True)
|
|
103
|
-
edges = Field(List(of_type=AccountObjectPermissionEdge, required=True), required=True)
|
|
107
|
+
edges = Field(List(of_type=NonNull(AccountObjectPermissionEdge), required=True), required=True)
|
|
104
108
|
|
|
105
109
|
|
|
106
110
|
class AccountPermissionsEdges(ObjectType):
|
|
@@ -109,19 +113,19 @@ class AccountPermissionsEdges(ObjectType):
|
|
|
109
113
|
|
|
110
114
|
|
|
111
115
|
async def resolve_account_permissions(
|
|
112
|
-
root: dict, #
|
|
116
|
+
root: dict, # noqa: ARG001
|
|
113
117
|
info: GraphQLResolveInfo,
|
|
114
118
|
) -> dict:
|
|
115
|
-
|
|
119
|
+
graphql_context: GraphqlContext = info.context
|
|
116
120
|
|
|
117
|
-
if not
|
|
121
|
+
if not graphql_context.account_session:
|
|
118
122
|
raise ValueError("An account_session is mandatory to execute this query")
|
|
119
123
|
|
|
120
124
|
fields = await extract_fields_first_node(info)
|
|
121
125
|
|
|
122
126
|
response: dict[str, dict[str, Any]] = {}
|
|
123
127
|
if "global_permissions" in fields:
|
|
124
|
-
global_list =
|
|
128
|
+
global_list = graphql_context.active_permissions.permissions["global_permissions"]
|
|
125
129
|
response["global_permissions"] = {"count": len(global_list)}
|
|
126
130
|
response["global_permissions"]["edges"] = [
|
|
127
131
|
{
|
|
@@ -136,7 +140,7 @@ async def resolve_account_permissions(
|
|
|
136
140
|
for obj in global_list
|
|
137
141
|
]
|
|
138
142
|
if "object_permissions" in fields:
|
|
139
|
-
object_list =
|
|
143
|
+
object_list = graphql_context.active_permissions.permissions["object_permissions"]
|
|
140
144
|
response["object_permissions"] = {"count": len(object_list)}
|
|
141
145
|
response["object_permissions"]["edges"] = [
|
|
142
146
|
{
|
|
@@ -155,4 +159,4 @@ async def resolve_account_permissions(
|
|
|
155
159
|
return response
|
|
156
160
|
|
|
157
161
|
|
|
158
|
-
AccountPermissions = Field(AccountPermissionsEdges, resolver=resolve_account_permissions)
|
|
162
|
+
AccountPermissions = Field(AccountPermissionsEdges, resolver=resolve_account_permissions, required=True)
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import TYPE_CHECKING, Any
|
|
4
4
|
|
|
5
|
-
from graphene import ID, Field, List, String
|
|
5
|
+
from graphene import ID, Field, List, NonNull, String
|
|
6
6
|
from infrahub_sdk.utils import extract_fields_first_node
|
|
7
7
|
|
|
8
8
|
from infrahub.graphql.types import BranchType
|
|
@@ -12,17 +12,19 @@ if TYPE_CHECKING:
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
async def branch_resolver(
|
|
15
|
-
root: dict, #
|
|
15
|
+
root: dict, # noqa: ARG001
|
|
16
16
|
info: GraphQLResolveInfo,
|
|
17
17
|
**kwargs: Any,
|
|
18
18
|
) -> list[dict[str, Any]]:
|
|
19
19
|
fields = await extract_fields_first_node(info)
|
|
20
|
-
return await BranchType.get_list(
|
|
20
|
+
return await BranchType.get_list(graphql_context=info.context, fields=fields, **kwargs)
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
BranchQueryList = Field(
|
|
24
|
-
List(BranchType),
|
|
24
|
+
List(of_type=NonNull(BranchType)),
|
|
25
25
|
ids=List(ID),
|
|
26
26
|
name=String(),
|
|
27
|
+
description="Retrieve information about active branches.",
|
|
27
28
|
resolver=branch_resolver,
|
|
29
|
+
required=True,
|
|
28
30
|
)
|