GitHub PullRequestReviewCommentEvent at 2014-11-21 15:14:12
Repository: cloudify-saltstack-plugin
Actor: j-warchol
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/comments/20719788","id":20719788,"diff_hunk":"@@ -0,0 +1,375 @@\n+# coding=utf-8\n+\n+\n+import requests\n+\n+import exceptions\n+import log\n+import utils\n+\n+\n+_NON_DICT_OBJECTS_TREATED_AS_ITERABLE_BY_DEFAULT = (\n+        list,\n+        tuple,\n+        set,\n+        frozenset,\n+        xrange\n+    )\n+_DEFAULT_CLIENT = 'local'\n+_LOGGER_MODULE = 'salt'\n+_COVER_AUTH_DATA_WITH = '***'\n+\n+\n+class SaltRESTManager(object):\n+    '''Salt's REST API manager.\n+\n+    Interesting methods:\n+        * __init__ - constructor,\n+        * call - raw function call,\n+        * log_in - opens a session,\n+        * clear_auth_data - clears authorisation data,\n+        * clear_token - clears a token, without closing an open session,\n+        * log_out - closes an open session,\n+        * logged_in - checks if a session is open.\n+\n+    Interesting properties:\n+        * token - token structure, if one has been generated.\n+    '''\n+\n+    def __init__(\n+            self,\n+            api_url,\n+            auth_data = None,\n+            token = None,\n+            session_options = None,\n+            root_logger = None,\n+            log_level = None,\n+            show_auth_data = False):\n+        '''Manager constructor. -> SaltRESTManager\n+\n+        Check the Salt's API documentation for auth data and token\n+        dictionary structure reference.\n+\n+        Check the Request's API documentation for possible session\n+        options (like disabling SSL certificate checking or supplying\n+        custom certificates).\n+\n+        Arguments:\n+            * api_url = a mandatory URL to Salt REST API,\n+            * auth_data = an optional dictionary containing proper\n+                    authorisation data accepted by Salt `login'\n+                    API call,\n+            * token = an optional dictionary returned by Salt `login'\n+                    API call,\n+            * session_options = an optional dictionary containing\n+                    session options,\n+            * logger = if supplied, a child logger will be created\n+                    to dump debug information,\n+            * log_level = an optional log level to be set: can be\n+                    either a string or a predefined int from\n+                    the `logging' library,\n+            * show_auth_data = optionally the manager can be configured\n+                    not to cover auth data.\n+        '''\n+        self._session = None\n+        self._api_url = api_url\n+        self._auth_data = auth_data\n+        self._session_options = session_options\n+        self._show_auth_data = show_auth_data\n+        self.token = token\n+        self.logger = log.set_up_logger(root_logger, log_level)\n+\n+    def logged_in(self):\n+        '''Check if a session is open. -> bool'''\n+        return self.token is not None and not utils.token_valid(self.token)\n+\n+    def log_in(self, auth_data = None, session_options = None):\n+        '''Open a session. -> (requests.Response, result)\n+\n+        `result' is a parsed output data structure.\n+\n+        If auth data had not been supplied in the constructor,\n+        it can be here.\n+\n+        Arguments:\n+            * auth_data = an optional dictionary containing\n+                    the authorisation data (explicit auth data has \n+                    a higher priority).\n+        '''\n+        if auth_data is not None:\n+            self._auth_data = auth_data\n+        if session_options is not None:\n+            self._session_options = session_options\n+        if self._auth_data is None:\n+            log.error(\n+                    self.logger,\n+                    'log in: missing auth data'\n+                )\n+            raise exceptions.LogicError(exceptions.NO_AUTH_DATA)\n+        if self._session is None:\n+            params = {}\n+            if self._session_options is not None:\n+                params = self._session_options\n+            self._session = requests.Session(**params)\n+        log.debug(\n+                self.logger,\n+                'log in: logging in with auth data = {}'\n+                ' and session options = {}'.format(\n+                        log.cover_auth_data(\n+                                self._auth_data,\n+                                self._show_auth_data\n+                            ),\n+                        str(self._session_options).strip()\n+                    )\n+            )\n+        response, result = utils.send_login_request(\n+                self._session,\n+                self._api_url,\n+                self._auth_data,\n+                self.logger\n+            )\n+        if result:\n+            self.token = result\n+            log.info(\n+                    self.logger,\n+                    'log in: successfully logged in, token = {}'.format(\n+                            str(self.token['token']).strip()\n+                        )\n+                )\n+            log.debug(\n+                    self.logger,\n+                    'log in: token = {}'.format(\n+                            str(self.token).strip()\n+                        )\n+                )\n+        else:\n+            log.info(\n+                    self.logger,\n+                    'log in: failed to log in, HTTP return code = {},'\n+                    ' reason = \\'{}\\''. format(\n+                            str(response.status_code).strip(),\n+                            str(response.reason).strip()\n+                        )\n+                )\n+        return response, result\n+\n+    THROW = 0\n+    SILENTLY_IGNORE = 1\n+\n+    def clear_auth_data(self, validation = THROW):\n+        '''Clears authorisation data, if it has been specified.\n+\n+        Arguments:\n+            * validation = if the function should raise an exception,\n+                    when there is no session to close, can be one of:\n+                ** THROW (default),\n+                ** SILENTLY_IGNORE.\n+        '''\n+        if self.auth_data is None:\n+            ERR_MSG = 'clear auth data: auth data not set'\n+            if validation == SaltRESTManager.THROW:\n+                log.error(self.logger, ERR_MSG)\n+                raise exceptions.LogicError(exception.NO_AUTH_DATA)\n+            else:\n+                log.warning(self.logger, ERR_MSG)\n+        self.auth_data = None\n+\n+    def clear_token(self, validation = THROW):\n+        '''Clears the token without invalidating it.\n+\n+        If `SILENTLY_IGNORE' has been specified, the token will be always\n+        cleared, even if it is still valid.\n+\n+        Arguments:\n+            * validation = if the function should raise an exception,\n+                    when there is no session to close, can be one of:\n+                ** THROW (default),\n+                ** SILENTLY_IGNORE.\n+        '''\n+        if self.token is None:\n+            ERR_MSG = 'clear token: token not set'\n+            if validation == SaltRESTManager.THROW:\n+                log.error(self.logger, ERR_MSG)\n+                raise exceptions.LogicError(exceptions.NO_TOKEN_TO_CLEAR)\n+            else:\n+                log.warning(self.logger, ERR_MSG)\n+                return\n+        elif utils.token_valid(self.token):\n+            ERR_MSG = 'clear token: the token is still valid'\n+            if validation == SaltRESTManager.THROW:\n+                log.error(self.logger, ERR_MSG)\n+                raise exception.LogicError(exception.TOKEN_IS_STILL_VALID)\n+            else:\n+                log.warning(self.logger, ERR_MSG)\n+        self.token = None\n+        if self._session is not None:\n+            self._session.close()\n+            self._session = None\n+\n+    def log_out(self, validation = THROW):\n+        '''Close the session, if it was open. -> (requests.Response, result)\n+        or None\n+\n+        `result' is a parsed output data structure.\n+\n+        Arguments:\n+            * validation = if the function should raise an exception,\n+                    when there is no session to close, can be one of:\n+                ** THROW (default),\n+                ** SILENTLY_IGNORE.\n+        '''\n+        try:\n+            if self.token is None:\n+                ERR_MSG = 'log out: no token to invalidate'\n+                raise exceptions.LogicError(exceptions.NO_TOKEN_TO_CLEAR)\n+            elif not utils.token_valid(self.token):\n+                ERR_MSG = 'log out: the token has already expired'\n+                self.token = None\n+                raise exceptions.LogicError(exceptions.TOKEN_HAS_EXPIRED)\n+        except exceptions.LogicError:\n+            if validation == SaltRESTManager.THROW:\n+                log.error(self.logger, ERR_MSG)\n+                raise\n+            else:\n+                log.warning(self.logger, ERR_MSG)\n+                return None, None\n+        log.debug(\n+                self.logger,\n+                'log out: invalidating token \\'{}\\''.format(\n+                        str(self.token['token']).strip()\n+                    )\n+            )\n+        response, result = utils.send_logout_request(\n+                self._session,\n+                self._api_url,\n+                self.token,\n+                self.logger\n+            )\n+        if response.ok:\n+            log.info(\n+                    self.logger,\n+                    'log out: succesfully cleared token \\'{}\\''.format(\n+                            str(self.token['token']).strip()\n+                        )\n+                )\n+        else:\n+            log.info(\n+                    self.logger,\n+                    'log out: failed to clear token \\'{}\\','\n+                    ' HTTP return code = {}, reason = \\'{}\\''.format(\n+                            str(self.token['token']).strip(),\n+                            str(response.status_code).strip(),\n+                            str(response.reason).strip()\n+                        )\n+                )\n+        self._session.close()\n+        self._session = None\n+        self.token = None\n+        return response, result\n+\n+    DEFAULT_ACTION = 0\n+    INTERPRET_AS_COLLECTION = 1\n+    RAW_INTERPRETATION = 2\n+\n+    def call(","path":"saltstack/saltapimgr/manager.py","position":274,"original_position":274,"commit_id":"e06443eebe09c93ae9cb24b54185fed12c35f243","original_commit_id":"e06443eebe09c93ae9cb24b54185fed12c35f243","user":{"login":"j-warchol","id":6195396,"avatar_url":"https://avatars.githubusercontent.com/u/6195396?v=3","gravatar_id":"","url":"https://api.github.com/users/j-warchol","html_url":"https://github.com/j-warchol","followers_url":"https://api.github.com/users/j-warchol/followers","following_url":"https://api.github.com/users/j-warchol/following{/other_user}","gists_url":"https://api.github.com/users/j-warchol/gists{/gist_id}","starred_url":"https://api.github.com/users/j-warchol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/j-warchol/subscriptions","organizations_url":"https://api.github.com/users/j-warchol/orgs","repos_url":"https://api.github.com/users/j-warchol/repos","events_url":"https://api.github.com/users/j-warchol/events{/privacy}","received_events_url":"https://api.github.com/users/j-warchol/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2014-11-21T15:14:12Z","updated_at":"2014-11-21T15:14:12Z","html_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin/pull/1#discussion_r20719788","pull_request_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/comments/20719788"},"html":{"href":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin/pull/1#discussion_r20719788"},"pull_request":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1","id":24757306,"html_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin/pull/1","diff_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin/pull/1.diff","patch_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin/pull/1.patch","issue_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/1","number":1,"state":"open","locked":false,"title":"Demo version of the saltstack plugin","user":{"login":"j-warchol","id":6195396,"avatar_url":"https://avatars.githubusercontent.com/u/6195396?v=3","gravatar_id":"","url":"https://api.github.com/users/j-warchol","html_url":"https://github.com/j-warchol","followers_url":"https://api.github.com/users/j-warchol/followers","following_url":"https://api.github.com/users/j-warchol/following{/other_user}","gists_url":"https://api.github.com/users/j-warchol/gists{/gist_id}","starred_url":"https://api.github.com/users/j-warchol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/j-warchol/subscriptions","organizations_url":"https://api.github.com/users/j-warchol/orgs","repos_url":"https://api.github.com/users/j-warchol/repos","events_url":"https://api.github.com/users/j-warchol/events{/privacy}","received_events_url":"https://api.github.com/users/j-warchol/received_events","type":"User","site_admin":false},"body":"This version is for cloudify 3.0, upgrading to cfy 3.1 will be in a separate pull request.","created_at":"2014-11-20T11:05:09Z","updated_at":"2014-11-21T15:14:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"735fd22f36ff85ba175e6b245deea1668a2c38ea","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1/commits","review_comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1/comments","review_comment_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/comments/{number}","comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/1/comments","statuses_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/statuses/e06443eebe09c93ae9cb24b54185fed12c35f243","head":{"label":"cloudify-cosmo:devel","ref":"devel","sha":"e06443eebe09c93ae9cb24b54185fed12c35f243","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":26589984,"name":"cloudify-saltstack-plugin","full_name":"cloudify-cosmo/cloudify-saltstack-plugin","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-saltstack-plugin","description":"A Saltstack plugin for Cloudify","fork":false,"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin","forks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/forks","keys_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/teams","hooks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/hooks","issue_events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/events","assignees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/tags","blobs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/languages","stargazers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/stargazers","contributors_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/contributors","subscribers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/subscribers","subscription_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/subscription","commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/comments/{number}","contents_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/merges","archive_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/downloads","issues_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/labels{/name}","releases_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/releases{/id}","created_at":"2014-11-13T13:55:32Z","updated_at":"2014-11-19T12:31:04Z","pushed_at":"2014-11-20T10:23:10Z","git_url":"git://github.com/cloudify-cosmo/cloudify-saltstack-plugin.git","ssh_url":"git@github.com:cloudify-cosmo/cloudify-saltstack-plugin.git","clone_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin.git","svn_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin","homepage":null,"size":184,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"cloudify-cosmo:master","ref":"master","sha":"0260e0c8dff8523a59813c821be297225a21d98c","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":26589984,"name":"cloudify-saltstack-plugin","full_name":"cloudify-cosmo/cloudify-saltstack-plugin","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-saltstack-plugin","description":"A Saltstack plugin for Cloudify","fork":false,"url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin","forks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/forks","keys_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/teams","hooks_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/hooks","issue_events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/events","assignees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/tags","blobs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/languages","stargazers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/stargazers","contributors_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/contributors","subscribers_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/subscribers","subscription_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/subscription","commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/comments/{number}","contents_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/merges","archive_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/downloads","issues_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/labels{/name}","releases_url":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/releases{/id}","created_at":"2014-11-13T13:55:32Z","updated_at":"2014-11-19T12:31:04Z","pushed_at":"2014-11-20T10:23:10Z","git_url":"git://github.com/cloudify-cosmo/cloudify-saltstack-plugin.git","ssh_url":"git@github.com:cloudify-cosmo/cloudify-saltstack-plugin.git","clone_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin.git","svn_url":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin","homepage":null,"size":184,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1"},"html":{"href":"https://github.com/cloudify-cosmo/cloudify-saltstack-plugin/pull/1"},"issue":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/1"},"comments":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/cloudify-cosmo/cloudify-saltstack-plugin/statuses/e06443eebe09c93ae9cb24b54185fed12c35f243"}}}}