{"action":"created","comment":{"url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/comments/166856347","pull_request_review_id":94983714,"id":166856347,"diff_hunk":"@@ -0,0 +1,251 @@\n+import * as vscode from \"vscode\";\r\n+import * as fs from \"fs\";\r\n+import * as path from \"path\";\r\n+import { ChildProcess } from \"child_process\";\r\n+\r\n+import { IDebugProvider, IDockerParser } from \"./debugInterfaces\";\r\n+import * as debugUtils from \"./debugUtils\";\r\n+import { DockerfileParser } from \"./dockerfileParser\";\r\n+import * as providerRegistry from \"./providerRegistry\";\r\n+\r\n+import * as docker from \"../docker\";\r\n+import { kubeChannel } from \"../kubeChannel\";\r\n+import { Kubectl } from \"../kubectl\";\r\n+import { getKubeconfig } from \"../kubectlUtils\";\r\n+import { shell } from \"../shell\";\r\n+import { sleep } from \"../sleep\";\r\n+\r\n+export enum DockerClient {\r\n+    docker = \"docker\",\r\n+    dockerCompose = \"docker-compose\"\r\n+}\r\n+\r\n+export interface IDebugService {\r\n+    launchDebug(workspaceFolder: vscode.WorkspaceFolder): Promise<void>;\r\n+    attachDebug(workspaceFolder: vscode.WorkspaceFolder, pod?: string): Promise<void>;\r\n+}\r\n+\r\n+export class DebugService implements IDebugService {\r\n+    private debugProvider: IDebugProvider;\r\n+    private dockerParser: IDockerParser;\r\n+\r\n+    constructor(private readonly kubectl: Kubectl) {\r\n+    }\r\n+\r\n+    /**\r\n+     * In launch mode, build the docker image from docker file first and then run it on kubernetes cluster,\r\n+     * after that smartly resolve the debugging info from the docker image and create port-forward, \r\n+     * finally start a debugger to attach to the debugging process.\r\n+     * \r\n+     * Besides, when the debug session is terminated, kill the port-forward and cleanup the created kubernetes resources (deployment/pod) automatically.\r\n+     * \r\n+     * @param workspaceFolder the active workspace folder.\r\n+     */\r\n+    public async launchDebug(workspaceFolder: vscode.WorkspaceFolder): Promise<void> {\r\n+        if (!workspaceFolder) {\r\n+            return;\r\n+        }\r\n+        // TODO: Support docker-compose.yml\r\n+        const dockerfilePath = path.join(workspaceFolder.uri.fsPath, \"Dockerfile\");\r\n+        if (!fs.existsSync(dockerfilePath)) {\r\n+            vscode.window.showErrorMessage(`No Dockerfile found at the workspace ${workspaceFolder.name}`);\r\n+            return;\r\n+        }\r\n+        this.dockerParser = new DockerfileParser(dockerfilePath);\r\n+        this.debugProvider = await providerRegistry.getDebugProvider(this.dockerParser.getBaseImage());\r\n+        if (!this.debugProvider) {\r\n+            return;\r\n+        } else if (!await this.debugProvider.isDebuggerInstalled()) { // Check the required debugger extension is installed or not.\r\n+            return;\r\n+        }\r\n+\r\n+        const cwd = workspaceFolder.uri.fsPath;\r\n+        const imagePrefix = vscode.workspace.getConfiguration().get(\"vsdocker.imageUser\", null);\r\n+        const containerEnv= {};\r\n+        const portInfo = await this.debugProvider.getDockerResolver().resolvePortsFromFile(this.dockerParser, containerEnv);\r\n+        if (!portInfo || !portInfo.debug) {\r\n+            vscode.window.showErrorMessage(\"Cannot resolve debug port from Dockerfile.\");\r\n+            return;\r\n+        }\r\n+        if (!portInfo.app || !Number.isInteger(Number(portInfo.app))) {\r\n+            vscode.window.showErrorMessage(`Cannot resolve application port from Dockerfile.`);\r\n+            return;\r\n+        }\r\n+\r\n+        vscode.window.withProgress({ location: vscode.ProgressLocation.Window }, async (p) => {\r\n+            let appName;\r\n+            try {\r\n+                // Build/push docker image.\r\n+                p.report({ message: \"Building docker image...\"});\r\n+                kubeChannel.showOutput(\"Starting to build/push docker image...\", \"Docker build/push\");\r\n+                const shellOpts = Object.assign({ }, shell.execOpts(), { cwd });\r\n+                if (!imagePrefix) {\r\n+                    // In order to allow local kubernetes cluster (e.g. minikube) to have access to local docker images,\r\n+                    // need override docker-env before running docker build.\r\n+                    const dockerEnv = await debugUtils.resolveDockerEnv(this.kubectl);\r\n+                    shellOpts.env = Object.assign({}, shellOpts.env, dockerEnv);\r\n+                }\r\n+                const image = await debugUtils.buildAndPushDockerImage(DockerClient.docker, shellOpts, imagePrefix);\r\n+                kubeChannel.showOutput(`Finished to build/push docker image ${image}.`);\r\n+\r\n+                // Run docker image in k8s container.\r\n+                p.report({ message: \"Running docker image on k8s...\"});\r\n+                kubeChannel.showOutput(`Starting to run image ${image} on kubernetes cluster...`, \"Run on kubernetes\");\r\n+                appName = await debugUtils.runDockerImageInK8s(this.kubectl, image, [portInfo.app, portInfo.debug], containerEnv);\r\n+                kubeChannel.showOutput(`Finished to run image ${image} as a deployment ${appName} on kubernetes cluster.`);\r\n+\r\n+                // Find the running debug pod.\r\n+                p.report({ message: \"Finding the debug pod...\"});\r\n+                kubeChannel.showOutput(`Starting to find the pod by the label run=${appName}`, \"Find debug pod\");\r\n+                const podList = await debugUtils.findPodsByLabel(this.kubectl, `run=${appName}`);\r\n+                if (podList.items.length === 0) {\r\n+                    throw new Error(\"Failed to find debug pod.\");\r\n+                }\r\n+                const podName = podList.items[0].metadata.name;\r\n+                kubeChannel.showOutput(`Finished to find the running debug pod: ${podName}`);\r\n+                \r\n+                // Wait for the debug pod status to be running.\r\n+                p.report({ message: \"Waiting for the pod to be ready...\"});\r\n+                kubeChannel.showOutput(`Starting to wait the pod ${podName} status to become running...`, \"Wait for pod\");\r\n+                await debugUtils.waitForRunningPod(this.kubectl, podName);\r\n+                kubeChannel.showOutput(`Finshed to wait.`);\r\n+    \r\n+                // Setup port-forward.\r\n+                p.report({ message: \"Creating port-forwarding...\"});\r\n+                kubeChannel.showOutput(`Starting to create port-forward on pod ${podName}...`, \"port-forward\");\r\n+                const proxyResult = await this.createPortForward(podName, portInfo.debug, portInfo.app);\r\n+                kubeChannel.showOutput(`Finished to create port-forward ${proxyResult.proxyDebugPort}:${portInfo.debug} ${proxyResult.proxyAppPort}:${portInfo.app}`);\r\n+\r\n+                // Wait for the port-forward proxy to be ready.\r\n+                p.report({ message: \"Waiting for port-forwarding ready...\"});\r\n+                kubeChannel.showOutput(\"Starting to wait the port proxy to be ready...\", \"Wait for port-forward\");\r\n+                await this.waitForProxyReady(proxyResult.proxyProcess);\r\n+                kubeChannel.showOutput(\"Finished to wait.\");\r\n+                \r\n+                // Start debug session.\r\n+                p.report({ message: `Starting ${this.debugProvider.getDebuggerType()} debug session...`});\r\n+                kubeChannel.showOutput(\"Starting to start debug session...\", \"Start debug\");\r\n+                const sessionName = appName || `${Date.now()}`;\r\n+                await this.startDebugging(cwd, sessionName, proxyResult.proxyDebugPort, proxyResult.proxyAppPort, async () => {\r\n+                    proxyResult.proxyProcess.kill();\r\n+                    if (appName) {\r\n+                        await this.cleanupResource(`deployment/${appName}`);\r\n+                    }\r\n+                });\r\n+            } catch (error) {\r\n+                vscode.window.showErrorMessage(error);\r\n+                kubeChannel.showOutput(`Debug(Launch) on kubernetes failed. See the errors: ${error}.`);\r\n+                if (appName) {\r\n+                    await this.cleanupResource(`deployment/${appName}`);\r\n+                }\r\n+            }\r\n+            return null;\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * In attach mode, the user should choose the running pod first, then the debugger will attach to it.\r\n+     * \r\n+     * @param workspaceFolder the active workspace folder.\r\n+     * @param pod the debug pod name.\r\n+     */\r\n+    public async attachDebug(workspaceFolder: vscode.WorkspaceFolder, pod?: string): Promise<void> {\r\n+        // TODO\r\n+        return;\r\n+    }\r\n+\r\n+    private async createPortForward(podName, debugPort, appPort): Promise<any> {\r\n+        const portMapping = [];\r\n+        const portfinder = require('portfinder');\r\n+        // Find a free local port for forwarding data to remote app port.\r\n+        let proxyAppPort = 0;\r\n+        if (appPort) {\r\n+            proxyAppPort = await portfinder.getPortPromise({\r\n+                port: appPort\r\n+            });\r\n+            portMapping.push(proxyAppPort + \":\" + appPort);\r\n+        }\r\n+        // Find a free local port for forwarding data to remote debug port.\r\n+        const proxyDebugPort = await portfinder.getPortPromise({\r\n+            port: Math.max(10000, Number(proxyAppPort) + 1)\r\n+        });\r\n+        portMapping.push(proxyDebugPort + \":\" + debugPort);\r\n+\r\n+        let bin = vscode.workspace.getConfiguration('vs-kubernetes')['vs-kubernetes.kubectl-path'];\r\n+        if (!bin) {\r\n+            bin = 'kubectl';\r\n+        }\r\n+        \r\n+        return {\r\n+            proxyProcess: require('child_process').spawn(bin, [\"port-forward\", podName, ...portMapping]),\r\n+            proxyDebugPort,\r\n+            proxyAppPort\r\n+        };\r\n+    }\r\n+\r\n+    private async waitForProxyReady(proxyProcess: ChildProcess): Promise<void> {\r\n+        return new Promise<void>((resolve, reject) => {\r\n+            const forwardingRegExp = /Forwarding\\s+from\\s+127\\.0\\.0\\.1:/;\r","path":"src/debug/debugService.ts","position":null,"original_position":188,"commit_id":"b1a02fdfa5e6b475774e7eb22a3f31efe0e9886e","original_commit_id":"6944b2f276366383e19c016863f7d345117c17d8","user":{"login":"testforstephen","id":14052197,"avatar_url":"https://avatars3.githubusercontent.com/u/14052197?v=4","gravatar_id":"","url":"https://api.github.com/users/testforstephen","html_url":"https://github.com/testforstephen","followers_url":"https://api.github.com/users/testforstephen/followers","following_url":"https://api.github.com/users/testforstephen/following{/other_user}","gists_url":"https://api.github.com/users/testforstephen/gists{/gist_id}","starred_url":"https://api.github.com/users/testforstephen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/testforstephen/subscriptions","organizations_url":"https://api.github.com/users/testforstephen/orgs","repos_url":"https://api.github.com/users/testforstephen/repos","events_url":"https://api.github.com/users/testforstephen/events{/privacy}","received_events_url":"https://api.github.com/users/testforstephen/received_events","type":"User","site_admin":false},"body":"In regular expression, the space should be `\\s`, and adding an additional `+` does no harm. Right?","created_at":"2018-02-08T08:11:56Z","updated_at":"2018-02-08T08:11:56Z","html_url":"https://github.com/Azure/vscode-kubernetes-tools/pull/46#discussion_r166856347","pull_request_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/comments/166856347"},"html":{"href":"https://github.com/Azure/vscode-kubernetes-tools/pull/46#discussion_r166856347"},"pull_request":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46"}},"in_reply_to_id":166781300},"pull_request":{"url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46","id":167046752,"html_url":"https://github.com/Azure/vscode-kubernetes-tools/pull/46","diff_url":"https://github.com/Azure/vscode-kubernetes-tools/pull/46.diff","patch_url":"https://github.com/Azure/vscode-kubernetes-tools/pull/46.patch","issue_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/issues/46","number":46,"state":"open","locked":false,"title":"Define debug framework and add java debug implementation","user":{"login":"testforstephen","id":14052197,"avatar_url":"https://avatars3.githubusercontent.com/u/14052197?v=4","gravatar_id":"","url":"https://api.github.com/users/testforstephen","html_url":"https://github.com/testforstephen","followers_url":"https://api.github.com/users/testforstephen/followers","following_url":"https://api.github.com/users/testforstephen/following{/other_user}","gists_url":"https://api.github.com/users/testforstephen/gists{/gist_id}","starred_url":"https://api.github.com/users/testforstephen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/testforstephen/subscriptions","organizations_url":"https://api.github.com/users/testforstephen/orgs","repos_url":"https://api.github.com/users/testforstephen/repos","events_url":"https://api.github.com/users/testforstephen/events{/privacy}","received_events_url":"https://api.github.com/users/testforstephen/received_events","type":"User","site_admin":false},"body":"Signed-off-by: Jinbo Wang <jinbwan@microsoft.com>\r\n\r\nPlan to split the local debug support to several PRs for review.\r\n- <b>PR1: Define debug framework and add java debug implementation.</b>\r\n- PR2: Add node debug implementation.\r\n- PR3: Add debug (attach) support.\r\n- PR4: Enable the new debug framework via kubernetes commands `Debug(Launch)` and `Debug(Attach)`\r\n- PR5: Support docker-compose.yml ?","created_at":"2018-02-05T02:38:08Z","updated_at":"2018-02-08T08:11:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3304751dbd7d6ab036874f3460c29ccbac754d45","assignee":null,"assignees":[],"requested_reviewers":[{"login":"akaroml","id":16755094,"avatar_url":"https://avatars2.githubusercontent.com/u/16755094?v=4","gravatar_id":"","url":"https://api.github.com/users/akaroml","html_url":"https://github.com/akaroml","followers_url":"https://api.github.com/users/akaroml/followers","following_url":"https://api.github.com/users/akaroml/following{/other_user}","gists_url":"https://api.github.com/users/akaroml/gists{/gist_id}","starred_url":"https://api.github.com/users/akaroml/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akaroml/subscriptions","organizations_url":"https://api.github.com/users/akaroml/orgs","repos_url":"https://api.github.com/users/akaroml/repos","events_url":"https://api.github.com/users/akaroml/events{/privacy}","received_events_url":"https://api.github.com/users/akaroml/received_events","type":"User","site_admin":false}],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46/commits","review_comments_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46/comments","review_comment_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/issues/46/comments","statuses_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/statuses/b1a02fdfa5e6b475774e7eb22a3f31efe0e9886e","head":{"label":"testforstephen:jinbo_debugService","ref":"jinbo_debugService","sha":"b1a02fdfa5e6b475774e7eb22a3f31efe0e9886e","user":{"login":"testforstephen","id":14052197,"avatar_url":"https://avatars3.githubusercontent.com/u/14052197?v=4","gravatar_id":"","url":"https://api.github.com/users/testforstephen","html_url":"https://github.com/testforstephen","followers_url":"https://api.github.com/users/testforstephen/followers","following_url":"https://api.github.com/users/testforstephen/following{/other_user}","gists_url":"https://api.github.com/users/testforstephen/gists{/gist_id}","starred_url":"https://api.github.com/users/testforstephen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/testforstephen/subscriptions","organizations_url":"https://api.github.com/users/testforstephen/orgs","repos_url":"https://api.github.com/users/testforstephen/repos","events_url":"https://api.github.com/users/testforstephen/events{/privacy}","received_events_url":"https://api.github.com/users/testforstephen/received_events","type":"User","site_admin":false},"repo":{"id":115995912,"name":"vscode-kubernetes-tools","full_name":"testforstephen/vscode-kubernetes-tools","owner":{"login":"testforstephen","id":14052197,"avatar_url":"https://avatars3.githubusercontent.com/u/14052197?v=4","gravatar_id":"","url":"https://api.github.com/users/testforstephen","html_url":"https://github.com/testforstephen","followers_url":"https://api.github.com/users/testforstephen/followers","following_url":"https://api.github.com/users/testforstephen/following{/other_user}","gists_url":"https://api.github.com/users/testforstephen/gists{/gist_id}","starred_url":"https://api.github.com/users/testforstephen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/testforstephen/subscriptions","organizations_url":"https://api.github.com/users/testforstephen/orgs","repos_url":"https://api.github.com/users/testforstephen/repos","events_url":"https://api.github.com/users/testforstephen/events{/privacy}","received_events_url":"https://api.github.com/users/testforstephen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/testforstephen/vscode-kubernetes-tools","description":"Kubernetes extension for Visual Studio Code","fork":true,"url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools","forks_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/forks","keys_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/teams","hooks_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/hooks","issue_events_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/issues/events{/number}","events_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/events","assignees_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/assignees{/user}","branches_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/branches{/branch}","tags_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/tags","blobs_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/statuses/{sha}","languages_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/languages","stargazers_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/stargazers","contributors_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/contributors","subscribers_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/subscribers","subscription_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/subscription","commits_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/contents/{+path}","compare_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/merges","archive_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/downloads","issues_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/issues{/number}","pulls_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/pulls{/number}","milestones_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/milestones{/number}","notifications_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/labels{/name}","releases_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/releases{/id}","deployments_url":"https://api.github.com/repos/testforstephen/vscode-kubernetes-tools/deployments","created_at":"2018-01-02T09:04:11Z","updated_at":"2018-01-02T09:04:14Z","pushed_at":"2018-02-08T07:17:32Z","git_url":"git://github.com/testforstephen/vscode-kubernetes-tools.git","ssh_url":"git@github.com:testforstephen/vscode-kubernetes-tools.git","clone_url":"https://github.com/testforstephen/vscode-kubernetes-tools.git","svn_url":"https://github.com/testforstephen/vscode-kubernetes-tools","homepage":null,"size":378,"stargazers_count":0,"watchers_count":0,"language":"TypeScript","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":"Azure:master","ref":"master","sha":"ad9225c832df225344e073d6a6168110cccadf4f","user":{"login":"Azure","id":6844498,"avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"repo":{"id":98263285,"name":"vscode-kubernetes-tools","full_name":"Azure/vscode-kubernetes-tools","owner":{"login":"Azure","id":6844498,"avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Azure/vscode-kubernetes-tools","description":"Kubernetes extension for Visual Studio Code","fork":false,"url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools","forks_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/forks","keys_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/teams","hooks_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/hooks","issue_events_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/events","assignees_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/tags","blobs_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/languages","stargazers_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/stargazers","contributors_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/contributors","subscribers_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/subscribers","subscription_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/subscription","commits_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/merges","archive_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/downloads","issues_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/labels{/name}","releases_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/deployments","created_at":"2017-07-25T04:12:07Z","updated_at":"2018-01-21T18:27:48Z","pushed_at":"2018-02-08T07:17:34Z","git_url":"git://github.com/Azure/vscode-kubernetes-tools.git","ssh_url":"git@github.com:Azure/vscode-kubernetes-tools.git","clone_url":"https://github.com/Azure/vscode-kubernetes-tools.git","svn_url":"https://github.com/Azure/vscode-kubernetes-tools","homepage":null,"size":294,"stargazers_count":22,"watchers_count":22,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"archived":false,"open_issues_count":20,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":7,"open_issues":20,"watchers":22,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46"},"html":{"href":"https://github.com/Azure/vscode-kubernetes-tools/pull/46"},"issue":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/issues/46"},"comments":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/issues/46/comments"},"review_comments":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46/comments"},"review_comment":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/pulls/46/commits"},"statuses":{"href":"https://api.github.com/repos/Azure/vscode-kubernetes-tools/statuses/b1a02fdfa5e6b475774e7eb22a3f31efe0e9886e"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"testforstephen"}}