in cartography/intel/gcp/crm.py [0:0]
def load_gcp_folders(neo4j_session, data, gcp_update_tag):
"""
Ingest the GCP folders to Neo4j
:param neo4j_session: The Neo4j session
:param data: List of folders; output from crm.get_gcp_folders()
:param gcp_update_tag: The timestamp value to set our new Neo4j nodes with
:return: Nothing
"""
for folder in data:
# Get the correct parent type.
# Parents of folders can only be GCPOrganizations or other folders, see
# https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy
if folder['parent'].startswith("organizations"):
query = "MATCH (parent:GCPOrganization{id:{ParentId}})"
elif folder['parent'].startswith("folders"):
query = """
MERGE (parent:GCPFolder{id:{ParentId}})
ON CREATE SET parent.firstseen = timestamp()
"""
query += """
MERGE (folder:GCPFolder{id:{FolderName}})
ON CREATE SET folder.firstseen = timestamp()
SET folder.foldername = {FolderName},
folder.displayname = {DisplayName},
folder.lifecyclestate = {LifecycleState},
folder.lastupdated = {gcp_update_tag}
WITH parent, folder
MERGE (parent)-[r:RESOURCE]->(folder)
ON CREATE SET r.firstseen = timestamp()
SET r.lastupdated = {gcp_update_tag}
"""
neo4j_session.run(
query,
ParentId=folder['parent'],
FolderName=folder['name'],
DisplayName=folder.get('displayName', None),
LifecycleState=folder.get('lifecycleState', None),
gcp_update_tag=gcp_update_tag
)