infrahub-server 1.4.2__py3-none-any.whl → 1.4.4__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/cli/__init__.py CHANGED
@@ -1,5 +1,3 @@
1
- from asyncio import run as aiorun
2
-
3
1
  import typer
4
2
  from infrahub_sdk.async_typer import AsyncTyper
5
3
 
@@ -43,18 +41,87 @@ async def _init_shell(config_file: str) -> None:
43
41
 
44
42
 
45
43
  @app.command()
46
- def shell(config_file: str = typer.Argument("infrahub.toml", envvar="INFRAHUB_CONFIG")) -> None:
47
- """Start a python shell within Infrahub context."""
48
- aiorun(_init_shell(config_file=config_file))
49
-
50
- # TODO add check to properly exit of ipython is not installed
51
- from IPython import embed
52
- from rich import pretty
53
- from traitlets.config import get_config
54
-
55
- pretty.install()
56
-
57
- c = get_config()
58
- c.InteractiveShellEmbed.colors = "Linux"
59
- c.InteractiveShellApp.extensions.append("rich")
60
- embed(config=c)
44
+ def shell() -> None:
45
+ """Start a python shell within Infrahub context (requires IPython)."""
46
+ from infrahub_sdk import InfrahubClient
47
+ from IPython import start_ipython
48
+ from traitlets.config import Config
49
+
50
+ from infrahub import config
51
+ from infrahub.components import ComponentType
52
+ from infrahub.core.branch import Branch
53
+ from infrahub.core.initialization import initialization
54
+ from infrahub.core.manager import NodeManager
55
+ from infrahub.core.registry import registry
56
+ from infrahub.dependencies.registry import build_component_registry
57
+ from infrahub.lock import initialize_lock
58
+ from infrahub.services import InfrahubServices
59
+ from infrahub.workers.dependencies import (
60
+ get_cache,
61
+ get_component,
62
+ get_database,
63
+ get_workflow,
64
+ set_component_type,
65
+ )
66
+
67
+ async def initialize_service() -> InfrahubServices:
68
+ config.load_and_exit()
69
+ client = InfrahubClient()
70
+
71
+ component_type = ComponentType.GIT_AGENT
72
+ set_component_type(component_type=component_type)
73
+
74
+ database = await get_database()
75
+
76
+ build_component_registry()
77
+
78
+ workflow = get_workflow()
79
+ cache = await get_cache()
80
+ component = await get_component()
81
+ service = await InfrahubServices.new(
82
+ cache=cache,
83
+ client=client,
84
+ database=database,
85
+ workflow=workflow,
86
+ component=component,
87
+ component_type=component_type,
88
+ )
89
+ initialize_lock(service=service)
90
+
91
+ async with service.database as db:
92
+ await initialization(db=db)
93
+ await service.component.refresh_schema_hash()
94
+
95
+ return service
96
+
97
+ def welcome() -> None:
98
+ print("--------------------------------------")
99
+ print("infrahub interactive shell initialized")
100
+ print("--------------------------------------")
101
+ print("Available objects:")
102
+ print("* db: InfrahubDatabase")
103
+ print("* Branch: Branch")
104
+ print("* NodeManager: NodeManager")
105
+ print("* registry: Registry")
106
+ print("* service: InfrahubServices")
107
+ print()
108
+ print("Example use:")
109
+ print("In [1] tags = await NodeManager.query(schema='BuiltinTag', db=db)")
110
+
111
+ c = Config()
112
+ c.InteractiveShellApp.exec_lines = [
113
+ "service = await initialize_service()",
114
+ "db = service.database",
115
+ "welcome()",
116
+ ]
117
+ c.TerminalInteractiveShell.colors = "Neutral"
118
+
119
+ user_ns = {
120
+ "initialize_service": initialize_service,
121
+ "welcome": welcome,
122
+ "NodeManager": NodeManager,
123
+ "Branch": Branch,
124
+ "registry": registry,
125
+ }
126
+
127
+ start_ipython(argv=[], config=c, user_ns=user_ns)
@@ -1 +1 @@
1
- GRAPH_VERSION = 37
1
+ GRAPH_VERSION = 38
@@ -39,6 +39,7 @@ from .m034_find_orphaned_schema_fields import Migration034
39
39
  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
