{"action":"created","comment":{"url":"https://api.github.com/repos/bloomberg/chef-bach/pulls/comments/153862375","pull_request_review_id":79935733,"id":153862375,"diff_hunk":"@@ -0,0 +1,152 @@\n+# vim: tabstop=2:shiftwidth=2:softtabstop=2 \n+#\n+# This module holds utility methods shared between repxe_host.rb,\n+# cluster_assign_roles.rb and Vagrantfile\n+# NOTE: Testing should be done with ChefDK and Vagrant rubys\n+#\n+# Most of the methods pertain to cluster.txt and its contents; should not\n+# contact the Chef server, use Chef client or VirtualBox.\n+#\n+# Workaround log spam in older versions of ChefDK.\n+#\n+# https://github.com/berkshelf/berkshelf/pull/1668/\n+# https://github.com/intridea/hashie/issues/394\n+#\n+begin\n+  require 'hashie'\n+  require 'hashie/logger'\n+  Hashie.logger.level = Logger.const_get 'ERROR'\n+  Hashie.logger = Logger.new(nil)\n+rescue LoadError\n+end\n+\n+require 'json'\n+# TODO: Ia there a better way of handling this? Rodley has a lot of requirements\n+begin\n+  require 'chef-vault'\n+  require 'ridley'\n+  Ridley::Logging.logger.level = Logger.const_get 'ERROR'\n+rescue LoadError\n+  puts 'chef-vault or ridle has not yet been installed'\n+end\n+\n+require 'ohai'\n+require 'faraday'\n+require 'chef'\n+\n+module BACH\n+  class ClusterDef\n+    def initialize(node_obj=nil)\n+      # bogus VirtualBox MAC (keep the vendor OUI set to VirtualBox's)\n+      @node_obj = node_obj\n+      @cluster_def = nil\n+    end\n+\n+    # Return the default cluster.txt data\n+    # Returns: Array of cluster.txt lines\n+    # Raise: if the file is not found\n+    def cluster_txt\n+      File.readlines(File.join(repo_dir, 'cluster.txt'))\n+    end\n+\n+    def fqdn(entry)\n+      if(entry[:dns_domain])\n+        entry[:hostname] + '.' + entry[:dns_domain]\n+      else\n+        entry[:hostname]\n+      end\n+    end\n+\n+    def get_entry(name)\n+      fetch_cluster_def.select do |ee|\n+        ee[:hostname] == name || fqdn(ee) == name\n+      end.first\n+    end\n+\n+    def validate_node_number?(nn)\n+      # node number must either be '-' or a positive integer\n+      # 1..255\n+      if nn != '-' and nn.to_i < 1 or nn.to_i > 255 then\n+        false\n+      else\n+        true\n+      end\n+    end\n+\n+    def validate_cluster_def(cluster_def, fields)\n+        cdef_copy = cluster_def.select{ |row| row[:runlist] != 'SKIP' }\n+        # validate columns each row has the same number of fields as fields\n+        faulty_rows = cdef_copy.select{ |row| row.length != fields.length }\n+        if faulty_rows.length > 0  then\n+          faulty_rows.each { |row| puts row }\n+          fail \"Retreived cluster data appears to be invalid -- missing columns\"\n+        end\n+        # validate node ids \n+        if (cluster_def.select{ |row| validate_node_number?(row[:node_id]) == false }).length > 0  then\n+          fail \"Retreived cluster data appears to be invalid -- node IDs must be positive integers between 0 and 256 (1..255)\"\n+        end \n+    end\n+\n+    def parse_cluster_def(cluster_def)\n+      # parse something that looks like cluster.txt and memorize the result\n+      fields = [\n+                :node_id,\n+                :hostname,\n+                :mac_address,\n+                :ip_address,\n+                :ilo_address,\n+                :cobbler_profile,\n+                :dns_domain,\n+                :runlist\n+               ]\n+\n+        # This is really gross because Ruby 1.9 lacks Array#to_h.\n+        cdef = cluster_def.map do |line|\n+          entry = Hash[*fields.zip(line.split(' ')).flatten(1)]\n+          entry.merge({fqdn: fqdn(entry)})\n+        end\n+        # field size check will fail if we do not do this\n+        fields += [:fqdn]\n+        validate_cluster_def(cdef, fields)\n+        cdef\n+    end\n+\n+    # combines local cluster.txt access with http call to cluster data\n+    def fetch_cluster_def\n+      if @cluster_def != nil then\n+        @cluster_def\n+      end\n+\n+      begin\n+        @cluster_def = fetch_cluster_def_http\n+      rescue Exception => http_e\n+        puts http_e \n+        puts http_e.backtrace\n+        @cluster_def = fetch_cluster_def_local \n+      end\n+\n+      @cluster_def\n+    end\n+\n+    # fetch cluster definition via http\n+    def fetch_cluster_def_http\n+      cluster_def_url = \"http://#{@node_obj[:bcpc][:bootstrap][:server]}#{@node_obj[:bcpc][:bootstrap][:cluster_def_path]}\"\n+      response = Faraday.new(:proxy => '').get cluster_def_url\n+      if response.success? then\n+        parse_cluster_def(response.body.split(\"\\n\"))\n+      else\n+        nil\n+      end\n+    end \n+      \n+    # locally access cluster.txt\n+    def fetch_cluster_def_local\n+      parse_cluster_def(File.readlines(File.join(repo_dir, 'cluster.txt')))\n+    end\n+\n+    def repo_dir\n+      '/home/vagrant/chef-bcpc'","path":"lib/cluster-def-gem/lib/cluster_def.rb","position":148,"original_position":148,"commit_id":"c4a2a1683e37366130d7a6901b2224bd05d1a721","original_commit_id":"a6d3f5afe72eea8d9f32f7f705ff32102ef3b075","user":{"login":"pu239ppy","id":4019043,"avatar_url":"https://avatars3.githubusercontent.com/u/4019043?v=4","gravatar_id":"","url":"https://api.github.com/users/pu239ppy","html_url":"https://github.com/pu239ppy","followers_url":"https://api.github.com/users/pu239ppy/followers","following_url":"https://api.github.com/users/pu239ppy/following{/other_user}","gists_url":"https://api.github.com/users/pu239ppy/gists{/gist_id}","starred_url":"https://api.github.com/users/pu239ppy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pu239ppy/subscriptions","organizations_url":"https://api.github.com/users/pu239ppy/orgs","repos_url":"https://api.github.com/users/pu239ppy/repos","events_url":"https://api.github.com/users/pu239ppy/events{/privacy}","received_events_url":"https://api.github.com/users/pu239ppy/received_events","type":"User","site_admin":false},"body":"We currently have vagrant hardcoded all over the place, I suppose I can change this one if you prefer, but there are a lot of places where it is used","created_at":"2017-11-29T17:42:01Z","updated_at":"2017-11-29T17:42:01Z","html_url":"https://github.com/bloomberg/chef-bach/pull/1009#discussion_r153862375","pull_request_url":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/bloomberg/chef-bach/pulls/comments/153862375"},"html":{"href":"https://github.com/bloomberg/chef-bach/pull/1009#discussion_r153862375"},"pull_request":{"href":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009"}},"in_reply_to_id":153309749},"pull_request":{"url":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009","id":144893321,"html_url":"https://github.com/bloomberg/chef-bach/pull/1009","diff_url":"https://github.com/bloomberg/chef-bach/pull/1009.diff","patch_url":"https://github.com/bloomberg/chef-bach/pull/1009.patch","issue_url":"https://api.github.com/repos/bloomberg/chef-bach/issues/1009","number":1009,"state":"open","locked":false,"title":"Reduce reliance on node search","user":{"login":"pu239ppy","id":4019043,"avatar_url":"https://avatars3.githubusercontent.com/u/4019043?v=4","gravatar_id":"","url":"https://api.github.com/users/pu239ppy","html_url":"https://github.com/pu239ppy","followers_url":"https://api.github.com/users/pu239ppy/followers","following_url":"https://api.github.com/users/pu239ppy/following{/other_user}","gists_url":"https://api.github.com/users/pu239ppy/gists{/gist_id}","starred_url":"https://api.github.com/users/pu239ppy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pu239ppy/subscriptions","organizations_url":"https://api.github.com/users/pu239ppy/orgs","repos_url":"https://api.github.com/users/pu239ppy/repos","events_url":"https://api.github.com/users/pu239ppy/events{/privacy}","received_events_url":"https://api.github.com/users/pu239ppy/received_events","type":"User","site_admin":false},"body":"Where ever possible remove node search and replace with a custom search that does lookups against cluster.txt\r\n\r\n# Changes\r\n- cluster.txt is the source of node information\r\n- Node ID predefined in cluster.txt\r\n- bcpc_8bit_node_number just refers to data from cluster.txt\r\n- rewrote large parts of functionality that depended on node search output\r\n- MySQL since we no longer rely on node search, we now have no idea if any heads are already running MySQL or not.  The only way to do so is ask.  If we find a quorum we join it if we do not we bootstrap, this is a potentially destructive operation as nodes of a preexisting quorum that contain data may simply be down, but is good enough for VM build purposes and is controlled by `node['bcpc']['mysql']['bootstrap_on_error']`","created_at":"2017-10-05T11:43:07Z","updated_at":"2017-11-29T17:42:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0398f485a6a7439e880ad937218882ef644321d5","assignee":null,"assignees":[],"requested_reviewers":[{"login":"http-418","id":1435487,"avatar_url":"https://avatars2.githubusercontent.com/u/1435487?v=4","gravatar_id":"","url":"https://api.github.com/users/http-418","html_url":"https://github.com/http-418","followers_url":"https://api.github.com/users/http-418/followers","following_url":"https://api.github.com/users/http-418/following{/other_user}","gists_url":"https://api.github.com/users/http-418/gists{/gist_id}","starred_url":"https://api.github.com/users/http-418/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/http-418/subscriptions","organizations_url":"https://api.github.com/users/http-418/orgs","repos_url":"https://api.github.com/users/http-418/repos","events_url":"https://api.github.com/users/http-418/events{/privacy}","received_events_url":"https://api.github.com/users/http-418/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/bloomberg/chef-bach/milestones/19","html_url":"https://github.com/bloomberg/chef-bach/milestone/19","labels_url":"https://api.github.com/repos/bloomberg/chef-bach/milestones/19/labels","id":2947071,"number":19,"title":"Release 3.3","description":"","creator":{"login":"vt0r","id":2738646,"avatar_url":"https://avatars3.githubusercontent.com/u/2738646?v=4","gravatar_id":"","url":"https://api.github.com/users/vt0r","html_url":"https://github.com/vt0r","followers_url":"https://api.github.com/users/vt0r/followers","following_url":"https://api.github.com/users/vt0r/following{/other_user}","gists_url":"https://api.github.com/users/vt0r/gists{/gist_id}","starred_url":"https://api.github.com/users/vt0r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vt0r/subscriptions","organizations_url":"https://api.github.com/users/vt0r/orgs","repos_url":"https://api.github.com/users/vt0r/repos","events_url":"https://api.github.com/users/vt0r/events{/privacy}","received_events_url":"https://api.github.com/users/vt0r/received_events","type":"User","site_admin":false},"open_issues":9,"closed_issues":3,"state":"open","created_at":"2017-11-29T16:28:13Z","updated_at":"2017-11-29T17:40:03Z","due_on":"2017-12-25T08:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009/commits","review_comments_url":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009/comments","review_comment_url":"https://api.github.com/repos/bloomberg/chef-bach/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bloomberg/chef-bach/issues/1009/comments","statuses_url":"https://api.github.com/repos/bloomberg/chef-bach/statuses/c4a2a1683e37366130d7a6901b2224bd05d1a721","head":{"label":"pu239ppy:squash_node_search","ref":"squash_node_search","sha":"c4a2a1683e37366130d7a6901b2224bd05d1a721","user":{"login":"pu239ppy","id":4019043,"avatar_url":"https://avatars3.githubusercontent.com/u/4019043?v=4","gravatar_id":"","url":"https://api.github.com/users/pu239ppy","html_url":"https://github.com/pu239ppy","followers_url":"https://api.github.com/users/pu239ppy/followers","following_url":"https://api.github.com/users/pu239ppy/following{/other_user}","gists_url":"https://api.github.com/users/pu239ppy/gists{/gist_id}","starred_url":"https://api.github.com/users/pu239ppy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pu239ppy/subscriptions","organizations_url":"https://api.github.com/users/pu239ppy/orgs","repos_url":"https://api.github.com/users/pu239ppy/repos","events_url":"https://api.github.com/users/pu239ppy/events{/privacy}","received_events_url":"https://api.github.com/users/pu239ppy/received_events","type":"User","site_admin":false},"repo":{"id":36989576,"name":"chef-bach","full_name":"pu239ppy/chef-bach","owner":{"login":"pu239ppy","id":4019043,"avatar_url":"https://avatars3.githubusercontent.com/u/4019043?v=4","gravatar_id":"","url":"https://api.github.com/users/pu239ppy","html_url":"https://github.com/pu239ppy","followers_url":"https://api.github.com/users/pu239ppy/followers","following_url":"https://api.github.com/users/pu239ppy/following{/other_user}","gists_url":"https://api.github.com/users/pu239ppy/gists{/gist_id}","starred_url":"https://api.github.com/users/pu239ppy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pu239ppy/subscriptions","organizations_url":"https://api.github.com/users/pu239ppy/orgs","repos_url":"https://api.github.com/users/pu239ppy/repos","events_url":"https://api.github.com/users/pu239ppy/events{/privacy}","received_events_url":"https://api.github.com/users/pu239ppy/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pu239ppy/chef-bach","description":"Chef recipes for Bloomberg's deployment of Hadoop and related components","fork":true,"url":"https://api.github.com/repos/pu239ppy/chef-bach","forks_url":"https://api.github.com/repos/pu239ppy/chef-bach/forks","keys_url":"https://api.github.com/repos/pu239ppy/chef-bach/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pu239ppy/chef-bach/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pu239ppy/chef-bach/teams","hooks_url":"https://api.github.com/repos/pu239ppy/chef-bach/hooks","issue_events_url":"https://api.github.com/repos/pu239ppy/chef-bach/issues/events{/number}","events_url":"https://api.github.com/repos/pu239ppy/chef-bach/events","assignees_url":"https://api.github.com/repos/pu239ppy/chef-bach/assignees{/user}","branches_url":"https://api.github.com/repos/pu239ppy/chef-bach/branches{/branch}","tags_url":"https://api.github.com/repos/pu239ppy/chef-bach/tags","blobs_url":"https://api.github.com/repos/pu239ppy/chef-bach/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pu239ppy/chef-bach/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pu239ppy/chef-bach/git/refs{/sha}","trees_url":"https://api.github.com/repos/pu239ppy/chef-bach/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pu239ppy/chef-bach/statuses/{sha}","languages_url":"https://api.github.com/repos/pu239ppy/chef-bach/languages","stargazers_url":"https://api.github.com/repos/pu239ppy/chef-bach/stargazers","contributors_url":"https://api.github.com/repos/pu239ppy/chef-bach/contributors","subscribers_url":"https://api.github.com/repos/pu239ppy/chef-bach/subscribers","subscription_url":"https://api.github.com/repos/pu239ppy/chef-bach/subscription","commits_url":"https://api.github.com/repos/pu239ppy/chef-bach/commits{/sha}","git_commits_url":"https://api.github.com/repos/pu239ppy/chef-bach/git/commits{/sha}","comments_url":"https://api.github.com/repos/pu239ppy/chef-bach/comments{/number}","issue_comment_url":"https://api.github.com/repos/pu239ppy/chef-bach/issues/comments{/number}","contents_url":"https://api.github.com/repos/pu239ppy/chef-bach/contents/{+path}","compare_url":"https://api.github.com/repos/pu239ppy/chef-bach/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pu239ppy/chef-bach/merges","archive_url":"https://api.github.com/repos/pu239ppy/chef-bach/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pu239ppy/chef-bach/downloads","issues_url":"https://api.github.com/repos/pu239ppy/chef-bach/issues{/number}","pulls_url":"https://api.github.com/repos/pu239ppy/chef-bach/pulls{/number}","milestones_url":"https://api.github.com/repos/pu239ppy/chef-bach/milestones{/number}","notifications_url":"https://api.github.com/repos/pu239ppy/chef-bach/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pu239ppy/chef-bach/labels{/name}","releases_url":"https://api.github.com/repos/pu239ppy/chef-bach/releases{/id}","deployments_url":"https://api.github.com/repos/pu239ppy/chef-bach/deployments","created_at":"2015-06-06T17:52:02Z","updated_at":"2016-12-01T19:20:42Z","pushed_at":"2017-11-29T17:08:16Z","git_url":"git://github.com/pu239ppy/chef-bach.git","ssh_url":"git@github.com:pu239ppy/chef-bach.git","clone_url":"https://github.com/pu239ppy/chef-bach.git","svn_url":"https://github.com/pu239ppy/chef-bach","homepage":null,"size":4778,"stargazers_count":0,"watchers_count":0,"language":"Ruby","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"bloomberg:master","ref":"master","sha":"0308bd2f71918c0d5db682ab999b2f7bc729a0eb","user":{"login":"bloomberg","id":1416818,"avatar_url":"https://avatars2.githubusercontent.com/u/1416818?v=4","gravatar_id":"","url":"https://api.github.com/users/bloomberg","html_url":"https://github.com/bloomberg","followers_url":"https://api.github.com/users/bloomberg/followers","following_url":"https://api.github.com/users/bloomberg/following{/other_user}","gists_url":"https://api.github.com/users/bloomberg/gists{/gist_id}","starred_url":"https://api.github.com/users/bloomberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bloomberg/subscriptions","organizations_url":"https://api.github.com/users/bloomberg/orgs","repos_url":"https://api.github.com/users/bloomberg/repos","events_url":"https://api.github.com/users/bloomberg/events{/privacy}","received_events_url":"https://api.github.com/users/bloomberg/received_events","type":"Organization","site_admin":false},"repo":{"id":24933148,"name":"chef-bach","full_name":"bloomberg/chef-bach","owner":{"login":"bloomberg","id":1416818,"avatar_url":"https://avatars2.githubusercontent.com/u/1416818?v=4","gravatar_id":"","url":"https://api.github.com/users/bloomberg","html_url":"https://github.com/bloomberg","followers_url":"https://api.github.com/users/bloomberg/followers","following_url":"https://api.github.com/users/bloomberg/following{/other_user}","gists_url":"https://api.github.com/users/bloomberg/gists{/gist_id}","starred_url":"https://api.github.com/users/bloomberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bloomberg/subscriptions","organizations_url":"https://api.github.com/users/bloomberg/orgs","repos_url":"https://api.github.com/users/bloomberg/repos","events_url":"https://api.github.com/users/bloomberg/events{/privacy}","received_events_url":"https://api.github.com/users/bloomberg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bloomberg/chef-bach","description":"Chef recipes for Bloomberg's deployment of Hadoop and related components","fork":false,"url":"https://api.github.com/repos/bloomberg/chef-bach","forks_url":"https://api.github.com/repos/bloomberg/chef-bach/forks","keys_url":"https://api.github.com/repos/bloomberg/chef-bach/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bloomberg/chef-bach/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bloomberg/chef-bach/teams","hooks_url":"https://api.github.com/repos/bloomberg/chef-bach/hooks","issue_events_url":"https://api.github.com/repos/bloomberg/chef-bach/issues/events{/number}","events_url":"https://api.github.com/repos/bloomberg/chef-bach/events","assignees_url":"https://api.github.com/repos/bloomberg/chef-bach/assignees{/user}","branches_url":"https://api.github.com/repos/bloomberg/chef-bach/branches{/branch}","tags_url":"https://api.github.com/repos/bloomberg/chef-bach/tags","blobs_url":"https://api.github.com/repos/bloomberg/chef-bach/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bloomberg/chef-bach/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bloomberg/chef-bach/git/refs{/sha}","trees_url":"https://api.github.com/repos/bloomberg/chef-bach/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bloomberg/chef-bach/statuses/{sha}","languages_url":"https://api.github.com/repos/bloomberg/chef-bach/languages","stargazers_url":"https://api.github.com/repos/bloomberg/chef-bach/stargazers","contributors_url":"https://api.github.com/repos/bloomberg/chef-bach/contributors","subscribers_url":"https://api.github.com/repos/bloomberg/chef-bach/subscribers","subscription_url":"https://api.github.com/repos/bloomberg/chef-bach/subscription","commits_url":"https://api.github.com/repos/bloomberg/chef-bach/commits{/sha}","git_commits_url":"https://api.github.com/repos/bloomberg/chef-bach/git/commits{/sha}","comments_url":"https://api.github.com/repos/bloomberg/chef-bach/comments{/number}","issue_comment_url":"https://api.github.com/repos/bloomberg/chef-bach/issues/comments{/number}","contents_url":"https://api.github.com/repos/bloomberg/chef-bach/contents/{+path}","compare_url":"https://api.github.com/repos/bloomberg/chef-bach/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bloomberg/chef-bach/merges","archive_url":"https://api.github.com/repos/bloomberg/chef-bach/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bloomberg/chef-bach/downloads","issues_url":"https://api.github.com/repos/bloomberg/chef-bach/issues{/number}","pulls_url":"https://api.github.com/repos/bloomberg/chef-bach/pulls{/number}","milestones_url":"https://api.github.com/repos/bloomberg/chef-bach/milestones{/number}","notifications_url":"https://api.github.com/repos/bloomberg/chef-bach/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bloomberg/chef-bach/labels{/name}","releases_url":"https://api.github.com/repos/bloomberg/chef-bach/releases{/id}","deployments_url":"https://api.github.com/repos/bloomberg/chef-bach/deployments","created_at":"2014-10-08T09:16:26Z","updated_at":"2017-11-10T19:02:31Z","pushed_at":"2017-11-29T17:32:30Z","git_url":"git://github.com/bloomberg/chef-bach.git","ssh_url":"git@github.com:bloomberg/chef-bach.git","clone_url":"https://github.com/bloomberg/chef-bach.git","svn_url":"https://github.com/bloomberg/chef-bach","homepage":null,"size":5807,"stargazers_count":50,"watchers_count":50,"language":"Ruby","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":49,"mirror_url":null,"archived":false,"open_issues_count":150,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":49,"open_issues":150,"watchers":50,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009"},"html":{"href":"https://github.com/bloomberg/chef-bach/pull/1009"},"issue":{"href":"https://api.github.com/repos/bloomberg/chef-bach/issues/1009"},"comments":{"href":"https://api.github.com/repos/bloomberg/chef-bach/issues/1009/comments"},"review_comments":{"href":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009/comments"},"review_comment":{"href":"https://api.github.com/repos/bloomberg/chef-bach/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bloomberg/chef-bach/pulls/1009/commits"},"statuses":{"href":"https://api.github.com/repos/bloomberg/chef-bach/statuses/c4a2a1683e37366130d7a6901b2224bd05d1a721"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"pu239ppy"}}