{"action":"created","comment":{"url":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/comments/42158639","id":42158639,"diff_hunk":"@@ -568,120 +574,53 @@ def _api_root_secure(self):\n     def _generate_rules(self, pod):\n         \"\"\"\n         Generate Rules takes human readable policy strings in annotations\n-        and creates argument arrays for calicoctl\n+        and returns a libcalico Rules object.\n \n         :return tuple of inbound_rules, outbound_rules\n         \"\"\"\n+        # Create allow and per-namespace rules for later use.\n+        allow = Rule(action=\"allow\")\n+        allow_ns = Rule(action=\"allow\", src_tag=self._get_namespace_tag(pod))\n \n-        ns_tag = self._get_namespace_tag(pod)\n-\n-        # kube-system services need to be accessed by all namespaces\n+        # Check the namespace.\n         if self.namespace == \"kube-system\" :\n-            logger.info(\"Pod %s belongs to the kube-system namespace - \"\n-                        \"allow all inbound and outbound traffic\", pod)\n-            return [[\"allow\"]], [[\"allow\"]]\n-\n-        if self.namespace and DEFAULT_POLICY == 'ns_isolation':\n-            inbound_rules = [[\"allow\", \"from\", \"tag\", ns_tag]]\n-            outbound_rules = [[\"allow\"]]\n+            # Pods in the kube-system namespace must be accessible by all\n+            # other pods for services like DNS to work.\n+            logger.info(\"Pod is in kube-system namespace allow all\")\n+            inbound_rules = [allow]\n+            outbound_rules = [allow]\n         else:\n-            inbound_rules = [[\"allow\"]]\n-            outbound_rules = [[\"allow\"]]\n-\n-        logger.info(\"Getting Policy Rules from Annotation of pod %s\", pod)\n-\n-        annotations = self._get_metadata(pod, \"annotations\")\n-\n-        # Find policy block of annotations\n-        if annotations and POLICY_ANNOTATION_KEY in annotations:\n-            # Remove Default Rule (Allow Namespace)\n-            inbound_rules = []\n-            rules = annotations[POLICY_ANNOTATION_KEY]\n-\n-            # Rules separated by semicolons\n-            for rule in rules.split(\";\"):\n-                args = rule.split(\" \")\n-\n-                # Labels in annotations use the format 'label X=Y'\n-                # These must be converted into format 'tag NAMSPACE_X_Y' to\n-                # be parsed by calicoctl.\n-                if 'label' in args:\n-                    # Replace arg 'label' with arg 'tag'\n-                    label_ind = args.index('label')\n-                    args[label_ind] = 'tag'\n-\n-                    # Split given label 'key=value' into 'key', 'value'\n-                    label = args[label_ind + 1]\n-                    key, value = label.split('=')\n-\n-                    # Compose Calico tag out of key, value components\n-                    tag = self._label_to_tag(key, value)\n-                    args[label_ind + 1] = tag\n-\n-                # Remove empty strings and add to rule list\n-                args = filter(None, args)\n-                inbound_rules.append(args)\n-\n-        return inbound_rules, outbound_rules\n-\n-    def _apply_rules(self, pod):\n-        \"\"\"\n-        Generate a rules for a given profile based on annotations.\n-        1) Remove Calicoctl default rules\n-        2) Create new profiles based on annotations, and establish new defaults\n-\n-        Exceptions:\n-            If namespace = kube-system (internal kube services), allow all.\n-            If no policy in annotations, allow from pod's Namespace\n-            Outbound policy should allow all traffic\n-\n-        :param pod: pod info to parse\n-        :type pod: dict()\n-        :return:\n-        \"\"\"\n-        try:\n-            profile = self._datastore_client.get_profile(self.profile_name)\n-        except:\n-            logger.exception(\"ERROR: Could not apply rules. Profile not \"\n-                             \"found: %s, exiting\", self.profile_name)\n-            sys.exit(1)\n-\n-        inbound_rules, outbound_rules = self._generate_rules(pod)\n-\n-        logger.info(\"Removing Default Rules\")\n-\n-        # Remove default rules. Assumes 2 inbound, 1 outbound.\n-        try:\n-            self.calicoctl('profile', self.profile_name, 'rule', 'remove',\n-                           'inbound', '--at=2')\n-            self.calicoctl('profile', self.profile_name, 'rule', 'remove',\n-                           'inbound', '--at=1')\n-            self.calicoctl('profile', self.profile_name, 'rule', 'remove',\n-                           'outbound', '--at=1')\n-        except sh.ErrorReturnCode as e:\n-            logger.error('Could not delete default rules for profile %s '\n-                         '(assumed 2 inbound, 1 outbound)\\n%s',\n-                         self.profile_name, e)\n-\n-        # Call calicoctl to populate inbound rules\n-        for rule in inbound_rules:\n-            logger.info('applying inbound rule \\n%s', rule)\n-            try:\n-                self.calicoctl('profile', self.profile_name, 'rule', 'add',\n-                               'inbound', rule)\n-            except sh.ErrorReturnCode as e:\n-                logger.error('Could not apply inbound rule %s.\\n%s', rule, e)\n-\n-        # Call calicoctl to populate outbound rules\n-        for rule in outbound_rules:\n-            logger.info('applying outbound rule \\n%s', rule)\n-            try:\n-                self.calicoctl('profile', self.profile_name, 'rule', 'add',\n-                               'outbound', rule)\n-            except sh.ErrorReturnCode as e:\n-                logger.error('Could not apply outbound rule %s.\\n%s', rule, e)\n-\n-        logger.info('Finished applying rules.')\n+            # Other namespaces use the DEFAULT_POLICY and any declared\n+            # annotation based policy to create rules.\n+            if DEFAULT_POLICY == 'ns_isolation':\n+                # Isolate on namespace boundaries by default.\n+                logger.debug(\"Default policy is namespace isolation\")\n+                inbound_rules = [allow_ns]\n+                outbound_rules = [allow]\n+            else:\n+                # Allow all traffic by default.\n+                logger.debug(\"Default policy is allow all\")\n+                inbound_rules = [allow]\n+                outbound_rules = [allow]\n+\n+            logger.info(\"Checking for annotation based policy\")\n+            annotations = self._get_metadata(pod, \"annotations\")\n+\n+            # If policy annotations are defined, use them to generate rules.\n+            if annotations and POLICY_ANNOTATION_KEY in annotations:","path":"calico_kubernetes/calico_kubernetes.py","position":247,"original_position":247,"commit_id":"0c75fd332dfc32a73550371e6739271385a0cae9","original_commit_id":"0c75fd332dfc32a73550371e6739271385a0cae9","user":{"login":"caseydavenport","id":1944093,"avatar_url":"https://avatars.githubusercontent.com/u/1944093?v=3","gravatar_id":"","url":"https://api.github.com/users/caseydavenport","html_url":"https://github.com/caseydavenport","followers_url":"https://api.github.com/users/caseydavenport/followers","following_url":"https://api.github.com/users/caseydavenport/following{/other_user}","gists_url":"https://api.github.com/users/caseydavenport/gists{/gist_id}","starred_url":"https://api.github.com/users/caseydavenport/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caseydavenport/subscriptions","organizations_url":"https://api.github.com/users/caseydavenport/orgs","repos_url":"https://api.github.com/users/caseydavenport/repos","events_url":"https://api.github.com/users/caseydavenport/events{/privacy}","received_events_url":"https://api.github.com/users/caseydavenport/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2015-10-15T18:04:41Z","updated_at":"2015-10-15T18:04:41Z","html_url":"https://github.com/projectcalico/calico-kubernetes/pull/64#discussion_r42158639","pull_request_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64","_links":{"self":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/comments/42158639"},"html":{"href":"https://github.com/projectcalico/calico-kubernetes/pull/64#discussion_r42158639"},"pull_request":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64"}}},"pull_request":{"url":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64","id":46930185,"html_url":"https://github.com/projectcalico/calico-kubernetes/pull/64","diff_url":"https://github.com/projectcalico/calico-kubernetes/pull/64.diff","patch_url":"https://github.com/projectcalico/calico-kubernetes/pull/64.patch","issue_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/issues/64","number":64,"state":"open","locked":false,"title":"Parse policy statements without `calicoctl`","user":{"login":"caseydavenport","id":1944093,"avatar_url":"https://avatars.githubusercontent.com/u/1944093?v=3","gravatar_id":"","url":"https://api.github.com/users/caseydavenport","html_url":"https://github.com/caseydavenport","followers_url":"https://api.github.com/users/caseydavenport/followers","following_url":"https://api.github.com/users/caseydavenport/following{/other_user}","gists_url":"https://api.github.com/users/caseydavenport/gists{/gist_id}","starred_url":"https://api.github.com/users/caseydavenport/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caseydavenport/subscriptions","organizations_url":"https://api.github.com/users/caseydavenport/orgs","repos_url":"https://api.github.com/users/caseydavenport/repos","events_url":"https://api.github.com/users/caseydavenport/events{/privacy}","received_events_url":"https://api.github.com/users/caseydavenport/received_events","type":"User","site_admin":false},"body":"Addresses #11 ","created_at":"2015-10-06T17:07:17Z","updated_at":"2015-10-15T18:04:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b64d4411154340b106b8f1087c1106ac5748f365","assignee":{"login":"Symmetric","id":1524910,"avatar_url":"https://avatars.githubusercontent.com/u/1524910?v=3","gravatar_id":"","url":"https://api.github.com/users/Symmetric","html_url":"https://github.com/Symmetric","followers_url":"https://api.github.com/users/Symmetric/followers","following_url":"https://api.github.com/users/Symmetric/following{/other_user}","gists_url":"https://api.github.com/users/Symmetric/gists{/gist_id}","starred_url":"https://api.github.com/users/Symmetric/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Symmetric/subscriptions","organizations_url":"https://api.github.com/users/Symmetric/orgs","repos_url":"https://api.github.com/users/Symmetric/repos","events_url":"https://api.github.com/users/Symmetric/events{/privacy}","received_events_url":"https://api.github.com/users/Symmetric/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64/commits","review_comments_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64/comments","review_comment_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/issues/64/comments","statuses_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/statuses/0c75fd332dfc32a73550371e6739271385a0cae9","head":{"label":"caseydavenport:cd4-parse-policy","ref":"cd4-parse-policy","sha":"0c75fd332dfc32a73550371e6739271385a0cae9","user":{"login":"caseydavenport","id":1944093,"avatar_url":"https://avatars.githubusercontent.com/u/1944093?v=3","gravatar_id":"","url":"https://api.github.com/users/caseydavenport","html_url":"https://github.com/caseydavenport","followers_url":"https://api.github.com/users/caseydavenport/followers","following_url":"https://api.github.com/users/caseydavenport/following{/other_user}","gists_url":"https://api.github.com/users/caseydavenport/gists{/gist_id}","starred_url":"https://api.github.com/users/caseydavenport/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caseydavenport/subscriptions","organizations_url":"https://api.github.com/users/caseydavenport/orgs","repos_url":"https://api.github.com/users/caseydavenport/repos","events_url":"https://api.github.com/users/caseydavenport/events{/privacy}","received_events_url":"https://api.github.com/users/caseydavenport/received_events","type":"User","site_admin":false},"repo":{"id":40203754,"name":"calico-kubernetes","full_name":"caseydavenport/calico-kubernetes","owner":{"login":"caseydavenport","id":1944093,"avatar_url":"https://avatars.githubusercontent.com/u/1944093?v=3","gravatar_id":"","url":"https://api.github.com/users/caseydavenport","html_url":"https://github.com/caseydavenport","followers_url":"https://api.github.com/users/caseydavenport/followers","following_url":"https://api.github.com/users/caseydavenport/following{/other_user}","gists_url":"https://api.github.com/users/caseydavenport/gists{/gist_id}","starred_url":"https://api.github.com/users/caseydavenport/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caseydavenport/subscriptions","organizations_url":"https://api.github.com/users/caseydavenport/orgs","repos_url":"https://api.github.com/users/caseydavenport/repos","events_url":"https://api.github.com/users/caseydavenport/events{/privacy}","received_events_url":"https://api.github.com/users/caseydavenport/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/caseydavenport/calico-kubernetes","description":"","fork":true,"url":"https://api.github.com/repos/caseydavenport/calico-kubernetes","forks_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/forks","keys_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/teams","hooks_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/hooks","issue_events_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/events","assignees_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/tags","blobs_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/languages","stargazers_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/stargazers","contributors_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/contributors","subscribers_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/subscribers","subscription_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/subscription","commits_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/merges","archive_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/downloads","issues_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/caseydavenport/calico-kubernetes/releases{/id}","created_at":"2015-08-04T19:02:35Z","updated_at":"2015-08-12T21:40:43Z","pushed_at":"2015-10-06T20:39:14Z","git_url":"git://github.com/caseydavenport/calico-kubernetes.git","ssh_url":"git@github.com:caseydavenport/calico-kubernetes.git","clone_url":"https://github.com/caseydavenport/calico-kubernetes.git","svn_url":"https://github.com/caseydavenport/calico-kubernetes","homepage":null,"size":385,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"projectcalico:master","ref":"master","sha":"30e4b0b64ad9644be0f00ad70e96d21f05ea5f75","user":{"login":"projectcalico","id":12304728,"avatar_url":"https://avatars.githubusercontent.com/u/12304728?v=3","gravatar_id":"","url":"https://api.github.com/users/projectcalico","html_url":"https://github.com/projectcalico","followers_url":"https://api.github.com/users/projectcalico/followers","following_url":"https://api.github.com/users/projectcalico/following{/other_user}","gists_url":"https://api.github.com/users/projectcalico/gists{/gist_id}","starred_url":"https://api.github.com/users/projectcalico/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectcalico/subscriptions","organizations_url":"https://api.github.com/users/projectcalico/orgs","repos_url":"https://api.github.com/users/projectcalico/repos","events_url":"https://api.github.com/users/projectcalico/events{/privacy}","received_events_url":"https://api.github.com/users/projectcalico/received_events","type":"Organization","site_admin":false},"repo":{"id":39913632,"name":"calico-kubernetes","full_name":"projectcalico/calico-kubernetes","owner":{"login":"projectcalico","id":12304728,"avatar_url":"https://avatars.githubusercontent.com/u/12304728?v=3","gravatar_id":"","url":"https://api.github.com/users/projectcalico","html_url":"https://github.com/projectcalico","followers_url":"https://api.github.com/users/projectcalico/followers","following_url":"https://api.github.com/users/projectcalico/following{/other_user}","gists_url":"https://api.github.com/users/projectcalico/gists{/gist_id}","starred_url":"https://api.github.com/users/projectcalico/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectcalico/subscriptions","organizations_url":"https://api.github.com/users/projectcalico/orgs","repos_url":"https://api.github.com/users/projectcalico/repos","events_url":"https://api.github.com/users/projectcalico/events{/privacy}","received_events_url":"https://api.github.com/users/projectcalico/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/projectcalico/calico-kubernetes","description":"Calico Kubernetes Networking Plugin","fork":false,"url":"https://api.github.com/repos/projectcalico/calico-kubernetes","forks_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/forks","keys_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/teams","hooks_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/hooks","issue_events_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/events","assignees_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/tags","blobs_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/languages","stargazers_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/stargazers","contributors_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/contributors","subscribers_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/subscribers","subscription_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/subscription","commits_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/merges","archive_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/downloads","issues_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/projectcalico/calico-kubernetes/releases{/id}","created_at":"2015-07-29T20:04:46Z","updated_at":"2015-10-12T22:47:45Z","pushed_at":"2015-10-15T17:35:39Z","git_url":"git://github.com/projectcalico/calico-kubernetes.git","ssh_url":"git@github.com:projectcalico/calico-kubernetes.git","clone_url":"https://github.com/projectcalico/calico-kubernetes.git","svn_url":"https://github.com/projectcalico/calico-kubernetes","homepage":"","size":877,"stargazers_count":23,"watchers_count":23,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":16,"forks":5,"open_issues":16,"watchers":23,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64"},"html":{"href":"https://github.com/projectcalico/calico-kubernetes/pull/64"},"issue":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/issues/64"},"comments":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/issues/64/comments"},"review_comments":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64/comments"},"review_comment":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/pulls/64/commits"},"statuses":{"href":"https://api.github.com/repos/projectcalico/calico-kubernetes/statuses/0c75fd332dfc32a73550371e6739271385a0cae9"}}}}