{"action":"created","issue":{"url":"https://api.github.com/repos/nla/doss/issues/33","labels_url":"https://api.github.com/repos/nla/doss/issues/33/labels{/name}","comments_url":"https://api.github.com/repos/nla/doss/issues/33/comments","events_url":"https://api.github.com/repos/nla/doss/issues/33/events","html_url":"https://github.com/nla/doss/issues/33","id":16843057,"number":33,"title":"Configuration: areas and filesystems","user":{"login":"ato","id":10588,"avatar_url":"https://avatars.githubusercontent.com/u/10588?v=3","gravatar_id":"","url":"https://api.github.com/users/ato","html_url":"https://github.com/ato","followers_url":"https://api.github.com/users/ato/followers","following_url":"https://api.github.com/users/ato/following{/other_user}","gists_url":"https://api.github.com/users/ato/gists{/gist_id}","starred_url":"https://api.github.com/users/ato/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ato/subscriptions","organizations_url":"https://api.github.com/users/ato/orgs","repos_url":"https://api.github.com/users/ato/repos","events_url":"https://api.github.com/users/ato/events{/privacy}","received_events_url":"https://api.github.com/users/ato/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/nla/doss/labels/0%20-%20Backlog","name":"0 - Backlog","color":"e0e0e0"}],"state":"closed","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/nla/doss/milestones/4","html_url":"https://github.com/nla/doss/milestones/2.0.0","labels_url":"https://api.github.com/repos/nla/doss/milestones/4/labels","id":462231,"number":4,"title":"2.0.0","description":"","creator":{"login":"ato","id":10588,"avatar_url":"https://avatars.githubusercontent.com/u/10588?v=3","gravatar_id":"","url":"https://api.github.com/users/ato","html_url":"https://github.com/ato","followers_url":"https://api.github.com/users/ato/followers","following_url":"https://api.github.com/users/ato/following{/other_user}","gists_url":"https://api.github.com/users/ato/gists{/gist_id}","starred_url":"https://api.github.com/users/ato/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ato/subscriptions","organizations_url":"https://api.github.com/users/ato/orgs","repos_url":"https://api.github.com/users/ato/repos","events_url":"https://api.github.com/users/ato/events{/privacy}","received_events_url":"https://api.github.com/users/ato/received_events","type":"User","site_admin":false},"open_issues":4,"closed_issues":2,"state":"open","created_at":"2013-10-23T02:54:49Z","updated_at":"2015-04-13T05:37:32Z","due_on":null,"closed_at":null},"comments":1,"created_at":"2013-07-17T01:09:41Z","updated_at":"2015-04-13T05:37:32Z","closed_at":"2015-04-13T05:37:32Z","body":"We need a way to configure the areas and filesystems DOSS uses. Each area is made up of one or more filesystems. Each filesystem stores a copy of every blob in the area. In normal production usage there will be 2 areas: *area.staging* and *area.master*; and 3 filesystems: *fs.staging*, *fs.display* and *fs.preservation*.\r\n\r\nSee #29 for more background about the staging area. For the master area DOSS needs to make at least two copies of each blob, one on a disk array for online access and one on a tape-backed preservation filesystem (currently running SAM-QFS). The preservation filesystem actually itself makes multiple tape copies, some of the tapes get sent to an offsite location for disaster recovery, others sit in a tape robot onsite and can be used to restore the display copy in the event something happens to it. We had to make use of this recovery mechanism in 2011 after an operating system bug corrupted the display filesystem, it's not just paranoia.\r\n\r\n```ini\r\n[defaults.put]\r\ntarget = area.staging\r\n\r\n[area.staging]\r\nfs = staging\r\n\r\n[area.master]\r\nfs = display, preservation\r\ncontainer = tar\r\n\r\n[fs.staging]\r\npath = /staging\r\n\r\n[fs.display]\r\n# online spinning disk backed filesystem\r\npath = /display\r\n\r\n[fs.preservation]\r\n# nearline tape backed filesystem\r\npath = /sam/master\r\n```\r\n\r\nI really want to use something like Python's [configparser](http://docs.python.org/3/library/configparser.html) format for this. [ini4j](http://ini4j.sourceforge.net/)'s [ConfigParser](http://ini4j.sourceforge.net/apidocs/index.html?org/ini4j/ConfigParser.html) class appears to be a reasonable Java implementation of it.\r\n\r\n[Commons Configuration](https://commons.apache.org/proper/commons-configuration/) seems to be the other popular choice, it does a lot more but looks a bit too overengineered for our needs.\r\n\r\n<!---\r\n@huboard:{\"order\":11.375}\r\n-->\r\n"},"comment":{"url":"https://api.github.com/repos/nla/doss/issues/comments/92218502","html_url":"https://github.com/nla/doss/issues/33#issuecomment-92218502","issue_url":"https://api.github.com/repos/nla/doss/issues/33","id":92218502,"user":{"login":"brycollins","id":545412,"avatar_url":"https://avatars.githubusercontent.com/u/545412?v=3","gravatar_id":"","url":"https://api.github.com/users/brycollins","html_url":"https://github.com/brycollins","followers_url":"https://api.github.com/users/brycollins/followers","following_url":"https://api.github.com/users/brycollins/following{/other_user}","gists_url":"https://api.github.com/users/brycollins/gists{/gist_id}","starred_url":"https://api.github.com/users/brycollins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brycollins/subscriptions","organizations_url":"https://api.github.com/users/brycollins/orgs","repos_url":"https://api.github.com/users/brycollins/repos","events_url":"https://api.github.com/users/brycollins/events{/privacy}","received_events_url":"https://api.github.com/users/brycollins/received_events","type":"User","site_admin":false},"created_at":"2015-04-13T05:37:32Z","updated_at":"2015-04-13T05:37:32Z","body":"Implemented using ini4j"}}