infrahub-server 1.1.6__py3-none-any.whl → 1.2.0b1__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} +5 -3
- 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/models.py +1 -1
- infrahub/computed_attribute/tasks.py +64 -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 +54 -22
- infrahub/core/branch/models.py +4 -4
- infrahub/core/branch/tasks.py +137 -129
- infrahub/core/changelog/__init__.py +0 -0
- infrahub/core/changelog/diff.py +283 -0
- infrahub/core/changelog/models.py +499 -0
- infrahub/core/constants/__init__.py +43 -2
- infrahub/core/constants/infrahubkind.py +1 -0
- infrahub/core/constants/schema.py +2 -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 +7 -7
- infrahub/core/diff/enricher/hierarchy.py +22 -7
- infrahub/core/diff/enricher/labels.py +19 -4
- infrahub/core/diff/enricher/path_identifier.py +7 -9
- infrahub/core/diff/enricher/summary_counts.py +3 -1
- infrahub/core/diff/merger/merger.py +8 -4
- infrahub/core/diff/model/path.py +76 -35
- infrahub/core/diff/parent_node_adder.py +78 -0
- infrahub/core/diff/payload_builder.py +13 -2
- 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 +14 -3
- 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 +233 -142
- infrahub/core/diff/query/summary_counts_enricher.py +267 -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 +32 -28
- infrahub/core/diff/repository/repository.py +215 -41
- infrahub/core/diff/tasks.py +13 -12
- infrahub/core/enums.py +1 -1
- infrahub/core/graph/__init__.py +1 -1
- infrahub/core/graph/index.py +3 -0
- 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 +20 -15
- infrahub/core/merge.py +5 -2
- infrahub/core/migrations/graph/__init__.py +4 -0
- 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/graph/m019_restore_rels_to_time.py +256 -0
- infrahub/core/migrations/graph/m020_add_generate_template_attr.py +48 -0
- 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 +39 -19
- 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 +27 -13
- 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 +170 -46
- 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 +6 -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 +213 -26
- 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 +76 -38
- infrahub/core/schema/__init__.py +6 -4
- infrahub/core/schema/attribute_schema.py +8 -0
- infrahub/core/schema/basenode_schema.py +13 -3
- infrahub/core/schema/definitions/core/__init__.py +153 -0
- infrahub/core/schema/definitions/core/account.py +168 -0
- infrahub/core/schema/definitions/core/artifact.py +127 -0
- infrahub/core/schema/definitions/core/builtin.py +21 -0
- infrahub/core/schema/definitions/core/check.py +60 -0
- infrahub/core/schema/definitions/core/generator.py +96 -0
- infrahub/core/schema/definitions/core/graphql_query.py +77 -0
- infrahub/core/schema/definitions/core/group.py +105 -0
- infrahub/core/schema/definitions/core/ipam.py +252 -0
- infrahub/core/schema/definitions/core/lineage.py +17 -0
- infrahub/core/schema/definitions/core/menu.py +46 -0
- infrahub/core/schema/definitions/core/permission.py +161 -0
- infrahub/core/schema/definitions/core/profile.py +29 -0
- infrahub/core/schema/definitions/core/propose_change.py +88 -0
- infrahub/core/schema/definitions/core/propose_change_comment.py +188 -0
- infrahub/core/schema/definitions/core/propose_change_validator.py +326 -0
- infrahub/core/schema/definitions/core/repository.py +280 -0
- infrahub/core/schema/definitions/core/resource_pool.py +180 -0
- infrahub/core/schema/definitions/core/template.py +12 -0
- infrahub/core/schema/definitions/core/transform.py +87 -0
- infrahub/core/schema/definitions/core/webhook.py +108 -0
- 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 +10 -2
- infrahub/core/schema/schema_branch.py +260 -16
- infrahub/core/schema/template_schema.py +36 -0
- infrahub/core/task/user_task.py +7 -5
- infrahub/core/timestamp.py +3 -3
- 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 +16 -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 +4 -2
- infrahub/dependencies/builder/diff/enricher/hierarchy.py +3 -1
- infrahub/dependencies/builder/diff/enricher/summary_counts.py +1 -1
- infrahub/dependencies/builder/diff/parent_node_adder.py +8 -0
- infrahub/events/artifact_action.py +76 -0
- infrahub/events/branch_action.py +50 -21
- infrahub/events/group_action.py +117 -0
- infrahub/events/models.py +164 -51
- infrahub/events/node_action.py +70 -8
- infrahub/events/repository_action.py +8 -8
- infrahub/events/schema_action.py +21 -8
- infrahub/exceptions.py +9 -0
- infrahub/generators/models.py +1 -0
- infrahub/generators/tasks.py +34 -15
- infrahub/git/base.py +3 -5
- infrahub/git/constants.py +0 -1
- infrahub/git/integrator.py +60 -36
- infrahub/git/models.py +80 -1
- infrahub/git/repository.py +7 -8
- infrahub/git/tasks.py +432 -112
- 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/context.py +33 -0
- infrahub/graphql/enums.py +1 -1
- infrahub/graphql/initialization.py +5 -1
- infrahub/graphql/loaders/node.py +2 -2
- infrahub/graphql/manager.py +63 -63
- infrahub/graphql/mutations/account.py +20 -13
- infrahub/graphql/mutations/artifact_definition.py +16 -12
- infrahub/graphql/mutations/branch.py +86 -40
- infrahub/graphql/mutations/computed_attribute.py +24 -13
- infrahub/graphql/mutations/diff.py +54 -14
- infrahub/graphql/mutations/diff_conflict.py +14 -8
- infrahub/graphql/mutations/generator.py +83 -0
- infrahub/graphql/mutations/graphql_query.py +19 -11
- infrahub/graphql/mutations/ipam.py +25 -23
- infrahub/graphql/mutations/main.py +243 -50
- infrahub/graphql/mutations/menu.py +10 -10
- infrahub/graphql/mutations/proposed_change.py +36 -28
- infrahub/graphql/mutations/relationship.py +343 -104
- infrahub/graphql/mutations/repository.py +41 -35
- infrahub/graphql/mutations/resource_manager.py +26 -26
- infrahub/graphql/mutations/schema.py +66 -33
- infrahub/graphql/mutations/tasks.py +16 -10
- infrahub/graphql/parser.py +1 -1
- infrahub/graphql/permissions.py +3 -10
- infrahub/graphql/queries/account.py +22 -18
- infrahub/graphql/queries/branch.py +6 -4
- infrahub/graphql/queries/diff/tree.py +63 -52
- infrahub/graphql/queries/event.py +115 -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 +4 -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/context.py +12 -0
- infrahub/graphql/types/enums.py +2 -0
- infrahub/graphql/types/event.py +158 -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 +21 -21
- infrahub/menu/generator.py +0 -1
- infrahub/menu/menu.py +116 -138
- infrahub/menu/models.py +4 -4
- infrahub/message_bus/__init__.py +11 -13
- infrahub/message_bus/messages/__init__.py +0 -14
- infrahub/message_bus/messages/check_generator_run.py +1 -3
- infrahub/message_bus/messages/event_branch_merge.py +3 -0
- infrahub/message_bus/messages/proposed_change/request_proposedchange_refreshartifacts.py +6 -0
- infrahub/message_bus/messages/request_proposedchange_pipeline.py +2 -0
- infrahub/message_bus/messages/send_echo_request.py +1 -1
- infrahub/message_bus/operations/__init__.py +4 -13
- infrahub/message_bus/operations/check/__init__.py +2 -2
- infrahub/message_bus/operations/check/generator.py +1 -3
- infrahub/message_bus/operations/event/branch.py +7 -3
- infrahub/message_bus/operations/event/schema.py +1 -1
- infrahub/message_bus/operations/event/worker.py +0 -3
- 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 -4
- infrahub/message_bus/operations/requests/generator_definition.py +2 -4
- infrahub/message_bus/operations/requests/proposed_change.py +37 -20
- infrahub/message_bus/operations/send/echo.py +1 -1
- infrahub/message_bus/types.py +1 -1
- infrahub/permissions/__init__.py +2 -1
- infrahub/permissions/globals.py +15 -0
- 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 +18 -1
- infrahub/proposed_change/tasks.py +195 -53
- infrahub/pytest_plugin.py +4 -4
- infrahub/server.py +13 -12
- infrahub/services/__init__.py +148 -63
- infrahub/services/adapters/cache/__init__.py +11 -11
- infrahub/services/adapters/cache/nats.py +42 -25
- infrahub/services/adapters/cache/redis.py +3 -11
- 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 +25 -8
- infrahub/services/adapters/message_bus/local.py +9 -7
- infrahub/services/adapters/message_bus/nats.py +14 -8
- infrahub/services/adapters/message_bus/rabbitmq.py +23 -10
- infrahub/services/adapters/workflow/__init__.py +11 -8
- infrahub/services/adapters/workflow/local.py +27 -6
- infrahub/services/adapters/workflow/worker.py +23 -7
- infrahub/services/component.py +43 -40
- infrahub/services/protocols.py +7 -7
- infrahub/services/scheduler.py +30 -29
- infrahub/storage.py +2 -4
- infrahub/task_manager/constants.py +1 -1
- infrahub/task_manager/event.py +261 -0
- infrahub/task_manager/models.py +147 -3
- infrahub/task_manager/task.py +1 -1
- infrahub/tasks/artifact.py +19 -18
- 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 +16 -0
- infrahub/trigger/constants.py +9 -0
- infrahub/trigger/models.py +105 -0
- infrahub/trigger/tasks.py +91 -0
- infrahub/types.py +1 -1
- infrahub/utils.py +1 -1
- infrahub/webhook/constants.py +0 -2
- infrahub/webhook/models.py +161 -40
- infrahub/webhook/tasks.py +123 -202
- infrahub/webhook/triggers.py +27 -0
- infrahub/workers/infrahub_async.py +36 -25
- infrahub/workers/utils.py +63 -0
- infrahub/workflows/catalogue.py +71 -52
- infrahub/workflows/initialization.py +14 -8
- infrahub/workflows/models.py +28 -4
- infrahub/workflows/utils.py +1 -1
- infrahub_sdk/client.py +8 -0
- infrahub_sdk/ctl/branch.py +3 -2
- infrahub_sdk/ctl/check.py +3 -3
- infrahub_sdk/ctl/cli_commands.py +16 -11
- 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 -19
- infrahub_sdk/ctl/validate.py +2 -1
- infrahub_sdk/exceptions.py +12 -0
- infrahub_sdk/generator.py +3 -0
- infrahub_sdk/node.py +4 -4
- infrahub_sdk/protocols.py +21 -8
- infrahub_sdk/schema/__init__.py +14 -2
- infrahub_sdk/schema/main.py +7 -0
- infrahub_sdk/task/__init__.py +1 -0
- infrahub_sdk/task/constants.py +3 -0
- infrahub_sdk/task/exceptions.py +25 -0
- infrahub_sdk/task/manager.py +545 -0
- infrahub_sdk/task/models.py +74 -0
- infrahub_sdk/timestamp.py +134 -33
- infrahub_sdk/utils.py +39 -1
- infrahub_sdk/yaml.py +2 -3
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/METADATA +47 -12
- infrahub_server-1.2.0b1.dist-info/RECORD +725 -0
- 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/core/schema/definitions/core.py +0 -2274
- infrahub/graphql/query.py +0 -52
- infrahub/message_bus/messages/check_repository_checkdefinition.py +0 -20
- infrahub/message_bus/messages/check_repository_mergeconflicts.py +0 -16
- infrahub/message_bus/messages/check_repository_usercheck.py +0 -26
- infrahub/message_bus/messages/request_artifactdefinition_check.py +0 -17
- infrahub/message_bus/messages/request_repository_checks.py +0 -12
- infrahub/message_bus/messages/request_repository_userchecks.py +0 -18
- infrahub/message_bus/operations/check/repository.py +0 -293
- infrahub/message_bus/operations/requests/artifact_definition.py +0 -148
- infrahub/message_bus/operations/requests/repository.py +0 -133
- 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_server-1.1.6.dist-info/RECORD +0 -681
- /infrahub/{schema → artifacts}/__init__.py +0 -0
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/LICENSE.txt +0 -0
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/WHEEL +0 -0
- {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/entry_points.txt +0 -0
infrahub/graphql/manager.py
CHANGED
|
@@ -7,7 +7,7 @@ import graphene
|
|
|
7
7
|
|
|
8
8
|
from infrahub import config
|
|
9
9
|
from infrahub.core.attribute import String
|
|
10
|
-
from infrahub.core.constants import InfrahubKind, RelationshipKind
|
|
10
|
+
from infrahub.core.constants import InfrahubKind, RelationshipCardinality, RelationshipKind
|
|
11
11
|
from infrahub.core.schema import (
|
|
12
12
|
AttributeSchema,
|
|
13
13
|
GenericSchema,
|
|
@@ -15,6 +15,7 @@ from infrahub.core.schema import (
|
|
|
15
15
|
NodeSchema,
|
|
16
16
|
ProfileSchema,
|
|
17
17
|
RelationshipSchema,
|
|
18
|
+
TemplateSchema,
|
|
18
19
|
)
|
|
19
20
|
from infrahub.core.timestamp import Timestamp
|
|
20
21
|
from infrahub.graphql.mutations.attribute import BaseAttributeCreate, BaseAttributeUpdate
|
|
@@ -59,6 +60,8 @@ from .types import (
|
|
|
59
60
|
)
|
|
60
61
|
from .types.attribute import BaseAttribute as BaseAttributeType
|
|
61
62
|
from .types.attribute import TextAttributeType
|
|
63
|
+
from .types.context import ContextInput
|
|
64
|
+
from .types.event import EVENT_TYPES
|
|
62
65
|
|
|
63
66
|
if TYPE_CHECKING:
|
|
64
67
|
from graphql import GraphQLSchema
|
|
@@ -66,8 +69,6 @@ if TYPE_CHECKING:
|
|
|
66
69
|
from infrahub.core.branch import Branch
|
|
67
70
|
from infrahub.core.schema.schema_branch import SchemaBranch
|
|
68
71
|
|
|
69
|
-
# pylint: disable=redefined-builtin,c-extension-no-member,too-many-lines,too-many-public-methods
|
|
70
|
-
|
|
71
72
|
|
|
72
73
|
class DeleteInput(graphene.InputObjectType):
|
|
73
74
|
id = graphene.String(required=False)
|
|
@@ -105,7 +106,7 @@ class BranchDetails:
|
|
|
105
106
|
gql_manager: GraphQLSchemaManager
|
|
106
107
|
|
|
107
108
|
|
|
108
|
-
class GraphQLSchemaManager:
|
|
109
|
+
class GraphQLSchemaManager:
|
|
109
110
|
_extra_types: dict[str, GraphQLTypes] = {}
|
|
110
111
|
_branch_details_by_name: dict[str, BranchDetails] = {}
|
|
111
112
|
|
|
@@ -161,6 +162,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
161
162
|
self._graphql_types: dict[str, GraphQLTypes] = {}
|
|
162
163
|
|
|
163
164
|
self._load_attribute_types()
|
|
165
|
+
self._load_event_types()
|
|
164
166
|
if config.SETTINGS.experimental_features.graphql_enums:
|
|
165
167
|
self._load_all_enum_types(node_schemas=self.schema.get_all().values())
|
|
166
168
|
self._load_node_interface()
|
|
@@ -251,7 +253,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
251
253
|
|
|
252
254
|
def get_type(self, name: str) -> type[InfrahubObject]:
|
|
253
255
|
if name in self._graphql_types and issubclass(
|
|
254
|
-
self._graphql_types[name],
|
|
256
|
+
self._graphql_types[name], BaseAttributeType | graphene.Interface | graphene.ObjectType
|
|
255
257
|
):
|
|
256
258
|
return self._graphql_types[name]
|
|
257
259
|
raise ValueError(f"Unable to find {name!r}")
|
|
@@ -273,6 +275,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
273
275
|
for data_type in ATTRIBUTE_TYPES.values():
|
|
274
276
|
self.set_type(name=data_type.get_graphql_type_name(), graphql_type=data_type.get_graphql_type())
|
|
275
277
|
|
|
278
|
+
def _load_event_types(self) -> None:
|
|
279
|
+
for event in EVENT_TYPES.values():
|
|
280
|
+
self.set_type(name=event._meta.name, graphql_type=event)
|
|
281
|
+
|
|
276
282
|
def _load_node_interface(self) -> None:
|
|
277
283
|
node_interface_schema = GenericSchema(
|
|
278
284
|
name="Node", namespace="Core", description="Interface for all nodes in Infrahub"
|
|
@@ -339,13 +345,13 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
339
345
|
|
|
340
346
|
return RelatedNodeInput
|
|
341
347
|
|
|
342
|
-
def generate_object_types(self) -> None:
|
|
348
|
+
def generate_object_types(self) -> None:
|
|
343
349
|
"""Generate all GraphQL objects for the schema and store them in the internal registry."""
|
|
344
350
|
|
|
345
351
|
full_schema = self.schema.get_all(duplicate=False)
|
|
346
352
|
|
|
347
353
|
# Generate all GraphQL Interface Object first and store them in the registry
|
|
348
|
-
for
|
|
354
|
+
for node_schema in full_schema.values():
|
|
349
355
|
if not isinstance(node_schema, GenericSchema):
|
|
350
356
|
continue
|
|
351
357
|
interface = self.generate_interface_object(schema=node_schema, populate_cache=True)
|
|
@@ -385,8 +391,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
385
391
|
self.set_type(name=nested_edged_interface._meta.name, graphql_type=nested_edged_interface)
|
|
386
392
|
|
|
387
393
|
# Generate all GraphQL ObjectType, Nested, Paginated & NestedPaginated and store them in the registry
|
|
388
|
-
for
|
|
389
|
-
if isinstance(node_schema,
|
|
394
|
+
for node_schema in full_schema.values():
|
|
395
|
+
if isinstance(node_schema, NodeSchema | ProfileSchema | TemplateSchema):
|
|
390
396
|
node_type = self.generate_graphql_object(schema=node_schema, populate_cache=True)
|
|
391
397
|
node_type_edged = self.generate_graphql_edged_object(
|
|
392
398
|
schema=node_schema, node=node_type, populate_cache=True
|
|
@@ -417,11 +423,13 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
417
423
|
continue
|
|
418
424
|
peer_filters = self.generate_filters(schema=peer_schema, top_level=False)
|
|
419
425
|
|
|
420
|
-
if rel.cardinality ==
|
|
426
|
+
if rel.cardinality == RelationshipCardinality.ONE:
|
|
421
427
|
peer_type = self.get_type(name=f"NestedEdged{peer_schema.kind}")
|
|
422
|
-
node_type._meta.fields[rel.name] = graphene.Field(
|
|
428
|
+
node_type._meta.fields[rel.name] = graphene.Field(
|
|
429
|
+
peer_type, resolver=single_relationship_resolver, required=True
|
|
430
|
+
)
|
|
423
431
|
|
|
424
|
-
elif rel.cardinality ==
|
|
432
|
+
elif rel.cardinality == RelationshipCardinality.MANY:
|
|
425
433
|
peer_type = self.get_type(name=f"NestedPaginated{peer_schema.kind}")
|
|
426
434
|
|
|
427
435
|
if (isinstance(node_schema, NodeSchema) and node_schema.hierarchy) or (
|
|
@@ -430,7 +438,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
430
438
|
peer_filters["include_descendants"] = graphene.Boolean()
|
|
431
439
|
|
|
432
440
|
node_type._meta.fields[rel.name] = graphene.Field(
|
|
433
|
-
peer_type, required=
|
|
441
|
+
peer_type, required=True, resolver=many_relationship_resolver, **peer_filters
|
|
434
442
|
)
|
|
435
443
|
|
|
436
444
|
if (isinstance(node_schema, NodeSchema) and node_schema.hierarchy) or (
|
|
@@ -448,16 +456,16 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
448
456
|
peer_type_edge = self.get_type(name=f"NestedEdged{hierarchy_name}")
|
|
449
457
|
|
|
450
458
|
node_type._meta.fields["parent"] = graphene.Field(
|
|
451
|
-
peer_type_edge, required=
|
|
459
|
+
peer_type_edge, required=True, resolver=single_relationship_resolver
|
|
452
460
|
)
|
|
453
461
|
node_type._meta.fields["children"] = graphene.Field(
|
|
454
|
-
peer_type, required=
|
|
462
|
+
peer_type, required=True, resolver=many_relationship_resolver, **peer_filters
|
|
455
463
|
)
|
|
456
464
|
node_type._meta.fields["ancestors"] = graphene.Field(
|
|
457
|
-
peer_type, required=
|
|
465
|
+
peer_type, required=True, resolver=ancestors_resolver, **peer_filters
|
|
458
466
|
)
|
|
459
467
|
node_type._meta.fields["descendants"] = graphene.Field(
|
|
460
|
-
peer_type, required=
|
|
468
|
+
peer_type, required=True, resolver=descendants_resolver, **peer_filters
|
|
461
469
|
)
|
|
462
470
|
|
|
463
471
|
def generate_query_mixin(self) -> type[object]:
|
|
@@ -478,6 +486,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
478
486
|
class_attrs[node_schema.kind] = graphene.Field(
|
|
479
487
|
node_type,
|
|
480
488
|
resolver=default_paginated_list_resolver,
|
|
489
|
+
required=True,
|
|
481
490
|
**node_filters,
|
|
482
491
|
)
|
|
483
492
|
if node_name == InfrahubKind.GENERICACCOUNT:
|
|
@@ -513,7 +522,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
513
522
|
else:
|
|
514
523
|
base_class = mutation_map.get(node_schema.kind, InfrahubMutation)
|
|
515
524
|
|
|
516
|
-
if isinstance(node_schema,
|
|
525
|
+
if isinstance(node_schema, NodeSchema | ProfileSchema | TemplateSchema):
|
|
517
526
|
mutations = self.generate_graphql_mutations(schema=node_schema, base_class=base_class)
|
|
518
527
|
|
|
519
528
|
class_attrs[f"{node_schema.kind}Create"] = mutations.create.Field()
|
|
@@ -539,7 +548,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
539
548
|
|
|
540
549
|
interfaces: set[type[InfrahubObject]] = set()
|
|
541
550
|
|
|
542
|
-
if isinstance(schema,
|
|
551
|
+
if isinstance(schema, NodeSchema | ProfileSchema | TemplateSchema) and schema.inherit_from:
|
|
543
552
|
for generic_name in schema.inherit_from:
|
|
544
553
|
generic = self.get_type(name=generic_name)
|
|
545
554
|
interfaces.add(generic)
|
|
@@ -559,7 +568,9 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
559
568
|
main_attrs = {
|
|
560
569
|
"id": graphene.Field(graphene.String, required=True, description="Unique identifier"),
|
|
561
570
|
"hfid": graphene.Field(
|
|
562
|
-
graphene.List(of_type=graphene.String),
|
|
571
|
+
graphene.List(of_type=graphene.NonNull(graphene.String)),
|
|
572
|
+
required=False,
|
|
573
|
+
description="Human friendly identifier",
|
|
563
574
|
),
|
|
564
575
|
"_updated_at": graphene.DateTime(required=False),
|
|
565
576
|
"display_label": graphene.String(required=False),
|
|
@@ -569,7 +580,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
569
580
|
for attr in schema.local_attributes:
|
|
570
581
|
attr_kind = get_attr_kind(schema, attr)
|
|
571
582
|
attr_type = self.get_type(name=get_attribute_type(kind=attr_kind).get_graphql_type_name())
|
|
572
|
-
|
|
583
|
+
req = "" if attr.optional else " (required)"
|
|
584
|
+
main_attrs[attr.name] = graphene.Field(attr_type, description=f"{attr.description}{req}")
|
|
573
585
|
|
|
574
586
|
graphql_object = type(schema.kind, (InfrahubObject,), main_attrs)
|
|
575
587
|
|
|
@@ -589,7 +601,9 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
589
601
|
main_attrs = {
|
|
590
602
|
"id": graphene.Field(graphene.String, required=False, description="Unique identifier"),
|
|
591
603
|
"hfid": graphene.Field(
|
|
592
|
-
graphene.List(of_type=graphene.String),
|
|
604
|
+
graphene.List(of_type=graphene.NonNull(graphene.String)),
|
|
605
|
+
required=False,
|
|
606
|
+
description="Human friendly identifier",
|
|
593
607
|
),
|
|
594
608
|
"display_label": graphene.String(required=False),
|
|
595
609
|
"Meta": type("Meta", (object,), meta_attrs),
|
|
@@ -598,7 +612,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
598
612
|
for attr in schema.attributes:
|
|
599
613
|
attr_kind = get_attr_kind(node_schema=schema, attr_schema=attr)
|
|
600
614
|
attr_type = self.get_type(name=get_attribute_type(kind=attr_kind).get_graphql_type_name())
|
|
601
|
-
main_attrs[attr.name] = graphene.Field(attr_type,
|
|
615
|
+
main_attrs[attr.name] = graphene.Field(attr_type, description=attr.description)
|
|
602
616
|
|
|
603
617
|
interface_object = type(schema.kind, (InfrahubInterface,), main_attrs)
|
|
604
618
|
|
|
@@ -629,7 +643,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
629
643
|
self.set_type(name=type_name, graphql_type=relationship_property)
|
|
630
644
|
|
|
631
645
|
def generate_graphql_mutations(
|
|
632
|
-
self, schema:
|
|
646
|
+
self, schema: NodeSchema | ProfileSchema | TemplateSchema, base_class: type[InfrahubMutation]
|
|
633
647
|
) -> GraphqlMutations:
|
|
634
648
|
graphql_mutation_create_input = self.generate_graphql_mutation_create_input(schema)
|
|
635
649
|
graphql_mutation_update_input = self.generate_graphql_mutation_update_input(schema)
|
|
@@ -657,7 +671,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
657
671
|
return GraphqlMutations(create=create, update=update, upsert=upsert, delete=delete)
|
|
658
672
|
|
|
659
673
|
def generate_graphql_mutation_create_input(
|
|
660
|
-
self, schema:
|
|
674
|
+
self, schema: NodeSchema | ProfileSchema | TemplateSchema
|
|
661
675
|
) -> type[graphene.InputObjectType]:
|
|
662
676
|
"""Generate an InputObjectType Object from a Infrahub NodeSchema
|
|
663
677
|
|
|
@@ -677,10 +691,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
677
691
|
attr_kind = get_attr_kind(schema, attr)
|
|
678
692
|
attr_type = get_attribute_type(kind=attr_kind).get_graphql_create()
|
|
679
693
|
|
|
680
|
-
|
|
681
|
-
required = not attr.optional if not attr.default_value else False
|
|
682
|
-
|
|
683
|
-
attrs[attr.name] = graphene.InputField(attr_type, required=required, description=attr.description)
|
|
694
|
+
attrs[attr.name] = graphene.InputField(attr_type, description=attr.description)
|
|
684
695
|
|
|
685
696
|
for rel in schema.relationships:
|
|
686
697
|
if rel.internal_peer or rel.read_only:
|
|
@@ -688,14 +699,11 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
688
699
|
|
|
689
700
|
input_type = self._get_related_input_type(relationship=rel)
|
|
690
701
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
attrs[rel.name] = graphene.InputField(input_type, required=required, description=rel.description)
|
|
702
|
+
if rel.cardinality == RelationshipCardinality.ONE:
|
|
703
|
+
attrs[rel.name] = graphene.InputField(input_type, description=rel.description)
|
|
694
704
|
|
|
695
|
-
elif rel.cardinality ==
|
|
696
|
-
attrs[rel.name] = graphene.InputField(
|
|
697
|
-
graphene.List(input_type), required=required, description=rel.description
|
|
698
|
-
)
|
|
705
|
+
elif rel.cardinality == RelationshipCardinality.MANY:
|
|
706
|
+
attrs[rel.name] = graphene.InputField(graphene.List(input_type), description=rel.description)
|
|
699
707
|
|
|
700
708
|
return type(f"{schema.kind}CreateInput", (graphene.InputObjectType,), attrs)
|
|
701
709
|
|
|
@@ -728,10 +736,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
728
736
|
|
|
729
737
|
input_type = self._get_related_input_type(relationship=rel)
|
|
730
738
|
|
|
731
|
-
if rel.cardinality ==
|
|
739
|
+
if rel.cardinality == RelationshipCardinality.ONE:
|
|
732
740
|
attrs[rel.name] = graphene.InputField(input_type, required=False, description=rel.description)
|
|
733
741
|
|
|
734
|
-
elif rel.cardinality ==
|
|
742
|
+
elif rel.cardinality == RelationshipCardinality.MANY:
|
|
735
743
|
attrs[rel.name] = graphene.InputField(
|
|
736
744
|
graphene.List(input_type), required=False, description=rel.description
|
|
737
745
|
)
|
|
@@ -739,7 +747,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
739
747
|
return type(f"{schema.kind}UpdateInput", (graphene.InputObjectType,), attrs)
|
|
740
748
|
|
|
741
749
|
def generate_graphql_mutation_upsert_input(
|
|
742
|
-
self, schema:
|
|
750
|
+
self, schema: NodeSchema | ProfileSchema | TemplateSchema
|
|
743
751
|
) -> type[graphene.InputObjectType]:
|
|
744
752
|
"""Generate an InputObjectType Object from a Infrahub NodeSchema
|
|
745
753
|
|
|
@@ -775,10 +783,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
775
783
|
input_type = self._get_related_input_type(relationship=rel)
|
|
776
784
|
|
|
777
785
|
required = not rel.optional
|
|
778
|
-
if rel.cardinality ==
|
|
786
|
+
if rel.cardinality == RelationshipCardinality.ONE:
|
|
779
787
|
attrs[rel.name] = graphene.InputField(input_type, required=required, description=rel.description)
|
|
780
788
|
|
|
781
|
-
elif rel.cardinality ==
|
|
789
|
+
elif rel.cardinality == RelationshipCardinality.MANY:
|
|
782
790
|
attrs[rel.name] = graphene.InputField(
|
|
783
791
|
graphene.List(input_type), required=required, description=rel.description
|
|
784
792
|
)
|
|
@@ -787,7 +795,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
787
795
|
|
|
788
796
|
def generate_graphql_mutation_create(
|
|
789
797
|
self,
|
|
790
|
-
schema:
|
|
798
|
+
schema: NodeSchema | ProfileSchema | TemplateSchema,
|
|
791
799
|
input_type: type[graphene.InputObjectType],
|
|
792
800
|
base_class: type[InfrahubMutation] = InfrahubMutation,
|
|
793
801
|
mutation_type: str = "Create",
|
|
@@ -802,9 +810,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
802
810
|
meta_attrs: dict[str, Any] = {"schema": schema, "name": name, "description": schema.description}
|
|
803
811
|
main_attrs["Meta"] = type("Meta", (object,), meta_attrs)
|
|
804
812
|
|
|
805
|
-
args_attrs = {
|
|
806
|
-
"data": input_type(required=True),
|
|
807
|
-
}
|
|
813
|
+
args_attrs = {"data": input_type(required=True), "context": ContextInput(required=False)}
|
|
808
814
|
main_attrs["Arguments"] = type("Arguments", (object,), args_attrs)
|
|
809
815
|
|
|
810
816
|
return type(name, (base_class,), main_attrs)
|
|
@@ -825,16 +831,14 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
825
831
|
meta_attrs: dict[str, Any] = {"schema": schema, "name": name, "description": schema.description}
|
|
826
832
|
main_attrs["Meta"] = type("Meta", (object,), meta_attrs)
|
|
827
833
|
|
|
828
|
-
args_attrs = {
|
|
829
|
-
"data": input_type(required=True),
|
|
830
|
-
}
|
|
834
|
+
args_attrs = {"data": input_type(required=True), "context": ContextInput(required=False)}
|
|
831
835
|
main_attrs["Arguments"] = type("Arguments", (object,), args_attrs)
|
|
832
836
|
|
|
833
837
|
return type(name, (base_class,), main_attrs)
|
|
834
838
|
|
|
835
839
|
@staticmethod
|
|
836
840
|
def generate_graphql_mutation_delete(
|
|
837
|
-
schema:
|
|
841
|
+
schema: NodeSchema | ProfileSchema | TemplateSchema, base_class: type[InfrahubMutation] = InfrahubMutation
|
|
838
842
|
) -> type[InfrahubMutation]:
|
|
839
843
|
"""Generate a GraphQL Mutation to DELETE an object based on the specified NodeSchema."""
|
|
840
844
|
name = f"{schema.kind}Delete"
|
|
@@ -844,9 +848,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
844
848
|
meta_attrs = {"schema": schema, "name": name, "description": schema.description}
|
|
845
849
|
main_attrs["Meta"] = type("Meta", (object,), meta_attrs)
|
|
846
850
|
|
|
847
|
-
args_attrs: dict[str, Any] = {
|
|
848
|
-
"data": DeleteInput(required=True),
|
|
849
|
-
}
|
|
851
|
+
args_attrs: dict[str, Any] = {"data": DeleteInput(required=True), "context": ContextInput(required=False)}
|
|
850
852
|
main_attrs["Arguments"] = type("Arguments", (object,), args_attrs)
|
|
851
853
|
|
|
852
854
|
return type(name, (base_class,), main_attrs)
|
|
@@ -940,7 +942,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
940
942
|
}
|
|
941
943
|
|
|
942
944
|
if relation_property:
|
|
943
|
-
main_attrs["properties"] = graphene.Field(relation_property)
|
|
945
|
+
main_attrs["properties"] = graphene.Field(relation_property, required=False)
|
|
944
946
|
|
|
945
947
|
graphql_edged_object = type(object_name, (InfrahubObject,), main_attrs)
|
|
946
948
|
|
|
@@ -967,16 +969,14 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
967
969
|
}
|
|
968
970
|
|
|
969
971
|
main_attrs: dict[str, Any] = {
|
|
970
|
-
"count": graphene.Int(required=
|
|
971
|
-
"edges": graphene.List(of_type=edge),
|
|
972
|
+
"count": graphene.Int(required=True),
|
|
973
|
+
"edges": graphene.List(of_type=graphene.NonNull(edge), required=True),
|
|
974
|
+
"permissions": graphene.Field(
|
|
975
|
+
PaginatedObjectPermission, required=True, resolver=parent_field_name_resolver
|
|
976
|
+
),
|
|
972
977
|
"Meta": type("Meta", (object,), meta_attrs),
|
|
973
978
|
}
|
|
974
979
|
|
|
975
|
-
if isinstance(schema, (NodeSchema, GenericSchema)):
|
|
976
|
-
main_attrs["permissions"] = graphene.Field(
|
|
977
|
-
PaginatedObjectPermission, required=True, resolver=parent_field_name_resolver
|
|
978
|
-
)
|
|
979
|
-
|
|
980
980
|
graphql_paginated_object = type(object_name, (InfrahubObject,), main_attrs)
|
|
981
981
|
|
|
982
982
|
if populate_cache:
|
|
@@ -1004,7 +1004,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
1004
1004
|
}
|
|
1005
1005
|
|
|
1006
1006
|
if relation_property:
|
|
1007
|
-
main_attrs["properties"] = graphene.Field(relation_property)
|
|
1007
|
+
main_attrs["properties"] = graphene.Field(relation_property, required=False)
|
|
1008
1008
|
|
|
1009
1009
|
object_name = f"NestedEdged{schema.kind}"
|
|
1010
1010
|
nested_interface_object = type(object_name, (InfrahubObject,), main_attrs)
|
|
@@ -1025,8 +1025,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
|
|
|
1025
1025
|
}
|
|
1026
1026
|
|
|
1027
1027
|
main_attrs: dict[str, Any] = {
|
|
1028
|
-
"count": graphene.Int(required=
|
|
1029
|
-
"edges": graphene.List(of_type=base_interface),
|
|
1028
|
+
"count": graphene.Int(required=True),
|
|
1029
|
+
"edges": graphene.List(of_type=graphene.NonNull(base_interface)),
|
|
1030
1030
|
"Meta": type("Meta", (object,), meta_attrs),
|
|
1031
1031
|
}
|
|
1032
1032
|
|
|
@@ -22,9 +22,6 @@ if TYPE_CHECKING:
|
|
|
22
22
|
from ..initialization import GraphqlContext
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
# pylint: disable=unused-argument
|
|
26
|
-
|
|
27
|
-
|
|
28
25
|
class InfrahubAccountTokenCreateInput(InputObjectType):
|
|
29
26
|
name = InputField(String(required=False), description="The name of the token")
|
|
30
27
|
expiration = InputField(String(required=False), description="Timestamp when the token expires")
|
|
@@ -52,23 +49,25 @@ class AccountMixin:
|
|
|
52
49
|
@classmethod
|
|
53
50
|
async def mutate(
|
|
54
51
|
cls,
|
|
55
|
-
root: dict,
|
|
52
|
+
root: dict, # noqa: ARG003
|
|
56
53
|
info: GraphQLResolveInfo,
|
|
57
54
|
data: dict[str, Any],
|
|
58
55
|
) -> Self:
|
|
59
|
-
|
|
56
|
+
graphql_context: GraphqlContext = info.context
|
|
60
57
|
|
|
61
|
-
if not
|
|
58
|
+
if not graphql_context.account_session:
|
|
62
59
|
raise ValueError("An account_session is mandatory to execute this mutation")
|
|
63
60
|
|
|
64
|
-
if
|
|
61
|
+
if graphql_context.account_session.auth_type != AuthType.JWT:
|
|
65
62
|
raise PermissionDeniedError("This operation requires authentication with a JWT token")
|
|
66
63
|
|
|
67
64
|
results = await NodeManager.query(
|
|
68
|
-
schema=CoreAccount, filters={"ids": [
|
|
65
|
+
schema=CoreAccount, filters={"ids": [graphql_context.account_session.account_id]}, db=graphql_context.db
|
|
69
66
|
)
|
|
70
67
|
if not results:
|
|
71
|
-
raise NodeNotFoundError(
|
|
68
|
+
raise NodeNotFoundError(
|
|
69
|
+
node_type=InfrahubKind.ACCOUNT, identifier=graphql_context.account_session.account_id
|
|
70
|
+
)
|
|
72
71
|
|
|
73
72
|
account = results[0]
|
|
74
73
|
|
|
@@ -77,10 +76,10 @@ class AccountMixin:
|
|
|
77
76
|
"InfrahubAccountTokenDelete": cls.delete_token,
|
|
78
77
|
"InfrahubAccountSelfUpdate": cls.update_self,
|
|
79
78
|
}
|
|
80
|
-
response = await mutation_map[cls.__name__](db=
|
|
79
|
+
response = await mutation_map[cls.__name__](db=graphql_context.db, account=account, data=data, info=info)
|
|
81
80
|
|
|
82
81
|
# Reset the time of the query to guarantee that all resolvers executed after this point will account for the changes
|
|
83
|
-
|
|
82
|
+
graphql_context.at = Timestamp()
|
|
84
83
|
|
|
85
84
|
return response
|
|
86
85
|
|
|
@@ -108,7 +107,11 @@ class AccountMixin:
|
|
|
108
107
|
@classmethod
|
|
109
108
|
@retry_db_transaction(name="account_token_delete")
|
|
110
109
|
async def delete_token(
|
|
111
|
-
cls,
|
|
110
|
+
cls,
|
|
111
|
+
db: InfrahubDatabase,
|
|
112
|
+
account: CoreNode,
|
|
113
|
+
data: dict[str, Any],
|
|
114
|
+
info: GraphQLResolveInfo, # noqa: ARG003
|
|
112
115
|
) -> Self:
|
|
113
116
|
token_id = str(data.get("id"))
|
|
114
117
|
|
|
@@ -130,7 +133,11 @@ class AccountMixin:
|
|
|
130
133
|
@classmethod
|
|
131
134
|
@retry_db_transaction(name="account_update_self")
|
|
132
135
|
async def update_self(
|
|
133
|
-
cls,
|
|
136
|
+
cls,
|
|
137
|
+
db: InfrahubDatabase,
|
|
138
|
+
account: CoreNode,
|
|
139
|
+
data: dict[str, Any],
|
|
140
|
+
info: GraphQLResolveInfo, # noqa: ARG003
|
|
134
141
|
) -> Self:
|
|
135
142
|
for field in ("password", "description"):
|
|
136
143
|
if value := data.get(field):
|
|
@@ -25,7 +25,7 @@ log = get_logger()
|
|
|
25
25
|
|
|
26
26
|
class InfrahubArtifactDefinitionMutation(InfrahubMutationMixin, Mutation):
|
|
27
27
|
@classmethod
|
|
28
|
-
def __init_subclass_with_meta__(
|
|
28
|
+
def __init_subclass_with_meta__(
|
|
29
29
|
cls,
|
|
30
30
|
schema: NodeSchema,
|
|
31
31
|
_meta: Optional[Any] = None,
|
|
@@ -48,20 +48,22 @@ class InfrahubArtifactDefinitionMutation(InfrahubMutationMixin, Mutation):
|
|
|
48
48
|
info: GraphQLResolveInfo,
|
|
49
49
|
data: InputObjectType,
|
|
50
50
|
branch: Branch,
|
|
51
|
-
database: Optional[InfrahubDatabase] = None,
|
|
51
|
+
database: Optional[InfrahubDatabase] = None, # noqa: ARG003
|
|
52
52
|
) -> tuple[Node, Self]:
|
|
53
|
-
|
|
53
|
+
graphql_context: GraphqlContext = info.context
|
|
54
54
|
|
|
55
55
|
artifact_definition, result = await super().mutate_create(info=info, data=data, branch=branch)
|
|
56
56
|
|
|
57
|
-
if
|
|
57
|
+
if graphql_context.service:
|
|
58
58
|
model = RequestArtifactDefinitionGenerate(
|
|
59
59
|
branch=branch.name,
|
|
60
60
|
artifact_definition_id=artifact_definition.id,
|
|
61
61
|
artifact_definition_name=artifact_definition.name.value, # type: ignore[attr-defined]
|
|
62
62
|
)
|
|
63
|
-
await
|
|
64
|
-
workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE,
|
|
63
|
+
await graphql_context.service.workflow.submit_workflow(
|
|
64
|
+
workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE,
|
|
65
|
+
context=graphql_context.get_context(),
|
|
66
|
+
parameters={"model": model},
|
|
65
67
|
)
|
|
66
68
|
|
|
67
69
|
return artifact_definition, result
|
|
@@ -72,21 +74,23 @@ class InfrahubArtifactDefinitionMutation(InfrahubMutationMixin, Mutation):
|
|
|
72
74
|
info: GraphQLResolveInfo,
|
|
73
75
|
data: InputObjectType,
|
|
74
76
|
branch: Branch,
|
|
75
|
-
database: Optional[InfrahubDatabase] = None,
|
|
76
|
-
node: Optional[Node] = None,
|
|
77
|
+
database: Optional[InfrahubDatabase] = None, # noqa: ARG003
|
|
78
|
+
node: Optional[Node] = None, # noqa: ARG003
|
|
77
79
|
) -> tuple[Node, Self]:
|
|
78
|
-
|
|
80
|
+
graphql_context: GraphqlContext = info.context
|
|
79
81
|
|
|
80
82
|
artifact_definition, result = await super().mutate_update(info=info, data=data, branch=branch)
|
|
81
83
|
|
|
82
|
-
if
|
|
84
|
+
if graphql_context.service:
|
|
83
85
|
model = RequestArtifactDefinitionGenerate(
|
|
84
86
|
branch=branch.name,
|
|
85
87
|
artifact_definition_id=artifact_definition.id,
|
|
86
88
|
artifact_definition_name=artifact_definition.name.value, # type: ignore[attr-defined]
|
|
87
89
|
)
|
|
88
|
-
await
|
|
89
|
-
workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE,
|
|
90
|
+
await graphql_context.service.workflow.submit_workflow(
|
|
91
|
+
workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE,
|
|
92
|
+
context=graphql_context.get_context(),
|
|
93
|
+
parameters={"model": model},
|
|
90
94
|
)
|
|
91
95
|
|
|
92
96
|
return artifact_definition, result
|