{"action":"created","comment":{"url":"https://api.github.com/repos/ofiwg/fabtests/pulls/comments/32772821","id":32772821,"diff_hunk":"@@ -0,0 +1,471 @@\n+/*\n+ * Copyright (C) 2002-2012 the Network-Based Computing Laboratory\n+ * Copyright (c) 2013-2014 Intel Corporation.  All rights reserved.\n+ * Copyright (c) 2015 Cray Inc.  All rights reserved.\n+ *\n+ * This software is available to you under a choice of one of two\n+ * licenses.  You may choose to be licensed under the terms of the GNU\n+ * General Public License (GPL) Version 2, available from the file\n+ * COPYING in the main directory of this source tree, or the\n+ * BSD license below:\n+ *\n+ *     Redistribution and use in source and binary forms, with or\n+ *     without modification, are permitted provided that the following\n+ *     conditions are met:\n+ *\n+ *      - Redistributions of source code must retain the above\n+ *        copyright notice, this list of conditions and the following\n+ *        disclaimer.\n+ *\n+ *      - Redistributions in binary form must reproduce the above\n+ *        copyright notice, this list of conditions and the following\n+ *        disclaimer in the documentation and/or other materials\n+ *        provided with the distribution.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\n+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n+ * SOFTWARE.\n+ */\n+\n+#include <unistd.h>\n+#include <stdlib.h>\n+#include <stdio.h>\n+#include <math.h>\n+#include <assert.h>\n+#include <sys/time.h>\n+#include <string.h>\n+\n+#include <rdma/fabric.h>\n+#include <rdma/fi_domain.h>\n+#include <rdma/fi_errno.h>\n+#include <rdma/fi_endpoint.h>\n+#include <rdma/fi_cm.h>\n+#include <rdma/fi_rma.h>\n+\n+#include \"ft_utils.h\"\n+#include \"../include/shared.h\"\n+\n+#define MAX_REQ_NUM 1000\n+\n+#define MAX_ALIGNMENT 65536\n+#define MAX_MSG_SIZE (1<<22)\n+#define MYBUFSIZE (MAX_MSG_SIZE + MAX_ALIGNMENT)\n+\n+#define HEADER \"# Libfabric Bandwidth Test \\n\"\n+#ifndef FIELD_WIDTH\n+#   define FIELD_WIDTH 20\n+#endif\n+#ifndef FLOAT_PRECISION\n+#   define FLOAT_PRECISION 2\n+#endif\n+\n+int loop = 100;\n+int window_size = 64;\n+int skip = 10;\n+\n+int loop_large = 20;\n+int window_size_large = 64;\n+int skip_large = 2;\n+\n+int large_message_size = 8192;\n+\n+char s_buf_original[MYBUFSIZE];\n+char r_buf_original[MYBUFSIZE];\n+\n+static int rx_depth = 512;\n+\n+struct fi_info *fi, *hints;\n+struct fid_fabric *fab;\n+struct fid_domain *dom;\n+struct fid_ep *ep;\n+struct fid_av *av;\n+struct fid_cq *rcq, *scq;\n+struct fid_mr *r_mr, *l_mr;\n+struct fi_context fi_ctx_send;\n+struct fi_context fi_ctx_recv;\n+struct fi_context fi_ctx_av;\n+\n+void *addrs;\n+fi_addr_t *fi_addrs;\n+\n+typedef struct buf_desc {\n+\tuint64_t addr;\n+\tuint64_t key;\n+} buf_desc_t;\n+\n+buf_desc_t *rbuf_descs;\n+\n+int myid, numprocs;\n+\n+void print_usage(void)\n+{\n+\tfprintf(stderr, \"\\nOptions:\\n\");\n+\tfprintf(stderr, \"  -f <provider>\\tspecific provider name eg IP, verbs\\n\");\n+\tfprintf(stderr, \"  -h\\t\\tdisplay this help output\\n\");\n+\treturn;\n+}\n+\n+static double get_time(void)\n+{\n+\tstruct timeval tv;\n+\tdouble td;\n+\tgettimeofday(&tv, NULL);\n+\ttd = tv.tv_sec + (tv.tv_usec * 0.000001);\n+\treturn td;\n+}\n+\n+static void free_ep_res(void)\n+{\n+\tfi_close(&av->fid);\n+\tfi_close(&rcq->fid);\n+\tfi_close(&scq->fid);\n+}\n+\n+static int alloc_ep_res(void)\n+{\n+\tstruct fi_cq_attr cq_attr;\n+\tstruct fi_av_attr av_attr;\n+\tint ret;\n+\n+\tmemset(&cq_attr, 0, sizeof cq_attr);\n+\tcq_attr.format = FI_CQ_FORMAT_CONTEXT;\n+\tcq_attr.wait_obj = FI_WAIT_NONE;\n+\tcq_attr.size = rx_depth;\n+\n+\t/* Open completion queue for send completions */\n+\tret = fi_cq_open(dom, &cq_attr, &scq, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_cq_open\", ret);\n+\t\tgoto err1;\n+\t}\n+\n+\t/* Open completion queue for recv completions */\n+\tret = fi_cq_open(dom, &cq_attr, &rcq, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_cq_open\", ret);\n+\t\tgoto err2;\n+\t}\n+\n+\tmemset(&av_attr, 0, sizeof av_attr);\n+\tav_attr.type = fi->domain_attr->av_type ?\n+\t\t\tfi->domain_attr->av_type : FI_AV_TABLE;\n+\tav_attr.count = 2;\n+\tav_attr.name = NULL;\n+\n+\t/* Open address vector (AV) for mapping address */\n+\tret = fi_av_open(dom, &av_attr, &av, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_av_open\", ret);\n+\t\t goto err3;\n+\t }\n+\n+\treturn 0;\n+\n+err3:\n+\tfi_close(&rcq->fid);\n+err2:\n+\tfi_close(&scq->fid);\n+err1:\n+\treturn ret;\n+}\n+\n+static int bind_ep_res(void)\n+{\n+\tint ret;\n+\n+\t/* Bind Send CQ with endpoint to collect send completions */\n+\tret = fi_ep_bind(ep, &scq->fid, FI_SEND|FI_WRITE);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_ep_bind\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\t/* Bind Recv CQ with endpoint to collect recv completions */\n+\tret = fi_ep_bind(ep, &rcq->fid, FI_RECV);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_ep_bind\", ret);\n+\t\treturn ret;\n+\t}\n+\t\n+\t/* Bind AV with the endpoint to map addresses */\n+\tret = fi_ep_bind(ep, &av->fid, 0);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_ep_bind\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tret = fi_enable(ep);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_enable\", ret);\n+\t\treturn ret;\n+\t }\n+\n+\treturn ret;\n+}\n+\n+static int init_fabric(void)\n+{\n+\tint ret;\n+\tuint64_t flags = 0;\n+\n+\t/* Get fabric info */\n+\tret = fi_getinfo(FT_FIVERSION, NULL, NULL, flags, hints, &fi);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_getinfo\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\t/* Open fabric */\n+\tret = fi_fabric(fi->fabric_attr, &fab, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_fabric\", ret);\n+\t\tgoto err1;\n+\t}\n+\n+\t/* Open domain */\n+\tret = fi_domain(fab, fi, &dom, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_domain\", ret);\n+\t\tgoto err2;\n+\t}\n+\n+\t/* Open endpoint */\n+\tret = fi_endpoint(dom, fi, &ep, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_endpoint\", ret);\n+\t\tgoto err3;\n+\t}\n+\n+\t/* Allocate endpoint resources */\n+\tret = alloc_ep_res();\n+\tif (ret)\n+\t\tgoto err4;\n+\n+\t/* Bind EQs and AVs with endpoint */\n+\tret = bind_ep_res();\n+\tif (ret)\n+\t\tgoto err5;\n+\n+\treturn 0;\n+\n+err5:\n+\tfree_ep_res();\n+err4:\n+\tfi_close(&ep->fid);\n+err3:\n+\tfi_close(&dom->fid);\n+err2:\n+\tfi_close(&fab->fid);\n+err1:\n+\treturn ret;\n+}\n+\n+static int init_av(void)\n+{\n+\tvoid *addr;\n+\tsize_t addrlen = 0;\n+\tint ret;\n+\n+\tfi_getname(&ep->fid, NULL, &addrlen);\n+\taddr = malloc(addrlen);\n+\tassert(addr);\n+\tret = fi_getname(&ep->fid, addr, &addrlen);\n+\tif (ret != 0) {\n+\t\tFT_PRINTERR(\"fi_getname\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\taddrs = malloc(numprocs * addrlen);\n+\tassert(addrs);\n+\n+\tFT_Allgather(addr, addrlen, addrs);\n+\n+\tfi_addrs = malloc(numprocs * sizeof(fi_addr_t));\n+\tassert(fi_addrs);\n+\n+\t/* Insert address to the AV and get the fabric address back */\n+\tret = fi_av_insert(av, addrs, numprocs, fi_addrs, 0, &fi_ctx_av);\n+\tif (ret != numprocs) {\n+\t\tFT_PRINTERR(\"fi_av_insert\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tfree(addr);\n+\n+\treturn 0;\n+}\n+\n+int main(int argc, char *argv[])\n+{\n+\tint i, j, peer;\n+\tint size, align_size;\n+\tchar *s_buf, *r_buf;\n+\tdouble t_start = 0.0, t_end = 0.0, t = 0.0;\n+\tint op, ret;\n+\tbuf_desc_t lbuf_desc;\n+\tssize_t fi_rc;\n+\n+\tFT_Init(&argc, &argv);\n+\tFT_Rank(&myid);\n+\tFT_Job_size(&numprocs);\n+\n+\thints = fi_allocinfo();\n+\tif (!hints)\n+\t\treturn -1;\n+\n+\twhile ((op = getopt(argc, argv, \"f:h\")) != -1) {\n+\t\tswitch (op) {\t\t\t\n+\t\tcase 'f':\n+\t\t\thints->fabric_attr->prov_name = strdup(optarg);\n+\t\t\tbreak;\n+\t\tcase '?':\n+\t\tcase 'h':\n+\t\t\tprint_usage();\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\thints->ep_attr->type\t= FI_EP_RDM;\n+\thints->caps\t\t= FI_MSG | FI_RMA;\n+\thints->mode\t\t= ~0;\n+\thints->domain_attr->mr_mode = FI_MR_BASIC;\n+\n+\tif(numprocs != 2) {\n+\t\tif(myid == 0) {\n+\t\t\tfprintf(stderr, \"This test requires exactly two processes\\n\");\n+\t\t}\n+\t\tFT_Finalize();\n+\t\treturn -1;\n+\t}\n+\n+\t/* Fabric initialization */\n+\tret = init_fabric();\n+\tif(ret) {\n+\t\tfprintf(stderr, \"Problem in fabric initialization\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = init_av();\n+\tif(ret) {\n+\t\tfprintf(stderr, \"Problem in AV initialization\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\t/* Data initialization */\n+\talign_size = getpagesize();\n+\tassert(align_size <= MAX_ALIGNMENT);\n+\n+\ts_buf = (char *) (((unsigned long) s_buf_original + (align_size - 1)) /\n+\t\t\t\talign_size * align_size);\n+\tr_buf = (char *) (((unsigned long) r_buf_original + (align_size - 1)) /\n+\t\t\t\talign_size * align_size);\n+\n+\tret = fi_mr_reg(dom, r_buf, MYBUFSIZE, FI_REMOTE_WRITE, 0, 0, 0, &r_mr, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_mr_reg\", ret);\n+\t\treturn -1;\n+\t}\n+\n+\tlbuf_desc.addr = (uint64_t)r_buf;\n+\tlbuf_desc.key = fi_mr_key(r_mr);\n+\n+\trbuf_descs = (buf_desc_t *)malloc(numprocs * sizeof(buf_desc_t));\n+\n+\t/* Distribute memory keys */\n+\tFT_Allgather(&lbuf_desc, sizeof(lbuf_desc), rbuf_descs);\n+\n+\tret = fi_mr_reg(dom, s_buf, MYBUFSIZE, FI_WRITE, 0, 0, 0, &l_mr, NULL);\n+\tif (ret) {\n+\t\tFT_PRINTERR(\"fi_mr_reg\", ret);\n+\t\treturn -1;\n+\t}\n+\n+\tif (myid == 0) {\n+\t\tfprintf(stdout, HEADER);\n+\t\tfprintf(stdout, \"%-*s%*s\\n\", 10, \"# Size\", FIELD_WIDTH,\n+\t\t\t\t\"Bandwidth (MB/s)\");\n+\t\tfflush(stdout);\n+\t}\n+\n+\t/* Bandwidth test */\n+\tfor (size = 1; size <= MAX_MSG_SIZE; size *= 2) {\n+\t\t/* touch the data */\n+\t\tfor (i = 0; i < size; i++) {\n+\t\t\ts_buf[i] = 'a';\n+\t\t\tr_buf[i] = 'b';\n+\t\t}\n+\n+\t\tif (size > large_message_size) {\n+\t\t\tloop = loop_large;\n+\t\t\tskip = skip_large;\n+\t\t\twindow_size = window_size_large;\n+\t\t}\n+\n+\t\tif (myid == 0) {\n+\t\t\tpeer = 1;\n+\n+\t\t\tfor (i = 0; i < loop + skip; i++) {\n+\t\t\t\tif (i == skip) {\n+\t\t\t\t\tt_start = get_time();\n+\t\t\t\t}\n+\n+\t\t\t\tfor (j = 0; j < window_size; j++) {\n+\t\t\t\t\tfi_rc = fi_write(ep, s_buf, size, l_mr,\n+\t\t\t\t\t\t\tfi_addrs[peer],\n+\t\t\t\t\t\t\trbuf_descs[peer].addr,\n+\t\t\t\t\t\t\trbuf_descs[peer].key,\n+\t\t\t\t\t\t\t(void *)(intptr_t)j);\n+\t\t\t\t\tif (fi_rc) {\n+\t\t\t\t\t\tFT_PRINTERR(\"fi_write\", fi_rc);\n+\t\t\t\t\t\treturn fi_rc;\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\n+\t\t\t\twait_for_data_completion(scq, window_size);\n+\t\t\t}\n+\n+\t\t\tfi_rc = fi_send(ep, s_buf, 4, NULL,\n+\t\t\t\t\tfi_addrs[peer],\n+\t\t\t\t\tNULL);\n+\t\t\tassert(!fi_rc);\n+\t\t\tfi_rc = fi_recv(ep, s_buf, 4, NULL,\n+\t\t\t\t\tfi_addrs[peer],\n+\t\t\t\t\tNULL);","path":"perf/rdm_bw.c","position":null,"original_position":438,"commit_id":"f9a354c4a7ca6fc06b635548f96d041cfac02112","original_commit_id":"e3ec2388e1e6c2e7c91488d824e2913fdc2bcbaa","user":{"login":"shefty","id":3967608,"avatar_url":"https://avatars.githubusercontent.com/u/3967608?v=3","gravatar_id":"","url":"https://api.github.com/users/shefty","html_url":"https://github.com/shefty","followers_url":"https://api.github.com/users/shefty/followers","following_url":"https://api.github.com/users/shefty/following{/other_user}","gists_url":"https://api.github.com/users/shefty/gists{/gist_id}","starred_url":"https://api.github.com/users/shefty/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shefty/subscriptions","organizations_url":"https://api.github.com/users/shefty/orgs","repos_url":"https://api.github.com/users/shefty/repos","events_url":"https://api.github.com/users/shefty/events{/privacy}","received_events_url":"https://api.github.com/users/shefty/received_events","type":"User","site_admin":false},"body":"I was referring to the 5th parameter (src_addr) of fi_recv().  A receive buffer can either be posted as anonymous -- will match with a send from any remote source -- or 'directed' (in OFI terms).  A directed receive will only match with a send from a specific source.  If you want support for a 'directed' receive, you need to request that capability (FI_DIRECTED_RECV).  Without that cap being specified, fi_recv() will ignore the src_addr parameter, which is what the underlying provider will do in this case.\r\n\r\nSo, I would either specify a src_addr of 0, to better indicate that it doesn't matter, or add FI_DIRECTED_RECV as a cap.  For this test, the first option seems best.","created_at":"2015-06-18T20:12:49Z","updated_at":"2015-06-18T20:12:49Z","html_url":"https://github.com/ofiwg/fabtests/pull/279#discussion_r32772821","pull_request_url":"https://api.github.com/repos/ofiwg/fabtests/pulls/279","_links":{"self":{"href":"https://api.github.com/repos/ofiwg/fabtests/pulls/comments/32772821"},"html":{"href":"https://github.com/ofiwg/fabtests/pull/279#discussion_r32772821"},"pull_request":{"href":"https://api.github.com/repos/ofiwg/fabtests/pulls/279"}}},"pull_request":{"url":"https://api.github.com/repos/ofiwg/fabtests/pulls/279","id":37498744,"html_url":"https://github.com/ofiwg/fabtests/pull/279","diff_url":"https://github.com/ofiwg/fabtests/pull/279.diff","patch_url":"https://github.com/ofiwg/fabtests/pull/279.patch","issue_url":"https://api.github.com/repos/ofiwg/fabtests/issues/279","number":279,"state":"open","locked":false,"title":"Add rdm_bw, rdm_latency and rdm_mbw_mr benchmarks.","user":{"login":"ztiffany","id":10633253,"avatar_url":"https://avatars.githubusercontent.com/u/10633253?v=3","gravatar_id":"","url":"https://api.github.com/users/ztiffany","html_url":"https://github.com/ztiffany","followers_url":"https://api.github.com/users/ztiffany/followers","following_url":"https://api.github.com/users/ztiffany/following{/other_user}","gists_url":"https://api.github.com/users/ztiffany/gists{/gist_id}","starred_url":"https://api.github.com/users/ztiffany/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ztiffany/subscriptions","organizations_url":"https://api.github.com/users/ztiffany/orgs","repos_url":"https://api.github.com/users/ztiffany/repos","events_url":"https://api.github.com/users/ztiffany/events{/privacy}","received_events_url":"https://api.github.com/users/ztiffany/received_events","type":"User","site_admin":false},"body":"\r\nAdd rdm_bw, rdm_latency and rdm_mbw_mr benchmarks.  Add --with-pmi configure option to enable these PMI tests.\r\n\r\n    Signed-off-by: Zach Tiffany <ztiffany@cray.com>\r\n\r\n@shefty @jithinjosepkl","created_at":"2015-06-11T19:18:39Z","updated_at":"2015-06-18T20:12:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"580db1a9b89b7aaad4908c46a3f63961e8081867","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ofiwg/fabtests/pulls/279/commits","review_comments_url":"https://api.github.com/repos/ofiwg/fabtests/pulls/279/comments","review_comment_url":"https://api.github.com/repos/ofiwg/fabtests/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ofiwg/fabtests/issues/279/comments","statuses_url":"https://api.github.com/repos/ofiwg/fabtests/statuses/f9a354c4a7ca6fc06b635548f96d041cfac02112","head":{"label":"ztiffany:perf_tests","ref":"perf_tests","sha":"f9a354c4a7ca6fc06b635548f96d041cfac02112","user":{"login":"ztiffany","id":10633253,"avatar_url":"https://avatars.githubusercontent.com/u/10633253?v=3","gravatar_id":"","url":"https://api.github.com/users/ztiffany","html_url":"https://github.com/ztiffany","followers_url":"https://api.github.com/users/ztiffany/followers","following_url":"https://api.github.com/users/ztiffany/following{/other_user}","gists_url":"https://api.github.com/users/ztiffany/gists{/gist_id}","starred_url":"https://api.github.com/users/ztiffany/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ztiffany/subscriptions","organizations_url":"https://api.github.com/users/ztiffany/orgs","repos_url":"https://api.github.com/users/ztiffany/repos","events_url":"https://api.github.com/users/ztiffany/events{/privacy}","received_events_url":"https://api.github.com/users/ztiffany/received_events","type":"User","site_admin":false},"repo":{"id":32935395,"name":"fabtests-cray","full_name":"ztiffany/fabtests-cray","owner":{"login":"ztiffany","id":10633253,"avatar_url":"https://avatars.githubusercontent.com/u/10633253?v=3","gravatar_id":"","url":"https://api.github.com/users/ztiffany","html_url":"https://github.com/ztiffany","followers_url":"https://api.github.com/users/ztiffany/followers","following_url":"https://api.github.com/users/ztiffany/following{/other_user}","gists_url":"https://api.github.com/users/ztiffany/gists{/gist_id}","starred_url":"https://api.github.com/users/ztiffany/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ztiffany/subscriptions","organizations_url":"https://api.github.com/users/ztiffany/orgs","repos_url":"https://api.github.com/users/ztiffany/repos","events_url":"https://api.github.com/users/ztiffany/events{/privacy}","received_events_url":"https://api.github.com/users/ztiffany/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ztiffany/fabtests-cray","description":"","fork":true,"url":"https://api.github.com/repos/ztiffany/fabtests-cray","forks_url":"https://api.github.com/repos/ztiffany/fabtests-cray/forks","keys_url":"https://api.github.com/repos/ztiffany/fabtests-cray/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ztiffany/fabtests-cray/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ztiffany/fabtests-cray/teams","hooks_url":"https://api.github.com/repos/ztiffany/fabtests-cray/hooks","issue_events_url":"https://api.github.com/repos/ztiffany/fabtests-cray/issues/events{/number}","events_url":"https://api.github.com/repos/ztiffany/fabtests-cray/events","assignees_url":"https://api.github.com/repos/ztiffany/fabtests-cray/assignees{/user}","branches_url":"https://api.github.com/repos/ztiffany/fabtests-cray/branches{/branch}","tags_url":"https://api.github.com/repos/ztiffany/fabtests-cray/tags","blobs_url":"https://api.github.com/repos/ztiffany/fabtests-cray/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ztiffany/fabtests-cray/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ztiffany/fabtests-cray/git/refs{/sha}","trees_url":"https://api.github.com/repos/ztiffany/fabtests-cray/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ztiffany/fabtests-cray/statuses/{sha}","languages_url":"https://api.github.com/repos/ztiffany/fabtests-cray/languages","stargazers_url":"https://api.github.com/repos/ztiffany/fabtests-cray/stargazers","contributors_url":"https://api.github.com/repos/ztiffany/fabtests-cray/contributors","subscribers_url":"https://api.github.com/repos/ztiffany/fabtests-cray/subscribers","subscription_url":"https://api.github.com/repos/ztiffany/fabtests-cray/subscription","commits_url":"https://api.github.com/repos/ztiffany/fabtests-cray/commits{/sha}","git_commits_url":"https://api.github.com/repos/ztiffany/fabtests-cray/git/commits{/sha}","comments_url":"https://api.github.com/repos/ztiffany/fabtests-cray/comments{/number}","issue_comment_url":"https://api.github.com/repos/ztiffany/fabtests-cray/issues/comments{/number}","contents_url":"https://api.github.com/repos/ztiffany/fabtests-cray/contents/{+path}","compare_url":"https://api.github.com/repos/ztiffany/fabtests-cray/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ztiffany/fabtests-cray/merges","archive_url":"https://api.github.com/repos/ztiffany/fabtests-cray/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ztiffany/fabtests-cray/downloads","issues_url":"https://api.github.com/repos/ztiffany/fabtests-cray/issues{/number}","pulls_url":"https://api.github.com/repos/ztiffany/fabtests-cray/pulls{/number}","milestones_url":"https://api.github.com/repos/ztiffany/fabtests-cray/milestones{/number}","notifications_url":"https://api.github.com/repos/ztiffany/fabtests-cray/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ztiffany/fabtests-cray/labels{/name}","releases_url":"https://api.github.com/repos/ztiffany/fabtests-cray/releases{/id}","created_at":"2015-03-26T15:24:38Z","updated_at":"2015-03-26T15:24:39Z","pushed_at":"2015-06-18T19:59:04Z","git_url":"git://github.com/ztiffany/fabtests-cray.git","ssh_url":"git@github.com:ztiffany/fabtests-cray.git","clone_url":"https://github.com/ztiffany/fabtests-cray.git","svn_url":"https://github.com/ztiffany/fabtests-cray","homepage":null,"size":1276,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ofiwg:master","ref":"master","sha":"88dd3e3bfa68c7065c697078e34fbcaf59290d6d","user":{"login":"ofiwg","id":8459445,"avatar_url":"https://avatars.githubusercontent.com/u/8459445?v=3","gravatar_id":"","url":"https://api.github.com/users/ofiwg","html_url":"https://github.com/ofiwg","followers_url":"https://api.github.com/users/ofiwg/followers","following_url":"https://api.github.com/users/ofiwg/following{/other_user}","gists_url":"https://api.github.com/users/ofiwg/gists{/gist_id}","starred_url":"https://api.github.com/users/ofiwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ofiwg/subscriptions","organizations_url":"https://api.github.com/users/ofiwg/orgs","repos_url":"https://api.github.com/users/ofiwg/repos","events_url":"https://api.github.com/users/ofiwg/events{/privacy}","received_events_url":"https://api.github.com/users/ofiwg/received_events","type":"Organization","site_admin":false},"repo":{"id":22996869,"name":"fabtests","full_name":"ofiwg/fabtests","owner":{"login":"ofiwg","id":8459445,"avatar_url":"https://avatars.githubusercontent.com/u/8459445?v=3","gravatar_id":"","url":"https://api.github.com/users/ofiwg","html_url":"https://github.com/ofiwg","followers_url":"https://api.github.com/users/ofiwg/followers","following_url":"https://api.github.com/users/ofiwg/following{/other_user}","gists_url":"https://api.github.com/users/ofiwg/gists{/gist_id}","starred_url":"https://api.github.com/users/ofiwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ofiwg/subscriptions","organizations_url":"https://api.github.com/users/ofiwg/orgs","repos_url":"https://api.github.com/users/ofiwg/repos","events_url":"https://api.github.com/users/ofiwg/events{/privacy}","received_events_url":"https://api.github.com/users/ofiwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ofiwg/fabtests","description":"","fork":false,"url":"https://api.github.com/repos/ofiwg/fabtests","forks_url":"https://api.github.com/repos/ofiwg/fabtests/forks","keys_url":"https://api.github.com/repos/ofiwg/fabtests/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ofiwg/fabtests/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ofiwg/fabtests/teams","hooks_url":"https://api.github.com/repos/ofiwg/fabtests/hooks","issue_events_url":"https://api.github.com/repos/ofiwg/fabtests/issues/events{/number}","events_url":"https://api.github.com/repos/ofiwg/fabtests/events","assignees_url":"https://api.github.com/repos/ofiwg/fabtests/assignees{/user}","branches_url":"https://api.github.com/repos/ofiwg/fabtests/branches{/branch}","tags_url":"https://api.github.com/repos/ofiwg/fabtests/tags","blobs_url":"https://api.github.com/repos/ofiwg/fabtests/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ofiwg/fabtests/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ofiwg/fabtests/git/refs{/sha}","trees_url":"https://api.github.com/repos/ofiwg/fabtests/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ofiwg/fabtests/statuses/{sha}","languages_url":"https://api.github.com/repos/ofiwg/fabtests/languages","stargazers_url":"https://api.github.com/repos/ofiwg/fabtests/stargazers","contributors_url":"https://api.github.com/repos/ofiwg/fabtests/contributors","subscribers_url":"https://api.github.com/repos/ofiwg/fabtests/subscribers","subscription_url":"https://api.github.com/repos/ofiwg/fabtests/subscription","commits_url":"https://api.github.com/repos/ofiwg/fabtests/commits{/sha}","git_commits_url":"https://api.github.com/repos/ofiwg/fabtests/git/commits{/sha}","comments_url":"https://api.github.com/repos/ofiwg/fabtests/comments{/number}","issue_comment_url":"https://api.github.com/repos/ofiwg/fabtests/issues/comments{/number}","contents_url":"https://api.github.com/repos/ofiwg/fabtests/contents/{+path}","compare_url":"https://api.github.com/repos/ofiwg/fabtests/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ofiwg/fabtests/merges","archive_url":"https://api.github.com/repos/ofiwg/fabtests/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ofiwg/fabtests/downloads","issues_url":"https://api.github.com/repos/ofiwg/fabtests/issues{/number}","pulls_url":"https://api.github.com/repos/ofiwg/fabtests/pulls{/number}","milestones_url":"https://api.github.com/repos/ofiwg/fabtests/milestones{/number}","notifications_url":"https://api.github.com/repos/ofiwg/fabtests/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ofiwg/fabtests/labels{/name}","releases_url":"https://api.github.com/repos/ofiwg/fabtests/releases{/id}","created_at":"2014-08-15T17:13:04Z","updated_at":"2015-05-28T10:16:59Z","pushed_at":"2015-06-18T19:59:04Z","git_url":"git://github.com/ofiwg/fabtests.git","ssh_url":"git@github.com:ofiwg/fabtests.git","clone_url":"https://github.com/ofiwg/fabtests.git","svn_url":"https://github.com/ofiwg/fabtests","homepage":null,"size":2357,"stargazers_count":12,"watchers_count":12,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":28,"mirror_url":null,"open_issues_count":16,"forks":28,"open_issues":16,"watchers":12,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ofiwg/fabtests/pulls/279"},"html":{"href":"https://github.com/ofiwg/fabtests/pull/279"},"issue":{"href":"https://api.github.com/repos/ofiwg/fabtests/issues/279"},"comments":{"href":"https://api.github.com/repos/ofiwg/fabtests/issues/279/comments"},"review_comments":{"href":"https://api.github.com/repos/ofiwg/fabtests/pulls/279/comments"},"review_comment":{"href":"https://api.github.com/repos/ofiwg/fabtests/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ofiwg/fabtests/pulls/279/commits"},"statuses":{"href":"https://api.github.com/repos/ofiwg/fabtests/statuses/f9a354c4a7ca6fc06b635548f96d041cfac02112"}}}}