infrahub-server 1.2.0b1__py3-none-any.whl → 1.2.1__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/dependencies.py +6 -6
- infrahub/api/diff/validation_models.py +7 -7
- infrahub/api/schema.py +1 -1
- infrahub/artifacts/models.py +1 -3
- infrahub/artifacts/tasks.py +1 -3
- infrahub/cli/__init__.py +13 -9
- infrahub/cli/constants.py +3 -0
- infrahub/cli/db.py +165 -183
- infrahub/cli/upgrade.py +146 -0
- infrahub/computed_attribute/gather.py +185 -0
- infrahub/computed_attribute/models.py +239 -11
- infrahub/computed_attribute/tasks.py +77 -442
- infrahub/computed_attribute/triggers.py +11 -45
- infrahub/config.py +43 -32
- infrahub/context.py +14 -0
- infrahub/core/account.py +4 -4
- infrahub/core/attribute.py +57 -57
- infrahub/core/branch/tasks.py +12 -9
- infrahub/core/changelog/diff.py +16 -8
- infrahub/core/changelog/models.py +189 -26
- infrahub/core/constants/__init__.py +5 -1
- infrahub/core/constants/infrahubkind.py +2 -0
- infrahub/core/constraint/node/runner.py +9 -8
- infrahub/core/diff/branch_differ.py +10 -10
- infrahub/core/diff/ipam_diff_parser.py +4 -5
- infrahub/core/diff/model/diff.py +27 -27
- infrahub/core/diff/model/path.py +3 -3
- infrahub/core/diff/query/merge.py +20 -17
- infrahub/core/diff/query_parser.py +4 -4
- infrahub/core/graph/__init__.py +1 -1
- infrahub/core/initialization.py +1 -10
- infrahub/core/ipam/constants.py +3 -4
- infrahub/core/ipam/reconciler.py +12 -12
- infrahub/core/ipam/utilization.py +10 -13
- infrahub/core/manager.py +34 -34
- infrahub/core/merge.py +7 -7
- infrahub/core/migrations/__init__.py +2 -3
- infrahub/core/migrations/graph/__init__.py +9 -4
- infrahub/core/migrations/graph/m017_add_core_profile.py +1 -5
- infrahub/core/migrations/graph/m018_uniqueness_nulls.py +4 -4
- infrahub/core/migrations/graph/m020_duplicate_edges.py +160 -0
- infrahub/core/migrations/graph/m021_missing_hierarchy_merge.py +51 -0
- infrahub/core/migrations/graph/{m020_add_generate_template_attr.py → m022_add_generate_template_attr.py} +3 -3
- infrahub/core/migrations/graph/m023_deduplicate_cardinality_one_relationships.py +96 -0
- infrahub/core/migrations/query/attribute_add.py +2 -2
- infrahub/core/migrations/query/node_duplicate.py +18 -21
- infrahub/core/migrations/query/schema_attribute_update.py +2 -2
- infrahub/core/migrations/schema/models.py +19 -4
- infrahub/core/migrations/schema/tasks.py +2 -2
- infrahub/core/migrations/shared.py +16 -16
- infrahub/core/models.py +15 -6
- infrahub/core/node/__init__.py +29 -28
- infrahub/core/node/base.py +2 -4
- infrahub/core/node/constraints/attribute_uniqueness.py +2 -2
- infrahub/core/node/constraints/grouped_uniqueness.py +99 -47
- infrahub/core/node/constraints/interface.py +1 -2
- infrahub/core/node/delete_validator.py +3 -5
- infrahub/core/node/ipam.py +4 -4
- 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 +6 -6
- infrahub/core/node/resource_manager/number_pool.py +3 -3
- infrahub/core/path.py +12 -12
- infrahub/core/property.py +11 -11
- infrahub/core/protocols.py +5 -0
- infrahub/core/protocols_base.py +21 -21
- infrahub/core/query/__init__.py +33 -33
- infrahub/core/query/attribute.py +6 -4
- infrahub/core/query/diff.py +3 -3
- infrahub/core/query/node.py +82 -32
- infrahub/core/query/relationship.py +24 -24
- infrahub/core/query/resource_manager.py +2 -0
- infrahub/core/query/standard_node.py +3 -3
- infrahub/core/query/subquery.py +9 -9
- infrahub/core/registry.py +13 -15
- infrahub/core/relationship/constraints/count.py +3 -4
- infrahub/core/relationship/constraints/peer_kind.py +3 -4
- infrahub/core/relationship/constraints/profiles_kind.py +2 -2
- infrahub/core/relationship/model.py +40 -46
- infrahub/core/schema/attribute_schema.py +9 -9
- infrahub/core/schema/basenode_schema.py +93 -44
- infrahub/core/schema/computed_attribute.py +3 -3
- infrahub/core/schema/definitions/core/__init__.py +13 -19
- infrahub/core/schema/definitions/core/account.py +151 -148
- infrahub/core/schema/definitions/core/artifact.py +122 -113
- infrahub/core/schema/definitions/core/builtin.py +19 -16
- infrahub/core/schema/definitions/core/check.py +61 -53
- infrahub/core/schema/definitions/core/core.py +17 -0
- infrahub/core/schema/definitions/core/generator.py +89 -85
- infrahub/core/schema/definitions/core/graphql_query.py +72 -70
- infrahub/core/schema/definitions/core/group.py +96 -93
- infrahub/core/schema/definitions/core/ipam.py +176 -235
- infrahub/core/schema/definitions/core/lineage.py +18 -16
- infrahub/core/schema/definitions/core/menu.py +42 -40
- infrahub/core/schema/definitions/core/permission.py +144 -142
- infrahub/core/schema/definitions/core/profile.py +16 -27
- infrahub/core/schema/definitions/core/propose_change.py +88 -79
- infrahub/core/schema/definitions/core/propose_change_comment.py +170 -165
- infrahub/core/schema/definitions/core/propose_change_validator.py +290 -288
- infrahub/core/schema/definitions/core/repository.py +231 -225
- infrahub/core/schema/definitions/core/resource_pool.py +156 -166
- infrahub/core/schema/definitions/core/template.py +27 -12
- infrahub/core/schema/definitions/core/transform.py +85 -76
- infrahub/core/schema/definitions/core/webhook.py +127 -101
- infrahub/core/schema/definitions/internal.py +16 -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/node_schema.py +3 -5
- infrahub/core/schema/generated/relationship_schema.py +9 -11
- infrahub/core/schema/generic_schema.py +2 -2
- infrahub/core/schema/manager.py +20 -9
- infrahub/core/schema/node_schema.py +4 -2
- infrahub/core/schema/relationship_schema.py +7 -7
- infrahub/core/schema/schema_branch.py +276 -138
- infrahub/core/schema/schema_branch_computed.py +41 -4
- infrahub/core/task/task.py +3 -3
- infrahub/core/task/user_task.py +15 -15
- infrahub/core/utils.py +20 -18
- infrahub/core/validators/__init__.py +1 -3
- infrahub/core/validators/aggregated_checker.py +2 -2
- infrahub/core/validators/attribute/choices.py +2 -2
- infrahub/core/validators/attribute/enum.py +2 -2
- infrahub/core/validators/attribute/kind.py +2 -2
- infrahub/core/validators/attribute/length.py +2 -2
- infrahub/core/validators/attribute/optional.py +2 -2
- infrahub/core/validators/attribute/regex.py +2 -2
- infrahub/core/validators/attribute/unique.py +2 -2
- infrahub/core/validators/checks_runner.py +25 -2
- infrahub/core/validators/determiner.py +1 -3
- infrahub/core/validators/interface.py +6 -2
- infrahub/core/validators/model.py +22 -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 +2 -2
- infrahub/core/validators/node/hierarchy.py +3 -5
- infrahub/core/validators/node/inherit_from.py +27 -5
- infrahub/core/validators/node/relationship.py +2 -2
- infrahub/core/validators/relationship/count.py +4 -4
- infrahub/core/validators/relationship/optional.py +2 -2
- infrahub/core/validators/relationship/peer.py +2 -2
- infrahub/core/validators/shared.py +2 -2
- infrahub/core/validators/tasks.py +8 -0
- infrahub/core/validators/uniqueness/checker.py +22 -21
- infrahub/core/validators/uniqueness/index.py +2 -2
- infrahub/core/validators/uniqueness/model.py +11 -11
- infrahub/database/__init__.py +26 -22
- infrahub/database/metrics.py +7 -1
- infrahub/dependencies/builder/constraint/grouped/node_runner.py +1 -3
- infrahub/dependencies/component/registry.py +2 -2
- infrahub/events/__init__.py +25 -2
- infrahub/events/artifact_action.py +13 -25
- infrahub/events/branch_action.py +26 -18
- infrahub/events/generator.py +71 -0
- infrahub/events/group_action.py +10 -24
- infrahub/events/models.py +10 -16
- infrahub/events/node_action.py +87 -32
- infrahub/events/repository_action.py +5 -18
- infrahub/events/schema_action.py +4 -9
- infrahub/events/utils.py +16 -0
- infrahub/events/validator_action.py +55 -0
- infrahub/exceptions.py +23 -24
- infrahub/generators/models.py +1 -3
- infrahub/git/base.py +7 -7
- infrahub/git/integrator.py +26 -25
- infrahub/git/models.py +22 -9
- infrahub/git/repository.py +3 -3
- infrahub/git/tasks.py +67 -49
- infrahub/git/utils.py +48 -0
- infrahub/git/worktree.py +1 -2
- infrahub/git_credential/askpass.py +1 -2
- infrahub/graphql/analyzer.py +12 -0
- infrahub/graphql/app.py +13 -15
- infrahub/graphql/context.py +6 -0
- infrahub/graphql/initialization.py +3 -0
- infrahub/graphql/loaders/node.py +2 -12
- infrahub/graphql/loaders/peers.py +77 -0
- infrahub/graphql/loaders/shared.py +13 -0
- infrahub/graphql/manager.py +13 -10
- infrahub/graphql/mutations/artifact_definition.py +5 -5
- infrahub/graphql/mutations/computed_attribute.py +4 -5
- infrahub/graphql/mutations/graphql_query.py +5 -5
- infrahub/graphql/mutations/ipam.py +50 -70
- infrahub/graphql/mutations/main.py +164 -141
- infrahub/graphql/mutations/menu.py +5 -5
- infrahub/graphql/mutations/models.py +2 -4
- infrahub/graphql/mutations/node_getter/by_default_filter.py +10 -10
- 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 +7 -7
- infrahub/graphql/mutations/relationship.py +67 -35
- infrahub/graphql/mutations/repository.py +8 -8
- infrahub/graphql/mutations/resource_manager.py +3 -3
- infrahub/graphql/mutations/schema.py +4 -4
- infrahub/graphql/mutations/webhook.py +137 -0
- infrahub/graphql/parser.py +4 -4
- infrahub/graphql/queries/diff/tree.py +4 -4
- infrahub/graphql/queries/ipam.py +2 -2
- infrahub/graphql/queries/relationship.py +2 -2
- infrahub/graphql/queries/search.py +2 -2
- infrahub/graphql/resolvers/many_relationship.py +264 -0
- infrahub/graphql/resolvers/resolver.py +13 -110
- infrahub/graphql/subscription/graphql_query.py +2 -0
- infrahub/graphql/types/event.py +20 -11
- infrahub/graphql/types/node.py +2 -2
- infrahub/graphql/utils.py +2 -2
- infrahub/groups/ancestors.py +29 -0
- infrahub/groups/parsers.py +107 -0
- infrahub/menu/generator.py +7 -7
- infrahub/menu/menu.py +0 -10
- infrahub/menu/models.py +117 -16
- infrahub/menu/repository.py +111 -0
- infrahub/menu/utils.py +5 -8
- infrahub/message_bus/messages/__init__.py +1 -11
- infrahub/message_bus/messages/check_generator_run.py +2 -0
- infrahub/message_bus/messages/finalize_validator_execution.py +3 -0
- infrahub/message_bus/messages/request_generatordefinition_check.py +2 -0
- infrahub/message_bus/operations/__init__.py +0 -2
- infrahub/message_bus/operations/check/generator.py +1 -0
- infrahub/message_bus/operations/event/__init__.py +2 -2
- infrahub/message_bus/operations/finalize/validator.py +51 -1
- infrahub/message_bus/operations/requests/generator_definition.py +19 -19
- infrahub/message_bus/operations/requests/proposed_change.py +3 -1
- infrahub/pools/number.py +2 -4
- infrahub/proposed_change/tasks.py +37 -28
- infrahub/pytest_plugin.py +13 -10
- infrahub/server.py +1 -2
- infrahub/services/adapters/event/__init__.py +1 -1
- infrahub/task_manager/event.py +23 -9
- infrahub/tasks/artifact.py +2 -4
- 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/{tasks/telemetry.py → telemetry/tasks.py} +49 -56
- infrahub/telemetry/utils.py +11 -0
- infrahub/trace.py +4 -4
- infrahub/transformations/tasks.py +2 -2
- infrahub/trigger/catalogue.py +2 -5
- infrahub/trigger/constants.py +0 -8
- infrahub/trigger/models.py +14 -1
- infrahub/trigger/setup.py +90 -0
- infrahub/trigger/tasks.py +35 -90
- infrahub/utils.py +11 -1
- 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 +22 -5
- infrahub/webhook/tasks.py +44 -19
- infrahub/webhook/triggers.py +22 -5
- infrahub/workers/infrahub_async.py +2 -2
- infrahub/workers/utils.py +2 -2
- infrahub/workflows/catalogue.py +28 -20
- infrahub/workflows/initialization.py +1 -3
- infrahub/workflows/models.py +1 -1
- infrahub/workflows/utils.py +10 -1
- infrahub_sdk/client.py +27 -8
- infrahub_sdk/config.py +3 -0
- infrahub_sdk/context.py +13 -0
- infrahub_sdk/exceptions.py +6 -0
- infrahub_sdk/generator.py +4 -1
- infrahub_sdk/graphql.py +45 -13
- infrahub_sdk/node.py +69 -20
- infrahub_sdk/protocols_base.py +32 -11
- infrahub_sdk/query_groups.py +6 -35
- infrahub_sdk/schema/__init__.py +55 -26
- infrahub_sdk/schema/main.py +8 -0
- infrahub_sdk/task/__init__.py +10 -0
- infrahub_sdk/task/manager.py +12 -6
- infrahub_sdk/testing/schemas/animal.py +9 -0
- infrahub_sdk/timestamp.py +12 -4
- {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/METADATA +3 -2
- {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/RECORD +289 -260
- {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/entry_points.txt +1 -0
- infrahub_testcontainers/constants.py +2 -0
- infrahub_testcontainers/container.py +157 -12
- infrahub_testcontainers/docker-compose.test.yml +31 -6
- infrahub_testcontainers/helpers.py +18 -73
- infrahub_testcontainers/host.py +41 -0
- infrahub_testcontainers/measurements.py +93 -0
- infrahub_testcontainers/models.py +38 -0
- infrahub_testcontainers/performance_test.py +166 -0
- infrahub_testcontainers/plugin.py +136 -0
- infrahub_testcontainers/prometheus.yml +30 -0
- 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/operations/event/node.py +0 -20
- infrahub/message_bus/operations/event/schema.py +0 -17
- infrahub/webhook/constants.py +0 -1
- {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/LICENSE.txt +0 -0
- {infrahub_server-1.2.0b1.dist-info → infrahub_server-1.2.1.dist-info}/WHEEL +0 -0
|
@@ -1,108 +1,134 @@
|
|
|
1
|
-
from infrahub.core.constants import
|
|
1
|
+
from infrahub.core.constants import (
|
|
2
|
+
AllowOverrideType,
|
|
3
|
+
BranchSupportType,
|
|
4
|
+
EventType,
|
|
5
|
+
InfrahubKind,
|
|
6
|
+
)
|
|
7
|
+
from infrahub.core.constants import RelationshipCardinality as Cardinality
|
|
8
|
+
from infrahub.core.constants import RelationshipKind as RelKind
|
|
2
9
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
|
|
10
|
+
from ...attribute_schema import AttributeSchema as Attr
|
|
11
|
+
from ...dropdown import DropdownChoice
|
|
12
|
+
from ...generic_schema import GenericSchema
|
|
13
|
+
from ...node_schema import NodeSchema
|
|
14
|
+
from ...relationship_schema import (
|
|
15
|
+
RelationshipSchema as Rel,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
core_webhook = GenericSchema(
|
|
19
|
+
name="Webhook",
|
|
20
|
+
namespace="Core",
|
|
21
|
+
description="A webhook that connects to an external integration",
|
|
22
|
+
label="Webhook",
|
|
23
|
+
default_filter="name__value",
|
|
24
|
+
order_by=["name__value"],
|
|
25
|
+
display_labels=["name__value"],
|
|
26
|
+
include_in_menu=False,
|
|
27
|
+
icon="mdi:webhook",
|
|
28
|
+
branch=BranchSupportType.AGNOSTIC,
|
|
29
|
+
uniqueness_constraints=[["name__value"]],
|
|
30
|
+
attributes=[
|
|
31
|
+
Attr(name="name", kind="Text", unique=True, order_weight=1000),
|
|
32
|
+
Attr(
|
|
33
|
+
name="event_type",
|
|
34
|
+
kind="Text",
|
|
35
|
+
enum=["all"] + EventType.available_types(),
|
|
36
|
+
default_value="all",
|
|
37
|
+
order_weight=1500,
|
|
38
|
+
description="The event type that triggers the webhook",
|
|
39
|
+
),
|
|
40
|
+
Attr(
|
|
41
|
+
name="branch_scope",
|
|
42
|
+
kind="Dropdown",
|
|
43
|
+
choices=[
|
|
44
|
+
DropdownChoice(
|
|
45
|
+
name="all_branches",
|
|
46
|
+
label="All Branches",
|
|
47
|
+
description="All branches",
|
|
48
|
+
color="#fef08a",
|
|
49
|
+
),
|
|
50
|
+
DropdownChoice(
|
|
51
|
+
name="default_branch",
|
|
52
|
+
label="Default Branch",
|
|
53
|
+
description="Only the default branch",
|
|
54
|
+
color="#86efac",
|
|
55
|
+
),
|
|
56
|
+
DropdownChoice(
|
|
57
|
+
name="other_branches",
|
|
58
|
+
label="Other Branches",
|
|
59
|
+
description="All branches except the default branch",
|
|
60
|
+
color="#e5e7eb",
|
|
61
|
+
),
|
|
47
62
|
],
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"kind"
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
63
|
+
default_value="default_branch",
|
|
64
|
+
optional=False,
|
|
65
|
+
order_weight=2000,
|
|
66
|
+
allow_override=AllowOverrideType.NONE,
|
|
67
|
+
),
|
|
68
|
+
Attr(
|
|
69
|
+
name="node_kind",
|
|
70
|
+
kind="Text",
|
|
71
|
+
optional=True,
|
|
72
|
+
description="Only send node mutation events for nodes of this kind",
|
|
73
|
+
order_weight=2250,
|
|
74
|
+
),
|
|
75
|
+
Attr(
|
|
76
|
+
name="description",
|
|
77
|
+
kind="Text",
|
|
78
|
+
optional=True,
|
|
79
|
+
order_weight=2500,
|
|
80
|
+
),
|
|
81
|
+
Attr(name="url", kind="URL", order_weight=3000),
|
|
82
|
+
Attr(
|
|
83
|
+
name="validate_certificates",
|
|
84
|
+
kind="Boolean",
|
|
85
|
+
default_value=True,
|
|
86
|
+
optional=True,
|
|
87
|
+
order_weight=5000,
|
|
88
|
+
),
|
|
62
89
|
],
|
|
63
|
-
|
|
90
|
+
)
|
|
64
91
|
|
|
65
|
-
core_standard_webhook =
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
92
|
+
core_standard_webhook = NodeSchema(
|
|
93
|
+
name="StandardWebhook",
|
|
94
|
+
namespace="Core",
|
|
95
|
+
description="A webhook that connects to an external integration",
|
|
96
|
+
label="Standard Webhook",
|
|
97
|
+
default_filter="name__value",
|
|
98
|
+
order_by=["name__value"],
|
|
99
|
+
display_labels=["name__value"],
|
|
100
|
+
include_in_menu=False,
|
|
101
|
+
icon="mdi:webhook",
|
|
102
|
+
branch=BranchSupportType.AGNOSTIC,
|
|
103
|
+
generate_profile=False,
|
|
104
|
+
inherit_from=[InfrahubKind.WEBHOOK, InfrahubKind.TASKTARGET],
|
|
105
|
+
attributes=[
|
|
106
|
+
Attr(name="shared_key", kind="Password", unique=False, order_weight=4000),
|
|
80
107
|
],
|
|
81
|
-
|
|
108
|
+
)
|
|
82
109
|
|
|
83
|
-
core_custom_webhook =
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
"
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
},
|
|
110
|
+
core_custom_webhook = NodeSchema(
|
|
111
|
+
name="CustomWebhook",
|
|
112
|
+
namespace="Core",
|
|
113
|
+
description="A webhook that connects to an external integration",
|
|
114
|
+
label="Custom Webhook",
|
|
115
|
+
default_filter="name__value",
|
|
116
|
+
order_by=["name__value"],
|
|
117
|
+
display_labels=["name__value"],
|
|
118
|
+
include_in_menu=False,
|
|
119
|
+
icon="mdi:cog-outline",
|
|
120
|
+
branch=BranchSupportType.AGNOSTIC,
|
|
121
|
+
generate_profile=False,
|
|
122
|
+
inherit_from=[InfrahubKind.WEBHOOK, InfrahubKind.TASKTARGET],
|
|
123
|
+
relationships=[
|
|
124
|
+
Rel(
|
|
125
|
+
name="transformation",
|
|
126
|
+
peer=InfrahubKind.TRANSFORMPYTHON,
|
|
127
|
+
kind=RelKind.ATTRIBUTE,
|
|
128
|
+
identifier="webhook___transformation",
|
|
129
|
+
cardinality=Cardinality.ONE,
|
|
130
|
+
optional=True,
|
|
131
|
+
order_weight=7000,
|
|
132
|
+
),
|
|
107
133
|
],
|
|
108
|
-
|
|
134
|
+
)
|
|
@@ -4,7 +4,7 @@ from copy import deepcopy
|
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from enum import Enum
|
|
6
6
|
from types import GenericAlias
|
|
7
|
-
from typing import Any
|
|
7
|
+
from typing import Any
|
|
8
8
|
|
|
9
9
|
from pydantic import BaseModel, ConfigDict, Field
|
|
10
10
|
from typing_extensions import TypedDict
|
|
@@ -46,17 +46,17 @@ class SchemaAttribute(BaseModel):
|
|
|
46
46
|
kind: str
|
|
47
47
|
description: str
|
|
48
48
|
extra: ExtraField
|
|
49
|
-
internal_kind:
|
|
50
|
-
regex:
|
|
51
|
-
unique:
|
|
52
|
-
optional:
|
|
53
|
-
min_length:
|
|
54
|
-
max_length:
|
|
55
|
-
enum:
|
|
56
|
-
default_value:
|
|
57
|
-
default_factory:
|
|
49
|
+
internal_kind: type[Any] | GenericAlias | None = None
|
|
50
|
+
regex: str | None = None
|
|
51
|
+
unique: bool | None = None
|
|
52
|
+
optional: bool | None = None
|
|
53
|
+
min_length: int | None = None
|
|
54
|
+
max_length: int | None = None
|
|
55
|
+
enum: list[str] | None = None
|
|
56
|
+
default_value: Any | None = None
|
|
57
|
+
default_factory: str | None = None
|
|
58
58
|
default_to_none: bool = False
|
|
59
|
-
override_default_value:
|
|
59
|
+
override_default_value: Any | None = Field(
|
|
60
60
|
default=None,
|
|
61
61
|
description="Currently optional is defined with different defaults for the Pydantic models compared to the internal_schema dictionary",
|
|
62
62
|
)
|
|
@@ -83,7 +83,7 @@ class SchemaAttribute(BaseModel):
|
|
|
83
83
|
@property
|
|
84
84
|
def type_annotation(self) -> str:
|
|
85
85
|
if self.optional_in_model:
|
|
86
|
-
return f"
|
|
86
|
+
return f"{self.object_kind} | None"
|
|
87
87
|
|
|
88
88
|
return self.object_kind
|
|
89
89
|
|
|
@@ -150,8 +150,8 @@ class SchemaAttribute(BaseModel):
|
|
|
150
150
|
class SchemaRelationship(BaseModel):
|
|
151
151
|
name: str
|
|
152
152
|
peer: str
|
|
153
|
-
description:
|
|
154
|
-
kind:
|
|
153
|
+
description: str | None = None
|
|
154
|
+
kind: str | None = None
|
|
155
155
|
identifier: str
|
|
156
156
|
cardinality: str
|
|
157
157
|
branch: str
|
|
@@ -166,7 +166,7 @@ class SchemaNode(BaseModel):
|
|
|
166
166
|
namespace: str
|
|
167
167
|
branch: str
|
|
168
168
|
include_in_menu: bool
|
|
169
|
-
default_filter:
|
|
169
|
+
default_filter: str | None = None
|
|
170
170
|
attributes: list[SchemaAttribute]
|
|
171
171
|
relationships: list[SchemaRelationship]
|
|
172
172
|
display_labels: list[str]
|
|
@@ -199,7 +199,7 @@ class SchemaNode(BaseModel):
|
|
|
199
199
|
|
|
200
200
|
@dataclass
|
|
201
201
|
class InternalSchema:
|
|
202
|
-
version:
|
|
202
|
+
version: str | None
|
|
203
203
|
nodes: list[SchemaNode]
|
|
204
204
|
|
|
205
205
|
def to_dict(self) -> dict[str, Any]:
|
infrahub/core/schema/dropdown.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import re
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
3
|
from pydantic import field_validator
|
|
5
4
|
|
|
@@ -10,9 +9,9 @@ HTML_COLOR = re.compile(r"#[0-9a-fA-F]{6}\b")
|
|
|
10
9
|
|
|
11
10
|
class DropdownChoice(HashableModel):
|
|
12
11
|
name: str
|
|
13
|
-
description:
|
|
14
|
-
color:
|
|
15
|
-
label:
|
|
12
|
+
description: str | None = None
|
|
13
|
+
color: str | None = None
|
|
14
|
+
label: str | None = None
|
|
16
15
|
|
|
17
16
|
_sort_by: list[str] = ["name"]
|
|
18
17
|
|
|
@@ -2,21 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from pydantic import Field
|
|
8
8
|
|
|
9
|
-
from infrahub.core.constants import AllowOverrideType, HashableModelState
|
|
9
|
+
from infrahub.core.constants import AllowOverrideType, BranchSupportType, HashableModelState
|
|
10
10
|
from infrahub.core.models import HashableModel
|
|
11
11
|
from infrahub.core.schema.computed_attribute import ComputedAttribute # noqa: TC001
|
|
12
12
|
from infrahub.core.schema.dropdown import DropdownChoice # noqa: TC001
|
|
13
13
|
|
|
14
|
-
if TYPE_CHECKING:
|
|
15
|
-
from infrahub.core.constants import BranchSupportType
|
|
16
|
-
|
|
17
14
|
|
|
18
15
|
class GeneratedAttributeSchema(HashableModel):
|
|
19
|
-
id:
|
|
16
|
+
id: str | None = Field(
|
|
20
17
|
default=None, description="The ID of the attribute", json_schema_extra={"update": "not_applicable"}
|
|
21
18
|
)
|
|
22
19
|
name: str = Field(
|
|
@@ -30,43 +27,43 @@ class GeneratedAttributeSchema(HashableModel):
|
|
|
30
27
|
kind: str = Field(
|
|
31
28
|
..., description="Defines the type of the attribute.", json_schema_extra={"update": "validate_constraint"}
|
|
32
29
|
)
|
|
33
|
-
enum:
|
|
30
|
+
enum: list | None = Field(
|
|
34
31
|
default=None,
|
|
35
32
|
description="Define a list of valid values for the attribute.",
|
|
36
33
|
json_schema_extra={"update": "validate_constraint"},
|
|
37
34
|
)
|
|
38
|
-
computed_attribute:
|
|
35
|
+
computed_attribute: ComputedAttribute | None = Field(
|
|
39
36
|
default=None,
|
|
40
37
|
description="Defines how the value of this attribute will be populated.",
|
|
41
38
|
json_schema_extra={"update": "allowed"},
|
|
42
39
|
)
|
|
43
|
-
choices:
|
|
40
|
+
choices: list[DropdownChoice] | None = Field(
|
|
44
41
|
default=None,
|
|
45
42
|
description="Define a list of valid choices for a dropdown attribute.",
|
|
46
43
|
json_schema_extra={"update": "validate_constraint"},
|
|
47
44
|
)
|
|
48
|
-
regex:
|
|
45
|
+
regex: str | None = Field(
|
|
49
46
|
default=None,
|
|
50
47
|
description="Regex uses to limit the characters allowed in for the attributes.",
|
|
51
48
|
json_schema_extra={"update": "validate_constraint"},
|
|
52
49
|
)
|
|
53
|
-
max_length:
|
|
50
|
+
max_length: int | None = Field(
|
|
54
51
|
default=None,
|
|
55
52
|
description="Set a maximum number of characters allowed for a given attribute.",
|
|
56
53
|
json_schema_extra={"update": "validate_constraint"},
|
|
57
54
|
)
|
|
58
|
-
min_length:
|
|
55
|
+
min_length: int | None = Field(
|
|
59
56
|
default=None,
|
|
60
57
|
description="Set a minimum number of characters allowed for a given attribute.",
|
|
61
58
|
json_schema_extra={"update": "validate_constraint"},
|
|
62
59
|
)
|
|
63
|
-
label:
|
|
60
|
+
label: str | None = Field(
|
|
64
61
|
default=None,
|
|
65
62
|
description="Human friendly representation of the name. Will be autogenerated if not provided",
|
|
66
63
|
max_length=32,
|
|
67
64
|
json_schema_extra={"update": "allowed"},
|
|
68
65
|
)
|
|
69
|
-
description:
|
|
66
|
+
description: str | None = Field(
|
|
70
67
|
default=None,
|
|
71
68
|
description="Short description of the attribute.",
|
|
72
69
|
max_length=128,
|
|
@@ -87,17 +84,17 @@ class GeneratedAttributeSchema(HashableModel):
|
|
|
87
84
|
description="Indicate if this attribute is mandatory or optional.",
|
|
88
85
|
json_schema_extra={"update": "validate_constraint"},
|
|
89
86
|
)
|
|
90
|
-
branch:
|
|
87
|
+
branch: BranchSupportType | None = Field(
|
|
91
88
|
default=None,
|
|
92
89
|
description="Type of branch support for the attribute, if not defined it will be inherited from the node.",
|
|
93
90
|
json_schema_extra={"update": "not_supported"},
|
|
94
91
|
)
|
|
95
|
-
order_weight:
|
|
92
|
+
order_weight: int | None = Field(
|
|
96
93
|
default=None,
|
|
97
94
|
description="Number used to order the attribute in the frontend (table and view). Lowest value will be ordered first.",
|
|
98
95
|
json_schema_extra={"update": "allowed"},
|
|
99
96
|
)
|
|
100
|
-
default_value:
|
|
97
|
+
default_value: Any | None = Field(
|
|
101
98
|
default=None, description="Default value of the attribute.", json_schema_extra={"update": "allowed"}
|
|
102
99
|
)
|
|
103
100
|
inherited: bool = Field(
|
|
@@ -115,7 +112,7 @@ class GeneratedAttributeSchema(HashableModel):
|
|
|
115
112
|
description="Type of allowed override for the attribute.",
|
|
116
113
|
json_schema_extra={"update": "allowed"},
|
|
117
114
|
)
|
|
118
|
-
deprecation:
|
|
115
|
+
deprecation: str | None = Field(
|
|
119
116
|
default=None,
|
|
120
117
|
description="Mark attribute as deprecated and provide a user-friendly message to display",
|
|
121
118
|
max_length=128,
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import Optional
|
|
6
|
-
|
|
7
5
|
from pydantic import Field
|
|
8
6
|
|
|
9
7
|
from infrahub.core.constants import BranchSupportType, HashableModelState
|
|
@@ -13,7 +11,7 @@ from infrahub.core.schema.relationship_schema import RelationshipSchema # noqa:
|
|
|
13
11
|
|
|
14
12
|
|
|
15
13
|
class GeneratedBaseNodeSchema(HashableModel):
|
|
16
|
-
id:
|
|
14
|
+
id: str | None = Field(
|
|
17
15
|
default=None, description="The ID of the node", json_schema_extra={"update": "not_applicable"}
|
|
18
16
|
)
|
|
19
17
|
name: str = Field(
|
|
@@ -32,13 +30,13 @@ class GeneratedBaseNodeSchema(HashableModel):
|
|
|
32
30
|
max_length=32,
|
|
33
31
|
json_schema_extra={"update": "migration_required"},
|
|
34
32
|
)
|
|
35
|
-
description:
|
|
33
|
+
description: str | None = Field(
|
|
36
34
|
default=None,
|
|
37
35
|
description="Short description of the model, will be visible in the frontend.",
|
|
38
36
|
max_length=128,
|
|
39
37
|
json_schema_extra={"update": "allowed"},
|
|
40
38
|
)
|
|
41
|
-
label:
|
|
39
|
+
label: str | None = Field(
|
|
42
40
|
default=None,
|
|
43
41
|
description="Human friendly representation of the name/kind",
|
|
44
42
|
max_length=64,
|
|
@@ -49,48 +47,48 @@ class GeneratedBaseNodeSchema(HashableModel):
|
|
|
49
47
|
description="Type of branch support for the model.",
|
|
50
48
|
json_schema_extra={"update": "not_supported"},
|
|
51
49
|
)
|
|
52
|
-
default_filter:
|
|
50
|
+
default_filter: str | None = Field(
|
|
53
51
|
default=None,
|
|
54
52
|
description="Default filter used to search for a node in addition to its ID. (deprecated: please use human_friendly_id instead)",
|
|
55
53
|
pattern=r"^[a-z0-9\_]+$",
|
|
56
54
|
json_schema_extra={"update": "allowed"},
|
|
57
55
|
)
|
|
58
|
-
human_friendly_id:
|
|
56
|
+
human_friendly_id: list[str] | None = Field(
|
|
59
57
|
default=None,
|
|
60
58
|
description="Human friendly and unique identifier for the object.",
|
|
61
59
|
json_schema_extra={"update": "allowed"},
|
|
62
60
|
)
|
|
63
|
-
display_labels:
|
|
61
|
+
display_labels: list[str] | None = Field(
|
|
64
62
|
default=None,
|
|
65
63
|
description="List of attributes to use to generate the display label",
|
|
66
64
|
json_schema_extra={"update": "allowed"},
|
|
67
65
|
)
|
|
68
|
-
include_in_menu:
|
|
66
|
+
include_in_menu: bool | None = Field(
|
|
69
67
|
default=None,
|
|
70
68
|
description="Defines if objects of this kind should be included in the menu.",
|
|
71
69
|
json_schema_extra={"update": "allowed"},
|
|
72
70
|
)
|
|
73
|
-
menu_placement:
|
|
71
|
+
menu_placement: str | None = Field(
|
|
74
72
|
default=None,
|
|
75
73
|
description="Defines where in the menu this object should be placed.",
|
|
76
74
|
json_schema_extra={"update": "allowed"},
|
|
77
75
|
)
|
|
78
|
-
icon:
|
|
76
|
+
icon: str | None = Field(
|
|
79
77
|
default=None,
|
|
80
78
|
description="Defines the icon to use in the menu. Must be a valid value from the MDI library https://icon-sets.iconify.design/mdi/",
|
|
81
79
|
json_schema_extra={"update": "allowed"},
|
|
82
80
|
)
|
|
83
|
-
order_by:
|
|
81
|
+
order_by: list[str] | None = Field(
|
|
84
82
|
default=None,
|
|
85
83
|
description="List of attributes to use to order the results by default",
|
|
86
84
|
json_schema_extra={"update": "allowed"},
|
|
87
85
|
)
|
|
88
|
-
uniqueness_constraints:
|
|
86
|
+
uniqueness_constraints: list[list[str]] | None = Field(
|
|
89
87
|
default=None,
|
|
90
88
|
description="List of multi-element uniqueness constraints that can combine relationships and attributes",
|
|
91
89
|
json_schema_extra={"update": "validate_constraint"},
|
|
92
90
|
)
|
|
93
|
-
documentation:
|
|
91
|
+
documentation: str | None = Field(
|
|
94
92
|
default=None,
|
|
95
93
|
description="Link to a documentation associated with this object, can be internal or external.",
|
|
96
94
|
json_schema_extra={"update": "allowed"},
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import Optional
|
|
6
|
-
|
|
7
5
|
from pydantic import Field
|
|
8
6
|
|
|
9
7
|
from infrahub.core.schema.basenode_schema import BaseNodeSchema
|
|
@@ -25,17 +23,17 @@ class GeneratedNodeSchema(BaseNodeSchema):
|
|
|
25
23
|
description="Indicate if an object template schema should be generated for this schema",
|
|
26
24
|
json_schema_extra={"update": "allowed"},
|
|
27
25
|
)
|
|
28
|
-
hierarchy:
|
|
26
|
+
hierarchy: str | None = Field(
|
|
29
27
|
default=None,
|
|
30
28
|
description="Internal value to track the name of the Hierarchy, must match the name of a Generic supporting hierarchical mode",
|
|
31
29
|
json_schema_extra={"update": "validate_constraint"},
|
|
32
30
|
)
|
|
33
|
-
parent:
|
|
31
|
+
parent: str | None = Field(
|
|
34
32
|
default=None,
|
|
35
33
|
description="Expected Kind for the parent node in a Hierarchy, default to the main generic defined if not defined.",
|
|
36
34
|
json_schema_extra={"update": "validate_constraint"},
|
|
37
35
|
)
|
|
38
|
-
children:
|
|
36
|
+
children: str | None = Field(
|
|
39
37
|
default=None,
|
|
40
38
|
description="Expected Kind for the children nodes in a Hierarchy, default to the main generic defined if not defined.",
|
|
41
39
|
json_schema_extra={"update": "validate_constraint"},
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import Optional
|
|
6
|
-
|
|
7
5
|
from pydantic import Field
|
|
8
6
|
|
|
9
7
|
from infrahub.core.constants import (
|
|
@@ -19,7 +17,7 @@ from infrahub.core.models import HashableModel
|
|
|
19
17
|
|
|
20
18
|
|
|
21
19
|
class GeneratedRelationshipSchema(HashableModel):
|
|
22
|
-
id:
|
|
20
|
+
id: str | None = Field(
|
|
23
21
|
default=None, description="The ID of the relationship schema", json_schema_extra={"update": "not_applicable"}
|
|
24
22
|
)
|
|
25
23
|
name: str = Field(
|
|
@@ -41,19 +39,19 @@ class GeneratedRelationshipSchema(HashableModel):
|
|
|
41
39
|
description="Defines the type of the relationship.",
|
|
42
40
|
json_schema_extra={"update": "allowed"},
|
|
43
41
|
)
|
|
44
|
-
label:
|
|
42
|
+
label: str | None = Field(
|
|
45
43
|
default=None,
|
|
46
44
|
description="Human friendly representation of the name. Will be autogenerated if not provided",
|
|
47
45
|
max_length=32,
|
|
48
46
|
json_schema_extra={"update": "allowed"},
|
|
49
47
|
)
|
|
50
|
-
description:
|
|
48
|
+
description: str | None = Field(
|
|
51
49
|
default=None,
|
|
52
50
|
description="Short description of the relationship.",
|
|
53
51
|
max_length=128,
|
|
54
52
|
json_schema_extra={"update": "allowed"},
|
|
55
53
|
)
|
|
56
|
-
identifier:
|
|
54
|
+
identifier: str | None = Field(
|
|
57
55
|
default=None,
|
|
58
56
|
description="Unique identifier of the relationship within a model, identifiers must match to traverse a relationship on both direction.",
|
|
59
57
|
pattern=r"^[a-z0-9\_]+$",
|
|
@@ -75,7 +73,7 @@ class GeneratedRelationshipSchema(HashableModel):
|
|
|
75
73
|
description="Defines the maximum objects allowed on the other side of the relationship.",
|
|
76
74
|
json_schema_extra={"update": "validate_constraint"},
|
|
77
75
|
)
|
|
78
|
-
order_weight:
|
|
76
|
+
order_weight: int | None = Field(
|
|
79
77
|
default=None,
|
|
80
78
|
description="Number used to order the relationship in the frontend (table and view). Lowest value will be ordered first.",
|
|
81
79
|
json_schema_extra={"update": "allowed"},
|
|
@@ -85,7 +83,7 @@ class GeneratedRelationshipSchema(HashableModel):
|
|
|
85
83
|
description="Indicate if this relationship is mandatory or optional.",
|
|
86
84
|
json_schema_extra={"update": "validate_constraint"},
|
|
87
85
|
)
|
|
88
|
-
branch:
|
|
86
|
+
branch: BranchSupportType | None = Field(
|
|
89
87
|
default=None,
|
|
90
88
|
description="Type of branch support for the relatioinship, if not defined it will be determine based both peers.",
|
|
91
89
|
json_schema_extra={"update": "not_supported"},
|
|
@@ -100,7 +98,7 @@ class GeneratedRelationshipSchema(HashableModel):
|
|
|
100
98
|
description="Defines the direction of the relationship, Unidirectional relationship are required when the same model is on both side.",
|
|
101
99
|
json_schema_extra={"update": "not_supported"},
|
|
102
100
|
)
|
|
103
|
-
hierarchical:
|
|
101
|
+
hierarchical: str | None = Field(
|
|
104
102
|
default=None,
|
|
105
103
|
description="Internal attribute to track the type of hierarchy this relationship is part of, must match a valid Generic Kind",
|
|
106
104
|
json_schema_extra={"update": "not_supported"},
|
|
@@ -110,7 +108,7 @@ class GeneratedRelationshipSchema(HashableModel):
|
|
|
110
108
|
description="Expected state of the relationship after loading the schema",
|
|
111
109
|
json_schema_extra={"update": "not_applicable"},
|
|
112
110
|
)
|
|
113
|
-
on_delete:
|
|
111
|
+
on_delete: RelationshipDeleteBehavior | None = Field(
|
|
114
112
|
default=None,
|
|
115
113
|
description="Default is no-action. If cascade, related node(s) are deleted when this node is deleted.",
|
|
116
114
|
json_schema_extra={"update": "allowed"},
|
|
@@ -125,7 +123,7 @@ class GeneratedRelationshipSchema(HashableModel):
|
|
|
125
123
|
description="Set the relationship as read-only, users won't be able to change its value.",
|
|
126
124
|
json_schema_extra={"update": "allowed"},
|
|
127
125
|
)
|
|
128
|
-
deprecation:
|
|
126
|
+
deprecation: str | None = Field(
|
|
129
127
|
default=None,
|
|
130
128
|
description="Mark relationship as deprecated and provide a user-friendly message to display",
|
|
131
129
|
max_length=128,
|