{"action":"created","comment":{"url":"https://api.github.com/repos/kubeflow/tf-operator/pulls/comments/235830621","pull_request_review_id":177788636,"id":235830621,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNTgzMDYyMQ==","diff_hunk":"@@ -0,0 +1,181 @@\n+import json\n+import logging\n+from kubernetes import client as k8s_client\n+from kubeflow.testing import test_util, util\n+from py import ks_util\n+from py import test_runner\n+from py import tf_job_client\n+\n+REPLICA_RESTART_POLICY_ALWAYS_COMPONENT_NAME = \"replica_restart_policy_always\"\n+REPLICA_RESTART_POLICY_ONFAILURE_COMPONENT_NAME = \"replica_restart_policy_onfailure\"\n+REPLICA_RESTART_POLICY_NEVER_COMPONENT_NAME = \"replica_restart_policy_never\"\n+REPLICA_RESTART_POLICY_EXITCODE_COMPONENT_NAME = \"replica_restart_policy_exitcode\"\n+\n+\n+class ReplicaRestartPolicyTests(test_util.TestCase):\n+\n+  def __init__(self, args):\n+    namespace, name, env = test_runner.parse_runtime_params(args)\n+    self.app_dir = args.app_dir\n+    self.env = env\n+    self.namespace = namespace\n+    self.tfjob_version = args.tfjob_version\n+    self.params = args.params\n+    super(ReplicaRestartPolicyTests, self).__init__(\n+      class_name=\"ReplicaRestartPolicyTests\", name=name)\n+\n+  def run_tfjob_with_replica_restart_policy(self, component,\n+                                            replica_restart_policy, exit_code):\n+    api_client = k8s_client.ApiClient()\n+\n+    # Setup the ksonnet app\n+    ks_util.setup_ks_app(self.app_dir, self.env, self.namespace, component,\n+                         self.params)\n+\n+    # Create the TF job\n+    util.run([\"ks\", \"apply\", self.env, \"-c\", component], cwd=self.app_dir)\n+    logging.info(\"Created job %s in namespaces %s\", self.name, self.namespace)\n+\n+    # Wait for the job to either be in Running state or a terminal state\n+    logging.info(\"Wait for conditions Running, Succeeded, or Failed\")\n+    results = tf_job_client.wait_for_condition(\n+      api_client,\n+      self.namespace,\n+      self.name, [\"Running\", \"Succeeded\", \"Failed\"],\n+      version=self.tfjob_version,\n+      status_callback=tf_job_client.log_status)\n+    logging.info(\"Current TFJob:\\n %s\", json.dumps(results, indent=2))\n+\n+    if replica_restart_policy == \"Always\":\n+      tf_job_client.wait_for_replica_type_in_phases(\n+        api_client, self.namespace, self.name, \"PS\", [\"Running\"])\n+      first_start_time = tf_job_client.get_start_time_by_index(\n+        api_client, self.namespace, self.name, \"PS\", 0)\n+\n+      tf_job_client.terminate_replicas(api_client, self.namespace, self.name,\n+                                       \"ps\", 1, exit_code)\n+\n+      tf_job_client.wait_for_replica_type_in_phases(\n+        api_client, self.namespace, self.name, \"PS\", [\"Running\"])\n+      restart_time = tf_job_client.get_start_time_by_index(\n+        api_client, self.namespace, self.name, \"PS\", 0)\n+\n+      logging.info(\"First start time: %s, restart time: %s\",\n+                   str(first_start_time), str(restart_time))\n+\n+      if restart_time <= first_start_time:\n+        self.failure = \"Job {0} in namespace {1} with restart policy Always failed test\".format(\n+          self.name, self.namespace)\n+        logging.error(self.failure)\n+        return\n+\n+    elif replica_restart_policy == \"OnFailure\":\n+      tf_job_client.wait_for_replica_type_in_phases(\n+        api_client, self.namespace, self.name, \"PS\", [\"Running\"])\n+      first_start_time = tf_job_client.get_start_time_by_index(\n+        api_client, self.namespace, self.name, \"PS\", 0)\n+\n+      tf_job_client.terminate_replicas(api_client, self.namespace, self.name,\n+                                       \"ps\", 1, exit_code)\n+\n+      tf_job_client.wait_for_replica_type_in_phases(\n+        api_client, self.namespace, self.name, \"PS\", [\"Running\"])\n+      restart_time = tf_job_client.get_start_time_by_index(\n+        api_client, self.namespace, self.name, \"PS\", 0)\n+\n+      logging.info(\"First start time: %s, restart time: %s\",\n+                   str(first_start_time), str(restart_time))\n+\n+      if restart_time <= first_start_time:\n+        self.failure = \"Job {0} in namespace {1} with restart policy OnFailure \\\n+          failed to restart the pod with exit_code 1\".format(\n+          self.name, self.namespace)\n+        logging.error(self.failure)\n+        return\n+\n+    elif replica_restart_policy == \"Never\":\n+      tf_job_client.terminate_replicas(api_client, self.namespace, self.name,","path":"py/replica_restart_policy_tests.py","position":97,"original_position":97,"commit_id":"04656057cdb4033465c4472d7c188921fa1f638a","original_commit_id":"04656057cdb4033465c4472d7c188921fa1f638a","user":{"login":"richardsliu","id":39319471,"node_id":"MDQ6VXNlcjM5MzE5NDcx","avatar_url":"https://avatars1.githubusercontent.com/u/39319471?v=4","gravatar_id":"","url":"https://api.github.com/users/richardsliu","html_url":"https://github.com/richardsliu","followers_url":"https://api.github.com/users/richardsliu/followers","following_url":"https://api.github.com/users/richardsliu/following{/other_user}","gists_url":"https://api.github.com/users/richardsliu/gists{/gist_id}","starred_url":"https://api.github.com/users/richardsliu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/richardsliu/subscriptions","organizations_url":"https://api.github.com/users/richardsliu/orgs","repos_url":"https://api.github.com/users/richardsliu/repos","events_url":"https://api.github.com/users/richardsliu/events{/privacy}","received_events_url":"https://api.github.com/users/richardsliu/received_events","type":"User","site_admin":false},"body":"For these cases we should verify that the start times are the same.","created_at":"2018-11-22T23:55:35Z","updated_at":"2018-11-22T23:59:24Z","html_url":"https://github.com/kubeflow/tf-operator/pull/873#discussion_r235830621","pull_request_url":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/kubeflow/tf-operator/pulls/comments/235830621"},"html":{"href":"https://github.com/kubeflow/tf-operator/pull/873#discussion_r235830621"},"pull_request":{"href":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873"}}},"pull_request":{"url":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873","id":232512012,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMyNTEyMDEy","html_url":"https://github.com/kubeflow/tf-operator/pull/873","diff_url":"https://github.com/kubeflow/tf-operator/pull/873.diff","patch_url":"https://github.com/kubeflow/tf-operator/pull/873.patch","issue_url":"https://api.github.com/repos/kubeflow/tf-operator/issues/873","number":873,"state":"open","locked":false,"title":"Add an e2etest for testing restart policy","user":{"login":"ChanYiLin","id":7100904,"node_id":"MDQ6VXNlcjcxMDA5MDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/7100904?v=4","gravatar_id":"","url":"https://api.github.com/users/ChanYiLin","html_url":"https://github.com/ChanYiLin","followers_url":"https://api.github.com/users/ChanYiLin/followers","following_url":"https://api.github.com/users/ChanYiLin/following{/other_user}","gists_url":"https://api.github.com/users/ChanYiLin/gists{/gist_id}","starred_url":"https://api.github.com/users/ChanYiLin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChanYiLin/subscriptions","organizations_url":"https://api.github.com/users/ChanYiLin/orgs","repos_url":"https://api.github.com/users/ChanYiLin/repos","events_url":"https://api.github.com/users/ChanYiLin/events{/privacy}","received_events_url":"https://api.github.com/users/ChanYiLin/received_events","type":"User","site_admin":false},"body":"Fixes #639\r\n\r\nThis PR does the following things:\r\n1. add replicas restart policy test by comparing the start time of the container in the pod\r\n2. fixed the pod_selector in py/tf_job_client.py by modifying\r\n`labels[\"tf-replica-type\"] = replica_type` to\r\n`labels[\"tf-replica-type\"] = str.lower(replica_type)`\r\n3. wait a time interval before fetching the pods' phase in py/k8s_util.py\r\n4. fixed bugs in clean pod policy test\r\n\r\n<!-- Reviewable:start -->\r\n---\r\nThis change is [<img src=\"https://reviewable.io/review_button.svg\" height=\"34\" align=\"absmiddle\" alt=\"Reviewable\"/>](https://reviewable.io/reviews/kubeflow/tf-operator/873)\r\n<!-- Reviewable:end -->\r\n","created_at":"2018-11-21T01:34:53Z","updated_at":"2018-11-22T23:59:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6dd50ecfa091eef00ff17fa4be12a0960f07aeb0","assignee":{"login":"gaocegege","id":5100735,"node_id":"MDQ6VXNlcjUxMDA3MzU=","avatar_url":"https://avatars3.githubusercontent.com/u/5100735?v=4","gravatar_id":"","url":"https://api.github.com/users/gaocegege","html_url":"https://github.com/gaocegege","followers_url":"https://api.github.com/users/gaocegege/followers","following_url":"https://api.github.com/users/gaocegege/following{/other_user}","gists_url":"https://api.github.com/users/gaocegege/gists{/gist_id}","starred_url":"https://api.github.com/users/gaocegege/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gaocegege/subscriptions","organizations_url":"https://api.github.com/users/gaocegege/orgs","repos_url":"https://api.github.com/users/gaocegege/repos","events_url":"https://api.github.com/users/gaocegege/events{/privacy}","received_events_url":"https://api.github.com/users/gaocegege/received_events","type":"User","site_admin":false},"assignees":[{"login":"gaocegege","id":5100735,"node_id":"MDQ6VXNlcjUxMDA3MzU=","avatar_url":"https://avatars3.githubusercontent.com/u/5100735?v=4","gravatar_id":"","url":"https://api.github.com/users/gaocegege","html_url":"https://github.com/gaocegege","followers_url":"https://api.github.com/users/gaocegege/followers","following_url":"https://api.github.com/users/gaocegege/following{/other_user}","gists_url":"https://api.github.com/users/gaocegege/gists{/gist_id}","starred_url":"https://api.github.com/users/gaocegege/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gaocegege/subscriptions","organizations_url":"https://api.github.com/users/gaocegege/orgs","repos_url":"https://api.github.com/users/gaocegege/repos","events_url":"https://api.github.com/users/gaocegege/events{/privacy}","received_events_url":"https://api.github.com/users/gaocegege/received_events","type":"User","site_admin":false},{"login":"richardsliu","id":39319471,"node_id":"MDQ6VXNlcjM5MzE5NDcx","avatar_url":"https://avatars1.githubusercontent.com/u/39319471?v=4","gravatar_id":"","url":"https://api.github.com/users/richardsliu","html_url":"https://github.com/richardsliu","followers_url":"https://api.github.com/users/richardsliu/followers","following_url":"https://api.github.com/users/richardsliu/following{/other_user}","gists_url":"https://api.github.com/users/richardsliu/gists{/gist_id}","starred_url":"https://api.github.com/users/richardsliu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/richardsliu/subscriptions","organizations_url":"https://api.github.com/users/richardsliu/orgs","repos_url":"https://api.github.com/users/richardsliu/repos","events_url":"https://api.github.com/users/richardsliu/events{/privacy}","received_events_url":"https://api.github.com/users/richardsliu/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"cheyang","id":3724388,"node_id":"MDQ6VXNlcjM3MjQzODg=","avatar_url":"https://avatars2.githubusercontent.com/u/3724388?v=4","gravatar_id":"","url":"https://api.github.com/users/cheyang","html_url":"https://github.com/cheyang","followers_url":"https://api.github.com/users/cheyang/followers","following_url":"https://api.github.com/users/cheyang/following{/other_user}","gists_url":"https://api.github.com/users/cheyang/gists{/gist_id}","starred_url":"https://api.github.com/users/cheyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cheyang/subscriptions","organizations_url":"https://api.github.com/users/cheyang/orgs","repos_url":"https://api.github.com/users/cheyang/repos","events_url":"https://api.github.com/users/cheyang/events{/privacy}","received_events_url":"https://api.github.com/users/cheyang/received_events","type":"User","site_admin":false},{"login":"lluunn","id":32310205,"node_id":"MDQ6VXNlcjMyMzEwMjA1","avatar_url":"https://avatars0.githubusercontent.com/u/32310205?v=4","gravatar_id":"","url":"https://api.github.com/users/lluunn","html_url":"https://github.com/lluunn","followers_url":"https://api.github.com/users/lluunn/followers","following_url":"https://api.github.com/users/lluunn/following{/other_user}","gists_url":"https://api.github.com/users/lluunn/gists{/gist_id}","starred_url":"https://api.github.com/users/lluunn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lluunn/subscriptions","organizations_url":"https://api.github.com/users/lluunn/orgs","repos_url":"https://api.github.com/users/lluunn/repos","events_url":"https://api.github.com/users/lluunn/events{/privacy}","received_events_url":"https://api.github.com/users/lluunn/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":850672326,"node_id":"MDU6TGFiZWw4NTA2NzIzMjY=","url":"https://api.github.com/repos/kubeflow/tf-operator/labels/lgtm","name":"lgtm","color":"2efca4","default":false},{"id":845800081,"node_id":"MDU6TGFiZWw4NDU4MDAwODE=","url":"https://api.github.com/repos/kubeflow/tf-operator/labels/size/XXL","name":"size/XXL","color":"f9d0c4","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873/commits","review_comments_url":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873/comments","review_comment_url":"https://api.github.com/repos/kubeflow/tf-operator/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubeflow/tf-operator/issues/873/comments","statuses_url":"https://api.github.com/repos/kubeflow/tf-operator/statuses/04656057cdb4033465c4472d7c188921fa1f638a","head":{"label":"ChanYiLin:master","ref":"master","sha":"04656057cdb4033465c4472d7c188921fa1f638a","user":{"login":"ChanYiLin","id":7100904,"node_id":"MDQ6VXNlcjcxMDA5MDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/7100904?v=4","gravatar_id":"","url":"https://api.github.com/users/ChanYiLin","html_url":"https://github.com/ChanYiLin","followers_url":"https://api.github.com/users/ChanYiLin/followers","following_url":"https://api.github.com/users/ChanYiLin/following{/other_user}","gists_url":"https://api.github.com/users/ChanYiLin/gists{/gist_id}","starred_url":"https://api.github.com/users/ChanYiLin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChanYiLin/subscriptions","organizations_url":"https://api.github.com/users/ChanYiLin/orgs","repos_url":"https://api.github.com/users/ChanYiLin/repos","events_url":"https://api.github.com/users/ChanYiLin/events{/privacy}","received_events_url":"https://api.github.com/users/ChanYiLin/received_events","type":"User","site_admin":false},"repo":{"id":158471344,"node_id":"MDEwOlJlcG9zaXRvcnkxNTg0NzEzNDQ=","name":"tf-operator","full_name":"ChanYiLin/tf-operator","private":false,"owner":{"login":"ChanYiLin","id":7100904,"node_id":"MDQ6VXNlcjcxMDA5MDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/7100904?v=4","gravatar_id":"","url":"https://api.github.com/users/ChanYiLin","html_url":"https://github.com/ChanYiLin","followers_url":"https://api.github.com/users/ChanYiLin/followers","following_url":"https://api.github.com/users/ChanYiLin/following{/other_user}","gists_url":"https://api.github.com/users/ChanYiLin/gists{/gist_id}","starred_url":"https://api.github.com/users/ChanYiLin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChanYiLin/subscriptions","organizations_url":"https://api.github.com/users/ChanYiLin/orgs","repos_url":"https://api.github.com/users/ChanYiLin/repos","events_url":"https://api.github.com/users/ChanYiLin/events{/privacy}","received_events_url":"https://api.github.com/users/ChanYiLin/received_events","type":"User","site_admin":false},"html_url":"https://github.com/ChanYiLin/tf-operator","description":"Tools for ML/Tensorflow on Kubernetes.","fork":true,"url":"https://api.github.com/repos/ChanYiLin/tf-operator","forks_url":"https://api.github.com/repos/ChanYiLin/tf-operator/forks","keys_url":"https://api.github.com/repos/ChanYiLin/tf-operator/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ChanYiLin/tf-operator/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ChanYiLin/tf-operator/teams","hooks_url":"https://api.github.com/repos/ChanYiLin/tf-operator/hooks","issue_events_url":"https://api.github.com/repos/ChanYiLin/tf-operator/issues/events{/number}","events_url":"https://api.github.com/repos/ChanYiLin/tf-operator/events","assignees_url":"https://api.github.com/repos/ChanYiLin/tf-operator/assignees{/user}","branches_url":"https://api.github.com/repos/ChanYiLin/tf-operator/branches{/branch}","tags_url":"https://api.github.com/repos/ChanYiLin/tf-operator/tags","blobs_url":"https://api.github.com/repos/ChanYiLin/tf-operator/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ChanYiLin/tf-operator/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ChanYiLin/tf-operator/git/refs{/sha}","trees_url":"https://api.github.com/repos/ChanYiLin/tf-operator/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ChanYiLin/tf-operator/statuses/{sha}","languages_url":"https://api.github.com/repos/ChanYiLin/tf-operator/languages","stargazers_url":"https://api.github.com/repos/ChanYiLin/tf-operator/stargazers","contributors_url":"https://api.github.com/repos/ChanYiLin/tf-operator/contributors","subscribers_url":"https://api.github.com/repos/ChanYiLin/tf-operator/subscribers","subscription_url":"https://api.github.com/repos/ChanYiLin/tf-operator/subscription","commits_url":"https://api.github.com/repos/ChanYiLin/tf-operator/commits{/sha}","git_commits_url":"https://api.github.com/repos/ChanYiLin/tf-operator/git/commits{/sha}","comments_url":"https://api.github.com/repos/ChanYiLin/tf-operator/comments{/number}","issue_comment_url":"https://api.github.com/repos/ChanYiLin/tf-operator/issues/comments{/number}","contents_url":"https://api.github.com/repos/ChanYiLin/tf-operator/contents/{+path}","compare_url":"https://api.github.com/repos/ChanYiLin/tf-operator/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ChanYiLin/tf-operator/merges","archive_url":"https://api.github.com/repos/ChanYiLin/tf-operator/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ChanYiLin/tf-operator/downloads","issues_url":"https://api.github.com/repos/ChanYiLin/tf-operator/issues{/number}","pulls_url":"https://api.github.com/repos/ChanYiLin/tf-operator/pulls{/number}","milestones_url":"https://api.github.com/repos/ChanYiLin/tf-operator/milestones{/number}","notifications_url":"https://api.github.com/repos/ChanYiLin/tf-operator/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ChanYiLin/tf-operator/labels{/name}","releases_url":"https://api.github.com/repos/ChanYiLin/tf-operator/releases{/id}","deployments_url":"https://api.github.com/repos/ChanYiLin/tf-operator/deployments","created_at":"2018-11-21T01:06:16Z","updated_at":"2018-11-22T00:20:38Z","pushed_at":"2018-11-22T00:20:36Z","git_url":"git://github.com/ChanYiLin/tf-operator.git","ssh_url":"git@github.com:ChanYiLin/tf-operator.git","clone_url":"https://github.com/ChanYiLin/tf-operator.git","svn_url":"https://github.com/ChanYiLin/tf-operator","homepage":null,"size":39377,"stargazers_count":0,"watchers_count":0,"language":"Go","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","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubeflow:master","ref":"master","sha":"89e6f66aa05b9636b7f477f75465b9fdf94d846b","user":{"login":"kubeflow","id":33164907,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMTY0OTA3","avatar_url":"https://avatars0.githubusercontent.com/u/33164907?v=4","gravatar_id":"","url":"https://api.github.com/users/kubeflow","html_url":"https://github.com/kubeflow","followers_url":"https://api.github.com/users/kubeflow/followers","following_url":"https://api.github.com/users/kubeflow/following{/other_user}","gists_url":"https://api.github.com/users/kubeflow/gists{/gist_id}","starred_url":"https://api.github.com/users/kubeflow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubeflow/subscriptions","organizations_url":"https://api.github.com/users/kubeflow/orgs","repos_url":"https://api.github.com/users/kubeflow/repos","events_url":"https://api.github.com/users/kubeflow/events{/privacy}","received_events_url":"https://api.github.com/users/kubeflow/received_events","type":"Organization","site_admin":false},"repo":{"id":95700338,"node_id":"MDEwOlJlcG9zaXRvcnk5NTcwMDMzOA==","name":"tf-operator","full_name":"kubeflow/tf-operator","private":false,"owner":{"login":"kubeflow","id":33164907,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMTY0OTA3","avatar_url":"https://avatars0.githubusercontent.com/u/33164907?v=4","gravatar_id":"","url":"https://api.github.com/users/kubeflow","html_url":"https://github.com/kubeflow","followers_url":"https://api.github.com/users/kubeflow/followers","following_url":"https://api.github.com/users/kubeflow/following{/other_user}","gists_url":"https://api.github.com/users/kubeflow/gists{/gist_id}","starred_url":"https://api.github.com/users/kubeflow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubeflow/subscriptions","organizations_url":"https://api.github.com/users/kubeflow/orgs","repos_url":"https://api.github.com/users/kubeflow/repos","events_url":"https://api.github.com/users/kubeflow/events{/privacy}","received_events_url":"https://api.github.com/users/kubeflow/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/kubeflow/tf-operator","description":"Tools for ML/Tensorflow on Kubernetes.","fork":false,"url":"https://api.github.com/repos/kubeflow/tf-operator","forks_url":"https://api.github.com/repos/kubeflow/tf-operator/forks","keys_url":"https://api.github.com/repos/kubeflow/tf-operator/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubeflow/tf-operator/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubeflow/tf-operator/teams","hooks_url":"https://api.github.com/repos/kubeflow/tf-operator/hooks","issue_events_url":"https://api.github.com/repos/kubeflow/tf-operator/issues/events{/number}","events_url":"https://api.github.com/repos/kubeflow/tf-operator/events","assignees_url":"https://api.github.com/repos/kubeflow/tf-operator/assignees{/user}","branches_url":"https://api.github.com/repos/kubeflow/tf-operator/branches{/branch}","tags_url":"https://api.github.com/repos/kubeflow/tf-operator/tags","blobs_url":"https://api.github.com/repos/kubeflow/tf-operator/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubeflow/tf-operator/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubeflow/tf-operator/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubeflow/tf-operator/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubeflow/tf-operator/statuses/{sha}","languages_url":"https://api.github.com/repos/kubeflow/tf-operator/languages","stargazers_url":"https://api.github.com/repos/kubeflow/tf-operator/stargazers","contributors_url":"https://api.github.com/repos/kubeflow/tf-operator/contributors","subscribers_url":"https://api.github.com/repos/kubeflow/tf-operator/subscribers","subscription_url":"https://api.github.com/repos/kubeflow/tf-operator/subscription","commits_url":"https://api.github.com/repos/kubeflow/tf-operator/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubeflow/tf-operator/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubeflow/tf-operator/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubeflow/tf-operator/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubeflow/tf-operator/contents/{+path}","compare_url":"https://api.github.com/repos/kubeflow/tf-operator/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubeflow/tf-operator/merges","archive_url":"https://api.github.com/repos/kubeflow/tf-operator/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubeflow/tf-operator/downloads","issues_url":"https://api.github.com/repos/kubeflow/tf-operator/issues{/number}","pulls_url":"https://api.github.com/repos/kubeflow/tf-operator/pulls{/number}","milestones_url":"https://api.github.com/repos/kubeflow/tf-operator/milestones{/number}","notifications_url":"https://api.github.com/repos/kubeflow/tf-operator/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubeflow/tf-operator/labels{/name}","releases_url":"https://api.github.com/repos/kubeflow/tf-operator/releases{/id}","deployments_url":"https://api.github.com/repos/kubeflow/tf-operator/deployments","created_at":"2017-06-28T18:38:14Z","updated_at":"2018-11-21T05:19:26Z","pushed_at":"2018-11-22T09:11:59Z","git_url":"git://github.com/kubeflow/tf-operator.git","ssh_url":"git@github.com:kubeflow/tf-operator.git","clone_url":"https://github.com/kubeflow/tf-operator.git","svn_url":"https://github.com/kubeflow/tf-operator","homepage":null,"size":69593,"stargazers_count":575,"watchers_count":575,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":168,"mirror_url":null,"archived":false,"open_issues_count":70,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":168,"open_issues":70,"watchers":575,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873"},"html":{"href":"https://github.com/kubeflow/tf-operator/pull/873"},"issue":{"href":"https://api.github.com/repos/kubeflow/tf-operator/issues/873"},"comments":{"href":"https://api.github.com/repos/kubeflow/tf-operator/issues/873/comments"},"review_comments":{"href":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873/comments"},"review_comment":{"href":"https://api.github.com/repos/kubeflow/tf-operator/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubeflow/tf-operator/pulls/873/commits"},"statuses":{"href":"https://api.github.com/repos/kubeflow/tf-operator/statuses/04656057cdb4033465c4472d7c188921fa1f638a"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"richardsliu"}}