{"action":"created","comment":{"url":"https://api.github.com/repos/shapeblue/cloudstack/pulls/comments/205047506","pull_request_review_id":140238508,"id":205047506,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNTA0NzUwNg==","diff_hunk":"@@ -410,159 +465,204 @@ protected String getDefaultFilesForVm(String diagnosticsType, String systemVmTyp\n                 listDefaultFilesForVm = key.getDetail();\n                 return listDefaultFilesForVm;\n             }\n-\n         }\n         return null;\n     }\n \n-   /* public ExecutionResult copyFileFromSystemVm(final String ip, final String filename) {\n-\n-        final File permKey = new File(\"/root/.ssh/id_rsa.cloud\");\n-        boolean success = true;\n-        String details = \"Copying file in System VM, with ip: \" + ip + \", file: \" + filename;\n-        LOGGER.debug(details);\n-\n-        try {\n-            SshHelper.scpTo(ip, 22, \"root\", permKey, null, null, filename.getBytes(), filename, null);\n-        } catch (final Exception e) {\n-            LOGGER.warn(\"Fail to copy file \" + filename + \" in System VM \" + ip, e);\n-            details = e.getMessage();\n-            success = false;\n-        }\n-        return new ExecutionResult(success, details);\n-    }*/\n-\n-    public File getSystemVMKeyFile() {\n-        final URL url = this.getClass().getClassLoader().getResource(\"scripts/vm/systemvm/id_rsa.cloud\");\n-        File keyFile = null;\n-        if (url != null) {\n-            keyFile = new File(url.getPath());\n-        }\n-        if (keyFile == null || !keyFile.exists()) {\n-            keyFile = new File(\"/usr/share/cloudstack-common/scripts/vm/systemvm/id_rsa.cloud\");\n-        }\n-        assert keyFile != null;\n-        if (!keyFile.exists()) {\n-            LOGGER.error(\"Unable to locate id_rsa.cloud in your setup at \" + keyFile.toString());\n-        }\n-        return keyFile;\n-    }\n-\n-    private static String getRouterSshControlIp(final NetworkElementCommand cmd) {\n-        final String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);\n-        final String routerGuestIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP);\n-        final String zoneNetworkType = cmd.getAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE);\n-\n-        if (routerGuestIp != null && zoneNetworkType != null && DataCenter.NetworkType.valueOf(zoneNetworkType) == DataCenter.NetworkType.Basic) {\n-            if (LOGGER.isDebugEnabled()) {\n-                LOGGER.debug(\"In Basic zone mode, use router's guest IP for SSH control. guest IP : \" + routerGuestIp);\n+    private boolean checkAndStartApache() {\n+        //Check whether the Apache server is running\n+        Script command = new Script(\"/bin/systemctl\", LOGGER);\n+        command.add(\"is-active\");\n+        command.add(\"apache2\");\n+        String result = command.execute();\n+\n+        //Apache Server is not running. Try to start it.\n+        if (result != null && !result.equals(\"active\")) {\n+            command = new Script(\"/bin/systemctl\", LOGGER);\n+            command.add(\"start\");\n+            command.add(\"apache2\");\n+            result = command.execute();\n+            if (result != null) {\n+                LOGGER.warn(\"Error in starting apache2 service err=\" + result);\n+                return false;\n             }\n-\n-            return routerGuestIp;\n         }\n \n-        if (LOGGER.isDebugEnabled()) {\n-            LOGGER.debug(\"Use router's private IP for SSH control. IP : \" + routerIp);\n+        return true;\n+    }\n+\n+    protected void createFolder(String path) {\n+        File dir = new File(path);\n+        if (!dir.exists()) {\n+            dir.mkdirs();\n         }\n-        return routerIp;\n     }\n \n-    protected Answer copyFileFromSystemVm(final NetworkElementCommand cmd, String script) throws Exception {\n-        final File keyFile = getSystemVMKeyFile();\n+    private CreateEntityDownloadURLAnswer downloadCompressedFileToSSVM(CreateEntityDownloadURLCommand cmd, final String diagnosticsZipFileName) {\n+        boolean isApacheUp = checkAndStartApache();\n+        if (!isApacheUp) {\n+            String errorString = \"Error in starting Apache server \";\n+            LOGGER.error(errorString);\n+            return new CreateEntityDownloadURLAnswer(errorString, CreateEntityDownloadURLAnswer.RESULT_FAILURE);\n+        }\n \n-        final String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);\n-        final Map<String, String> accessDetails = networkManager.getSystemVMAccessDetails(vmInstance);\n-        cmd.setAccessDetail(accessDetails);\n-        if (Strings.isNullOrEmpty(accessDetails.get(NetworkElementCommand.ROUTER_IP))) {\n-            throw new CloudRuntimeException(\"Unable to set system vm ControlIP for the system vm with ID -> \" + vmInstance);\n+        String errorString = \"\";\n+        long totalBytes = 0;\n+        long entitySizeinBytes;\n+        String sourcePath;\n+        BufferedInputStream inputStream = null;\n+        BufferedOutputStream outputStream = null;\n+        final int CHUNK_SIZE = 1024 * 1024; //1M\n+        StringBuffer sb = new StringBuffer(secUrl);\n+        // Create the directory structure so that its visible under apache server root\n+        String extractDir = \"/var/www/html/diagnosticsdata/\";\n+        Script command = new Script(\"/bin/su\", LOGGER);\n+        command.add(\"-s\");\n+        command.add(\"/bin/bash\");\n+        command.add(\"-c\");\n+        command.add(\"mkdir -p \" + extractDir);\n+        command.add(\"www-data\");\n+        String result = command.execute();\n+        if (result != null) {\n+            errorString = \"Error in creating directory =\" + result;\n+            LOGGER.error(errorString);\n+            return new CreateEntityDownloadURLAnswer(errorString, CreateEntityDownloadURLAnswer.RESULT_FAILURE);\n         }\n-        Pair<Boolean, String> result = null;\n-        final String controlIp = getRouterSshControlIp(cmd);\n-        assert controlIp != null;\n+        // Create a random file under the directory for security reasons.\n+        uuid = cmd.getExtractLinkUUID();\n+        // Create a symbolic link from the actual directory to the template location. The entity would be directly visible under /var/www/html/userdata/cmd.getInstallPath();\n+        command = new Script(\"/bin/bash\", LOGGER);\n+        command.add(\"-c\");\n+        command.add(\"ln -sf /mnt/SecStorage/\" + cmd.getParent() + File.separator + cmd.getInstallPath() + \" \" + extractDir + uuid);\n+        result = command.execute();\n         try {\n-            String command = null;\n-            if (cmd instanceof ExecuteScriptCommand) {\n-                LOGGER.debug(\"Executing script \" + script);\n-                if (script != null && \"iptables.py\".equalsIgnoreCase(script)) {\n-                    command = \"sudo iptables-save > \" + script + \".log\";\n-                } else if (script != null && \"ifconfig.py\".equalsIgnoreCase(script)) {\n-                    command = \"ifconfig +  > \" + script + \".log\";\n-\n-                } else if (script != null && \"router.py\".equalsIgnoreCase(script)) {\n-                    command = \"netstat -rn > \" + script + \".log\";\n+            URL url = new URL(sb.toString());\n+            URLConnection urlc = url.openConnection();\n+\n+            File sourceFile = new File(diagnosticsZipFileName);\n+            entitySizeinBytes = sourceFile.length();\n+\n+            outputStream = new BufferedOutputStream(urlc.getOutputStream());\n+            inputStream = new BufferedInputStream(new FileInputStream(sourceFile));\n+            int bytes = 0;\n+            byte[] block = new byte[CHUNK_SIZE];\n+            boolean done = false;\n+            while (!done) {\n+                if ((bytes = inputStream.read(block, 0, CHUNK_SIZE)) > -1) {\n+                    outputStream.write(block, 0, bytes);\n+                    totalBytes += bytes;\n                 } else {\n-                    throw new CloudRuntimeException(\"Script name is missing.\");\n+                    done = true;\n                 }\n-                result =\n-                        SshHelper.sshExecute(controlIp, 22, \"root\", getSystemVMKeyFile(), null, command);\n-            } else if (cmd instanceof RetrieveFilesCommand) {\n-                 try {\n-                     result =\n-                             SshHelper.sshExecute(controlIp, 22, \"root\", null, \"password\", \"scp \" + ((RetrieveFilesCommand) cmd).getDiagnosticFileToRetrieve() + \" /temp/\" + ((RetrieveFilesCommand) cmd).getDiagnosticFileToRetrieve());\n-                 }  catch (final Throwable e) {\n-                     LOGGER.error(\"Unexpected exception: \" + e.toString(), e);\n-                     return new Answer(cmd, false, \"copyFileFromSystemVm failed due to \" + e.getMessage());\n-                 }\n-             } else {\n-                throw new CloudRuntimeException(\"Unknown Command -> \" + cmd);\n-             }\n+            }\n+            return new CreateEntityDownloadURLAnswer(\"Diagnostics zip file downloaded successfully.\", CreateEntityDownloadURLAnswer.RESULT_SUCCESS);\n+        } catch (MalformedURLException e) {\n+            errorString = e.getMessage();\n+            LOGGER.error(errorString);\n+        } catch (IOException e) {\n+             errorString = e.getMessage();\n+            LOGGER.error(errorString);\n+        } finally {\n             try {\n-\n-                if (!result.first()) {\n-                    if (cmd instanceof RetrieveFilesCommand)\n-                        LOGGER.error(\"Unable to copy \" + ((RetrieveFilesCommand) cmd).getDiagnosticFileToRetrieve());\n-                    else\n-                        LOGGER.error(\"Unable to execute script \" + script);\n-                    return new Answer(cmd, false, \"Unable to copy \" + ((RetrieveFilesCommand) cmd).getDiagnosticFileToRetrieve() + \" or failed to run script \" + script);\n-                }\n-\n-                if (LOGGER.isInfoEnabled()) {\n-                    LOGGER.info(cmd + \" on System VM \" + controlIp + \" completed\");\n+                if (inputStream != null) {\n+                    inputStream.close();\n                 }\n-            } finally {\n-                if (script != null) {\n-                    SshHelper.sshExecute(controlIp, 3922, \"root\", getSystemVMKeyFile(), null, \"rm \" + script + \".log\");\n-                } else {\n-                    SshHelper.sshExecute(controlIp, 3922, \"root\", getSystemVMKeyFile(), null, \"rm \" + ((RetrieveFilesCommand) cmd).getDiagnosticFileToRetrieve());\n+                if (outputStream != null) {\n+                    outputStream.close();\n                 }\n+            } catch (IOException ioe) {\n+                LOGGER.error(\" Caught exception while closing the resources\");\n             }\n-\n-            return new Answer(cmd);\n-        } catch (final Throwable e) {\n-            LOGGER.error(\"Unexpected exception: \" + e.toString(), e);\n-            if (cmd instanceof RetrieveFilesCommand)\n-                return new Answer(cmd, false, \"Failed to retrieve file \" + ((RetrieveFilesCommand) cmd).getDiagnosticFileToRetrieve() + \"->\" + e.getMessage());\n-            else\n-                return new Answer(cmd, false, \"Failed to execute script \" + script + \"->\" + e.getMessage());\n         }\n+        return null;\n     }\n \n-    protected Map<String, String> retrieveDiagnosticsFiles(Long ssHostId, String diagnosticsFiles, final VMInstanceVO systemVmId, Long timeout)\n-            throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException, JSchException, IOException {\n+    private boolean copyFileFromSystemVmToServer() {\n+\n+        LOGGER.info(\"Copying the diagnostics zip file from the system vm.\");\n+        if (!checkForDiskSpace(vmInstance, disableThreshold)) {\n+            throw new CloudRuntimeException(\"Unlimited disk space on primary storage.\");\n+        }\n+        String publicIp = null;\n+        //final Map<String, String> accessDetails = networkManager.getSystemVMAccessDetails(vmInstance);\n+        VirtualMachine vm = vmManager.findById(vmInstance.getId());\n+        final List<NicVO> nics = _nicDao.listByVmId(vm.getId());\n+        for (final NicVO nic : nics) {\n+            final NetworkVO network = _networksDao.findById(nic.getNetworkId());\n+            final NicVO nicVO = _nicDao.findByNtwkIdAndInstanceId(network.getId(), vm.getId());\n+            publicIp = nicVO.getIPv4Address();\n+        }\n+        try {\n+            LOGGER.info(\"Attempting to SSH into linux host \" + publicIp);\n+            Connection conn = new Connection(publicIp);\n+            conn.connect(null, 600000, 600000);\n+\n+            LOGGER.info(\"SSHed successfully into linux host \" + publicIp);\n+\n+            boolean isAuthenticated = conn.authenticateWithPassword(\"root\", \"password\");\n+\n+            if (isAuthenticated == false) {\n+                LOGGER.info(\"Authentication failed\");\n+                return false;\n+            }\n+            //execute copy command\n+            Session sess = conn.openSession();\n+            String copyCommand = new String(\"scp root@\" + vmInstance.getPrivateIpAddress() + \":/temp/diagnostics_* \" + \"/diagnosticsdata\");\n+            LOGGER.info(\"Executing \" + copyCommand);\n+            sess.execCommand(copyCommand);\n+            Thread.sleep(120000);\n+            sess.close();\n+            //close the connection\n+            conn.close();\n+        } catch (Exception ex) {","path":"server/src/main/java/org/apache/cloudstack/diagnostics/RetrieveDiagnosticsServiceImpl.java","position":617,"original_position":497,"commit_id":"63f6b9ba342c212c07f4d74f6544ebf02054944a","original_commit_id":"63f6b9ba342c212c07f4d74f6544ebf02054944a","user":{"login":"DaanHoogland","id":2486961,"node_id":"MDQ6VXNlcjI0ODY5NjE=","avatar_url":"https://avatars1.githubusercontent.com/u/2486961?v=4","gravatar_id":"","url":"https://api.github.com/users/DaanHoogland","html_url":"https://github.com/DaanHoogland","followers_url":"https://api.github.com/users/DaanHoogland/followers","following_url":"https://api.github.com/users/DaanHoogland/following{/other_user}","gists_url":"https://api.github.com/users/DaanHoogland/gists{/gist_id}","starred_url":"https://api.github.com/users/DaanHoogland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DaanHoogland/subscriptions","organizations_url":"https://api.github.com/users/DaanHoogland/orgs","repos_url":"https://api.github.com/users/DaanHoogland/repos","events_url":"https://api.github.com/users/DaanHoogland/events{/privacy}","received_events_url":"https://api.github.com/users/DaanHoogland/received_events","type":"User","site_admin":false},"body":"can we be more specific about what we catch (instead of pokemon catching)?","created_at":"2018-07-25T09:48:37Z","updated_at":"2018-07-25T09:48:37Z","html_url":"https://github.com/shapeblue/cloudstack/pull/14#discussion_r205047506","pull_request_url":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/shapeblue/cloudstack/pulls/comments/205047506"},"html":{"href":"https://github.com/shapeblue/cloudstack/pull/14#discussion_r205047506"},"pull_request":{"href":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14"}}},"pull_request":{"url":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14","id":190905936,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkwOTA1OTM2","html_url":"https://github.com/shapeblue/cloudstack/pull/14","diff_url":"https://github.com/shapeblue/cloudstack/pull/14.diff","patch_url":"https://github.com/shapeblue/cloudstack/pull/14.patch","issue_url":"https://api.github.com/repos/shapeblue/cloudstack/issues/14","number":14,"state":"open","locked":false,"title":"Retrieve diagnostics (for review purpose)","user":{"login":"DaanHoogland","id":2486961,"node_id":"MDQ6VXNlcjI0ODY5NjE=","avatar_url":"https://avatars1.githubusercontent.com/u/2486961?v=4","gravatar_id":"","url":"https://api.github.com/users/DaanHoogland","html_url":"https://github.com/DaanHoogland","followers_url":"https://api.github.com/users/DaanHoogland/followers","following_url":"https://api.github.com/users/DaanHoogland/following{/other_user}","gists_url":"https://api.github.com/users/DaanHoogland/gists{/gist_id}","starred_url":"https://api.github.com/users/DaanHoogland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DaanHoogland/subscriptions","organizations_url":"https://api.github.com/users/DaanHoogland/orgs","repos_url":"https://api.github.com/users/DaanHoogland/repos","events_url":"https://api.github.com/users/DaanHoogland/events{/privacy}","received_events_url":"https://api.github.com/users/DaanHoogland/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-05-28T11:26:02Z","updated_at":"2018-07-25T09:48:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ab19dfc76f6b57d37eaec71ca8ff7929eb848f69","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14/commits","review_comments_url":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14/comments","review_comment_url":"https://api.github.com/repos/shapeblue/cloudstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/shapeblue/cloudstack/issues/14/comments","statuses_url":"https://api.github.com/repos/shapeblue/cloudstack/statuses/63f6b9ba342c212c07f4d74f6544ebf02054944a","head":{"label":"charles-phiri:retrieve-diagnostics","ref":"retrieve-diagnostics","sha":"63f6b9ba342c212c07f4d74f6544ebf02054944a","user":{"login":"charles-phiri","id":33824577,"node_id":"MDQ6VXNlcjMzODI0NTc3","avatar_url":"https://avatars2.githubusercontent.com/u/33824577?v=4","gravatar_id":"","url":"https://api.github.com/users/charles-phiri","html_url":"https://github.com/charles-phiri","followers_url":"https://api.github.com/users/charles-phiri/followers","following_url":"https://api.github.com/users/charles-phiri/following{/other_user}","gists_url":"https://api.github.com/users/charles-phiri/gists{/gist_id}","starred_url":"https://api.github.com/users/charles-phiri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/charles-phiri/subscriptions","organizations_url":"https://api.github.com/users/charles-phiri/orgs","repos_url":"https://api.github.com/users/charles-phiri/repos","events_url":"https://api.github.com/users/charles-phiri/events{/privacy}","received_events_url":"https://api.github.com/users/charles-phiri/received_events","type":"User","site_admin":false},"repo":{"id":125991839,"node_id":"MDEwOlJlcG9zaXRvcnkxMjU5OTE4Mzk=","name":"cloudstack","full_name":"charles-phiri/cloudstack","owner":{"login":"charles-phiri","id":33824577,"node_id":"MDQ6VXNlcjMzODI0NTc3","avatar_url":"https://avatars2.githubusercontent.com/u/33824577?v=4","gravatar_id":"","url":"https://api.github.com/users/charles-phiri","html_url":"https://github.com/charles-phiri","followers_url":"https://api.github.com/users/charles-phiri/followers","following_url":"https://api.github.com/users/charles-phiri/following{/other_user}","gists_url":"https://api.github.com/users/charles-phiri/gists{/gist_id}","starred_url":"https://api.github.com/users/charles-phiri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/charles-phiri/subscriptions","organizations_url":"https://api.github.com/users/charles-phiri/orgs","repos_url":"https://api.github.com/users/charles-phiri/repos","events_url":"https://api.github.com/users/charles-phiri/events{/privacy}","received_events_url":"https://api.github.com/users/charles-phiri/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/charles-phiri/cloudstack","description":"Mirror of Apache Cloudstack","fork":true,"url":"https://api.github.com/repos/charles-phiri/cloudstack","forks_url":"https://api.github.com/repos/charles-phiri/cloudstack/forks","keys_url":"https://api.github.com/repos/charles-phiri/cloudstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/charles-phiri/cloudstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/charles-phiri/cloudstack/teams","hooks_url":"https://api.github.com/repos/charles-phiri/cloudstack/hooks","issue_events_url":"https://api.github.com/repos/charles-phiri/cloudstack/issues/events{/number}","events_url":"https://api.github.com/repos/charles-phiri/cloudstack/events","assignees_url":"https://api.github.com/repos/charles-phiri/cloudstack/assignees{/user}","branches_url":"https://api.github.com/repos/charles-phiri/cloudstack/branches{/branch}","tags_url":"https://api.github.com/repos/charles-phiri/cloudstack/tags","blobs_url":"https://api.github.com/repos/charles-phiri/cloudstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/charles-phiri/cloudstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/charles-phiri/cloudstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/charles-phiri/cloudstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/charles-phiri/cloudstack/statuses/{sha}","languages_url":"https://api.github.com/repos/charles-phiri/cloudstack/languages","stargazers_url":"https://api.github.com/repos/charles-phiri/cloudstack/stargazers","contributors_url":"https://api.github.com/repos/charles-phiri/cloudstack/contributors","subscribers_url":"https://api.github.com/repos/charles-phiri/cloudstack/subscribers","subscription_url":"https://api.github.com/repos/charles-phiri/cloudstack/subscription","commits_url":"https://api.github.com/repos/charles-phiri/cloudstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/charles-phiri/cloudstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/charles-phiri/cloudstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/charles-phiri/cloudstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/charles-phiri/cloudstack/contents/{+path}","compare_url":"https://api.github.com/repos/charles-phiri/cloudstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/charles-phiri/cloudstack/merges","archive_url":"https://api.github.com/repos/charles-phiri/cloudstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/charles-phiri/cloudstack/downloads","issues_url":"https://api.github.com/repos/charles-phiri/cloudstack/issues{/number}","pulls_url":"https://api.github.com/repos/charles-phiri/cloudstack/pulls{/number}","milestones_url":"https://api.github.com/repos/charles-phiri/cloudstack/milestones{/number}","notifications_url":"https://api.github.com/repos/charles-phiri/cloudstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/charles-phiri/cloudstack/labels{/name}","releases_url":"https://api.github.com/repos/charles-phiri/cloudstack/releases{/id}","deployments_url":"https://api.github.com/repos/charles-phiri/cloudstack/deployments","created_at":"2018-03-20T09:21:17Z","updated_at":"2018-05-17T10:06:21Z","pushed_at":"2018-07-25T08:03:40Z","git_url":"git://github.com/charles-phiri/cloudstack.git","ssh_url":"git@github.com:charles-phiri/cloudstack.git","clone_url":"https://github.com/charles-phiri/cloudstack.git","svn_url":"https://github.com/charles-phiri/cloudstack","homepage":null,"size":525642,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"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":"shapeblue:master","ref":"master","sha":"9fb36e7c73f647d137cda8c480ac67c097cba11a","user":{"login":"shapeblue","id":6001764,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYwMDE3NjQ=","avatar_url":"https://avatars1.githubusercontent.com/u/6001764?v=4","gravatar_id":"","url":"https://api.github.com/users/shapeblue","html_url":"https://github.com/shapeblue","followers_url":"https://api.github.com/users/shapeblue/followers","following_url":"https://api.github.com/users/shapeblue/following{/other_user}","gists_url":"https://api.github.com/users/shapeblue/gists{/gist_id}","starred_url":"https://api.github.com/users/shapeblue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shapeblue/subscriptions","organizations_url":"https://api.github.com/users/shapeblue/orgs","repos_url":"https://api.github.com/users/shapeblue/repos","events_url":"https://api.github.com/users/shapeblue/events{/privacy}","received_events_url":"https://api.github.com/users/shapeblue/received_events","type":"Organization","site_admin":false},"repo":{"id":35481491,"node_id":"MDEwOlJlcG9zaXRvcnkzNTQ4MTQ5MQ==","name":"cloudstack","full_name":"shapeblue/cloudstack","owner":{"login":"shapeblue","id":6001764,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYwMDE3NjQ=","avatar_url":"https://avatars1.githubusercontent.com/u/6001764?v=4","gravatar_id":"","url":"https://api.github.com/users/shapeblue","html_url":"https://github.com/shapeblue","followers_url":"https://api.github.com/users/shapeblue/followers","following_url":"https://api.github.com/users/shapeblue/following{/other_user}","gists_url":"https://api.github.com/users/shapeblue/gists{/gist_id}","starred_url":"https://api.github.com/users/shapeblue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shapeblue/subscriptions","organizations_url":"https://api.github.com/users/shapeblue/orgs","repos_url":"https://api.github.com/users/shapeblue/repos","events_url":"https://api.github.com/users/shapeblue/events{/privacy}","received_events_url":"https://api.github.com/users/shapeblue/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/shapeblue/cloudstack","description":"The upstream repository is at http://github.com/apache/cloudstack. This is ShapeBlue's support/patch branches and Apache CloudStack™ backup","fork":true,"url":"https://api.github.com/repos/shapeblue/cloudstack","forks_url":"https://api.github.com/repos/shapeblue/cloudstack/forks","keys_url":"https://api.github.com/repos/shapeblue/cloudstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/shapeblue/cloudstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/shapeblue/cloudstack/teams","hooks_url":"https://api.github.com/repos/shapeblue/cloudstack/hooks","issue_events_url":"https://api.github.com/repos/shapeblue/cloudstack/issues/events{/number}","events_url":"https://api.github.com/repos/shapeblue/cloudstack/events","assignees_url":"https://api.github.com/repos/shapeblue/cloudstack/assignees{/user}","branches_url":"https://api.github.com/repos/shapeblue/cloudstack/branches{/branch}","tags_url":"https://api.github.com/repos/shapeblue/cloudstack/tags","blobs_url":"https://api.github.com/repos/shapeblue/cloudstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/shapeblue/cloudstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/shapeblue/cloudstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/shapeblue/cloudstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/shapeblue/cloudstack/statuses/{sha}","languages_url":"https://api.github.com/repos/shapeblue/cloudstack/languages","stargazers_url":"https://api.github.com/repos/shapeblue/cloudstack/stargazers","contributors_url":"https://api.github.com/repos/shapeblue/cloudstack/contributors","subscribers_url":"https://api.github.com/repos/shapeblue/cloudstack/subscribers","subscription_url":"https://api.github.com/repos/shapeblue/cloudstack/subscription","commits_url":"https://api.github.com/repos/shapeblue/cloudstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/shapeblue/cloudstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/shapeblue/cloudstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/shapeblue/cloudstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/shapeblue/cloudstack/contents/{+path}","compare_url":"https://api.github.com/repos/shapeblue/cloudstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/shapeblue/cloudstack/merges","archive_url":"https://api.github.com/repos/shapeblue/cloudstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/shapeblue/cloudstack/downloads","issues_url":"https://api.github.com/repos/shapeblue/cloudstack/issues{/number}","pulls_url":"https://api.github.com/repos/shapeblue/cloudstack/pulls{/number}","milestones_url":"https://api.github.com/repos/shapeblue/cloudstack/milestones{/number}","notifications_url":"https://api.github.com/repos/shapeblue/cloudstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/shapeblue/cloudstack/labels{/name}","releases_url":"https://api.github.com/repos/shapeblue/cloudstack/releases{/id}","deployments_url":"https://api.github.com/repos/shapeblue/cloudstack/deployments","created_at":"2015-05-12T10:22:21Z","updated_at":"2018-07-25T09:43:10Z","pushed_at":"2018-07-25T09:42:46Z","git_url":"git://github.com/shapeblue/cloudstack.git","ssh_url":"git@github.com:shapeblue/cloudstack.git","clone_url":"https://github.com/shapeblue/cloudstack.git","svn_url":"https://github.com/shapeblue/cloudstack","homepage":"http://shapeblue.com/packages","size":539896,"stargazers_count":3,"watchers_count":3,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":4,"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":2,"open_issues":4,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14"},"html":{"href":"https://github.com/shapeblue/cloudstack/pull/14"},"issue":{"href":"https://api.github.com/repos/shapeblue/cloudstack/issues/14"},"comments":{"href":"https://api.github.com/repos/shapeblue/cloudstack/issues/14/comments"},"review_comments":{"href":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14/comments"},"review_comment":{"href":"https://api.github.com/repos/shapeblue/cloudstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/shapeblue/cloudstack/pulls/14/commits"},"statuses":{"href":"https://api.github.com/repos/shapeblue/cloudstack/statuses/63f6b9ba342c212c07f4d74f6544ebf02054944a"}},"author_association":"NONE"}}
{"actor":{"display_login":"DaanHoogland"}}