infrahub-server 1.1.9__py3-none-any.whl → 1.2.0__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 +14 -6
- infrahub/api/diff/validation_models.py +7 -7
- infrahub/api/oauth2.py +0 -1
- infrahub/api/oidc.py +0 -1
- infrahub/api/query.py +18 -7
- infrahub/api/schema.py +33 -7
- infrahub/api/transformation.py +12 -5
- infrahub/{message_bus/messages/check_artifact_create.py → artifacts/models.py} +6 -6
- infrahub/{message_bus/operations/check/artifact.py → artifacts/tasks.py} +27 -28
- infrahub/cli/__init__.py +12 -10
- infrahub/cli/constants.py +3 -0
- infrahub/cli/db.py +166 -185
- infrahub/cli/events.py +8 -3
- infrahub/cli/git_agent.py +9 -7
- infrahub/cli/tasks.py +4 -6
- infrahub/cli/upgrade.py +146 -0
- infrahub/computed_attribute/gather.py +174 -0
- infrahub/computed_attribute/models.py +202 -11
- infrahub/computed_attribute/tasks.py +103 -421
- infrahub/computed_attribute/triggers.py +56 -0
- infrahub/config.py +33 -33
- infrahub/context.py +53 -0
- infrahub/core/account.py +9 -12
- infrahub/core/attribute.py +104 -75
- infrahub/core/branch/models.py +4 -4
- infrahub/core/branch/tasks.py +133 -125
- infrahub/core/changelog/__init__.py +0 -0
- infrahub/core/changelog/diff.py +291 -0
- infrahub/core/changelog/models.py +662 -0
- infrahub/core/constants/__init__.py +47 -2
- infrahub/core/constants/infrahubkind.py +3 -0
- infrahub/core/constants/schema.py +2 -0
- infrahub/core/constraint/node/runner.py +2 -2
- infrahub/core/diff/branch_differ.py +10 -10
- infrahub/core/diff/combiner.py +1 -1
- infrahub/core/diff/enricher/cardinality_one.py +1 -1
- infrahub/core/diff/enricher/hierarchy.py +5 -3
- infrahub/core/diff/enricher/labels.py +1 -1
- infrahub/core/diff/enricher/path_identifier.py +1 -2
- infrahub/core/diff/enricher/summary_counts.py +107 -0
- infrahub/core/diff/ipam_diff_parser.py +4 -5
- infrahub/core/diff/merger/merger.py +3 -1
- infrahub/core/diff/model/diff.py +27 -27
- infrahub/core/diff/model/path.py +13 -13
- infrahub/core/diff/query/all_conflicts.py +1 -1
- infrahub/core/diff/query/artifact.py +1 -1
- infrahub/core/diff/query/delete_query.py +1 -1
- infrahub/core/diff/query/diff_get.py +1 -1
- infrahub/core/diff/query/diff_summary.py +1 -1
- infrahub/core/diff/query/field_specifiers.py +1 -1
- infrahub/core/diff/query/field_summary.py +1 -1
- infrahub/core/diff/query/filters.py +2 -2
- infrahub/core/diff/query/get_conflict_query.py +1 -1
- infrahub/core/diff/query/has_conflicts_query.py +1 -1
- infrahub/core/diff/query/merge.py +3 -3
- infrahub/core/diff/query/merge_tracking_id.py +1 -1
- infrahub/core/diff/query/roots_metadata.py +1 -1
- infrahub/core/diff/query/save.py +3 -3
- infrahub/core/diff/query/summary_counts_enricher.py +2 -2
- infrahub/core/diff/query/time_range_query.py +1 -1
- infrahub/core/diff/query/update_conflict_query.py +1 -1
- infrahub/core/diff/query_parser.py +4 -4
- infrahub/core/diff/repository/deserializer.py +1 -1
- infrahub/core/diff/tasks.py +9 -8
- infrahub/core/enums.py +1 -1
- infrahub/core/initialization.py +1 -10
- infrahub/core/integrity/object_conflict/conflict_recorder.py +1 -1
- infrahub/core/ipam/constants.py +3 -4
- infrahub/core/ipam/reconciler.py +13 -13
- infrahub/core/ipam/tasks.py +2 -3
- infrahub/core/ipam/utilization.py +10 -13
- infrahub/core/manager.py +52 -47
- infrahub/core/merge.py +12 -9
- infrahub/core/migrations/__init__.py +1 -3
- infrahub/core/migrations/graph/__init__.py +5 -3
- 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 +2 -6
- infrahub/core/migrations/graph/m018_uniqueness_nulls.py +3 -3
- infrahub/core/migrations/graph/m019_restore_rels_to_time.py +4 -4
- infrahub/core/migrations/graph/m020_duplicate_edges.py +3 -3
- infrahub/core/migrations/graph/m021_missing_hierarchy_merge.py +2 -2
- infrahub/core/migrations/graph/m022_add_generate_template_attr.py +48 -0
- infrahub/core/migrations/query/attribute_add.py +3 -3
- 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 +3 -3
- infrahub/core/migrations/schema/models.py +19 -4
- 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 +7 -7
- infrahub/core/migrations/shared.py +10 -12
- infrahub/core/models.py +13 -14
- infrahub/core/node/__init__.py +172 -57
- infrahub/core/node/base.py +3 -5
- infrahub/core/node/constraints/attribute_uniqueness.py +2 -2
- infrahub/core/node/constraints/grouped_uniqueness.py +5 -5
- infrahub/core/node/constraints/interface.py +1 -2
- infrahub/core/node/delete_validator.py +7 -9
- infrahub/core/node/ipam.py +10 -10
- infrahub/core/node/permissions.py +7 -7
- infrahub/core/node/resource_manager/ip_address_pool.py +6 -6
- infrahub/core/node/resource_manager/ip_prefix_pool.py +14 -11
- infrahub/core/node/resource_manager/number_pool.py +3 -3
- infrahub/core/node/standard.py +3 -5
- infrahub/core/path.py +12 -12
- infrahub/core/property.py +12 -12
- infrahub/core/protocols.py +11 -0
- infrahub/core/protocols_base.py +25 -23
- infrahub/core/query/__init__.py +35 -38
- infrahub/core/query/attribute.py +13 -13
- infrahub/core/query/branch.py +5 -5
- infrahub/core/query/delete.py +1 -1
- infrahub/core/query/diff.py +7 -7
- infrahub/core/query/ipam.py +4 -4
- infrahub/core/query/node.py +23 -24
- infrahub/core/query/relationship.py +143 -46
- infrahub/core/query/resource_manager.py +10 -10
- infrahub/core/query/standard_node.py +9 -9
- infrahub/core/query/subquery.py +9 -9
- 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 +13 -17
- infrahub/core/relationship/constraints/count.py +4 -5
- infrahub/core/relationship/constraints/peer_kind.py +4 -5
- infrahub/core/relationship/constraints/profiles_kind.py +2 -2
- infrahub/core/relationship/model.py +103 -67
- infrahub/core/schema/__init__.py +6 -4
- infrahub/core/schema/attribute_schema.py +16 -8
- infrahub/core/schema/basenode_schema.py +38 -26
- infrahub/core/schema/computed_attribute.py +3 -3
- infrahub/core/schema/definitions/core/__init__.py +147 -0
- infrahub/core/schema/definitions/core/account.py +171 -0
- infrahub/core/schema/definitions/core/artifact.py +136 -0
- infrahub/core/schema/definitions/core/builtin.py +24 -0
- infrahub/core/schema/definitions/core/check.py +68 -0
- infrahub/core/schema/definitions/core/core.py +17 -0
- infrahub/core/schema/definitions/core/generator.py +100 -0
- infrahub/core/schema/definitions/core/graphql_query.py +79 -0
- infrahub/core/schema/definitions/core/group.py +108 -0
- infrahub/core/schema/definitions/core/ipam.py +193 -0
- infrahub/core/schema/definitions/core/lineage.py +19 -0
- infrahub/core/schema/definitions/core/menu.py +48 -0
- infrahub/core/schema/definitions/core/permission.py +163 -0
- infrahub/core/schema/definitions/core/profile.py +18 -0
- infrahub/core/schema/definitions/core/propose_change.py +97 -0
- infrahub/core/schema/definitions/core/propose_change_comment.py +193 -0
- infrahub/core/schema/definitions/core/propose_change_validator.py +328 -0
- infrahub/core/schema/definitions/core/repository.py +286 -0
- infrahub/core/schema/definitions/core/resource_pool.py +170 -0
- infrahub/core/schema/definitions/core/template.py +27 -0
- infrahub/core/schema/definitions/core/transform.py +96 -0
- infrahub/core/schema/definitions/core/webhook.py +134 -0
- infrahub/core/schema/definitions/internal.py +32 -16
- infrahub/core/schema/dropdown.py +3 -4
- infrahub/core/schema/generated/attribute_schema.py +15 -18
- infrahub/core/schema/generated/base_node_schema.py +12 -14
- infrahub/core/schema/generated/genericnode_schema.py +5 -0
- infrahub/core/schema/generated/node_schema.py +8 -5
- infrahub/core/schema/generated/relationship_schema.py +9 -11
- infrahub/core/schema/generic_schema.py +6 -2
- infrahub/core/schema/manager.py +46 -43
- infrahub/core/schema/node_schema.py +6 -2
- infrahub/core/schema/profile_schema.py +4 -0
- infrahub/core/schema/relationship_schema.py +15 -7
- infrahub/core/schema/schema_branch.py +423 -89
- infrahub/core/schema/schema_branch_computed.py +41 -4
- infrahub/core/schema/template_schema.py +36 -0
- infrahub/core/task/task.py +3 -3
- infrahub/core/task/user_task.py +21 -19
- infrahub/core/timestamp.py +3 -3
- infrahub/core/utils.py +12 -12
- infrahub/core/validators/__init__.py +1 -3
- infrahub/core/validators/aggregated_checker.py +2 -2
- infrahub/core/validators/attribute/choices.py +3 -3
- infrahub/core/validators/attribute/enum.py +3 -3
- infrahub/core/validators/attribute/kind.py +3 -3
- infrahub/core/validators/attribute/length.py +3 -3
- infrahub/core/validators/attribute/optional.py +3 -3
- infrahub/core/validators/attribute/regex.py +3 -3
- infrahub/core/validators/attribute/unique.py +3 -3
- infrahub/core/validators/checks_runner.py +60 -0
- infrahub/core/validators/determiner.py +1 -3
- infrahub/core/validators/model.py +1 -3
- infrahub/core/validators/models/validate_migration.py +17 -4
- infrahub/core/validators/node/attribute.py +2 -2
- infrahub/core/validators/node/generate_profile.py +3 -3
- infrahub/core/validators/node/hierarchy.py +3 -3
- infrahub/core/validators/node/inherit_from.py +2 -2
- infrahub/core/validators/node/relationship.py +2 -2
- infrahub/core/validators/query.py +1 -1
- infrahub/core/validators/relationship/count.py +5 -5
- infrahub/core/validators/relationship/optional.py +3 -3
- infrahub/core/validators/relationship/peer.py +3 -3
- infrahub/core/validators/shared.py +2 -2
- infrahub/core/validators/tasks.py +8 -6
- infrahub/core/validators/uniqueness/checker.py +5 -6
- infrahub/core/validators/uniqueness/index.py +2 -2
- infrahub/core/validators/uniqueness/model.py +11 -11
- infrahub/core/validators/uniqueness/query.py +1 -1
- infrahub/database/__init__.py +19 -23
- infrahub/database/memgraph.py +1 -1
- infrahub/dependencies/builder/diff/combiner.py +1 -1
- infrahub/dependencies/builder/diff/conflicts_enricher.py +1 -1
- infrahub/dependencies/builder/diff/deserializer.py +1 -1
- infrahub/dependencies/builder/diff/enricher/summary_counts.py +8 -0
- infrahub/dependencies/builder/diff/parent_node_adder.py +1 -1
- infrahub/dependencies/component/registry.py +2 -2
- infrahub/events/__init__.py +25 -2
- infrahub/events/artifact_action.py +64 -0
- infrahub/events/branch_action.py +57 -20
- infrahub/events/generator.py +71 -0
- infrahub/events/group_action.py +103 -0
- infrahub/events/models.py +160 -53
- infrahub/events/node_action.py +140 -23
- infrahub/events/repository_action.py +7 -20
- infrahub/events/schema_action.py +18 -10
- infrahub/events/utils.py +16 -0
- infrahub/events/validator_action.py +55 -0
- infrahub/exceptions.py +12 -3
- infrahub/generators/models.py +2 -3
- infrahub/generators/tasks.py +34 -15
- infrahub/git/base.py +10 -12
- infrahub/git/constants.py +0 -1
- infrahub/git/integrator.py +82 -57
- infrahub/git/models.py +101 -9
- infrahub/git/repository.py +9 -10
- infrahub/git/tasks.py +450 -112
- infrahub/git/utils.py +48 -0
- infrahub/git/worktree.py +1 -2
- infrahub/git_credential/askpass.py +1 -2
- infrahub/git_credential/helper.py +2 -3
- infrahub/graphql/analyzer.py +572 -11
- infrahub/graphql/app.py +47 -41
- 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 +39 -0
- infrahub/graphql/enums.py +1 -1
- infrahub/graphql/initialization.py +5 -1
- infrahub/graphql/loaders/node.py +1 -1
- infrahub/graphql/loaders/shared.py +1 -1
- infrahub/graphql/manager.py +75 -72
- infrahub/graphql/mutations/account.py +20 -13
- infrahub/graphql/mutations/artifact_definition.py +18 -14
- infrahub/graphql/mutations/branch.py +86 -40
- infrahub/graphql/mutations/computed_attribute.py +26 -18
- infrahub/graphql/mutations/diff.py +17 -8
- infrahub/graphql/mutations/diff_conflict.py +14 -8
- infrahub/graphql/mutations/generator.py +83 -0
- infrahub/graphql/mutations/graphql_query.py +21 -13
- infrahub/graphql/mutations/ipam.py +41 -39
- infrahub/graphql/mutations/main.py +226 -66
- infrahub/graphql/mutations/menu.py +12 -12
- infrahub/graphql/mutations/models.py +2 -4
- infrahub/graphql/mutations/node_getter/by_default_filter.py +1 -3
- infrahub/graphql/mutations/node_getter/by_hfid.py +1 -3
- infrahub/graphql/mutations/node_getter/by_id.py +1 -3
- infrahub/graphql/mutations/node_getter/interface.py +1 -2
- infrahub/graphql/mutations/proposed_change.py +39 -31
- infrahub/graphql/mutations/relationship.py +372 -129
- infrahub/graphql/mutations/repository.py +46 -40
- infrahub/graphql/mutations/resource_manager.py +26 -26
- infrahub/graphql/mutations/schema.py +70 -37
- infrahub/graphql/mutations/tasks.py +10 -7
- infrahub/graphql/mutations/webhook.py +137 -0
- infrahub/graphql/parser.py +5 -5
- 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 +67 -56
- infrahub/graphql/queries/event.py +115 -0
- infrahub/graphql/queries/internal.py +3 -3
- infrahub/graphql/queries/ipam.py +25 -20
- infrahub/graphql/queries/relationship.py +13 -12
- infrahub/graphql/queries/resource_manager.py +37 -25
- infrahub/graphql/queries/search.py +11 -10
- infrahub/graphql/queries/status.py +12 -9
- infrahub/graphql/queries/task.py +11 -9
- infrahub/graphql/resolvers/many_relationship.py +15 -15
- infrahub/graphql/resolvers/resolver.py +58 -37
- 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 +167 -0
- infrahub/graphql/types/interface.py +2 -2
- infrahub/graphql/types/node.py +5 -5
- 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 +30 -184
- infrahub/groups/ancestors.py +29 -0
- infrahub/groups/parsers.py +107 -0
- infrahub/groups/tasks.py +2 -3
- infrahub/lock.py +21 -21
- infrahub/menu/generator.py +7 -8
- infrahub/menu/menu.py +107 -139
- infrahub/menu/models.py +121 -20
- infrahub/menu/repository.py +111 -0
- infrahub/menu/utils.py +5 -8
- infrahub/message_bus/__init__.py +11 -13
- infrahub/message_bus/messages/__init__.py +1 -25
- infrahub/message_bus/messages/check_generator_run.py +3 -3
- infrahub/message_bus/messages/event_branch_merge.py +3 -0
- infrahub/message_bus/messages/finalize_validator_execution.py +3 -0
- infrahub/message_bus/messages/proposed_change/request_proposedchange_refreshartifacts.py +6 -0
- infrahub/message_bus/messages/request_generatordefinition_check.py +2 -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 -15
- infrahub/message_bus/operations/check/__init__.py +2 -2
- infrahub/message_bus/operations/check/generator.py +2 -3
- infrahub/message_bus/operations/event/__init__.py +2 -2
- infrahub/message_bus/operations/event/branch.py +7 -3
- infrahub/message_bus/operations/event/worker.py +0 -3
- infrahub/message_bus/operations/finalize/validator.py +52 -2
- 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 +22 -24
- infrahub/message_bus/operations/requests/proposed_change.py +39 -20
- infrahub/message_bus/operations/send/echo.py +1 -1
- infrahub/message_bus/types.py +1 -1
- infrahub/permissions/globals.py +15 -0
- infrahub/pools/number.py +2 -4
- 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 +204 -53
- infrahub/pytest_plugin.py +13 -10
- 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 +11 -19
- 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 +275 -0
- infrahub/task_manager/models.py +147 -3
- infrahub/task_manager/task.py +1 -1
- infrahub/tasks/artifact.py +20 -21
- infrahub/tasks/registry.py +1 -1
- infrahub/telemetry/__init__.py +0 -0
- infrahub/telemetry/constants.py +9 -0
- infrahub/telemetry/database.py +86 -0
- infrahub/telemetry/models.py +65 -0
- infrahub/telemetry/task_manager.py +77 -0
- infrahub/telemetry/tasks.py +119 -0
- infrahub/telemetry/utils.py +11 -0
- infrahub/transformations/tasks.py +5 -7
- infrahub/trigger/__init__.py +0 -0
- infrahub/trigger/catalogue.py +13 -0
- infrahub/trigger/constants.py +1 -0
- infrahub/trigger/models.py +118 -0
- infrahub/trigger/setup.py +90 -0
- infrahub/trigger/tasks.py +36 -0
- infrahub/types.py +1 -1
- infrahub/utils.py +12 -2
- infrahub/validators/__init__.py +0 -0
- infrahub/validators/events.py +42 -0
- infrahub/validators/tasks.py +41 -0
- infrahub/webhook/gather.py +17 -0
- infrahub/webhook/models.py +180 -42
- infrahub/webhook/tasks.py +149 -203
- infrahub/webhook/triggers.py +44 -0
- infrahub/workers/infrahub_async.py +38 -27
- infrahub/workers/utils.py +63 -0
- infrahub/workflows/catalogue.py +98 -71
- infrahub/workflows/initialization.py +12 -8
- infrahub/workflows/models.py +29 -5
- infrahub/workflows/utils.py +11 -2
- infrahub_sdk/client.py +19 -0
- infrahub_sdk/context.py +13 -0
- infrahub_sdk/ctl/branch.py +3 -2
- infrahub_sdk/ctl/utils.py +0 -16
- infrahub_sdk/exceptions.py +6 -0
- infrahub_sdk/generator.py +3 -0
- infrahub_sdk/graphql.py +45 -13
- infrahub_sdk/node.py +66 -20
- infrahub_sdk/protocols.py +21 -8
- infrahub_sdk/protocols_base.py +32 -11
- infrahub_sdk/schema/__init__.py +14 -2
- infrahub_sdk/schema/main.py +7 -0
- infrahub_sdk/task/__init__.py +11 -0
- infrahub_sdk/task/constants.py +3 -0
- infrahub_sdk/task/exceptions.py +25 -0
- infrahub_sdk/task/manager.py +551 -0
- infrahub_sdk/task/models.py +74 -0
- infrahub_sdk/timestamp.py +142 -33
- infrahub_sdk/utils.py +29 -1
- {infrahub_server-1.1.9.dist-info → infrahub_server-1.2.0.dist-info}/METADATA +8 -6
- infrahub_server-1.2.0.dist-info/RECORD +746 -0
- infrahub_testcontainers/container.py +5 -6
- infrahub_testcontainers/docker-compose.test.yml +2 -2
- infrahub_testcontainers/helpers.py +5 -1
- infrahub/core/branch/constants.py +0 -2
- infrahub/core/schema/definitions/core.py +0 -2275
- 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/event_branch_create.py +0 -11
- infrahub/message_bus/messages/event_branch_delete.py +0 -11
- infrahub/message_bus/messages/event_branch_rebased.py +0 -9
- infrahub/message_bus/messages/event_node_mutated.py +0 -15
- infrahub/message_bus/messages/event_schema_update.py +0 -9
- 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/event/node.py +0 -20
- infrahub/message_bus/operations/event/schema.py +0 -17
- 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/tasks/telemetry.py +0 -127
- infrahub/webhook/constants.py +0 -3
- infrahub_server-1.1.9.dist-info/RECORD +0 -688
- /infrahub/{schema → artifacts}/__init__.py +0 -0
- {infrahub_server-1.1.9.dist-info → infrahub_server-1.2.0.dist-info}/LICENSE.txt +0 -0
- {infrahub_server-1.1.9.dist-info → infrahub_server-1.2.0.dist-info}/WHEEL +0 -0
- {infrahub_server-1.1.9.dist-info → infrahub_server-1.2.0.dist-info}/entry_points.txt +0 -0
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
from infrahub_sdk.uuidt import UUIDT
|
|
4
|
-
from prefect import flow
|
|
5
|
-
from prefect.logging import get_run_logger
|
|
6
|
-
|
|
7
|
-
from infrahub.core.constants import InfrahubKind, ValidatorConclusion, ValidatorState
|
|
8
|
-
from infrahub.core.timestamp import Timestamp
|
|
9
|
-
from infrahub.message_bus import InfrahubMessage, Meta, messages
|
|
10
|
-
from infrahub.message_bus.types import KVTTL
|
|
11
|
-
from infrahub.services import InfrahubServices
|
|
12
|
-
from infrahub.workflows.utils import add_tags
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@flow(
|
|
16
|
-
name="artifact-definition-check",
|
|
17
|
-
flow_run_name="Validating generation of artifacts for {message.artifact_definition.definition_name}",
|
|
18
|
-
)
|
|
19
|
-
async def check(message: messages.RequestArtifactDefinitionCheck, service: InfrahubServices) -> None:
|
|
20
|
-
events: list[InfrahubMessage] = []
|
|
21
|
-
await add_tags(branches=[message.source_branch], nodes=[message.proposed_change], db_change=True)
|
|
22
|
-
|
|
23
|
-
log = get_run_logger()
|
|
24
|
-
artifact_definition = await service.client.get(
|
|
25
|
-
kind=InfrahubKind.ARTIFACTDEFINITION,
|
|
26
|
-
id=message.artifact_definition.definition_id,
|
|
27
|
-
branch=message.source_branch,
|
|
28
|
-
)
|
|
29
|
-
proposed_change = await service.client.get(kind=InfrahubKind.PROPOSEDCHANGE, id=message.proposed_change)
|
|
30
|
-
|
|
31
|
-
validator_name = f"Artifact Validator: {message.artifact_definition.definition_name}"
|
|
32
|
-
validator_execution_id = str(UUIDT())
|
|
33
|
-
check_execution_ids: list[str] = []
|
|
34
|
-
|
|
35
|
-
await proposed_change.validations.fetch()
|
|
36
|
-
|
|
37
|
-
validator = None
|
|
38
|
-
for relationship in proposed_change.validations.peers:
|
|
39
|
-
existing_validator = relationship.peer
|
|
40
|
-
if (
|
|
41
|
-
existing_validator.typename == InfrahubKind.ARTIFACTVALIDATOR
|
|
42
|
-
and existing_validator.definition.id == message.artifact_definition.definition_id
|
|
43
|
-
):
|
|
44
|
-
validator = existing_validator
|
|
45
|
-
|
|
46
|
-
if validator:
|
|
47
|
-
validator.conclusion.value = ValidatorConclusion.UNKNOWN.value
|
|
48
|
-
validator.state.value = ValidatorState.QUEUED.value
|
|
49
|
-
validator.started_at.value = ""
|
|
50
|
-
validator.completed_at.value = ""
|
|
51
|
-
await validator.save()
|
|
52
|
-
else:
|
|
53
|
-
validator = await service.client.create(
|
|
54
|
-
kind=InfrahubKind.ARTIFACTVALIDATOR,
|
|
55
|
-
data={
|
|
56
|
-
"label": validator_name,
|
|
57
|
-
"proposed_change": message.proposed_change,
|
|
58
|
-
"definition": message.artifact_definition.definition_id,
|
|
59
|
-
},
|
|
60
|
-
)
|
|
61
|
-
await validator.save()
|
|
62
|
-
|
|
63
|
-
await artifact_definition.targets.fetch()
|
|
64
|
-
group = artifact_definition.targets.peer
|
|
65
|
-
await group.members.fetch()
|
|
66
|
-
|
|
67
|
-
existing_artifacts = await service.client.filters(
|
|
68
|
-
kind=InfrahubKind.ARTIFACT,
|
|
69
|
-
definition__ids=[message.artifact_definition.definition_id],
|
|
70
|
-
include=["object"],
|
|
71
|
-
branch=message.source_branch,
|
|
72
|
-
)
|
|
73
|
-
artifacts_by_member = {}
|
|
74
|
-
for artifact in existing_artifacts:
|
|
75
|
-
artifacts_by_member[artifact.object.peer.id] = artifact.id
|
|
76
|
-
|
|
77
|
-
repository = message.branch_diff.get_repository(repository_id=message.artifact_definition.repository_id)
|
|
78
|
-
requested_artifacts = 0
|
|
79
|
-
impacted_artifacts = message.branch_diff.get_subscribers_ids(kind=InfrahubKind.ARTIFACT)
|
|
80
|
-
for relationship in group.members.peers:
|
|
81
|
-
member = relationship.peer
|
|
82
|
-
artifact_id = artifacts_by_member.get(member.id)
|
|
83
|
-
if _render_artifact(
|
|
84
|
-
artifact_id=artifact_id,
|
|
85
|
-
managed_branch=message.source_branch_sync_with_git,
|
|
86
|
-
impacted_artifacts=impacted_artifacts,
|
|
87
|
-
):
|
|
88
|
-
check_execution_id = str(UUIDT())
|
|
89
|
-
check_execution_ids.append(check_execution_id)
|
|
90
|
-
requested_artifacts += 1
|
|
91
|
-
log.info(f"Trigger Artifact processing for {member.display_label}")
|
|
92
|
-
events.append(
|
|
93
|
-
messages.CheckArtifactCreate(
|
|
94
|
-
artifact_name=message.artifact_definition.artifact_name,
|
|
95
|
-
artifact_id=artifact_id,
|
|
96
|
-
artifact_definition=message.artifact_definition.definition_id,
|
|
97
|
-
commit=repository.source_commit,
|
|
98
|
-
content_type=message.artifact_definition.content_type,
|
|
99
|
-
transform_type=message.artifact_definition.transform_kind,
|
|
100
|
-
transform_location=message.artifact_definition.transform_location,
|
|
101
|
-
repository_id=repository.repository_id,
|
|
102
|
-
repository_name=repository.repository_name,
|
|
103
|
-
repository_kind=repository.kind,
|
|
104
|
-
branch_name=message.source_branch,
|
|
105
|
-
query=message.artifact_definition.query_name,
|
|
106
|
-
variables=member.extract(params=artifact_definition.parameters.value),
|
|
107
|
-
target_id=member.id,
|
|
108
|
-
target_name=member.display_label,
|
|
109
|
-
timeout=message.artifact_definition.timeout,
|
|
110
|
-
validator_id=validator.id,
|
|
111
|
-
meta=Meta(validator_execution_id=validator_execution_id, check_execution_id=check_execution_id),
|
|
112
|
-
)
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
checks_in_execution = ",".join(check_execution_ids)
|
|
116
|
-
await service.cache.set(
|
|
117
|
-
key=f"validator_execution_id:{validator_execution_id}:checks",
|
|
118
|
-
value=checks_in_execution,
|
|
119
|
-
expires=KVTTL.TWO_HOURS,
|
|
120
|
-
)
|
|
121
|
-
events.append(
|
|
122
|
-
messages.FinalizeValidatorExecution(
|
|
123
|
-
start_time=Timestamp().to_string(),
|
|
124
|
-
validator_id=validator.id,
|
|
125
|
-
validator_execution_id=validator_execution_id,
|
|
126
|
-
validator_type=InfrahubKind.ARTIFACTVALIDATOR,
|
|
127
|
-
)
|
|
128
|
-
)
|
|
129
|
-
for event in events:
|
|
130
|
-
event.assign_meta(parent=message)
|
|
131
|
-
await service.send(message=event)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def _render_artifact(artifact_id: Optional[str], managed_branch: bool, impacted_artifacts: list[str]) -> bool: # pylint: disable=unused-argument
|
|
135
|
-
"""Returns a boolean to indicate if an artifact should be generated or not.
|
|
136
|
-
Will return true if:
|
|
137
|
-
* The artifact_id wasn't set which could be that it's a new object that doesn't have a previous artifact
|
|
138
|
-
* The source brance is not data only which would indicate that it could contain updates in git to the transform
|
|
139
|
-
* The artifact_id exists in the impacted_artifacts list
|
|
140
|
-
Will return false if:
|
|
141
|
-
* The source branch is a data only branch and the artifact_id exists and is not in the impacted list
|
|
142
|
-
"""
|
|
143
|
-
|
|
144
|
-
# if not artifact_id or managed_branch:
|
|
145
|
-
# return True
|
|
146
|
-
# return artifact_id in impacted_artifacts
|
|
147
|
-
# Temporary workaround tracked in https://github.com/opsmill/infrahub/issues/4991
|
|
148
|
-
return True
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
from infrahub_sdk.uuidt import UUIDT
|
|
2
|
-
from prefect import flow
|
|
3
|
-
from prefect.logging import get_run_logger
|
|
4
|
-
|
|
5
|
-
from infrahub.core.constants import InfrahubKind
|
|
6
|
-
from infrahub.core.timestamp import Timestamp
|
|
7
|
-
from infrahub.message_bus import InfrahubMessage, messages
|
|
8
|
-
from infrahub.message_bus.types import KVTTL
|
|
9
|
-
from infrahub.services import InfrahubServices
|
|
10
|
-
from infrahub.workflows.utils import add_tags
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@flow(name="repository-check", flow_run_name="Running repository checks for repository {message.repository}")
|
|
14
|
-
async def checks(message: messages.RequestRepositoryChecks, service: InfrahubServices) -> None:
|
|
15
|
-
"""Request to start validation checks on a specific repository."""
|
|
16
|
-
await add_tags(branches=[message.source_branch], nodes=[message.proposed_change])
|
|
17
|
-
log = get_run_logger()
|
|
18
|
-
|
|
19
|
-
events: list[InfrahubMessage] = []
|
|
20
|
-
|
|
21
|
-
repository = await service.client.get(
|
|
22
|
-
kind=InfrahubKind.GENERICREPOSITORY, id=message.repository, branch=message.source_branch
|
|
23
|
-
)
|
|
24
|
-
proposed_change = await service.client.get(kind=InfrahubKind.PROPOSEDCHANGE, id=message.proposed_change)
|
|
25
|
-
|
|
26
|
-
validator_execution_id = str(UUIDT())
|
|
27
|
-
check_execution_ids: list[str] = []
|
|
28
|
-
await proposed_change.validations.fetch()
|
|
29
|
-
await repository.checks.fetch()
|
|
30
|
-
|
|
31
|
-
validator_name = f"Repository Validator: {repository.name.value}"
|
|
32
|
-
validator = None
|
|
33
|
-
for relationship in proposed_change.validations.peers:
|
|
34
|
-
existing_validator = relationship.peer
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
existing_validator.typename == InfrahubKind.REPOSITORYVALIDATOR
|
|
38
|
-
and existing_validator.repository.id == message.repository
|
|
39
|
-
):
|
|
40
|
-
validator = existing_validator
|
|
41
|
-
|
|
42
|
-
if validator:
|
|
43
|
-
validator.conclusion.value = "unknown"
|
|
44
|
-
validator.state.value = "queued"
|
|
45
|
-
validator.started_at.value = ""
|
|
46
|
-
validator.completed_at.value = ""
|
|
47
|
-
await validator.save()
|
|
48
|
-
else:
|
|
49
|
-
validator = await service.client.create(
|
|
50
|
-
kind=InfrahubKind.REPOSITORYVALIDATOR,
|
|
51
|
-
data={
|
|
52
|
-
"label": validator_name,
|
|
53
|
-
"proposed_change": message.proposed_change,
|
|
54
|
-
"repository": message.repository,
|
|
55
|
-
},
|
|
56
|
-
)
|
|
57
|
-
await validator.save()
|
|
58
|
-
|
|
59
|
-
check_execution_id = str(UUIDT())
|
|
60
|
-
check_execution_ids.append(check_execution_id)
|
|
61
|
-
log.info("Adding check for merge conflict")
|
|
62
|
-
|
|
63
|
-
events.append(
|
|
64
|
-
messages.CheckRepositoryMergeConflicts(
|
|
65
|
-
validator_id=validator.id,
|
|
66
|
-
validator_execution_id=validator_execution_id,
|
|
67
|
-
check_execution_id=check_execution_id,
|
|
68
|
-
proposed_change=message.proposed_change,
|
|
69
|
-
repository_id=message.repository,
|
|
70
|
-
repository_name=repository.name.value,
|
|
71
|
-
source_branch=message.source_branch,
|
|
72
|
-
target_branch=message.target_branch,
|
|
73
|
-
)
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
checks_in_execution = ",".join(check_execution_ids)
|
|
77
|
-
log.info(f"Checks in execution {checks_in_execution}")
|
|
78
|
-
await service.cache.set(
|
|
79
|
-
key=f"validator_execution_id:{validator_execution_id}:checks",
|
|
80
|
-
value=checks_in_execution,
|
|
81
|
-
expires=KVTTL.TWO_HOURS,
|
|
82
|
-
)
|
|
83
|
-
events.append(
|
|
84
|
-
messages.FinalizeValidatorExecution(
|
|
85
|
-
start_time=Timestamp().to_string(),
|
|
86
|
-
validator_id=validator.id,
|
|
87
|
-
validator_execution_id=validator_execution_id,
|
|
88
|
-
validator_type=InfrahubKind.REPOSITORYVALIDATOR,
|
|
89
|
-
)
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
for event in events:
|
|
93
|
-
event.assign_meta(parent=message)
|
|
94
|
-
await service.send(message=event)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
@flow(
|
|
98
|
-
name="repository-users-check",
|
|
99
|
-
flow_run_name="Evaluating user-defined checks on repository {message.repository_name}",
|
|
100
|
-
)
|
|
101
|
-
async def user_checks(message: messages.RequestRepositoryUserChecks, service: InfrahubServices) -> None:
|
|
102
|
-
"""Request to start validation checks on a specific repository for User-defined checks."""
|
|
103
|
-
|
|
104
|
-
await add_tags(branches=[message.source_branch], nodes=[message.proposed_change])
|
|
105
|
-
log = get_run_logger()
|
|
106
|
-
|
|
107
|
-
events: list[InfrahubMessage] = []
|
|
108
|
-
|
|
109
|
-
repository = await service.client.get(
|
|
110
|
-
kind=InfrahubKind.GENERICREPOSITORY, id=message.repository_id, branch=message.source_branch, fragment=True
|
|
111
|
-
)
|
|
112
|
-
await repository.checks.fetch()
|
|
113
|
-
|
|
114
|
-
for relationship in repository.checks.peers:
|
|
115
|
-
log.info("Adding check for user defined check")
|
|
116
|
-
check_definition = relationship.peer
|
|
117
|
-
events.append(
|
|
118
|
-
messages.CheckRepositoryCheckDefinition(
|
|
119
|
-
check_definition_id=check_definition.id,
|
|
120
|
-
repository_id=repository.id,
|
|
121
|
-
repository_name=repository.name.value,
|
|
122
|
-
commit=repository.commit.value,
|
|
123
|
-
file_path=check_definition.file_path.value,
|
|
124
|
-
class_name=check_definition.class_name.value,
|
|
125
|
-
branch_name=message.source_branch,
|
|
126
|
-
proposed_change=message.proposed_change,
|
|
127
|
-
branch_diff=message.branch_diff,
|
|
128
|
-
)
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
for event in events:
|
|
132
|
-
event.assign_meta(parent=message)
|
|
133
|
-
await service.send(message=event)
|
infrahub/schema/constants.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
AUTOMATION_NAME = "Trigger-schema-update-event"
|
infrahub/schema/tasks.py
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from datetime import timedelta
|
|
4
|
-
|
|
5
|
-
from prefect import flow
|
|
6
|
-
from prefect.automations import AutomationCore
|
|
7
|
-
from prefect.client.orchestration import get_client
|
|
8
|
-
from prefect.client.schemas.filters import DeploymentFilter, DeploymentFilterName
|
|
9
|
-
from prefect.events.actions import RunDeployment
|
|
10
|
-
from prefect.events.schemas.automations import EventTrigger, Posture
|
|
11
|
-
from prefect.logging import get_run_logger
|
|
12
|
-
|
|
13
|
-
from infrahub.workflows.catalogue import COMPUTED_ATTRIBUTE_SETUP, COMPUTED_ATTRIBUTE_SETUP_PYTHON
|
|
14
|
-
|
|
15
|
-
from .constants import AUTOMATION_NAME
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@flow(name="schema-updated-setup", flow_run_name="Setup schema updated event in task-manager")
|
|
19
|
-
async def schema_updated_setup() -> None:
|
|
20
|
-
log = get_run_logger()
|
|
21
|
-
|
|
22
|
-
async with get_client(sync_client=False) as client:
|
|
23
|
-
deployments = {
|
|
24
|
-
item.name: item
|
|
25
|
-
for item in await client.read_deployments(
|
|
26
|
-
deployment_filter=DeploymentFilter(
|
|
27
|
-
name=DeploymentFilterName(
|
|
28
|
-
any_=[COMPUTED_ATTRIBUTE_SETUP.name, COMPUTED_ATTRIBUTE_SETUP_PYTHON.name]
|
|
29
|
-
)
|
|
30
|
-
)
|
|
31
|
-
)
|
|
32
|
-
}
|
|
33
|
-
if COMPUTED_ATTRIBUTE_SETUP.name not in deployments:
|
|
34
|
-
raise ValueError("Unable to find the deployment for PROCESS_COMPUTED_MACRO")
|
|
35
|
-
|
|
36
|
-
deployment_id_computed_attribute_setup = deployments[COMPUTED_ATTRIBUTE_SETUP.name].id
|
|
37
|
-
deployment_id_computed_attribute_setup_python = deployments[COMPUTED_ATTRIBUTE_SETUP_PYTHON.name].id
|
|
38
|
-
|
|
39
|
-
schema_update_automation = await client.find_automation(id_or_name=AUTOMATION_NAME)
|
|
40
|
-
|
|
41
|
-
automation = AutomationCore(
|
|
42
|
-
name=AUTOMATION_NAME,
|
|
43
|
-
description="Trigger actions on schema update event",
|
|
44
|
-
enabled=True,
|
|
45
|
-
trigger=EventTrigger(
|
|
46
|
-
posture=Posture.Reactive,
|
|
47
|
-
expect={"infrahub.schema.update"},
|
|
48
|
-
within=timedelta(0),
|
|
49
|
-
threshold=1,
|
|
50
|
-
),
|
|
51
|
-
actions=[
|
|
52
|
-
RunDeployment(
|
|
53
|
-
source="selected",
|
|
54
|
-
deployment_id=deployment_id_computed_attribute_setup,
|
|
55
|
-
parameters={
|
|
56
|
-
"branch_name": "{{ event.resource['infrahub.branch.name'] }}",
|
|
57
|
-
},
|
|
58
|
-
job_variables={},
|
|
59
|
-
),
|
|
60
|
-
RunDeployment(
|
|
61
|
-
source="selected",
|
|
62
|
-
deployment_id=deployment_id_computed_attribute_setup_python,
|
|
63
|
-
parameters={
|
|
64
|
-
"branch_name": "{{ event.resource['infrahub.branch.name'] }}",
|
|
65
|
-
},
|
|
66
|
-
job_variables={},
|
|
67
|
-
),
|
|
68
|
-
],
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
if schema_update_automation:
|
|
72
|
-
await client.update_automation(automation_id=schema_update_automation.id, automation=automation)
|
|
73
|
-
log.info(f"{AUTOMATION_NAME} Updated")
|
|
74
|
-
else:
|
|
75
|
-
await client.create_automation(automation=automation)
|
|
76
|
-
log.info(f"{AUTOMATION_NAME} Created")
|
infrahub/tasks/telemetry.py
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import hashlib
|
|
2
|
-
import json
|
|
3
|
-
import platform
|
|
4
|
-
import time
|
|
5
|
-
from typing import Any
|
|
6
|
-
|
|
7
|
-
from prefect import flow, task
|
|
8
|
-
from prefect.cache_policies import NONE
|
|
9
|
-
from prefect.logging import get_run_logger
|
|
10
|
-
|
|
11
|
-
from infrahub import __version__, config
|
|
12
|
-
from infrahub.core import registry, utils
|
|
13
|
-
from infrahub.core.branch import Branch
|
|
14
|
-
from infrahub.core.constants import InfrahubKind
|
|
15
|
-
from infrahub.core.graph.schema import GRAPH_SCHEMA
|
|
16
|
-
from infrahub.services import InfrahubServices, services
|
|
17
|
-
|
|
18
|
-
TELEMETRY_KIND: str = "community"
|
|
19
|
-
TELEMETRY_VERSION: str = "20240524"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@task(name="telemetry-gather-db", task_run_name="Gather Database Information", cache_policy=NONE)
|
|
23
|
-
async def gather_database_information(service: InfrahubServices, branch: Branch) -> dict: # pylint: disable=unused-argument
|
|
24
|
-
async with service.database.start_session() as db:
|
|
25
|
-
data: dict[str, Any] = {
|
|
26
|
-
"database_type": db.db_type.value,
|
|
27
|
-
"relationship_count": {"total": await utils.count_relationships(db=db)},
|
|
28
|
-
"node_count": {"total": await utils.count_nodes(db=db)},
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
for name in GRAPH_SCHEMA["relationships"]:
|
|
32
|
-
data["relationship_count"][name] = await utils.count_relationships(db=db, label=name)
|
|
33
|
-
|
|
34
|
-
for name in GRAPH_SCHEMA["nodes"]:
|
|
35
|
-
data["node_count"][name] = await utils.count_nodes(db=db, label=name)
|
|
36
|
-
|
|
37
|
-
return data
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@task(name="telemetry-schema-information", task_run_name="Gather Schema Information", cache_policy=NONE)
|
|
41
|
-
async def gather_schema_information(service: InfrahubServices, branch: Branch) -> dict: # pylint: disable=unused-argument
|
|
42
|
-
data: dict[str, Any] = {}
|
|
43
|
-
main_schema = registry.schema.get_schema_branch(name=branch.name)
|
|
44
|
-
data["node_count"] = len(main_schema.node_names)
|
|
45
|
-
data["generic_count"] = len(main_schema.generic_names)
|
|
46
|
-
data["last_update"] = branch.schema_changed_at
|
|
47
|
-
|
|
48
|
-
return data
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
@task(name="telemetry-feature-information", task_run_name="Gather Feature Information", cache_policy=NONE)
|
|
52
|
-
async def gather_feature_information(service: InfrahubServices, branch: Branch) -> dict: # pylint: disable=unused-argument
|
|
53
|
-
async with service.database.start_session() as db:
|
|
54
|
-
data = {}
|
|
55
|
-
features_to_count = [
|
|
56
|
-
InfrahubKind.ARTIFACT,
|
|
57
|
-
InfrahubKind.RESOURCEPOOL,
|
|
58
|
-
InfrahubKind.REPOSITORY,
|
|
59
|
-
InfrahubKind.GENERICGROUP,
|
|
60
|
-
InfrahubKind.PROFILE,
|
|
61
|
-
InfrahubKind.PROPOSEDCHANGE,
|
|
62
|
-
InfrahubKind.TRANSFORM,
|
|
63
|
-
]
|
|
64
|
-
for kind in features_to_count:
|
|
65
|
-
data[kind] = await utils.count_nodes(db=db, label=kind)
|
|
66
|
-
|
|
67
|
-
return data
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
@task(name="telemetry-gather-data", task_run_name="Gather Anonynous Data", cache_policy=NONE)
|
|
71
|
-
async def gather_anonymous_telemetry_data(service: InfrahubServices) -> dict:
|
|
72
|
-
start_time = time.time()
|
|
73
|
-
|
|
74
|
-
default_branch = registry.get_branch_from_registry()
|
|
75
|
-
workers = await service.component.list_workers(branch=default_branch.name, schema_hash=False)
|
|
76
|
-
|
|
77
|
-
data: dict[str, Any] = {
|
|
78
|
-
"deployment_id": registry.id,
|
|
79
|
-
"execution_time": None,
|
|
80
|
-
"infrahub_version": __version__,
|
|
81
|
-
"python_version": platform.python_version(),
|
|
82
|
-
"platform": platform.machine(),
|
|
83
|
-
"workers": {
|
|
84
|
-
"total": len(workers),
|
|
85
|
-
"active": len([w for w in workers if w.active]),
|
|
86
|
-
},
|
|
87
|
-
"branches": {
|
|
88
|
-
"total": len(registry.branch),
|
|
89
|
-
},
|
|
90
|
-
"features": await gather_feature_information(service=service, branch=default_branch),
|
|
91
|
-
"schema": await gather_schema_information(service=service, branch=default_branch),
|
|
92
|
-
"database": await gather_database_information(service=service, branch=default_branch),
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
data["execution_time"] = time.time() - start_time
|
|
96
|
-
|
|
97
|
-
return data
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
@task(name="telemetry-post-data", task_run_name="Upload data", retries=5, cache_policy=NONE)
|
|
101
|
-
async def post_telemetry_data(service: InfrahubServices, url: str, payload: dict[str, Any]) -> None:
|
|
102
|
-
"""Send the telemetry data to the specified URL, using HTTP POST."""
|
|
103
|
-
response = await service.http.post(url=url, json=payload)
|
|
104
|
-
response.raise_for_status()
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
@flow(name="anonymous_telemetry_send", flow_run_name="Send anonymous telemetry")
|
|
108
|
-
async def send_telemetry_push() -> None:
|
|
109
|
-
service = services.service
|
|
110
|
-
log = get_run_logger()
|
|
111
|
-
if config.SETTINGS.main.telemetry_optout:
|
|
112
|
-
log.info("Skipping, User opted out of this service.")
|
|
113
|
-
return
|
|
114
|
-
|
|
115
|
-
log.info(f"Pushing anonymous telemetry data to {config.SETTINGS.main.telemetry_endpoint}...")
|
|
116
|
-
|
|
117
|
-
data = await gather_anonymous_telemetry_data(service=service)
|
|
118
|
-
log.info(f"Anonymous usage telemetry gathered in {data['execution_time']} seconds. | {data}")
|
|
119
|
-
|
|
120
|
-
payload = {
|
|
121
|
-
"kind": TELEMETRY_KIND,
|
|
122
|
-
"payload_format": TELEMETRY_VERSION,
|
|
123
|
-
"data": data,
|
|
124
|
-
"checksum": hashlib.sha256(json.dumps(data).encode()).hexdigest(),
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
await post_telemetry_data(service=service, url=config.SETTINGS.main.telemetry_endpoint, payload=payload)
|
infrahub/webhook/constants.py
DELETED