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
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from pydantic import Field, computed_field
|
|
4
|
+
|
|
5
|
+
from infrahub.core.constants import MutationAction
|
|
6
|
+
from infrahub.message_bus import InfrahubMessage
|
|
7
|
+
|
|
8
|
+
from .constants import EVENT_NAMESPACE
|
|
9
|
+
from .models import EventNode, InfrahubEvent
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class GroupMutatedEvent(InfrahubEvent):
|
|
13
|
+
"""Event generated when a node has been mutated"""
|
|
14
|
+
|
|
15
|
+
kind: str = Field(..., description="The type of updated group")
|
|
16
|
+
node_id: str = Field(..., description="The ID of the updated group")
|
|
17
|
+
action: MutationAction = Field(..., description="The action taken on the node")
|
|
18
|
+
members: list[EventNode] = Field(default_factory=list, description="Updated members during this event.")
|
|
19
|
+
ancestors: list[EventNode] = Field(
|
|
20
|
+
default_factory=list, description="A list of groups that are ancestors of this group."
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
def get_related(self) -> list[dict[str, str]]:
|
|
24
|
+
related = super().get_related()
|
|
25
|
+
related.append(
|
|
26
|
+
{
|
|
27
|
+
"prefect.resource.id": self.node_id,
|
|
28
|
+
"prefect.resource.role": "infrahub.related.node",
|
|
29
|
+
"infrahub.node.kind": self.kind,
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
related.append(
|
|
33
|
+
{
|
|
34
|
+
"prefect.resource.id": self.node_id,
|
|
35
|
+
"prefect.resource.role": "infrahub.group.update",
|
|
36
|
+
"infrahub.node.kind": self.kind,
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
for member in self.members:
|
|
41
|
+
related.append(
|
|
42
|
+
{
|
|
43
|
+
"prefect.resource.id": member.id,
|
|
44
|
+
"prefect.resource.role": "infrahub.group.member",
|
|
45
|
+
"infrahub.node.kind": member.kind,
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
related.append(
|
|
49
|
+
{
|
|
50
|
+
"prefect.resource.id": member.id,
|
|
51
|
+
"prefect.resource.role": "infrahub.related.node",
|
|
52
|
+
"infrahub.node.kind": member.kind,
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
for ancestor in self.ancestors:
|
|
57
|
+
related.append(
|
|
58
|
+
{
|
|
59
|
+
"prefect.resource.id": ancestor.id,
|
|
60
|
+
"prefect.resource.role": "infrahub.group.ancestor",
|
|
61
|
+
"infrahub.node.kind": ancestor.kind,
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
related.append(
|
|
65
|
+
{
|
|
66
|
+
"prefect.resource.id": ancestor.id,
|
|
67
|
+
"prefect.resource.role": "infrahub.related.node",
|
|
68
|
+
"infrahub.node.kind": ancestor.kind,
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
related.append(
|
|
72
|
+
{
|
|
73
|
+
"prefect.resource.id": ancestor.id,
|
|
74
|
+
"prefect.resource.role": "infrahub.group.update",
|
|
75
|
+
"infrahub.node.kind": ancestor.kind,
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return related
|
|
80
|
+
|
|
81
|
+
@computed_field
|
|
82
|
+
def event_name(self) -> str:
|
|
83
|
+
return f"{EVENT_NAMESPACE}.group.{self.action.value}"
|
|
84
|
+
|
|
85
|
+
def get_resource(self) -> dict[str, str]:
|
|
86
|
+
return {
|
|
87
|
+
"prefect.resource.id": f"infrahub.node.{self.node_id}",
|
|
88
|
+
"infrahub.node.kind": self.kind,
|
|
89
|
+
"infrahub.node.id": self.node_id,
|
|
90
|
+
"infrahub.node.action": self.action.value,
|
|
91
|
+
"infrahub.node.root_id": self.node_id,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
def get_payload(self) -> dict[str, Any]:
|
|
95
|
+
return {
|
|
96
|
+
"ancestors": [ancestor.model_dump() for ancestor in self.ancestors],
|
|
97
|
+
"members": [member.model_dump() for member in self.members],
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
def get_messages(self) -> list[InfrahubMessage]:
|
|
101
|
+
return []
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class GroupMemberAddedEvent(GroupMutatedEvent):
|
|
105
|
+
action: MutationAction = MutationAction.CREATED
|
|
106
|
+
|
|
107
|
+
@computed_field
|
|
108
|
+
def event_name(self) -> str:
|
|
109
|
+
return f"{EVENT_NAMESPACE}.group.member_added"
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class GroupMemberRemovedEvent(GroupMutatedEvent):
|
|
113
|
+
action: MutationAction = MutationAction.DELETED
|
|
114
|
+
|
|
115
|
+
@computed_field
|
|
116
|
+
def event_name(self) -> str:
|
|
117
|
+
return f"{EVENT_NAMESPACE}.group.member_removed"
|
infrahub/events/models.py
CHANGED
|
@@ -1,93 +1,206 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from copy import deepcopy
|
|
4
|
+
from typing import Any, Self, cast, final
|
|
5
|
+
from uuid import UUID, uuid4
|
|
4
6
|
|
|
7
|
+
from pydantic import BaseModel, Field, PrivateAttr, computed_field, model_validator
|
|
8
|
+
|
|
9
|
+
from infrahub import __version__
|
|
10
|
+
from infrahub.auth import AccountSession, AuthType
|
|
11
|
+
from infrahub.context import InfrahubContext # noqa: TC001
|
|
12
|
+
from infrahub.core.branch import Branch # noqa: TC001
|
|
5
13
|
from infrahub.message_bus import InfrahubMessage, Meta
|
|
14
|
+
from infrahub.worker import WORKER_IDENTITY
|
|
6
15
|
|
|
7
16
|
from .constants import EVENT_NAMESPACE
|
|
8
17
|
|
|
9
18
|
|
|
19
|
+
class EventNode(BaseModel):
|
|
20
|
+
id: str
|
|
21
|
+
kind: str
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ParentEvent(BaseModel):
|
|
25
|
+
id: str
|
|
26
|
+
name: str
|
|
27
|
+
|
|
28
|
+
|
|
10
29
|
class EventMeta(BaseModel):
|
|
30
|
+
branch: Branch | None = Field(default=None, description="The branch on which originate this event")
|
|
11
31
|
request_id: str = ""
|
|
12
|
-
account_id: str = ""
|
|
13
|
-
initiator_id: str
|
|
14
|
-
default=
|
|
32
|
+
account_id: str | None = Field(default=None, description="The ID of the account triggering this event")
|
|
33
|
+
initiator_id: str = Field(
|
|
34
|
+
default=WORKER_IDENTITY, description="The worker identity of the initial sender of this message"
|
|
35
|
+
)
|
|
36
|
+
context: InfrahubContext = Field(..., description="The context used when originating this event")
|
|
37
|
+
level: int = Field(default=0)
|
|
38
|
+
has_children: bool = Field(
|
|
39
|
+
default=False, description="Indicates if this event might potentially have child events under it."
|
|
15
40
|
)
|
|
16
41
|
|
|
42
|
+
id: UUID = Field(
|
|
43
|
+
default_factory=uuid4,
|
|
44
|
+
description="UUID of the event",
|
|
45
|
+
)
|
|
17
46
|
|
|
18
|
-
|
|
19
|
-
|
|
47
|
+
parent: UUID | None = Field(default=None, description="The UUID of the parent event if applicable")
|
|
48
|
+
ancestors: list[ParentEvent] = Field(default_factory=list, description="Any event used to trigger this event")
|
|
49
|
+
_created_with_context: bool = PrivateAttr(default=False)
|
|
20
50
|
|
|
21
|
-
def
|
|
22
|
-
|
|
51
|
+
def get_branch_id(self) -> str:
|
|
52
|
+
if self.context.branch.id:
|
|
53
|
+
return self.context.branch.id
|
|
23
54
|
|
|
24
|
-
|
|
25
|
-
|
|
55
|
+
if self.branch:
|
|
56
|
+
return str(self.branch.get_uuid())
|
|
26
57
|
|
|
27
|
-
|
|
28
|
-
raise NotImplementedError
|
|
58
|
+
return ""
|
|
29
59
|
|
|
30
|
-
def
|
|
31
|
-
|
|
60
|
+
def get_id(self) -> str:
|
|
61
|
+
return str(self.id)
|
|
32
62
|
|
|
33
63
|
def get_related(self) -> list[dict[str, str]]:
|
|
34
|
-
related: list[dict[str, str]] = [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
64
|
+
related: list[dict[str, str]] = [
|
|
65
|
+
{"prefect.resource.id": __version__, "prefect.resource.role": "infrahub.version"},
|
|
66
|
+
{
|
|
67
|
+
"prefect.resource.id": self.get_id(),
|
|
68
|
+
"prefect.resource.role": "infrahub.event",
|
|
69
|
+
"infrahub.event.has_children": str(self.has_children).lower(),
|
|
70
|
+
"infrahub.event.level": str(self.level),
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"prefect.resource.id": f"infrahub.account.{self.context.account.account_id}",
|
|
74
|
+
"prefect.resource.role": "infrahub.account",
|
|
75
|
+
"infrahub.resource.id": self.context.account.account_id,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"prefect.resource.id": f"infrahub.branch.{self.get_branch_id()}",
|
|
79
|
+
"prefect.resource.role": "infrahub.branch",
|
|
80
|
+
"infrahub.resource.id": self.get_branch_id(),
|
|
81
|
+
"infrahub.resource.label": self.context.branch.name,
|
|
82
|
+
},
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
if self.parent:
|
|
48
86
|
related.append(
|
|
49
87
|
{
|
|
50
|
-
"prefect.resource.id":
|
|
51
|
-
"prefect.resource.role": "
|
|
88
|
+
"prefect.resource.id": self.get_id(),
|
|
89
|
+
"prefect.resource.role": "infrahub.child_event",
|
|
90
|
+
"infrahub.event_parent.id": str(self.parent),
|
|
52
91
|
}
|
|
53
92
|
)
|
|
54
93
|
|
|
55
|
-
|
|
94
|
+
for ancestor in self.ancestors:
|
|
56
95
|
related.append(
|
|
57
96
|
{
|
|
58
|
-
"prefect.resource.id":
|
|
59
|
-
"prefect.resource.role": "
|
|
97
|
+
"prefect.resource.id": ancestor.id,
|
|
98
|
+
"prefect.resource.role": "infrahub.ancestor_event",
|
|
99
|
+
"infrahub.ancestor_event.name": ancestor.name,
|
|
60
100
|
}
|
|
61
101
|
)
|
|
62
102
|
|
|
63
103
|
return related
|
|
64
104
|
|
|
105
|
+
@classmethod
|
|
106
|
+
def with_dummy_context(cls, branch: Branch) -> EventMeta:
|
|
107
|
+
return cls(
|
|
108
|
+
branch=branch,
|
|
109
|
+
context=InfrahubContext.init(
|
|
110
|
+
branch=branch, account=AccountSession(auth_type=AuthType.NONE, authenticated=False, account_id="")
|
|
111
|
+
),
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
@classmethod
|
|
115
|
+
def from_parent(cls, parent: InfrahubEvent, branch: Branch | None = None) -> EventMeta:
|
|
116
|
+
"""Create the metadata from an existing event
|
|
117
|
+
|
|
118
|
+
Note that this action will modify the existing event to indicate that children might be attached to the event
|
|
119
|
+
"""
|
|
120
|
+
parent.meta.has_children = True
|
|
121
|
+
context = deepcopy(parent.meta.context)
|
|
122
|
+
if branch:
|
|
123
|
+
context.branch.name = branch.name
|
|
124
|
+
context.branch.id = str(branch.get_uuid())
|
|
125
|
+
|
|
126
|
+
return cls(
|
|
127
|
+
parent=parent.meta.id,
|
|
128
|
+
branch=parent.meta.branch,
|
|
129
|
+
request_id=parent.meta.request_id,
|
|
130
|
+
initiator_id=parent.meta.initiator_id,
|
|
131
|
+
account_id=parent.meta.account_id,
|
|
132
|
+
level=parent.meta.level + 1,
|
|
133
|
+
context=context,
|
|
134
|
+
ancestors=[ParentEvent(id=parent.get_id(), name=parent.get_name())] + parent.meta.ancestors,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
@classmethod
|
|
138
|
+
def from_context(cls, context: InfrahubContext, branch: Branch | None = None) -> EventMeta:
|
|
139
|
+
# Create a copy of the context so local changes aren't brought back to a parent object
|
|
140
|
+
meta = cls(context=deepcopy(context))
|
|
141
|
+
meta._created_with_context = True
|
|
142
|
+
if branch:
|
|
143
|
+
meta.context.branch.name = branch.name
|
|
144
|
+
meta.context.branch.id = str(branch.get_uuid())
|
|
145
|
+
return meta
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class InfrahubEvent(BaseModel):
|
|
149
|
+
meta: EventMeta = Field(..., description="Metadata for the event")
|
|
150
|
+
|
|
151
|
+
def get_id(self) -> str:
|
|
152
|
+
return self.meta.get_id()
|
|
153
|
+
|
|
154
|
+
def get_event_namespace(self) -> str:
|
|
155
|
+
return EVENT_NAMESPACE
|
|
156
|
+
|
|
157
|
+
def get_name(self) -> str:
|
|
158
|
+
# Convince linters that @computed_field is a property and not a method...
|
|
159
|
+
return cast(str, self.event_name)
|
|
160
|
+
|
|
161
|
+
def get_resource(self) -> dict[str, str]:
|
|
162
|
+
raise NotImplementedError
|
|
163
|
+
|
|
164
|
+
def get_messages(self) -> list[InfrahubMessage]:
|
|
165
|
+
raise NotImplementedError
|
|
166
|
+
|
|
167
|
+
def get_related(self) -> list[dict[str, str]]:
|
|
168
|
+
if not self.meta:
|
|
169
|
+
return []
|
|
170
|
+
return self.meta.get_related()
|
|
171
|
+
|
|
65
172
|
def get_payload(self) -> dict[str, Any]:
|
|
173
|
+
"""The purpose if this method is to allow subclasses to define their own payload.
|
|
174
|
+
|
|
175
|
+
It should not be used to get the complete payload instead .get_event_payload() should
|
|
176
|
+
be used for that as it will always contain the 'context' key regardless of changes
|
|
177
|
+
in child classes
|
|
178
|
+
"""
|
|
66
179
|
return {}
|
|
67
180
|
|
|
181
|
+
@final
|
|
182
|
+
def get_event_payload(self) -> dict[str, Any]:
|
|
183
|
+
"""This method should be used when emitting the event to the event broker"""
|
|
184
|
+
event_payload = self.get_payload()
|
|
185
|
+
event_payload["context"] = self.meta.context.model_dump(mode="json")
|
|
186
|
+
return event_payload
|
|
187
|
+
|
|
68
188
|
def get_message_meta(self) -> Meta:
|
|
69
189
|
meta = Meta()
|
|
70
|
-
if not self.meta:
|
|
71
|
-
return meta
|
|
72
190
|
|
|
73
|
-
|
|
74
|
-
meta.initiator_id = self.meta.initiator_id
|
|
191
|
+
meta.initiator_id = self.meta.initiator_id
|
|
75
192
|
if self.meta.request_id:
|
|
76
193
|
meta.initiator_id = self.meta.request_id
|
|
77
194
|
|
|
78
195
|
return meta
|
|
79
196
|
|
|
197
|
+
@computed_field
|
|
198
|
+
def event_name(self) -> str:
|
|
199
|
+
raise NotImplementedError("The event name has not been defined")
|
|
80
200
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
{
|
|
88
|
-
"prefect.resource.id": "infrahub.branch",
|
|
89
|
-
"prefect.resource.name": self.branch,
|
|
90
|
-
"prefect.resource.role": "branch",
|
|
91
|
-
}
|
|
92
|
-
)
|
|
93
|
-
return related
|
|
201
|
+
@model_validator(mode="after")
|
|
202
|
+
def update_context(self) -> Self:
|
|
203
|
+
"""Update the context object using this event provided that the meta data was created with a context."""
|
|
204
|
+
if self.meta._created_with_context:
|
|
205
|
+
self.meta.context.set_event(self.get_name(), id=self.get_id())
|
|
206
|
+
return self
|
infrahub/events/node_action.py
CHANGED
|
@@ -1,24 +1,73 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
|
|
3
|
-
from pydantic import Field
|
|
3
|
+
from pydantic import Field, computed_field
|
|
4
4
|
|
|
5
|
+
from infrahub.core.changelog.models import NodeChangelog
|
|
5
6
|
from infrahub.core.constants import MutationAction
|
|
6
7
|
from infrahub.message_bus import InfrahubMessage
|
|
7
8
|
|
|
8
|
-
from .
|
|
9
|
+
from .constants import EVENT_NAMESPACE
|
|
10
|
+
from .models import InfrahubEvent
|
|
9
11
|
|
|
10
12
|
|
|
11
|
-
class NodeMutatedEvent(
|
|
13
|
+
class NodeMutatedEvent(InfrahubEvent):
|
|
12
14
|
"""Event generated when a node has been mutated"""
|
|
13
15
|
|
|
14
16
|
kind: str = Field(..., description="The type of object modified")
|
|
15
17
|
node_id: str = Field(..., description="The ID of the mutated node")
|
|
16
18
|
action: MutationAction = Field(..., description="The action taken on the node")
|
|
17
|
-
data:
|
|
19
|
+
data: NodeChangelog = Field(..., description="Data on modified object")
|
|
18
20
|
fields: list[str] = Field(default_factory=list, description="Fields provided in the mutation")
|
|
19
21
|
|
|
20
|
-
def
|
|
21
|
-
|
|
22
|
+
def get_related(self) -> list[dict[str, str]]:
|
|
23
|
+
related = super().get_related()
|
|
24
|
+
for attribute in self.data.attributes.values():
|
|
25
|
+
related.append(
|
|
26
|
+
{
|
|
27
|
+
"prefect.resource.id": f"infrahub.node.{self.node_id}",
|
|
28
|
+
"prefect.resource.role": "infrahub.node.field_update",
|
|
29
|
+
"infrahub.attribute.name": attribute.name,
|
|
30
|
+
"infrahub.attribute.value": "NULL" if attribute.value is None else str(attribute.value),
|
|
31
|
+
"infrahub.attribute.kind": attribute.kind,
|
|
32
|
+
"infrahub.attribute.value_previous": "NULL"
|
|
33
|
+
if attribute.value_previous is None
|
|
34
|
+
else str(attribute.value_previous),
|
|
35
|
+
# Mypy doesn't understand that .value_update_status is a @computed_attribute
|
|
36
|
+
"infrahub.attribute.action": attribute.value_update_status.value, # type: ignore[attr-defined]
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
if self.data.parent:
|
|
40
|
+
related.append(
|
|
41
|
+
{
|
|
42
|
+
"prefect.resource.id": self.data.parent.node_id,
|
|
43
|
+
"prefect.resource.role": "infrahub.node.parent",
|
|
44
|
+
"infrahub.parent.kind": self.data.parent.node_kind,
|
|
45
|
+
"infrahub.parent.id": self.data.parent.node_id,
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
related.append(
|
|
50
|
+
{
|
|
51
|
+
"prefect.resource.id": self.node_id,
|
|
52
|
+
"prefect.resource.role": "infrahub.related.node",
|
|
53
|
+
"infrahub.node.kind": self.kind,
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
for related_node in self.data.get_related_nodes():
|
|
58
|
+
related.append(
|
|
59
|
+
{
|
|
60
|
+
"prefect.resource.id": related_node.node_id,
|
|
61
|
+
"prefect.resource.role": "infrahub.related.node",
|
|
62
|
+
"infrahub.node.kind": related_node.node_kind,
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
return related
|
|
67
|
+
|
|
68
|
+
@computed_field
|
|
69
|
+
def event_name(self) -> str:
|
|
70
|
+
return f"{EVENT_NAMESPACE}.node.{self.action.value}"
|
|
22
71
|
|
|
23
72
|
def get_resource(self) -> dict[str, str]:
|
|
24
73
|
return {
|
|
@@ -26,11 +75,12 @@ class NodeMutatedEvent(InfrahubBranchEvent):
|
|
|
26
75
|
"infrahub.node.kind": self.kind,
|
|
27
76
|
"infrahub.node.id": self.node_id,
|
|
28
77
|
"infrahub.node.action": self.action.value,
|
|
29
|
-
"infrahub.
|
|
78
|
+
"infrahub.node.root_id": self.data.root_node_id,
|
|
79
|
+
"infrahub.branch.name": self.meta.context.branch.name,
|
|
30
80
|
}
|
|
31
81
|
|
|
32
82
|
def get_payload(self) -> dict[str, Any]:
|
|
33
|
-
return {"data": self.data, "fields": self.fields}
|
|
83
|
+
return {"data": self.data.model_dump(), "fields": self.fields}
|
|
34
84
|
|
|
35
85
|
def get_messages(self) -> list[InfrahubMessage]:
|
|
36
86
|
return [
|
|
@@ -43,3 +93,15 @@ class NodeMutatedEvent(InfrahubBranchEvent):
|
|
|
43
93
|
# meta=self.get_message_meta(),
|
|
44
94
|
# )
|
|
45
95
|
]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class NodeCreatedEvent(NodeMutatedEvent):
|
|
99
|
+
action: MutationAction = MutationAction.CREATED
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class NodeUpdatedEvent(NodeMutatedEvent):
|
|
103
|
+
action: MutationAction = MutationAction.UPDATED
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class NodeDeletedEvent(NodeMutatedEvent):
|
|
107
|
+
action: MutationAction = MutationAction.DELETED
|
|
@@ -1,33 +1,29 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
|
|
3
|
-
from pydantic import Field
|
|
3
|
+
from pydantic import Field, computed_field
|
|
4
4
|
|
|
5
5
|
from infrahub.message_bus import InfrahubMessage
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from .constants import EVENT_NAMESPACE
|
|
8
|
+
from .models import InfrahubEvent
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
class CommitUpdatedEvent(
|
|
11
|
+
class CommitUpdatedEvent(InfrahubEvent):
|
|
11
12
|
"""Event generated when the the commit within a repository has been updated."""
|
|
12
13
|
|
|
13
14
|
commit: str = Field(..., description="The commit the repository was updated to")
|
|
14
15
|
repository_id: str = Field(..., description="The ID of the repository")
|
|
15
16
|
repository_name: str = Field(..., description="The name of the repository")
|
|
16
17
|
|
|
17
|
-
def get_name(self) -> str:
|
|
18
|
-
return f"{self.get_event_namespace()}.repository.update_commit"
|
|
19
|
-
|
|
20
18
|
def get_resource(self) -> dict[str, str]:
|
|
21
19
|
return {
|
|
22
20
|
"prefect.resource.id": f"infrahub.repository.{self.repository_id}",
|
|
23
|
-
"infrahub.branch.name": self.branch,
|
|
24
21
|
"infrahub.repository.name": self.repository_name,
|
|
25
22
|
"infrahub.repository.id": self.repository_id,
|
|
26
23
|
}
|
|
27
24
|
|
|
28
25
|
def get_payload(self) -> dict[str, Any]:
|
|
29
26
|
return {
|
|
30
|
-
"branch": self.branch,
|
|
31
27
|
"commit": self.commit,
|
|
32
28
|
"repository_id": self.repository_id,
|
|
33
29
|
"repository_name": self.repository_name,
|
|
@@ -35,3 +31,7 @@ class CommitUpdatedEvent(InfrahubBranchEvent):
|
|
|
35
31
|
|
|
36
32
|
def get_messages(self) -> list[InfrahubMessage]:
|
|
37
33
|
return []
|
|
34
|
+
|
|
35
|
+
@computed_field
|
|
36
|
+
def event_name(self) -> str:
|
|
37
|
+
return f"{EVENT_NAMESPACE}.repository.update_commit"
|
infrahub/events/schema_action.py
CHANGED
|
@@ -1,30 +1,39 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
|
|
3
|
-
from pydantic import Field
|
|
3
|
+
from pydantic import Field, computed_field
|
|
4
4
|
|
|
5
5
|
from infrahub.message_bus import InfrahubMessage
|
|
6
6
|
from infrahub.message_bus.messages.refresh_registry_branches import RefreshRegistryBranches
|
|
7
7
|
|
|
8
|
-
from .
|
|
8
|
+
from .constants import EVENT_NAMESPACE
|
|
9
|
+
from .models import InfrahubEvent
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
class SchemaUpdatedEvent(
|
|
12
|
+
class SchemaUpdatedEvent(InfrahubEvent):
|
|
12
13
|
"""Event generated when the schema within a branch has been updated."""
|
|
13
14
|
|
|
15
|
+
branch_name: str = Field(..., description="The name of the branch")
|
|
14
16
|
schema_hash: str = Field(..., description="Schema hash after the update")
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
# NOTE
|
|
19
|
+
# We could add to the payload
|
|
20
|
+
# - Hash before and after the change
|
|
21
|
+
# - List of nodes and generics that have been modified
|
|
22
|
+
# - Diff of the change
|
|
23
|
+
|
|
24
|
+
# NOTE 2
|
|
25
|
+
# Should schema_update be a branch event ?
|
|
26
|
+
# if feels like the main resource should be the branch
|
|
18
27
|
|
|
19
28
|
def get_resource(self) -> dict[str, str]:
|
|
20
29
|
return {
|
|
21
|
-
"prefect.resource.id": f"infrahub.schema_branch.{self.
|
|
22
|
-
"infrahub.branch.name": self.
|
|
30
|
+
"prefect.resource.id": f"infrahub.schema_branch.{self.branch_name}",
|
|
31
|
+
"infrahub.branch.name": self.branch_name,
|
|
23
32
|
"infrahub.branch.schema_hash": self.schema_hash,
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
def get_payload(self) -> dict[str, Any]:
|
|
27
|
-
return {"branch": self.
|
|
36
|
+
return {"branch": self.branch_name, "schema_hash": self.schema_hash}
|
|
28
37
|
|
|
29
38
|
def get_messages(self) -> list[InfrahubMessage]:
|
|
30
39
|
return [
|
|
@@ -34,3 +43,7 @@ class SchemaUpdatedEvent(InfrahubBranchEvent):
|
|
|
34
43
|
# meta=self.get_message_meta(),
|
|
35
44
|
# )
|
|
36
45
|
]
|
|
46
|
+
|
|
47
|
+
@computed_field
|
|
48
|
+
def event_name(self) -> str:
|
|
49
|
+
return f"{EVENT_NAMESPACE}.schema.update"
|
infrahub/exceptions.py
CHANGED
|
@@ -49,6 +49,15 @@ class DatabaseError(Error):
|
|
|
49
49
|
super().__init__(self.message)
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
class ServiceUnavailableError(Error):
|
|
53
|
+
HTTP_CODE: int = 503
|
|
54
|
+
DESCRIPTION = "Service unavailable"
|
|
55
|
+
|
|
56
|
+
def __init__(self, message: str) -> None:
|
|
57
|
+
self.message = message
|
|
58
|
+
super().__init__(self.message)
|
|
59
|
+
|
|
60
|
+
|
|
52
61
|
class LockError(Error):
|
|
53
62
|
pass
|
|
54
63
|
|
infrahub/generators/models.py
CHANGED
|
@@ -30,6 +30,7 @@ class RequestGeneratorDefinitionRun(BaseModel):
|
|
|
30
30
|
|
|
31
31
|
generator_definition: ProposedChangeGeneratorDefinition = Field(..., description="The Generator Definition")
|
|
32
32
|
branch: str = Field(..., description="The branch to target")
|
|
33
|
+
target_members: list[str] = Field(default_factory=list, description="List of targets to run the generator for")
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
class ProposedChangeGeneratorDefinition(BaseModel):
|