{"action":"created","comment":{"url":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments/80445683","id":80445683,"diff_hunk":"@@ -511,3 +513,32 @@ def updateMonitoringInformation(jobs):\n         \"\"\"\n \n         raise NotImplementedError\n+\n+\n+def group_jobs_by_backend_credential(jobs):\n+    # type: (List[Job]) -> List[List[Job]]\n+    \"\"\"\n+    Split a list of jobs based on the credential required by their backends.\n+\n+    Any missing or invalid credentials are added to ``needed_credentials``\n+\n+    Args:\n+        jobs: a list of ``Job``s\n+\n+    Returns:\n+        a list of list of ``Job``s with each sublist sharing a credential\n+    \"\"\"\n+    jobs_by_credential = defaultdict(list)\n+    for j in jobs:\n+        try:\n+            cred_req = j.backend.credential_requirements\n+            cred = credential_store[cred_req]\n+            if not cred.is_valid():\n+                logger.debug('Required credential %s is not valid', cred)\n+                needed_credentials.add(cred_req)\n+                continue\n+            jobs_by_credential[cred].append(j)\n+        except KeyError:","path":"python/Ganga/GPIDev/Adapters/IBackend.py","position":64,"original_position":64,"commit_id":"84a16ce9c371ea4daf6958fd5e6317e46867a917","original_commit_id":"84a16ce9c371ea4daf6958fd5e6317e46867a917","user":{"login":"milliams","id":61316,"avatar_url":"https://avatars.githubusercontent.com/u/61316?v=3","gravatar_id":"","url":"https://api.github.com/users/milliams","html_url":"https://github.com/milliams","followers_url":"https://api.github.com/users/milliams/followers","following_url":"https://api.github.com/users/milliams/following{/other_user}","gists_url":"https://api.github.com/users/milliams/gists{/gist_id}","starred_url":"https://api.github.com/users/milliams/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/milliams/subscriptions","organizations_url":"https://api.github.com/users/milliams/orgs","repos_url":"https://api.github.com/users/milliams/repos","events_url":"https://api.github.com/users/milliams/events{/privacy}","received_events_url":"https://api.github.com/users/milliams/received_events","type":"User","site_admin":false},"body":"`jobs_by_credential[something]` will not raise a `KeyError` as it is a `defaultdict` so it will always return a `list` of some kind.","created_at":"2016-09-26T10:16:33Z","updated_at":"2016-09-26T10:16:33Z","html_url":"https://github.com/ganga-devs/ganga/pull/690#discussion_r80445683","pull_request_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/690","_links":{"self":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments/80445683"},"html":{"href":"https://github.com/ganga-devs/ganga/pull/690#discussion_r80445683"},"pull_request":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/690"}}},"pull_request":{"url":"https://api.github.com/repos/ganga-devs/ganga/pulls/690","id":78640594,"html_url":"https://github.com/ganga-devs/ganga/pull/690","diff_url":"https://github.com/ganga-devs/ganga/pull/690.diff","patch_url":"https://github.com/ganga-devs/ganga/pull/690.patch","issue_url":"https://api.github.com/repos/ganga-devs/ganga/issues/690","number":690,"state":"open","locked":false,"title":"New credentials system","user":{"login":"milliams","id":61316,"avatar_url":"https://avatars.githubusercontent.com/u/61316?v=3","gravatar_id":"","url":"https://api.github.com/users/milliams","html_url":"https://github.com/milliams","followers_url":"https://api.github.com/users/milliams/followers","following_url":"https://api.github.com/users/milliams/following{/other_user}","gists_url":"https://api.github.com/users/milliams/gists{/gist_id}","starred_url":"https://api.github.com/users/milliams/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/milliams/subscriptions","organizations_url":"https://api.github.com/users/milliams/orgs","repos_url":"https://api.github.com/users/milliams/repos","events_url":"https://api.github.com/users/milliams/events{/privacy}","received_events_url":"https://api.github.com/users/milliams/received_events","type":"User","site_admin":false},"body":"This adds the new credentials system to Ganga. The best summary is at the [dev manual page](http://ganga.readthedocs.io/en/feature-credentials/dev/credentials.html).\r\n\r\nI believe that this is all working for core LCG as well as DIRAC so please test that thoroughly. The ATLAS support is provisional but those changes will be more involved and I have no way of testing it at present. @drmarkwslater could you run some ATLAS and give me some feedback about what doesn't work.","created_at":"2016-07-25T08:03:48Z","updated_at":"2016-09-26T10:16:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d4e7fd7c162931174892a0a763ed1f596e5d67d2","assignee":{"login":"milliams","id":61316,"avatar_url":"https://avatars.githubusercontent.com/u/61316?v=3","gravatar_id":"","url":"https://api.github.com/users/milliams","html_url":"https://github.com/milliams","followers_url":"https://api.github.com/users/milliams/followers","following_url":"https://api.github.com/users/milliams/following{/other_user}","gists_url":"https://api.github.com/users/milliams/gists{/gist_id}","starred_url":"https://api.github.com/users/milliams/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/milliams/subscriptions","organizations_url":"https://api.github.com/users/milliams/orgs","repos_url":"https://api.github.com/users/milliams/repos","events_url":"https://api.github.com/users/milliams/events{/privacy}","received_events_url":"https://api.github.com/users/milliams/received_events","type":"User","site_admin":false},"assignees":[{"login":"milliams","id":61316,"avatar_url":"https://avatars.githubusercontent.com/u/61316?v=3","gravatar_id":"","url":"https://api.github.com/users/milliams","html_url":"https://github.com/milliams","followers_url":"https://api.github.com/users/milliams/followers","following_url":"https://api.github.com/users/milliams/following{/other_user}","gists_url":"https://api.github.com/users/milliams/gists{/gist_id}","starred_url":"https://api.github.com/users/milliams/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/milliams/subscriptions","organizations_url":"https://api.github.com/users/milliams/orgs","repos_url":"https://api.github.com/users/milliams/repos","events_url":"https://api.github.com/users/milliams/events{/privacy}","received_events_url":"https://api.github.com/users/milliams/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/ganga-devs/ganga/milestones/15","html_url":"https://github.com/ganga-devs/ganga/milestones/6.3.0","labels_url":"https://api.github.com/repos/ganga-devs/ganga/milestones/15/labels","id":1957667,"number":15,"title":"6.3.0","description":"","creator":{"login":"drmarkwslater","id":13677368,"avatar_url":"https://avatars.githubusercontent.com/u/13677368?v=3","gravatar_id":"","url":"https://api.github.com/users/drmarkwslater","html_url":"https://github.com/drmarkwslater","followers_url":"https://api.github.com/users/drmarkwslater/followers","following_url":"https://api.github.com/users/drmarkwslater/following{/other_user}","gists_url":"https://api.github.com/users/drmarkwslater/gists{/gist_id}","starred_url":"https://api.github.com/users/drmarkwslater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drmarkwslater/subscriptions","organizations_url":"https://api.github.com/users/drmarkwslater/orgs","repos_url":"https://api.github.com/users/drmarkwslater/repos","events_url":"https://api.github.com/users/drmarkwslater/events{/privacy}","received_events_url":"https://api.github.com/users/drmarkwslater/received_events","type":"User","site_admin":false},"open_issues":11,"closed_issues":4,"state":"open","created_at":"2016-08-23T10:49:25Z","updated_at":"2016-09-23T13:30:31Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/690/commits","review_comments_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/690/comments","review_comment_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ganga-devs/ganga/issues/690/comments","statuses_url":"https://api.github.com/repos/ganga-devs/ganga/statuses/84a16ce9c371ea4daf6958fd5e6317e46867a917","head":{"label":"ganga-devs:feature/credentials","ref":"feature/credentials","sha":"84a16ce9c371ea4daf6958fd5e6317e46867a917","user":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"repo":{"id":43645564,"name":"ganga","full_name":"ganga-devs/ganga","owner":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ganga-devs/ganga","description":"Ganga is an easy-to-use frontend for job definition and management","fork":false,"url":"https://api.github.com/repos/ganga-devs/ganga","forks_url":"https://api.github.com/repos/ganga-devs/ganga/forks","keys_url":"https://api.github.com/repos/ganga-devs/ganga/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ganga-devs/ganga/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ganga-devs/ganga/teams","hooks_url":"https://api.github.com/repos/ganga-devs/ganga/hooks","issue_events_url":"https://api.github.com/repos/ganga-devs/ganga/issues/events{/number}","events_url":"https://api.github.com/repos/ganga-devs/ganga/events","assignees_url":"https://api.github.com/repos/ganga-devs/ganga/assignees{/user}","branches_url":"https://api.github.com/repos/ganga-devs/ganga/branches{/branch}","tags_url":"https://api.github.com/repos/ganga-devs/ganga/tags","blobs_url":"https://api.github.com/repos/ganga-devs/ganga/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ganga-devs/ganga/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ganga-devs/ganga/git/refs{/sha}","trees_url":"https://api.github.com/repos/ganga-devs/ganga/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ganga-devs/ganga/statuses/{sha}","languages_url":"https://api.github.com/repos/ganga-devs/ganga/languages","stargazers_url":"https://api.github.com/repos/ganga-devs/ganga/stargazers","contributors_url":"https://api.github.com/repos/ganga-devs/ganga/contributors","subscribers_url":"https://api.github.com/repos/ganga-devs/ganga/subscribers","subscription_url":"https://api.github.com/repos/ganga-devs/ganga/subscription","commits_url":"https://api.github.com/repos/ganga-devs/ganga/commits{/sha}","git_commits_url":"https://api.github.com/repos/ganga-devs/ganga/git/commits{/sha}","comments_url":"https://api.github.com/repos/ganga-devs/ganga/comments{/number}","issue_comment_url":"https://api.github.com/repos/ganga-devs/ganga/issues/comments{/number}","contents_url":"https://api.github.com/repos/ganga-devs/ganga/contents/{+path}","compare_url":"https://api.github.com/repos/ganga-devs/ganga/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ganga-devs/ganga/merges","archive_url":"https://api.github.com/repos/ganga-devs/ganga/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ganga-devs/ganga/downloads","issues_url":"https://api.github.com/repos/ganga-devs/ganga/issues{/number}","pulls_url":"https://api.github.com/repos/ganga-devs/ganga/pulls{/number}","milestones_url":"https://api.github.com/repos/ganga-devs/ganga/milestones{/number}","notifications_url":"https://api.github.com/repos/ganga-devs/ganga/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ganga-devs/ganga/labels{/name}","releases_url":"https://api.github.com/repos/ganga-devs/ganga/releases{/id}","deployments_url":"https://api.github.com/repos/ganga-devs/ganga/deployments","created_at":"2015-10-04T17:39:11Z","updated_at":"2016-09-16T10:43:39Z","pushed_at":"2016-09-26T09:55:25Z","git_url":"git://github.com/ganga-devs/ganga.git","ssh_url":"git@github.com:ganga-devs/ganga.git","clone_url":"https://github.com/ganga-devs/ganga.git","svn_url":"https://github.com/ganga-devs/ganga","homepage":"https://cern.ch/ganga","size":30887,"stargazers_count":23,"watchers_count":23,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"open_issues_count":163,"forks":18,"open_issues":163,"watchers":23,"default_branch":"develop"}},"base":{"label":"ganga-devs:develop","ref":"develop","sha":"0eac28c93917db4ad29aca39a66d0137a6f559ec","user":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"repo":{"id":43645564,"name":"ganga","full_name":"ganga-devs/ganga","owner":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ganga-devs/ganga","description":"Ganga is an easy-to-use frontend for job definition and management","fork":false,"url":"https://api.github.com/repos/ganga-devs/ganga","forks_url":"https://api.github.com/repos/ganga-devs/ganga/forks","keys_url":"https://api.github.com/repos/ganga-devs/ganga/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ganga-devs/ganga/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ganga-devs/ganga/teams","hooks_url":"https://api.github.com/repos/ganga-devs/ganga/hooks","issue_events_url":"https://api.github.com/repos/ganga-devs/ganga/issues/events{/number}","events_url":"https://api.github.com/repos/ganga-devs/ganga/events","assignees_url":"https://api.github.com/repos/ganga-devs/ganga/assignees{/user}","branches_url":"https://api.github.com/repos/ganga-devs/ganga/branches{/branch}","tags_url":"https://api.github.com/repos/ganga-devs/ganga/tags","blobs_url":"https://api.github.com/repos/ganga-devs/ganga/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ganga-devs/ganga/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ganga-devs/ganga/git/refs{/sha}","trees_url":"https://api.github.com/repos/ganga-devs/ganga/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ganga-devs/ganga/statuses/{sha}","languages_url":"https://api.github.com/repos/ganga-devs/ganga/languages","stargazers_url":"https://api.github.com/repos/ganga-devs/ganga/stargazers","contributors_url":"https://api.github.com/repos/ganga-devs/ganga/contributors","subscribers_url":"https://api.github.com/repos/ganga-devs/ganga/subscribers","subscription_url":"https://api.github.com/repos/ganga-devs/ganga/subscription","commits_url":"https://api.github.com/repos/ganga-devs/ganga/commits{/sha}","git_commits_url":"https://api.github.com/repos/ganga-devs/ganga/git/commits{/sha}","comments_url":"https://api.github.com/repos/ganga-devs/ganga/comments{/number}","issue_comment_url":"https://api.github.com/repos/ganga-devs/ganga/issues/comments{/number}","contents_url":"https://api.github.com/repos/ganga-devs/ganga/contents/{+path}","compare_url":"https://api.github.com/repos/ganga-devs/ganga/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ganga-devs/ganga/merges","archive_url":"https://api.github.com/repos/ganga-devs/ganga/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ganga-devs/ganga/downloads","issues_url":"https://api.github.com/repos/ganga-devs/ganga/issues{/number}","pulls_url":"https://api.github.com/repos/ganga-devs/ganga/pulls{/number}","milestones_url":"https://api.github.com/repos/ganga-devs/ganga/milestones{/number}","notifications_url":"https://api.github.com/repos/ganga-devs/ganga/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ganga-devs/ganga/labels{/name}","releases_url":"https://api.github.com/repos/ganga-devs/ganga/releases{/id}","deployments_url":"https://api.github.com/repos/ganga-devs/ganga/deployments","created_at":"2015-10-04T17:39:11Z","updated_at":"2016-09-16T10:43:39Z","pushed_at":"2016-09-26T09:55:25Z","git_url":"git://github.com/ganga-devs/ganga.git","ssh_url":"git@github.com:ganga-devs/ganga.git","clone_url":"https://github.com/ganga-devs/ganga.git","svn_url":"https://github.com/ganga-devs/ganga","homepage":"https://cern.ch/ganga","size":30887,"stargazers_count":23,"watchers_count":23,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"open_issues_count":163,"forks":18,"open_issues":163,"watchers":23,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/690"},"html":{"href":"https://github.com/ganga-devs/ganga/pull/690"},"issue":{"href":"https://api.github.com/repos/ganga-devs/ganga/issues/690"},"comments":{"href":"https://api.github.com/repos/ganga-devs/ganga/issues/690/comments"},"review_comments":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/690/comments"},"review_comment":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/690/commits"},"statuses":{"href":"https://api.github.com/repos/ganga-devs/ganga/statuses/84a16ce9c371ea4daf6958fd5e6317e46867a917"}}}}
{"actor":{"display_login":"milliams"}}