infrahub-server 1.1.7__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 +50 -21
- infrahub/core/branch/models.py +4 -4
- infrahub/core/branch/tasks.py +130 -125
- 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 +1 -1
- infrahub/core/diff/enricher/cardinality_one.py +6 -1
- infrahub/core/diff/enricher/hierarchy.py +22 -7
- infrahub/core/diff/enricher/labels.py +6 -1
- infrahub/core/diff/enricher/path_identifier.py +5 -1
- infrahub/core/diff/enricher/summary_counts.py +107 -0
- infrahub/core/diff/merger/merger.py +3 -1
- infrahub/core/diff/model/path.py +34 -11
- infrahub/core/diff/parent_node_adder.py +78 -0
- infrahub/core/diff/payload_builder.py +13 -2
- 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 +191 -185
- infrahub/core/diff/query/summary_counts_enricher.py +52 -5
- infrahub/core/diff/query/time_range_query.py +1 -1
- infrahub/core/diff/query/update_conflict_query.py +1 -1
- infrahub/core/diff/repository/deserializer.py +9 -4
- infrahub/core/diff/repository/repository.py +156 -38
- 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 +164 -45
- infrahub/core/node/base.py +1 -1
- infrahub/core/node/delete_validator.py +4 -4
- infrahub/core/node/ipam.py +7 -7
- 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 +4 -4
- infrahub/core/query/ipam.py +4 -4
- infrahub/core/query/node.py +11 -12
- infrahub/core/query/relationship.py +211 -25
- infrahub/core/query/resource_manager.py +10 -10
- 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 +2 -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 +1 -1
- infrahub/database/__init__.py +3 -2
- 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 +4 -2
- infrahub/dependencies/builder/diff/enricher/hierarchy.py +3 -1
- infrahub/dependencies/builder/diff/enricher/summary_counts.py +8 -0
- 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 -15
- infrahub/graphql/mutations/diff.py +33 -17
- 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 +233 -45
- infrahub/graphql/mutations/menu.py +10 -10
- infrahub/graphql/mutations/proposed_change.py +36 -28
- infrahub/graphql/mutations/relationship.py +341 -130
- 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 +10 -7
- 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 +37 -25
- 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/globals.py +15 -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/batch.py +2 -2
- infrahub_sdk/client.py +8 -0
- infrahub_sdk/config.py +1 -1
- infrahub_sdk/ctl/branch.py +3 -2
- infrahub_sdk/ctl/check.py +4 -4
- 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 +6 -21
- infrahub_sdk/ctl/validate.py +2 -1
- infrahub_sdk/data.py +1 -1
- infrahub_sdk/exceptions.py +12 -0
- infrahub_sdk/generator.py +3 -0
- infrahub_sdk/node.py +5 -8
- infrahub_sdk/protocols.py +20 -8
- infrahub_sdk/schema/__init__.py +14 -5
- 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/testing/docker.py +30 -0
- infrahub_sdk/timestamp.py +134 -33
- infrahub_sdk/transfer/exporter/json.py +1 -1
- infrahub_sdk/utils.py +39 -1
- infrahub_sdk/yaml.py +2 -3
- {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/METADATA +7 -6
- {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/RECORD +383 -339
- infrahub_testcontainers/container.py +2 -3
- infrahub_testcontainers/docker-compose.test.yml +2 -2
- 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/{schema → artifacts}/__init__.py +0 -0
- {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/LICENSE.txt +0 -0
- {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/WHEEL +0 -0
- {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/entry_points.txt +0 -0
infrahub_sdk/ctl/repository.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
|
+
from typing import Optional
|
|
4
5
|
|
|
5
6
|
import typer
|
|
6
7
|
import yaml
|
|
@@ -8,15 +9,14 @@ from pydantic import ValidationError
|
|
|
8
9
|
from rich.console import Console
|
|
9
10
|
from rich.table import Table
|
|
10
11
|
|
|
11
|
-
from infrahub_sdk.ctl.client import initialize_client
|
|
12
|
-
|
|
13
12
|
from ..async_typer import AsyncTyper
|
|
14
|
-
from ..
|
|
15
|
-
from ..ctl.utils import init_logging
|
|
13
|
+
from ..exceptions import FileNotValidError
|
|
16
14
|
from ..graphql import Mutation, Query
|
|
17
15
|
from ..schema.repository import InfrahubRepositoryConfig
|
|
18
|
-
from
|
|
16
|
+
from ..utils import read_file
|
|
17
|
+
from .client import initialize_client
|
|
19
18
|
from .parameters import CONFIG_PARAM
|
|
19
|
+
from .utils import init_logging
|
|
20
20
|
|
|
21
21
|
app = AsyncTyper()
|
|
22
22
|
console = Console()
|
|
@@ -69,12 +69,11 @@ async def add(
|
|
|
69
69
|
name: str,
|
|
70
70
|
location: str,
|
|
71
71
|
description: str = "",
|
|
72
|
-
username: str
|
|
72
|
+
username: Optional[str] = None,
|
|
73
73
|
password: str = "",
|
|
74
|
-
|
|
74
|
+
ref: str = "",
|
|
75
75
|
read_only: bool = False,
|
|
76
76
|
debug: bool = False,
|
|
77
|
-
branch: str = typer.Option("main", help="Branch on which to add the repository."),
|
|
78
77
|
_: str = CONFIG_PARAM,
|
|
79
78
|
) -> None:
|
|
80
79
|
"""Add a new repository."""
|
|
@@ -86,15 +85,24 @@ async def add(
|
|
|
86
85
|
"name": {"value": name},
|
|
87
86
|
"location": {"value": location},
|
|
88
87
|
"description": {"value": description},
|
|
89
|
-
"commit": {"value": commit},
|
|
90
88
|
},
|
|
91
89
|
}
|
|
90
|
+
if read_only:
|
|
91
|
+
input_data["data"]["ref"] = {"value": ref}
|
|
92
|
+
else:
|
|
93
|
+
input_data["data"]["default_branch"] = {"value": ref}
|
|
92
94
|
|
|
93
95
|
client = initialize_client()
|
|
94
96
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
if username or password:
|
|
98
|
+
credential = await client.create(
|
|
99
|
+
kind="CorePasswordCredential",
|
|
100
|
+
name=name,
|
|
101
|
+
username=username,
|
|
102
|
+
password=password,
|
|
103
|
+
)
|
|
104
|
+
await credential.save(allow_upsert=True)
|
|
105
|
+
input_data["data"]["credential"] = {"id": credential.id}
|
|
98
106
|
|
|
99
107
|
query = Mutation(
|
|
100
108
|
mutation="CoreReadOnlyRepositoryCreate" if read_only else "CoreRepositoryCreate",
|
|
@@ -102,18 +110,18 @@ async def add(
|
|
|
102
110
|
query={"ok": None},
|
|
103
111
|
)
|
|
104
112
|
|
|
105
|
-
await client.execute_graphql(query=query.render(),
|
|
113
|
+
await client.execute_graphql(query=query.render(), tracker="mutation-repository-create")
|
|
106
114
|
|
|
107
115
|
|
|
108
116
|
@app.command()
|
|
109
117
|
async def list(
|
|
110
|
-
branch: str
|
|
118
|
+
branch: Optional[str] = typer.Option(None, help="Branch on which to list repositories."),
|
|
111
119
|
debug: bool = False,
|
|
112
120
|
_: str = CONFIG_PARAM,
|
|
113
121
|
) -> None:
|
|
114
122
|
init_logging(debug=debug)
|
|
115
123
|
|
|
116
|
-
client = initialize_client(
|
|
124
|
+
client = initialize_client()
|
|
117
125
|
|
|
118
126
|
repo_status_query = {
|
|
119
127
|
"CoreGenericRepository": {
|
infrahub_sdk/ctl/schema.py
CHANGED
|
@@ -108,7 +108,7 @@ def get_node(schemas_data: list[dict], schema_index: int, node_index: int) -> di
|
|
|
108
108
|
async def load(
|
|
109
109
|
schemas: list[Path],
|
|
110
110
|
debug: bool = False,
|
|
111
|
-
branch: str = typer.Option(
|
|
111
|
+
branch: str = typer.Option(None, help="Branch on which to load the schema."),
|
|
112
112
|
wait: int = typer.Option(0, help="Time in seconds to wait until the schema has converged across all workers"),
|
|
113
113
|
_: str = CONFIG_PARAM,
|
|
114
114
|
) -> None:
|
|
@@ -159,7 +159,7 @@ async def load(
|
|
|
159
159
|
async def check(
|
|
160
160
|
schemas: list[Path],
|
|
161
161
|
debug: bool = False,
|
|
162
|
-
branch: str = typer.Option(
|
|
162
|
+
branch: str = typer.Option(None, help="Branch on which to check the schema."),
|
|
163
163
|
_: str = CONFIG_PARAM,
|
|
164
164
|
) -> None:
|
|
165
165
|
"""Check if schema files are valid and what would be the impact of loading them with Infrahub."""
|
infrahub_sdk/ctl/utils.py
CHANGED
|
@@ -6,21 +6,19 @@ import traceback
|
|
|
6
6
|
from collections.abc import Coroutine
|
|
7
7
|
from functools import wraps
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import TYPE_CHECKING, Any, Callable, NoReturn, TypeVar
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Callable, NoReturn, Optional, TypeVar
|
|
10
10
|
|
|
11
|
-
import pendulum
|
|
12
11
|
import typer
|
|
13
12
|
from click.exceptions import Exit
|
|
14
13
|
from httpx import HTTPError
|
|
15
|
-
from pendulum.datetime import DateTime
|
|
16
14
|
from rich.console import Console
|
|
17
15
|
from rich.logging import RichHandler
|
|
18
16
|
from rich.markup import escape
|
|
19
17
|
|
|
20
|
-
from ..ctl.exceptions import FileNotValidError, QueryNotFoundError
|
|
21
18
|
from ..exceptions import (
|
|
22
19
|
AuthenticationError,
|
|
23
20
|
Error,
|
|
21
|
+
FileNotValidError,
|
|
24
22
|
GraphQLError,
|
|
25
23
|
NodeNotFoundError,
|
|
26
24
|
ResourceNotDefinedError,
|
|
@@ -30,6 +28,7 @@ from ..exceptions import (
|
|
|
30
28
|
)
|
|
31
29
|
from ..yaml import YamlFile
|
|
32
30
|
from .client import initialize_client_sync
|
|
31
|
+
from .exceptions import QueryNotFoundError
|
|
33
32
|
|
|
34
33
|
if TYPE_CHECKING:
|
|
35
34
|
from ..schema.repository import InfrahubRepositoryConfig
|
|
@@ -88,7 +87,7 @@ def catch_exception(
|
|
|
88
87
|
async def async_wrapper(*args: Any, **kwargs: Any) -> T:
|
|
89
88
|
try:
|
|
90
89
|
return await func(*args, **kwargs)
|
|
91
|
-
except (Error, Exception) as exc:
|
|
90
|
+
except (Error, Exception) as exc:
|
|
92
91
|
return handle_exception(exc=exc, console=console, exit_code=exit_code)
|
|
93
92
|
|
|
94
93
|
return async_wrapper
|
|
@@ -97,7 +96,7 @@ def catch_exception(
|
|
|
97
96
|
def wrapper(*args: Any, **kwargs: Any) -> T:
|
|
98
97
|
try:
|
|
99
98
|
return func(*args, **kwargs)
|
|
100
|
-
except (Error, Exception) as exc:
|
|
99
|
+
except (Error, Exception) as exc:
|
|
101
100
|
return handle_exception(exc=exc, console=console, exit_code=exit_code)
|
|
102
101
|
|
|
103
102
|
return wrapper
|
|
@@ -144,27 +143,13 @@ def print_graphql_errors(console: Console, errors: list) -> None:
|
|
|
144
143
|
console.print(f"[red]{escape(str(error))}")
|
|
145
144
|
|
|
146
145
|
|
|
147
|
-
def parse_cli_vars(variables: list[str]
|
|
146
|
+
def parse_cli_vars(variables: Optional[list[str]]) -> dict[str, str]:
|
|
148
147
|
if not variables:
|
|
149
148
|
return {}
|
|
150
149
|
|
|
151
150
|
return {var.split("=")[0]: var.split("=")[1] for var in variables if "=" in var}
|
|
152
151
|
|
|
153
152
|
|
|
154
|
-
def calculate_time_diff(value: str) -> str | None:
|
|
155
|
-
"""Calculate the time in human format between a timedate in string format and now."""
|
|
156
|
-
try:
|
|
157
|
-
time_value = pendulum.parse(value)
|
|
158
|
-
except pendulum.parsing.exceptions.ParserError:
|
|
159
|
-
return None
|
|
160
|
-
|
|
161
|
-
if not isinstance(time_value, DateTime):
|
|
162
|
-
return None
|
|
163
|
-
|
|
164
|
-
pendulum.set_locale("en")
|
|
165
|
-
return time_value.diff_for_humans(other=pendulum.now(), absolute=True)
|
|
166
|
-
|
|
167
|
-
|
|
168
153
|
def find_graphql_query(name: str, directory: str | Path = ".") -> str:
|
|
169
154
|
if isinstance(directory, str):
|
|
170
155
|
directory = Path(directory)
|
infrahub_sdk/ctl/validate.py
CHANGED
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import Optional
|
|
5
6
|
|
|
6
7
|
import typer
|
|
7
8
|
import ujson
|
|
@@ -57,7 +58,7 @@ async def validate_schema(schema: Path, _: str = CONFIG_PARAM) -> None:
|
|
|
57
58
|
@catch_exception(console=console)
|
|
58
59
|
def validate_graphql(
|
|
59
60
|
query: str,
|
|
60
|
-
variables: list[str]
|
|
61
|
+
variables: Optional[list[str]] = typer.Argument(
|
|
61
62
|
None, help="Variables to pass along with the query. Format key=value key=value."
|
|
62
63
|
),
|
|
63
64
|
debug: bool = typer.Option(False, help="Display more troubleshooting information."),
|
infrahub_sdk/data.py
CHANGED
|
@@ -20,7 +20,7 @@ class RepositoryData(BaseModel):
|
|
|
20
20
|
branch_info: dict[str, RepositoryBranchInfo] = Field(default_factory=dict)
|
|
21
21
|
|
|
22
22
|
def get_staging_branch(self) -> str | None:
|
|
23
|
-
for branch, info in self.branch_info.items():
|
|
23
|
+
for branch, info in self.branch_info.items():
|
|
24
24
|
if info.internal_status == "staging":
|
|
25
25
|
return branch
|
|
26
26
|
return None
|
infrahub_sdk/exceptions.py
CHANGED
|
@@ -131,3 +131,15 @@ class UninitializedError(Error):
|
|
|
131
131
|
|
|
132
132
|
class InvalidResponseError(Error):
|
|
133
133
|
"""Raised when an object requires an initialization step before use"""
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class FileNotValidError(Error):
|
|
137
|
+
def __init__(self, name: str, message: str = ""):
|
|
138
|
+
self.message = message or f"Cannot parse '{name}' content."
|
|
139
|
+
super().__init__(self.message)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class TimestampFormatError(Error):
|
|
143
|
+
def __init__(self, message: str | None = None):
|
|
144
|
+
self.message = message or "Invalid timestamp format"
|
|
145
|
+
super().__init__(self.message)
|
infrahub_sdk/generator.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
import os
|
|
4
5
|
from abc import abstractmethod
|
|
5
6
|
from typing import TYPE_CHECKING
|
|
@@ -27,6 +28,7 @@ class InfrahubGenerator:
|
|
|
27
28
|
generator_instance: str = "",
|
|
28
29
|
params: dict | None = None,
|
|
29
30
|
convert_query_response: bool = False,
|
|
31
|
+
logger: logging.Logger | None = None,
|
|
30
32
|
) -> None:
|
|
31
33
|
self.query = query
|
|
32
34
|
self.branch = branch
|
|
@@ -41,6 +43,7 @@ class InfrahubGenerator:
|
|
|
41
43
|
self._related_nodes: list[InfrahubNode] = []
|
|
42
44
|
self.infrahub_node = infrahub_node
|
|
43
45
|
self.convert_query_response = convert_query_response
|
|
46
|
+
self.logger = logger if logger else logging.getLogger("infrahub.tasks")
|
|
44
47
|
|
|
45
48
|
@property
|
|
46
49
|
def store(self) -> NodeStore:
|
infrahub_sdk/node.py
CHANGED
|
@@ -25,7 +25,6 @@ if TYPE_CHECKING:
|
|
|
25
25
|
from .schema import AttributeSchemaAPI, MainSchemaTypesAPI, RelationshipSchemaAPI
|
|
26
26
|
from .types import Order
|
|
27
27
|
|
|
28
|
-
# pylint: disable=too-many-lines
|
|
29
28
|
|
|
30
29
|
PROPERTIES_FLAG = ["is_visible", "is_protected"]
|
|
31
30
|
PROPERTIES_OBJECT = ["source", "owner"]
|
|
@@ -801,7 +800,7 @@ class InfrahubNodeBase:
|
|
|
801
800
|
Returns:
|
|
802
801
|
dict[str, Dict]: Representation of an input data in dict format
|
|
803
802
|
"""
|
|
804
|
-
|
|
803
|
+
|
|
805
804
|
data = {}
|
|
806
805
|
variables = {}
|
|
807
806
|
|
|
@@ -1119,14 +1118,14 @@ class InfrahubNode(InfrahubNodeBase):
|
|
|
1119
1118
|
async def artifact_generate(self, name: str) -> None:
|
|
1120
1119
|
self._validate_artifact_support(ARTIFACT_GENERATE_FEATURE_NOT_SUPPORTED_MESSAGE)
|
|
1121
1120
|
|
|
1122
|
-
artifact = await self._client.get(kind="CoreArtifact",
|
|
1121
|
+
artifact = await self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
|
|
1123
1122
|
await artifact.definition.fetch() # type: ignore[attr-defined]
|
|
1124
1123
|
await artifact.definition.peer.generate([artifact.id]) # type: ignore[attr-defined]
|
|
1125
1124
|
|
|
1126
1125
|
async def artifact_fetch(self, name: str) -> str | dict[str, Any]:
|
|
1127
1126
|
self._validate_artifact_support(ARTIFACT_GENERATE_FEATURE_NOT_SUPPORTED_MESSAGE)
|
|
1128
1127
|
|
|
1129
|
-
artifact = await self._client.get(kind="CoreArtifact",
|
|
1128
|
+
artifact = await self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
|
|
1130
1129
|
content = await self._client.object_store.get(identifier=artifact.storage_id.value) # type: ignore[attr-defined]
|
|
1131
1130
|
return content
|
|
1132
1131
|
|
|
@@ -1251,7 +1250,6 @@ class InfrahubNode(InfrahubNodeBase):
|
|
|
1251
1250
|
Returns:
|
|
1252
1251
|
dict[str, Union[Any, Dict]]: GraphQL query in dictionary format
|
|
1253
1252
|
"""
|
|
1254
|
-
# pylint: disable=too-many-branches
|
|
1255
1253
|
|
|
1256
1254
|
data: dict[str, Any] = {}
|
|
1257
1255
|
|
|
@@ -1637,13 +1635,13 @@ class InfrahubNodeSync(InfrahubNodeBase):
|
|
|
1637
1635
|
|
|
1638
1636
|
def artifact_generate(self, name: str) -> None:
|
|
1639
1637
|
self._validate_artifact_support(ARTIFACT_GENERATE_FEATURE_NOT_SUPPORTED_MESSAGE)
|
|
1640
|
-
artifact = self._client.get(kind="CoreArtifact",
|
|
1638
|
+
artifact = self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
|
|
1641
1639
|
artifact.definition.fetch() # type: ignore[attr-defined]
|
|
1642
1640
|
artifact.definition.peer.generate([artifact.id]) # type: ignore[attr-defined]
|
|
1643
1641
|
|
|
1644
1642
|
def artifact_fetch(self, name: str) -> str | dict[str, Any]:
|
|
1645
1643
|
self._validate_artifact_support(ARTIFACT_FETCH_FEATURE_NOT_SUPPORTED_MESSAGE)
|
|
1646
|
-
artifact = self._client.get(kind="CoreArtifact",
|
|
1644
|
+
artifact = self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
|
|
1647
1645
|
content = self._client.object_store.get(identifier=artifact.storage_id.value) # type: ignore[attr-defined]
|
|
1648
1646
|
return content
|
|
1649
1647
|
|
|
@@ -1763,7 +1761,6 @@ class InfrahubNodeSync(InfrahubNodeBase):
|
|
|
1763
1761
|
Returns:
|
|
1764
1762
|
dict[str, Union[Any, Dict]]: GraphQL query in dictionary format
|
|
1765
1763
|
"""
|
|
1766
|
-
# pylint: disable=too-many-branches
|
|
1767
1764
|
|
|
1768
1765
|
data: dict[str, Any] = {}
|
|
1769
1766
|
|
infrahub_sdk/protocols.py
CHANGED
|
@@ -73,7 +73,7 @@ class CoreArtifactTarget(CoreNode):
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
class CoreBasePermission(CoreNode):
|
|
76
|
-
|
|
76
|
+
description: StringOptional
|
|
77
77
|
identifier: StringOptional
|
|
78
78
|
roles: RelationshipManager
|
|
79
79
|
|
|
@@ -108,7 +108,6 @@ class CoreGenericAccount(CoreNode):
|
|
|
108
108
|
label: StringOptional
|
|
109
109
|
description: StringOptional
|
|
110
110
|
account_type: Enum
|
|
111
|
-
role: Enum
|
|
112
111
|
status: Dropdown
|
|
113
112
|
tokens: RelationshipManager
|
|
114
113
|
|
|
@@ -155,6 +154,10 @@ class CoreMenu(CoreNode):
|
|
|
155
154
|
children: RelationshipManager
|
|
156
155
|
|
|
157
156
|
|
|
157
|
+
class CoreObjectTemplate(CoreNode):
|
|
158
|
+
template_name: String
|
|
159
|
+
|
|
160
|
+
|
|
158
161
|
class CoreProfile(CoreNode):
|
|
159
162
|
profile_name: String
|
|
160
163
|
profile_priority: IntegerOptional
|
|
@@ -200,6 +203,8 @@ class CoreValidator(CoreNode):
|
|
|
200
203
|
|
|
201
204
|
class CoreWebhook(CoreNode):
|
|
202
205
|
name: String
|
|
206
|
+
event_type: Enum
|
|
207
|
+
branch_scope: Dropdown
|
|
203
208
|
description: StringOptional
|
|
204
209
|
url: URL
|
|
205
210
|
validate_certificates: BooleanOptional
|
|
@@ -222,7 +227,7 @@ class CoreAccount(LineageOwner, LineageSource, CoreGenericAccount):
|
|
|
222
227
|
pass
|
|
223
228
|
|
|
224
229
|
|
|
225
|
-
class CoreAccountGroup(CoreGroup):
|
|
230
|
+
class CoreAccountGroup(LineageOwner, LineageSource, CoreGroup):
|
|
226
231
|
roles: RelationshipManager
|
|
227
232
|
|
|
228
233
|
|
|
@@ -350,8 +355,8 @@ class CoreGeneratorValidator(CoreValidator):
|
|
|
350
355
|
|
|
351
356
|
|
|
352
357
|
class CoreGlobalPermission(CoreBasePermission):
|
|
353
|
-
name: String
|
|
354
358
|
action: Dropdown
|
|
359
|
+
decision: Enum
|
|
355
360
|
|
|
356
361
|
|
|
357
362
|
class CoreGraphQLQuery(CoreNode):
|
|
@@ -402,6 +407,7 @@ class CoreObjectPermission(CoreBasePermission):
|
|
|
402
407
|
namespace: String
|
|
403
408
|
name: String
|
|
404
409
|
action: Enum
|
|
410
|
+
decision: Enum
|
|
405
411
|
|
|
406
412
|
|
|
407
413
|
class CoreObjectThread(CoreThread):
|
|
@@ -538,7 +544,7 @@ class CoreArtifactTargetSync(CoreNodeSync):
|
|
|
538
544
|
|
|
539
545
|
|
|
540
546
|
class CoreBasePermissionSync(CoreNodeSync):
|
|
541
|
-
|
|
547
|
+
description: StringOptional
|
|
542
548
|
identifier: StringOptional
|
|
543
549
|
roles: RelationshipManagerSync
|
|
544
550
|
|
|
@@ -573,7 +579,6 @@ class CoreGenericAccountSync(CoreNodeSync):
|
|
|
573
579
|
label: StringOptional
|
|
574
580
|
description: StringOptional
|
|
575
581
|
account_type: Enum
|
|
576
|
-
role: Enum
|
|
577
582
|
status: Dropdown
|
|
578
583
|
tokens: RelationshipManagerSync
|
|
579
584
|
|
|
@@ -620,6 +625,10 @@ class CoreMenuSync(CoreNodeSync):
|
|
|
620
625
|
children: RelationshipManagerSync
|
|
621
626
|
|
|
622
627
|
|
|
628
|
+
class CoreObjectTemplateSync(CoreNodeSync):
|
|
629
|
+
template_name: String
|
|
630
|
+
|
|
631
|
+
|
|
623
632
|
class CoreProfileSync(CoreNodeSync):
|
|
624
633
|
profile_name: String
|
|
625
634
|
profile_priority: IntegerOptional
|
|
@@ -665,6 +674,8 @@ class CoreValidatorSync(CoreNodeSync):
|
|
|
665
674
|
|
|
666
675
|
class CoreWebhookSync(CoreNodeSync):
|
|
667
676
|
name: String
|
|
677
|
+
event_type: Enum
|
|
678
|
+
branch_scope: Dropdown
|
|
668
679
|
description: StringOptional
|
|
669
680
|
url: URL
|
|
670
681
|
validate_certificates: BooleanOptional
|
|
@@ -687,7 +698,7 @@ class CoreAccountSync(LineageOwnerSync, LineageSourceSync, CoreGenericAccountSyn
|
|
|
687
698
|
pass
|
|
688
699
|
|
|
689
700
|
|
|
690
|
-
class CoreAccountGroupSync(CoreGroupSync):
|
|
701
|
+
class CoreAccountGroupSync(LineageOwnerSync, LineageSourceSync, CoreGroupSync):
|
|
691
702
|
roles: RelationshipManagerSync
|
|
692
703
|
|
|
693
704
|
|
|
@@ -815,8 +826,8 @@ class CoreGeneratorValidatorSync(CoreValidatorSync):
|
|
|
815
826
|
|
|
816
827
|
|
|
817
828
|
class CoreGlobalPermissionSync(CoreBasePermissionSync):
|
|
818
|
-
name: String
|
|
819
829
|
action: Dropdown
|
|
830
|
+
decision: Enum
|
|
820
831
|
|
|
821
832
|
|
|
822
833
|
class CoreGraphQLQuerySync(CoreNodeSync):
|
|
@@ -867,6 +878,7 @@ class CoreObjectPermissionSync(CoreBasePermissionSync):
|
|
|
867
878
|
namespace: String
|
|
868
879
|
name: String
|
|
869
880
|
action: Enum
|
|
881
|
+
decision: Enum
|
|
870
882
|
|
|
871
883
|
|
|
872
884
|
class CoreObjectThreadSync(CoreThreadSync):
|
infrahub_sdk/schema/__init__.py
CHANGED
|
@@ -34,6 +34,7 @@ from .main import (
|
|
|
34
34
|
RelationshipSchemaAPI,
|
|
35
35
|
SchemaRoot,
|
|
36
36
|
SchemaRootAPI,
|
|
37
|
+
TemplateSchemaAPI,
|
|
37
38
|
)
|
|
38
39
|
|
|
39
40
|
if TYPE_CHECKING:
|
|
@@ -58,12 +59,10 @@ __all__ = [
|
|
|
58
59
|
"RelationshipSchemaAPI",
|
|
59
60
|
"SchemaRoot",
|
|
60
61
|
"SchemaRootAPI",
|
|
62
|
+
"TemplateSchemaAPI",
|
|
61
63
|
]
|
|
62
64
|
|
|
63
65
|
|
|
64
|
-
# pylint: disable=redefined-builtin
|
|
65
|
-
|
|
66
|
-
|
|
67
66
|
class DropdownMutationOptionalArgs(TypedDict):
|
|
68
67
|
color: str | None
|
|
69
68
|
description: str | None
|
|
@@ -81,8 +80,10 @@ class EnumMutation(str, Enum):
|
|
|
81
80
|
|
|
82
81
|
|
|
83
82
|
MainSchemaTypes: TypeAlias = Union[NodeSchema, GenericSchema]
|
|
84
|
-
MainSchemaTypesAPI: TypeAlias = Union[NodeSchemaAPI, GenericSchemaAPI, ProfileSchemaAPI]
|
|
85
|
-
MainSchemaTypesAll: TypeAlias = Union[
|
|
83
|
+
MainSchemaTypesAPI: TypeAlias = Union[NodeSchemaAPI, GenericSchemaAPI, ProfileSchemaAPI, TemplateSchemaAPI]
|
|
84
|
+
MainSchemaTypesAll: TypeAlias = Union[
|
|
85
|
+
NodeSchema, GenericSchema, NodeSchemaAPI, GenericSchemaAPI, ProfileSchemaAPI, TemplateSchemaAPI
|
|
86
|
+
]
|
|
86
87
|
|
|
87
88
|
|
|
88
89
|
class InfrahubSchemaBase:
|
|
@@ -420,6 +421,10 @@ class InfrahubSchema(InfrahubSchemaBase):
|
|
|
420
421
|
profile = ProfileSchemaAPI(**profile_schema)
|
|
421
422
|
nodes[profile.kind] = profile
|
|
422
423
|
|
|
424
|
+
for template_schema in data.get("templates", []):
|
|
425
|
+
template = TemplateSchemaAPI(**template_schema)
|
|
426
|
+
nodes[template.kind] = template
|
|
427
|
+
|
|
423
428
|
return nodes
|
|
424
429
|
|
|
425
430
|
|
|
@@ -624,6 +629,10 @@ class InfrahubSchemaSync(InfrahubSchemaBase):
|
|
|
624
629
|
profile = ProfileSchemaAPI(**profile_schema)
|
|
625
630
|
nodes[profile.kind] = profile
|
|
626
631
|
|
|
632
|
+
for template_schema in data.get("templates", []):
|
|
633
|
+
template = TemplateSchemaAPI(**template_schema)
|
|
634
|
+
nodes[template.kind] = template
|
|
635
|
+
|
|
627
636
|
return nodes
|
|
628
637
|
|
|
629
638
|
def load(
|
infrahub_sdk/schema/main.py
CHANGED
|
@@ -31,6 +31,7 @@ class RelationshipKind(str, Enum):
|
|
|
31
31
|
GROUP = "Group"
|
|
32
32
|
HIERARCHY = "Hierarchy"
|
|
33
33
|
PROFILE = "Profile"
|
|
34
|
+
TEMPLATE = "Template"
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
class RelationshipDirection(str, Enum):
|
|
@@ -290,6 +291,7 @@ class BaseNodeSchema(BaseSchema):
|
|
|
290
291
|
branch: BranchSupportType | None = None
|
|
291
292
|
default_filter: str | None = None
|
|
292
293
|
generate_profile: bool | None = None
|
|
294
|
+
generate_template: bool | None = None
|
|
293
295
|
parent: str | None = None
|
|
294
296
|
children: str | None = None
|
|
295
297
|
|
|
@@ -308,6 +310,10 @@ class ProfileSchemaAPI(BaseSchema, BaseSchemaAttrRelAPI):
|
|
|
308
310
|
inherit_from: list[str] = Field(default_factory=list)
|
|
309
311
|
|
|
310
312
|
|
|
313
|
+
class TemplateSchemaAPI(BaseSchema, BaseSchemaAttrRelAPI):
|
|
314
|
+
inherit_from: list[str] = Field(default_factory=list)
|
|
315
|
+
|
|
316
|
+
|
|
311
317
|
class NodeExtensionSchema(BaseModel):
|
|
312
318
|
model_config = ConfigDict(use_enum_values=True)
|
|
313
319
|
|
|
@@ -341,3 +347,4 @@ class SchemaRootAPI(BaseModel):
|
|
|
341
347
|
generics: list[GenericSchemaAPI] = Field(default_factory=list)
|
|
342
348
|
nodes: list[NodeSchemaAPI] = Field(default_factory=list)
|
|
343
349
|
profiles: list[ProfileSchemaAPI] = Field(default_factory=list)
|
|
350
|
+
templates: list[TemplateSchemaAPI] = Field(default_factory=list)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TaskError(Exception):
|
|
5
|
+
def __init__(self, message: str | None = None):
|
|
6
|
+
self.message = message
|
|
7
|
+
super().__init__(self.message)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TaskNotFoundError(TaskError):
|
|
11
|
+
def __init__(self, id: str):
|
|
12
|
+
self.message = f"Task with id {id} not found"
|
|
13
|
+
super().__init__(self.message)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TooManyTasksError(TaskError):
|
|
17
|
+
def __init__(self, expected_id: str, received_ids: list[str]):
|
|
18
|
+
self.message = f"Expected 1 task with id {expected_id}, but got {len(received_ids)}"
|
|
19
|
+
super().__init__(self.message)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TaskNotCompletedError(TaskError):
|
|
23
|
+
def __init__(self, id: str, message: str | None = None):
|
|
24
|
+
self.message = message or f"Task with id {id} is not completed"
|
|
25
|
+
super().__init__(self.message)
|