def test_layout_sg(i_id, i, sn):
    sn_id = sn['SubnetId']
    if 'SecurityGroups' in i:
        sg_ids = i['SecurityGroups'].keys()
    else:
        sg_ids = [s['VpcSecurityGroupId'] for s in i['VpcSecurityGroups']]
    sg_group = "_".join(sg_ids)

    link("%s__%s__in" % (sn_id, sg_group), i_id)
    link(i_id, "%s__%s__out" % (sn_id, sg_group))

    if 'nacl' in sn:
        for nacl_id, nacl in sn['nacl'].items():
            link(
                "%s__%s__in" % (sn_id, nacl_id),
                "%s__%s__in" % (sn_id, sg_group)
            )
            link(
                "%s__%s__out" % (sn_id, sg_group),
                "%s__%s__out" % (sn_id, nacl_id)
            )

    sn_az = sn['AvailabilityZone']

    print 'subgraph "cluster_%s__%s" {' % (sn_id, sg_group)
    print '"%s"' % i_id
    print 'label = "%s"' % sg_group

    if 'LoadBalancerName' in i:
        i_id = i_id.split('_')[-1]
        link("%s_%s" % (sn_az, i_id), "%s_rules" % i_id)

    print "}"
def main():
    gather_data()
    with open('data.json', 'r') as jsonfile:
        aws = json.load(jsonfile)

    print "digraph G {"
    #print "overlap = false;"
    #print "splines = true;"
    print 'node [shape="plaintext"]'
    print """
    splines=true;
    sep="+25,25";
    overlap=scalexy;
    nodesep=0.6;
    node [fontsize=11];
    """
    already_printed = set([])
    sgs = []

    for sn_id, sn in aws['subnets'].items():
        print "//", sn_id
        sn_cluster = "cluster_%s" % sn_id
        print 'subgraph "%s" {' % sn_cluster
        print 'label = "%s"' % sn_id

        for instance_id, instance in sn['instances'].items():
            if instance_id in already_printed:
                continue
            print '"%s" [label="%s"]' % (instance_id, instance['tag_Name'])
            already_printed.add(instance_id)

        for elb_id, elb in sn['elb'].items():
            if elb_id in already_printed:
                continue
            print '"%s"' % elb_id
            already_printed.add(elb_id)

        for rds_id, rds in sn['rds'].items():
            if rds_id in already_printed:
                continue
            print '"%s"' % rds_id
            already_printed.add(rds_id)

        print "}"

        for acl_id, acl in sn['nacl'].items():
            print '"%s" [label=<%s>];' % (acl_id, acl_rules(acl))
            link(sn_cluster, acl_id)

        for instance_id, instance in sn['instances'].items():
            for sg_id, sg in instance['SecurityGroups'].items():
                link(instance_id, sg_id)
                sgs.append(sg)

        for elb_id, elb in sn['elb'].items():
            for sg_id in elb['SecurityGroups'].keys():
                link(elb_id, sg_id)
            for instance_id, instance in elb['Instances'].items():
                link(elb_id, instance_id)

        for rds_id, rds in sn['rds'].items():
            for sg_id in rds['SecurityGroups'].keys():
                link(rds_id, sg_id)

        for sg in sgs:
            sg_id = sg['GroupId']
            print '"%s" [label=<%s>];' % (sg_id, sg_rules(sg))
    print "}"