Skip to content

Commit abf192e

Browse files
committed
make multitenant by storing the azure tenant ID
1 parent c520a08 commit abf192e

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

llamazure/history/__main__.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import os
55
from dataclasses import asdict, is_dataclass
66
from typing import Dict, cast
7+
from uuid import UUID
78

89
from azure.identity import DefaultAzureCredential
910

1011
from llamazure.azgraph.azgraph import Graph
1112
from llamazure.azgraph.models import ResErr
13+
from llamazure.azrest.azrest import AzRest
14+
from llamazure.azrest.models import Req as AzReq, AzList
1215
from llamazure.history.data import DB, TSDB
1316
from llamazure.rid import mp
1417
from llamazure.tresource.mp import MPData, TresourceMPData
@@ -22,6 +25,8 @@ def default(self, o):
2225
return asdict(o)
2326
if isinstance(o, datetime.datetime):
2427
return o.isoformat()
28+
if isinstance(o, UUID):
29+
return str(o)
2530
return super().default(o)
2631

2732

@@ -38,7 +43,13 @@ def reformat_resources_for_tresource(resources):
3843
db = DB(tsdb)
3944
db.create_tables()
4045

41-
g = Graph.from_credential(DefaultAzureCredential())
46+
credential = DefaultAzureCredential()
47+
g = Graph.from_credential(credential)
48+
azr = AzRest.from_credential(credential)
49+
50+
tenants = azr.call(AzReq.get("GetTenants", "/tenants", "2022-12-01", AzList[dict]))
51+
tenant_id = UUID(tenants[0]["tenantId"])
52+
4253
resources = g.q("Resources")
4354
if isinstance(resources, ResErr):
4455
raise RuntimeError(ResErr)
@@ -48,13 +59,13 @@ def reformat_resources_for_tresource(resources):
4859

4960
snapshot_time = datetime.datetime.utcnow()
5061

51-
db.insert_snapshot(snapshot_time, ((cast(str, path), mpdata.data) for path, mpdata in tree.resources.items() if mpdata.data is not None))
62+
db.insert_snapshot(snapshot_time, tenant_id, ((cast(str, path), mpdata.data) for path, mpdata in tree.resources.items() if mpdata.data is not None))
5263

5364
delta_q = g.q("Resources | take(1)")
5465
if isinstance(delta_q, ResErr):
5566
raise RuntimeError(ResErr)
5667
delta = delta_q[0]
57-
db.insert_delta(snapshot_time + datetime.timedelta(seconds=1), delta["id"].lower(), delta)
68+
db.insert_delta(snapshot_time + datetime.timedelta(seconds=1), tenant_id, delta["id"].lower(), delta)
5869

5970
print(json.dumps(db.read_latest(), indent=2, cls=MyEncoder))
6071
# print(json.dumps(db.read_snapshot(snapshot_time + datetime.timedelta(seconds=2)), indent=2, cls=MyEncoder))

llamazure/history/data.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import datetime
33
from textwrap import dedent
44
from typing import Any, Iterable, Optional, Tuple
5+
from uuid import UUID
56

67
import psycopg
78
from psycopg.types.json import Jsonb
@@ -49,8 +50,9 @@ def create_tables(self):
4950
dedent(
5051
"""\
5152
CREATE TABLE IF NOT EXISTS snapshot (
52-
id SERIAL PRIMARY KEY,
53-
time TIMESTAMPTZ NOT NULL
53+
id SERIAL PRIMARY KEY,
54+
time TIMESTAMPTZ NOT NULL,
55+
azure_tenant UUID
5456
)
5557
"""
5658
)
@@ -61,32 +63,33 @@ def create_tables(self):
6163
"""\
6264
CREATE TABLE IF NOT EXISTS res (
6365
time TIMESTAMPTZ NOT NULL,
64-
snapshot INTEGER,
65-
rid VARCHAR,
66-
data JSONB,
66+
snapshot INTEGER,
67+
azure_tenant UUID,
68+
rid VARCHAR,
69+
data JSONB,
6770
FOREIGN KEY (snapshot) REFERENCES snapshot (id)
6871
)
6972
"""
7073
)
7174
)
7275
self.db.create_hypertable("res", "time")
7376

74-
def insert_resource(self, time: datetime.datetime, snapshot_id, rid: str, data: dict):
77+
def insert_resource(self, time: datetime.datetime, azure_tenant: UUID, snapshot_id, rid: str, data: dict):
7578
"""Insert a resource into the DB"""
7679
self.db.exec(
77-
"""INSERT INTO res (time, snapshot, rid, data) VALUES (%s, %s, %s, %s)""",
78-
(time, snapshot_id, rid, Jsonb(data)),
80+
"""INSERT INTO res (time, snapshot, azure_tenant, rid, data) VALUES (%s, %s, %s, %s, %s)""",
81+
(time, snapshot_id, azure_tenant, rid, Jsonb(data)),
7982
)
8083

81-
def insert_snapshot(self, time: datetime.datetime, resources: Iterable[Tuple[str, dict]]):
84+
def insert_snapshot(self, time: datetime.datetime, azure_tenant: UUID, resources: Iterable[Tuple[str, dict]]):
8285
"""Insert a complete snapshot into the DB"""
83-
snapshot_id = self.db.exec_returning("""INSERT INTO snapshot (time) VALUES (%s) RETURNING id""", (time,))
86+
snapshot_id = self.db.exec_returning("""INSERT INTO snapshot (time, azure_tenant) VALUES (%s, %s) RETURNING id""", (time, azure_tenant))
8487
for rid, data in resources:
85-
self.insert_resource(time, snapshot_id, rid, data)
88+
self.insert_resource(time, azure_tenant, snapshot_id, rid, data)
8689

87-
def insert_delta(self, time: datetime.datetime, rid: str, data: dict):
90+
def insert_delta(self, time: datetime.datetime, azure_tenant: UUID, rid: str, data: dict):
8891
"""Insert a single delta into the DB"""
89-
return self.insert_resource(time, None, rid, data)
92+
return self.insert_resource(time, azure_tenant, None, rid, data)
9093

9194
def read_snapshot(self, time: datetime.datetime):
9295
"""Read a complete snapshot. Does not include any deltas"""

0 commit comments

Comments
 (0)