def update_diagrams()

in source/msam/chalicelib/tags.py [0:0]


def update_diagrams():
    """
    scan for data with tags with MSAM-Diagram name and include in those named diagrams
    """
    try:
        ddb_table_name = CONTENT_TABLE_NAME
        ddb_resource = boto3.resource('dynamodb', config=MSAM_BOTO3_CONFIG)
        ddb_table = ddb_resource.Table(ddb_table_name)
        # expensive textual scan
        response = ddb_table.scan(FilterExpression="contains(#data, :tagname)", ExpressionAttributeNames={"#data": "data"}, ExpressionAttributeValues={":tagname": "MSAM-Diagram"})
        items = response["Items"]
        # check for paging
        while "LastEvaluatedKey" in response:
            # scan again with start key
            response = ddb_table.scan(
                FilterExpression="contains(#data, :tagname)",
                ExpressionAttributeNames={"#data": "data"},
                ExpressionAttributeValues={":tagname": "MSAM-Diagram"},
                ExclusiveStartKey=response['LastEvaluatedKey'])
            items = items + response["Items"]
        # filter down the results
        for record in items:
            cloud_resource = json.loads(record["data"])
            if "Tags" in cloud_resource:
                if "MSAM-Diagram" in cloud_resource["Tags"]:
                    arn = record["arn"]
                    diagram_name = cloud_resource["Tags"]["MSAM-Diagram"]
                    print("arn {} needed on diagram {}".format(arn, diagram_name))
                    diagrams = settings.get_setting("diagrams")
                    if not diagrams:
                        diagrams = []
                    found_diagram = False
                    view_id = None
                    for diagram in diagrams:
                        if diagram["name"] == diagram_name:
                            view_id = diagram["view_id"]
                            found_diagram = True
                            print("found diagram id {}".format(view_id))
                    if not found_diagram:
                        view_id = stringcase.snakecase(diagram_name)
                        print("new diagram id {}".format(view_id))
                        diagrams.append({"name": diagram_name, "view_id": view_id})
                        settings.put_setting("diagrams", diagrams)
                        print("created diagram id {}".format(view_id))
                    # check if this node is already on the diagram layout
                    if not layout.has_node(view_id, arn):
                        print("adding node {} to diagram id {}".format(arn, view_id))
                        # add the node arn to the layout
                        layout_items = [{"view": view_id, "id": arn, "x": 0, "y": 0}]
                        layout.set_node_layout(layout_items)
                    else:
                        print("node {} already on diagram id {}".format(arn, view_id))
    except ClientError as error:
        print(error)