77from queue import Queue
88from threading import Event
99from time import sleep
10- from typing import Dict , Optional , List , Any
10+ from typing import Dict , Optional , List , Any , Tuple
1111
1212import pkg_resources
1313import yaml
1414from resotoclient import Kind , Model
1515from resotolib .args import Namespace
1616from resotolib .baseplugin import BaseCollectorPlugin
17- from resotolib .baseresources import BaseResource
17+ from resotolib .baseresources import BaseResource , EdgeType
1818from resotolib .config import Config
1919from resotolib .core .actions import CoreFeedback
2020from resotolib .core .model_export import node_to_dict
@@ -50,7 +50,6 @@ def collectors(raw_config: Json, feedback: CoreFeedback) -> Dict[str, BaseCollec
5050
5151
5252def configure (path_to_config : Optional [str ]) -> Json :
53- # Config.init_default_config()
5453 if path_to_config :
5554 with open (path_to_config ) as f :
5655 return yaml .safe_load (f ) # type: ignore
@@ -61,6 +60,30 @@ def collect(collector: BaseCollectorPlugin, engine: Engine, feedback: CoreFeedba
6160 # collect cloud data
6261 feedback .progress_done (collector .cloud , 0 , 1 )
6362 collector .collect ()
63+
64+ # group all nodes by kind
65+ nodes_by_kind : Dict [str , List [Json ]] = defaultdict (list )
66+ node : BaseResource
67+ for node in collector .graph .nodes :
68+ node ._graph = collector .graph
69+ # create an exported node with the same scheme as resotocore
70+ exported = node_to_dict (node )
71+ exported ["type" ] = "node"
72+ exported ["ancestors" ] = {
73+ "cloud" : {"reported" : {"id" : node .cloud ().name }},
74+ "account" : {"reported" : {"id" : node .account ().name }},
75+ "region" : {"reported" : {"id" : node .region ().name }},
76+ "zone" : {"reported" : {"id" : node .zone ().name }},
77+ }
78+ nodes_by_kind [node .kind ].append (exported )
79+
80+ # group all edges by kind of from/to
81+ edges_by_kind : Dict [Tuple [str , str ], List [Json ]] = defaultdict (list )
82+ for from_node , to_node , key in collector .graph .edges :
83+ if key .edge_type == EdgeType .default :
84+ edge_node = {"from" : from_node .chksum , "to" : to_node .chksum , "type" : "edge" }
85+ edges_by_kind [(from_node .kind , to_node .kind )].append (edge_node )
86+
6487 # read the kinds created from this collector
6588 kinds = [from_json (m , Kind ) for m in collector .graph .export_model (walk_subclasses = False )]
6689 updater = sql_updater (Model ({k .fqn : k for k in kinds }), engine )
@@ -73,25 +96,9 @@ def collect(collector: BaseCollectorPlugin, engine: Engine, feedback: CoreFeedba
7396 with engine .connect () as conn :
7497 with conn .begin ():
7598 # create the ddl metadata from the kinds
76- updater .create_schema (conn , args )
99+ updater .create_schema (conn , args , list ( edges_by_kind . keys ()) )
77100 feedback .progress_done (schema , 1 , 1 , context = [collector .cloud ])
78101
79- # group all nodes by kind
80- nodes_by_kind = defaultdict (list )
81- node : BaseResource
82- for node in collector .graph .nodes :
83- node ._graph = collector .graph
84- # create an exported node with the same scheme as resotocore
85- exported = node_to_dict (node )
86- exported ["type" ] = "node"
87- exported ["ancestors" ] = {
88- "cloud" : {"reported" : {"id" : node .cloud ().name }},
89- "account" : {"reported" : {"id" : node .account ().name }},
90- "region" : {"reported" : {"id" : node .region ().name }},
91- "zone" : {"reported" : {"id" : node .zone ().name }},
92- }
93- nodes_by_kind [node .kind ].append (exported )
94-
95102 # insert batches of nodes by kind
96103 for kind , nodes in nodes_by_kind .items ():
97104 log .info (f"Inserting { len (nodes )} nodes of kind { kind } " )
@@ -100,12 +107,6 @@ def collect(collector: BaseCollectorPlugin, engine: Engine, feedback: CoreFeedba
100107 ne_count += len (nodes )
101108 feedback .progress_done (syncdb , ne_count , node_edge_count , context = [collector .cloud ])
102109
103- # group all nodes by kind of from/to
104- edges_by_kind = defaultdict (list )
105- for from_node , to_node , _ in collector .graph .edges :
106- edge_node = {"from" : from_node .chksum , "to" : to_node .chksum , "type" : "edge" }
107- edges_by_kind [(from_node .kind , to_node .kind )].append (edge_node )
108-
109110 # insert batches of edges by from/to kind
110111 for from_to , nodes in edges_by_kind .items ():
111112 log .info (f"Inserting { len (nodes )} edges from { from_to [0 ]} to { from_to [1 ]} " )
0 commit comments