{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/community/pulls/comments/170137363","pull_request_review_id":98776931,"id":170137363,"diff_hunk":"@@ -0,0 +1,1108 @@\n+---\n+kep-number: draft-20180115\n+title: Kubernetes Application API\n+authors:\n+  - \"@kow3ns\"\n+owning-sig: sig-apps\n+participating-sigs:\n+  - sig-apps\n+  - sig-cli\n+reviewers:\n+  - \"@kow3ns\"\n+  - \"@danielromlein\"\n+  - \"@lavalamp\"\n+approvers:\n+  - \"@kow3ns\"\n+  - \"@mattfarina\"\n+  - \"@prydonius\"\n+  - \"@pwittrock\"\n+editor:\n+creation-date: 2018-01-15\n+last-updated: 2018-01-15\n+status: accepted\n+see-also:\n+[labeling and annotation conventions](https://docs.google.com/document/d/1EVy0wRJRm5nogkHl38fNKbFrhERmSL_CLNE4cxcsc_M)\n+replaces:\n+superseded-by:\n+---\n+\n+# Kubernetes Application API\n+\n+## Table of Contents\n+\n+* [Table of Contents](#table-of-contents)\n+* [Summary](#summary)\n+* [Motivation](#motivation)\n+ * [Goals](#goals)\n+ * [Non-Goals](#non-goals)\n+* [Proposal](#proposal)\n+ * [User Stories](#user-stories)\n+    * [Application Creation](#application-creation)\n+    * [Application View](#application-view)\n+    * [Application Health](#application-health)\n+    * [Application Update](#application-update)\n+    * [Application List](#application-list)\n+    * [Application Watch](#application-watch)\n+    * [Application Deletion](#application-deletion)\n+ * [Implementation](#implementation)\n+ * [API](#api)\n+    * [Validation](#validation)\n+    * [Generation Incrementation](#generation-incrementation)\n+    * [Namespaces](#namespaces)\n+    * [Composition (Is A)](#composition-is-a)\n+    * [Aggregation (Has A)](#aggregation-has-a)\n+    * [Selecting Components](#selecting-components)\n+    * [Retrieving Applications](#retrieving-applications)\n+    * [Retrieving Dependencies](#retrieving-dependencies)\n+    * [Health Checks](#health-checks)\n+ * [Application Controller](#application-controller)\n+    * [Garbage Collection](#garbage-collection)\n+    * [Installation Status Reporting](#installation-status-reporting)\n+    * [Health Status Reporting.](#health-status-reporting)\n+    * [Generation Observation](#generation-observation)\n+    * [Adopting Existing Components](#adopting-existing-components)\n+ * [kubectl](#kubectl)\n+ * [UI Considerations](#ui-considerations)\n+    * [Discovering Application Components and Dependencies](#discovering-application-components-and-dependencies)\n+    * [Discovering an Object's Application](#discovering-an-objects-application)\n+    * [Application Status](#application-status)\n+ * [Risks and Mitigations](#risks-and-mitigations)\n+* [Graduation Criteria](#graduation-criteria)\n+* [Implementation History](#implementation-history)\n+ * [Planned](#planned)\n+* [Drawbacks](#drawbacks)\n+ * [Increased API Server Storage Requirements](#increased-api-server-storage-requirements)\n+ * [Users Have to Create an Application Object](#users-have-to-create-an-application-object)\n+* [Alternatives](#alternatives)\n+ * [Use Labeling Conventions](#use-labeling-conventions)\n+ * [Application Type Aggregation](#application-type-aggregation)\n+* [Future Work](#future-work)\n+ * [Controller Based Garbage Collection](#controller-based-garbage-collection)\n+ * [Service Based Health Checks](#service-based-health-checks)\n+\n+\n+## Summary\n+Kubernetes has many primitives for managing workloads (e.g. Pods, ReplicaSets, Deployments, DaemonSets and \n+StatefulSets), storage (e.g. PersistentVolumeClaims and PersistentVolumes), and networking (e.g. Services, \n+Headless Services, and Ingresses). When these primitives are aggregated to provide a service to an end user or to \n+another system, the whole becomes something more than the individual parts. Instead of a set of loosely coupled \n+workloads and their corresponding storage and networking, we have an application. \n+\n+Currently, there is no standard way for tools to discover the relationship between the components of an \n+application. Many tools use bespoke schemes (generally involving labeling and/or annotations). This has lead to a \n+proliferation on non-interoperable tools, a non-uniform experience for application developers and users, and an \n+inability of UI (User Interface) designers to surface information about applications to users.\n+\n+To address these issues, we propose to add an Application Kind as a first as a Custom Resource Definition (CRD) \n+extension of the Kubernetes API. This Kind can be used by tools to communicate that the applications they create are \n+more than just a loosely coupled set of API objects.\n+\n+The use of the Application object is strictly opt-in for tool developers. Tools and users that choose to use the \n+Application object in their manifests will benefit from interoperability, a uniform user experience, and first class \n+support by Kubernetes UIs.\n+\n+## Motivation\n+As an example, consider how [WordPress](https://github.com/WordPress/WordPress), a simple CMS  (Content Management \n+System) is created via a manifest. The manifest below creates two StatefulSets (one for a MySQL RDBMs instance and \n+another for the WordPress web server), a Headless Services for each StatefulSet, and a load balanced Service for the \n+WordPress web server.\n+ \n+ ```yaml\n+ apiVersion: v1\n+ kind: Service\n+ metadata:\n+   name: wordpress-mysql-hsvc\n+   labels:\n+     app: wordpress\n+     component: wordpress-mysql-hsvc\n+ spec:\n+   ports:\n+     - port: 3306\n+   selector:\n+     app: wordpress\n+     component: wordpres-mysql\n+   clusterIP: None\n+ ---  \n+ apiVersion: apps/v1\n+ kind: StatefulSet\n+ metadata:\n+   name: wordpress-mysql\n+   labels:\n+     app: wordpress\n+ spec:\n+   selector:\n+     matchLabels:\n+       app: wordpress\n+       component: wordpress-mysql\n+   replicas: 1\n+   service: wordpress-mysql-hsvc\n+   template:\n+     metadata:\n+       labels:\n+         app: wordpress\n+         component: rdbms\n+     spec:\n+      \n+       containers:\n+       - image: mysql:5.6\n+         name: mysql\n+         env:\n+         - name: MYSQL_ROOT_PASSWORD\n+           valueFrom:\n+             secretKeyRef:\n+               name: mysql-pass\n+               key: password\n+         ports:\n+         - containerPort: 3306\n+           name: mysql\n+         volumeMounts:\n+         - name: mysql-persistent-storage\n+           mountPath: /var/lib/mysql\n+    volumeClaimTemplates:\n+      - metadata:\n+          name: mysql-persistent-storage\n+        spec:\n+          accessModes: [ \"ReadWriteOnce\" ]\n+          resources:\n+            requests:\n+              storage: 250Gi\n+ ---\n+ apiVersion: v1\n+ kind: Service\n+ metadata:\n+   name: wordpress-webserver-svc\n+   labels:\n+     app: wordpress\n+     component: wordpress-webserver-svc\n+ spec:\n+   ports:\n+     - port: 80\n+   selector:\n+     app: wordpress\n+     component: wordpress-webserver\n+   type: LoadBalancer\n+ ---\n+ apiVersion: v1\n+ kind: Service\n+ metadata:\n+   name: wordpress-webserver-hsvc\n+   labels:\n+     app: wordpress\n+     component: wordpress-webserver-hsvc\n+ spec:\n+   ports:\n+     - port: 3306\n+   selector:\n+     app: wordpress\n+     component: wordpress-webserver\n+   clusterIP: None\n+ ---\n+ apiVersion: apps/v1\n+ kind: StatefulSet\n+ metadata:\n+   name: wordpress\n+   labels:\n+     app: wordpress\n+     component: wordpress-webserver\n+ spec:\n+   replicas: 1\n+   service: wordpress-webserver-hsvc\n+   selector:\n+     matchLabels:\n+       app: wordpress\n+       component: wordpress-webserver\n+   template:\n+     metadata:\n+       labels:\n+         app: wordpress\n+         tier: frontend\n+     spec:\n+       containers:\n+       - image: wordpress:4.8-apache\n+         name: wordpress\n+         env:\n+         - name: WORDPRESS_DB_HOST\n+           value: wordpress-mysql\n+         - name: WORDPRESS_DB_PASSWORD\n+           valueFrom:\n+             secretKeyRef:\n+               name: mysql-pass\n+               key: password\n+         ports:\n+         - containerPort: 80\n+           name: wordpress\n+         volumeMounts:\n+         - name: wordpress-persistent-storage\n+           mountPath: /var/www/html\n+   volumeClaimTemplates:\n+        - metadata:\n+            name: mysql-persistent-storage\n+          spec:\n+            accessModes: [ \"ReadWriteOnce\" ]\n+            resources:\n+              requests:\n+                storage: 250Gi\n+ ```\n+ \n+From an infrastructure management perspective, the manifest above encapsulates everything that is necessary to create \n+the workloads and services that compose our WordPress CMS application. However, the fact that these workloads comprise \n+an application is lost in translation during creation. Once these manifests are applied, there is no default way \n+for users to reconstruct the fact that the whole is more than the sum of its parts.\n+ \n+When UIs, either command line or graphical, seek to interact with the application, they can only interact with its \n+components, and there is no standard way to indicate that those components comprise an application. As previously \n+mentioned, Many tools in the ecosystem attempt to aggregate the components of an application using labels and/or \n+annotations, but, as each tool uses a different scheme, an application created by one tool is generally not recognizable \n+by another, and UI designers have no standard way to recognize and display an application created by any tool.\n+\n+Moreover, their is no way to determine if the application is healthy. Even if a UI is able to determine the components \n+and dependencies of the application, and even if it is able to determine that the individual components are healthy \n+(e.g All Services are created and all Deployments are fully replicated), this does not necessarily imply that the \n+application as a whole is able to service requests.\n+\n+### Goals\n+\n+1. Provide a standard API for creating, viewing, and managing applications in Kubernetes.\n+1. Provide a CLI implementation, via kubectl, that interacts with the Application API.\n+1. Provide installation status and garbage collection for applications.\n+1. Provide a standard way for applications to surface a basic health check to the UIs.\n+1. Provide an explicit mechanism for applications to declare dependencies on another application.\n+1. Promote interoperability among ecosystem tools and UIs by creating a standard that tools MAY implement.\n+\n+### Non-Goals\n+\n+1. Create a standard that all tools MUST implement. \n+1. Provide a way for UIs to surface metrics from an application.\n+1. Provide a method for the arbitrary aggregation of Kubernetes objects that do not comprise an Application.\n+\n+## Proposal\n+In order to address the issues discussed in the [previous section](#motivation) we will introduce the Application Kind \n+to as a CRD extension the Kubernetes API, add the Application Controller to the Controller Manager, and modify \n+kubectl to make use the of the Application Kind.\n+\n+### User Stories\n+\n+#### Application Creation\n+As an application maintainer or tool developer, I can create an application that is interoperable with other tools and \n+has first class support in Kuberentes UIs.\n+\n+#### Application View\n+As an application user or UI designer, I have a standard way to view the components and status of Kubernetes \n+applications.\n+\n+#### Application Health\n+As an application developer, I can surface a basic health check for UIs to consume, and, as a UI developer, I have a \n+standard way to consume application level health checks.\n+\n+#### Application Update\n+As an application developer, maintainer, or administrator, I can update the configuration of my application.\n+\n+#### Application List\n+As an application developer, maintainer or administrator, I can list the applications that are currently installed.\n+\n+#### Application Watch\n+As an application developer, maintainer or administrator, I can watch the applications in a cluster for changes.\n+\n+#### Application Deletion\n+As a user, I can delete my application, and when I delete my Application, its corresponding components are deleted.\n+\n+### Implementation\n+This section describes the implementation of the feature, including the API, the associated controller, and the CLI \n+and UI interaction.\n+\n+### API\n+The go code below describes the Application CRD. \n+\n+```go\n+\n+// ApplicationStatus contains the status of an Application. \n+type ApplicationStatus struct {\n+    // ObservedGeneration is used by the Application Controller to report the last Generation of an Application \n+    // that it has observed.\n+    ObservedGeneration int64 `json:\"observedGeneration,omitempty\" protobuf:\"int64,1,opt,name=observedGeneration\"`\n+    \n+    // Installed is used by the Application Controller to report the installed Components and Dependencies of  \n+    // an Application.\n+    Installed []string `json:\"installed,omitempty\" protobuf:\"bytes,2,opt,name=installed\"`\n+    \n+    // Ready is used to report the readiness of an Application. If an Application contains an ApplicationHealthCheck, \n+    // this field corresponds directly to the Readiness of the Pod generated from that health check. If the \n+    // Application does not contain an ApplicationHealthCheck, this field is set to Unknown.\n+    Ready ConditionStatus json:`\"ready,omitempty\" protobuf:\"bytes,3,opt,name=ready\"`\n+}\n+\n+// ApplicationSpec is the specification object for an Application. It specifies the Application's components, \n+// dependencies, and an optional health check. Application components can be retrieved using the Applications \n+// spec.selector to select the resources that match from the components GroupKind at the client's desired version.\n+type ApplicationSpec struct {\n+    // Type is the type of the application (e.g. WordPress, MySQL, Cassandra).\n+    Type string `json:\"type\" protobuf:\"bytes,1,name=type\"`\n+    \n+    // Components is a map of the applications components to the kinds created by the application (e.g. Pods, Services, \n+    // Deployments, CRDS, etc). The keys of the Components map are the identifiers of the components. These may not \n+    // be the names of the components. For example, two instances of an Application of the same type may use components \n+    // with same identifier key, but the names of the components must differ in order to ensure uniqueness in the \n+    // namespace. The values in the Components map are corresponding GroupKinds of the Application's components. These \n+    // may be used, in conjunction with the Selector, to retrieve an Application's components at the client's desired \n+    // version.\n+    Components map [string]metav1.GroupKind `json:\"components,omitempty\" protobuf:\"bytes,2,opt,name=components\"`\n+    \n+    // Dependencies is a list of other Applications that this Application depends on.\n+    Dependencies []sting `json:\"dependencies\" protobuf:\"bytes,3,opt,name=dependencies\"`\n+    \n+    // Selector is a label query over kinds that created by the application. It must match the component objects' labels.\n+    // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors\n+    Selector *metav1.LabelSelector `json:\"selector\" protobuf:\"bytes,4,opt,name=selector\"`\n+    \n+    // HealthCheck is the name of an optional Deployment that provides the health status of the Application. When the \n+    // Deployment is healthy, the application is considered to be healthy.\n+    HealthCheckDeployment string `json:\"healthCheck\" protobuf:\"bytes,5,opt,name=healthCheck\"`\n+    \n+    // Version is an optional version indicator for the application.\n+    Version string `json:\"version,omitempty\" protobuf:\"bytes,6,opt,name=version\"`\n+    \n+    // Description is a brief string description of the application. \n+    Description string `json:\"description,omitempty\" protobuf:\"bytes,7,opt,name=description\"`","path":"keps/sig-apps/0003-kubernetes-application-api.md","position":365,"original_position":365,"commit_id":"8cb87419883197032f4e5cce8d5518c9c5792f6c","original_commit_id":"8cb87419883197032f4e5cce8d5518c9c5792f6c","user":{"login":"deustis","id":11576027,"avatar_url":"https://avatars2.githubusercontent.com/u/11576027?v=4","gravatar_id":"","url":"https://api.github.com/users/deustis","html_url":"https://github.com/deustis","followers_url":"https://api.github.com/users/deustis/followers","following_url":"https://api.github.com/users/deustis/following{/other_user}","gists_url":"https://api.github.com/users/deustis/gists{/gist_id}","starred_url":"https://api.github.com/users/deustis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deustis/subscriptions","organizations_url":"https://api.github.com/users/deustis/orgs","repos_url":"https://api.github.com/users/deustis/repos","events_url":"https://api.github.com/users/deustis/events{/privacy}","received_events_url":"https://api.github.com/users/deustis/received_events","type":"User","site_admin":false},"body":"Many of the fields in ApplicationSpec are intended to be human-readable strings. Consider grouping them under one object (e.g \"Descriptor\").\r\n\r\nI think this would clarify the purpose of these fields, particularly for users who are only seeing the API object and not the \"human readable\" comments in this spec.","created_at":"2018-02-23T00:39:26Z","updated_at":"2018-02-23T00:39:43Z","html_url":"https://github.com/kubernetes/community/pull/1629#discussion_r170137363","pull_request_url":"https://api.github.com/repos/kubernetes/community/pulls/1629","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/community/pulls/comments/170137363"},"html":{"href":"https://github.com/kubernetes/community/pull/1629#discussion_r170137363"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/community/pulls/1629"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/community/pulls/1629","id":163992196,"html_url":"https://github.com/kubernetes/community/pull/1629","diff_url":"https://github.com/kubernetes/community/pull/1629.diff","patch_url":"https://github.com/kubernetes/community/pull/1629.patch","issue_url":"https://api.github.com/repos/kubernetes/community/issues/1629","number":1629,"state":"open","locked":false,"title":"Initial commit of Kubernetes Application proposal KEP","user":{"login":"kow3ns","id":11380896,"avatar_url":"https://avatars3.githubusercontent.com/u/11380896?v=4","gravatar_id":"","url":"https://api.github.com/users/kow3ns","html_url":"https://github.com/kow3ns","followers_url":"https://api.github.com/users/kow3ns/followers","following_url":"https://api.github.com/users/kow3ns/following{/other_user}","gists_url":"https://api.github.com/users/kow3ns/gists{/gist_id}","starred_url":"https://api.github.com/users/kow3ns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kow3ns/subscriptions","organizations_url":"https://api.github.com/users/kow3ns/orgs","repos_url":"https://api.github.com/users/kow3ns/repos","events_url":"https://api.github.com/users/kow3ns/events{/privacy}","received_events_url":"https://api.github.com/users/kow3ns/received_events","type":"User","site_admin":false},"body":"This KEP proposed the addition of an Application object to the Kubernetes apps Group.","created_at":"2018-01-19T15:09:02Z","updated_at":"2018-02-23T00:39:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1bf1838afd8766b8c6d9da96b49602176942b554","assignee":null,"assignees":[],"requested_reviewers":[{"login":"michelleN","id":1497123,"avatar_url":"https://avatars0.githubusercontent.com/u/1497123?v=4","gravatar_id":"","url":"https://api.github.com/users/michelleN","html_url":"https://github.com/michelleN","followers_url":"https://api.github.com/users/michelleN/followers","following_url":"https://api.github.com/users/michelleN/following{/other_user}","gists_url":"https://api.github.com/users/michelleN/gists{/gist_id}","starred_url":"https://api.github.com/users/michelleN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michelleN/subscriptions","organizations_url":"https://api.github.com/users/michelleN/orgs","repos_url":"https://api.github.com/users/michelleN/repos","events_url":"https://api.github.com/users/michelleN/events{/privacy}","received_events_url":"https://api.github.com/users/michelleN/received_events","type":"User","site_admin":false},{"login":"nikhita","id":16105680,"avatar_url":"https://avatars1.githubusercontent.com/u/16105680?v=4","gravatar_id":"","url":"https://api.github.com/users/nikhita","html_url":"https://github.com/nikhita","followers_url":"https://api.github.com/users/nikhita/followers","following_url":"https://api.github.com/users/nikhita/following{/other_user}","gists_url":"https://api.github.com/users/nikhita/gists{/gist_id}","starred_url":"https://api.github.com/users/nikhita/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nikhita/subscriptions","organizations_url":"https://api.github.com/users/nikhita/orgs","repos_url":"https://api.github.com/users/nikhita/repos","events_url":"https://api.github.com/users/nikhita/events{/privacy}","received_events_url":"https://api.github.com/users/nikhita/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":653942629,"url":"https://api.github.com/repos/kubernetes/community/labels/approved","name":"approved","color":"0ffa16","default":false},{"id":486032367,"url":"https://api.github.com/repos/kubernetes/community/labels/cncf-cla:%20yes","name":"cncf-cla: yes","color":"bfe5bf","default":false},{"id":653942862,"url":"https://api.github.com/repos/kubernetes/community/labels/sig/apps","name":"sig/apps","color":"d2b48c","default":false},{"id":653942863,"url":"https://api.github.com/repos/kubernetes/community/labels/sig/architecture","name":"sig/architecture","color":"d2b48c","default":false},{"id":653942922,"url":"https://api.github.com/repos/kubernetes/community/labels/size/XXL","name":"size/XXL","color":"ee0000","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/community/pulls/1629/commits","review_comments_url":"https://api.github.com/repos/kubernetes/community/pulls/1629/comments","review_comment_url":"https://api.github.com/repos/kubernetes/community/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/community/issues/1629/comments","statuses_url":"https://api.github.com/repos/kubernetes/community/statuses/8cb87419883197032f4e5cce8d5518c9c5792f6c","head":{"label":"kow3ns:k8s-app","ref":"k8s-app","sha":"8cb87419883197032f4e5cce8d5518c9c5792f6c","user":{"login":"kow3ns","id":11380896,"avatar_url":"https://avatars3.githubusercontent.com/u/11380896?v=4","gravatar_id":"","url":"https://api.github.com/users/kow3ns","html_url":"https://github.com/kow3ns","followers_url":"https://api.github.com/users/kow3ns/followers","following_url":"https://api.github.com/users/kow3ns/following{/other_user}","gists_url":"https://api.github.com/users/kow3ns/gists{/gist_id}","starred_url":"https://api.github.com/users/kow3ns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kow3ns/subscriptions","organizations_url":"https://api.github.com/users/kow3ns/orgs","repos_url":"https://api.github.com/users/kow3ns/repos","events_url":"https://api.github.com/users/kow3ns/events{/privacy}","received_events_url":"https://api.github.com/users/kow3ns/received_events","type":"User","site_admin":false},"repo":{"id":82978956,"name":"community","full_name":"kow3ns/community","owner":{"login":"kow3ns","id":11380896,"avatar_url":"https://avatars3.githubusercontent.com/u/11380896?v=4","gravatar_id":"","url":"https://api.github.com/users/kow3ns","html_url":"https://github.com/kow3ns","followers_url":"https://api.github.com/users/kow3ns/followers","following_url":"https://api.github.com/users/kow3ns/following{/other_user}","gists_url":"https://api.github.com/users/kow3ns/gists{/gist_id}","starred_url":"https://api.github.com/users/kow3ns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kow3ns/subscriptions","organizations_url":"https://api.github.com/users/kow3ns/orgs","repos_url":"https://api.github.com/users/kow3ns/repos","events_url":"https://api.github.com/users/kow3ns/events{/privacy}","received_events_url":"https://api.github.com/users/kow3ns/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kow3ns/community","description":"Kubernetes community content","fork":true,"url":"https://api.github.com/repos/kow3ns/community","forks_url":"https://api.github.com/repos/kow3ns/community/forks","keys_url":"https://api.github.com/repos/kow3ns/community/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kow3ns/community/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kow3ns/community/teams","hooks_url":"https://api.github.com/repos/kow3ns/community/hooks","issue_events_url":"https://api.github.com/repos/kow3ns/community/issues/events{/number}","events_url":"https://api.github.com/repos/kow3ns/community/events","assignees_url":"https://api.github.com/repos/kow3ns/community/assignees{/user}","branches_url":"https://api.github.com/repos/kow3ns/community/branches{/branch}","tags_url":"https://api.github.com/repos/kow3ns/community/tags","blobs_url":"https://api.github.com/repos/kow3ns/community/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kow3ns/community/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kow3ns/community/git/refs{/sha}","trees_url":"https://api.github.com/repos/kow3ns/community/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kow3ns/community/statuses/{sha}","languages_url":"https://api.github.com/repos/kow3ns/community/languages","stargazers_url":"https://api.github.com/repos/kow3ns/community/stargazers","contributors_url":"https://api.github.com/repos/kow3ns/community/contributors","subscribers_url":"https://api.github.com/repos/kow3ns/community/subscribers","subscription_url":"https://api.github.com/repos/kow3ns/community/subscription","commits_url":"https://api.github.com/repos/kow3ns/community/commits{/sha}","git_commits_url":"https://api.github.com/repos/kow3ns/community/git/commits{/sha}","comments_url":"https://api.github.com/repos/kow3ns/community/comments{/number}","issue_comment_url":"https://api.github.com/repos/kow3ns/community/issues/comments{/number}","contents_url":"https://api.github.com/repos/kow3ns/community/contents/{+path}","compare_url":"https://api.github.com/repos/kow3ns/community/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kow3ns/community/merges","archive_url":"https://api.github.com/repos/kow3ns/community/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kow3ns/community/downloads","issues_url":"https://api.github.com/repos/kow3ns/community/issues{/number}","pulls_url":"https://api.github.com/repos/kow3ns/community/pulls{/number}","milestones_url":"https://api.github.com/repos/kow3ns/community/milestones{/number}","notifications_url":"https://api.github.com/repos/kow3ns/community/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kow3ns/community/labels{/name}","releases_url":"https://api.github.com/repos/kow3ns/community/releases{/id}","deployments_url":"https://api.github.com/repos/kow3ns/community/deployments","created_at":"2017-02-23T22:48:22Z","updated_at":"2017-05-24T15:51:18Z","pushed_at":"2018-02-09T01:10:00Z","git_url":"git://github.com/kow3ns/community.git","ssh_url":"git@github.com:kow3ns/community.git","clone_url":"https://github.com/kow3ns/community.git","svn_url":"https://github.com/kow3ns/community","homepage":"","size":18806,"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":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"c7c08474fd274be6e9ff6d8a15715af2e452220a","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":57939112,"name":"community","full_name":"kubernetes/community","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/community","description":"Kubernetes community content","fork":false,"url":"https://api.github.com/repos/kubernetes/community","forks_url":"https://api.github.com/repos/kubernetes/community/forks","keys_url":"https://api.github.com/repos/kubernetes/community/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/community/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/community/teams","hooks_url":"https://api.github.com/repos/kubernetes/community/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/community/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/community/events","assignees_url":"https://api.github.com/repos/kubernetes/community/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/community/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/community/tags","blobs_url":"https://api.github.com/repos/kubernetes/community/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/community/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/community/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/community/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/community/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/community/languages","stargazers_url":"https://api.github.com/repos/kubernetes/community/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/community/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/community/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/community/subscription","commits_url":"https://api.github.com/repos/kubernetes/community/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/community/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/community/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/community/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/community/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/community/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/community/merges","archive_url":"https://api.github.com/repos/kubernetes/community/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/community/downloads","issues_url":"https://api.github.com/repos/kubernetes/community/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/community/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/community/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/community/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/community/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/community/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/community/deployments","created_at":"2016-05-03T03:36:05Z","updated_at":"2018-02-22T22:31:28Z","pushed_at":"2018-02-23T00:38:46Z","git_url":"git://github.com/kubernetes/community.git","ssh_url":"git@github.com:kubernetes/community.git","clone_url":"https://github.com/kubernetes/community.git","svn_url":"https://github.com/kubernetes/community","homepage":"","size":19732,"stargazers_count":1416,"watchers_count":1416,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":947,"mirror_url":null,"archived":false,"open_issues_count":180,"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":947,"open_issues":180,"watchers":1416,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/community/pulls/1629"},"html":{"href":"https://github.com/kubernetes/community/pull/1629"},"issue":{"href":"https://api.github.com/repos/kubernetes/community/issues/1629"},"comments":{"href":"https://api.github.com/repos/kubernetes/community/issues/1629/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/community/pulls/1629/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/community/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/community/pulls/1629/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/community/statuses/8cb87419883197032f4e5cce8d5518c9c5792f6c"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"deustis"}}