{"action":"created","comment":{"url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/comments/32712159","id":32712159,"diff_hunk":"@@ -0,0 +1,1585 @@\n+#!/bin/bash\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+# http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+#\n+# See usage() function below for more details ...\n+#\n+#######################################################################\n+# Initialization:\n+\n+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}\n+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs\n+\n+#######################################################################\n+\n+# Fill in some defaults if no values are specified\n+\n+PATH=/sbin:/usr/sbin:/bin:/usr/bin\n+\n+OCF_RESKEY_binary_default=\"/usr/sbin/rabbitmq-server\"\n+OCF_RESKEY_ctl_default=\"/usr/sbin/rabbitmqctl\"\n+OCF_RESKEY_debug_default=false\n+OCF_RESKEY_username_default=\"rabbitmq\"\n+OCF_RESKEY_groupname_default=\"rabbitmq\"\n+OCF_RESKEY_pid_file_default=/var/run/rabbitmq/p_pid\n+OCF_RESKEY_log_dir_default=/var/log/rabbitmq\n+OCF_RESKEY_mnesia_base_default=/var/lib/rabbitmq/mnesia\n+OCF_RESKEY_node_port_default=5672\n+OCF_RESKEY_erlang_cookie_default=false\n+OCF_RESKEY_erlang_cookie_file_default=\"/var/lib/rabbitmq/.erlang.cookie\"\n+\n+: ${HA_LOGTAG=\"lrmd\"}\n+: ${HA_LOGFACILITY=\"daemon\"}\n+: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}\n+: ${OCF_RESKEY_ctl=${OCF_RESKEY_ctl_default}}\n+: ${OCF_RESKEY_debug=${OCF_RESKEY_debug_default}}\n+: ${OCF_RESKEY_username=${OCF_RESKEY_username_default}}\n+: ${OCF_RESKEY_groupname=${OCF_RESKEY_groupname_default}}\n+: ${OCF_RESKEY_log_dir=${OCF_RESKEY_log_dir_default}}\n+: ${OCF_RESKEY_mnesia_base=${OCF_RESKEY_mnesia_base_default}}\n+: ${OCF_RESKEY_pid_file=${OCF_RESKEY_pid_file_default}}\n+: ${OCF_RESKEY_node_port=${OCF_RESKEY_node_port_default}}\n+: ${OCF_RESKEY_erlang_cookie=${OCF_RESKEY_erlang_cookie_default}}\n+: ${OCF_RESKEY_erlang_cookie_file=${OCF_RESKEY_erlang_cookie_file_default}}\n+\n+#######################################################################\n+\n+OCF_RESKEY_start_time_default=$((OCF_RESKEY_CRM_meta_timeout / 6000 + 2))\n+: ${OCF_RESKEY_start_time=${OCF_RESKEY_start_time_default}}\n+OCF_RESKEY_command_timeout_default=\"\"\n+: ${OCF_RESKEY_command_timeout=${OCF_RESKEY_command_timeout_default}}\n+TIMEOUT_ARG=$((OCF_RESKEY_CRM_meta_timeout / 6000 + 30))\n+COMMAND_TIMEOUT=\"/usr/bin/timeout ${OCF_RESKEY_command_timeout} ${TIMEOUT_ARG}\"\n+\n+#######################################################################\n+\n+usage() {\n+    cat <<UEND\n+        usage: $0 (start|stop|validate-all|meta-data|status|monitor)\n+\n+        $0 manages an ${OCF_RESKEY_binary} process as an HA resource\n+\n+        The 'start' operation starts the networking service.\n+        The 'stop' operation stops the networking service.\n+        The 'validate-all' operation reports whether the parameters are valid\n+        The 'meta-data' operation reports this RA's meta-data information\n+        The 'status' operation reports whether the networking service is running\n+        The 'monitor' operation reports whether the networking service seems to be working\n+\n+UEND\n+}\n+\n+meta_data() {\n+    cat <<END\n+<?xml version=\"1.0\"?>\n+<!DOCTYPE resource-agent SYSTEM \"ra-api-1.dtd\">\n+<resource-agent name=\"${OCF_RESKEY_binary}\">\n+<version>1.0</version>\n+\n+<longdesc lang=\"en\">\n+Resource agent for ${OCF_RESKEY_binary}\n+</longdesc>\n+<shortdesc lang=\"en\">Resource agent for ${OCF_RESKEY_binary}</shortdesc>\n+<parameters>\n+\n+<parameter name=\"binary\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+RabbitMQ binary\n+</longdesc>\n+<shortdesc lang=\"en\">RabbitMQ binary</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_binary_default}\" />\n+</parameter>\n+\n+<parameter name=\"ctl\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+rabbitctl binary\n+</longdesc>\n+<shortdesc lang=\"en\">rabbitctl binary binary</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_ctl_default}\" />\n+</parameter>\n+\n+<parameter name=\"pid_file\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+RabbitMQ PID file\n+</longdesc>\n+<shortdesc lang=\"en\">RabbitMQ PID file</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_pid_file_default}\" />\n+</parameter>\n+\n+<parameter name=\"log_dir\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+RabbitMQ log directory\n+</longdesc>\n+<shortdesc lang=\"en\">RabbitMQ log directory</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_log_dir_default}\" />\n+</parameter>\n+\n+<parameter name=\"username\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+RabbitMQ user name\n+</longdesc>\n+<shortdesc lang=\"en\">RabbitMQ user name</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_username_default}\" />\n+</parameter>\n+\n+<parameter name=\"groupname\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+RabbitMQ group name\n+</longdesc>\n+<shortdesc lang=\"en\">RabbitMQ group name</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_groupname_default}\" />\n+</parameter>\n+\n+<parameter name=\"command_timeout\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+Timeout command arguments for issued commands termination (value is auto evaluated)\n+</longdesc>\n+<shortdesc lang=\"en\">Arguments for timeout wrapping command</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_command_timeout_default}\" />\n+</parameter>\n+\n+<parameter name=\"start_time\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+Timeout for start rabbitmq server\n+</longdesc>\n+<shortdesc lang=\"en\">Timeout for start rabbitmq server</shortdesc>\n+<content type=\"string\" default=\"${OCF_RESKEY_start_time_default}\" />\n+</parameter>\n+\n+<parameter name=\"debug\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+The debug flag for agent (${OCF_RESKEY_binary}) instance.\n+In the /tmp/ directory will be created rmq-* files for log\n+some operations and ENV values inside OCF-script.\n+</longdesc>\n+<shortdesc lang=\"en\">AMQP server (${OCF_RESKEY_binary}) debug flag</shortdesc>\n+<content type=\"boolean\" default=\"${OCF_RESKEY_debug_default}\" />\n+</parameter>\n+\n+<parameter name=\"mnesia_base\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+Base directory for storing Mnesia files\n+</longdesc>\n+<shortdesc lang=\"en\">Base directory for storing Mnesia files</shortdesc>\n+<content type=\"boolean\" default=\"${OCF_RESKEY_mnesia_base_default}\" />\n+</parameter>\n+\n+<parameter name=\"node_port\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+${OCF_RESKEY_binary} should listen on this port\n+</longdesc>\n+<shortdesc lang=\"en\">${OCF_RESKEY_binary} should listen on this port</shortdesc>\n+<content type=\"boolean\" default=\"${OCF_RESKEY_node_port_default}\" />\n+</parameter>\n+\n+<parameter name=\"erlang_cookie\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+Erlang cookie for clustering. If specified, will be updated at the mnesia reset\n+</longdesc>\n+<shortdesc lang=\"en\">Erlang cookie</shortdesc>\n+<content type=\"boolean\" default=\"${OCF_RESKEY_erlang_cookie_default}\" />\n+</parameter>\n+\n+<parameter name=\"erlang_cookie_file\" unique=\"0\" required=\"0\">\n+<longdesc lang=\"en\">\n+Erlang cookie file path where the cookie will be put, if requested\n+</longdesc>\n+<shortdesc lang=\"en\">Erlang cookie file</shortdesc>\n+<content type=\"boolean\" default=\"${OCF_RESKEY_erlang_cookie_file_default}\" />\n+</parameter>\n+\n+</parameters>\n+\n+<actions>\n+<action name=\"start\" timeout=\"20\" />\n+<action name=\"stop\" timeout=\"20\" />\n+<action name=\"status\" timeout=\"20\" />\n+<action name=\"monitor\" depth=\"0\" timeout=\"30\" interval=\"5\" />\n+<action name=\"monitor\" depth=\"0\" timeout=\"30\" interval=\"3\" role=\"Master\"/>\n+<action name=\"monitor\" depth=\"30\" timeout=\"60\" interval=\"103\" />\n+<action name=\"promote\" timeout=\"30\" />\n+<action name=\"demote\"  timeout=\"30\" />\n+<action name=\"notify\"   timeout=\"20\" />\n+<action name=\"validate-all\" timeout=\"5\" />\n+<action name=\"meta-data\" timeout=\"5\" />\n+</actions>\n+</resource-agent>\n+END\n+}\n+\n+#######################################################################\n+# Functions invoked by resource manager actions\n+\n+# Invokes the given command as a rabbitmq user and wrapped in the\n+# timeout command.\n+su_rabbit_cmd() {\n+    local cmd=${1:-status}\n+    local LH=\"${LL} su_rabbit_cmd():\"\n+    local rc=1\n+    local user=$OCF_RESKEY_username\n+    local mail=/var/spool/mail/rabbitmq\n+    local pwd=/var/lib/rabbitmq\n+    local home=/var/lib/rabbitmq\n+\n+    ocf_log debug \"${LH} invoking a command: ${cmd}\"\n+    su $user -s /bin/sh -c \"USER=${user} MAIL=${mail} PWD=${pwd} HOME=${home} LOGNAME=${user} \\\n+      ${COMMAND_TIMEOUT} ${cmd}\"\n+    rc=$?\n+    ocf_log info \"${LH} the invoked command exited ${rc}: ${cmd}\"\n+    return $rc\n+}\n+\n+now() {\n+    date -u +%s\n+}\n+\n+master_score() {\n+    local score=$1\n+    if [[ -z $score ]] ; then\n+        score=0\n+    fi\n+    ocf_run crm_master -l reboot -v $score || return $OCF_ERR_GENERIC\n+    return $OCF_SUCCESS\n+}\n+\n+# Return OCF_SUCCESS, if current host is in the list of given hosts.\n+# Otherwise, return 10\n+my_host() {\n+    local hostlist=\"$1\"\n+    local hostname=$(hostname -s)\n+    local hn\n+    local rc=10\n+    local LH=\"${LL} my_host():\"\n+\n+    ocf_log info \"${LH} hostlist is: $hostlist\"\n+    for host in $hostlist ; do\n+        hn=$(echo \"$host\" | awk -F. '{print $1}')\n+        ocf_log debug \"${LH} comparing '$hostname' with '$hn'\"\n+        if [[ \"X${hostname}\" == \"X${hn}\" ]] ; then\n+            rc=$OCF_SUCCESS\n+            break\n+        fi\n+    done\n+\n+    return $rc\n+}\n+\n+srv_uptime() {\n+    local stime\n+    stime=$( crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --query 2>/dev/null | awk '{print $3}' | awk -F \"=\" '{print $2}' | sed -e '/(null)/d' )\n+\n+    if [ -z \"${stime}\" -o x\"${stime}\" == x\"(null)\" ] ; then\n+        echo 0\n+    else\n+        echo $(( $(now) - ${stime} ))\n+    fi\n+\n+    return $OCF_SUCCESS\n+}\n+\n+rmq_setup_env() {\n+    local H\n+    local dir\n+    H=`hostname -s`\n+    export RABBITMQ_NODENAME=\"rabbit@${H}\"\n+    export RABBITMQ_NODE_PORT=$OCF_RESKEY_node_port\n+    export RABBITMQ_PID_FILE=$OCF_RESKEY_pid_file\n+    MNESIA_FILES=\"${OCF_RESKEY_mnesia_base}/rabbit@${H}\"\n+    RMQ_START_TIME=\"${MNESIA_FILES}/ocf_server_start_time.txt\"\n+    MASTER_FLAG_FILE=\"${MNESIA_FILES}/ocf_master_for_${OCF_RESOURCE_INSTANCE}\"\n+    THIS_PCMK_NODE=`crm_node -n`\n+    # check and make PID file dir\n+    local PID_DIR=$( dirname $OCF_RESKEY_pid_file )\n+    if [ ! -d ${PID_DIR} ] ; then\n+        mkdir -p ${PID_DIR}\n+        chown -R ${OCF_RESKEY_username}:${OCF_RESKEY_groupname} ${PID_DIR}\n+        chmod 755 ${PID_DIR}\n+    fi\n+\n+    # Regardless of whether we just created the directory or it\n+    # already existed, check whether it is writable by the configured\n+    # user\n+    for dir in ${PID_DIR} \"${OCF_RESKEY_mnesia_base}\" \"${OCF_RESKEY_log_dir}\"; do\n+        if test -e ${dir}; then\n+            if [ ! -z $(su -s /bin/sh - $OCF_RESKEY_username -c \"find ${dir} ! -writable\") ]; then\n+                ocf_log warn \"Directory ${dir} is not writable by ${OCF_RESKEY_username}, chowning.\"\n+                chown -R ${OCF_RESKEY_username}:${OCF_RESKEY_groupname} \"${dir}\"\n+            fi\n+        fi\n+    done\n+\n+    export LL=\"${OCF_RESOURCE_INSTANCE}:\"\n+    update_cookie\n+}\n+\n+rabbit_node_name() {\n+    echo \"rabbit@\"$(echo \"$1\" | awk -F. '{print $1}')\n+}\n+\n+# Return a RabbitMQ node to its virgin state.\n+# For reset and force_reset to succeed the RabbitMQ application must have been stopped.\n+# If the app cannot be stopped, beam will be killed and mnesia files will be removed.\n+reset_mnesia() {\n+    local LH=\"${LL} reset_mnesia():\"\n+    local make_amnesia=false\n+    local rc=$OCF_ERR_GENERIC\n+\n+    # check status of a beam process\n+    get_status\n+    rc=$?\n+    if [[ $rc == 0 ]] ; then\n+        # beam is running\n+        # check status of rabbit app and stop it, if it is running\n+        get_status rabbit\n+        rc=$?\n+        if [[ $rc == 0 ]] ; then\n+            # rabbit app is running, have to stop it\n+            ocf_log info \"${LH} Stopping RMQ-app prior to reset the mnesia.\"\n+            stop_rmq_server_app\n+            rc=$?\n+            if [[ $rc != 0 ]] ; then\n+                 ocf_log warn \"${LH} RMQ-app can't be stopped.\"\n+                 make_amnesia=true\n+            fi\n+        fi\n+\n+        if ! $make_amnesia ; then\n+            # rabbit app is not running, reset mnesia\n+            ocf_log info \"${LH} Execute reset with timeout: ${TIMEOUT_ARG}\"\n+            su_rabbit_cmd \"${OCF_RESKEY_ctl} reset\"\n+            rc=$?\n+            if [[ $rc != 0 ]] ; then\n+                ocf_log info \"${LH} Execute force_reset with timeout: ${TIMEOUT_ARG}\"\n+                su_rabbit_cmd \"${OCF_RESKEY_ctl} force_reset\"\n+                rc=$?\n+                if [[ $rc != 0 ]] ; then\n+                    ocf_log warn \"${LH} Mnesia couldn't cleaned, even by force-reset command.\"\n+                    make_amnesia=true\n+                fi\n+            fi\n+        fi\n+    else\n+        # there is no beam running\n+        make_amnesia=true\n+        ocf_log warn \"${LH} There is no Beam process running.\"\n+    fi\n+\n+    # remove mnesia files, if required\n+    if $make_amnesia ; then\n+        kill_rmq_and_remove_pid\n+        ocf_run rm -rf ${MNESIA_FILES}*","path":"packaging/common/rabbitmq-server-ha.ocf","position":379,"original_position":379,"commit_id":"c22362b197f62b3a5f3549c71053a6766dd0f955","original_commit_id":"c22362b197f62b3a5f3549c71053a6766dd0f955","user":{"login":"dumbbell","id":159804,"avatar_url":"https://avatars.githubusercontent.com/u/159804?v=3","gravatar_id":"","url":"https://api.github.com/users/dumbbell","html_url":"https://github.com/dumbbell","followers_url":"https://api.github.com/users/dumbbell/followers","following_url":"https://api.github.com/users/dumbbell/following{/other_user}","gists_url":"https://api.github.com/users/dumbbell/gists{/gist_id}","starred_url":"https://api.github.com/users/dumbbell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dumbbell/subscriptions","organizations_url":"https://api.github.com/users/dumbbell/orgs","repos_url":"https://api.github.com/users/dumbbell/repos","events_url":"https://api.github.com/users/dumbbell/events{/privacy}","received_events_url":"https://api.github.com/users/dumbbell/received_events","type":"User","site_admin":false},"body":"If `$OCF_RESKEY_mnesia_base` contains data for several nodes, the above command may remove other nodes data, if they are named `rabbit@node1`, `rabbit@node10`, `rabbit@node11`, etc. if we are resetting `rabbit@node1`. Adding a slash will fix the problem.","created_at":"2015-06-18T09:26:36Z","updated_at":"2015-06-18T09:26:36Z","html_url":"https://github.com/rabbitmq/rabbitmq-server/pull/189#discussion_r32712159","pull_request_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189","_links":{"self":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/comments/32712159"},"html":{"href":"https://github.com/rabbitmq/rabbitmq-server/pull/189#discussion_r32712159"},"pull_request":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189"}}},"pull_request":{"url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189","id":37708040,"html_url":"https://github.com/rabbitmq/rabbitmq-server/pull/189","diff_url":"https://github.com/rabbitmq/rabbitmq-server/pull/189.diff","patch_url":"https://github.com/rabbitmq/rabbitmq-server/pull/189.patch","issue_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/issues/189","number":189,"state":"open","locked":false,"title":"Add OCF Pacemaker RA for HA A/A cluster","user":{"login":"bogdando","id":2795820,"avatar_url":"https://avatars.githubusercontent.com/u/2795820?v=3","gravatar_id":"","url":"https://api.github.com/users/bogdando","html_url":"https://github.com/bogdando","followers_url":"https://api.github.com/users/bogdando/followers","following_url":"https://api.github.com/users/bogdando/following{/other_user}","gists_url":"https://api.github.com/users/bogdando/gists{/gist_id}","starred_url":"https://api.github.com/users/bogdando/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bogdando/subscriptions","organizations_url":"https://api.github.com/users/bogdando/orgs","repos_url":"https://api.github.com/users/bogdando/repos","events_url":"https://api.github.com/users/bogdando/events{/privacy}","received_events_url":"https://api.github.com/users/bogdando/received_events","type":"User","site_admin":false},"body":"Add OCF script for Pacemaker resource agent\r\nfor dynamic membership control of the nodes\r\nin RabbitMQ active-active mirrored cluster.\r\n\r\nsource https://github.com/stackforge/fuel-library\r\nv6.1-dev b9b6376cab317906af625faa5e48521aaeb0201b\r\n\r\nCo-Author: Vladimir Kuklin <vkuklin@mirantis.com>\r\nCo-Author: Sergey Vasilenko <svasilenko@mirantis.com>\r\nSigned-off-by: Bogdan Dobrelya <bdobrelia@mirantis.com>","created_at":"2015-06-15T16:07:46Z","updated_at":"2015-06-18T09:26:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e33e797defbd18d4e57baacbc529cb9ca3b1d7e6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189/commits","review_comments_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189/comments","review_comment_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/issues/189/comments","statuses_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/statuses/c22362b197f62b3a5f3549c71053a6766dd0f955","head":{"label":"bogdando:ra_ocf_ha","ref":"ra_ocf_ha","sha":"c22362b197f62b3a5f3549c71053a6766dd0f955","user":{"login":"bogdando","id":2795820,"avatar_url":"https://avatars.githubusercontent.com/u/2795820?v=3","gravatar_id":"","url":"https://api.github.com/users/bogdando","html_url":"https://github.com/bogdando","followers_url":"https://api.github.com/users/bogdando/followers","following_url":"https://api.github.com/users/bogdando/following{/other_user}","gists_url":"https://api.github.com/users/bogdando/gists{/gist_id}","starred_url":"https://api.github.com/users/bogdando/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bogdando/subscriptions","organizations_url":"https://api.github.com/users/bogdando/orgs","repos_url":"https://api.github.com/users/bogdando/repos","events_url":"https://api.github.com/users/bogdando/events{/privacy}","received_events_url":"https://api.github.com/users/bogdando/received_events","type":"User","site_admin":false},"repo":{"id":37133190,"name":"rabbitmq-server","full_name":"bogdando/rabbitmq-server","owner":{"login":"bogdando","id":2795820,"avatar_url":"https://avatars.githubusercontent.com/u/2795820?v=3","gravatar_id":"","url":"https://api.github.com/users/bogdando","html_url":"https://github.com/bogdando","followers_url":"https://api.github.com/users/bogdando/followers","following_url":"https://api.github.com/users/bogdando/following{/other_user}","gists_url":"https://api.github.com/users/bogdando/gists{/gist_id}","starred_url":"https://api.github.com/users/bogdando/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bogdando/subscriptions","organizations_url":"https://api.github.com/users/bogdando/orgs","repos_url":"https://api.github.com/users/bogdando/repos","events_url":"https://api.github.com/users/bogdando/events{/privacy}","received_events_url":"https://api.github.com/users/bogdando/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bogdando/rabbitmq-server","description":"RabbitMQ Server","fork":true,"url":"https://api.github.com/repos/bogdando/rabbitmq-server","forks_url":"https://api.github.com/repos/bogdando/rabbitmq-server/forks","keys_url":"https://api.github.com/repos/bogdando/rabbitmq-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bogdando/rabbitmq-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bogdando/rabbitmq-server/teams","hooks_url":"https://api.github.com/repos/bogdando/rabbitmq-server/hooks","issue_events_url":"https://api.github.com/repos/bogdando/rabbitmq-server/issues/events{/number}","events_url":"https://api.github.com/repos/bogdando/rabbitmq-server/events","assignees_url":"https://api.github.com/repos/bogdando/rabbitmq-server/assignees{/user}","branches_url":"https://api.github.com/repos/bogdando/rabbitmq-server/branches{/branch}","tags_url":"https://api.github.com/repos/bogdando/rabbitmq-server/tags","blobs_url":"https://api.github.com/repos/bogdando/rabbitmq-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bogdando/rabbitmq-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bogdando/rabbitmq-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/bogdando/rabbitmq-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bogdando/rabbitmq-server/statuses/{sha}","languages_url":"https://api.github.com/repos/bogdando/rabbitmq-server/languages","stargazers_url":"https://api.github.com/repos/bogdando/rabbitmq-server/stargazers","contributors_url":"https://api.github.com/repos/bogdando/rabbitmq-server/contributors","subscribers_url":"https://api.github.com/repos/bogdando/rabbitmq-server/subscribers","subscription_url":"https://api.github.com/repos/bogdando/rabbitmq-server/subscription","commits_url":"https://api.github.com/repos/bogdando/rabbitmq-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/bogdando/rabbitmq-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/bogdando/rabbitmq-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/bogdando/rabbitmq-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/bogdando/rabbitmq-server/contents/{+path}","compare_url":"https://api.github.com/repos/bogdando/rabbitmq-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bogdando/rabbitmq-server/merges","archive_url":"https://api.github.com/repos/bogdando/rabbitmq-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bogdando/rabbitmq-server/downloads","issues_url":"https://api.github.com/repos/bogdando/rabbitmq-server/issues{/number}","pulls_url":"https://api.github.com/repos/bogdando/rabbitmq-server/pulls{/number}","milestones_url":"https://api.github.com/repos/bogdando/rabbitmq-server/milestones{/number}","notifications_url":"https://api.github.com/repos/bogdando/rabbitmq-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bogdando/rabbitmq-server/labels{/name}","releases_url":"https://api.github.com/repos/bogdando/rabbitmq-server/releases{/id}","created_at":"2015-06-09T13:20:30Z","updated_at":"2015-06-09T13:20:35Z","pushed_at":"2015-06-15T16:06:09Z","git_url":"git://github.com/bogdando/rabbitmq-server.git","ssh_url":"git@github.com:bogdando/rabbitmq-server.git","clone_url":"https://github.com/bogdando/rabbitmq-server.git","svn_url":"https://github.com/bogdando/rabbitmq-server","homepage":"https://www.rabbitmq.com/","size":70101,"stargazers_count":0,"watchers_count":0,"language":"Erlang","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"rabbitmq:master","ref":"master","sha":"ae5e61f6f7b15dc66f7885df1713d97a64090ae9","user":{"login":"rabbitmq","id":96669,"avatar_url":"https://avatars.githubusercontent.com/u/96669?v=3","gravatar_id":"","url":"https://api.github.com/users/rabbitmq","html_url":"https://github.com/rabbitmq","followers_url":"https://api.github.com/users/rabbitmq/followers","following_url":"https://api.github.com/users/rabbitmq/following{/other_user}","gists_url":"https://api.github.com/users/rabbitmq/gists{/gist_id}","starred_url":"https://api.github.com/users/rabbitmq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rabbitmq/subscriptions","organizations_url":"https://api.github.com/users/rabbitmq/orgs","repos_url":"https://api.github.com/users/rabbitmq/repos","events_url":"https://api.github.com/users/rabbitmq/events{/privacy}","received_events_url":"https://api.github.com/users/rabbitmq/received_events","type":"Organization","site_admin":false},"repo":{"id":924551,"name":"rabbitmq-server","full_name":"rabbitmq/rabbitmq-server","owner":{"login":"rabbitmq","id":96669,"avatar_url":"https://avatars.githubusercontent.com/u/96669?v=3","gravatar_id":"","url":"https://api.github.com/users/rabbitmq","html_url":"https://github.com/rabbitmq","followers_url":"https://api.github.com/users/rabbitmq/followers","following_url":"https://api.github.com/users/rabbitmq/following{/other_user}","gists_url":"https://api.github.com/users/rabbitmq/gists{/gist_id}","starred_url":"https://api.github.com/users/rabbitmq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rabbitmq/subscriptions","organizations_url":"https://api.github.com/users/rabbitmq/orgs","repos_url":"https://api.github.com/users/rabbitmq/repos","events_url":"https://api.github.com/users/rabbitmq/events{/privacy}","received_events_url":"https://api.github.com/users/rabbitmq/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rabbitmq/rabbitmq-server","description":"RabbitMQ Server","fork":false,"url":"https://api.github.com/repos/rabbitmq/rabbitmq-server","forks_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/forks","keys_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/teams","hooks_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/hooks","issue_events_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/issues/events{/number}","events_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/events","assignees_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/assignees{/user}","branches_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/branches{/branch}","tags_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/tags","blobs_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/statuses/{sha}","languages_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/languages","stargazers_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/stargazers","contributors_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/contributors","subscribers_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/subscribers","subscription_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/subscription","commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/contents/{+path}","compare_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/merges","archive_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/downloads","issues_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/issues{/number}","pulls_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls{/number}","milestones_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/milestones{/number}","notifications_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/labels{/name}","releases_url":"https://api.github.com/repos/rabbitmq/rabbitmq-server/releases{/id}","created_at":"2010-09-20T10:29:16Z","updated_at":"2015-06-18T08:51:09Z","pushed_at":"2015-06-17T09:45:07Z","git_url":"git://github.com/rabbitmq/rabbitmq-server.git","ssh_url":"git@github.com:rabbitmq/rabbitmq-server.git","clone_url":"https://github.com/rabbitmq/rabbitmq-server.git","svn_url":"https://github.com/rabbitmq/rabbitmq-server","homepage":"https://www.rabbitmq.com/","size":104080,"stargazers_count":867,"watchers_count":867,"language":"Erlang","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":213,"mirror_url":null,"open_issues_count":49,"forks":213,"open_issues":49,"watchers":867,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189"},"html":{"href":"https://github.com/rabbitmq/rabbitmq-server/pull/189"},"issue":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/issues/189"},"comments":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/issues/189/comments"},"review_comments":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189/comments"},"review_comment":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/pulls/189/commits"},"statuses":{"href":"https://api.github.com/repos/rabbitmq/rabbitmq-server/statuses/c22362b197f62b3a5f3549c71053a6766dd0f955"}}}}