{"action":"created","comment":{"url":"https://api.github.com/repos/gardener/gardener/pulls/comments/219708342","pull_request_review_id":157948633,"id":219708342,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxOTcwODM0Mg==","diff_hunk":"@@ -0,0 +1,844 @@\n+# Gardener extensibility and extraction of cloud-specific/OS-specific knowledge ([#308](https://github.com/gardener/gardener/issues/308), [#262](https://github.com/gardener/gardener/issues/262))\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+    * [Modification of existing `CloudProfile` and `Shoot` resources](#modification-of-existing-cloudprofile-and-shoot-resources)\n+        * [CloudProfiles](#cloudprofiles)\n+        * [Shoots](#shoots)\n+    * [CRD definitions and workflow adaptation](#crd-definitions-and-workflow-adaptation)\n+        * [Custom resource definitions](#custom-resource-definitions)\n+            * [DNS records](#dns-records)\n+            * [Infrastructure provisioning](#infrastructure-provisioning)\n+            * [Backup infrastructure provisioning](#backup-infrastructure-provisioning)\n+            * [Cloud config (user-data) for bootstrapping machines](#cloud-config-user-data-for-bootstrapping-machines)\n+            * [Worker pools definition](#worker-pools-definition)\n+        * [Shoot state](#shoot-state)\n+        * [Shoot health checks/conditions](#shoot-health-checksconditions)\n+        * [Reconciliation flow](#reconciliation-flow)\n+        * [Deletion flow](#deletion-flow)\n+    * [Shoot control plane movement/migration](#shoot-control-plane-movementmigration)\n+* [Registration of external controllers at Gardener](#registration-of-external-controllers-at-gardener)\n+    * [Operator-based approach](#operator-based-approach)\n+    * [Helm Chart-based approach](#helm-chart-based-approach)\n+* [Alternatives](#alternatives)\n+\n+## Summary\n+\n+Gardener has evolved to a large compound of packages containing lots of highly specific knowledge which makes it very hard to extend (supporting a new cloud provider, new OS, ..., or behave differently depending on the underlying infrastructure).\n+\n+This proposal aims to move out the cloud-specific implementations (called \"(cloud) botanists\") and the OS-specifics into dedicated controllers, and simultaneously to allow deviation from the standard Gardener deployment.\n+\n+## Motivation\n+\n+Currently, it is too hard to support additional cloud providers or operation systems as everything must be done in-tree which might effect the implementation of other cloud providers as well.\n+The various conditions and branches make the code hard to maintain and hard to test.\n+Every change must be done centrally, requires to completely rebuild Gardener, and cannot be deployed individually. Similar to the motivation for Kubernetes to extract their cloud-specifics into dedicated cloud-controller-managers or to extract the container/storage/network/... specifics into CRI/CSI/CNI/..., we aim to do the same right now.\n+\n+### Goals\n+\n+* Gardener does not contain any cloud-specific knowledge anymore but defines a clear contract allowing external controllers (botanists) to support different environments (AWS, Azure, GCP, ...).\n+* Gardener does not contain any operation system-specific knowledge anymore but defines a clear contract allowing external controllers to support different operation systems (CoreOS, SLES, Ubuntu, ...).\n+* It shall become much easier to move control planes of Shoot clusters between Seed clusters ([#232](https://github.com/gardener/gardener/issues/232)) which is a necessary requirement of an automated setup for the Gardener Ring ([#233](https://github.com/gardener/gardener/issues/233)).\n+\n+### Non-Goals\n+\n+* We want to also factor out the specific knowledge of the addon deployments (nginx-ingress, kubernetes-dashboard, ...), but we already have dedicated projects/issues for that: https://github.com/gardener/bouquet and [#246](https://github.com/gardener/gardener/issues/246). We will keep the addons in-tree as part of this proposal and tackle their extraction separately.\n+* We do not want to make the Gardener a plain workflow engine that just executes a given template (which indeed would allow to be generic, open, and extensible in their highest forms but which would end-up in building a \"programming/scripting language\" inside a serialization format (YAML/JSON/...)). Rather, we want to have well-defined contracts and APIs.\n+\n+## Proposal\n+\n+Gardener heavily relies on and implements Kubernetes principles, and its first goal is to use Kubernetes wherever applicable.\n+The extension concept in Kubernetes embraces (next to others) `CustomResourceDefinition`s as well as `ValidatingWebhookConfiguration`s and `MutatingWebhookConfiguration`s.\n+Consequently, Gardener's extensibility concept relies on these mechanisms.\n+\n+Instead of doing everything on its own, Gardener will deploy a bunch of CRDs to the Seed cluster which will be watched by dedicated controllers only containing the specific knowledge of their function area.\n+Gardener will just wait until the controllers report that they are done (or have faced an error) in the CRD's `.status` field instead of doing the respective tasks itself.\n+We will have one specific CRD for every specific operation (e.g., DNS, infrastructure provisioning, machine cloud config generation, ...).\n+However, there are also parts inside Gardener which are handled generally (not by cloud botanists) because they are the same or very similar for all the environments.\n+One example of those is the deployment of a `Namespace` in the Seed which will run the Shoot's control plane\n+Another one is the deployment of a `Service` for the Shoot's kube-apiserver.\n+In case a cloud botanist needs to interfere and react on those operations it should register a `ValidatingWebhookConfiguration` or a `MutatingWebhookConfiguration`.\n+With this approach it can validate or modify any resource created by Gardener to make it cloud specific.\n+\n+### Modification of existing `CloudProfile` and `Shoot` resources\n+\n+We will introduce the new API group `gardener.cloud`:\n+\n+#### CloudProfiles\n+\n+```yaml\n+---\n+apiVersion: gardener.cloud/v1alpha1\n+kind: CloudProfile\n+metadata:\n+  name: aws\n+spec:\n+# caBundle: |\n+#   -----BEGIN CERTIFICATE-----\n+#   ...\n+#   -----END CERTIFICATE-----\n+  dnsProviders:\n+  - type: aws-route53\n+  - type: unmanaged\n+  kubernetes:\n+    versions:\n+    - 1.11.0\n+    - 1.10.5\n+    - 1.9.8\n+  cloud:\n+    type: aws\n+    providerConfig:\n+      apiVersion: aws.cloud.gardener.cloud/v1alpha1\n+      kind: CloudProfileConfig\n+      constraints:\n+        machineImages:\n+        - name: CoreOS\n+          regions:\n+          - name: eu-west-1\n+            ami: ami-32d1474b\n+          - name: us-east-1\n+            ami: ami-e582d29f\n+        machineTypes:\n+        - name: m4.large\n+          cpu: \"2\"\n+          gpu: \"0\"\n+          memory: 8Gi\n+        - name: m4.xlarge\n+          cpu: \"4\"\n+          gpu: \"0\"\n+          memory: 16Gi\n+        - name: m4.2xlarge\n+          cpu: \"8\"\n+          gpu: \"0\"\n+          memory: 32Gi\n+        - name: m4.4xlarge\n+          cpu: \"16\"\n+          gpu: \"0\"\n+          memory: 64Gi\n+        - name: m4.10xlarge\n+          cpu: \"40\"\n+          gpu: \"0\"\n+          memory: 160Gi\n+        - name: m4.16xlarge\n+          cpu: \"64\"\n+          gpu: \"0\"\n+          memory: 256Gi\n+        - name: p2.xlarge\n+          cpu: \"4\"\n+          gpu: \"1\"\n+          memory: 61Gi\n+        - name: p2.8xlarge\n+          cpu: \"32\"\n+          gpu: \"8\"\n+          memory: 488Gi\n+        - name: p2.16xlarge\n+          cpu: \"64\"\n+          gpu: \"16\"\n+          memory: 732Gi\n+        volumeTypes:\n+        - name: gp2\n+          class: standard\n+        - name: io1\n+          class: premium\n+        zones:\n+        - region: eu-west-1\n+          names:\n+          - eu-west-1a\n+          - eu-west-1b\n+          - eu-west-1c\n+        - region: us-east-1\n+          names:\n+          - us-east-1a\n+          - us-east-1b\n+          - us-east-1c\n+```\n+\n+#### Shoots\n+\n+```yaml\n+apiVersion: gardener.cloud/v1alpha1\n+kind: Shoot\n+metadata:\n+  name: johndoe-aws\n+  namespace: garden-dev\n+spec:\n+  cloud:\n+    type: aws\n+    profile: aws\n+    region: eu-west-1\n+    secretBindingRef:\n+      name: core-aws\n+    providerConfig:\n+      apiVersion: aws.cloud.gardener.cloud/v1alpha1\n+      kind: InfrastructureConfig\n+      networks:\n+        vpc: # specify either 'id' or 'cidr'\n+        # id: vpc-123456\n+          cidr: 10.250.0.0/16\n+        internal:\n+        - 10.250.112.0/22\n+        public:\n+        - 10.250.96.0/22\n+        workers:\n+        - 10.250.0.0/19\n+      zones:\n+      - eu-west-1a\n+    workerPools:\n+    - name: pool-01\n+      osType: CoreOS\n+      autoScalerMin: 2\n+      autoScalerMax: 2\n+      providerConfig:\n+        apiVersion: aws.cloud.gardener.cloud/v1alpha1\n+        kind: WorkerPoolConfig\n+        ami: ami-d0dcef3b\n+        machineType: m4.large\n+        volumeType: gp2\n+        volumeSize: 20Gi\n+        zones:\n+        - eu-west-1a\n+  kubernetes:\n+    version: 1.11.0\n+    ...\n+  dns:\n+    provider: aws-route53\n+    domain: johndoe-aws.garden-dev.example.com\n+  maintenance:\n+    timeWindow:\n+      begin: 220000+0100\n+      end: 230000+0100\n+    autoUpdate:\n+      kubernetesVersion: true\n+  backup:\n+    schedule: \"*/5 * * * *\"\n+    maximum: 7\n+  addons:\n+    kube2iam:\n+      enabled: false\n+    kubernetes-dashboard:\n+      enabled: true\n+    cluster-autoscaler:\n+      enabled: true\n+    nginx-ingress:\n+      enabled: true\n+      loadBalancerSourceRanges: []\n+    kube-lego:\n+      enabled: true\n+      email: john.doe@example.com\n+    monocular:\n+      enabled: false\n+```\n+\n+:information: The specifications for the other already existing cloud providers looks similar.\n+\n+### CRD definitions and workflow adaptation\n+\n+In the following we are outlying the CRD definitions which will be one part of the contract between Gardener and the dedicated controllers.\n+After that we will take a look at the current [reconciliation](https://github.com/gardener/gardener/blob/master/pkg/controller/shoot/shoot_control_reconcile.go)/[deletion](https://github.com/gardener/gardener/blob/master/pkg/controller/shoot/shoot_control_delete.go) flow and describe how it would look like in case we would implement this proposal.\n+\n+#### Custom resource definitions\n+\n+Every CRD has a `.spec.type` field containing the respective instance of the dimension the CRD represents, e.g. the cloud provider, the DNS provider or the operation system name.\n+Moreover, the `.status` field must contain\n+\n+* `observedGeneration` (`int`), a field indicating on which generation the controller last worked on.\n+* `state` (`*runtime.RawExtension`), a field which is not interpreted by Gardener but persisted; it should be treated opaque and only be used by the respective CRD-specific controller (it can store anything it needs to re-construct its own state).\n+* `lastError` (`object`), a field which is optional and only present if the last operation ended with an error state.\n+* `lastOperation` (`object`), a field which always exists and which indicates what the last operation of the controller was.\n+* `conditions` (`list`), a field allowing the controller to report health checks for its area of responsibility.\n+\n+Some CRDs might have a `.spec.providerConfig` or a `.status.providerStatus` field containing controller-specific information that is treated opaque by Gardener and will only be copied to dependent or depending CRDs.\n+\n+##### DNS records\n+\n+Every Shoot needs two DNS records (or three, depending on whether nginx-ingress addon is enabled), one so-called \"internal\" record that Gardener uses in the kubeconfigs of the Shoot cluster's system components, and one so-called \"external\" record which is used in the kubeconfig handed out to the user.\n+\n+```yaml\n+---\n+apiVersion: extensions.gardener.cloud/v1alpha1\n+kind: DNS\n+metadata:\n+  name: api-server\n+  namespace: shoot--core--aws-01\n+spec:\n+  type: aws-route53\n+  dnsType: A # optional, will be determined automatically if not specified\n+  domain: api.johndoe-aws.garden-dev.example.com\n+  target: 127.0.0.1\n+  hostedZoneID: AH7231HCZ82\n+  secretRef:\n+    name: secret-containing-the-route53-credentials\n+status:\n+  observedGeneration: 4\n+  state: some-state\n+  lastError:\n+    lastUpdateTime: 2018-04-04T07:08:51Z\n+    description: some-error message\n+    codes:\n+    - ERR_UNAUTHORIZED\n+  lastOperation:\n+    lastUpdateTime: 2018-04-04T07:24:51Z\n+    progress: 70\n+    type: Reconcile\n+    state: Processing\n+    description: Currently provisioning ...\n+  conditions:\n+  - lastTransitionTime: 2018-07-11T10:18:25Z\n+    message: DNS record has been created and is available.\n+    reason: RecordResolvable\n+    status: \"True\"\n+    type: Available\n+  providerStatus:\n+    apiVersion: aws.extensions.gardener.cloud/v1alpha1\n+    kind: DNSStatus\n+    ...\n+```\n+\n+##### Infrastructure provisioning\n+\n+The infrastructure contains the information about VPC, networks, security groups, availability zones, ..., basically, everything that needs to be prepared before actual VMs/load balancers/... can be provisioned.\n+\n+```yaml\n+---\n+apiVersion: extensions.gardener.cloud/v1alpha1\n+kind: Infrastructure\n+metadata:\n+  name: infrastructure\n+  namespace: shoot--core--aws-01\n+spec:\n+  type: aws\n+  providerConfig:\n+    apiVersion: aws.extensions.gardener.cloud/v1alpha1\n+    kind: InfrastructureConfig\n+    networks:\n+      vpc:\n+        cidr: 10.250.0.0/16\n+      internal:\n+      - 10.250.112.0/22\n+      public:\n+      - 10.250.96.0/22\n+      workers:\n+      - 10.250.0.0/19\n+    zones:\n+    - eu-west-1a\n+  dns:\n+    apiserver: api.aws-01.core.example.com\n+  region: eu-west-1\n+  secretRef:\n+    name: my-aws-credentials\n+  sshPublicKey: |\n+    base64(key)\n+status:\n+  observedGeneration: ...\n+  state: ...\n+  lastError: ..\n+  lastOperation: ...\n+  providerStatus:\n+    apiVersion: aws.extensions.gardener.cloud/v1alpha1\n+    kind: InfrastructureStatus\n+    vpc:\n+      id: vpc-1234\n+      subnets:\n+      - id: subnet-acbd1234\n+        name: workers\n+        zone: eu-west-1\n+      securityGroups:\n+      - id: sg-xyz12345\n+        name: workers\n+    iam:\n+      nodesRoleARN: <some-arn>\n+      instanceProfileName: foo\n+    ec2:\n+      keyName: bar\n+```\n+\n+##### Backup infrastructure provisioning\n+\n+The `BackupInfrastructure` CRD in the Seeds tells the cloud-specific controller to prepare a blob store bucket/container which can later be used to store etcd backups.\n+\n+```yaml\n+---\n+apiVersion: extensions.gardener.cloud/v1alpha1\n+kind: BackupInfrastructure\n+metadata:\n+  name: etcd-backup\n+  namespace: shoot--core--aws-01\n+spec:\n+  type: aws\n+  region: eu-west-1\n+  storageContainerName: asdasjndasd-1293912378a-2213\n+  secretRef:\n+    name: my-aws-credentials\n+status:\n+  observedGeneration: ...\n+  state: ...\n+  lastError: ..\n+  lastOperation: ...\n+```\n+\n+##### Cloud config (user-data) for bootstrapping machines\n+\n+Gardener keeps keeping knowledge about the content of the cloud config scripts, but it will hand over it to the respective OS-specific controller which will generate the specific valid representation.\n+Gardener creates two `MachineCloudConfig` CRDs, one for the cloud-config-downloader (which will later flow into the `WorkerPool` CRD) and one for the real cloud-config (which will be stored as a `Secret` in the Shoot's `kube-system` namespace, and downloaded and executed from the cloud-config-downloader on the machines).\n+\n+```yaml\n+---\n+apiVersion: extensions.gardener.cloud/v1alpha1\n+kind: MachineCloudConfig\n+metadata:\n+  name: pool-01-downloader\n+  namespace: shoot--core--aws-01\n+spec:\n+  type: CoreOS\n+  units:\n+  - name: cloud-config-downloader.service\n+    command: start\n+    enable: true\n+    content: |\n+      [Unit]\n+      Description=Downloads the original cloud-config from Shoot API Server and execute it\n+      After=docker.service docker.socket\n+      Wants=docker.socket\n+      [Service]\n+      Restart=always\n+      RestartSec=30\n+      EnvironmentFile=/etc/environment\n+      ExecStart=/bin/sh /var/lib/cloud-config-downloader/download-cloud-config.sh\n+  files:\n+  - path: /var/lib/cloud-config-downloader/kubeconfig\n+    permissions: 0644\n+    encoding: b64\n+    content: LS0tCmFwaVZlcnNpb2...\n+  - path: /var/lib/cloud-config-downloader/download-cloud-config.sh\n+    permissions: 0644\n+    encoding: b64\n+    content: IyEvYmluL2Jhc2ggL...\n+status:\n+  observedGeneration: ...\n+  state: ...\n+  lastError: ..\n+  lastOperation: ...\n+  cloudConfig: | # base64-encoded\n+    #cloud-config","path":"docs/proposals/01-extensibility.md","position":432,"original_position":428,"commit_id":"2a056c6baf7a7e8f0e71f5275ce0146c22973a9c","original_commit_id":"bf5860a021278af72223cd10e60b951a9652f90f","user":{"login":"rfranzke","id":19169361,"node_id":"MDQ6VXNlcjE5MTY5MzYx","avatar_url":"https://avatars1.githubusercontent.com/u/19169361?v=4","gravatar_id":"","url":"https://api.github.com/users/rfranzke","html_url":"https://github.com/rfranzke","followers_url":"https://api.github.com/users/rfranzke/followers","following_url":"https://api.github.com/users/rfranzke/following{/other_user}","gists_url":"https://api.github.com/users/rfranzke/gists{/gist_id}","starred_url":"https://api.github.com/users/rfranzke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfranzke/subscriptions","organizations_url":"https://api.github.com/users/rfranzke/orgs","repos_url":"https://api.github.com/users/rfranzke/repos","events_url":"https://api.github.com/users/rfranzke/events{/privacy}","received_events_url":"https://api.github.com/users/rfranzke/received_events","type":"User","site_admin":false},"body":"This is how a cloud config file might look like. It might begin with `#cloud-config`.","created_at":"2018-09-23T19:09:57Z","updated_at":"2018-09-23T19:09:57Z","html_url":"https://github.com/gardener/gardener/pull/370#discussion_r219708342","pull_request_url":"https://api.github.com/repos/gardener/gardener/pulls/370","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/gardener/gardener/pulls/comments/219708342"},"html":{"href":"https://github.com/gardener/gardener/pull/370#discussion_r219708342"},"pull_request":{"href":"https://api.github.com/repos/gardener/gardener/pulls/370"}},"in_reply_to_id":218995181},"pull_request":{"url":"https://api.github.com/repos/gardener/gardener/pulls/370","id":216529428,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE2NTI5NDI4","html_url":"https://github.com/gardener/gardener/pull/370","diff_url":"https://github.com/gardener/gardener/pull/370.diff","patch_url":"https://github.com/gardener/gardener/pull/370.patch","issue_url":"https://api.github.com/repos/gardener/gardener/issues/370","number":370,"state":"open","locked":false,"title":"Gardener enhancement proposal (GEP) for Gardener extensibility","user":{"login":"rfranzke","id":19169361,"node_id":"MDQ6VXNlcjE5MTY5MzYx","avatar_url":"https://avatars1.githubusercontent.com/u/19169361?v=4","gravatar_id":"","url":"https://api.github.com/users/rfranzke","html_url":"https://github.com/rfranzke","followers_url":"https://api.github.com/users/rfranzke/followers","following_url":"https://api.github.com/users/rfranzke/following{/other_user}","gists_url":"https://api.github.com/users/rfranzke/gists{/gist_id}","starred_url":"https://api.github.com/users/rfranzke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfranzke/subscriptions","organizations_url":"https://api.github.com/users/rfranzke/orgs","repos_url":"https://api.github.com/users/rfranzke/repos","events_url":"https://api.github.com/users/rfranzke/events{/privacy}","received_events_url":"https://api.github.com/users/rfranzke/received_events","type":"User","site_admin":false},"body":"**What this PR does / why we need it**: Gardener has evolved to a large compound of packages containing lots of highly specific knowledge which makes it very hard to extend (supporting a new cloud provider, new OS, ..., or behave differently depending on the underlying infrastructure). This proposal aims to move out the cloud-specific implementations (called \"(cloud) botanists\") and the OS-specifics into dedicated controllers, and simultaneously to allow deviation from the standard Gardener deployment.\r\n\r\n**Related issue(s) of this PR**:\r\n- #232\r\n- #233\r\n- #246\r\n- #262\r\n- #308\r\n\r\n**Special notes for your reviewer**: NONE\r\n\r\n**Release note**:\r\n```improvement operator\r\nNONE\r\n```\r\n\r\n/cc @bergerx @luisdavim @ThormaehlenFred\r\n","created_at":"2018-09-19T06:41:04Z","updated_at":"2018-09-23T19:09:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"47a1575825c09c5ea275af4cd6529dfe7ede1a46","assignee":null,"assignees":[],"requested_reviewers":[{"login":"mandelsoft","id":553075,"node_id":"MDQ6VXNlcjU1MzA3NQ==","avatar_url":"https://avatars3.githubusercontent.com/u/553075?v=4","gravatar_id":"","url":"https://api.github.com/users/mandelsoft","html_url":"https://github.com/mandelsoft","followers_url":"https://api.github.com/users/mandelsoft/followers","following_url":"https://api.github.com/users/mandelsoft/following{/other_user}","gists_url":"https://api.github.com/users/mandelsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/mandelsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mandelsoft/subscriptions","organizations_url":"https://api.github.com/users/mandelsoft/orgs","repos_url":"https://api.github.com/users/mandelsoft/repos","events_url":"https://api.github.com/users/mandelsoft/events{/privacy}","received_events_url":"https://api.github.com/users/mandelsoft/received_events","type":"User","site_admin":false},{"login":"holgerkoser","id":1574023,"node_id":"MDQ6VXNlcjE1NzQwMjM=","avatar_url":"https://avatars3.githubusercontent.com/u/1574023?v=4","gravatar_id":"","url":"https://api.github.com/users/holgerkoser","html_url":"https://github.com/holgerkoser","followers_url":"https://api.github.com/users/holgerkoser/followers","following_url":"https://api.github.com/users/holgerkoser/following{/other_user}","gists_url":"https://api.github.com/users/holgerkoser/gists{/gist_id}","starred_url":"https://api.github.com/users/holgerkoser/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holgerkoser/subscriptions","organizations_url":"https://api.github.com/users/holgerkoser/orgs","repos_url":"https://api.github.com/users/holgerkoser/repos","events_url":"https://api.github.com/users/holgerkoser/events{/privacy}","received_events_url":"https://api.github.com/users/holgerkoser/received_events","type":"User","site_admin":false},{"login":"afritzler","id":1922939,"node_id":"MDQ6VXNlcjE5MjI5Mzk=","avatar_url":"https://avatars2.githubusercontent.com/u/1922939?v=4","gravatar_id":"","url":"https://api.github.com/users/afritzler","html_url":"https://github.com/afritzler","followers_url":"https://api.github.com/users/afritzler/followers","following_url":"https://api.github.com/users/afritzler/following{/other_user}","gists_url":"https://api.github.com/users/afritzler/gists{/gist_id}","starred_url":"https://api.github.com/users/afritzler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/afritzler/subscriptions","organizations_url":"https://api.github.com/users/afritzler/orgs","repos_url":"https://api.github.com/users/afritzler/repos","events_url":"https://api.github.com/users/afritzler/events{/privacy}","received_events_url":"https://api.github.com/users/afritzler/received_events","type":"User","site_admin":false},{"login":"georgekuruvillak","id":2212423,"node_id":"MDQ6VXNlcjIyMTI0MjM=","avatar_url":"https://avatars1.githubusercontent.com/u/2212423?v=4","gravatar_id":"","url":"https://api.github.com/users/georgekuruvillak","html_url":"https://github.com/georgekuruvillak","followers_url":"https://api.github.com/users/georgekuruvillak/followers","following_url":"https://api.github.com/users/georgekuruvillak/following{/other_user}","gists_url":"https://api.github.com/users/georgekuruvillak/gists{/gist_id}","starred_url":"https://api.github.com/users/georgekuruvillak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/georgekuruvillak/subscriptions","organizations_url":"https://api.github.com/users/georgekuruvillak/orgs","repos_url":"https://api.github.com/users/georgekuruvillak/repos","events_url":"https://api.github.com/users/georgekuruvillak/events{/privacy}","received_events_url":"https://api.github.com/users/georgekuruvillak/received_events","type":"User","site_admin":false},{"login":"PadmaB","id":2491252,"node_id":"MDQ6VXNlcjI0OTEyNTI=","avatar_url":"https://avatars3.githubusercontent.com/u/2491252?v=4","gravatar_id":"","url":"https://api.github.com/users/PadmaB","html_url":"https://github.com/PadmaB","followers_url":"https://api.github.com/users/PadmaB/followers","following_url":"https://api.github.com/users/PadmaB/following{/other_user}","gists_url":"https://api.github.com/users/PadmaB/gists{/gist_id}","starred_url":"https://api.github.com/users/PadmaB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PadmaB/subscriptions","organizations_url":"https://api.github.com/users/PadmaB/orgs","repos_url":"https://api.github.com/users/PadmaB/repos","events_url":"https://api.github.com/users/PadmaB/events{/privacy}","received_events_url":"https://api.github.com/users/PadmaB/received_events","type":"User","site_admin":false},{"login":"Adracus","id":3071681,"node_id":"MDQ6VXNlcjMwNzE2ODE=","avatar_url":"https://avatars2.githubusercontent.com/u/3071681?v=4","gravatar_id":"","url":"https://api.github.com/users/Adracus","html_url":"https://github.com/Adracus","followers_url":"https://api.github.com/users/Adracus/followers","following_url":"https://api.github.com/users/Adracus/following{/other_user}","gists_url":"https://api.github.com/users/Adracus/gists{/gist_id}","starred_url":"https://api.github.com/users/Adracus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Adracus/subscriptions","organizations_url":"https://api.github.com/users/Adracus/orgs","repos_url":"https://api.github.com/users/Adracus/repos","events_url":"https://api.github.com/users/Adracus/events{/privacy}","received_events_url":"https://api.github.com/users/Adracus/received_events","type":"User","site_admin":false},{"login":"zanetworker","id":4193095,"node_id":"MDQ6VXNlcjQxOTMwOTU=","avatar_url":"https://avatars3.githubusercontent.com/u/4193095?v=4","gravatar_id":"","url":"https://api.github.com/users/zanetworker","html_url":"https://github.com/zanetworker","followers_url":"https://api.github.com/users/zanetworker/followers","following_url":"https://api.github.com/users/zanetworker/following{/other_user}","gists_url":"https://api.github.com/users/zanetworker/gists{/gist_id}","starred_url":"https://api.github.com/users/zanetworker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zanetworker/subscriptions","organizations_url":"https://api.github.com/users/zanetworker/orgs","repos_url":"https://api.github.com/users/zanetworker/repos","events_url":"https://api.github.com/users/zanetworker/events{/privacy}","received_events_url":"https://api.github.com/users/zanetworker/received_events","type":"User","site_admin":false},{"login":"dkistner","id":4513134,"node_id":"MDQ6VXNlcjQ1MTMxMzQ=","avatar_url":"https://avatars3.githubusercontent.com/u/4513134?v=4","gravatar_id":"","url":"https://api.github.com/users/dkistner","html_url":"https://github.com/dkistner","followers_url":"https://api.github.com/users/dkistner/followers","following_url":"https://api.github.com/users/dkistner/following{/other_user}","gists_url":"https://api.github.com/users/dkistner/gists{/gist_id}","starred_url":"https://api.github.com/users/dkistner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dkistner/subscriptions","organizations_url":"https://api.github.com/users/dkistner/orgs","repos_url":"https://api.github.com/users/dkistner/repos","events_url":"https://api.github.com/users/dkistner/events{/privacy}","received_events_url":"https://api.github.com/users/dkistner/received_events","type":"User","site_admin":false},{"login":"petersutter","id":5526658,"node_id":"MDQ6VXNlcjU1MjY2NTg=","avatar_url":"https://avatars0.githubusercontent.com/u/5526658?v=4","gravatar_id":"","url":"https://api.github.com/users/petersutter","html_url":"https://github.com/petersutter","followers_url":"https://api.github.com/users/petersutter/followers","following_url":"https://api.github.com/users/petersutter/following{/other_user}","gists_url":"https://api.github.com/users/petersutter/gists{/gist_id}","starred_url":"https://api.github.com/users/petersutter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petersutter/subscriptions","organizations_url":"https://api.github.com/users/petersutter/orgs","repos_url":"https://api.github.com/users/petersutter/repos","events_url":"https://api.github.com/users/petersutter/events{/privacy}","received_events_url":"https://api.github.com/users/petersutter/received_events","type":"User","site_admin":false},{"login":"swapnilgm","id":5590545,"node_id":"MDQ6VXNlcjU1OTA1NDU=","avatar_url":"https://avatars3.githubusercontent.com/u/5590545?v=4","gravatar_id":"","url":"https://api.github.com/users/swapnilgm","html_url":"https://github.com/swapnilgm","followers_url":"https://api.github.com/users/swapnilgm/followers","following_url":"https://api.github.com/users/swapnilgm/following{/other_user}","gists_url":"https://api.github.com/users/swapnilgm/gists{/gist_id}","starred_url":"https://api.github.com/users/swapnilgm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/swapnilgm/subscriptions","organizations_url":"https://api.github.com/users/swapnilgm/orgs","repos_url":"https://api.github.com/users/swapnilgm/repos","events_url":"https://api.github.com/users/swapnilgm/events{/privacy}","received_events_url":"https://api.github.com/users/swapnilgm/received_events","type":"User","site_admin":false},{"login":"vpnachev","id":6798531,"node_id":"MDQ6VXNlcjY3OTg1MzE=","avatar_url":"https://avatars2.githubusercontent.com/u/6798531?v=4","gravatar_id":"","url":"https://api.github.com/users/vpnachev","html_url":"https://github.com/vpnachev","followers_url":"https://api.github.com/users/vpnachev/followers","following_url":"https://api.github.com/users/vpnachev/following{/other_user}","gists_url":"https://api.github.com/users/vpnachev/gists{/gist_id}","starred_url":"https://api.github.com/users/vpnachev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vpnachev/subscriptions","organizations_url":"https://api.github.com/users/vpnachev/orgs","repos_url":"https://api.github.com/users/vpnachev/repos","events_url":"https://api.github.com/users/vpnachev/events{/privacy}","received_events_url":"https://api.github.com/users/vpnachev/received_events","type":"User","site_admin":false},{"login":"vasu1124","id":11454395,"node_id":"MDQ6VXNlcjExNDU0Mzk1","avatar_url":"https://avatars1.githubusercontent.com/u/11454395?v=4","gravatar_id":"","url":"https://api.github.com/users/vasu1124","html_url":"https://github.com/vasu1124","followers_url":"https://api.github.com/users/vasu1124/followers","following_url":"https://api.github.com/users/vasu1124/following{/other_user}","gists_url":"https://api.github.com/users/vasu1124/gists{/gist_id}","starred_url":"https://api.github.com/users/vasu1124/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vasu1124/subscriptions","organizations_url":"https://api.github.com/users/vasu1124/orgs","repos_url":"https://api.github.com/users/vasu1124/repos","events_url":"https://api.github.com/users/vasu1124/events{/privacy}","received_events_url":"https://api.github.com/users/vasu1124/received_events","type":"User","site_admin":false},{"login":"hardikdr","id":12736827,"node_id":"MDQ6VXNlcjEyNzM2ODI3","avatar_url":"https://avatars1.githubusercontent.com/u/12736827?v=4","gravatar_id":"","url":"https://api.github.com/users/hardikdr","html_url":"https://github.com/hardikdr","followers_url":"https://api.github.com/users/hardikdr/followers","following_url":"https://api.github.com/users/hardikdr/following{/other_user}","gists_url":"https://api.github.com/users/hardikdr/gists{/gist_id}","starred_url":"https://api.github.com/users/hardikdr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hardikdr/subscriptions","organizations_url":"https://api.github.com/users/hardikdr/orgs","repos_url":"https://api.github.com/users/hardikdr/repos","events_url":"https://api.github.com/users/hardikdr/events{/privacy}","received_events_url":"https://api.github.com/users/hardikdr/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":803921075,"node_id":"MDU6TGFiZWw4MDM5MjEwNzU=","url":"https://api.github.com/repos/gardener/gardener/labels/area/dev-productivity","name":"area/dev-productivity","color":"0052cc","default":false},{"id":943537166,"node_id":"MDU6TGFiZWw5NDM1MzcxNjY=","url":"https://api.github.com/repos/gardener/gardener/labels/area/disaster-recovery","name":"area/disaster-recovery","color":"0052cc","default":false},{"id":943537582,"node_id":"MDU6TGFiZWw5NDM1Mzc1ODI=","url":"https://api.github.com/repos/gardener/gardener/labels/area/open-source","name":"area/open-source","color":"0052cc","default":false},{"id":936917367,"node_id":"MDU6TGFiZWw5MzY5MTczNjc=","url":"https://api.github.com/repos/gardener/gardener/labels/area/performance","name":"area/performance","color":"0052cc","default":false},{"id":943540670,"node_id":"MDU6TGFiZWw5NDM1NDA2NzA=","url":"https://api.github.com/repos/gardener/gardener/labels/area/quality","name":"area/quality","color":"0052cc","default":false},{"id":943545245,"node_id":"MDU6TGFiZWw5NDM1NDUyNDU=","url":"https://api.github.com/repos/gardener/gardener/labels/area/robustness","name":"area/robustness","color":"0052cc","default":false},{"id":943543523,"node_id":"MDU6TGFiZWw5NDM1NDM1MjM=","url":"https://api.github.com/repos/gardener/gardener/labels/area/scalability","name":"area/scalability","color":"0052cc","default":false},{"id":943541331,"node_id":"MDU6TGFiZWw5NDM1NDEzMzE=","url":"https://api.github.com/repos/gardener/gardener/labels/exp/expert","name":"exp/expert","color":"d4c5f9","default":false},{"id":803921076,"node_id":"MDU6TGFiZWw4MDM5MjEwNzY=","url":"https://api.github.com/repos/gardener/gardener/labels/kind/discussion","name":"kind/discussion","color":"c7def8","default":false},{"id":943534295,"node_id":"MDU6TGFiZWw5NDM1MzQyOTU=","url":"https://api.github.com/repos/gardener/gardener/labels/needs/review","name":"needs/review","color":"fef2c0","default":false},{"id":943536216,"node_id":"MDU6TGFiZWw5NDM1MzYyMTY=","url":"https://api.github.com/repos/gardener/gardener/labels/needs/second-opinion","name":"needs/second-opinion","color":"fef2c0","default":false},{"id":943540312,"node_id":"MDU6TGFiZWw5NDM1NDAzMTI=","url":"https://api.github.com/repos/gardener/gardener/labels/platform/all","name":"platform/all","color":"006b75","default":false},{"id":943546562,"node_id":"MDU6TGFiZWw5NDM1NDY1NjI=","url":"https://api.github.com/repos/gardener/gardener/labels/priority/normal","name":"priority/normal","color":"4cceb8","default":false},{"id":943534700,"node_id":"MDU6TGFiZWw5NDM1MzQ3MDA=","url":"https://api.github.com/repos/gardener/gardener/labels/size/xl","name":"size/xl","color":"bfdadc","default":false},{"id":937258766,"node_id":"MDU6TGFiZWw5MzcyNTg3NjY=","url":"https://api.github.com/repos/gardener/gardener/labels/status/in-progress","name":"status/in-progress","color":"fef2c0","default":false},{"id":803921067,"node_id":"MDU6TGFiZWw4MDM5MjEwNjc=","url":"https://api.github.com/repos/gardener/gardener/labels/status/under-investigation","name":"status/under-investigation","color":"fef2c0","default":false},{"id":943533502,"node_id":"MDU6TGFiZWw5NDM1MzM1MDI=","url":"https://api.github.com/repos/gardener/gardener/labels/topology/garden","name":"topology/garden","color":"009f76","default":false},{"id":943547346,"node_id":"MDU6TGFiZWw5NDM1NDczNDY=","url":"https://api.github.com/repos/gardener/gardener/labels/topology/seed","name":"topology/seed","color":"009f76","default":false},{"id":943540515,"node_id":"MDU6TGFiZWw5NDM1NDA1MTU=","url":"https://api.github.com/repos/gardener/gardener/labels/topology/shoot","name":"topology/shoot","color":"009f76","default":false},{"id":943544196,"node_id":"MDU6TGFiZWw5NDM1NDQxOTY=","url":"https://api.github.com/repos/gardener/gardener/labels/topology/soil","name":"topology/soil","color":"009f76","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/gardener/gardener/pulls/370/commits","review_comments_url":"https://api.github.com/repos/gardener/gardener/pulls/370/comments","review_comment_url":"https://api.github.com/repos/gardener/gardener/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gardener/gardener/issues/370/comments","statuses_url":"https://api.github.com/repos/gardener/gardener/statuses/2a056c6baf7a7e8f0e71f5275ce0146c22973a9c","head":{"label":"rfranzke:feature/gep-extensibility","ref":"feature/gep-extensibility","sha":"2a056c6baf7a7e8f0e71f5275ce0146c22973a9c","user":{"login":"rfranzke","id":19169361,"node_id":"MDQ6VXNlcjE5MTY5MzYx","avatar_url":"https://avatars1.githubusercontent.com/u/19169361?v=4","gravatar_id":"","url":"https://api.github.com/users/rfranzke","html_url":"https://github.com/rfranzke","followers_url":"https://api.github.com/users/rfranzke/followers","following_url":"https://api.github.com/users/rfranzke/following{/other_user}","gists_url":"https://api.github.com/users/rfranzke/gists{/gist_id}","starred_url":"https://api.github.com/users/rfranzke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfranzke/subscriptions","organizations_url":"https://api.github.com/users/rfranzke/orgs","repos_url":"https://api.github.com/users/rfranzke/repos","events_url":"https://api.github.com/users/rfranzke/events{/privacy}","received_events_url":"https://api.github.com/users/rfranzke/received_events","type":"User","site_admin":false},"repo":{"id":117505930,"node_id":"MDEwOlJlcG9zaXRvcnkxMTc1MDU5MzA=","name":"gardener","full_name":"rfranzke/gardener","private":false,"owner":{"login":"rfranzke","id":19169361,"node_id":"MDQ6VXNlcjE5MTY5MzYx","avatar_url":"https://avatars1.githubusercontent.com/u/19169361?v=4","gravatar_id":"","url":"https://api.github.com/users/rfranzke","html_url":"https://github.com/rfranzke","followers_url":"https://api.github.com/users/rfranzke/followers","following_url":"https://api.github.com/users/rfranzke/following{/other_user}","gists_url":"https://api.github.com/users/rfranzke/gists{/gist_id}","starred_url":"https://api.github.com/users/rfranzke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfranzke/subscriptions","organizations_url":"https://api.github.com/users/rfranzke/orgs","repos_url":"https://api.github.com/users/rfranzke/repos","events_url":"https://api.github.com/users/rfranzke/events{/privacy}","received_events_url":"https://api.github.com/users/rfranzke/received_events","type":"User","site_admin":false},"html_url":"https://github.com/rfranzke/gardener","description":"Kubernetes extension which manages Shoot (Kubernetes) clusters on various Cloud infrastructure providers.","fork":true,"url":"https://api.github.com/repos/rfranzke/gardener","forks_url":"https://api.github.com/repos/rfranzke/gardener/forks","keys_url":"https://api.github.com/repos/rfranzke/gardener/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rfranzke/gardener/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rfranzke/gardener/teams","hooks_url":"https://api.github.com/repos/rfranzke/gardener/hooks","issue_events_url":"https://api.github.com/repos/rfranzke/gardener/issues/events{/number}","events_url":"https://api.github.com/repos/rfranzke/gardener/events","assignees_url":"https://api.github.com/repos/rfranzke/gardener/assignees{/user}","branches_url":"https://api.github.com/repos/rfranzke/gardener/branches{/branch}","tags_url":"https://api.github.com/repos/rfranzke/gardener/tags","blobs_url":"https://api.github.com/repos/rfranzke/gardener/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rfranzke/gardener/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rfranzke/gardener/git/refs{/sha}","trees_url":"https://api.github.com/repos/rfranzke/gardener/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rfranzke/gardener/statuses/{sha}","languages_url":"https://api.github.com/repos/rfranzke/gardener/languages","stargazers_url":"https://api.github.com/repos/rfranzke/gardener/stargazers","contributors_url":"https://api.github.com/repos/rfranzke/gardener/contributors","subscribers_url":"https://api.github.com/repos/rfranzke/gardener/subscribers","subscription_url":"https://api.github.com/repos/rfranzke/gardener/subscription","commits_url":"https://api.github.com/repos/rfranzke/gardener/commits{/sha}","git_commits_url":"https://api.github.com/repos/rfranzke/gardener/git/commits{/sha}","comments_url":"https://api.github.com/repos/rfranzke/gardener/comments{/number}","issue_comment_url":"https://api.github.com/repos/rfranzke/gardener/issues/comments{/number}","contents_url":"https://api.github.com/repos/rfranzke/gardener/contents/{+path}","compare_url":"https://api.github.com/repos/rfranzke/gardener/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rfranzke/gardener/merges","archive_url":"https://api.github.com/repos/rfranzke/gardener/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rfranzke/gardener/downloads","issues_url":"https://api.github.com/repos/rfranzke/gardener/issues{/number}","pulls_url":"https://api.github.com/repos/rfranzke/gardener/pulls{/number}","milestones_url":"https://api.github.com/repos/rfranzke/gardener/milestones{/number}","notifications_url":"https://api.github.com/repos/rfranzke/gardener/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rfranzke/gardener/labels{/name}","releases_url":"https://api.github.com/repos/rfranzke/gardener/releases{/id}","deployments_url":"https://api.github.com/repos/rfranzke/gardener/deployments","created_at":"2018-01-15T06:27:02Z","updated_at":"2018-09-20T13:29:52Z","pushed_at":"2018-09-23T18:57:36Z","git_url":"git://github.com/rfranzke/gardener.git","ssh_url":"git@github.com:rfranzke/gardener.git","clone_url":"https://github.com/rfranzke/gardener.git","svn_url":"https://github.com/rfranzke/gardener","homepage":"","size":15878,"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":"gardener:master","ref":"master","sha":"dfde620f48c2b5c9b484a5896bf25ae511ac8b38","user":{"login":"gardener","id":33683699,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzNjgzNjk5","avatar_url":"https://avatars2.githubusercontent.com/u/33683699?v=4","gravatar_id":"","url":"https://api.github.com/users/gardener","html_url":"https://github.com/gardener","followers_url":"https://api.github.com/users/gardener/followers","following_url":"https://api.github.com/users/gardener/following{/other_user}","gists_url":"https://api.github.com/users/gardener/gists{/gist_id}","starred_url":"https://api.github.com/users/gardener/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gardener/subscriptions","organizations_url":"https://api.github.com/users/gardener/orgs","repos_url":"https://api.github.com/users/gardener/repos","events_url":"https://api.github.com/users/gardener/events{/privacy}","received_events_url":"https://api.github.com/users/gardener/received_events","type":"Organization","site_admin":false},"repo":{"id":117377862,"node_id":"MDEwOlJlcG9zaXRvcnkxMTczNzc4NjI=","name":"gardener","full_name":"gardener/gardener","private":false,"owner":{"login":"gardener","id":33683699,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzNjgzNjk5","avatar_url":"https://avatars2.githubusercontent.com/u/33683699?v=4","gravatar_id":"","url":"https://api.github.com/users/gardener","html_url":"https://github.com/gardener","followers_url":"https://api.github.com/users/gardener/followers","following_url":"https://api.github.com/users/gardener/following{/other_user}","gists_url":"https://api.github.com/users/gardener/gists{/gist_id}","starred_url":"https://api.github.com/users/gardener/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gardener/subscriptions","organizations_url":"https://api.github.com/users/gardener/orgs","repos_url":"https://api.github.com/users/gardener/repos","events_url":"https://api.github.com/users/gardener/events{/privacy}","received_events_url":"https://api.github.com/users/gardener/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/gardener/gardener","description":"Kubernetes API server extension and controller manager managing the full lifecycle of conformant Kubernetes clusters (Shoots) as a service on AWS, Azure, GCP, and OpenStack.","fork":false,"url":"https://api.github.com/repos/gardener/gardener","forks_url":"https://api.github.com/repos/gardener/gardener/forks","keys_url":"https://api.github.com/repos/gardener/gardener/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gardener/gardener/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gardener/gardener/teams","hooks_url":"https://api.github.com/repos/gardener/gardener/hooks","issue_events_url":"https://api.github.com/repos/gardener/gardener/issues/events{/number}","events_url":"https://api.github.com/repos/gardener/gardener/events","assignees_url":"https://api.github.com/repos/gardener/gardener/assignees{/user}","branches_url":"https://api.github.com/repos/gardener/gardener/branches{/branch}","tags_url":"https://api.github.com/repos/gardener/gardener/tags","blobs_url":"https://api.github.com/repos/gardener/gardener/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gardener/gardener/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gardener/gardener/git/refs{/sha}","trees_url":"https://api.github.com/repos/gardener/gardener/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gardener/gardener/statuses/{sha}","languages_url":"https://api.github.com/repos/gardener/gardener/languages","stargazers_url":"https://api.github.com/repos/gardener/gardener/stargazers","contributors_url":"https://api.github.com/repos/gardener/gardener/contributors","subscribers_url":"https://api.github.com/repos/gardener/gardener/subscribers","subscription_url":"https://api.github.com/repos/gardener/gardener/subscription","commits_url":"https://api.github.com/repos/gardener/gardener/commits{/sha}","git_commits_url":"https://api.github.com/repos/gardener/gardener/git/commits{/sha}","comments_url":"https://api.github.com/repos/gardener/gardener/comments{/number}","issue_comment_url":"https://api.github.com/repos/gardener/gardener/issues/comments{/number}","contents_url":"https://api.github.com/repos/gardener/gardener/contents/{+path}","compare_url":"https://api.github.com/repos/gardener/gardener/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gardener/gardener/merges","archive_url":"https://api.github.com/repos/gardener/gardener/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gardener/gardener/downloads","issues_url":"https://api.github.com/repos/gardener/gardener/issues{/number}","pulls_url":"https://api.github.com/repos/gardener/gardener/pulls{/number}","milestones_url":"https://api.github.com/repos/gardener/gardener/milestones{/number}","notifications_url":"https://api.github.com/repos/gardener/gardener/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gardener/gardener/labels{/name}","releases_url":"https://api.github.com/repos/gardener/gardener/releases{/id}","deployments_url":"https://api.github.com/repos/gardener/gardener/deployments","created_at":"2018-01-13T20:57:47Z","updated_at":"2018-09-23T18:32:58Z","pushed_at":"2018-09-23T18:57:39Z","git_url":"git://github.com/gardener/gardener.git","ssh_url":"git@github.com:gardener/gardener.git","clone_url":"https://github.com/gardener/gardener.git","svn_url":"https://github.com/gardener/gardener","homepage":"https://gardener.cloud","size":15908,"stargazers_count":643,"watchers_count":643,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":74,"mirror_url":null,"archived":false,"open_issues_count":66,"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":74,"open_issues":66,"watchers":643,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gardener/gardener/pulls/370"},"html":{"href":"https://github.com/gardener/gardener/pull/370"},"issue":{"href":"https://api.github.com/repos/gardener/gardener/issues/370"},"comments":{"href":"https://api.github.com/repos/gardener/gardener/issues/370/comments"},"review_comments":{"href":"https://api.github.com/repos/gardener/gardener/pulls/370/comments"},"review_comment":{"href":"https://api.github.com/repos/gardener/gardener/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gardener/gardener/pulls/370/commits"},"statuses":{"href":"https://api.github.com/repos/gardener/gardener/statuses/2a056c6baf7a7e8f0e71f5275ce0146c22973a9c"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"rfranzke"}}