infrahub-server 1.4.6__py3-none-any.whl → 1.4.8__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/actions/schema.py +8 -4
- infrahub/api/oauth2.py +5 -2
- infrahub/api/oidc.py +7 -3
- infrahub/artifacts/models.py +2 -1
- infrahub/auth.py +19 -0
- infrahub/config.py +16 -1
- infrahub/core/graph/__init__.py +1 -1
- infrahub/core/migrations/graph/__init__.py +2 -0
- infrahub/core/migrations/graph/m039_ipam_reconcile.py +274 -0
- infrahub/core/query/branch.py +3 -3
- infrahub/core/query/relationship.py +17 -1
- infrahub/core/query/subquery.py +2 -2
- infrahub/core/relationship/model.py +7 -3
- infrahub/database/__init__.py +11 -3
- infrahub/events/artifact_action.py +2 -0
- infrahub/git/base.py +2 -2
- infrahub/git/integrator.py +1 -0
- infrahub/git/models.py +1 -0
- infrahub/git/tasks.py +1 -0
- infrahub/groups/models.py +3 -1
- infrahub/proposed_change/tasks.py +1 -0
- infrahub/worker.py +11 -0
- infrahub/workflows/catalogue.py +1 -1
- {infrahub_server-1.4.6.dist-info → infrahub_server-1.4.8.dist-info}/METADATA +1 -1
- {infrahub_server-1.4.6.dist-info → infrahub_server-1.4.8.dist-info}/RECORD +28 -27
- {infrahub_server-1.4.6.dist-info → infrahub_server-1.4.8.dist-info}/LICENSE.txt +0 -0
- {infrahub_server-1.4.6.dist-info → infrahub_server-1.4.8.dist-info}/WHEEL +0 -0
- {infrahub_server-1.4.6.dist-info → infrahub_server-1.4.8.dist-info}/entry_points.txt +0 -0
infrahub/actions/schema.py
CHANGED
|
@@ -50,7 +50,7 @@ core_trigger_rule = GenericSchema(
|
|
|
50
50
|
description="Indicates if this trigger is enabled or if it's just prepared, could be useful as you are setting up a trigger",
|
|
51
51
|
optional=False,
|
|
52
52
|
default_value=True,
|
|
53
|
-
order_weight=
|
|
53
|
+
order_weight=250,
|
|
54
54
|
),
|
|
55
55
|
Attr(
|
|
56
56
|
name="branch_scope",
|
|
@@ -59,7 +59,7 @@ core_trigger_rule = GenericSchema(
|
|
|
59
59
|
choices=BranchScope.available_types(),
|
|
60
60
|
default_value=BranchScope.DEFAULT_BRANCH.value.name,
|
|
61
61
|
optional=False,
|
|
62
|
-
order_weight=
|
|
62
|
+
order_weight=260,
|
|
63
63
|
allow_override=AllowOverrideType.NONE,
|
|
64
64
|
),
|
|
65
65
|
],
|
|
@@ -270,8 +270,10 @@ core_node_trigger_attribute_match = NodeSchema(
|
|
|
270
270
|
label="Node Trigger Attribute Match",
|
|
271
271
|
branch=BranchSupportType.AGNOSTIC,
|
|
272
272
|
generate_profile=False,
|
|
273
|
-
inherit_from=[
|
|
273
|
+
inherit_from=[core_node_trigger_match.kind],
|
|
274
274
|
display_labels=["attribute_name__value"],
|
|
275
|
+
uniqueness_constraints=[["trigger", "attribute_name__value"]],
|
|
276
|
+
human_friendly_id=["trigger__name__value", "attribute_name__value"],
|
|
275
277
|
attributes=[
|
|
276
278
|
Attr(
|
|
277
279
|
name="attribute_name",
|
|
@@ -319,8 +321,10 @@ core_node_trigger_relationship_match = NodeSchema(
|
|
|
319
321
|
label="Node Trigger Relationship Match",
|
|
320
322
|
branch=BranchSupportType.AGNOSTIC,
|
|
321
323
|
generate_profile=False,
|
|
322
|
-
inherit_from=[
|
|
324
|
+
inherit_from=[core_node_trigger_match.kind],
|
|
323
325
|
display_labels=["relationship_name__value", "modification_type__value"],
|
|
326
|
+
uniqueness_constraints=[["trigger", "relationship_name__value"]],
|
|
327
|
+
human_friendly_id=["trigger__name__value", "relationship_name__value"],
|
|
324
328
|
attributes=[
|
|
325
329
|
Attr(
|
|
326
330
|
name="relationship_name",
|
infrahub/api/oauth2.py
CHANGED
|
@@ -11,7 +11,7 @@ from opentelemetry import trace
|
|
|
11
11
|
|
|
12
12
|
from infrahub import config, models
|
|
13
13
|
from infrahub.api.dependencies import get_db
|
|
14
|
-
from infrahub.auth import signin_sso_account
|
|
14
|
+
from infrahub.auth import get_groups_from_provider, signin_sso_account
|
|
15
15
|
from infrahub.exceptions import GatewayError, ProcessingError
|
|
16
16
|
from infrahub.log import get_logger
|
|
17
17
|
from infrahub.message_bus.types import KVTTL
|
|
@@ -109,7 +109,10 @@ async def token(
|
|
|
109
109
|
|
|
110
110
|
_validate_response(response=userinfo_response)
|
|
111
111
|
user_info = userinfo_response.json()
|
|
112
|
-
sso_groups = user_info.get("groups", [])
|
|
112
|
+
sso_groups = user_info.get("groups", []) or await get_groups_from_provider(
|
|
113
|
+
provider=provider, service=service, payload=payload, user_info=user_info
|
|
114
|
+
)
|
|
115
|
+
|
|
113
116
|
if not sso_groups and config.SETTINGS.security.sso_user_default_group:
|
|
114
117
|
sso_groups = [config.SETTINGS.security.sso_user_default_group]
|
|
115
118
|
|
infrahub/api/oidc.py
CHANGED
|
@@ -13,7 +13,7 @@ from pydantic import BaseModel, HttpUrl
|
|
|
13
13
|
|
|
14
14
|
from infrahub import config, models
|
|
15
15
|
from infrahub.api.dependencies import get_db
|
|
16
|
-
from infrahub.auth import signin_sso_account
|
|
16
|
+
from infrahub.auth import get_groups_from_provider, signin_sso_account
|
|
17
17
|
from infrahub.exceptions import GatewayError, ProcessingError
|
|
18
18
|
from infrahub.log import get_logger
|
|
19
19
|
from infrahub.message_bus.types import KVTTL
|
|
@@ -149,8 +149,12 @@ async def token(
|
|
|
149
149
|
|
|
150
150
|
_validate_response(response=userinfo_response)
|
|
151
151
|
user_info: dict[str, Any] = userinfo_response.json()
|
|
152
|
-
sso_groups =
|
|
153
|
-
|
|
152
|
+
sso_groups = (
|
|
153
|
+
user_info.get("groups")
|
|
154
|
+
or await _get_id_token_groups(
|
|
155
|
+
oidc_config=oidc_config, service=service, payload=payload, client_id=provider.client_id
|
|
156
|
+
)
|
|
157
|
+
or await get_groups_from_provider(provider=provider, service=service, payload=payload, user_info=user_info)
|
|
154
158
|
)
|
|
155
159
|
|
|
156
160
|
if not sso_groups and config.SETTINGS.security.sso_user_default_group:
|
infrahub/artifacts/models.py
CHANGED
|
@@ -7,7 +7,8 @@ class CheckArtifactCreate(BaseModel):
|
|
|
7
7
|
"""Runs a check to verify the creation of an artifact."""
|
|
8
8
|
|
|
9
9
|
artifact_name: str = Field(..., description="Name of the artifact")
|
|
10
|
-
artifact_definition: str = Field(..., description="The
|
|
10
|
+
artifact_definition: str = Field(..., description="The ID of the artifact definition")
|
|
11
|
+
artifact_definition_name: str = Field(..., description="The name of the artifact definition")
|
|
11
12
|
commit: str = Field(..., description="The commit to target")
|
|
12
13
|
content_type: str = Field(..., description="Content type of the artifact")
|
|
13
14
|
transform_type: str = Field(..., description="The type of transform associated with this artifact")
|
infrahub/auth.py
CHANGED
|
@@ -10,6 +10,7 @@ import jwt
|
|
|
10
10
|
from pydantic import BaseModel
|
|
11
11
|
|
|
12
12
|
from infrahub import config, models
|
|
13
|
+
from infrahub.config import SecurityOAuth2Google, SecurityOAuth2Settings, SecurityOIDCGoogle, SecurityOIDCSettings
|
|
13
14
|
from infrahub.core.account import validate_token
|
|
14
15
|
from infrahub.core.constants import AccountStatus, InfrahubKind
|
|
15
16
|
from infrahub.core.manager import NodeManager
|
|
@@ -21,6 +22,7 @@ from infrahub.exceptions import AuthorizationError, NodeNotFoundError
|
|
|
21
22
|
if TYPE_CHECKING:
|
|
22
23
|
from infrahub.core.protocols import CoreGenericAccount
|
|
23
24
|
from infrahub.database import InfrahubDatabase
|
|
25
|
+
from infrahub.services import InfrahubServices
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class AuthType(str, Enum):
|
|
@@ -237,3 +239,20 @@ async def invalidate_refresh_token(db: InfrahubDatabase, token_id: str) -> None:
|
|
|
237
239
|
refresh_token = await NodeManager.get_one(id=token_id, db=db)
|
|
238
240
|
if refresh_token:
|
|
239
241
|
await refresh_token.delete(db=db)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
async def get_groups_from_provider(
|
|
245
|
+
provider: SecurityOAuth2Settings | SecurityOIDCSettings, service: InfrahubServices, payload: dict, user_info: dict
|
|
246
|
+
) -> list[str]:
|
|
247
|
+
if isinstance(provider, (SecurityOAuth2Google, SecurityOIDCGoogle)):
|
|
248
|
+
# Poor man's workaround to fetch user groups from Google
|
|
249
|
+
if provider.fetch_groups:
|
|
250
|
+
groups_response = await service.http.get(
|
|
251
|
+
f"{provider.cloudidentity_url}?query=member_key_id == '{user_info['email']}'",
|
|
252
|
+
headers={"Authorization": f"{payload.get('token_type')} {payload.get('access_token')}"},
|
|
253
|
+
)
|
|
254
|
+
group_memberships = groups_response.json()
|
|
255
|
+
if "memberships" in group_memberships:
|
|
256
|
+
return [membership["groupKey"]["id"] for membership in group_memberships["memberships"]]
|
|
257
|
+
|
|
258
|
+
return []
|
infrahub/config.py
CHANGED
|
@@ -281,7 +281,6 @@ class DatabaseSettings(BaseSettings):
|
|
|
281
281
|
query_size_limit: int = Field(
|
|
282
282
|
default=5_000,
|
|
283
283
|
ge=1,
|
|
284
|
-
le=20_000,
|
|
285
284
|
description="The max number of records to fetch in a single query before performing internal pagination.",
|
|
286
285
|
)
|
|
287
286
|
max_depth_search_hierarchy: int = Field(
|
|
@@ -545,6 +544,14 @@ class SecurityOIDCGoogle(SecurityOIDCSettings):
|
|
|
545
544
|
discovery_url: str = Field(default="https://accounts.google.com/.well-known/openid-configuration")
|
|
546
545
|
icon: str = Field(default="mdi:google")
|
|
547
546
|
display_label: str = Field(default="Google")
|
|
547
|
+
fetch_groups: bool = Field(
|
|
548
|
+
default=False,
|
|
549
|
+
description="Whether to use Cloud Identity API to fetch user groups. Note: requires additional scope: https://www.googleapis.com/auth/cloud-identity.groups.readonly",
|
|
550
|
+
)
|
|
551
|
+
cloudidentity_url: str = Field(
|
|
552
|
+
default="https://cloudidentity.googleapis.com/v1/groups/-/memberships:searchDirectGroups",
|
|
553
|
+
description="Google Cloud endpoint for Cloud Identity. Using searchDirectGroups by default because it is available for the Free plan",
|
|
554
|
+
)
|
|
548
555
|
|
|
549
556
|
|
|
550
557
|
class SecurityOIDCProvider1(SecurityOIDCSettings):
|
|
@@ -605,6 +612,14 @@ class SecurityOAuth2Google(SecurityOAuth2Settings):
|
|
|
605
612
|
userinfo_url: str = Field(default="https://www.googleapis.com/oauth2/v3/userinfo")
|
|
606
613
|
icon: str = Field(default="mdi:google")
|
|
607
614
|
display_label: str = Field(default="Google")
|
|
615
|
+
fetch_groups: bool = Field(
|
|
616
|
+
default=False,
|
|
617
|
+
description="Whether to use Cloud Identity API to fetch user groups. Note: requires additional scopes: https://www.googleapis.com/auth/cloud-identity.groups.readonly",
|
|
618
|
+
)
|
|
619
|
+
cloudidentity_url: str = Field(
|
|
620
|
+
default="https://cloudidentity.googleapis.com/v1/groups/-/memberships:searchDirectGroups",
|
|
621
|
+
description="Google Cloud endpoint for Cloud Identity. Using searchDirectGroups by default because it is available for the Free plan",
|
|
622
|
+
)
|
|
608
623
|
|
|
609
624
|
|
|
610
625
|
class SecurityOAuth2ProviderSettings(BaseModel):
|
infrahub/core/graph/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
GRAPH_VERSION =
|
|
1
|
+
GRAPH_VERSION = 39
|
|
@@ -40,6 +40,7 @@ from .m035_orphan_relationships import Migration035
|
|
|
40
40
|
from .m036_drop_attr_value_index import Migration036
|
|
41
41
|
from .m037_index_attr_vals import Migration037
|
|
42
42
|
from .m038_redo_0000_prefix_fix import Migration038
|
|
43
|
+
from .m039_ipam_reconcile import Migration039
|
|
43
44
|
|
|
44
45
|
if TYPE_CHECKING:
|
|
45
46
|
from infrahub.core.root import Root
|
|
@@ -85,6 +86,7 @@ MIGRATIONS: list[type[GraphMigration | InternalSchemaMigration | ArbitraryMigrat
|
|
|
85
86
|
Migration036,
|
|
86
87
|
Migration037,
|
|
87
88
|
Migration038,
|
|
89
|
+
Migration039,
|
|
88
90
|
]
|
|
89
91
|
|
|
90
92
|
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import ipaddress
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from rich.console import Console
|
|
8
|
+
from rich.progress import Progress
|
|
9
|
+
|
|
10
|
+
from infrahub.core.branch.models import Branch
|
|
11
|
+
from infrahub.core.constants import InfrahubKind
|
|
12
|
+
from infrahub.core.initialization import initialization
|
|
13
|
+
from infrahub.core.ipam.reconciler import IpamReconciler
|
|
14
|
+
from infrahub.core.migrations.shared import MigrationResult
|
|
15
|
+
from infrahub.core.query import Query, QueryType
|
|
16
|
+
from infrahub.lock import initialize_lock
|
|
17
|
+
from infrahub.log import get_logger
|
|
18
|
+
|
|
19
|
+
from ..shared import ArbitraryMigration
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from infrahub.core.ipam.constants import AllIPTypes
|
|
23
|
+
from infrahub.database import InfrahubDatabase
|
|
24
|
+
|
|
25
|
+
log = get_logger()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class IpNodeDetails:
|
|
30
|
+
branch: str
|
|
31
|
+
ip_value: AllIPTypes
|
|
32
|
+
namespace: str
|
|
33
|
+
node_uuid: str
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class FindNodesToReconcileQuery(Query):
|
|
37
|
+
name = "find_nodes_to_reconcile_query"
|
|
38
|
+
type = QueryType.READ
|
|
39
|
+
insert_return = False
|
|
40
|
+
|
|
41
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
|
|
42
|
+
self.params.update(
|
|
43
|
+
{
|
|
44
|
+
"prefix_kind": InfrahubKind.IPPREFIX,
|
|
45
|
+
"address_kind": InfrahubKind.IPADDRESS,
|
|
46
|
+
"prefix_attribute_name": "prefix",
|
|
47
|
+
"address_attribute_name": "address",
|
|
48
|
+
"attr_names": ["prefix", "address"],
|
|
49
|
+
"namespace_relationship_names": ["ip_namespace__ip_prefix", "ip_namespace__ip_address"],
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
query = """
|
|
53
|
+
MATCH (root:Root)
|
|
54
|
+
LIMIT 1
|
|
55
|
+
WITH root.default_branch AS default_branch
|
|
56
|
+
// ------------------
|
|
57
|
+
// find prefixes and addresses that exist on the default branch
|
|
58
|
+
// ------------------
|
|
59
|
+
MATCH (ip_node:%(prefix_kind)s|%(address_kind)s)-[e:IS_PART_OF {branch: default_branch, status: "active"}]->(:Root)
|
|
60
|
+
WHERE e.to IS NULL
|
|
61
|
+
AND NOT exists((ip_node)-[:IS_PART_OF {branch: default_branch, status: "deleted"}]->(:Root))
|
|
62
|
+
// ------------------
|
|
63
|
+
// check if this node has its prefix/address updated on a branch (or branches)
|
|
64
|
+
// ------------------
|
|
65
|
+
CALL (ip_node, default_branch) {
|
|
66
|
+
OPTIONAL MATCH (ip_node)-[:HAS_ATTRIBUTE {branch: default_branch, status: "active"}]->
|
|
67
|
+
(attr:Attribute)-[has_value_e:HAS_VALUE {status: "active"}]->(attr_val)
|
|
68
|
+
WHERE attr.name IN $attr_names
|
|
69
|
+
AND has_value_e.branch_level = 2
|
|
70
|
+
AND (
|
|
71
|
+
($prefix_kind IN labels(ip_node) AND attr.name = $prefix_attribute_name)
|
|
72
|
+
OR ($address_kind IN labels(ip_node) AND attr.name = $address_attribute_name)
|
|
73
|
+
)
|
|
74
|
+
RETURN collect(DISTINCT has_value_e.branch) AS attr_update_branches
|
|
75
|
+
}
|
|
76
|
+
CALL (ip_node, default_branch) {
|
|
77
|
+
OPTIONAL MATCH (ip_node)-[:IS_RELATED {status: "active"}]-
|
|
78
|
+
(rel:Relationship)-[e2:IS_RELATED {status: "active"}]-(peer:Node)
|
|
79
|
+
WHERE rel.name IN $namespace_relationship_names
|
|
80
|
+
AND e2.branch_level = 2
|
|
81
|
+
RETURN collect(DISTINCT e2.branch) AS namespace_update_branches
|
|
82
|
+
}
|
|
83
|
+
// ------------------
|
|
84
|
+
// filter to only those prefixes/addresses with an update that we care about on a branch
|
|
85
|
+
// ------------------
|
|
86
|
+
WITH DISTINCT ip_node, default_branch, attr_update_branches, namespace_update_branches
|
|
87
|
+
WHERE size(attr_update_branches) > 0 OR size(namespace_update_branches) > 0
|
|
88
|
+
// ------------------
|
|
89
|
+
// deduplicate branch lists and return one row for each branch
|
|
90
|
+
// ------------------
|
|
91
|
+
CALL (attr_update_branches, namespace_update_branches) {
|
|
92
|
+
UNWIND attr_update_branches + namespace_update_branches AS branch
|
|
93
|
+
RETURN DISTINCT branch
|
|
94
|
+
}
|
|
95
|
+
WITH default_branch, branch, ip_node
|
|
96
|
+
// ------------------
|
|
97
|
+
// confirm node is still active on this branch
|
|
98
|
+
// ------------------
|
|
99
|
+
MATCH (ip_node)
|
|
100
|
+
WHERE NOT exists((ip_node)-[:IS_PART_OF {branch: branch, status: "deleted"}]->(:Root))
|
|
101
|
+
// ------------------
|
|
102
|
+
// get branched_from time for each branch
|
|
103
|
+
// ------------------
|
|
104
|
+
CALL (branch) {
|
|
105
|
+
MATCH (b:Branch {name: branch})
|
|
106
|
+
RETURN b.branched_from AS branched_from
|
|
107
|
+
}
|
|
108
|
+
// ------------------
|
|
109
|
+
// get latest namespace on this branch
|
|
110
|
+
// ------------------
|
|
111
|
+
CALL (default_branch, branch, branched_from, ip_node) {
|
|
112
|
+
MATCH (ip_node)-[e1:IS_RELATED]-(rel:Relationship)-[e2:IS_RELATED]-(peer:%(namespace_kind)s)
|
|
113
|
+
WHERE rel.name IN $namespace_relationship_names
|
|
114
|
+
AND (
|
|
115
|
+
e1.branch = branch
|
|
116
|
+
OR (e1.branch = default_branch AND e1.from < branched_from)
|
|
117
|
+
)
|
|
118
|
+
AND e1.to IS NULL
|
|
119
|
+
AND (
|
|
120
|
+
e2.branch = branch
|
|
121
|
+
OR (e2.branch = default_branch AND e2.from < branched_from)
|
|
122
|
+
)
|
|
123
|
+
AND e2.to IS NULL
|
|
124
|
+
WITH peer, e1.status = "active" AND e2.status = "active" AS is_active
|
|
125
|
+
ORDER BY e2.branch_level DESC, e2.from DESC, e2.status ASC, e1.branch_level DESC, e1.from DESC, e1.status ASC
|
|
126
|
+
LIMIT 1
|
|
127
|
+
WITH peer
|
|
128
|
+
WHERE is_active = TRUE
|
|
129
|
+
RETURN peer.uuid AS namespace_uuid
|
|
130
|
+
}
|
|
131
|
+
// ------------------
|
|
132
|
+
// get latest prefix/address value on this branch
|
|
133
|
+
// ------------------
|
|
134
|
+
CALL (default_branch, branch, branched_from, ip_node) {
|
|
135
|
+
MATCH (ip_node)-[e1:HAS_ATTRIBUTE]->(attr:Attribute)-[e2:HAS_VALUE]->(av)
|
|
136
|
+
WHERE attr.name IN $attr_names
|
|
137
|
+
AND (
|
|
138
|
+
($prefix_kind IN labels(ip_node) AND attr.name = $prefix_attribute_name)
|
|
139
|
+
OR ($address_kind IN labels(ip_node) AND attr.name = $address_attribute_name)
|
|
140
|
+
)
|
|
141
|
+
AND (
|
|
142
|
+
e1.branch = branch
|
|
143
|
+
OR (e1.branch = default_branch AND e1.from < branched_from)
|
|
144
|
+
)
|
|
145
|
+
AND e1.to IS NULL
|
|
146
|
+
AND (
|
|
147
|
+
e2.branch = branch
|
|
148
|
+
OR (e2.branch = default_branch AND e2.from < branched_from)
|
|
149
|
+
)
|
|
150
|
+
AND e2.to IS NULL
|
|
151
|
+
WITH attr, av, e1.status = "active" AND e2.status = "active" AS is_active
|
|
152
|
+
ORDER BY e2.branch_level DESC, e2.from DESC, e2.status ASC, e1.branch_level DESC, e1.from DESC, e1.status ASC
|
|
153
|
+
LIMIT 1
|
|
154
|
+
WITH attr, av
|
|
155
|
+
WHERE is_active = TRUE
|
|
156
|
+
RETURN CASE
|
|
157
|
+
WHEN attr.name = $prefix_attribute_name THEN av.value
|
|
158
|
+
ELSE NULL
|
|
159
|
+
END AS prefix_value,
|
|
160
|
+
CASE
|
|
161
|
+
WHEN attr.name = $address_attribute_name THEN av.value
|
|
162
|
+
ELSE NULL
|
|
163
|
+
END AS address_value
|
|
164
|
+
}
|
|
165
|
+
RETURN branch, namespace_uuid, ip_node.uuid AS node_uuid, prefix_value, address_value
|
|
166
|
+
""" % {
|
|
167
|
+
"prefix_kind": InfrahubKind.IPPREFIX,
|
|
168
|
+
"address_kind": InfrahubKind.IPADDRESS,
|
|
169
|
+
"namespace_kind": InfrahubKind.IPNAMESPACE,
|
|
170
|
+
}
|
|
171
|
+
self.add_to_query(query)
|
|
172
|
+
self.return_labels = ["branch", "namespace_uuid", "node_uuid", "prefix_value", "address_value"]
|
|
173
|
+
|
|
174
|
+
def get_nodes_to_reconcile(self) -> list[IpNodeDetails]:
|
|
175
|
+
ip_node_details = []
|
|
176
|
+
for result in self.get_results():
|
|
177
|
+
prefix_value = result.get_as_str("prefix_value")
|
|
178
|
+
address_value = result.get_as_str("address_value")
|
|
179
|
+
if prefix_value:
|
|
180
|
+
ip_value: AllIPTypes = ipaddress.ip_network(address=prefix_value)
|
|
181
|
+
elif address_value:
|
|
182
|
+
ip_value = ipaddress.ip_interface(address=address_value)
|
|
183
|
+
else:
|
|
184
|
+
continue
|
|
185
|
+
ip_node_details.append(
|
|
186
|
+
IpNodeDetails(
|
|
187
|
+
branch=result.get_as_type("branch", str),
|
|
188
|
+
ip_value=ip_value,
|
|
189
|
+
namespace=result.get_as_type("namespace_uuid", str),
|
|
190
|
+
node_uuid=result.get_as_type("node_uuid", str),
|
|
191
|
+
)
|
|
192
|
+
)
|
|
193
|
+
return ip_node_details
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class DeleteSelfParentRelationshipsQuery(Query):
|
|
197
|
+
name = "delete_self_parent_relationships"
|
|
198
|
+
type = QueryType.WRITE
|
|
199
|
+
insert_return = False
|
|
200
|
+
|
|
201
|
+
def __init__(self, uuids_to_check: list[str], **kwargs: Any) -> None:
|
|
202
|
+
super().__init__(**kwargs)
|
|
203
|
+
self.uuids_to_check = uuids_to_check
|
|
204
|
+
|
|
205
|
+
async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
|
|
206
|
+
self.params["uuids_to_check"] = self.uuids_to_check
|
|
207
|
+
query = """
|
|
208
|
+
MATCH (n:Node)-[e1:IS_RELATED]->(:Relationship {name: "parent__child"})-[e2:IS_RELATED {branch: e1.branch, status: e1.status, from: e1.from}]->(n)
|
|
209
|
+
WHERE n.uuid IN $uuids_to_check
|
|
210
|
+
DELETE e1, e2
|
|
211
|
+
"""
|
|
212
|
+
self.add_to_query(query)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class Migration039(ArbitraryMigration):
|
|
216
|
+
"""
|
|
217
|
+
Identify all IP prefixes/addresses that have been updated on a branch and reconcile them on that branch
|
|
218
|
+
If any of the identified IP prefixes/addresses are their own parent/child, delete those illegal edges before reconciling.
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
name: str = "039_ipam_reconcile_updated"
|
|
222
|
+
minimum_version: int = 38
|
|
223
|
+
|
|
224
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
225
|
+
super().__init__(*args, **kwargs)
|
|
226
|
+
self._reconcilers_by_branch: dict[str, IpamReconciler] = {}
|
|
227
|
+
|
|
228
|
+
async def _get_reconciler(self, db: InfrahubDatabase, branch_name: str) -> IpamReconciler:
|
|
229
|
+
if branch_name not in self._reconcilers_by_branch:
|
|
230
|
+
branch = await Branch.get_by_name(db=db, name=branch_name)
|
|
231
|
+
self._reconcilers_by_branch[branch_name] = IpamReconciler(db=db, branch=branch)
|
|
232
|
+
return self._reconcilers_by_branch[branch_name]
|
|
233
|
+
|
|
234
|
+
async def validate_migration(self, db: InfrahubDatabase) -> MigrationResult: # noqa: ARG002
|
|
235
|
+
return MigrationResult()
|
|
236
|
+
|
|
237
|
+
async def execute(self, db: InfrahubDatabase) -> MigrationResult:
|
|
238
|
+
console = Console()
|
|
239
|
+
result = MigrationResult()
|
|
240
|
+
# load schemas from database into registry
|
|
241
|
+
initialize_lock()
|
|
242
|
+
await initialization(db=db)
|
|
243
|
+
|
|
244
|
+
console.print("Identifying IP prefixes/addresses to reconcile...", end="")
|
|
245
|
+
find_nodes_query = await FindNodesToReconcileQuery.init(db=db)
|
|
246
|
+
await find_nodes_query.execute(db=db)
|
|
247
|
+
console.print("done")
|
|
248
|
+
|
|
249
|
+
# we need to delete the self-parent relationships before reconciling b/c the
|
|
250
|
+
# reconciler cannot correctly handle a prefix that is its own parent
|
|
251
|
+
ip_node_details_list = find_nodes_query.get_nodes_to_reconcile()
|
|
252
|
+
uuids_to_check = {ip_node_details.node_uuid for ip_node_details in ip_node_details_list}
|
|
253
|
+
console.print(f"{len(ip_node_details_list)} IP prefixes/addresses will be reconciled")
|
|
254
|
+
|
|
255
|
+
console.print("Deleting any self-parent relationships...", end="")
|
|
256
|
+
delete_self_parent_relationships_query = await DeleteSelfParentRelationshipsQuery.init(
|
|
257
|
+
db=db, uuids_to_check=list(uuids_to_check)
|
|
258
|
+
)
|
|
259
|
+
await delete_self_parent_relationships_query.execute(db=db)
|
|
260
|
+
console.print("done")
|
|
261
|
+
|
|
262
|
+
with Progress() as progress:
|
|
263
|
+
reconcile_task = progress.add_task("Reconciling IP prefixes/addresses...", total=len(ip_node_details_list))
|
|
264
|
+
|
|
265
|
+
for ip_node_details in ip_node_details_list:
|
|
266
|
+
reconciler = await self._get_reconciler(db=db, branch_name=ip_node_details.branch)
|
|
267
|
+
await reconciler.reconcile(
|
|
268
|
+
ip_value=ip_node_details.ip_value,
|
|
269
|
+
namespace=ip_node_details.namespace,
|
|
270
|
+
node_uuid=ip_node_details.node_uuid,
|
|
271
|
+
)
|
|
272
|
+
progress.update(reconcile_task, advance=1)
|
|
273
|
+
|
|
274
|
+
return result
|
infrahub/core/query/branch.py
CHANGED
|
@@ -31,7 +31,7 @@ WHERE e.branch = $branch_name
|
|
|
31
31
|
CALL (n) {
|
|
32
32
|
OPTIONAL MATCH (n)-[:IS_RELATED {branch: $global_branch_name}]-(rel:Relationship)
|
|
33
33
|
DETACH DELETE rel
|
|
34
|
-
} IN TRANSACTIONS
|
|
34
|
+
} IN TRANSACTIONS OF 500 ROWS
|
|
35
35
|
|
|
36
36
|
// reduce the results to a single row
|
|
37
37
|
WITH 1 AS one
|
|
@@ -44,7 +44,7 @@ MATCH (s)-[r]->(d)
|
|
|
44
44
|
WHERE r.branch = $branch_name
|
|
45
45
|
CALL (r) {
|
|
46
46
|
DELETE r
|
|
47
|
-
} IN TRANSACTIONS
|
|
47
|
+
} IN TRANSACTIONS OF 500 ROWS
|
|
48
48
|
|
|
49
49
|
// --------------
|
|
50
50
|
// get the database IDs of every vertex linked to a deleted edge
|
|
@@ -61,7 +61,7 @@ CALL (vertex_id) {
|
|
|
61
61
|
WHERE elementId(n) = vertex_id
|
|
62
62
|
AND NOT exists((n)--())
|
|
63
63
|
DELETE n
|
|
64
|
-
} IN TRANSACTIONS
|
|
64
|
+
} IN TRANSACTIONS OF 500 ROWS
|
|
65
65
|
"""
|
|
66
66
|
self.params["branch_name"] = self.branch_name
|
|
67
67
|
self.params["global_branch_name"] = GLOBAL_BRANCH_NAME
|
|
@@ -871,6 +871,9 @@ class RelationshipGetQuery(RelationshipQuery):
|
|
|
871
871
|
query = """
|
|
872
872
|
MATCH (s)%s(rl:Relationship { name: $name })%s(d)
|
|
873
873
|
WHERE %s
|
|
874
|
+
ORDER BY r1.branch_level DESC, r1.from DESC, r1.status ASC, r2.branch_level DESC, r2.from DESC, r2.status ASC
|
|
875
|
+
WITH *, r1.status = "active" AND r2.status = "active" AS is_active
|
|
876
|
+
LIMIT 1
|
|
874
877
|
""" % (
|
|
875
878
|
r1,
|
|
876
879
|
r2,
|
|
@@ -880,7 +883,20 @@ class RelationshipGetQuery(RelationshipQuery):
|
|
|
880
883
|
self.params["at"] = self.at.to_string()
|
|
881
884
|
|
|
882
885
|
self.add_to_query(query)
|
|
883
|
-
self.return_labels = ["s", "d", "rl", "
|
|
886
|
+
self.return_labels = ["s", "d", "rl", "r2", "is_active"]
|
|
887
|
+
|
|
888
|
+
def is_already_deleted(self) -> bool:
|
|
889
|
+
result = self.get_result()
|
|
890
|
+
if not result:
|
|
891
|
+
return False
|
|
892
|
+
return result.get("is_active") is False
|
|
893
|
+
|
|
894
|
+
def get_relationships_ids_for_branch(self, branch_name: str) -> list[str] | None:
|
|
895
|
+
result = self.get_result()
|
|
896
|
+
if not result:
|
|
897
|
+
return None
|
|
898
|
+
|
|
899
|
+
return [rel.element_id for rel in result.get_rels() if rel.get("branch") == branch_name]
|
|
884
900
|
|
|
885
901
|
|
|
886
902
|
class RelationshipGetByIdentifierQuery(Query):
|
infrahub/core/query/subquery.py
CHANGED
|
@@ -90,7 +90,7 @@ async def build_subquery_filter(
|
|
|
90
90
|
{branch_level_str} AS branch_level,
|
|
91
91
|
{froms_str} AS froms,
|
|
92
92
|
all(r IN relationships(path) WHERE r.status = "active") AS is_active{with_extra}
|
|
93
|
-
ORDER BY branch_level DESC, froms[-1] DESC, froms[-2] DESC
|
|
93
|
+
ORDER BY branch_level DESC, froms[-1] DESC, froms[-2] DESC, is_active DESC
|
|
94
94
|
WITH head(collect([is_active, {node_alias}{with_extra}])) AS latest_node_details
|
|
95
95
|
WHERE {is_active_filter}
|
|
96
96
|
WITH latest_node_details[1] AS {prefix}{final_with_extra}
|
|
@@ -176,7 +176,7 @@ async def build_subquery_order(
|
|
|
176
176
|
OPTIONAL MATCH path = {filter_str}
|
|
177
177
|
WHERE {where_str}
|
|
178
178
|
WITH {with_str_to_alias}
|
|
179
|
-
ORDER BY branch_level DESC, froms[-1] DESC, froms[-2] DESC
|
|
179
|
+
ORDER BY branch_level DESC, froms[-1] DESC, froms[-2] DESC, is_active DESC
|
|
180
180
|
WITH head(collect([is_active, {with_str_alias}])) AS latest_node_details
|
|
181
181
|
WITH {with_str_from_list}
|
|
182
182
|
RETURN {to_return_str}
|
|
@@ -404,17 +404,21 @@ class Relationship(FlagPropertyMixin, NodePropertyMixin):
|
|
|
404
404
|
db=db, source=node, destination=peer, rel=self, branch=self.branch, at=delete_at
|
|
405
405
|
)
|
|
406
406
|
await get_query.execute(db=db)
|
|
407
|
-
|
|
408
|
-
|
|
407
|
+
|
|
408
|
+
rel_ids_to_update = get_query.get_relationships_ids_for_branch(branch_name=branch.name)
|
|
409
|
+
if rel_ids_to_update is None:
|
|
409
410
|
raise Error(
|
|
410
411
|
f"Unable to find the relationship to delete. id: {self.id}, source: {node.id}, destination: {peer.id}"
|
|
411
412
|
)
|
|
412
413
|
|
|
414
|
+
if get_query.is_already_deleted():
|
|
415
|
+
return
|
|
416
|
+
|
|
413
417
|
# when we remove a relationship we need to :
|
|
414
418
|
# - Update the existing relationship if we are on the same branch
|
|
415
419
|
# - Create a new rel of type DELETED in the right branch
|
|
416
420
|
|
|
417
|
-
if rel_ids_to_update
|
|
421
|
+
if rel_ids_to_update:
|
|
418
422
|
await update_relationships_to(rel_ids_to_update, to=delete_at, db=db)
|
|
419
423
|
|
|
420
424
|
delete_query = await RelationshipDeleteQuery.init(
|
infrahub/database/__init__.py
CHANGED
|
@@ -28,6 +28,9 @@ from typing_extensions import Self
|
|
|
28
28
|
from infrahub import config, lock
|
|
29
29
|
from infrahub.constants.database import DatabaseType, Neo4jRuntime
|
|
30
30
|
from infrahub.core import registry
|
|
31
|
+
from infrahub.core.constants import (
|
|
32
|
+
GLOBAL_BRANCH_NAME,
|
|
33
|
+
)
|
|
31
34
|
from infrahub.core.query import QueryType
|
|
32
35
|
from infrahub.exceptions import DatabaseError
|
|
33
36
|
from infrahub.log import get_logger
|
|
@@ -125,9 +128,14 @@ class DatabaseSchemaManager:
|
|
|
125
128
|
return self.get_full(branch=branch, duplicate=duplicate)
|
|
126
129
|
|
|
127
130
|
def get_schema_branch(self, name: str) -> SchemaBranch:
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
+
"""Return a schema branch object based on its name.
|
|
132
|
+
|
|
133
|
+
If the branch is the global one, the default branch will be returned.
|
|
134
|
+
"""
|
|
135
|
+
branch_name = registry.default_branch if name == GLOBAL_BRANCH_NAME else name
|
|
136
|
+
if branch_name not in self._db._schemas:
|
|
137
|
+
return registry.schema.get_schema_branch(name=branch_name)
|
|
138
|
+
return self._db._schemas[branch_name]
|
|
131
139
|
|
|
132
140
|
|
|
133
141
|
class InfrahubDatabase:
|
|
@@ -11,6 +11,7 @@ class ArtifactEvent(InfrahubEvent):
|
|
|
11
11
|
|
|
12
12
|
node_id: str = Field(..., description="The ID of the artifact")
|
|
13
13
|
artifact_definition_id: str = Field(..., description="The ID of the artifact definition")
|
|
14
|
+
artifact_definition_name: str = Field(..., description="The name of the artifact definition")
|
|
14
15
|
target_id: str = Field(..., description="The ID of the target of the artifact")
|
|
15
16
|
target_kind: str = Field(..., description="The kind of the target of the artifact")
|
|
16
17
|
checksum: str = Field(..., description="The current checksum of the artifact")
|
|
@@ -36,6 +37,7 @@ class ArtifactEvent(InfrahubEvent):
|
|
|
36
37
|
"infrahub.artifact.storage_id": self.storage_id,
|
|
37
38
|
"infrahub.artifact.storage_id_previous": self.storage_id_previous or "",
|
|
38
39
|
"infrahub.artifact.artifact_definition_id": self.artifact_definition_id,
|
|
40
|
+
"infrahub.artifact.artifact_definition_name": self.artifact_definition_name,
|
|
39
41
|
}
|
|
40
42
|
)
|
|
41
43
|
|
infrahub/git/base.py
CHANGED
|
@@ -393,7 +393,7 @@ class InfrahubRepositoryBase(BaseModel, ABC):
|
|
|
393
393
|
repo = Repo.clone_from(self.location, self.directory_default)
|
|
394
394
|
repo.git.checkout(checkout_ref or self.default_branch)
|
|
395
395
|
except GitCommandError as exc:
|
|
396
|
-
await self._raise_enriched_error(error=exc)
|
|
396
|
+
await self._raise_enriched_error(error=exc, branch_name=checkout_ref or self.default_branch)
|
|
397
397
|
|
|
398
398
|
self.has_origin = True
|
|
399
399
|
|
|
@@ -716,7 +716,7 @@ class InfrahubRepositoryBase(BaseModel, ABC):
|
|
|
716
716
|
|
|
717
717
|
repo = self.get_git_repo_main()
|
|
718
718
|
try:
|
|
719
|
-
repo.remotes.origin.fetch()
|
|
719
|
+
repo.remotes.origin.fetch(prune=True)
|
|
720
720
|
except GitCommandError as exc:
|
|
721
721
|
await self._raise_enriched_error(error=exc)
|
|
722
722
|
|
infrahub/git/integrator.py
CHANGED
|
@@ -1422,6 +1422,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
|
|
|
1422
1422
|
target_id=message.target_id,
|
|
1423
1423
|
target_kind=message.target_kind,
|
|
1424
1424
|
artifact_definition_id=message.artifact_definition,
|
|
1425
|
+
artifact_definition_name=message.artifact_definition_name,
|
|
1425
1426
|
meta=EventMeta.from_context(context=message.context, branch=branch),
|
|
1426
1427
|
checksum=checksum,
|
|
1427
1428
|
checksum_previous=previous_checksum,
|
infrahub/git/models.py
CHANGED
|
@@ -21,6 +21,7 @@ class RequestArtifactGenerate(BaseModel):
|
|
|
21
21
|
|
|
22
22
|
artifact_name: str = Field(..., description="Name of the artifact")
|
|
23
23
|
artifact_definition: str = Field(..., description="The ID of the artifact definition")
|
|
24
|
+
artifact_definition_name: str = Field(..., description="The name of the artifact definition")
|
|
24
25
|
commit: str = Field(..., description="The commit to target")
|
|
25
26
|
content_type: str = Field(..., description="Content type of the artifact")
|
|
26
27
|
transform_type: str = Field(..., description="The type of transform associated with this artifact")
|
infrahub/git/tasks.py
CHANGED
|
@@ -366,6 +366,7 @@ async def generate_request_artifact_definition(
|
|
|
366
366
|
artifact_name=artifact_definition.artifact_name.value,
|
|
367
367
|
artifact_id=artifact_id,
|
|
368
368
|
artifact_definition=model.artifact_definition_id,
|
|
369
|
+
artifact_definition_name=model.artifact_definition_name,
|
|
369
370
|
commit=repository.commit.value,
|
|
370
371
|
content_type=artifact_definition.content_type.value,
|
|
371
372
|
transform_type=str(transform.typename),
|
infrahub/groups/models.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
1
3
|
from pydantic import BaseModel, Field
|
|
2
4
|
|
|
3
5
|
|
|
@@ -9,4 +11,4 @@ class RequestGraphQLQueryGroupUpdate(BaseModel):
|
|
|
9
11
|
query_id: str = Field(..., description="The ID of the GraphQLQuery that should be associated with the group")
|
|
10
12
|
related_node_ids: list[str] = Field(..., description="List of nodes related to the GraphQLQuery")
|
|
11
13
|
subscribers: list[str] = Field(..., description="List of subscribers to add to the group")
|
|
12
|
-
params: dict[str,
|
|
14
|
+
params: dict[str, Any] = Field(..., description="Params sent with the query")
|
|
@@ -683,6 +683,7 @@ async def validate_artifacts_generation(model: RequestArtifactDefinitionCheck, c
|
|
|
683
683
|
artifact_name=model.artifact_definition.artifact_name,
|
|
684
684
|
artifact_id=artifact_id,
|
|
685
685
|
artifact_definition=model.artifact_definition.definition_id,
|
|
686
|
+
artifact_definition_name=model.artifact_definition.definition_name,
|
|
686
687
|
commit=repository.source_commit,
|
|
687
688
|
content_type=model.artifact_definition.content_type,
|
|
688
689
|
transform_type=model.artifact_definition.transform_kind,
|
infrahub/worker.py
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
import uuid
|
|
2
2
|
|
|
3
|
+
from prometheus_client import Gauge
|
|
4
|
+
|
|
5
|
+
from infrahub import __version__ as infrahub_version
|
|
6
|
+
|
|
3
7
|
WORKER_IDENTITY = str(uuid.uuid4())
|
|
8
|
+
|
|
9
|
+
INFO_METRIC = Gauge(
|
|
10
|
+
"infrahub_info",
|
|
11
|
+
"Information about this Infrahub instance",
|
|
12
|
+
labelnames=["version", "worker_id"],
|
|
13
|
+
)
|
|
14
|
+
INFO_METRIC.labels(version=infrahub_version, worker_id=WORKER_IDENTITY).set(1)
|
infrahub/workflows/catalogue.py
CHANGED
|
@@ -299,7 +299,7 @@ PROPOSED_CHANGE_MERGE = WorkflowDefinition(
|
|
|
299
299
|
|
|
300
300
|
GRAPHQL_QUERY_GROUP_UPDATE = WorkflowDefinition(
|
|
301
301
|
name="graphql-query-group-update",
|
|
302
|
-
type=WorkflowType.
|
|
302
|
+
type=WorkflowType.INTERNAL,
|
|
303
303
|
module="infrahub.groups.tasks",
|
|
304
304
|
function="update_graphql_query_group",
|
|
305
305
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: infrahub-server
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.8
|
|
4
4
|
Summary: Infrahub is taking a new approach to Infrastructure Management by providing a new generation of datastore to organize and control all the data that defines how an infrastructure should run.
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Author: OpsMill
|
|
@@ -4,7 +4,7 @@ infrahub/actions/constants.py,sha256=xrVNdwBwCzG20eXfowV3bia3LW8Kwx-DazS6vALPbEg
|
|
|
4
4
|
infrahub/actions/gather.py,sha256=s6RaegkD9zx7WL8ePS6eGam8TlUA3TH38tarLmQeT98,4746
|
|
5
5
|
infrahub/actions/models.py,sha256=7EVJuGLqEy71sop1XEDLpuAZfLc9ei3hxXPy2FeyY4U,8558
|
|
6
6
|
infrahub/actions/parsers.py,sha256=L0ZE2gvhSoBZHuHok0wO4UeWo8fyhbnpuMTHHZX_W7c,3997
|
|
7
|
-
infrahub/actions/schema.py,sha256=
|
|
7
|
+
infrahub/actions/schema.py,sha256=tFLVFEOckxIdtrNqZVdVGuhf7UVACG6CIM6QG-Nj3ks,13111
|
|
8
8
|
infrahub/actions/tasks.py,sha256=Oaz6sku7E_2aadh4fFIjDeZn9YUGIY6zhzVlctQ3xbw,3820
|
|
9
9
|
infrahub/actions/triggers.py,sha256=5BKt8NkafArs8tdSQUb2uBtJVXfZrYUePByOn9d7-1Y,772
|
|
10
10
|
infrahub/api/__init__.py,sha256=dtRtBRpEgt7Y9Zdwy85jpSr8qfO_2xNTgTQLCJPQiZI,2182
|
|
@@ -19,8 +19,8 @@ infrahub/api/exceptions.py,sha256=EjTAN2wawBRyxMWgmafdk2CUdmzAqNokP3QNobifQQI,29
|
|
|
19
19
|
infrahub/api/file.py,sha256=FnjXkQdSBThnNNYk8CMboEx_935pR1U6aHT0jxA0AdU,2258
|
|
20
20
|
infrahub/api/internal.py,sha256=ZlE5BkdGcrmLq1RZOCvv8OBBL7iT7wHKGG9Kqc-TTKg,5339
|
|
21
21
|
infrahub/api/menu.py,sha256=xp5bj5JXQZA6ZEPWoTSGGSfTXZ1sVmehMxr3VSG7FlQ,1216
|
|
22
|
-
infrahub/api/oauth2.py,sha256=
|
|
23
|
-
infrahub/api/oidc.py,sha256=
|
|
22
|
+
infrahub/api/oauth2.py,sha256=OwJEsASnQGptn5Aa-LN7_VqEEP4YeXYGOqfq71pD3u8,5642
|
|
23
|
+
infrahub/api/oidc.py,sha256=HVbkLszrhLia6XUbeCnwWs97rehLYKwNN5yTFJ255rs,8473
|
|
24
24
|
infrahub/api/query.py,sha256=xc5aAY0TLHnswdjiIpvThG974EKGVIXvZCbtdiiZkPw,7312
|
|
25
25
|
infrahub/api/schema.py,sha256=dUSB51YXaWELZuXYI7UNemd60MJPPBv4m6-MexXOE0k,17450
|
|
26
26
|
infrahub/api/static/redoc.standalone.js,sha256=77kGx7mVN9EcdER2ZM4gQ-E-ra_N6AZq9QseAeD6kt0,1042008
|
|
@@ -29,9 +29,9 @@ infrahub/api/static/swagger-ui.css,sha256=QBcPDuhZ0X-SExunBzKaiKBw5PZodNETZemnfS
|
|
|
29
29
|
infrahub/api/storage.py,sha256=yWo7qsDn4SrX89wDsTKOfGTMdWYNsptAdt7Fhfzw1C0,2179
|
|
30
30
|
infrahub/api/transformation.py,sha256=xGTLxh3gvohzpORLZy_MY2ZkUuFtKhVKR4ygWy8RYWg,5932
|
|
31
31
|
infrahub/artifacts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
|
-
infrahub/artifacts/models.py,sha256=
|
|
32
|
+
infrahub/artifacts/models.py,sha256=QMGEhEEUGE5cvNdSeJpq9G6u1Yw-bL6V0GwB18B2Tow,2133
|
|
33
33
|
infrahub/artifacts/tasks.py,sha256=L2DOSvUB5ezcxLpy5cFKGzkLtNBjkRqo2Igs1n8eRUQ,3487
|
|
34
|
-
infrahub/auth.py,sha256=
|
|
34
|
+
infrahub/auth.py,sha256=TItFIxrPDcZGWq2w0lBdnmMrXy1Wrf5uzHuTk3urm2A,10199
|
|
35
35
|
infrahub/branch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
36
|
infrahub/branch/merge_mutation_checker.py,sha256=bKiQEWEqUqjQEIBDaOKZ2LwA9kgWCEyss80B5yGhPX8,1147
|
|
37
37
|
infrahub/branch/tasks.py,sha256=09AtjKpA5TC9NxsNt3oE--1pHeh1h1hRYvY41YfMt90,1059
|
|
@@ -55,7 +55,7 @@ infrahub/computed_attribute/gather.py,sha256=xhH4dsgCjRFyFshns4Iu3sloe5m1bVMRdeQ
|
|
|
55
55
|
infrahub/computed_attribute/models.py,sha256=P_MijLwCVd7394oyTTfYQ3HmX5wIF966jdchuZaLRbs,17361
|
|
56
56
|
infrahub/computed_attribute/tasks.py,sha256=FMNJYPuLp2tBKP-ENNUlZhc6nkq78yl7817mCKTBt2g,17415
|
|
57
57
|
infrahub/computed_attribute/triggers.py,sha256=ve1cUj0CZ7dU1VtZkxET9LD8StszKIL9mCkTZpCeUaI,2304
|
|
58
|
-
infrahub/config.py,sha256=
|
|
58
|
+
infrahub/config.py,sha256=XV_dLvHnpb5zvgi_jkVZdsId481Jbs6VGWvNwYMkTTw,38957
|
|
59
59
|
infrahub/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
60
60
|
infrahub/constants/database.py,sha256=WmV1iuOk4xulxZHOVvO3sS_VF1eTf7fKh0TPe_RnfV4,507
|
|
61
61
|
infrahub/constants/environment.py,sha256=ry-6qsBzSumOjjiq1D3XNoquf1LWqFKiQSJj8t6nET4,32
|
|
@@ -139,7 +139,7 @@ infrahub/core/diff/repository/deserializer.py,sha256=bhN9ao8HxqKyRz273QGLNV9z9_S
|
|
|
139
139
|
infrahub/core/diff/repository/repository.py,sha256=u0QTMY1e2dknG_DuRAwzFt-Lp1_mdj5lqF2ymt77k9E,25581
|
|
140
140
|
infrahub/core/diff/tasks.py,sha256=jSXlenTJ5Fc189Xvm971e3-gBDRnfN19cxNaWvEFwAE,3306
|
|
141
141
|
infrahub/core/enums.py,sha256=qGbhRVoH43Xi0iDkUfWdQiKapJbLT9UKsCobFk_paIk,491
|
|
142
|
-
infrahub/core/graph/__init__.py,sha256=
|
|
142
|
+
infrahub/core/graph/__init__.py,sha256=pqEHefyIWiA492sH7qk0HW4SxWc4ugXBFIhpI4DyvFY,19
|
|
143
143
|
infrahub/core/graph/constraints.py,sha256=lmuzrKDFoeSKRiLtycB9PXi6zhMYghczKrPYvfWyy90,10396
|
|
144
144
|
infrahub/core/graph/index.py,sha256=A9jzEE_wldBJsEsflODeMt4GM8sPmmbHAJRNdFioR1k,1736
|
|
145
145
|
infrahub/core/graph/schema.py,sha256=o50Jcy6GBRk55RkDJSMIDDwHhLD7y_RWOirI9rCex4A,10776
|
|
@@ -158,7 +158,7 @@ infrahub/core/ipam/utilization.py,sha256=d-zpXCaWsHgJxBLopCDd7y4sJYvHcIzzpYhbTMI
|
|
|
158
158
|
infrahub/core/manager.py,sha256=xMXPwlaGNnghkRUW0ILwJAUlBQJZqo9cGp9GVyqkqYk,47564
|
|
159
159
|
infrahub/core/merge.py,sha256=TNZpxjNYcl3dnvE8eYXaWSXFDYeEa8DDsS9XbR2XKlA,11217
|
|
160
160
|
infrahub/core/migrations/__init__.py,sha256=dIExw90CrdTByeJqpiWkaZBclpAfzatG2H6fXx54su0,1305
|
|
161
|
-
infrahub/core/migrations/graph/__init__.py,sha256=
|
|
161
|
+
infrahub/core/migrations/graph/__init__.py,sha256=nCm3XHpKwSrekrOU0WFMVJlnIdJmf9KayjjERIYGx7Q,4225
|
|
162
162
|
infrahub/core/migrations/graph/m001_add_version_to_graph.py,sha256=YcLN6cFjE6IGheXR4Ujb6CcyY8bJ7WE289hcKJaENOc,1515
|
|
163
163
|
infrahub/core/migrations/graph/m002_attribute_is_default.py,sha256=wB6f2N_ChTvGajqHD-OWCG5ahRMDhhXZuwo79ieq_II,1036
|
|
164
164
|
infrahub/core/migrations/graph/m003_relationship_parent_optional.py,sha256=Aya-s98XfE9C7YluOwEjilwgnjaBnZxp27w_Xdv_NmU,2330
|
|
@@ -197,6 +197,7 @@ infrahub/core/migrations/graph/m035_orphan_relationships.py,sha256=K0J5gzFF5gY-Q
|
|
|
197
197
|
infrahub/core/migrations/graph/m036_drop_attr_value_index.py,sha256=z2BplzX0mue3lOxrM7xnWDNrs7N3TGdFKHZR-u0wDDY,1439
|
|
198
198
|
infrahub/core/migrations/graph/m037_index_attr_vals.py,sha256=bJB4yPWE73XA_ErUcnY90CR09_jbtA0jW6tE5U0GvQ4,22730
|
|
199
199
|
infrahub/core/migrations/graph/m038_redo_0000_prefix_fix.py,sha256=8seWnXQhgEJDFLWxYHVcnMNDPcHq5C24c0RYrtn_WGE,2411
|
|
200
|
+
infrahub/core/migrations/graph/m039_ipam_reconcile.py,sha256=gUf4Fo3CrzJ2hwbaKlQclripTDrI7cVk_GHsBlBNMKE,10916
|
|
200
201
|
infrahub/core/migrations/query/__init__.py,sha256=JoWOUWlV6IzwxWxObsfCnAAKUOHJkE7dZlOsfB64ZEo,876
|
|
201
202
|
infrahub/core/migrations/query/attribute_add.py,sha256=oitzB-PPAclfyNtcwCWJY3RdI5Zi4oEnR62BDzn1UQk,4835
|
|
202
203
|
infrahub/core/migrations/query/attribute_rename.py,sha256=onb9Nanht1Tz47JgneAcFsuhqqvPS6dvI2nNjRupLLo,6892
|
|
@@ -238,15 +239,15 @@ infrahub/core/protocols.py,sha256=CXwYfHHUgJIFMZvsv9Fc8VBAfvXDzy7Bu4RJvQNj6no,12
|
|
|
238
239
|
infrahub/core/protocols_base.py,sha256=cEi6giHtEUmaD0JWfDfWHJhEv_6wjaBA3oJRJCbvc6Q,3411
|
|
239
240
|
infrahub/core/query/__init__.py,sha256=2qIMaODLwJ6pK6BUd5vODTlA15Aecf5I8_-J44UlCso,23089
|
|
240
241
|
infrahub/core/query/attribute.py,sha256=xojZIHX-XfXlN_jgM1TQ1Bp4dXr4oLEWlr2A7igTvIg,12658
|
|
241
|
-
infrahub/core/query/branch.py,sha256=
|
|
242
|
+
infrahub/core/query/branch.py,sha256=aIYyDxpnw_Zw2lqTnMEVlhPUaYckZtJJJU1SFUht1o0,4343
|
|
242
243
|
infrahub/core/query/delete.py,sha256=7tPP1qtNV6QGYtmgE1RKsuQ9oxENnMTVkttLvJ2PiKg,1927
|
|
243
244
|
infrahub/core/query/diff.py,sha256=jJCkZRo5jGaf-yPAnQ_5ju6sCnknDK0E7vGpqEnaU_k,36881
|
|
244
245
|
infrahub/core/query/ipam.py,sha256=dOs_LZr-DONrCPw6t5Ug9mBPn8a-S2NKja3Vr-zIeaM,34523
|
|
245
246
|
infrahub/core/query/node.py,sha256=OfWS9PfltP89aU4n0KhEjrvAkhAGj9Vl4hcfKcE9LD8,70969
|
|
246
|
-
infrahub/core/query/relationship.py,sha256=
|
|
247
|
+
infrahub/core/query/relationship.py,sha256=GpaEcf8YRiVpqTxrp10NFOUCHeyE7SqhOFyf3F44eNo,48474
|
|
247
248
|
infrahub/core/query/resource_manager.py,sha256=uSvs1WZmdbyt_PjaUi9lXnYdPt-lhJV1RjYoUHYjQdk,16620
|
|
248
249
|
infrahub/core/query/standard_node.py,sha256=mPBXyqk4RzoWRUX4NoojoVi8zk-sJ03GmzmUaWqOgSI,4825
|
|
249
|
-
infrahub/core/query/subquery.py,sha256=
|
|
250
|
+
infrahub/core/query/subquery.py,sha256=5ckxREMrlrELWKCcN_JqwmSHRRE7U3ry2iT_WKI7ARE,7620
|
|
250
251
|
infrahub/core/query/task.py,sha256=tLgn8S_KaLYLuOB66D1YM155teHZIHNThkt2iUiKKD4,3137
|
|
251
252
|
infrahub/core/query/task_log.py,sha256=2RdthOAQrmpKZU8uhV_dJCPqwdsSA_1CYSKpL_eZ_yk,1120
|
|
252
253
|
infrahub/core/query/utils.py,sha256=t9LMvZWdmi10c3E0HAU_5m7x5zMHhYXsUjX7ZBl2RpU,1091
|
|
@@ -259,7 +260,7 @@ infrahub/core/relationship/constraints/peer_kind.py,sha256=Bropiav4y6r0iU2KfWJ_k
|
|
|
259
260
|
infrahub/core/relationship/constraints/peer_parent.py,sha256=z7elpC8xS_ovAF28Haq-RNpFtTEiUehzowiDgYGT68U,2343
|
|
260
261
|
infrahub/core/relationship/constraints/peer_relatives.py,sha256=Ye79l7njaWxZkU2chTOaptIjvKBIawsNCl0IQxCTDtM,2737
|
|
261
262
|
infrahub/core/relationship/constraints/profiles_kind.py,sha256=nEZPGtGcmelZ1Nb8EPcQ-7_zCLCNIYwwWbU6C9fLj5E,2464
|
|
262
|
-
infrahub/core/relationship/model.py,sha256=
|
|
263
|
+
infrahub/core/relationship/model.py,sha256=pfx6BXu3OG_Ew0mk5U3F1VuXBRjGlAqYhaQ9aUwdhLQ,47223
|
|
263
264
|
infrahub/core/root.py,sha256=8ZLSOtnmjQcrjqX2vxNO-AGopEUArmBPo_X5NeZBdP0,416
|
|
264
265
|
infrahub/core/schema/__init__.py,sha256=Tif-BUwYWVQ0PJGZHFog6lFgnwZevXk3iBcr3zK__BU,4192
|
|
265
266
|
infrahub/core/schema/attribute_parameters.py,sha256=ABL1GEsOl4_CcDvK9_NucGMaF6LUeOjAxbDQVm_G7eg,6516
|
|
@@ -351,7 +352,7 @@ infrahub/core/validators/uniqueness/checker.py,sha256=5WbYjS4yfezsK0Ez35Vp9soJ9K
|
|
|
351
352
|
infrahub/core/validators/uniqueness/index.py,sha256=Jw1o-UVinQquNduZ5vCCzt8GUfIEdVzBo-1XyRti8F8,5068
|
|
352
353
|
infrahub/core/validators/uniqueness/model.py,sha256=Z5CyYOQfhyAnwNIev4AFjfXnfOoUWc4uR04Wz3C6Cy4,5617
|
|
353
354
|
infrahub/core/validators/uniqueness/query.py,sha256=0LXhPqRpV4Ho2CLxHP2fDs8AFvKJPKpUfHiW4SwFccg,22254
|
|
354
|
-
infrahub/database/__init__.py,sha256=
|
|
355
|
+
infrahub/database/__init__.py,sha256=8d-SCvRddc0pszhr2NxBOdv-NjvC3TxxuB6GZKnySws,21170
|
|
355
356
|
infrahub/database/index.py,sha256=ATLqw9Grqbq7haGGm14VSEPmcPniid--YATiffo4sA0,1676
|
|
356
357
|
infrahub/database/memgraph.py,sha256=Fg3xHP9s0MiBBmMvcEmsJvuIUSq8U_XCS362HDE9d1s,1742
|
|
357
358
|
infrahub/database/metrics.py,sha256=xU4OSKFbsxcw_yZlt_39PmGtF7S7yPbPuOIlSCu5sI0,739
|
|
@@ -419,7 +420,7 @@ infrahub/dependencies/component/registry.py,sha256=E1K5uK7LU5MK6SxrUjajBw4K1I7dC
|
|
|
419
420
|
infrahub/dependencies/interface.py,sha256=pVNdGYVeGlJgmBBlnv-3UYPXeZqZT8mx9Sg4SsqME40,446
|
|
420
421
|
infrahub/dependencies/registry.py,sha256=YNv73l66EIYDBLaxeeWfGStl8MY6Xz_HpQY1osXVoug,4520
|
|
421
422
|
infrahub/events/__init__.py,sha256=6BtpkdstvgnMYvUWc-q2dqiA08ZRaU-Xs4vmhWpOJXs,1702
|
|
422
|
-
infrahub/events/artifact_action.py,sha256
|
|
423
|
+
infrahub/events/artifact_action.py,sha256=-j_Sh-_NdJIGJhUDYm5DoZS--eIYsaMsejj36OUE6yk,2823
|
|
423
424
|
infrahub/events/branch_action.py,sha256=73j9oWwSLg65WAjpq_d2QcOKfcy8Y9kAjP8A2YrOOIM,4692
|
|
424
425
|
infrahub/events/constants.py,sha256=VCbUeHSWRT308We7vDVYkopGlkQQ23UEIGzv9a8kyf0,121
|
|
425
426
|
infrahub/events/generator.py,sha256=J3G2-lixFVgrNqcEX2GiPz2nj6TTiUHs12za07U8NZg,3958
|
|
@@ -436,13 +437,13 @@ infrahub/generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
|
436
437
|
infrahub/generators/models.py,sha256=9qhSfsoG-uYux35HClAxSq7TRfkosqN3i_eQkeTokLs,1916
|
|
437
438
|
infrahub/generators/tasks.py,sha256=Ci6lIbnUS6faGzbUjw1ggROpv17guZ-Z9HH9f6cAZv4,9563
|
|
438
439
|
infrahub/git/__init__.py,sha256=KeQ9U8UI5jDj6KB6j00Oal7MZmtOD9vKqVgiezG_EQA,281
|
|
439
|
-
infrahub/git/base.py,sha256=
|
|
440
|
+
infrahub/git/base.py,sha256=tEfhxYNc8bAcq1Pld7ZSK41w1fm48eMsF5QnMSKz50E,38716
|
|
440
441
|
infrahub/git/constants.py,sha256=XpzcAkXbsgXZgrXey74id1sXV8Q6EHb_4FNw7BndxyY,106
|
|
441
442
|
infrahub/git/directory.py,sha256=fozxLXXJPweHG95yQwQkR5yy3sfTdmHiczCAJnsUX54,861
|
|
442
|
-
infrahub/git/integrator.py,sha256=
|
|
443
|
-
infrahub/git/models.py,sha256=
|
|
443
|
+
infrahub/git/integrator.py,sha256=fpeOC1ycVYZixPcrR-TwmZXHgaAvXpPd50ys04GFXdg,62889
|
|
444
|
+
infrahub/git/models.py,sha256=tu-YRNZ4nlYZ6QbBWhydFRcVa0nlN7Cl3k5U0yLi53Y,12250
|
|
444
445
|
infrahub/git/repository.py,sha256=wPsJAA9aHTHdfw0gqCfkNHvcivs7JabsDf-uazptZt0,10928
|
|
445
|
-
infrahub/git/tasks.py,sha256=
|
|
446
|
+
infrahub/git/tasks.py,sha256=QRBqmGODtuDJyHoL8wFOBeE0_cY-m5xRGaPbKn1-CzQ,37584
|
|
446
447
|
infrahub/git/utils.py,sha256=xhWxlu_FbMqbrwanpPkex4hKRS_d2AFzlxI_6kVQllw,1741
|
|
447
448
|
infrahub/git/worktree.py,sha256=8IYJWOBytKUWwhMmMVehR4ceeO9e13nV-mvn3iVEgZY,1727
|
|
448
449
|
infrahub/git_credential/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -547,7 +548,7 @@ infrahub/graphql/types/task_log.py,sha256=jqB2SzIDVaVHRKbe10IFOvbzUv4pbTv-lb0ydw
|
|
|
547
548
|
infrahub/graphql/utils.py,sha256=cVnF_FNR2-R8TnxxgKVgwjC6N1tXSChg5A8sKeMvE9g,3859
|
|
548
549
|
infrahub/groups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
549
550
|
infrahub/groups/ancestors.py,sha256=ORNXupyZLOhtuQ-TxToONqJn-2OHFBPGubz-2cQpSwc,981
|
|
550
|
-
infrahub/groups/models.py,sha256=
|
|
551
|
+
infrahub/groups/models.py,sha256=YAeaJR01oJdUhhnll9sUvXcK1367hzclqzjd-CScY1s,783
|
|
551
552
|
infrahub/groups/parsers.py,sha256=A60n-JmT-8F-7ATugV97R-mPWpRhNVNxqEbpibxiiUs,4260
|
|
552
553
|
infrahub/groups/tasks.py,sha256=yg-VNj37iWdBHyPE9BhN2QzjVo2D8glnlO37pwGcdsU,1563
|
|
553
554
|
infrahub/helpers.py,sha256=KchbQqgipU4VjfwnDbzCGjnEv-4espw_g63Zw4KAhbo,251
|
|
@@ -622,7 +623,7 @@ infrahub/proposed_change/branch_diff.py,sha256=IdMxf5zPmhybQKPPz7AlruNmLCKf5VISP
|
|
|
622
623
|
infrahub/proposed_change/checker.py,sha256=ZhNEVJKsQbHH2UE1O35MfOVa8cK1QGEqGyn6MsOuqSQ,1558
|
|
623
624
|
infrahub/proposed_change/constants.py,sha256=auifG94Oo2cJ4RwZx4P-XDPDpKYPtEVxh013KPfiEdU,2080
|
|
624
625
|
infrahub/proposed_change/models.py,sha256=ivWJmEAihprKmwgaBGDJ4Koq4ETciE5GfDp86KHDnns,5892
|
|
625
|
-
infrahub/proposed_change/tasks.py,sha256=
|
|
626
|
+
infrahub/proposed_change/tasks.py,sha256=8KCZ33DZFESfCVOlLzTiK5DY7SiPtWn4AU1lzN0_MyM,64075
|
|
626
627
|
infrahub/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
627
628
|
infrahub/pytest_plugin.py,sha256=u3t0WgLMo9XmuQYeb28mccQ3xbnyv2Fv173YWl1zBiM,6678
|
|
628
629
|
infrahub/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -693,13 +694,13 @@ infrahub/webhook/gather.py,sha256=XNaIGiHDiMjjtSjsVbswOze7cLaL0MKJmvSbZBS-WT0,69
|
|
|
693
694
|
infrahub/webhook/models.py,sha256=6oiwCV4iayTWDKmSTpcFx83WA23paMXLsw4fFw15KHM,10477
|
|
694
695
|
infrahub/webhook/tasks.py,sha256=2msOOqqFStQbNje7Eq0glAdlprs-ASHii3qQXFIEyzE,7255
|
|
695
696
|
infrahub/webhook/triggers.py,sha256=v1dzFV4wX0GO2n5hft_qzp-oJOA2P_9Q2eTcSP-i0pk,1574
|
|
696
|
-
infrahub/worker.py,sha256=
|
|
697
|
+
infrahub/worker.py,sha256=zV9vLXtJzyqeTGtVolwZEHlLaBvGiUZv00qWpE-lnOM,353
|
|
697
698
|
infrahub/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
698
699
|
infrahub/workers/dependencies.py,sha256=byuliu9WrOGtQ-Zws8NSTq3LJwnqxIqQ7dcWP3KNlAg,4850
|
|
699
700
|
infrahub/workers/infrahub_async.py,sha256=9itLnky6BuqWR92fuU-SShaSI-33eoSRfhOEZy0TH0g,7973
|
|
700
701
|
infrahub/workers/utils.py,sha256=m6FOKrYo53Aoj-JcEyQ7-J4Dc20R9JtHMDzTcqXiRpg,2407
|
|
701
702
|
infrahub/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
702
|
-
infrahub/workflows/catalogue.py,sha256=
|
|
703
|
+
infrahub/workflows/catalogue.py,sha256=cHV51ZQXQhyoEgCahppv--vyDYbjo-Duu2LemeRho_k,18283
|
|
703
704
|
infrahub/workflows/constants.py,sha256=7je2FF7tJH6x_ZNqHKZfQX91X7I5gmD8OECN3dE_eqI,651
|
|
704
705
|
infrahub/workflows/initialization.py,sha256=Aj3tTD4tL9qhNgSnzFIMkTHab8FWWgL0JINaON9wjj0,3224
|
|
705
706
|
infrahub/workflows/models.py,sha256=eCra3PFbX-GpiNLDG6WyqVXvSqRTz1eF4REm0doJFDY,3534
|
|
@@ -827,8 +828,8 @@ infrahub_testcontainers/models.py,sha256=ASYyvl7d_WQz_i7y8-3iab9hwwmCl3OCJavqVbe
|
|
|
827
828
|
infrahub_testcontainers/performance_test.py,sha256=hvwiy6tc_lWniYqGkqfOXVGAmA_IV15VOZqbiD9ezno,6149
|
|
828
829
|
infrahub_testcontainers/plugin.py,sha256=I3RuZQ0dARyKHuqCf0y1Yj731P2Mwf3BJUehRJKeWrs,5645
|
|
829
830
|
infrahub_testcontainers/prometheus.yml,sha256=610xQEyj3xuVJMzPkC4m1fRnCrjGpiRBrXA2ytCLa54,599
|
|
830
|
-
infrahub_server-1.4.
|
|
831
|
-
infrahub_server-1.4.
|
|
832
|
-
infrahub_server-1.4.
|
|
833
|
-
infrahub_server-1.4.
|
|
834
|
-
infrahub_server-1.4.
|
|
831
|
+
infrahub_server-1.4.8.dist-info/LICENSE.txt,sha256=7GQO7kxVoQYnZtFrjZBKLRXbrGwwwimHPPOJtqXsozQ,11340
|
|
832
|
+
infrahub_server-1.4.8.dist-info/METADATA,sha256=iKCMeck3Bntd3l8Rj7l3pVNVaZKsL-0dcgT-e1gtrGA,8277
|
|
833
|
+
infrahub_server-1.4.8.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
834
|
+
infrahub_server-1.4.8.dist-info/entry_points.txt,sha256=UXIeFWDsrV-4IllNvUEd6KieYGzQfn9paga2YyABOQI,393
|
|
835
|
+
infrahub_server-1.4.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|