{"action":"created","comment":{"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/comments/55144757","id":55144757,"diff_hunk":"@@ -1,164 +1,370 @@\n-########\n-# Copyright (c) 2015 GigaSpaces Technologies Ltd. All rights reserved\n+# #######\n+# Copyright (c) 2016 GigaSpaces Technologies Ltd. All rights reserved\n #\n # Licensed under the Apache License, Version 2.0 (the \"License\");\n # you may not use this file except in compliance with the License.\n # You may obtain a copy of the License at\n #\n-# http://www.apache.org/licenses/LICENSE-2.0\n+#        http://www.apache.org/licenses/LICENSE-2.0\n #\n # Unless required by applicable law or agreed to in writing, software\n # distributed under the License is distributed on an \"AS IS\" BASIS,\n-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n-# * See the License for the specific language governing permissions and\n-# * limitations under the License.\n+#    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+#    * See the License for the specific language governing permissions and\n+#    * limitations under the License.\n+'''\n+    cloudify_hostpool.rest.backend\n+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+    RESTful service backend methods\n+'''\n \n+from copy import deepcopy\n+from collections import Mapping\n import filelock\n-import uuid\n-import os\n+import logging\n+import socket\n \n-from cloudify_hostpool.hosts import scan\n-from cloudify_hostpool.storage import sqlite\n-from cloudify_hostpool.config import yaml_pool\n-from cloudify_hostpool import exceptions\n+# Used for IP / CIDR routines\n+from netaddr import IPNetwork\n+from netaddr.core import AddrFormatError\n \n+from cloudify_hostpool import constants\n+from cloudify_hostpool.storage.tinydb_nosql import Database\n+from cloudify_hostpool import exceptions\n \n # we currently don't expose these in the configuration because its somewhat\n # internal. perhaps at a later time we can have this configurable, at which\n # point we need to define the semantics of how to initialize the components.\n+FLOCK = filelock.FileLock('host-pool-backend.lock')\n \n-FLock = filelock.FileLock('host-pool-backend.lock')\n+# HostAlchemist\n+# - Converts user-provided host entries into a consumable structure\n+# HostReconciler\n+# - Handles any host entry duplication cases\n \n-# if this file exists, loading of the pool will not take place.\n-# note that this means that multiple instances of this application that\n-# execute from the same directory will only load the pool the first\n-# time, and all other instances will use the previously loaded pool.\n-INDICATOR = 'host-pool-loaded-indicator'\n \n+class HostAlchemist(object):\n+    '''Converts user-provided host entries into a consumable structure'''\n+    def __init__(self, config):\n+        self.config = config\n \n-class RestBackend(object):\n+    def parse(self):\n+        '''Performs the config-to-hosts analysis and conversion'''\n+        hosts = []\n+        defaults = self.get_config_defaults()\n+        # Fix defaults\n+        if defaults.get('platform'):\n+            del defaults['platform']\n+        if defaults.get('endpoint', dict()).get('ip'):\n+            del defaults['endpoint']['ip']\n+        # Validate the defaults\n+        self.validate_defaults(defaults)\n+        # Build an extended list of hosts\n+        for host in self.get_config_hosts():\n+            # Merge defaults into hosts\n+            self.impose_defaults(host, defaults)\n+            # Soft-validate the base host\n+            self.validate_host(host, check_ip_range=False)\n+            hip = IPNetwork(host['endpoint']['ip'])\n+            hname = host['name']\n+            if len(list(hip)) > 1:\n+                # This is an IP address range endpoint\n+                for idx, sip in enumerate(list(hip)):\n+                    shost = deepcopy(host)\n+                    shost['endpoint']['ip'] = str(sip)\n+                    if hname:\n+                        shost['name'] = '{0}_{1}'.format(hname, idx)\n+                    hosts.append(shost)\n+            else:\n+                # This is a single IP endpoint\n+                host['endpoint']['ip'] = str(list(hip)[0])\n+                hosts.append(host)\n+        # Post-process hosts\n+        for host in hosts:\n+            # Add in backend details\n+            host['allocated'] = False\n+            host['alive'] = False\n+            # Validate the extended hosts list\n+            self.validate_host(host)\n+        return hosts\n \n-    def __init__(self, pool, storage=None):\n-        self.storage = sqlite.SQLiteStorage(storage)\n-        # allow only one process to do the initial load\n+    def get_config_defaults(self):\n+        '''Returns the default config'''\n+        return self.config.get('default', {})\n \n-        def _create_indicator():\n-            fd = os.open(INDICATOR, os.O_WRONLY |\n-                         os.O_CREAT | os.O_EXCL, 0600)\n-            os.close(fd)\n+    def get_config_hosts(self):\n+        '''Returns the hosts config'''\n+        return self.config.get('hosts', [])\n \n-        with FLock:\n-            if not os.path.exists(INDICATOR):\n-                self._load_pool(pool)\n-                _create_indicator()\n+    @staticmethod\n+    def validate_defaults(defaults):\n+        '''Validates default data'''\n+        if not defaults:\n+            return\n+        if not isinstance(defaults, dict):\n+            raise exceptions.ConfigurationError(\n+                'Defaults must be a valid JSON Object')\n+        if defaults.get('platform'):\n+            raise exceptions.ConfigurationError(\n+                'Default \"platform\" is not allowed')\n+        if defaults.get('endpoint') and \\","path":"cloudify_hostpool/rest/backend.py","position":140,"original_position":140,"commit_id":"f4151f5e03e0cbb499f44a3c6447db0902e2081f","original_commit_id":"f4151f5e03e0cbb499f44a3c6447db0902e2081f","user":{"login":"EarthmanT","id":9653571,"avatar_url":"https://avatars.githubusercontent.com/u/9653571?v=3","gravatar_id":"","url":"https://api.github.com/users/EarthmanT","html_url":"https://github.com/EarthmanT","followers_url":"https://api.github.com/users/EarthmanT/followers","following_url":"https://api.github.com/users/EarthmanT/following{/other_user}","gists_url":"https://api.github.com/users/EarthmanT/gists{/gist_id}","starred_url":"https://api.github.com/users/EarthmanT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EarthmanT/subscriptions","organizations_url":"https://api.github.com/users/EarthmanT/orgs","repos_url":"https://api.github.com/users/EarthmanT/repos","events_url":"https://api.github.com/users/EarthmanT/events{/privacy}","received_events_url":"https://api.github.com/users/EarthmanT/received_events","type":"User","site_admin":false},"body":"i don't think this can ever happen either. see line 58","created_at":"2016-03-06T17:41:42Z","updated_at":"2016-03-06T17:41:42Z","html_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service/pull/58#discussion_r55144757","pull_request_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58","_links":{"self":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/comments/55144757"},"html":{"href":"https://github.com/cloudify-cosmo/cloudify-host-pool-service/pull/58#discussion_r55144757"},"pull_request":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58"}}},"pull_request":{"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58","id":61843959,"html_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service/pull/58","diff_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service/pull/58.diff","patch_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service/pull/58.patch","issue_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/58","number":58,"state":"open","locked":false,"title":"Multiple updates (multi-OS pool, service logging, exception handling,…","user":{"login":"EarthmanT","id":9653571,"avatar_url":"https://avatars.githubusercontent.com/u/9653571?v=3","gravatar_id":"","url":"https://api.github.com/users/EarthmanT","html_url":"https://github.com/EarthmanT","followers_url":"https://api.github.com/users/EarthmanT/followers","following_url":"https://api.github.com/users/EarthmanT/following{/other_user}","gists_url":"https://api.github.com/users/EarthmanT/gists{/gist_id}","starred_url":"https://api.github.com/users/EarthmanT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EarthmanT/subscriptions","organizations_url":"https://api.github.com/users/EarthmanT/orgs","repos_url":"https://api.github.com/users/EarthmanT/repos","events_url":"https://api.github.com/users/EarthmanT/events{/privacy}","received_events_url":"https://api.github.com/users/EarthmanT/received_events","type":"User","site_admin":false},"body":"… new API endpoints)\r\n\r\nMultiple updates (multi-OS pool, service logging, exception handling, new API endpoints)\r\n\r\nTesting REST updates\r\n\r\nTesting REST updates\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing accidental pushes\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixed service issue\r\n\r\nFixed service issue\r\n\r\nFixed tests\r\n\r\nFixing tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nFixing tests\r\n\r\nFixing tests\r\n\r\nRemoving requirement for config YAML file\r\n\r\nFixing working_directory input\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\nUpdating API request data support\r\n\r\nFixed tests\r\n\r\nFixed defaults issue\r\n\r\nAdding update functionality\r\n\r\nAll tests are now passing\r\n\r\nChanging how keys are added\r\n\r\nTesting new service logger\r\n\r\nTesting new service logger\r\n\r\nAdded Flask, Gunicorn logging\r\n\r\nSimplifying host scanning\r\n\r\nAdded flast-restful exception handling\r\n\r\nAdding tcp scan info\r\n\r\nPreparing for merge\r\n\r\nCFY-4959 - Rewrote API server, added service logging, changed backend to TinyDB, added mixed-OS pool support.\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nAdding init script, debug loggers, and new lifecycle scripts\r\n\r\nAdded logger test. Fixed exception handling\r\n\r\nFixing styling & exception handling\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing accidental pushes\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixed service issue\r\n\r\nFixing tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nRemoving requirement for config YAML file\r\n\r\nFixing working_directory input\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\nFixed defaults issue\r\n\r\nTesting new service logger\r\n\r\nAdded flast-restful exception handling\r\n\r\nAdding tcp scan info\r\n\r\nPreparing for merge\r\n\r\nFixed broken POST /host/allocate with OS specified.  Fixed case where host is allocated but scanning fails.\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nAdding init script, debug loggers, and new lifecycle scripts\r\n\r\nAdded logger test. Fixed exception handling\r\n\r\nFixing styling & exception handling\r\n\r\nTesting REST updates\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing accidental pushes\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixed service issue\r\n\r\nFixed service issue\r\n\r\nFixed tests\r\n\r\nFixing tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nFixing tests\r\n\r\nFixing tests\r\n\r\nRemoving requirement for config YAML file\r\n\r\nFixing working_directory input\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\nUpdating API request data support\r\n\r\nFixed tests\r\n\r\nFixed defaults issue\r\n\r\nAdding update functionality\r\n\r\nAll tests are now passing\r\n\r\nChanging how keys are added\r\n\r\nTesting new service logger\r\n\r\nTesting new service logger\r\n\r\nAdded Flask, Gunicorn logging\r\n\r\nSimplifying host scanning\r\n\r\nAdded flast-restful exception handling\r\n\r\nAdding tcp scan info\r\n\r\nPreparing for merge\r\n\r\nCFY-4959 - Rewrote API server, added service logging, changed backend to TinyDB, added mixed-OS pool support.\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing accidental pushes\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixed service issue\r\n\r\nFixed tests\r\n\r\nFixing tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nRemoving requirement for config YAML file\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\nFixed defaults issue\r\n\r\nAll tests are now passing\r\n\r\nTesting new service logger\r\n\r\nTesting new service logger\r\n\r\nAdded flast-restful exception handling\r\n\r\nAdding tcp scan info\r\n\r\nPreparing for merge\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nAdding init script, debug loggers, and new lifecycle scripts\r\n\r\nAdded logger test. Fixed exception handling\r\n\r\nFixing styling & exception handling\r\n\r\nAdded init script, debug loggers, new lifecycle scripts, and logger test\r\n\r\nFixing tests, updating test package versions\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nAdding init script, debug loggers, and new lifecycle scripts\r\n\r\nAdded logger test. Fixed exception handling\r\n\r\nFixing styling & exception handling\r\n\r\nAdded init script, debug loggers, new lifecycle scripts, and logger test\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nAdding init script, debug loggers, and new lifecycle scripts\r\n\r\nAdded logger test. Fixed exception handling\r\n\r\nFixing styling & exception handling\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nAdding init script, debug loggers, and new lifecycle scripts\r\n\r\nAdded logger test. Fixed exception handling\r\n\r\nFixing styling & exception handling\r\n\r\nAdded init script, debug loggers, new lifecycle scripts, and logger test\r\n\r\nFixing tests, updating test package versions\r\n\r\nAdding init script, debug loggers, and new lifecycle scripts\r\n\r\nAdded logger test. Fixed exception handling\r\n\r\nFixing styling & exception handling\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nTesting REST updates\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing service liveness test\r\n\r\nFixing accidental pushes\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixed service issue\r\n\r\nFixed service issue\r\n\r\nFixed tests\r\n\r\nFixing tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nFixing tests\r\n\r\nFixing tests\r\n\r\nRemoving requirement for config YAML file\r\n\r\nFixing working_directory input\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\nUpdating API request data support\r\n\r\nFixed tests\r\n\r\nFixed defaults issue\r\n\r\nAdding update functionality\r\n\r\nAll tests are now passing\r\n\r\nChanging how keys are added\r\n\r\nTesting new service logger\r\n\r\nTesting new service logger\r\n\r\nAdded Flask, Gunicorn logging\r\n\r\nSimplifying host scanning\r\n\r\nAdded flast-restful exception handling\r\n\r\nAdding tcp scan info\r\n\r\nPreparing for merge\r\n\r\nCFY-4959 - Rewrote API server, added service logging, changed backend to TinyDB, added mixed-OS pool support.\r\n\r\nadd build auto-creation on new tag\r\n\r\nFixing tests, updating test package versions\r\n\r\nFixing service liveness test\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixing VIRTUALENV search\r\n\r\nFixed service issue\r\n\r\nFixed tests\r\n\r\nFixing tests\r\n\r\nReworking service, tests\r\n\r\nReworking service, tests\r\n\r\nRemoving requirement for config YAML file\r\n\r\nFixing working_directory input\r\n\r\ncreating non-daemon service option\r\n\r\ncreating non-daemon service option\r\n\r\nFixed defaults issue\r\n\r\nTesting new service logger\r\n\r\nTesting new service logger\r\n\r\nAdded flast-restful exception handling\r\n\r\nAdding tcp scan info\r\n\r\nPreparing for merge\r\n\r\nFixed broken POST /host/allocate with OS specified.  Fixed case where host is allocated but scanning fails.\r\n\r\nFixing tests\r\n\r\nFixed missing info from problem squash","created_at":"2016-03-06T14:23:36Z","updated_at":"2016-03-06T17:41:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dcee8c32940e0294580bd3224dda99fa145cdc04","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58/commits","review_comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58/comments","review_comment_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/58/comments","statuses_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/statuses/f4151f5e03e0cbb499f44a3c6447db0902e2081f","head":{"label":"cloudify-cosmo:CFY-4959","ref":"CFY-4959","sha":"f4151f5e03e0cbb499f44a3c6447db0902e2081f","user":{"login":"cloudify-cosmo","id":6260555,"avatar_url":"https://avatars.githubusercontent.com/u/6260555?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudify-cosmo","html_url":"https://github.com/cloudify-cosmo","followers_url":"https://api.github.com/users/cloudify-cosmo/followers","following_url":"https://api.github.com/users/cloudify-cosmo/following{/other_user}","gists_url":"https://api.github.com/users/cloudify-cosmo/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudify-cosmo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudify-cosmo/subscriptions","organizations_url":"https://api.github.com/users/cloudify-cosmo/orgs","repos_url":"https://api.github.com/users/cloudify-cosmo/repos","events_url":"https://api.github.com/users/cloudify-cosmo/events{/privacy}","received_events_url":"https://api.github.com/users/cloudify-cosmo/received_events","type":"Organization","site_admin":false},"repo":{"id":29589622,"name":"cloudify-host-pool-service","full_name":"cloudify-cosmo/cloudify-host-pool-service","owner":{"login":"cloudify-cosmo","id":6260555,"avatar_url":"https://avatars.githubusercontent.com/u/6260555?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudify-cosmo","html_url":"https://github.com/cloudify-cosmo","followers_url":"https://api.github.com/users/cloudify-cosmo/followers","following_url":"https://api.github.com/users/cloudify-cosmo/following{/other_user}","gists_url":"https://api.github.com/users/cloudify-cosmo/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudify-cosmo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudify-cosmo/subscriptions","organizations_url":"https://api.github.com/users/cloudify-cosmo/orgs","repos_url":"https://api.github.com/users/cloudify-cosmo/repos","events_url":"https://api.github.com/users/cloudify-cosmo/events{/privacy}","received_events_url":"https://api.github.com/users/cloudify-cosmo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service","description":"host-pool service, used with the Cloudify host-pool plugin","fork":false,"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service","forks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/forks","keys_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/teams","hooks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/hooks","issue_events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/events{/number}","events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/events","assignees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/assignees{/user}","branches_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/branches{/branch}","tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/tags","blobs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/languages","stargazers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/stargazers","contributors_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/contributors","subscribers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/subscribers","subscription_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/subscription","commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/contents/{+path}","compare_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/merges","archive_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/downloads","issues_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues{/number}","pulls_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/labels{/name}","releases_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/releases{/id}","deployments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/deployments","created_at":"2015-01-21T13:00:36Z","updated_at":"2016-02-14T12:21:55Z","pushed_at":"2016-03-06T14:23:38Z","git_url":"git://github.com/cloudify-cosmo/cloudify-host-pool-service.git","ssh_url":"git@github.com:cloudify-cosmo/cloudify-host-pool-service.git","clone_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service.git","svn_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service","homepage":"","size":1570,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":3,"forks":4,"open_issues":3,"watchers":0,"default_branch":"master"}},"base":{"label":"cloudify-cosmo:master","ref":"master","sha":"1a581bd4c2cd01e1b21e0ce5e051dc3ede540e14","user":{"login":"cloudify-cosmo","id":6260555,"avatar_url":"https://avatars.githubusercontent.com/u/6260555?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudify-cosmo","html_url":"https://github.com/cloudify-cosmo","followers_url":"https://api.github.com/users/cloudify-cosmo/followers","following_url":"https://api.github.com/users/cloudify-cosmo/following{/other_user}","gists_url":"https://api.github.com/users/cloudify-cosmo/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudify-cosmo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudify-cosmo/subscriptions","organizations_url":"https://api.github.com/users/cloudify-cosmo/orgs","repos_url":"https://api.github.com/users/cloudify-cosmo/repos","events_url":"https://api.github.com/users/cloudify-cosmo/events{/privacy}","received_events_url":"https://api.github.com/users/cloudify-cosmo/received_events","type":"Organization","site_admin":false},"repo":{"id":29589622,"name":"cloudify-host-pool-service","full_name":"cloudify-cosmo/cloudify-host-pool-service","owner":{"login":"cloudify-cosmo","id":6260555,"avatar_url":"https://avatars.githubusercontent.com/u/6260555?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudify-cosmo","html_url":"https://github.com/cloudify-cosmo","followers_url":"https://api.github.com/users/cloudify-cosmo/followers","following_url":"https://api.github.com/users/cloudify-cosmo/following{/other_user}","gists_url":"https://api.github.com/users/cloudify-cosmo/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudify-cosmo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudify-cosmo/subscriptions","organizations_url":"https://api.github.com/users/cloudify-cosmo/orgs","repos_url":"https://api.github.com/users/cloudify-cosmo/repos","events_url":"https://api.github.com/users/cloudify-cosmo/events{/privacy}","received_events_url":"https://api.github.com/users/cloudify-cosmo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service","description":"host-pool service, used with the Cloudify host-pool plugin","fork":false,"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service","forks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/forks","keys_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/teams","hooks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/hooks","issue_events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/events{/number}","events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/events","assignees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/assignees{/user}","branches_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/branches{/branch}","tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/tags","blobs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/languages","stargazers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/stargazers","contributors_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/contributors","subscribers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/subscribers","subscription_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/subscription","commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/contents/{+path}","compare_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/merges","archive_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/downloads","issues_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues{/number}","pulls_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/labels{/name}","releases_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/releases{/id}","deployments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/deployments","created_at":"2015-01-21T13:00:36Z","updated_at":"2016-02-14T12:21:55Z","pushed_at":"2016-03-06T14:23:38Z","git_url":"git://github.com/cloudify-cosmo/cloudify-host-pool-service.git","ssh_url":"git@github.com:cloudify-cosmo/cloudify-host-pool-service.git","clone_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service.git","svn_url":"https://github.com/cloudify-cosmo/cloudify-host-pool-service","homepage":"","size":1570,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":3,"forks":4,"open_issues":3,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58"},"html":{"href":"https://github.com/cloudify-cosmo/cloudify-host-pool-service/pull/58"},"issue":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/58"},"comments":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/issues/58/comments"},"review_comments":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58/comments"},"review_comment":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/pulls/58/commits"},"statuses":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-host-pool-service/statuses/f4151f5e03e0cbb499f44a3c6447db0902e2081f"}}}}