{"action":"created","comment":{"url":"https://api.github.com/repos/apache/cloudstack/pulls/comments/39904007","id":39904007,"diff_hunk":"@@ -152,53 +226,181 @@ public NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd) {\n             throw new CloudRuntimeException(\"A NuageVsp device is already configured on this physical network\");\n         }\n \n-        Map<String, String> params = new HashMap<String, String>();\n-        params.put(\"guid\", UUID.randomUUID().toString());\n-        params.put(\"zoneId\", String.valueOf(physicalNetwork.getDataCenterId()));\n-        params.put(\"physicalNetworkId\", String.valueOf(physicalNetwork.getId()));\n-        params.put(\"name\", \"Nuage VSD - \" + cmd.getHostName());\n-        params.put(\"hostname\", cmd.getHostName());\n-        params.put(\"cmsuser\", cmd.getUserName());\n-        String cmsUserPasswordBase64 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(cmd.getPassword().getBytes(Charset.forName(\"UTF-8\"))));\n-        params.put(\"cmsuserpass\", cmsUserPasswordBase64);\n-        int port = cmd.getPort();\n-        if (0 == port) {\n-            port = 443;\n-        }\n-        params.put(\"port\", String.valueOf(port));\n-        params.put(\"apirelativepath\", \"/nuage/api/\" + cmd.getApiVersion());\n-        params.put(\"retrycount\", String.valueOf(cmd.getApiRetryCount()));\n-        params.put(\"retryinterval\", String.valueOf(cmd.getApiRetryInterval()));\n+        try {\n+            NuageVspPluginClientLoader clientLoader = NuageVspPluginClientLoader.getClientLoader(null, null, 1, 1, null);\n \n-        Map<String, Object> hostdetails = new HashMap<String, Object>();\n-        hostdetails.putAll(params);\n+            Map<String, Object> clientDefaults = clientLoader.getNuageVspManagerClient().getClientDefaults();\n+            String apiVersion = Objects.firstNonNull(cmd.getApiVersion(), (String) clientDefaults.get(\"CURRENT_API_VERSION\"));\n+            if (!clientLoader.getNuageVspManagerClient().isSupportedApiVersion(apiVersion)) {\n+                throw new CloudRuntimeException(\"Unsupported API version : \" + apiVersion);\n+            }\n \n-        try {\n+            Map<String, String> params = new HashMap<String, String>();\n+            params.put(\"guid\", UUID.randomUUID().toString());\n+            params.put(\"zoneId\", String.valueOf(physicalNetwork.getDataCenterId()));\n+            params.put(\"physicalNetworkId\", String.valueOf(physicalNetwork.getId()));\n+            params.put(\"name\", \"Nuage VSD - \" + cmd.getHostName());\n+            params.put(\"hostname\", cmd.getHostName());\n+            params.put(\"cmsuser\", cmd.getUserName());\n+            String cmsUserPasswordBase64 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(cmd.getPassword().getBytes()));\n+            params.put(\"cmsuserpass\", cmsUserPasswordBase64);\n+            int port = cmd.getPort();\n+            if (0 == port) {\n+                port = 8443;\n+            }\n+            params.put(\"port\", String.valueOf(port));\n+            params.put(\"apiversion\", apiVersion);\n+            params.put(\"apirelativepath\", \"/nuage/api/\" + apiVersion);\n+            params.put(\"retrycount\", String.valueOf(Objects.firstNonNull(cmd.getApiRetryCount(), clientDefaults.get(\"DEFAULT_API_RETRY_COUNT\"))));\n+            params.put(\"retryinterval\", String.valueOf(Objects.firstNonNull(cmd.getApiRetryInterval(), clientDefaults.get(\"DEFAULT_API_RETRY_INTERVAL\"))));\n+\n+            final Map<String, Object> hostdetails = new HashMap<String, Object>();\n+            hostdetails.putAll(params);\n             resource.configure(cmd.getHostName(), hostdetails);\n \n-            final Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.L2Networking, params);\n+            Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.L2Networking, params);\n             if (host != null) {\n-                return Transaction.execute(new TransactionCallback<NuageVspDeviceVO>() {\n-                    @Override\n-                    public NuageVspDeviceVO doInTransaction(TransactionStatus status) {\n-                        NuageVspDeviceVO nuageVspDevice = new NuageVspDeviceVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), deviceName);\n-                        _nuageVspDao.persist(nuageVspDevice);\n-\n-                        DetailVO detail = new DetailVO(host.getId(), \"nuagevspdeviceid\", String.valueOf(nuageVspDevice.getId()));\n-                        _hostDetailsDao.persist(detail);\n-\n-                        return nuageVspDevice;\n-                    }\n-                });\n+                NuageVspDeviceVO nuageVspDevice = new NuageVspDeviceVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), deviceName);\n+                _nuageVspDao.persist(nuageVspDevice);\n+\n+                DetailVO detail = new DetailVO(host.getId(), \"nuagevspdeviceid\", String.valueOf(nuageVspDevice.getId()));\n+                _hostDetailsDao.persist(detail);\n+\n+                ConfigurationVO cmsIdConfig = _configDao.findByName(\"nuagevsp.cms.id\");\n+                host = findNuageVspHost(nuageVspDevice.getHostId());\n+                SyncNuageVspCmsIdCommand syncCmd = new SyncNuageVspCmsIdCommand(SyncType.REGISTER, null);\n+                SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) _agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd);\n+                if (answer != null && answer.getSuccess()) {\n+                    registerNewNuageVspDevice(cmsIdConfig, nuageVspDevice.getId() + \":\" + answer.getNuageVspCmsId());\n+\n+                    detail = new DetailVO(host.getId(), \"nuagevspcmsid\", answer.getNuageVspCmsId());\n+                    _hostDetailsDao.persist(detail);\n+                    hostdetails.put(\"nuagevspcmsid\", answer.getNuageVspCmsId());\n+                    resource.configure((String) hostdetails.get(\"hostname\"), hostdetails);\n+\n+                    auditDomainsOnVsp((HostVO) host, true, false);\n+                } else {\n+                    throw new CloudRuntimeException(\"Failed to register CMS ID\");\n+                }\n+                return nuageVspDevice;\n             } else {\n                 throw new CloudRuntimeException(\"Failed to add Nuage Vsp Device due to internal error.\");\n             }\n-        } catch (ConfigurationException e) {\n+        } catch (Exception e) {\n             throw new CloudRuntimeException(e.getMessage());\n         }\n     }\n \n     @Override\n+    public NuageVspDeviceVO updateNuageVspDevice(UpdateNuageVspDeviceCmd command) {\n+        ServerResource resource = new NuageVspResource();\n+        final String deviceName = Network.Provider.NuageVsp.getName();\n+        ExternalNetworkDeviceManager.NetworkDevice networkDevice = ExternalNetworkDeviceManager.NetworkDevice.getNetworkDevice(deviceName);\n+        final Long physicalNetworkId = command.getPhysicalNetworkId();\n+        PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);\n+        if (physicalNetwork == null) {\n+            throw new InvalidParameterValueException(\"Could not find phyical network with ID: \" + physicalNetworkId);\n+        }\n+\n+        final PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(physicalNetwork.getId(),\n+                networkDevice.getNetworkServiceProvder());\n+        if (ntwkSvcProvider == null) {\n+            throw new CloudRuntimeException(\"Network Service Provider: \" + networkDevice.getNetworkServiceProvder() + \" is not enabled in the physical network: \"\n+                    + physicalNetworkId + \"to add this device\");\n+        } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {\n+            throw new CloudRuntimeException(\"Network Service Provider: \" + ntwkSvcProvider.getProviderName() + \" is in shutdown state in the physical network: \"\n+                    + physicalNetworkId + \"to add this device\");\n+        }\n+\n+        HostVO nuageVspHost = null;\n+        NuageVspDeviceVO nuageVspDevice = null;\n+        List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);\n+        if (nuageVspDevices == null || nuageVspDevices.size() == 0) {\n+            throw new CloudRuntimeException(\"Nuage VSD is not configured on physical network \" + physicalNetworkId);\n+        } else {\n+            nuageVspDevice = nuageVspDevices.iterator().next();\n+            nuageVspHost = _hostDao.findById(nuageVspDevice.getHostId());\n+            _hostDao.loadDetails(nuageVspHost);\n+        }\n+\n+        Map<String, String> paramsTobeUpdated = new HashMap<String, String>();\n+        if (StringUtils.isNotBlank(command.getHostName()) &&\n+                !command.getHostName().equals(nuageVspHost.getDetails().get(\"hostname\"))) {\n+            paramsTobeUpdated.put(\"name\", \"Nuage VSD - \" + command.getHostName());\n+            paramsTobeUpdated.put(\"hostname\", command.getHostName());\n+        }\n+\n+        if (StringUtils.isNotBlank(command.getUserName()) &&\n+                !command.getUserName().equals(nuageVspHost.getDetails().get(\"cmsuser\"))) {\n+            paramsTobeUpdated.put(\"cmsuser\", command.getUserName());\n+        }\n+\n+        if (StringUtils.isNotBlank(command.getPassword())) {\n+            String encodedNewPassword = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(command.getPassword().getBytes()));\n+            if (!encodedNewPassword.equals(nuageVspHost.getDetails().get(\"cmsuserpass\"))) {\n+                paramsTobeUpdated.put(\"cmsuserpass\", org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(command.getPassword().getBytes())));\n+            }\n+        }\n+\n+        if (command.getPort() != null &&\n+                command.getPort() != Integer.parseInt(nuageVspHost.getDetails().get(\"port\"))) {\n+            paramsTobeUpdated.put(\"port\", String.valueOf(command.getPort()));\n+        }\n+\n+        GetClientDefaultsCommand getClientDefaultsCmd = new GetClientDefaultsCommand();\n+        GetClientDefaultsAnswer getClientDefaultsAnswer = (GetClientDefaultsAnswer) _agentMgr.easySend(nuageVspHost.getId(), getClientDefaultsCmd);\n+        String apiVersion = Objects.firstNonNull(command.getApiVersion(), getClientDefaultsAnswer.getCurrentApiVersion());\n+        SupportedApiVersionCommand supportedApiVersionCmd = new SupportedApiVersionCommand(apiVersion);\n+        SupportedApiVersionAnswer supportedApiVersionAnswer = (SupportedApiVersionAnswer) _agentMgr.easySend(nuageVspHost.getId(), supportedApiVersionCmd);\n+        if (!supportedApiVersionAnswer.getResult()) {\n+            throw new CloudRuntimeException(\"Incorrect API version: Nuage plugin only supports \" + getClientDefaultsAnswer.getCurrentApiVersion());\n+        }\n+\n+        String apiRelativePath = \"/nuage/api/\" + command.getApiVersion();\n+        if (!apiRelativePath.equals(nuageVspHost.getDetails().get(\"apirelativepath\"))) {\n+            paramsTobeUpdated.put(\"apirelativepath\", apiRelativePath);\n+            paramsTobeUpdated.put(\"apiversion\", apiVersion);\n+        }\n+\n+        if (command.getApiRetryCount() != null &&\n+                command.getApiRetryCount() != Integer.parseInt(nuageVspHost.getDetails().get(\"retrycount\"))) {\n+            paramsTobeUpdated.put(\"retrycount\", String.valueOf(command.getApiRetryCount()));\n+        }\n+\n+        if (command.getApiRetryInterval() != null &&\n+                command.getApiRetryInterval() != Integer.parseInt(nuageVspHost.getDetails().get(\"retryinterval\"))) {\n+            paramsTobeUpdated.put(\"retryinterval\", String.valueOf(command.getApiRetryInterval()));\n+        }\n+\n+        if (paramsTobeUpdated.size() > 0) {","path":"plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java","position":405,"original_position":405,"commit_id":"d9530c337614530d7ab54e946d0dd733de4b048e","original_commit_id":"d9530c337614530d7ab54e946d0dd733de4b048e","user":{"login":"jburwell","id":285646,"avatar_url":"https://avatars.githubusercontent.com/u/285646?v=3","gravatar_id":"","url":"https://api.github.com/users/jburwell","html_url":"https://github.com/jburwell","followers_url":"https://api.github.com/users/jburwell/followers","following_url":"https://api.github.com/users/jburwell/following{/other_user}","gists_url":"https://api.github.com/users/jburwell/gists{/gist_id}","starred_url":"https://api.github.com/users/jburwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jburwell/subscriptions","organizations_url":"https://api.github.com/users/jburwell/orgs","repos_url":"https://api.github.com/users/jburwell/repos","events_url":"https://api.github.com/users/jburwell/events{/privacy}","received_events_url":"https://api.github.com/users/jburwell/received_events","type":"User","site_admin":false},"body":"``List#isEmpty()`` is the preferred, idiomatic way to determine that a list is empty.","created_at":"2015-09-18T21:40:36Z","updated_at":"2015-09-18T21:40:36Z","html_url":"https://github.com/apache/cloudstack/pull/801#discussion_r39904007","pull_request_url":"https://api.github.com/repos/apache/cloudstack/pulls/801","_links":{"self":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/comments/39904007"},"html":{"href":"https://github.com/apache/cloudstack/pull/801#discussion_r39904007"},"pull_request":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/801"}}},"pull_request":{"url":"https://api.github.com/repos/apache/cloudstack/pulls/801","id":44755733,"html_url":"https://github.com/apache/cloudstack/pull/801","diff_url":"https://github.com/apache/cloudstack/pull/801.diff","patch_url":"https://github.com/apache/cloudstack/pull/801.patch","issue_url":"https://api.github.com/repos/apache/cloudstack/issues/801","number":801,"state":"open","locked":false,"title":"CLOUDSTACK-8832 : Update Nuage VSP plugin to work with Nuage VSP rele…","user":{"login":"nlivens","id":3336539,"avatar_url":"https://avatars.githubusercontent.com/u/3336539?v=3","gravatar_id":"","url":"https://api.github.com/users/nlivens","html_url":"https://github.com/nlivens","followers_url":"https://api.github.com/users/nlivens/followers","following_url":"https://api.github.com/users/nlivens/following{/other_user}","gists_url":"https://api.github.com/users/nlivens/gists{/gist_id}","starred_url":"https://api.github.com/users/nlivens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nlivens/subscriptions","organizations_url":"https://api.github.com/users/nlivens/orgs","repos_url":"https://api.github.com/users/nlivens/repos","events_url":"https://api.github.com/users/nlivens/events{/privacy}","received_events_url":"https://api.github.com/users/nlivens/received_events","type":"User","site_admin":false},"body":"…ase 3.2","created_at":"2015-09-11T08:00:22Z","updated_at":"2015-09-18T21:40:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0380d80e2cccc1b884b01644394a93cd3bb7d117","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/cloudstack/pulls/801/commits","review_comments_url":"https://api.github.com/repos/apache/cloudstack/pulls/801/comments","review_comment_url":"https://api.github.com/repos/apache/cloudstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/cloudstack/issues/801/comments","statuses_url":"https://api.github.com/repos/apache/cloudstack/statuses/d9530c337614530d7ab54e946d0dd733de4b048e","head":{"label":"nlivens:updated-nuage-vsp-plugin","ref":"updated-nuage-vsp-plugin","sha":"d9530c337614530d7ab54e946d0dd733de4b048e","user":{"login":"nlivens","id":3336539,"avatar_url":"https://avatars.githubusercontent.com/u/3336539?v=3","gravatar_id":"","url":"https://api.github.com/users/nlivens","html_url":"https://github.com/nlivens","followers_url":"https://api.github.com/users/nlivens/followers","following_url":"https://api.github.com/users/nlivens/following{/other_user}","gists_url":"https://api.github.com/users/nlivens/gists{/gist_id}","starred_url":"https://api.github.com/users/nlivens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nlivens/subscriptions","organizations_url":"https://api.github.com/users/nlivens/orgs","repos_url":"https://api.github.com/users/nlivens/repos","events_url":"https://api.github.com/users/nlivens/events{/privacy}","received_events_url":"https://api.github.com/users/nlivens/received_events","type":"User","site_admin":false},"repo":{"id":41410234,"name":"cloudstack","full_name":"nlivens/cloudstack","owner":{"login":"nlivens","id":3336539,"avatar_url":"https://avatars.githubusercontent.com/u/3336539?v=3","gravatar_id":"","url":"https://api.github.com/users/nlivens","html_url":"https://github.com/nlivens","followers_url":"https://api.github.com/users/nlivens/followers","following_url":"https://api.github.com/users/nlivens/following{/other_user}","gists_url":"https://api.github.com/users/nlivens/gists{/gist_id}","starred_url":"https://api.github.com/users/nlivens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nlivens/subscriptions","organizations_url":"https://api.github.com/users/nlivens/orgs","repos_url":"https://api.github.com/users/nlivens/repos","events_url":"https://api.github.com/users/nlivens/events{/privacy}","received_events_url":"https://api.github.com/users/nlivens/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/nlivens/cloudstack","description":"Mirror of Apache Cloudstack","fork":true,"url":"https://api.github.com/repos/nlivens/cloudstack","forks_url":"https://api.github.com/repos/nlivens/cloudstack/forks","keys_url":"https://api.github.com/repos/nlivens/cloudstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nlivens/cloudstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nlivens/cloudstack/teams","hooks_url":"https://api.github.com/repos/nlivens/cloudstack/hooks","issue_events_url":"https://api.github.com/repos/nlivens/cloudstack/issues/events{/number}","events_url":"https://api.github.com/repos/nlivens/cloudstack/events","assignees_url":"https://api.github.com/repos/nlivens/cloudstack/assignees{/user}","branches_url":"https://api.github.com/repos/nlivens/cloudstack/branches{/branch}","tags_url":"https://api.github.com/repos/nlivens/cloudstack/tags","blobs_url":"https://api.github.com/repos/nlivens/cloudstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nlivens/cloudstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nlivens/cloudstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/nlivens/cloudstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nlivens/cloudstack/statuses/{sha}","languages_url":"https://api.github.com/repos/nlivens/cloudstack/languages","stargazers_url":"https://api.github.com/repos/nlivens/cloudstack/stargazers","contributors_url":"https://api.github.com/repos/nlivens/cloudstack/contributors","subscribers_url":"https://api.github.com/repos/nlivens/cloudstack/subscribers","subscription_url":"https://api.github.com/repos/nlivens/cloudstack/subscription","commits_url":"https://api.github.com/repos/nlivens/cloudstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/nlivens/cloudstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/nlivens/cloudstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/nlivens/cloudstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/nlivens/cloudstack/contents/{+path}","compare_url":"https://api.github.com/repos/nlivens/cloudstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nlivens/cloudstack/merges","archive_url":"https://api.github.com/repos/nlivens/cloudstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nlivens/cloudstack/downloads","issues_url":"https://api.github.com/repos/nlivens/cloudstack/issues{/number}","pulls_url":"https://api.github.com/repos/nlivens/cloudstack/pulls{/number}","milestones_url":"https://api.github.com/repos/nlivens/cloudstack/milestones{/number}","notifications_url":"https://api.github.com/repos/nlivens/cloudstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nlivens/cloudstack/labels{/name}","releases_url":"https://api.github.com/repos/nlivens/cloudstack/releases{/id}","created_at":"2015-08-26T07:06:01Z","updated_at":"2015-08-26T07:06:22Z","pushed_at":"2015-09-14T07:50:43Z","git_url":"git://github.com/nlivens/cloudstack.git","ssh_url":"git@github.com:nlivens/cloudstack.git","clone_url":"https://github.com/nlivens/cloudstack.git","svn_url":"https://github.com/nlivens/cloudstack","homepage":null,"size":493041,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"0b73d193684723fca2b936625f3df3dee60de273","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":9759448,"name":"cloudstack","full_name":"apache/cloudstack","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/cloudstack","description":"Mirror of Apache Cloudstack","fork":false,"url":"https://api.github.com/repos/apache/cloudstack","forks_url":"https://api.github.com/repos/apache/cloudstack/forks","keys_url":"https://api.github.com/repos/apache/cloudstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/cloudstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/cloudstack/teams","hooks_url":"https://api.github.com/repos/apache/cloudstack/hooks","issue_events_url":"https://api.github.com/repos/apache/cloudstack/issues/events{/number}","events_url":"https://api.github.com/repos/apache/cloudstack/events","assignees_url":"https://api.github.com/repos/apache/cloudstack/assignees{/user}","branches_url":"https://api.github.com/repos/apache/cloudstack/branches{/branch}","tags_url":"https://api.github.com/repos/apache/cloudstack/tags","blobs_url":"https://api.github.com/repos/apache/cloudstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/cloudstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/cloudstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/cloudstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/cloudstack/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/cloudstack/languages","stargazers_url":"https://api.github.com/repos/apache/cloudstack/stargazers","contributors_url":"https://api.github.com/repos/apache/cloudstack/contributors","subscribers_url":"https://api.github.com/repos/apache/cloudstack/subscribers","subscription_url":"https://api.github.com/repos/apache/cloudstack/subscription","commits_url":"https://api.github.com/repos/apache/cloudstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/cloudstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/cloudstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/cloudstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/cloudstack/contents/{+path}","compare_url":"https://api.github.com/repos/apache/cloudstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/cloudstack/merges","archive_url":"https://api.github.com/repos/apache/cloudstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/cloudstack/downloads","issues_url":"https://api.github.com/repos/apache/cloudstack/issues{/number}","pulls_url":"https://api.github.com/repos/apache/cloudstack/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/cloudstack/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/cloudstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/cloudstack/labels{/name}","releases_url":"https://api.github.com/repos/apache/cloudstack/releases{/id}","created_at":"2013-04-29T22:27:12Z","updated_at":"2015-09-18T00:03:30Z","pushed_at":"2015-09-18T10:25:44Z","git_url":"git://github.com/apache/cloudstack.git","ssh_url":"git@github.com:apache/cloudstack.git","clone_url":"https://github.com/apache/cloudstack.git","svn_url":"https://github.com/apache/cloudstack","homepage":null,"size":757086,"stargazers_count":289,"watchers_count":289,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":371,"mirror_url":"git://git.apache.org/cloudstack.git","open_issues_count":66,"forks":371,"open_issues":66,"watchers":289,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/801"},"html":{"href":"https://github.com/apache/cloudstack/pull/801"},"issue":{"href":"https://api.github.com/repos/apache/cloudstack/issues/801"},"comments":{"href":"https://api.github.com/repos/apache/cloudstack/issues/801/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/801/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/801/commits"},"statuses":{"href":"https://api.github.com/repos/apache/cloudstack/statuses/d9530c337614530d7ab54e946d0dd733de4b048e"}}}}