+ from .m038_redo_0000_prefix_fix import Migration038
42
43
 
43
44
  if TYPE_CHECKING:
44
45
  from infrahub.core.root import Root
@@ -83,6 +84,7 @@ MIGRATIONS: list[type[GraphMigration | InternalSchemaMigration | ArbitraryMigrat
83
84
  Migration035,
84
85
  Migration036,
85
86
  Migration037,
87
+ Migration038,
86
88
  ]
87
89
 
88
90
 
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ import ipaddress
4
+ from typing import TYPE_CHECKING, Sequence
5
+
6
+ from infrahub.core.branch.models import Branch
7
+ from infrahub.core.initialization import initialization
8
+ from infrahub.core.ipam.reconciler import IpamReconciler
9
+ from infrahub.core.manager import NodeManager
10
+ from infrahub.core.migrations.shared import MigrationResult
11
+ from infrahub.core.timestamp import Timestamp
12
+ from infrahub.lock import initialize_lock
13
+ from infrahub.log import get_logger
14
+
15
+ from ..shared import InternalSchemaMigration, SchemaMigration
16
+
17
+ if TYPE_CHECKING:
18
+ from infrahub.database import InfrahubDatabase
19
+
20
+ log = get_logger()
21
+
22
+
23
+ class Migration038(InternalSchemaMigration):
24
+ """
25
+ Re-run migration 026 after Migration037 updates AttributeValueIndexed vertices correctly so that the call to
26
+ NodeManager.query will work
27
+
28
+ If someone is upgrading from 1.2.4 (release before migration 026) or earlier to 1.4.x or later, then migration 026
29
+ fail to find any 0.0.0.0 prefix nodes even if they exist. So we run it again here after migration 037 makes the
30
+ AttributeValueIndexed changes to be sure it completes correctly.
31
+ """
32
+
33
+ name: str = "038_prefix_0000_fix"
34
+ minimum_version: int = 37
35
+ migrations: Sequence[SchemaMigration] = []
36
+
37
+ async def validate_migration(self, db: InfrahubDatabase) -> MigrationResult: # noqa: ARG002
38
+ return MigrationResult()
39
+
40
+ async def execute(self, db: InfrahubDatabase) -> MigrationResult:
41
+ # load schemas from database into registry
42
+ initialize_lock()
43
+ await initialization(db=db)
44
+
45
+ at = Timestamp()
46
+ for branch in await Branch.get_list(db=db):
47
+ prefix_0000s = await NodeManager.query(
48
+ db=db, schema="BuiltinIPPrefix", branch=branch, filters={"prefix__values": ["0.0.0.0/0", "::/0"]}
49
+ )
50
+ if not prefix_0000s:
51
+ continue
52
+ ipam_reconciler = IpamReconciler(db=db, branch=branch)
53
+ for prefix in prefix_0000s:
54
+ ip_namespace = await prefix.ip_namespace.get_peer(db=db)
55
+ ip_network = ipaddress.ip_network(prefix.prefix.value)
56
+ await ipam_reconciler.reconcile(
57
+ ip_value=ip_network,
58
+ namespace=ip_namespace,
59
+ node_uuid=prefix.get_id(),
60
+ at=at,
61
+ )
62
+
63
+ return MigrationResult()
infrahub/core/models.py CHANGED
@@ -73,6 +73,15 @@ class SchemaBranchHash(BaseModel):
73
73
  nodes: dict[str, str] = Field(default_factory=dict)
74
74
  generics: dict[str, str] = Field(default_factory=dict)
75
75
 
76
+ @property
77
+ def is_valid(self) -> bool:
78
+ """
79
+ TODO: This is a temporary solution to avoid comparing schema hashes if there are less than 2 nodes or generics.
80
+ """
81
+ if len(self.nodes) < 2 and len(self.generics) < 2:
82
+ return False
83
+ return True
84
+
76
85
  def compare(self, other: SchemaBranchHash) -> SchemaBranchDiff | None:
77
86
  if other.main == self.main:
78
87
  return None
@@ -615,7 +615,9 @@ class SchemaManager(NodeManager):
615
615
  return new_branch_schema
616
616
 
617
617
  current_schema = self.get_schema_branch(name=branch.name)
618
- schema_diff = current_schema.get_hash_full().compare(branch.active_schema_hash)
618
+ schema_diff = None
619
+ if branch.active_schema_hash.is_valid and current_schema.get_hash_full().is_valid:
620
+ schema_diff = current_schema.get_hash_full().compare(branch.active_schema_hash)
619
621
  branch_schema = await self.load_schema_from_db(
620
622
  db=db, branch=branch, schema=current_schema, schema_diff=schema_diff
621
623
  )
@@ -7,7 +7,7 @@ from infrahub.core.constants import GLOBAL_BRANCH_NAME, GlobalPermissions, Infra
7
7
  from infrahub.core.manager import get_schema
8
8
  from infrahub.core.schema.node_schema import NodeSchema
9
9
  from infrahub.database import InfrahubDatabase
10
- from infrahub.graphql.analyzer import InfrahubGraphQLQueryAnalyzer
10
+ from infrahub.graphql.analyzer import GraphQLOperation, InfrahubGraphQLQueryAnalyzer
11
11
  from infrahub.graphql.initialization import GraphqlParams
12
12
  from infrahub.permissions.constants import PermissionDecisionFlag
13
13
  from infrahub.utils import extract_camelcase_words
@@ -119,34 +119,46 @@ class PermissionManagerPermissionChecker(GraphQLQueryPermissionCheckerInterface)
119
119
  permission_required = GlobalPermission(
120
120
  action=GlobalPermissions.MANAGE_PERMISSIONS.value, decision=PermissionDecision.ALLOW_ALL.value
121
121
  )
122
+ # Map kinds and the relationship to protect from being read
123
+ kind_relationship_to_check = {
124
+ InfrahubKind.ACCOUNTROLE: "permissions",
125
+ InfrahubKind.BASEPERMISSION: "roles",
126
+ InfrahubKind.GLOBALPERMISSION: "roles",
127
+ InfrahubKind.OBJECTPERMISSION: "roles",
128
+ }
122
129
 
123
130
  async def supports(self, db: InfrahubDatabase, account_session: AccountSession, branch: Branch) -> bool: # noqa: ARG002
124
131
  return config.SETTINGS.main.allow_anonymous_access or account_session.authenticated
125
132
 
126
133
  async def check(
127
134
  self,
128
- db: InfrahubDatabase,
135
+ db: InfrahubDatabase, # noqa: ARG002
129
136
  account_session: AccountSession, # noqa: ARG002
130
137
  analyzed_query: InfrahubGraphQLQueryAnalyzer,
131
138
  query_parameters: GraphqlParams,
132
- branch: Branch,
139
+ branch: Branch, # noqa: ARG002
133
140
  ) -> CheckerResolution:
134
- is_permission_operation = False
135
- kinds = analyzed_query.query_report.impacted_models
136
-
137
- for kind in kinds:
138
- schema = get_schema(db=db, branch=branch, node_schema=kind)
139
- if is_permission_operation := kind in (
140
- InfrahubKind.BASEPERMISSION,
141
- InfrahubKind.GLOBALPERMISSION,
142
- InfrahubKind.OBJECTPERMISSION,
143
- ) or (isinstance(schema, NodeSchema) and InfrahubKind.BASEPERMISSION in schema.inherit_from):
144
- break
145
-
146
- if not is_permission_operation:
147
- return CheckerResolution.NEXT_CHECKER
148
-
149
- query_parameters.context.active_permissions.raise_for_permission(permission=self.permission_required)
141
+ for kind, relationship in self.kind_relationship_to_check.items():
142
+ if (
143
+ kind in analyzed_query.query_report.requested_read
144
+ and relationship in analyzed_query.query_report.requested_read[kind].relationships
145
+ ):
146
+ query_parameters.context.active_permissions.raise_for_permission(permission=self.permission_required)
147
+
148
+ for query in analyzed_query.query_report.queries:
149
+ if not query.infrahub_model:
150
+ continue
151
+
152
+ # Prevent mutations on permissions and account roles
153
+ if (
154
+ query.operation == GraphQLOperation.MUTATION
155
+ and isinstance(query.infrahub_model, NodeSchema)
156
+ and (
157
+ InfrahubKind.BASEPERMISSION in query.infrahub_model.inherit_from
158
+ or query.infrahub_model.kind == InfrahubKind.ACCOUNTROLE
159
+ )
160
+ ):
161
+ query_parameters.context.active_permissions.raise_for_permission(permission=self.permission_required)
150
162
 
151
163
  return CheckerResolution.NEXT_CHECKER
152
164
 
infrahub/lock.py CHANGED
@@ -13,6 +13,7 @@ from redis.asyncio.lock import Lock as GlobalLock
13
13
 
14
14
  from infrahub import config
15
15
  from infrahub.core.timestamp import current_timestamp
16
+ from infrahub.worker import WORKER_IDENTITY
16
17
 
17
18
  if TYPE_CHECKING:
18
19
  from types import TracebackType
@@ -92,7 +93,7 @@ class NATSLock:
92
93
  await self.release()
93
94
 
94
95
  async def acquire(self) -> None:
95
- token = current_timestamp()
96
+ token = f"{current_timestamp()}::{WORKER_IDENTITY}"
96
97
  while True:
97
98
  if await self.do_acquire(token):
98
99
  self.token = token
@@ -138,9 +139,9 @@ class InfrahubLock:
138
139
  if self.use_local:
139
140
  self.local = LocalLock()
140
141
  elif config.SETTINGS.cache.driver == config.CacheDriver.Redis:
141
- self.remote = GlobalLock(redis=self.connection, name=self.name)
142
+ self.remote = GlobalLock(redis=self.connection, name=f"lock.{self.name}")
142
143
  else:
143
- self.remote = NATSLock(service=self.connection, name=self.name)
144
+ self.remote = NATSLock(service=self.connection, name=f"lock.{self.name}")
144
145
 
145
146
  async def __aenter__(self):
146
147
  await self.acquire()
@@ -156,7 +157,7 @@ class InfrahubLock:
156
157
  async def acquire(self) -> None:
157
158
  with LOCK_ACQUIRE_TIME_METRICS.labels(self.name, self.lock_type).time():
158
159
  if not self.use_local:
159
- await self.remote.acquire(token=current_timestamp())
160
+ await self.remote.acquire(token=f"{current_timestamp()}::{WORKER_IDENTITY}")
160
161
  else:
161
162
  await self.local.acquire()
162
163
  self.acquire_time = time.time_ns()
@@ -42,7 +42,7 @@ async def create_branch_registry(db: InfrahubDatabase, branch: Branch) -> None:
42
42
 
43
43
 
44
44
  async def update_branch_registry(db: InfrahubDatabase, branch: Branch) -> None:
45
- """Update the registry for a branch if the schema hash has changed."""
45
+ """Update the registry for a branch if the schema hash has changed or the branch was rebased."""
46
46
 
47
47
  existing_branch: Branch = registry.branch[branch.name]
48
48
 
@@ -50,13 +50,23 @@ async def update_branch_registry(db: InfrahubDatabase, branch: Branch) -> None:
50
50
  log.warning("Branch schema hash is not set, cannot update branch registry")
51
51
  return
52
52
 
53
- if existing_branch.schema_hash and existing_branch.schema_hash.main == branch.active_schema_hash.main:
53
+ if existing_branch.schema_hash.main == branch.active_schema_hash.main:
54
54
  log.debug(
55
- "Branch schema hash is the same, no need to update branch registry",
55
+ "Branch schema hash is the same, no need to refresh the GraphQL schema within the registry",
56
56
  branch=branch.name,
57
57
  hash=existing_branch.schema_hash.main,
58
58
  worker=WORKER_IDENTITY,
59
59
  )
60
+ if existing_branch.branched_from != branch.branched_from:
61
+ # If the hash is the same but the branched_from timestamp differs it means
62
+ # that the branch has been rebased and these timestamps need to be refreshed
63
+ # in the registry even though the schema doesn't need to be reloaded.
64
+ log.info(
65
+ "Updating branched_from property in registry for rebased branch",
66
+ branch=branch.name,
67
+ worker=WORKER_IDENTITY,
68
+ )
69
+ registry.branch[branch.name] = branch
60
70
  return
61
71
 
62
72
  log.info(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: infrahub-server
3
- Version: 1.4.2
3
+ Version: 1.4.4
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
@@ -97,7 +97,7 @@ If you just want to try Infrahub out, you can use our [Infrahub Sandbox](https:/
97
97
 
98
98
  **Service Catalog** - Infrahub acts as the underlying system to provide infrastructure-as-a-service, allowing you to manage your services and lifecycle them as the services evolve.
99
99
 
100
- **Infrastructure Automation** - Provide infrastructure and network automation workflows with Infrahub rendering configurations and artifacts via Jinja2 and python,then passing to deployment tools such as [Nornir](https://www.opsmill.com/simplifying-network-automation-workflows-with-infrahub-nornir-and-jinja2/), [Ansible](https://docs.infrahub.app/ansible/ansible/), Terraform, or vendor-specific tools.
100
+ **Infrastructure Automation** - Provide infrastructure and network automation workflows with Infrahub rendering configurations and artifacts via Jinja2 and python,then passing to deployment tools such as [Nornir](https://www.opsmill.com/simplifying-network-automation-workflows-with-infrahub-nornir-and-jinja2/), [Ansible](https://docs.infrahub.app/ansible), Terraform, or vendor-specific tools.
101
101
 
102
102
  **Inventory Management** - Infrahub serves as a centralized inventory system for your infrastructure, allowing you to manage your inventory and track changes to your infrastructure. It provides a WebUI and API for other teams to self-service the information needed to allow the organization to operate.
103
103
 
@@ -119,7 +119,7 @@ For longer term tests, you can deploy a local instance of Infrahub by referring
119
119
 
120
120
  If you'd like to learn more about Infrahub, please refer to the following resources:
121
121
 
122
- - [Infrahub Overview](https://docs.infrahub.app/overview/)
122
+ - [Infrahub Overview](https://docs.infrahub.app/getting-started/overview)
123
123
  - [Infrahub Documentation](https://docs.infrahub.app/)
124
124
  - [FAQ](https://docs.infrahub.app/faq/)
125
125
 
@@ -36,7 +36,7 @@ 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
38
38
  infrahub/branch/triggers.py,sha256=4sywoEX79fY2NkaGe6tTHnmytf4k6gXDm2FJHkkRJOw,793
39
- infrahub/cli/__init__.py,sha256=U0Ku6La8qpVpLdIkhCRqxQyvAFJG8WRZAh2yx6yzxCs,1781
39
+ infrahub/cli/__init__.py,sha256=d8x7c4CIq66zul2w9TdT82qjR5cMXV2zSujovJ4kV00,3948
40
40
  infrahub/cli/constants.py,sha256=CoCeTMnfsA3j7ArdLKLZK4VPxOM7ls17qpxGJmND0m8,129
41
41
  infrahub/cli/context.py,sha256=u2EYq9-vjzzfZdIYIbYmTG67nYSsyVFDPBtJ3KgE7KY,494
42
42
  infrahub/cli/db.py,sha256=hqZcklxTgAKuXWOthrltOdENsiiTthq6tqySxu4HPFE,37727
@@ -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=ZYp8RkLFWRjTvuZPPtnGwr38etrRSIUJZiJjqVJdf3o,19
142
+ infrahub/core/graph/__init__.py,sha256=O8Xci_50VdpSOWWUsegCGQvL7gUWJAJNc1ompQbvhf0,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=RUaz8bfg8ifZjf6Hfl-J7F5qOP-UbOiFwlalzI9pSok,4091
161
+ infrahub/core/migrations/graph/__init__.py,sha256=8NNpXMWWxKbuliktUJg7JllIePGERZxOnumC-UmkpX0,4161
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
@@ -196,6 +196,7 @@ infrahub/core/migrations/graph/m034_find_orphaned_schema_fields.py,sha256=Fekohf
196
196
  infrahub/core/migrations/graph/m035_orphan_relationships.py,sha256=K0J5gzFF5gY-QMom0tRGDckqw19aN0uSV8AZ8KdKSMo,1371
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
+ infrahub/core/migrations/graph/m038_redo_0000_prefix_fix.py,sha256=8seWnXQhgEJDFLWxYHVcnMNDPcHq5C24c0RYrtn_WGE,2411
199
200
  infrahub/core/migrations/query/__init__.py,sha256=JoWOUWlV6IzwxWxObsfCnAAKUOHJkE7dZlOsfB64ZEo,876
200
201
  infrahub/core/migrations/query/attribute_add.py,sha256=oitzB-PPAclfyNtcwCWJY3RdI5Zi4oEnR62BDzn1UQk,4835
201
202
  infrahub/core/migrations/query/attribute_rename.py,sha256=onb9Nanht1Tz47JgneAcFsuhqqvPS6dvI2nNjRupLLo,6892
@@ -214,7 +215,7 @@ infrahub/core/migrations/schema/node_remove.py,sha256=NdPNZH9qXf6HbyTMSaQ3aU58XW
214
215
  infrahub/core/migrations/schema/placeholder_dummy.py,sha256=3T3dBwC_ZyehOJr2KRKFD6CXaq8QIjVk0N-nWAMvFYw,308
215
216
  infrahub/core/migrations/schema/tasks.py,sha256=2J8gHGSP-WhxSi4GYhOc9xAJOg_S1ONm3YE4_ukLKxw,4164
216
217
  infrahub/core/migrations/shared.py,sha256=G72VIHtH4DOM09UOXZE2zfILGDej7nPKdvdfrPRMp7M,7921
217
- infrahub/core/models.py,sha256=p2XwVzLiTNwz_4Bs4MTJD64wneR9bCUtfGs_ybBQn1c,26354
218
+ infrahub/core/models.py,sha256=xwEeXSTD4j13hbyZAjZAlrhXk1hHvWl9I7ve7uUbR7U,26649
218
219
  infrahub/core/node/__init__.py,sha256=6qtg-hzuH-hTxX4hJrhAB_lUmcIx404wyn35WhiMgZo,42435
219
220
  infrahub/core/node/base.py,sha256=BAowVRCK_WC50yXym1kCyUppJDJnrODGU5uoj1s0Yd4,2564
220
221
  infrahub/core/node/constraints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -299,7 +300,7 @@ infrahub/core/schema/generated/genericnode_schema.py,sha256=FvfeYfld9YeKHOzyH6G3
299
300
  infrahub/core/schema/generated/node_schema.py,sha256=PMgbQX1PC5ixQsjOFw_bcEfa4txGNUI6BV6OkFDG3wQ,1631
300
301
  infrahub/core/schema/generated/relationship_schema.py,sha256=F198_LNmQRV0xSEBPRA3vBAioEItpYZVNApOmdb8_E4,5851
301
302
  infrahub/core/schema/generic_schema.py,sha256=KSd5fwMDR2hjrsb1vOaK83Lw5jJAob1FLoudgU5_E2Y,1594
302
- infrahub/core/schema/manager.py,sha256=RAMox35C36eTELkfukVnQ5L9ob-RIZyDcvrHeVye1Ic,33123
303
+ infrahub/core/schema/manager.py,sha256=ImD9jTctdkVc6UXyynP8PUZ2gE6wr87upTpelcLzBfI,33245
303
304
  infrahub/core/schema/node_schema.py,sha256=cWeQ2iu6Z9Ay6l2gYnPRnS0JAqYQccueYhpEcfep9Mo,6252
304
305
  infrahub/core/schema/profile_schema.py,sha256=sV4lp1UyBye12M7BJcA2obb4tx3M9J5P89SLqkmFxJY,1237
305
306
  infrahub/core/schema/relationship_schema.py,sha256=R-1iC1d70bBW0vWhgJhDB0_J3tRpOqcJmmLzh39NuYs,8501
@@ -460,7 +461,7 @@ infrahub/graphql/auth/query_permission_checker/checker.py,sha256=OSJmoiqETvRtayY
460
461
  infrahub/graphql/auth/query_permission_checker/default_branch_checker.py,sha256=QiuZXFnaTPaILeIl7MoEu4e6EYexRJd-AZLgAHwaCQc,2173
461
462
  infrahub/graphql/auth/query_permission_checker/interface.py,sha256=p4IIicoD1QAM1Q_NiNqOMQqSAIkbNrSHJ-pAlrJfBfo,848
462
463
  infrahub/graphql/auth/query_permission_checker/merge_operation_checker.py,sha256=_cv3jSsIA3MXQcD2etCgKzvTKaKNAhwDNqPRIlIzUo4,1640
463
- infrahub/graphql/auth/query_permission_checker/object_permission_checker.py,sha256=5Af8bwtG5I-jxPQGOG_-qKV9bQFECn27e_gBoYDxXrs,8408
464
+ infrahub/graphql/auth/query_permission_checker/object_permission_checker.py,sha256=1IVUWIV-GOY_pc3zApii2WNdAG7xHhnw05mUUtXbN6A,9093
464
465
  infrahub/graphql/auth/query_permission_checker/super_admin_checker.py,sha256=2RlJ1G-BmJIQW33SletzK1gIQ3nyEB2edTiX0xAjR2E,1550
465
466
  infrahub/graphql/constants.py,sha256=iVvo3HK-ch7YmHw1Eg2E_ja3I45cNAwjpYahsnu85CI,37
466
467
  infrahub/graphql/context.py,sha256=ahp-MvX_0glg9mSPbPVhEwvbYzrIKtaEAGt7CVnAusE,1681
@@ -550,7 +551,7 @@ infrahub/groups/models.py,sha256=eOiNtmJapT4zRQ3XbUf8TVb_bhzG2lUfVPhIBZv3Wz0,759
550
551
  infrahub/groups/parsers.py,sha256=A60n-JmT-8F-7ATugV97R-mPWpRhNVNxqEbpibxiiUs,4260
551
552
  infrahub/groups/tasks.py,sha256=yg-VNj37iWdBHyPE9BhN2QzjVo2D8glnlO37pwGcdsU,1563
552
553
  infrahub/helpers.py,sha256=KchbQqgipU4VjfwnDbzCGjnEv-4espw_g63Zw4KAhbo,251
553
- infrahub/lock.py,sha256=M7HJMOBLGybhss0SVEJ6oDHY0O5a2A4ylWkG9EVHjMk,8542
554
+ infrahub/lock.py,sha256=EagMvKKPqWXKLvOpw2OXNPxNa1XLG0JNZgMzCU45EuA,8654
554
555
  infrahub/log.py,sha256=4FP80DGY5sk9R7CjcDpPiTfxuow-nfbhXWVpDByCVrw,2817
555
556
  infrahub/menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
556
557
  infrahub/menu/constants.py,sha256=z9aAxIBlAMXrjl3dXo0vZxBU0pcfh1FQOiqIussvpD0,195
@@ -662,7 +663,7 @@ infrahub/tasks/check.py,sha256=37n1U1Knb3AV6kz2sw_IabL9pnlqceLVICWf9GdSxZE,687
662
663
  infrahub/tasks/dummy.py,sha256=6SxlQqQXZqgTuwLaAsK-p1O1TYNKfdGmUYjNJFNHe9s,1209
663
664
  infrahub/tasks/keepalive.py,sha256=D6yh3Vmlr1WCEpZibk2YLc2n0dCcX6tM62HCSxyGEu8,783
664
665
  infrahub/tasks/recurring.py,sha256=RJO2zdzCU-38Kb81lmCUbFQOBhGui8qn2QizTV4vj9I,447
665
- infrahub/tasks/registry.py,sha256=zanLxRT_RFkYV2Y3OQedHu2-PTBwoExbAzgokT0TZjQ,3957
666
+ infrahub/tasks/registry.py,sha256=ncoiZ-GAkyeuKTy5gRkGzQhtx1rSLsMX4o9uZ1A0Kkk,4543
666
667
  infrahub/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
667
668
  infrahub/telemetry/constants.py,sha256=_5mJAZaT_wTCaF7Yzsd---Zn1N6GZkoP_954GK8K4-c,184
668
669
  infrahub/telemetry/database.py,sha256=9UVPOxRionVF65jjo8slRIaNBOv-KMRzq7I-7fe3wZE,3111
@@ -826,8 +827,8 @@ infrahub_testcontainers/models.py,sha256=ASYyvl7d_WQz_i7y8-3iab9hwwmCl3OCJavqVbe
826
827
  infrahub_testcontainers/performance_test.py,sha256=hvwiy6tc_lWniYqGkqfOXVGAmA_IV15VOZqbiD9ezno,6149
827
828
  infrahub_testcontainers/plugin.py,sha256=I3RuZQ0dARyKHuqCf0y1Yj731P2Mwf3BJUehRJKeWrs,5645
828
829
  infrahub_testcontainers/prometheus.yml,sha256=610xQEyj3xuVJMzPkC4m1fRnCrjGpiRBrXA2ytCLa54,599
829
- infrahub_server-1.4.2.dist-info/LICENSE.txt,sha256=7GQO7kxVoQYnZtFrjZBKLRXbrGwwwimHPPOJtqXsozQ,11340
830
- infrahub_server-1.4.2.dist-info/METADATA,sha256=d-zSV3_9JrWJwJRhXIxjvryRmMyxZO_HQiRc4-A_T84,8271
831
- infrahub_server-1.4.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
832
- infrahub_server-1.4.2.dist-info/entry_points.txt,sha256=UXIeFWDsrV-4IllNvUEd6KieYGzQfn9paga2YyABOQI,393
833
- infrahub_server-1.4.2.dist-info/RECORD,,
830
+ infrahub_server-1.4.4.dist-info/LICENSE.txt,sha256=7GQO7kxVoQYnZtFrjZBKLRXbrGwwwimHPPOJtqXsozQ,11340
831
+ infrahub_server-1.4.4.dist-info/METADATA,sha256=FO70Jv93bMA5iuHIz3mW36epeZJC6wHgKttC65vvzMU,8277
832
+ infrahub_server-1.4.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
833
+ infrahub_server-1.4.4.dist-info/entry_points.txt,sha256=UXIeFWDsrV-4IllNvUEd6KieYGzQfn9paga2YyABOQI,393
834
+ infrahub_server-1.4.4.dist-info/RECORD,,